Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp3664856ima; Mon, 4 Feb 2019 03:05:15 -0800 (PST) X-Google-Smtp-Source: ALg8bN4SAbjj/R+NQRmk/ML7jx1OjZqGad4L0grQ8CGDg8fTOsWJnnHEvo0NYvOKC4a/2xdhhvoU X-Received: by 2002:a17:902:2aaa:: with SMTP id j39mr52382807plb.335.1549278315514; Mon, 04 Feb 2019 03:05:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549278315; cv=none; d=google.com; s=arc-20160816; b=0Hz+luEIc/be/CCd9M1x43X05sXOQzrfiRwQyVmRoP2kuv5AgvNrBnnIJ5ml4+ENmt ICCGp/mxDfs7y+mgRlk2JelPOjJH4hMWaoliZ54cVXbQQ7/s5e1K+rJEiKQhao99vdxb PtQl2+cxi8ZchD2LTQBa8hQycPSf31oM3UhP89vfJgn8UDk/JariTPxW+9hx/V1VptA3 hceLxSX8RmJX6/iuOh7SC6pITPEGD/tR0EUGb9StKPqykfLmVGL2Hklhl2Joo0n594q7 OSzdesfReqbpyxbM8aKGUIOy/HRQ29uXiTNAMjLUGfmWSaVknLKS5Sl73zYZ4laMvzXt 2yeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=jdukbD0ujrqkiYNd0yV/c3Gl9zqPftIi0V0TFNyrrWw=; b=c9Nwv6kNe5h2ZAu6LBMFTSuORfArREZ7s65oOitjgRYCg4jSNITa5np8TkrTcrb3Vh r1W9rNfzITUz/tezZumsQSQedweAdI6w+usnioGhrtOY8cxZXCDFpVI7U8GAHysbC0OY ddK7lwTiPB1cx1WUwTHNNM4MNu3hcRgG35nP8mN8XNySQF09jfvAa2mPcOLsipANsg7C 5oA2suu8RKEMqWVlNx+Lq3NygIs5bMF2F79IFUD2p2/FoZPlilLFAfnoguq3gLocafLz 3NmOlfPrY0ju5MkGls+ufNElr6ArJw+gP6kIz8pXqKkLft5piH7UoCqxsTFmz1FIby6W ljqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=V1o+uc8M; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h17si7698844pgh.495.2019.02.04.03.04.59; Mon, 04 Feb 2019 03:05:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=V1o+uc8M; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730287AbfBDLEG (ORCPT + 99 others); Mon, 4 Feb 2019 06:04:06 -0500 Received: from mail.kernel.org ([198.145.29.99]:43982 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731279AbfBDKpw (ORCPT ); Mon, 4 Feb 2019 05:45:52 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9CBD52176F; Mon, 4 Feb 2019 10:45:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1549277151; bh=GUqNiy8R2bnugbbDCi8AyUsafx2rBzRFPn2Ztq4vDAY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V1o+uc8MSgbltsLX0m48cjZexgtwRHmfU5l11KIwTiJxOFFpU4KnXH0rF1iVt9whl KFVZl6W5tmwPDCfTiJtQzNHB54/+ntCdazRUi9j3r9gmzYT6gkan6p6I/pk6hbZkaO As0IsvfsvcA4W/PxDrxs2DsrrWNI51KYO3QboWeI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Tetsuo Handa , Arkadiusz Miskiewicz , Michal Hocko , Roman Gushchin , Tejun Heo , Aleksa Sarai , Jay Kamat , Johannes Weiner , Andrew Morton , Linus Torvalds Subject: [PATCH 4.14 39/46] oom, oom_reaper: do not enqueue same task twice Date: Mon, 4 Feb 2019 11:37:10 +0100 Message-Id: <20190204103615.477541293@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190204103608.651205056@linuxfoundation.org> References: <20190204103608.651205056@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Tetsuo Handa commit 9bcdeb51bd7d2ae9fe65ea4d60643d2aeef5bfe3 upstream. Arkadiusz reported that enabling memcg's group oom killing causes strange memcg statistics where there is no task in a memcg despite the number of tasks in that memcg is not 0. It turned out that there is a bug in wake_oom_reaper() which allows enqueuing same task twice which makes impossible to decrease the number of tasks in that memcg due to a refcount leak. This bug existed since the OOM reaper became invokable from task_will_free_mem(current) path in out_of_memory() in Linux 4.7, T1@P1 |T2@P1 |T3@P1 |OOM reaper ----------+----------+----------+------------ # Processing an OOM victim in a different memcg domain. try_charge() mem_cgroup_out_of_memory() mutex_lock(&oom_lock) try_charge() mem_cgroup_out_of_memory() mutex_lock(&oom_lock) try_charge() mem_cgroup_out_of_memory() mutex_lock(&oom_lock) out_of_memory() oom_kill_process(P1) do_send_sig_info(SIGKILL, @P1) mark_oom_victim(T1@P1) wake_oom_reaper(T1@P1) # T1@P1 is enqueued. mutex_unlock(&oom_lock) out_of_memory() mark_oom_victim(T2@P1) wake_oom_reaper(T2@P1) # T2@P1 is enqueued. mutex_unlock(&oom_lock) out_of_memory() mark_oom_victim(T1@P1) wake_oom_reaper(T1@P1) # T1@P1 is enqueued again due to oom_reaper_list == T2@P1 && T1@P1->oom_reaper_list == NULL. mutex_unlock(&oom_lock) # Completed processing an OOM victim in a different memcg domain. spin_lock(&oom_reaper_lock) # T1P1 is dequeued. spin_unlock(&oom_reaper_lock) but memcg's group oom killing made it easier to trigger this bug by calling wake_oom_reaper() on the same task from one out_of_memory() request. Fix this bug using an approach used by commit 855b018325737f76 ("oom, oom_reaper: disable oom_reaper for oom_kill_allocating_task"). As a side effect of this patch, this patch also avoids enqueuing multiple threads sharing memory via task_will_free_mem(current) path. Link: http://lkml.kernel.org/r/e865a044-2c10-9858-f4ef-254bc71d6cc2@i-love.sakura.ne.jp Link: http://lkml.kernel.org/r/5ee34fc6-1485-34f8-8790-903ddabaa809@i-love.sakura.ne.jp Fixes: af8e15cc85a25315 ("oom, oom_reaper: do not enqueue task if it is on the oom_reaper_list head") Signed-off-by: Tetsuo Handa Reported-by: Arkadiusz Miskiewicz Tested-by: Arkadiusz Miskiewicz Acked-by: Michal Hocko Acked-by: Roman Gushchin Cc: Tejun Heo Cc: Aleksa Sarai Cc: Jay Kamat Cc: Johannes Weiner Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- include/linux/sched/coredump.h | 1 + mm/oom_kill.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) --- a/include/linux/sched/coredump.h +++ b/include/linux/sched/coredump.h @@ -71,6 +71,7 @@ static inline int get_dumpable(struct mm #define MMF_HUGE_ZERO_PAGE 23 /* mm has ever used the global huge zero page */ #define MMF_DISABLE_THP 24 /* disable THP for all VMAs */ #define MMF_OOM_VICTIM 25 /* mm is the oom victim */ +#define MMF_OOM_REAP_QUEUED 26 /* mm was queued for oom_reaper */ #define MMF_DISABLE_THP_MASK (1 << MMF_DISABLE_THP) #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\ --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -628,8 +628,8 @@ static void wake_oom_reaper(struct task_ if (!oom_reaper_th) return; - /* tsk is already queued? */ - if (tsk == oom_reaper_list || tsk->oom_reaper_list) + /* mm is already queued? */ + if (test_and_set_bit(MMF_OOM_REAP_QUEUED, &tsk->signal->oom_mm->flags)) return; get_task_struct(tsk);