Skip to content
  • Andrey Vagin's avatar
    memcg: check that kmem_cache has memcg_params before accessing it · a0d9a083
    Andrey Vagin authored
    
    
    commit 6f6b8951897e487ea6f77b90ea01f70a9c363770 upstream.
    
    If the system had a few memory groups and all of them were destroyed,
    memcg_limited_groups_array_size has non-zero value, but all new caches
    are created without memcg_params, because memcg_kmem_enabled() returns
    false.
    
    We try to enumirate child caches in a few places and all of them are
    potentially dangerous.
    
    For example my kernel is compiled with CONFIG_SLAB and it crashed when I
    tryed to mount a NFS share after a few experiments with kmemcg.
    
      BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
      IP: [<ffffffff8118166a>] do_tune_cpucache+0x8a/0xd0
      PGD b942a067 PUD b999f067 PMD 0
      Oops: 0000 [#1] SMP
      Modules linked in: fscache(+) ip6table_filter ip6_tables iptable_filter ip_tables i2c_piix4 pcspkr virtio_net virtio_balloon i2c_core floppy
      CPU: 0 PID: 357 Comm: modprobe Not tainted 3.11.0-rc7+ #59
      Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
      task: ffff8800b9f98240 ti: ffff8800ba32e000 task.ti: ffff8800ba32e000
      RIP: 0010:[<ffffffff8118166a>]  [<ffffffff8118166a>] do_tune_cpucache+0x8a/0xd0
      RSP: 0018:ffff8800ba32fb70  EFLAGS: 00010246
      RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000006
      RDX: 0000000000000000 RSI: ffff8800b9f98910 RDI: 0000000000000246
      RBP: ffff8800ba32fba0 R08: 0000000000000002 R09: 0000000000000004
      R10: 0000000000000001 R11: 0000000000000001 R12: 0000000000000010
      R13: 0000000000000008 R14: 00000000000000d0 R15: ffff8800375d0200
      FS:  00007f55f1378740(0000) GS:ffff8800bfa00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
      CR2: 00007f24feba57a0 CR3: 0000000037b51000 CR4: 00000000000006f0
      Call Trace:
        enable_cpucache+0x49/0x100
        setup_cpu_cache+0x215/0x280
        __kmem_cache_create+0x2fa/0x450
        kmem_cache_create_memcg+0x214/0x350
        kmem_cache_create+0x2b/0x30
        fscache_init+0x19b/0x230 [fscache]
        do_one_initcall+0xfa/0x1b0
        load_module+0x1c41/0x26d0
        SyS_finit_module+0x86/0xb0
        system_call_fastpath+0x16/0x1b
    
    Signed-off-by: default avatarAndrey Vagin <avagin@openvz.org>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Glauber Costa <glommer@openvz.org>
    Cc: Joonsoo Kim <js1304@gmail.com>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    a0d9a083