On Tue 10-11-15 21:34:07, Vladimir Davydov wrote:
> This patch marks those kmem allocations that are known to be easily
> triggered from userspace as __GFP_ACCOUNT/SLAB_ACCOUNT, which makes them
> accounted to memcg. For the list, see below:
> 
>  - threadinfo
>  - task_struct
>  - task_delay_info
>  - pid
>  - cred
>  - mm_struct
>  - vm_area_struct and vm_region (nommu)
>  - anon_vma and anon_vma_chain
>  - signal_struct
>  - sighand_struct
>  - fs_struct
>  - files_struct
>  - fdtable and fdtable->full_fds_bits
>  - dentry and external_name
>  - inode for all filesystems. This is the most tedious part, because
>    most filesystems overwrite the alloc_inode method.

It would be imho nicer to split this into few patches based on the
memory category (task management, address space, icache) with a
justification.

> The list is by far not complete, so feel free to add more objects.
> Nevertheless, it should be close to "account everything" approach and
> keep most workloads within bounds. Malevolent users will be able to
> breach the limit, but this was possible even with the former "account
> everything" approach (simply because it did not account everything in
> fact).
> 
> Signed-off-by: Vladimir Davydov <[email protected]>

>From a quick look it seems reasonable.

Acked-by: Michal Hocko <[email protected]>

