[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