]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tmpfs,xattr: GFP_KERNEL_ACCOUNT for simple xattrs
authorHugh Dickins <hughd@google.com>
Mon, 21 Aug 2023 17:39:20 +0000 (10:39 -0700)
committerChristian Brauner <brauner@kernel.org>
Tue, 22 Aug 2023 08:57:46 +0000 (10:57 +0200)
It is particularly important for the userns mount case (when a sensible
nr_inodes maximum may not be enforced) that tmpfs user xattrs be subject
to memory cgroup limiting.  Leave temporary buffer allocations as is,
but change the persistent simple xattr allocations from GFP_KERNEL to
GFP_KERNEL_ACCOUNT.  This limits kernfs's cgroupfs too, but that's good.

(I had intended to send this change earlier, but had been confused by
shmem_alloc_inode() using GFP_KERNEL, and thought a discussion would be
needed to change that too: no, I was forgetting the SLAB_ACCOUNT on that
kmem_cache, which implicitly adds __GFP_ACCOUNT to all its allocations.)

Signed-off-by: Hugh Dickins <hughd@google.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Message-Id: <f6953e5a-4183-8314-38f2-40be60998615@google.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xattr.c
mm/shmem.c

index 2d607542281bea0926988de3a0e0b1c7b5a9a06b..efd4736bc94b09ba4363dd8b691e09deabf4acef 100644 (file)
@@ -1093,7 +1093,7 @@ struct simple_xattr *simple_xattr_alloc(const void *value, size_t size)
        if (len < sizeof(*new_xattr))
                return NULL;
 
-       new_xattr = kvmalloc(len, GFP_KERNEL);
+       new_xattr = kvmalloc(len, GFP_KERNEL_ACCOUNT);
        if (!new_xattr)
                return NULL;
 
@@ -1217,7 +1217,7 @@ struct simple_xattr *simple_xattr_set(struct simple_xattrs *xattrs,
                if (!new_xattr)
                        return ERR_PTR(-ENOMEM);
 
-               new_xattr->name = kstrdup(name, GFP_KERNEL);
+               new_xattr->name = kstrdup(name, GFP_KERNEL_ACCOUNT);
                if (!new_xattr->name) {
                        simple_xattr_free(new_xattr);
                        return ERR_PTR(-ENOMEM);
index b782edeb69aa89799b02891d89d76def4e3a17b3..11298c797cdc5959b151f46f3e481d876492caaa 100644 (file)
@@ -3616,7 +3616,7 @@ static int shmem_initxattrs(struct inode *inode,
 
                len = strlen(xattr->name) + 1;
                new_xattr->name = kmalloc(XATTR_SECURITY_PREFIX_LEN + len,
-                                         GFP_KERNEL);
+                                         GFP_KERNEL_ACCOUNT);
                if (!new_xattr->name) {
                        kvfree(new_xattr);
                        break;