Revision 6f6acb00514c10be35529402f36ad7a288f08c2e authored by Michal Hocko on 22 May 2014, 18:54:19 UTC, committed by Linus Torvalds on 23 May 2014, 16:37:29 UTC
Commit 284f39afeaa4 ("mm: memcg: push !mm handling out to page cache charge function") explicitly checks for page cache charges without any mm context (from kernel thread context[1]). This seemed to be the only possible case where memory could be charged without mm context so commit 03583f1a631c ("memcg: remove unnecessary !mm check from try_get_mem_cgroup_from_mm()") removed the mm check from get_mem_cgroup_from_mm(). This however caused another NULL ptr dereference during early boot when loopback kernel thread splices to tmpfs as reported by Stephan Kulow: BUG: unable to handle kernel NULL pointer dereference at 0000000000000360 IP: get_mem_cgroup_from_mm.isra.42+0x2b/0x60 Oops: 0000 [#1] SMP Modules linked in: btrfs dm_multipath dm_mod scsi_dh multipath raid10 raid456 async_raid6_recov async_memcpy async_pq raid6_pq async_xor xor async_tx raid1 raid0 md_mod parport_pc parport nls_utf8 isofs usb_storage iscsi_ibft iscsi_boot_sysfs arc4 ecb fan thermal nfs lockd fscache nls_iso8859_1 nls_cp437 sg st hid_generic usbhid af_packet sunrpc sr_mod cdrom ata_generic uhci_hcd virtio_net virtio_blk ehci_hcd usbcore ata_piix floppy processor button usb_common virtio_pci virtio_ring virtio edd squashfs loop ppa] CPU: 0 PID: 97 Comm: loop1 Not tainted 3.15.0-rc5-5-default #1 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 Call Trace: __mem_cgroup_try_charge_swapin+0x40/0xe0 mem_cgroup_charge_file+0x8b/0xd0 shmem_getpage_gfp+0x66b/0x7b0 shmem_file_splice_read+0x18f/0x430 splice_direct_to_actor+0xa2/0x1c0 do_lo_receive+0x5a/0x60 [loop] loop_thread+0x298/0x720 [loop] kthread+0xc6/0xe0 ret_from_fork+0x7c/0xb0 Also Branimir Maksimovic reported the following oops which is tiggered for the swapcache charge path from the accounting code for kernel threads: CPU: 1 PID: 160 Comm: kworker/u8:5 Tainted: P OE 3.15.0-rc5-core2-custom #159 Hardware name: System manufacturer System Product Name/MAXIMUSV GENE, BIOS 1903 08/19/2013 task: ffff880404e349b0 ti: ffff88040486a000 task.ti: ffff88040486a000 RIP: get_mem_cgroup_from_mm.isra.42+0x2b/0x60 Call Trace: __mem_cgroup_try_charge_swapin+0x45/0xf0 mem_cgroup_charge_file+0x9c/0xe0 shmem_getpage_gfp+0x62c/0x770 shmem_write_begin+0x38/0x40 generic_perform_write+0xc5/0x1c0 __generic_file_aio_write+0x1d1/0x3f0 generic_file_aio_write+0x4f/0xc0 do_sync_write+0x5a/0x90 do_acct_process+0x4b1/0x550 acct_process+0x6d/0xa0 do_exit+0x827/0xa70 kthread+0xc3/0xf0 This patch fixes the issue by reintroducing mm check into get_mem_cgroup_from_mm. We could do the same trick in __mem_cgroup_try_charge_swapin as we do for the regular page cache path but it is not worth troubles. The check is not that expensive and it is better to have get_mem_cgroup_from_mm more robust. [1] - http://marc.info/?l=linux-mm&m=139463617808941&w=2 Fixes: 03583f1a631c ("memcg: remove unnecessary !mm check from try_get_mem_cgroup_from_mm()") Reported-and-tested-by: Stephan Kulow <coolo@suse.com> Reported-by: Branimir Maksimovic <branimir.maksimovic@gmail.com> Signed-off-by: Michal Hocko <mhocko@suse.cz> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Hugh Dickins <hughd@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 55231e5
File | Mode | Size |
---|---|---|
debug | ||
events | ||
gcov | ||
irq | ||
locking | ||
power | ||
printk | ||
rcu | ||
sched | ||
time | ||
trace | ||
.gitignore | -rw-r--r-- | 91 bytes |
Kconfig.freezer | -rw-r--r-- | 52 bytes |
Kconfig.hz | -rw-r--r-- | 1.6 KB |
Kconfig.locks | -rw-r--r-- | 4.3 KB |
Kconfig.preempt | -rw-r--r-- | 2.1 KB |
Makefile | -rw-r--r-- | 7.7 KB |
acct.c | -rw-r--r-- | 16.8 KB |
async.c | -rw-r--r-- | 9.9 KB |
audit.c | -rw-r--r-- | 51.1 KB |
audit.h | -rw-r--r-- | 10.3 KB |
audit_tree.c | -rw-r--r-- | 22.0 KB |
audit_watch.c | -rw-r--r-- | 13.6 KB |
auditfilter.c | -rw-r--r-- | 33.6 KB |
auditsc.c | -rw-r--r-- | 65.9 KB |
backtracetest.c | -rw-r--r-- | 2.1 KB |
bounds.c | -rw-r--r-- | 773 bytes |
capability.c | -rw-r--r-- | 11.9 KB |
cgroup.c | -rw-r--r-- | 130.4 KB |
cgroup_freezer.c | -rw-r--r-- | 12.5 KB |
compat.c | -rw-r--r-- | 28.7 KB |
configs.c | -rw-r--r-- | 2.8 KB |
context_tracking.c | -rw-r--r-- | 6.8 KB |
cpu.c | -rw-r--r-- | 18.2 KB |
cpu_pm.c | -rw-r--r-- | 6.5 KB |
cpuset.c | -rw-r--r-- | 74.5 KB |
crash_dump.c | -rw-r--r-- | 1.2 KB |
cred.c | -rw-r--r-- | 21.2 KB |
delayacct.c | -rw-r--r-- | 5.0 KB |
dma.c | -rw-r--r-- | 3.6 KB |
elfcore.c | -rw-r--r-- | 396 bytes |
exec_domain.c | -rw-r--r-- | 4.3 KB |
exit.c | -rw-r--r-- | 42.6 KB |
extable.c | -rw-r--r-- | 3.9 KB |
fork.c | -rw-r--r-- | 46.1 KB |
freezer.c | -rw-r--r-- | 4.6 KB |
futex.c | -rw-r--r-- | 77.5 KB |
futex_compat.c | -rw-r--r-- | 4.5 KB |
groups.c | -rw-r--r-- | 5.8 KB |
hrtimer.c | -rw-r--r-- | 48.2 KB |
hung_task.c | -rw-r--r-- | 5.7 KB |
irq_work.c | -rw-r--r-- | 4.5 KB |
itimer.c | -rw-r--r-- | 7.3 KB |
jump_label.c | -rw-r--r-- | 11.0 KB |
kallsyms.c | -rw-r--r-- | 15.0 KB |
kcmp.c | -rw-r--r-- | 4.3 KB |
kexec.c | -rw-r--r-- | 42.5 KB |
kmod.c | -rw-r--r-- | 19.4 KB |
kprobes.c | -rw-r--r-- | 58.8 KB |
ksysfs.c | -rw-r--r-- | 5.6 KB |
kthread.c | -rw-r--r-- | 18.6 KB |
latencytop.c | -rw-r--r-- | 7.6 KB |
module-internal.h | -rw-r--r-- | 458 bytes |
module.c | -rw-r--r-- | 96.4 KB |
module_signing.c | -rw-r--r-- | 5.9 KB |
notifier.c | -rw-r--r-- | 16.0 KB |
nsproxy.c | -rw-r--r-- | 6.3 KB |
padata.c | -rw-r--r-- | 26.9 KB |
panic.c | -rw-r--r-- | 11.3 KB |
params.c | -rw-r--r-- | 21.8 KB |
pid.c | -rw-r--r-- | 14.9 KB |
pid_namespace.c | -rw-r--r-- | 9.0 KB |
posix-cpu-timers.c | -rw-r--r-- | 38.2 KB |
posix-timers.c | -rw-r--r-- | 30.2 KB |
profile.c | -rw-r--r-- | 16.2 KB |
ptrace.c | -rw-r--r-- | 29.9 KB |
range.c | -rw-r--r-- | 3.0 KB |
reboot.c | -rw-r--r-- | 9.6 KB |
relay.c | -rw-r--r-- | 32.6 KB |
res_counter.c | -rw-r--r-- | 4.4 KB |
resource.c | -rw-r--r-- | 31.7 KB |
seccomp.c | -rw-r--r-- | 13.4 KB |
signal.c | -rw-r--r-- | 94.9 KB |
smp.c | -rw-r--r-- | 16.9 KB |
smpboot.c | -rw-r--r-- | 6.9 KB |
smpboot.h | -rw-r--r-- | 564 bytes |
softirq.c | -rw-r--r-- | 18.9 KB |
stacktrace.c | -rw-r--r-- | 1.1 KB |
stop_machine.c | -rw-r--r-- | 17.1 KB |
sys.c | -rw-r--r-- | 50.5 KB |
sys_ni.c | -rw-r--r-- | 6.0 KB |
sysctl.c | -rw-r--r-- | 61.2 KB |
sysctl_binary.c | -rw-r--r-- | 51.0 KB |
system_certificates.S | -rw-r--r-- | 470 bytes |
system_keyring.c | -rw-r--r-- | 2.7 KB |
task_work.c | -rw-r--r-- | 3.4 KB |
taskstats.c | -rw-r--r-- | 16.2 KB |
test_kprobes.c | -rw-r--r-- | 8.5 KB |
time.c | -rw-r--r-- | 18.8 KB |
timeconst.bc | -rw-r--r-- | 2.7 KB |
timer.c | -rw-r--r-- | 47.2 KB |
torture.c | -rw-r--r-- | 19.2 KB |
tracepoint.c | -rw-r--r-- | 13.4 KB |
tsacct.c | -rw-r--r-- | 5.0 KB |
uid16.c | -rw-r--r-- | 5.0 KB |
up.c | -rw-r--r-- | 1.7 KB |
user-return-notifier.c | -rw-r--r-- | 1.3 KB |
user.c | -rw-r--r-- | 5.3 KB |
user_namespace.c | -rw-r--r-- | 22.9 KB |
utsname.c | -rw-r--r-- | 2.9 KB |
utsname_sysctl.c | -rw-r--r-- | 3.0 KB |
watchdog.c | -rw-r--r-- | 15.8 KB |
workqueue.c | -rw-r--r-- | 141.9 KB |
workqueue_internal.h | -rw-r--r-- | 2.1 KB |
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...