Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9258a2d5 authored by Jeff Layton's avatar Jeff Layton Committed by J. Bruce Fields
Browse files

nfsd: move nfs4_client allocation to dedicated slabcache



On x86_64, it's 1152 bytes, so we can avoid wasting 896 bytes each.

Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 9d7ed135
Loading
Loading
Loading
Loading
+13 −5
Original line number Original line Diff line number Diff line
@@ -98,6 +98,7 @@ enum nfsd4_st_mutex_lock_subclass {
 */
 */
static DECLARE_WAIT_QUEUE_HEAD(close_wq);
static DECLARE_WAIT_QUEUE_HEAD(close_wq);


static struct kmem_cache *client_slab;
static struct kmem_cache *openowner_slab;
static struct kmem_cache *openowner_slab;
static struct kmem_cache *lockowner_slab;
static struct kmem_cache *lockowner_slab;
static struct kmem_cache *file_slab;
static struct kmem_cache *file_slab;
@@ -1794,7 +1795,7 @@ static struct nfs4_client *alloc_client(struct xdr_netobj name)
	struct nfs4_client *clp;
	struct nfs4_client *clp;
	int i;
	int i;


	clp = kzalloc(sizeof(struct nfs4_client), GFP_KERNEL);
	clp = kmem_cache_zalloc(client_slab, GFP_KERNEL);
	if (clp == NULL)
	if (clp == NULL)
		return NULL;
		return NULL;
	clp->cl_name.data = kmemdup(name.data, name.len, GFP_KERNEL);
	clp->cl_name.data = kmemdup(name.data, name.len, GFP_KERNEL);
@@ -1825,7 +1826,7 @@ static struct nfs4_client *alloc_client(struct xdr_netobj name)
err_no_hashtbl:
err_no_hashtbl:
	kfree(clp->cl_name.data);
	kfree(clp->cl_name.data);
err_no_name:
err_no_name:
	kfree(clp);
	kmem_cache_free(client_slab, clp);
	return NULL;
	return NULL;
}
}


@@ -1845,7 +1846,7 @@ free_client(struct nfs4_client *clp)
	kfree(clp->cl_ownerstr_hashtbl);
	kfree(clp->cl_ownerstr_hashtbl);
	kfree(clp->cl_name.data);
	kfree(clp->cl_name.data);
	idr_destroy(&clp->cl_stateids);
	idr_destroy(&clp->cl_stateids);
	kfree(clp);
	kmem_cache_free(client_slab, clp);
}
}


/* must be called under the client_lock */
/* must be called under the client_lock */
@@ -3471,21 +3472,26 @@ static void nfsd4_init_file(struct knfsd_fh *fh, unsigned int hashval,
void
void
nfsd4_free_slabs(void)
nfsd4_free_slabs(void)
{
{
	kmem_cache_destroy(odstate_slab);
	kmem_cache_destroy(client_slab);
	kmem_cache_destroy(openowner_slab);
	kmem_cache_destroy(openowner_slab);
	kmem_cache_destroy(lockowner_slab);
	kmem_cache_destroy(lockowner_slab);
	kmem_cache_destroy(file_slab);
	kmem_cache_destroy(file_slab);
	kmem_cache_destroy(stateid_slab);
	kmem_cache_destroy(stateid_slab);
	kmem_cache_destroy(deleg_slab);
	kmem_cache_destroy(deleg_slab);
	kmem_cache_destroy(odstate_slab);
}
}


int
int
nfsd4_init_slabs(void)
nfsd4_init_slabs(void)
{
{
	client_slab = kmem_cache_create("nfsd4_clients",
			sizeof(struct nfs4_client), 0, 0, NULL);
	if (client_slab == NULL)
		goto out;
	openowner_slab = kmem_cache_create("nfsd4_openowners",
	openowner_slab = kmem_cache_create("nfsd4_openowners",
			sizeof(struct nfs4_openowner), 0, 0, NULL);
			sizeof(struct nfs4_openowner), 0, 0, NULL);
	if (openowner_slab == NULL)
	if (openowner_slab == NULL)
		goto out;
		goto out_free_client_slab;
	lockowner_slab = kmem_cache_create("nfsd4_lockowners",
	lockowner_slab = kmem_cache_create("nfsd4_lockowners",
			sizeof(struct nfs4_lockowner), 0, 0, NULL);
			sizeof(struct nfs4_lockowner), 0, 0, NULL);
	if (lockowner_slab == NULL)
	if (lockowner_slab == NULL)
@@ -3518,6 +3524,8 @@ nfsd4_init_slabs(void)
	kmem_cache_destroy(lockowner_slab);
	kmem_cache_destroy(lockowner_slab);
out_free_openowner_slab:
out_free_openowner_slab:
	kmem_cache_destroy(openowner_slab);
	kmem_cache_destroy(openowner_slab);
out_free_client_slab:
	kmem_cache_destroy(client_slab);
out:
out:
	dprintk("nfsd4: out of memory while initializing nfsv4\n");
	dprintk("nfsd4: out of memory while initializing nfsv4\n");
	return -ENOMEM;
	return -ENOMEM;