> ---
>  arch/powerpc/platforms/cell/spufs/inode.c     |  2 +-
>  drivers/staging/lustre/lustre/llite/super25.c |  3 ++-
>  fs/9p/v9fs.c                                  |  2 +-
>  fs/adfs/super.c                               |  2 +-
>  fs/affs/super.c                               |  2 +-
>  fs/afs/super.c                                |  2 +-
>  fs/befs/linuxvfs.c                            |  2 +-
>  fs/bfs/inode.c                                |  2 +-
>  fs/block_dev.c                                |  2 +-
>  fs/btrfs/inode.c                              |  3 ++-
>  fs/ceph/super.c                               |  4 ++--
>  fs/cifs/cifsfs.c                              |  2 +-
>  fs/coda/inode.c                               |  6 +++---
>  fs/dcache.c                                   |  5 +++--
>  fs/ecryptfs/main.c                            |  6 ++++--
>  fs/efs/super.c                                |  6 +++---
>  fs/exofs/super.c                              |  4 ++--
>  fs/ext2/super.c                               |  2 +-
>  fs/ext4/super.c                               |  2 +-
>  fs/f2fs/super.c                               |  5 +++--
>  fs/fat/inode.c                                |  2 +-
>  fs/file.c                                     |  7 ++++---
>  fs/fuse/inode.c                               |  4 ++--
>  fs/gfs2/main.c                                |  3 ++-
>  fs/hfs/super.c                                |  4 ++--
>  fs/hfsplus/super.c                            |  2 +-
>  fs/hostfs/hostfs_kern.c                       |  2 +-
>  fs/hpfs/super.c                               |  2 +-
>  fs/hugetlbfs/inode.c                          |  2 +-
>  fs/inode.c                                    |  2 +-
>  fs/isofs/inode.c                              |  2 +-
>  fs/jffs2/super.c                              |  2 +-
>  fs/jfs/super.c                                |  2 +-
>  fs/logfs/inode.c                              |  3 ++-
>  fs/minix/inode.c                              |  2 +-
>  fs/ncpfs/inode.c                              |  2 +-
>  fs/nfs/inode.c                                |  2 +-
>  fs/nilfs2/super.c                             |  3 ++-
>  fs/ntfs/super.c                               |  4 ++--
>  fs/ocfs2/dlmfs/dlmfs.c                        |  2 +-
>  fs/ocfs2/super.c                              |  2 +-
>  fs/openpromfs/inode.c                         |  2 +-
>  fs/proc/inode.c                               |  3 ++-
>  fs/qnx4/inode.c                               |  2 +-
>  fs/qnx6/inode.c                               |  2 +-
>  fs/reiserfs/super.c                           |  3 ++-
>  fs/romfs/super.c                              |  4 ++--
>  fs/squashfs/super.c                           |  3 ++-
>  fs/sysv/inode.c                               |  2 +-
>  fs/ubifs/super.c                              |  4 ++--
>  fs/udf/super.c                                |  3 ++-
>  fs/ufs/super.c                                |  2 +-
>  fs/xfs/kmem.h                                 |  1 +
>  fs/xfs/xfs_super.c                            |  4 ++--
>  include/linux/thread_info.h                   |  5 +++--
>  ipc/mqueue.c                                  |  2 +-
>  kernel/cred.c                                 |  4 ++--
>  kernel/delayacct.c                            |  2 +-
>  kernel/fork.c                                 | 22 +++++++++++++---------
>  kernel/pid.c                                  |  2 +-
>  mm/nommu.c                                    |  2 +-
>  mm/rmap.c                                     |  6 ++++--
>  mm/shmem.c                                    |  2 +-
>  net/socket.c                                  |  2 +-
>  net/sunrpc/rpc_pipe.c                         |  2 +-
>  65 files changed, 114 insertions(+), 92 deletions(-)
> 
> diff --git a/arch/powerpc/platforms/cell/spufs/inode.c 
> b/arch/powerpc/platforms/cell/spufs/inode.c
> index 11634fa7ab3c..ad4840f86be1 100644
> --- a/arch/powerpc/platforms/cell/spufs/inode.c
> +++ b/arch/powerpc/platforms/cell/spufs/inode.c
> @@ -767,7 +767,7 @@ static int __init spufs_init(void)
>       ret = -ENOMEM;
>       spufs_inode_cache = kmem_cache_create("spufs_inode_cache",
>                       sizeof(struct spufs_inode_info), 0,
> -                     SLAB_HWCACHE_ALIGN, spufs_init_once);
> +                     SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT, spufs_init_once);
>  
>       if (!spufs_inode_cache)
>               goto out;
> diff --git a/drivers/staging/lustre/lustre/llite/super25.c 
> b/drivers/staging/lustre/lustre/llite/super25.c
> index 013136860664..60828d692db4 100644
> --- a/drivers/staging/lustre/lustre/llite/super25.c
> +++ b/drivers/staging/lustre/lustre/llite/super25.c
> @@ -106,7 +106,8 @@ static int __init init_lustre_lite(void)
>       rc = -ENOMEM;
>       ll_inode_cachep = kmem_cache_create("lustre_inode_cache",
>                                           sizeof(struct ll_inode_info),
> -                                         0, SLAB_HWCACHE_ALIGN, NULL);
> +                                         0, SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT,
> +                                         NULL);
>       if (ll_inode_cachep == NULL)
>               goto out_cache;
>  
> diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
> index 6caca025019d..072e7599583a 100644
> --- a/fs/9p/v9fs.c
> +++ b/fs/9p/v9fs.c
> @@ -575,7 +575,7 @@ static int v9fs_init_inode_cache(void)
>       v9fs_inode_cache = kmem_cache_create("v9fs_inode_cache",
>                                         sizeof(struct v9fs_inode),
>                                         0, (SLAB_RECLAIM_ACCOUNT|
> -                                           SLAB_MEM_SPREAD),
> +                                           SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                         v9fs_inode_init_once);
>       if (!v9fs_inode_cache)
>               return -ENOMEM;
> diff --git a/fs/adfs/super.c b/fs/adfs/super.c
> index 4d4a0df8344f..c9fdfb112933 100644
> --- a/fs/adfs/super.c
> +++ b/fs/adfs/super.c
> @@ -271,7 +271,7 @@ static int __init init_inodecache(void)
>       adfs_inode_cachep = kmem_cache_create("adfs_inode_cache",
>                                            sizeof(struct adfs_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (adfs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/affs/super.c b/fs/affs/super.c
> index 5b50c4ca43a7..84a84fcb5f5a 100644
> --- a/fs/affs/super.c
> +++ b/fs/affs/super.c
> @@ -132,7 +132,7 @@ static int __init init_inodecache(void)
>       affs_inode_cachep = kmem_cache_create("affs_inode_cache",
>                                            sizeof(struct affs_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (affs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/afs/super.c b/fs/afs/super.c
> index 1fb4a5129f7d..81afefe7d8a6 100644
> --- a/fs/afs/super.c
> +++ b/fs/afs/super.c
> @@ -91,7 +91,7 @@ int __init afs_fs_init(void)
>       afs_inode_cachep = kmem_cache_create("afs_inode_cache",
>                                            sizeof(struct afs_vnode),
>                                            0,
> -                                          SLAB_HWCACHE_ALIGN,
> +                                          SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT,
>                                            afs_i_init_once);
>       if (!afs_inode_cachep) {
>               printk(KERN_NOTICE "kAFS: Failed to allocate inode cache\n");
> diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c
> index 46aedacfa6a8..2a23edf5703e 100644
> --- a/fs/befs/linuxvfs.c
> +++ b/fs/befs/linuxvfs.c
> @@ -434,7 +434,7 @@ befs_init_inodecache(void)
>       befs_inode_cachep = kmem_cache_create("befs_inode_cache",
>                                             sizeof (struct befs_inode_info),
>                                             0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                             init_once);
>       if (befs_inode_cachep == NULL) {
>               pr_err("%s: Couldn't initialize inode slabcache\n", __func__);
> diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c
> index fdcb4d69f430..1e5c896f6b79 100644
> --- a/fs/bfs/inode.c
> +++ b/fs/bfs/inode.c
> @@ -270,7 +270,7 @@ static int __init init_inodecache(void)
>       bfs_inode_cachep = kmem_cache_create("bfs_inode_cache",
>                                            sizeof(struct bfs_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (bfs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/block_dev.c b/fs/block_dev.c
> index 0a793c7930eb..29ce98bfe04f 100644
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -567,7 +567,7 @@ void __init bdev_cache_init(void)
>  
>       bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
>                       0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
> -                             SLAB_MEM_SPREAD|SLAB_PANIC),
> +                             SLAB_MEM_SPREAD|SLAB_ACCOUNT|SLAB_PANIC),
>                       init_once);
>       err = register_filesystem(&bd_type);
>       if (err)
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 4439fbb4ff45..c24d4cd9c14f 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -9157,7 +9157,8 @@ int btrfs_init_cachep(void)
>  {
>       btrfs_inode_cachep = kmem_cache_create("btrfs_inode",
>                       sizeof(struct btrfs_inode), 0,
> -                     SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, init_once);
> +                     SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD | SLAB_ACCOUNT,
> +                     init_once);
>       if (!btrfs_inode_cachep)
>               goto fail;
>  
> diff --git a/fs/ceph/super.c b/fs/ceph/super.c
> index f446afada328..ca4d5e8457f1 100644
> --- a/fs/ceph/super.c
> +++ b/fs/ceph/super.c
> @@ -639,8 +639,8 @@ static int __init init_caches(void)
>       ceph_inode_cachep = kmem_cache_create("ceph_inode_info",
>                                     sizeof(struct ceph_inode_info),
>                                     __alignof__(struct ceph_inode_info),
> -                                   (SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD),
> -                                   ceph_inode_init_once);
> +                                   SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
> +                                   SLAB_ACCOUNT, ceph_inode_init_once);
>       if (ceph_inode_cachep == NULL)
>               return -ENOMEM;
>  
> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> index e739950ca084..7f2e2639d1d1 100644
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -1040,7 +1040,7 @@ cifs_init_inodecache(void)
>       cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
>                                             sizeof(struct cifsInodeInfo),
>                                             0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                             cifs_init_once);
>       if (cifs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/coda/inode.c b/fs/coda/inode.c
> index cac1390b87a3..57e81cbba0fa 100644
> --- a/fs/coda/inode.c
> +++ b/fs/coda/inode.c
> @@ -74,9 +74,9 @@ static void init_once(void *foo)
>  int __init coda_init_inodecache(void)
>  {
>       coda_inode_cachep = kmem_cache_create("coda_inode_cache",
> -                             sizeof(struct coda_inode_info),
> -                             0, SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
> -                             init_once);
> +                             sizeof(struct coda_inode_info), 0,
> +                             SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
> +                             SLAB_ACCOUNT, init_once);
>       if (coda_inode_cachep == NULL)
>               return -ENOMEM;
>       return 0;
> diff --git a/fs/dcache.c b/fs/dcache.c
> index 5c33aeb0f68f..7ac590912106 100644
> --- a/fs/dcache.c
> +++ b/fs/dcache.c
> @@ -1571,7 +1571,8 @@ struct dentry *__d_alloc(struct super_block *sb, const 
> struct qstr *name)
>       dentry->d_iname[DNAME_INLINE_LEN-1] = 0;
>       if (name->len > DNAME_INLINE_LEN-1) {
>               size_t size = offsetof(struct external_name, name[1]);
> -             struct external_name *p = kmalloc(size + name->len, GFP_KERNEL);
> +             struct external_name *p = kmalloc(size + name->len,
> +                                               GFP_KERNEL_ACCOUNT);
>               if (!p) {
>                       kmem_cache_free(dentry_cache, dentry); 
>                       return NULL;
> @@ -3415,7 +3416,7 @@ static void __init dcache_init(void)
>        * of the dcache. 
>        */
>       dentry_cache = KMEM_CACHE(dentry,
> -             SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD);
> +             SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD|SLAB_ACCOUNT);
>  
>       /* Hash may have been set up in dcache_init_early */
>       if (!hashdist)
> diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
> index 4f4d0474bee9..e25b6b06bacf 100644
> --- a/fs/ecryptfs/main.c
> +++ b/fs/ecryptfs/main.c
> @@ -663,6 +663,7 @@ static struct ecryptfs_cache_info {
>       struct kmem_cache **cache;
>       const char *name;
>       size_t size;
> +     unsigned long flags;
>       void (*ctor)(void *obj);
>  } ecryptfs_cache_infos[] = {
>       {
> @@ -684,6 +685,7 @@ static struct ecryptfs_cache_info {
>               .cache = &ecryptfs_inode_info_cache,
>               .name = "ecryptfs_inode_cache",
>               .size = sizeof(struct ecryptfs_inode_info),
> +             .flags = SLAB_ACCOUNT,
>               .ctor = inode_info_init_once,
>       },
>       {
> @@ -755,8 +757,8 @@ static int ecryptfs_init_kmem_caches(void)
>               struct ecryptfs_cache_info *info;
>  
>               info = &ecryptfs_cache_infos[i];
> -             *(info->cache) = kmem_cache_create(info->name, info->size,
> -                             0, SLAB_HWCACHE_ALIGN, info->ctor);
> +             *(info->cache) = kmem_cache_create(info->name, info->size, 0,
> +                             SLAB_HWCACHE_ALIGN | info->flags, info->ctor);
>               if (!*(info->cache)) {
>                       ecryptfs_free_kmem_caches();
>                       ecryptfs_printk(KERN_WARNING, "%s: "
> diff --git a/fs/efs/super.c b/fs/efs/super.c
> index c8411a30f7da..cb68dac4f9d3 100644
> --- a/fs/efs/super.c
> +++ b/fs/efs/super.c
> @@ -94,9 +94,9 @@ static void init_once(void *foo)
>  static int __init init_inodecache(void)
>  {
>       efs_inode_cachep = kmem_cache_create("efs_inode_cache",
> -                             sizeof(struct efs_inode_info),
> -                             0, SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
> -                             init_once);
> +                             sizeof(struct efs_inode_info), 0,
> +                             SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
> +                             SLAB_ACCOUNT, init_once);
>       if (efs_inode_cachep == NULL)
>               return -ENOMEM;
>       return 0;
> diff --git a/fs/exofs/super.c b/fs/exofs/super.c
> index b795c567b5e1..6658a50530a0 100644
> --- a/fs/exofs/super.c
> +++ b/fs/exofs/super.c
> @@ -194,8 +194,8 @@ static int init_inodecache(void)
>  {
>       exofs_inode_cachep = kmem_cache_create("exofs_inode_cache",
>                               sizeof(struct exofs_i_info), 0,
> -                             SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD,
> -                             exofs_init_once);
> +                             SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD |
> +                             SLAB_ACCOUNT, exofs_init_once);
>       if (exofs_inode_cachep == NULL)
>               return -ENOMEM;
>       return 0;
> diff --git a/fs/ext2/super.c b/fs/ext2/super.c
> index 900e19cf9ef6..973092a32b98 100644
> --- a/fs/ext2/super.c
> +++ b/fs/ext2/super.c
> @@ -200,7 +200,7 @@ static int __init init_inodecache(void)
>       ext2_inode_cachep = kmem_cache_create("ext2_inode_cache",
>                                            sizeof(struct ext2_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (ext2_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index 04d0f1b33409..c4a5c415b881 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -966,7 +966,7 @@ static int __init init_inodecache(void)
>       ext4_inode_cachep = kmem_cache_create("ext4_inode_cache",
>                                            sizeof(struct ext4_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (ext4_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index 3a65e0132352..862916c7e3f8 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -1424,8 +1424,9 @@ MODULE_ALIAS_FS("f2fs");
>  
>  static int __init init_inodecache(void)
>  {
> -     f2fs_inode_cachep = f2fs_kmem_cache_create("f2fs_inode_cache",
> -                     sizeof(struct f2fs_inode_info));
> +     f2fs_inode_cachep = kmem_cache_create("f2fs_inode_cache",
> +                     sizeof(struct f2fs_inode_info), 0,
> +                     SLAB_RECLAIM_ACCOUNT|SLAB_ACCOUNT, NULL);
>       if (!f2fs_inode_cachep)
>               return -ENOMEM;
>       return 0;
> diff --git a/fs/fat/inode.c b/fs/fat/inode.c
> index 509411dd3698..6aece96df19f 100644
> --- a/fs/fat/inode.c
> +++ b/fs/fat/inode.c
> @@ -677,7 +677,7 @@ static int __init fat_init_inodecache(void)
>       fat_inode_cachep = kmem_cache_create("fat_inode_cache",
>                                            sizeof(struct msdos_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (fat_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/file.c b/fs/file.c
> index 39f8f15921da..7d76c929d557 100644
> --- a/fs/file.c
> +++ b/fs/file.c
> @@ -37,11 +37,12 @@ static void *alloc_fdmem(size_t size)
>        * vmalloc() if the allocation size will be considered "large" by the 
> VM.
>        */
>       if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) {
> -             void *data = kmalloc(size, 
> GFP_KERNEL|__GFP_NOWARN|__GFP_NORETRY);
> +             void *data = kmalloc(size, GFP_KERNEL_ACCOUNT |
> +                                  __GFP_NOWARN | __GFP_NORETRY);
>               if (data != NULL)
>                       return data;
>       }
> -     return vmalloc(size);
> +     return __vmalloc(size, GFP_KERNEL_ACCOUNT | __GFP_HIGHMEM, PAGE_KERNEL);
>  }
>  
>  static void __free_fdtable(struct fdtable *fdt)
> @@ -126,7 +127,7 @@ static struct fdtable * alloc_fdtable(unsigned int nr)
>       if (unlikely(nr > sysctl_nr_open))
>               nr = ((sysctl_nr_open - 1) | (BITS_PER_LONG - 1)) + 1;
>  
> -     fdt = kmalloc(sizeof(struct fdtable), GFP_KERNEL);
> +     fdt = kmalloc(sizeof(struct fdtable), GFP_KERNEL_ACCOUNT);
>       if (!fdt)
>               goto out;
>       fdt->max_fds = nr;
> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
> index 2913db2a5b99..4d69d5c0bedc 100644
> --- a/fs/fuse/inode.c
> +++ b/fs/fuse/inode.c
> @@ -1255,8 +1255,8 @@ static int __init fuse_fs_init(void)
>       int err;
>  
>       fuse_inode_cachep = kmem_cache_create("fuse_inode",
> -                                           sizeof(struct fuse_inode),
> -                                           0, SLAB_HWCACHE_ALIGN,
> +                                           sizeof(struct fuse_inode), 0,
> +                                           SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT,
>                                             fuse_inode_init_once);
>       err = -ENOMEM;
>       if (!fuse_inode_cachep)
> diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c
> index 241a399bf83d..6ee38e210602 100644
> --- a/fs/gfs2/main.c
> +++ b/fs/gfs2/main.c
> @@ -112,7 +112,8 @@ static int __init init_gfs2_fs(void)
>       gfs2_inode_cachep = kmem_cache_create("gfs2_inode",
>                                             sizeof(struct gfs2_inode),
>                                             0,  SLAB_RECLAIM_ACCOUNT|
> -                                               SLAB_MEM_SPREAD,
> +                                               SLAB_MEM_SPREAD|
> +                                               SLAB_ACCOUNT,
>                                             gfs2_init_inode_once);
>       if (!gfs2_inode_cachep)
>               goto fail;
> diff --git a/fs/hfs/super.c b/fs/hfs/super.c
> index 4574fdd3d421..1ca95c232bb5 100644
> --- a/fs/hfs/super.c
> +++ b/fs/hfs/super.c
> @@ -483,8 +483,8 @@ static int __init init_hfs_fs(void)
>       int err;
>  
>       hfs_inode_cachep = kmem_cache_create("hfs_inode_cache",
> -             sizeof(struct hfs_inode_info), 0, SLAB_HWCACHE_ALIGN,
> -             hfs_init_once);
> +             sizeof(struct hfs_inode_info), 0,
> +             SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT, hfs_init_once);
>       if (!hfs_inode_cachep)
>               return -ENOMEM;
>       err = register_filesystem(&hfs_fs_type);
> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
> index 7302d96ae8bf..5d54490a136d 100644
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -663,7 +663,7 @@ static int __init init_hfsplus_fs(void)
>       int err;
>  
>       hfsplus_inode_cachep = kmem_cache_create("hfsplus_icache",
> -             HFSPLUS_INODE_SIZE, 0, SLAB_HWCACHE_ALIGN,
> +             HFSPLUS_INODE_SIZE, 0, SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT,
>               hfsplus_init_once);
>       if (!hfsplus_inode_cachep)
>               return -ENOMEM;
> diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
> index 2ac99db3750e..a4cf6b11a142 100644
> --- a/fs/hostfs/hostfs_kern.c
> +++ b/fs/hostfs/hostfs_kern.c
> @@ -223,7 +223,7 @@ static struct inode *hostfs_alloc_inode(struct 
> super_block *sb)
>  {
>       struct hostfs_inode_info *hi;
>  
> -     hi = kmalloc(sizeof(*hi), GFP_KERNEL);
> +     hi = kmalloc(sizeof(*hi), GFP_KERNEL_ACCOUNT);
>       if (hi == NULL)
>               return NULL;
>       hi->fd = -1;
> diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c
> index a561591896bd..458cf463047b 100644
> --- a/fs/hpfs/super.c
> +++ b/fs/hpfs/super.c
> @@ -261,7 +261,7 @@ static int init_inodecache(void)
>       hpfs_inode_cachep = kmem_cache_create("hpfs_inode_cache",
>                                            sizeof(struct hpfs_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (hpfs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index 316adb968b65..496add05f380 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -1322,7 +1322,7 @@ static int __init init_hugetlbfs_fs(void)
>       error = -ENOMEM;
>       hugetlbfs_inode_cachep = kmem_cache_create("hugetlbfs_inode_cache",
>                                       sizeof(struct hugetlbfs_inode_info),
> -                                     0, 0, init_once);
> +                                     0, SLAB_ACCOUNT, init_once);
>       if (hugetlbfs_inode_cachep == NULL)
>               goto out2;
>  
> diff --git a/fs/inode.c b/fs/inode.c
> index 78a17b8859e1..08c66502f1f4 100644
> --- a/fs/inode.c
> +++ b/fs/inode.c
> @@ -1882,7 +1882,7 @@ void __init inode_init(void)
>                                        sizeof(struct inode),
>                                        0,
>                                        (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|
> -                                      SLAB_MEM_SPREAD),
> +                                      SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                        init_once);
>  
>       /* Hash may have been set up in inode_init_early */
> diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
> index d67a16f2a45d..9bc2431d2df8 100644
> --- a/fs/isofs/inode.c
> +++ b/fs/isofs/inode.c
> @@ -94,7 +94,7 @@ static int __init init_inodecache(void)
>       isofs_inode_cachep = kmem_cache_create("isofs_inode_cache",
>                                       sizeof(struct iso_inode_info),
>                                       0, (SLAB_RECLAIM_ACCOUNT|
> -                                     SLAB_MEM_SPREAD),
> +                                     SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                       init_once);
>       if (isofs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
> index d86c5e3176a1..bb080c272149 100644
> --- a/fs/jffs2/super.c
> +++ b/fs/jffs2/super.c
> @@ -387,7 +387,7 @@ static int __init init_jffs2_fs(void)
>       jffs2_inode_cachep = kmem_cache_create("jffs2_i",
>                                            sizeof(struct jffs2_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            jffs2_i_init_once);
>       if (!jffs2_inode_cachep) {
>               pr_err("error: Failed to initialise inode cache\n");
> diff --git a/fs/jfs/super.c b/fs/jfs/super.c
> index 4cd9798f4948..6efadc61c15b 100644
> --- a/fs/jfs/super.c
> +++ b/fs/jfs/super.c
> @@ -901,7 +901,7 @@ static int __init init_jfs_fs(void)
>  
>       jfs_inode_cachep =
>           kmem_cache_create("jfs_ip", sizeof(struct jfs_inode_info), 0,
> -                         SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
> +                         SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|SLAB_ACCOUNT,
>                           init_once);
>       if (jfs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/logfs/inode.c b/fs/logfs/inode.c
> index af49e2d6941a..5d65db2e03f4 100644
> --- a/fs/logfs/inode.c
> +++ b/fs/logfs/inode.c
> @@ -408,7 +408,8 @@ const struct super_operations logfs_super_operations = {
>  int logfs_init_inode_cache(void)
>  {
>       logfs_inode_cache = kmem_cache_create("logfs_inode_cache",
> -                     sizeof(struct logfs_inode), 0, SLAB_RECLAIM_ACCOUNT,
> +                     sizeof(struct logfs_inode), 0,
> +                     SLAB_RECLAIM_ACCOUNT|SLAB_ACCOUNT,
>                       logfs_init_once);
>       if (!logfs_inode_cache)
>               return -ENOMEM;
> diff --git a/fs/minix/inode.c b/fs/minix/inode.c
> index 086cd0a61e80..5942c3e10fa5 100644
> --- a/fs/minix/inode.c
> +++ b/fs/minix/inode.c
> @@ -91,7 +91,7 @@ static int __init init_inodecache(void)
>       minix_inode_cachep = kmem_cache_create("minix_inode_cache",
>                                            sizeof(struct minix_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (minix_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c
> index 9605a2f63549..d80446e1a333 100644
> --- a/fs/ncpfs/inode.c
> +++ b/fs/ncpfs/inode.c
> @@ -82,7 +82,7 @@ static int init_inodecache(void)
>       ncp_inode_cachep = kmem_cache_create("ncp_inode_cache",
>                                            sizeof(struct ncp_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (ncp_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
> index 326d9e10d833..412f888fad13 100644
> --- a/fs/nfs/inode.c
> +++ b/fs/nfs/inode.c
> @@ -1904,7 +1904,7 @@ static int __init nfs_init_inodecache(void)
>       nfs_inode_cachep = kmem_cache_create("nfs_inode_cache",
>                                            sizeof(struct nfs_inode),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (nfs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
> index f47585bfeb01..dcf8e2ff3072 100644
> --- a/fs/nilfs2/super.c
> +++ b/fs/nilfs2/super.c
> @@ -1419,7 +1419,8 @@ static int __init nilfs_init_cachep(void)
>  {
>       nilfs_inode_cachep = kmem_cache_create("nilfs2_inode_cache",
>                       sizeof(struct nilfs_inode_info), 0,
> -                     SLAB_RECLAIM_ACCOUNT, nilfs_inode_init_once);
> +                     SLAB_RECLAIM_ACCOUNT|SLAB_ACCOUNT,
> +                     nilfs_inode_init_once);
>       if (!nilfs_inode_cachep)
>               goto fail;
>  
> diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c
> index d1a853585b53..2f77f8dfb861 100644
> --- a/fs/ntfs/super.c
> +++ b/fs/ntfs/super.c
> @@ -3139,8 +3139,8 @@ static int __init init_ntfs_fs(void)
>  
>       ntfs_big_inode_cache = kmem_cache_create(ntfs_big_inode_cache_name,
>                       sizeof(big_ntfs_inode), 0,
> -                     SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
> -                     ntfs_big_inode_init_once);
> +                     SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
> +                     SLAB_ACCOUNT, ntfs_big_inode_init_once);
>       if (!ntfs_big_inode_cache) {
>               pr_crit("Failed to create %s!\n", ntfs_big_inode_cache_name);
>               goto big_inode_err_out;
> diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
> index b5cf27dcb18a..03768bb3aab1 100644
> --- a/fs/ocfs2/dlmfs/dlmfs.c
> +++ b/fs/ocfs2/dlmfs/dlmfs.c
> @@ -638,7 +638,7 @@ static int __init init_dlmfs_fs(void)
>       dlmfs_inode_cache = kmem_cache_create("dlmfs_inode_cache",
>                               sizeof(struct dlmfs_inode_private),
>                               0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
> -                                     SLAB_MEM_SPREAD),
> +                                     SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                               dlmfs_init_once);
>       if (!dlmfs_inode_cache) {
>               status = -ENOMEM;
> diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
> index 2de4c8a9340c..8ab0fcbc0b86 100644
> --- a/fs/ocfs2/super.c
> +++ b/fs/ocfs2/super.c
> @@ -1771,7 +1771,7 @@ static int ocfs2_initialize_mem_caches(void)
>                                      sizeof(struct ocfs2_inode_info),
>                                      0,
>                                      (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                      ocfs2_inode_init_once);
>       ocfs2_dquot_cachep = kmem_cache_create("ocfs2_dquot_cache",
>                                       sizeof(struct ocfs2_dquot),
> diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c
> index 15e4500cda3e..b61b883c8ff8 100644
> --- a/fs/openpromfs/inode.c
> +++ b/fs/openpromfs/inode.c
> @@ -443,7 +443,7 @@ static int __init init_openprom_fs(void)
>                                           sizeof(struct op_inode_info),
>                                           0,
>                                           (SLAB_RECLAIM_ACCOUNT |
> -                                          SLAB_MEM_SPREAD),
> +                                          SLAB_MEM_SPREAD | SLAB_ACCOUNT),
>                                           op_inode_init_once);
>       if (!op_inode_cachep)
>               return -ENOMEM;
> diff --git a/fs/proc/inode.c b/fs/proc/inode.c
> index bd95b9fdebb0..561557122dea 100644
> --- a/fs/proc/inode.c
> +++ b/fs/proc/inode.c
> @@ -95,7 +95,8 @@ void __init proc_init_inodecache(void)
>       proc_inode_cachep = kmem_cache_create("proc_inode_cache",
>                                            sizeof(struct proc_inode),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD|SLAB_PANIC),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT|
> +                                             SLAB_PANIC),
>                                            init_once);
>  }
>  
> diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c
> index c4bcb778886e..f761acdd5a7a 100644
> --- a/fs/qnx4/inode.c
> +++ b/fs/qnx4/inode.c
> @@ -364,7 +364,7 @@ static int init_inodecache(void)
>       qnx4_inode_cachep = kmem_cache_create("qnx4_inode_cache",
>                                            sizeof(struct qnx4_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (qnx4_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/qnx6/inode.c b/fs/qnx6/inode.c
> index 32d2e1a9774c..4f04f00a7e5e 100644
> --- a/fs/qnx6/inode.c
> +++ b/fs/qnx6/inode.c
> @@ -624,7 +624,7 @@ static int init_inodecache(void)
>       qnx6_inode_cachep = kmem_cache_create("qnx6_inode_cache",
>                                            sizeof(struct qnx6_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (!qnx6_inode_cachep)
>               return -ENOMEM;
> diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
> index 4a62fe8cc3bf..05db7473bcb5 100644
> --- a/fs/reiserfs/super.c
> +++ b/fs/reiserfs/super.c
> @@ -626,7 +626,8 @@ static int __init init_inodecache(void)
>                                                 sizeof(struct
>                                                        reiserfs_inode_info),
>                                                 0, (SLAB_RECLAIM_ACCOUNT|
> -                                                     SLAB_MEM_SPREAD),
> +                                                   SLAB_MEM_SPREAD|
> +                                                   SLAB_ACCOUNT),
>                                                 init_once);
>       if (reiserfs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/romfs/super.c b/fs/romfs/super.c
> index 268733cda397..e1113399a6b4 100644
> --- a/fs/romfs/super.c
> +++ b/fs/romfs/super.c
> @@ -618,8 +618,8 @@ static int __init init_romfs_fs(void)
>       romfs_inode_cachep =
>               kmem_cache_create("romfs_i",
>                                 sizeof(struct romfs_inode_info), 0,
> -                               SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD,
> -                               romfs_i_init_once);
> +                               SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD |
> +                               SLAB_ACCOUNT, romfs_i_init_once);
>  
>       if (!romfs_inode_cachep) {
>               pr_err("Failed to initialise inode cache\n");
> diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c
> index 5056babe00df..ea59b475663c 100644
> --- a/fs/squashfs/super.c
> +++ b/fs/squashfs/super.c
> @@ -420,7 +420,8 @@ static int __init init_inodecache(void)
>  {
>       squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache",
>               sizeof(struct squashfs_inode_info), 0,
> -             SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, init_once);
> +             SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|SLAB_ACCOUNT,
> +             init_once);
>  
>       return squashfs_inode_cachep ? 0 : -ENOMEM;
>  }
> diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c
> index 590ad9206e3f..087ed6a1c1df 100644
> --- a/fs/sysv/inode.c
> +++ b/fs/sysv/inode.c
> @@ -353,7 +353,7 @@ int __init sysv_init_icache(void)
>  {
>       sysv_inode_cachep = kmem_cache_create("sysv_inode_cache",
>                       sizeof(struct sysv_inode_info), 0,
> -                     SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
> +                     SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|SLAB_ACCOUNT,
>                       init_once);
>       if (!sysv_inode_cachep)
>               return -ENOMEM;
> diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
> index 9547a27868ad..9d064789c63a 100644
> --- a/fs/ubifs/super.c
> +++ b/fs/ubifs/super.c
> @@ -2241,8 +2241,8 @@ static int __init ubifs_init(void)
>  
>       ubifs_inode_slab = kmem_cache_create("ubifs_inode_slab",
>                               sizeof(struct ubifs_inode), 0,
> -                             SLAB_MEM_SPREAD | SLAB_RECLAIM_ACCOUNT,
> -                             &inode_slab_ctor);
> +                             SLAB_MEM_SPREAD | SLAB_RECLAIM_ACCOUNT |
> +                             SLAB_ACCOUNT, &inode_slab_ctor);
>       if (!ubifs_inode_slab)
>               return -ENOMEM;
>  
> diff --git a/fs/udf/super.c b/fs/udf/super.c
> index 81155b9b445b..9c64a3ca9837 100644
> --- a/fs/udf/super.c
> +++ b/fs/udf/super.c
> @@ -179,7 +179,8 @@ static int __init init_inodecache(void)
>       udf_inode_cachep = kmem_cache_create("udf_inode_cache",
>                                            sizeof(struct udf_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT |
> -                                              SLAB_MEM_SPREAD),
> +                                              SLAB_MEM_SPREAD |
> +                                              SLAB_ACCOUNT),
>                                            init_once);
>       if (!udf_inode_cachep)
>               return -ENOMEM;
> diff --git a/fs/ufs/super.c b/fs/ufs/super.c
> index f6390eec02ca..442fd52ebffe 100644
> --- a/fs/ufs/super.c
> +++ b/fs/ufs/super.c
> @@ -1427,7 +1427,7 @@ static int __init init_inodecache(void)
>       ufs_inode_cachep = kmem_cache_create("ufs_inode_cache",
>                                            sizeof(struct ufs_inode_info),
>                                            0, (SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                                            init_once);
>       if (ufs_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h
> index cc6b768fc068..d1c66e465ca5 100644
> --- a/fs/xfs/kmem.h
> +++ b/fs/xfs/kmem.h
> @@ -84,6 +84,7 @@ kmem_zalloc(size_t size, xfs_km_flags_t flags)
>  #define KM_ZONE_HWALIGN      SLAB_HWCACHE_ALIGN
>  #define KM_ZONE_RECLAIM      SLAB_RECLAIM_ACCOUNT
>  #define KM_ZONE_SPREAD       SLAB_MEM_SPREAD
> +#define KM_ZONE_ACCOUNT      SLAB_ACCOUNT
>  
>  #define kmem_zone    kmem_cache
>  #define kmem_zone_t  struct kmem_cache
> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> index 904f637cfa5f..70d5b3072631 100644
> --- a/fs/xfs/xfs_super.c
> +++ b/fs/xfs/xfs_super.c
> @@ -1703,8 +1703,8 @@ xfs_init_zones(void)
>  
>       xfs_inode_zone =
>               kmem_zone_init_flags(sizeof(xfs_inode_t), "xfs_inode",
> -                     KM_ZONE_HWALIGN | KM_ZONE_RECLAIM | KM_ZONE_SPREAD,
> -                     xfs_fs_inode_init_once);
> +                     KM_ZONE_HWALIGN | KM_ZONE_RECLAIM | KM_ZONE_SPREAD |
> +                     KM_ZONE_ACCOUNT, xfs_fs_inode_init_once);
>       if (!xfs_inode_zone)
>               goto out_destroy_efi_zone;
>  
> diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h
> index ff307b548ed3..b4c2a485b28a 100644
> --- a/include/linux/thread_info.h
> +++ b/include/linux/thread_info.h
> @@ -56,9 +56,10 @@ extern long do_no_restart_syscall(struct restart_block 
> *parm);
>  #ifdef __KERNEL__
>  
>  #ifdef CONFIG_DEBUG_STACK_USAGE
> -# define THREADINFO_GFP              (GFP_KERNEL | __GFP_NOTRACK | 
> __GFP_ZERO)
> +# define THREADINFO_GFP              (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | \
> +                              __GFP_ZERO)
>  #else
> -# define THREADINFO_GFP              (GFP_KERNEL | __GFP_NOTRACK)
> +# define THREADINFO_GFP              (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK)
>  #endif
>  
>  /*
> diff --git a/ipc/mqueue.c b/ipc/mqueue.c
> index 161a1807e6ef..f4617cf07069 100644
> --- a/ipc/mqueue.c
> +++ b/ipc/mqueue.c
> @@ -1438,7 +1438,7 @@ static int __init init_mqueue_fs(void)
>  
>       mqueue_inode_cachep = kmem_cache_create("mqueue_inode_cache",
>                               sizeof(struct mqueue_inode_info), 0,
> -                             SLAB_HWCACHE_ALIGN, init_once);
> +                             SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT, init_once);
>       if (mqueue_inode_cachep == NULL)
>               return -ENOMEM;
>  
> diff --git a/kernel/cred.c b/kernel/cred.c
> index 71179a09c1d6..0c0cd8a62285 100644
> --- a/kernel/cred.c
> +++ b/kernel/cred.c
> @@ -569,8 +569,8 @@ EXPORT_SYMBOL(revert_creds);
>  void __init cred_init(void)
>  {
>       /* allocate a slab in which we can store credentials */
> -     cred_jar = kmem_cache_create("cred_jar", sizeof(struct cred),
> -                                  0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
> +     cred_jar = kmem_cache_create("cred_jar", sizeof(struct cred), 0,
> +                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL);
>  }
>  
>  /**
> diff --git a/kernel/delayacct.c b/kernel/delayacct.c
> index ef90b04d783f..435c14a45118 100644
> --- a/kernel/delayacct.c
> +++ b/kernel/delayacct.c
> @@ -34,7 +34,7 @@ __setup("nodelayacct", delayacct_setup_disable);
>  
>  void delayacct_init(void)
>  {
> -     delayacct_cache = KMEM_CACHE(task_delay_info, SLAB_PANIC);
> +     delayacct_cache = KMEM_CACHE(task_delay_info, SLAB_PANIC|SLAB_ACCOUNT);
>       delayacct_tsk_init(&init_task);
>  }
>  
> diff --git a/kernel/fork.c b/kernel/fork.c
> index f97f2c449f5c..ff39b78e6e23 100644
> --- a/kernel/fork.c
> +++ b/kernel/fork.c
> @@ -300,9 +300,9 @@ void __init fork_init(void)
>  #define ARCH_MIN_TASKALIGN   L1_CACHE_BYTES
>  #endif
>       /* create a slab on which task_structs can be allocated */
> -     task_struct_cachep =
> -             kmem_cache_create("task_struct", arch_task_struct_size,
> -                     ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL);
> +     task_struct_cachep = kmem_cache_create("task_struct",
> +                     arch_task_struct_size, ARCH_MIN_TASKALIGN,
> +                     SLAB_PANIC|SLAB_NOTRACK|SLAB_ACCOUNT, NULL);
>  #endif
>  
>       /* do the arch specific task caches init */
> @@ -1851,16 +1851,19 @@ void __init proc_caches_init(void)
>       sighand_cachep = kmem_cache_create("sighand_cache",
>                       sizeof(struct sighand_struct), 0,
>                       SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_DESTROY_BY_RCU|
> -                     SLAB_NOTRACK, sighand_ctor);
> +                     SLAB_NOTRACK|SLAB_ACCOUNT, sighand_ctor);
>       signal_cachep = kmem_cache_create("signal_cache",
>                       sizeof(struct signal_struct), 0,
> -                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK, NULL);
> +                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK|SLAB_ACCOUNT,
> +                     NULL);
>       files_cachep = kmem_cache_create("files_cache",
>                       sizeof(struct files_struct), 0,
> -                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK, NULL);
> +                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK|SLAB_ACCOUNT,
> +                     NULL);
>       fs_cachep = kmem_cache_create("fs_cache",
>                       sizeof(struct fs_struct), 0,
> -                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK, NULL);
> +                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK|SLAB_ACCOUNT,
> +                     NULL);
>       /*
>        * FIXME! The "sizeof(struct mm_struct)" currently includes the
>        * whole struct cpumask for the OFFSTACK case. We could change
> @@ -1870,8 +1873,9 @@ void __init proc_caches_init(void)
>        */
>       mm_cachep = kmem_cache_create("mm_struct",
>                       sizeof(struct mm_struct), ARCH_MIN_MMSTRUCT_ALIGN,
> -                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK, NULL);
> -     vm_area_cachep = KMEM_CACHE(vm_area_struct, SLAB_PANIC);
> +                     SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK|SLAB_ACCOUNT,
> +                     NULL);
> +     vm_area_cachep = KMEM_CACHE(vm_area_struct, SLAB_PANIC|SLAB_ACCOUNT);
>       mmap_init();
>       nsproxy_cache_init();
>  }
> diff --git a/kernel/pid.c b/kernel/pid.c
> index ca368793808e..f09b026f5b56 100644
> --- a/kernel/pid.c
> +++ b/kernel/pid.c
> @@ -604,5 +604,5 @@ void __init pidmap_init(void)
>       atomic_dec(&init_pid_ns.pidmap[0].nr_free);
>  
>       init_pid_ns.pid_cachep = KMEM_CACHE(pid,
> -                     SLAB_HWCACHE_ALIGN | SLAB_PANIC);
> +                     SLAB_HWCACHE_ALIGN | SLAB_PANIC | SLAB_ACCOUNT);
>  }
> diff --git a/mm/nommu.c b/mm/nommu.c
> index 92be862c859b..fbf6f0f1d6c9 100644
> --- a/mm/nommu.c
> +++ b/mm/nommu.c
> @@ -560,7 +560,7 @@ void __init mmap_init(void)
>  
>       ret = percpu_counter_init(&vm_committed_as, 0, GFP_KERNEL);
>       VM_BUG_ON(ret);
> -     vm_region_jar = KMEM_CACHE(vm_region, SLAB_PANIC);
> +     vm_region_jar = KMEM_CACHE(vm_region, SLAB_PANIC|SLAB_ACCOUNT);
>  }
>  
>  /*
> diff --git a/mm/rmap.c b/mm/rmap.c
> index b577fbb98d4b..3c3f1d21f075 100644
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -428,8 +428,10 @@ static void anon_vma_ctor(void *data)
>  void __init anon_vma_init(void)
>  {
>       anon_vma_cachep = kmem_cache_create("anon_vma", sizeof(struct anon_vma),
> -                     0, SLAB_DESTROY_BY_RCU|SLAB_PANIC, anon_vma_ctor);
> -     anon_vma_chain_cachep = KMEM_CACHE(anon_vma_chain, SLAB_PANIC);
> +                     0, SLAB_DESTROY_BY_RCU|SLAB_PANIC|SLAB_ACCOUNT,
> +                     anon_vma_ctor);
> +     anon_vma_chain_cachep = KMEM_CACHE(anon_vma_chain,
> +                     SLAB_PANIC|SLAB_ACCOUNT);
>  }
>  
>  /*
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 3b8b73928398..882933a7de99 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -3107,7 +3107,7 @@ static int shmem_init_inodecache(void)
>  {
>       shmem_inode_cachep = kmem_cache_create("shmem_inode_cache",
>                               sizeof(struct shmem_inode_info),
> -                             0, SLAB_PANIC, shmem_init_inode);
> +                             0, SLAB_PANIC|SLAB_ACCOUNT, shmem_init_inode);
>       return 0;
>  }
>  
> diff --git a/net/socket.c b/net/socket.c
> index 9963a0b53a64..2d70af8d943f 100644
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -293,7 +293,7 @@ static int init_inodecache(void)
>                                             0,
>                                             (SLAB_HWCACHE_ALIGN |
>                                              SLAB_RECLAIM_ACCOUNT |
> -                                            SLAB_MEM_SPREAD),
> +                                            SLAB_MEM_SPREAD | SLAB_ACCOUNT),
>                                             init_once);
>       if (sock_inode_cachep == NULL)
>               return -ENOMEM;
> diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
> index d81186d34558..14f45bf0410c 100644
> --- a/net/sunrpc/rpc_pipe.c
> +++ b/net/sunrpc/rpc_pipe.c
> @@ -1500,7 +1500,7 @@ int register_rpc_pipefs(void)
>       rpc_inode_cachep = kmem_cache_create("rpc_inode_cache",
>                               sizeof(struct rpc_inode),
>                               0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
> -                                             SLAB_MEM_SPREAD),
> +                                             SLAB_MEM_SPREAD|SLAB_ACCOUNT),
>                               init_once);
>       if (!rpc_inode_cachep)
>               return -ENOMEM;
> -- 
> 2.1.4
> 

-- 
Michal Hocko
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to