[kernel] r19096 - in dists/sid/linux/debian: . patches patches/bugfix/all

Ben Hutchings benh at alioth.debian.org
Thu Jun 7 13:57:51 UTC 2012


Author: benh
Date: Thu Jun  7 13:57:50 2012
New Revision: 19096

Log:
NFSv4: Reduce the footprint of the idmapper (Closes: #657078)

Added:
   dists/sid/linux/debian/patches/bugfix/all/NFSv4-Further-reduce-the-footprint-of-the-idmapper.patch
   dists/sid/linux/debian/patches/bugfix/all/NFSv4-Reduce-the-footprint-of-the-idmapper.patch
Modified:
   dists/sid/linux/debian/changelog
   dists/sid/linux/debian/patches/series-all

Modified: dists/sid/linux/debian/changelog
==============================================================================
--- dists/sid/linux/debian/changelog	Thu Jun  7 06:59:12 2012	(r19095)
+++ dists/sid/linux/debian/changelog	Thu Jun  7 13:57:50 2012	(r19096)
@@ -22,6 +22,7 @@
   * filter: Allow to create sk-unattached filters
   * net: Backport team driver from Linux 3.5-rc1
   * proc: Backport hidepid mount option from Linux 3.4 (Closes: #669028)
+  * NFSv4: Reduce the footprint of the idmapper (Closes: #657078)
 
  -- Ben Hutchings <ben at decadent.org.uk>  Sat, 02 Jun 2012 20:31:53 +0100
 

Added: dists/sid/linux/debian/patches/bugfix/all/NFSv4-Further-reduce-the-footprint-of-the-idmapper.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/all/NFSv4-Further-reduce-the-footprint-of-the-idmapper.patch	Thu Jun  7 13:57:50 2012	(r19096)
@@ -0,0 +1,124 @@
+From: Trond Myklebust <Trond.Myklebust at netapp.com>
+Date: Wed, 8 Feb 2012 13:39:15 -0500
+Subject: [2/2] NFSv4: Further reduce the footprint of the idmapper
+
+commit 685f50f9188ac1e8244d0340a9d6ea36b6136cec upstream.
+
+Don't allocate the legacy idmapper tables until we actually need
+them.
+
+Signed-off-by: Trond Myklebust <Trond.Myklebust at netapp.com>
+Reviewed-by: Jeff Layton <jlayton at redhat.com>
+[bwh: Backported to 3.2: adjust context in nfs_idmap_delete()]
+---
+ fs/nfs/idmap.c |   42 ++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 36 insertions(+), 6 deletions(-)
+
+--- a/fs/nfs/idmap.c
++++ b/fs/nfs/idmap.c
+@@ -323,7 +323,7 @@
+ 
+ struct idmap_hashtable {
+ 	__u8			h_type;
+-	struct idmap_hashent	h_entries[IDMAP_HASH_SZ];
++	struct idmap_hashent	*h_entries;
+ };
+ 
+ struct idmap {
+@@ -378,20 +378,39 @@
+ 	return 0;
+ }
+ 
++static void
++idmap_alloc_hashtable(struct idmap_hashtable *h)
++{
++	if (h->h_entries != NULL)
++		return;
++	h->h_entries = kcalloc(IDMAP_HASH_SZ,
++			sizeof(*h->h_entries),
++			GFP_KERNEL);
++}
++
++static void
++idmap_free_hashtable(struct idmap_hashtable *h)
++{
++	int i;
++
++	if (h->h_entries == NULL)
++		return;
++	for (i = 0; i < IDMAP_HASH_SZ; i++)
++		kfree(h->h_entries[i].ih_name);
++	kfree(h->h_entries);
++}
++
+ void
+ nfs_idmap_delete(struct nfs_client *clp)
+ {
+ 	struct idmap *idmap = clp->cl_idmap;
+-	int i;
+ 
+ 	if (!idmap)
+ 		return;
+ 	rpc_unlink(idmap->idmap_dentry);
+ 	clp->cl_idmap = NULL;
+-	for (i = 0; i < ARRAY_SIZE(idmap->idmap_user_hash.h_entries); i++)
+-		kfree(idmap->idmap_user_hash.h_entries[i].ih_name);
+-	for (i = 0; i < ARRAY_SIZE(idmap->idmap_group_hash.h_entries); i++)
+-		kfree(idmap->idmap_group_hash.h_entries[i].ih_name);
++	idmap_free_hashtable(&idmap->idmap_user_hash);
++	idmap_free_hashtable(&idmap->idmap_group_hash);
+ 	kfree(idmap);
+ }
+ 
+@@ -401,6 +420,8 @@
+ static inline struct idmap_hashent *
+ idmap_name_hash(struct idmap_hashtable* h, const char *name, size_t len)
+ {
++	if (h->h_entries == NULL)
++		return NULL;
+ 	return &h->h_entries[fnvhash32(name, len) % IDMAP_HASH_SZ];
+ }
+ 
+@@ -409,6 +430,8 @@
+ {
+ 	struct idmap_hashent *he = idmap_name_hash(h, name, len);
+ 
++	if (he == NULL)
++		return NULL;
+ 	if (he->ih_namelen != len || memcmp(he->ih_name, name, len) != 0)
+ 		return NULL;
+ 	if (time_after(jiffies, he->ih_expires))
+@@ -419,6 +442,8 @@
+ static inline struct idmap_hashent *
+ idmap_id_hash(struct idmap_hashtable* h, __u32 id)
+ {
++	if (h->h_entries == NULL)
++		return NULL;
+ 	return &h->h_entries[fnvhash32(&id, sizeof(id)) % IDMAP_HASH_SZ];
+ }
+ 
+@@ -426,6 +451,9 @@
+ idmap_lookup_id(struct idmap_hashtable *h, __u32 id)
+ {
+ 	struct idmap_hashent *he = idmap_id_hash(h, id);
++
++	if (he == NULL)
++		return NULL;
+ 	if (he->ih_id != id || he->ih_namelen == 0)
+ 		return NULL;
+ 	if (time_after(jiffies, he->ih_expires))
+@@ -441,12 +469,14 @@
+ static inline struct idmap_hashent *
+ idmap_alloc_name(struct idmap_hashtable *h, char *name, size_t len)
+ {
++	idmap_alloc_hashtable(h);
+ 	return idmap_name_hash(h, name, len);
+ }
+ 
+ static inline struct idmap_hashent *
+ idmap_alloc_id(struct idmap_hashtable *h, __u32 id)
+ {
++	idmap_alloc_hashtable(h);
+ 	return idmap_id_hash(h, id);
+ }
+ 

Added: dists/sid/linux/debian/patches/bugfix/all/NFSv4-Reduce-the-footprint-of-the-idmapper.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/all/NFSv4-Reduce-the-footprint-of-the-idmapper.patch	Thu Jun  7 13:57:50 2012	(r19096)
@@ -0,0 +1,62 @@
+From: Trond Myklebust <Trond.Myklebust at netapp.com>
+Date: Tue, 7 Feb 2012 14:59:05 -0500
+Subject: [1/2] NFSv4: Reduce the footprint of the idmapper
+
+commit d073e9b541e1ac3f52d72c3a153855d9a9ee3278 upstream.
+
+Instead of pre-allocating the storage for all the strings, we can
+significantly reduce the size of that table by doing the allocation
+when we do the downcall.
+
+Signed-off-by: Trond Myklebust <Trond.Myklebust at netapp.com>
+Reviewed-by: Jeff Layton <jlayton at redhat.com>
+[bwh: Backported to 3.2: adjust context in nfs_idmap_delete()]
+---
+ fs/nfs/idmap.c |   16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+--- a/fs/nfs/idmap.c
++++ b/fs/nfs/idmap.c
+@@ -318,7 +318,7 @@
+ 	unsigned long		ih_expires;
+ 	__u32			ih_id;
+ 	size_t			ih_namelen;
+-	char			ih_name[IDMAP_NAMESZ];
++	const char		*ih_name;
+ };
+ 
+ struct idmap_hashtable {
+@@ -382,11 +382,16 @@
+ nfs_idmap_delete(struct nfs_client *clp)
+ {
+ 	struct idmap *idmap = clp->cl_idmap;
++	int i;
+ 
+ 	if (!idmap)
+ 		return;
+ 	rpc_unlink(idmap->idmap_dentry);
+ 	clp->cl_idmap = NULL;
++	for (i = 0; i < ARRAY_SIZE(idmap->idmap_user_hash.h_entries); i++)
++		kfree(idmap->idmap_user_hash.h_entries[i].ih_name);
++	for (i = 0; i < ARRAY_SIZE(idmap->idmap_group_hash.h_entries); i++)
++		kfree(idmap->idmap_group_hash.h_entries[i].ih_name);
+ 	kfree(idmap);
+ }
+ 
+@@ -449,9 +454,14 @@
+ idmap_update_entry(struct idmap_hashent *he, const char *name,
+ 		size_t namelen, __u32 id)
+ {
++	char *str = kmalloc(namelen + 1, GFP_KERNEL);
++	if (str == NULL)
++		return;
++	kfree(he->ih_name);
+ 	he->ih_id = id;
+-	memcpy(he->ih_name, name, namelen);
+-	he->ih_name[namelen] = '\0';
++	memcpy(str, name, namelen);
++	str[namelen] = '\0';
++	he->ih_name = str;
+ 	he->ih_namelen = namelen;
+ 	he->ih_expires = jiffies + nfs_idmap_cache_timeout;
+ }

Modified: dists/sid/linux/debian/patches/series-all
==============================================================================
--- dists/sid/linux/debian/patches/series-all	Thu Jun  7 06:59:12 2012	(r19095)
+++ dists/sid/linux/debian/patches/series-all	Thu Jun  7 13:57:50 2012	(r19096)
@@ -343,3 +343,6 @@
 features/all/hidepid/0002-procfs-add-hidepid-and-gid-mount-options.patch
 features/all/hidepid/0003-proc-fix-null-pointer-deref-in-proc_pid_permission.patch
 features/all/hidepid/0004-proc-fix-mount-t-proc-o-AAA.patch
+
+bugfix/all/NFSv4-Reduce-the-footprint-of-the-idmapper.patch
+bugfix/all/NFSv4-Further-reduce-the-footprint-of-the-idmapper.patch



More information about the Kernel-svn-changes mailing list