Skip to content

Commit a4f6be2

Browse files
committed
mm-memcontrol-per-lruvec-stats-infrastructure-fix
Fix the following crash in the new cgroup stat keeping code: Freeing unused kernel memory: 856K Write protecting the kernel read-only data: 8192k Freeing unused kernel memory: 1104K Freeing unused kernel memory: 588K page:ffffea000005d8c0 count:2 mapcount:1 mapping: (null) index:0x0 flags: 0x800000000000801(locked|reserved) raw: 0800000000000801 0000000000000000 0000000000000000 0000000200000000 raw: ffffea000005d8e0 ffffea000005d8e0 0000000000000000 0000000000000000 page dumped because: not cgrouped, will crash BUG: unable to handle kernel NULL pointer dereference at 00000000000004d8 IP: page_add_file_rmap+0x56/0xf0 PGD 0 P4D 0 Oops: 0000 [#1] SMP CPU: 0 PID: 1 Comm: init Not tainted 4.12.0-rc2-00065-g390160f076be-dirty torvalds#326 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-20170228_101828-anatol 04/01/2014 task: ffff88007d380000 task.stack: ffffc9000031c000 RIP: 0010:page_add_file_rmap+0x56/0xf0 RSP: 0000:ffffc9000031fd88 EFLAGS: 00010202 RAX: 0000000000000000 RBX: ffffea000005d8c0 RCX: 0000000000000006 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88007ffde000 RBP: ffffc9000031fd98 R08: 0000000000000003 R09: 0000000000000000 R10: ffffc9000031fd18 R11: 0000000000000000 R12: ffff88007ffdfab8 R13: ffffea000005d8c0 R14: ffff88007c76d508 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffff88007fc00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000000004d8 CR3: 000000007c76c000 CR4: 00000000000006b0 Call Trace: alloc_set_pte+0xb5/0x2f0 finish_fault+0x2b/0x50 __handle_mm_fault+0x3e5/0xb90 handle_mm_fault+0x284/0x340 __do_page_fault+0x1fb/0x410 do_page_fault+0xc/0x10 page_fault+0x22/0x30 This is a special page being faulted, and these will never be charged to a cgroup. Assume the root cgroup for uncharged pages to fix this. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Johannes Weiner <[email protected]> Cc: Josef Bacik <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Vladimir Davydov <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Tony Lindgren <[email protected]> Cc: Russell King <[email protected]> Cc: Yury Norov <[email protected]> Cc: Stephen Rothwell <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 96f2105 commit a4f6be2

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

include/linux/memcontrol.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -596,18 +596,26 @@ static inline void mod_lruvec_state(struct lruvec *lruvec,
596596
static inline void __mod_lruvec_page_state(struct page *page,
597597
enum node_stat_item idx, int val)
598598
{
599+
struct mem_cgroup *memcg;
599600
struct lruvec *lruvec;
600601

601-
lruvec = mem_cgroup_lruvec(page_pgdat(page), page->mem_cgroup);
602+
/* Special pages in the VM aren't charged, use root */
603+
memcg = page->mem_cgroup ? : root_mem_cgroup;
604+
605+
lruvec = mem_cgroup_lruvec(page_pgdat(page), memcg);
602606
__mod_lruvec_state(lruvec, idx, val);
603607
}
604608

605609
static inline void mod_lruvec_page_state(struct page *page,
606610
enum node_stat_item idx, int val)
607611
{
612+
struct mem_cgroup *memcg;
608613
struct lruvec *lruvec;
609614

610-
lruvec = mem_cgroup_lruvec(page_pgdat(page), page->mem_cgroup);
615+
/* Special pages in the VM aren't charged, use root */
616+
memcg = page->mem_cgroup ? : root_mem_cgroup;
617+
618+
lruvec = mem_cgroup_lruvec(page_pgdat(page), memcg);
611619
mod_lruvec_state(lruvec, idx, val);
612620
}
613621

0 commit comments

Comments
 (0)