From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, UNPARSEABLE_RELAY,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 82517C433E0 for ; Thu, 28 May 2020 06:50:38 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id E6972207E8 for ; Thu, 28 May 2020 06:50:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E6972207E8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 4EA9F8001A; Thu, 28 May 2020 02:50:37 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 49CE480010; Thu, 28 May 2020 02:50:37 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3D7488001A; Thu, 28 May 2020 02:50:37 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0146.hostedemail.com [216.40.44.146]) by kanga.kvack.org (Postfix) with ESMTP id 2314680010 for ; Thu, 28 May 2020 02:50:37 -0400 (EDT) Received: from smtpin11.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id DB5E5181AEF10 for ; Thu, 28 May 2020 06:50:36 +0000 (UTC) X-FDA: 76865204472.11.fire97_5c7e5739f592c Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin11.hostedemail.com (Postfix) with ESMTP id B9324180F8B80 for ; Thu, 28 May 2020 06:50:36 +0000 (UTC) X-HE-Tag: fire97_5c7e5739f592c X-Filterd-Recvd-Size: 5491 Received: from out30-44.freemail.mail.aliyun.com (out30-44.freemail.mail.aliyun.com [115.124.30.44]) by imf13.hostedemail.com (Postfix) with ESMTP for ; Thu, 28 May 2020 06:50:35 +0000 (UTC) X-Alimail-AntiSpam:AC=PASS;BC=-1|-1;BR=01201311R181e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e01355;MF=wetp.zy@linux.alibaba.com;NM=1;PH=DS;RN=5;SR=0;TI=SMTPD_---0Tzs7xye_1590648610; Received: from wetpdeMacBook-Pro.local(mailfrom:wetp.zy@linux.alibaba.com fp:SMTPD_---0Tzs7xye_1590648610) by smtp.aliyun-inc.com(127.0.0.1); Thu, 28 May 2020 14:50:25 +0800 Subject: Re: [PATCH] mm, memory_failure: only send BUS_MCEERR_AO to early-kill process To: =?UTF-8?B?SE9SSUdVQ0hJIE5BT1lBKOWggOWPoyDnm7TkuZ8p?= Cc: "n-horiguchi@ah.jp.nec.com" , "akpm@linux-foundation.org" , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" References: <1590476801-19882-1-git-send-email-wetp.zy@linux.alibaba.com> <20200528022241.GA1401@hori.linux.bs1.fc.nec.co.jp> From: wetp Message-ID: <881b990a-2198-8e80-036e-bfa6f88070ff@linux.alibaba.com> Date: Thu, 28 May 2020 14:50:09 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:68.0) Gecko/20100101 Thunderbird/68.8.1 MIME-Version: 1.0 In-Reply-To: <20200528022241.GA1401@hori.linux.bs1.fc.nec.co.jp> Content-Type: text/plain; charset=UTF-8; format=flowed X-Rspamd-Queue-Id: B9324180F8B80 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam05 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On 2020/5/28 =E4=B8=8A=E5=8D=8810:22, HORIGUCHI NAOYA(=E5=A0=80=E5=8F=A3 = =E7=9B=B4=E4=B9=9F) wrote: > Hi Zhang, > > Sorry for my late response. > > On Tue, May 26, 2020 at 03:06:41PM +0800, Wetp Zhang wrote: >> From: Zhang Yi >> >> If a process don't need early-kill, it may not care the BUS_MCEERR_AO. >> Let the process to be killed when it really access the corrupted memor= y. >> >> Signed-off-by: Zhang Yi > Thank you for pointing this. This looks to me a bug (per-process flag > is ignored when system-wide flag is set). The flag is not problem for me. In my case, two processes share memory with no any flag setting, both=20 will be killed when only one access the fail memory. >> --- >> mm/memory-failure.c | 7 ++++--- >> 1 file changed, 4 insertions(+), 3 deletions(-) >> >> diff --git a/mm/memory-failure.c b/mm/memory-failure.c >> index a96364be8ab4..2db13d48865c 100644 >> --- a/mm/memory-failure.c >> +++ b/mm/memory-failure.c >> @@ -210,7 +210,7 @@ static int kill_proc(struct to_kill *tk, unsigned = long pfn, int flags) >> { >> struct task_struct *t =3D tk->tsk; >> short addr_lsb =3D tk->size_shift; >> - int ret; >> + int ret =3D 0; >> >> pr_err("Memory failure: %#lx: Sending SIGBUS to %s:%d due to hardwa= re memory corruption\n", >> pfn, t->comm, t->pid); >> @@ -225,8 +225,9 @@ static int kill_proc(struct to_kill *tk, unsigned = long pfn, int flags) >> * This could cause a loop when the user sets SIGBUS >> * to SIG_IGN, but hopefully no one will do that? >> */ >> - ret =3D send_sig_mceerr(BUS_MCEERR_AO, (void __user *)tk->addr, >> - addr_lsb, t); /* synchronous? */ >> + if ((t->flags & PF_MCE_PROCESS) && (t->flags & PF_MCE_EARLY)) >> + ret =3D send_sig_mceerr(BUS_MCEERR_AO, >> + (void __user *)tk->addr, addr_lsb, t); > kill_proc() could be called only for processes that are selected by > collect_procs() with task_early_kill(). So I think that we should fix > task_early_kill(), maybe by reordering sysctl_memory_failure_early_kill > check and find_early_kill_thread() check. > > static struct task_struct *task_early_kill(struct task_struct *tsk= , > int force_early) > { > struct task_struct *t; > if (!tsk->mm) > return NULL; > if (force_early) > return tsk; The force_early is rely the flag MF_ACTION_REQUIRED, so it is always=20 true when MCE occurs. This leads always sending SIGBUS to processes even if those are not=20 current or no flag setting. =C2=A0I think it could keep the non-current processes which has no flag=20 setting running. Besides, base on your recommendation I reorder the force_early check and=20 find_early_kill_thread() check, to send the signal to the right thread. diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 2db13d48865c..33a87d7b3e61 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -399,11 +402,11 @@ static struct task_struct *task_early_kill(struct t= ask_struct *tsk, struct task_struct *t; if (!tsk->mm) return NULL; - if (force_early) - return tsk; t =3D find_early_kill_thread(tsk); if (t) return t; + if (force_early && tsk->mm =3D=3D current->mm) + return tsk; if (sysctl_memory_failure_early_kill) return tsk; return NULL; > t =3D find_early_kill_thread(tsk); > if (t) > return t; > if (sysctl_memory_failure_early_kill) > return tsk; > return NULL; > } > > One subtleness is to make sure that find_early_kill_thread() should dis= tinguish > default value and explicitly set value, so we might need some modificat= ion > on find_early_kill_thread(). > > Can you try that? > > Thanks, > Naoya Horiguchi