Re: [PATCH 2/2] memcg: do not report racy no-eligible OOM tasks

kbuild test robot
2019-01-08T08:36:29Z

[-- Attachment #1: Type: text/plain, Size: 8106 bytes --]

Hi Michal,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.0-rc1 next-20190108]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Michal-Hocko/oom-memcg-do-not-report-racy-no-eligible-OOM/20190108-092805
config: x86_64-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64

All warnings (new ones prefixed by >>):

include/linux/rcupdate.h:659:9: warning: context imbalance in 'find_lock_task_mm' - wrong count at exit
include/linux/sched/mm.h:141:37: warning: dereference of noderef expression
mm/oom_kill.c:225:28: warning: context imbalance in 'oom_badness' - unexpected unlock
mm/oom_kill.c:406:9: warning: context imbalance in 'dump_tasks' - different lock contexts for basic block
>> mm/oom_kill.c:918:17: warning: context imbalance in '__oom_kill_process' - unexpected unlock

vim +/__oom_kill_process +918 mm/oom_kill.c

1af8bb43 Michal Hocko 2016-07-28 845
5989ad7b Roman Gushchin 2018-08-21 846 static void __oom_kill_process(struct task_struct *victim)
^1da177e Linus Torvalds 2005-04-16 847 {
5989ad7b Roman Gushchin 2018-08-21 848 struct task_struct *p;
647f2bdf David Rientjes 2012-03-21 849 struct mm_struct *mm;
bb29902a Tetsuo Handa 2016-03-25 850 bool can_oom_reap = true;
^1da177e Linus Torvalds 2005-04-16 851
6b0c81b3 David Rientjes 2012-07-31 852 p = find_lock_task_mm(victim);
6b0c81b3 David Rientjes 2012-07-31 853 if (!p) {
6b0c81b3 David Rientjes 2012-07-31 854 put_task_struct(victim);
647f2bdf David Rientjes 2012-03-21 855 return;
6b0c81b3 David Rientjes 2012-07-31 856 } else if (victim != p) {
6b0c81b3 David Rientjes 2012-07-31 857 get_task_struct(p);
6b0c81b3 David Rientjes 2012-07-31 858 put_task_struct(victim);
6b0c81b3 David Rientjes 2012-07-31 859 victim = p;
6b0c81b3 David Rientjes 2012-07-31 860 }
647f2bdf David Rientjes 2012-03-21 861
880b7689 Tetsuo Handa 2015-11-05 862 /* Get a reference to safely compare mm after task_unlock(victim) */
647f2bdf David Rientjes 2012-03-21 863 mm = victim->mm;
f1f10076 Vegard Nossum 2017-02-27 864 mmgrab(mm);
8e675f7a Konstantin Khlebnikov 2017-07-06 865
8e675f7a Konstantin Khlebnikov 2017-07-06 866 /* Raise event before sending signal: task reaper must see this */
8e675f7a Konstantin Khlebnikov 2017-07-06 867 count_vm_event(OOM_KILL);
fe6bdfc8 Roman Gushchin 2018-06-14 868 memcg_memory_event_mm(mm, MEMCG_OOM_KILL);
8e675f7a Konstantin Khlebnikov 2017-07-06 869
426fb5e7 Tetsuo Handa 2015-11-05 870 /*
cd04ae1e Michal Hocko 2017-09-06 871 * We should send SIGKILL before granting access to memory reserves
cd04ae1e Michal Hocko 2017-09-06 872 * in order to prevent the OOM victim from depleting the memory
cd04ae1e Michal Hocko 2017-09-06 873 * reserves from the user space under its control.
426fb5e7 Tetsuo Handa 2015-11-05 874 */
079b22dc Eric W. Biederman 2018-09-03 875 do_send_sig_info(SIGKILL, SEND_SIG_PRIV, victim, PIDTYPE_TGID);
16e95196 Johannes Weiner 2015-06-24 876 mark_oom_victim(victim);
eca56ff9 Jerome Marchand 2016-01-14 877 pr_err("Killed process %d (%s) total-vm:%lukB, anon-rss:%lukB, file-rss:%lukB, shmem-rss:%lukB\n",
647f2bdf David Rientjes 2012-03-21 878 task_pid_nr(victim), victim->comm, K(victim->mm->total_vm),
647f2bdf David Rientjes 2012-03-21 879 K(get_mm_counter(victim->mm, MM_ANONPAGES)),
eca56ff9 Jerome Marchand 2016-01-14 880 K(get_mm_counter(victim->mm, MM_FILEPAGES)),
eca56ff9 Jerome Marchand 2016-01-14 881 K(get_mm_counter(victim->mm, MM_SHMEMPAGES)));
647f2bdf David Rientjes 2012-03-21 882 task_unlock(victim);
647f2bdf David Rientjes 2012-03-21 883
647f2bdf David Rientjes 2012-03-21 884 /*
647f2bdf David Rientjes 2012-03-21 885 * Kill all user processes sharing victim->mm in other thread groups, if
647f2bdf David Rientjes 2012-03-21 886 * any. They don't get access to memory reserves, though, to avoid
647f2bdf David Rientjes 2012-03-21 887 * depletion of all memory. This prevents mm->mmap_sem livelock when an
647f2bdf David Rientjes 2012-03-21 888 * oom killed thread cannot exit because it requires the semaphore and
647f2bdf David Rientjes 2012-03-21 889 * its contended by another thread trying to allocate memory itself.
647f2bdf David Rientjes 2012-03-21 890 * That thread will now get access to memory reserves since it has a
647f2bdf David Rientjes 2012-03-21 891 * pending fatal signal.
647f2bdf David Rientjes 2012-03-21 892 */
4d4048be Oleg Nesterov 2014-01-21 893 rcu_read_lock();
c319025a Oleg Nesterov 2015-11-05 894 for_each_process(p) {
00508538 Michal Hocko 2019-01-07 895 struct task_struct *t;
4d7b3394 Oleg Nesterov 2015-11-05 896 if (!process_shares_mm(p, mm))
c319025a Oleg Nesterov 2015-11-05 897 continue;
c319025a Oleg Nesterov 2015-11-05 898 if (same_thread_group(p, victim))
c319025a Oleg Nesterov 2015-11-05 899 continue;
1b51e65e Michal Hocko 2016-10-07 900 if (is_global_init(p)) {
aac45363 Michal Hocko 2016-03-25 901 can_oom_reap = false;
862e3073 Michal Hocko 2016-10-07 902 set_bit(MMF_OOM_SKIP, &mm->flags);
a373966d Michal Hocko 2016-07-28 903 pr_info("oom killer %d (%s) has mm pinned by %d (%s)\n",
a373966d Michal Hocko 2016-07-28 904 task_pid_nr(victim), victim->comm,
a373966d Michal Hocko 2016-07-28 905 task_pid_nr(p), p->comm);
647f2bdf David Rientjes 2012-03-21 906 continue;
aac45363 Michal Hocko 2016-03-25 907 }
1b51e65e Michal Hocko 2016-10-07 908 /*
1b51e65e Michal Hocko 2016-10-07 909 * No use_mm() user needs to read from the userspace so we are
1b51e65e Michal Hocko 2016-10-07 910 * ok to reap it.
1b51e65e Michal Hocko 2016-10-07 911 */
1b51e65e Michal Hocko 2016-10-07 912 if (unlikely(p->flags & PF_KTHREAD))
1b51e65e Michal Hocko 2016-10-07 913 continue;
079b22dc Eric W. Biederman 2018-09-03 914 do_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_TGID);
00508538 Michal Hocko 2019-01-07 915 t = find_lock_task_mm(p);
00508538 Michal Hocko 2019-01-07 916 if (!t)
00508538 Michal Hocko 2019-01-07 917 continue;
00508538 Michal Hocko 2019-01-07 @918 mark_oom_victim(t);
00508538 Michal Hocko 2019-01-07 919 task_unlock(t);
647f2bdf David Rientjes 2012-03-21 920 }
6b0c81b3 David Rientjes 2012-07-31 921 rcu_read_unlock();
647f2bdf David Rientjes 2012-03-21 922
aac45363 Michal Hocko 2016-03-25 923 if (can_oom_reap)
36324a99 Michal Hocko 2016-03-25 924 wake_oom_reaper(victim);
aac45363 Michal Hocko 2016-03-25 925
880b7689 Tetsuo Handa 2015-11-05 926 mmdrop(mm);
6b0c81b3 David Rientjes 2012-07-31 927 put_task_struct(victim);
^1da177e Linus Torvalds 2005-04-16 928 }
647f2bdf David Rientjes 2012-03-21 929 #undef K
^1da177e Linus Torvalds 2005-04-16 930

:::::: The code at line 918 was first introduced by commit
:::::: 00508538cb045f28a2f60e5d2dff98b77b0da725 mm, oom: marks all killed tasks as oom victims

:::::: TO: Michal Hocko <mhocko@suse.com>
:::::: CC: 0day robot <lkp@intel.com>

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 67238 bytes --]