From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mta1.migadu.com (out-215.mta1.migadu.com [95.215.58.215]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E5E7938C426 for ; Wed, 19 Aug 2026 03:08:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.215 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787108907; cv=none; b=CWVNYM5zjANc5qLikttN1JR37GuZqg9ylC+wPCxkSmp+qAE8QjpnH9DwJZgTGlLYrqQUfMt+9wmtCHKmNYLRShDr7kv4UoL/bNcJ+1MJUt1qU9+OOwtyhFwSlIPiUer0LfEKifKvlA05aG+70umAoXhL+6GFIj4CrhedVI5CbIo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787108907; c=relaxed/simple; bh=R9RPGX4W2sdBcGuw43AbX2HspDw/jr2m/4vM7rUIR8A=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=ekBEh1DDK60BtZaZVXf1jmxHrXMZ1iV33wdOMqmEOJo6mgcFCaUNRAPd1Yr1SMDgilfOr764FGeMNwr1DYU4SJ06nAKZ0m/iesTtuTG4c0jZrzXCPaah7ETCQnjIokkA/8hhO4ofEKc9tAEXlFEavfdx5SoCyDx6PTpkCwRRfYc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=fFQ4ly0E; arc=none smtp.client-ip=95.215.58.215 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="fFQ4ly0E" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=R9RPGX4W2sdBcGuw43AbX2HspDw/jr2m/4vM7rUIR8A=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1787108902; v=1; x=1787713702; b=fFQ4ly0EECinPEQPKHFAsHVJHxOXnQrGluH4aOPmgo75c54QJxuVY7VQMteQ4qu8RDiXyAmg cbDv06006mJNyXOq4cKZcPEiCzWQ2yFKVQai1Jk7BhHUN1Qja4R8yF8nC4A1Dh6oATf6t6FcdYq E8FswRXEwdRyQA8NRBWWeiHw= X-Envelope-To: linux-kernel@vger.kernel.org Received: from [192.168.111.29] (223.70.160.239) by smtp.migadu.com with ESMTPS id 96bebe67628b13f6; Wed, 19 Aug 2026 03:08:12 +0000 X-Migadu-Flow: FLOW_OUT Message-ID: <56052cbe-463d-4dbd-aa43-11f66232680c@linux.dev> Date: Wed, 19 Aug 2026 11:08:00 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2] mm/oom_kill: simplify remaining RCU sections with scoped_guard(rcu) To: Michal Hocko Cc: Andrew Morton , Ye Liu , David Rientjes , Shakeel Butt , linux-mm@kvack.org, linux-kernel@vger.kernel.org References: <20260813092933.562028-1-ye.liu@linux.dev> Content-Language: en-US From: Ye Liu In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 2026/8/13 19:40, Michal Hocko 写道: > On Thu 13-08-26 17:29:32, Ye Liu wrote: >> From: Ye Liu >> >> Replace the remaining manual rcu_read_lock()/rcu_read_unlock() pairs >> in oom_cpuset_eligible(), select_bad_process(), dump_tasks(), >> task_will_free_mem(), and __oom_kill_process() with scoped_guard(rcu) >> for consistency and simpler control flow. scoped_guard(rcu) limits >> the RCU critical section to the loop body rather than the entire >> remaining function scope, making the protected region explicit and >> safer for future changes. >> >> Signed-off-by: Ye Liu > > It almost looks like for_each_thread and for_each_process could gain an > rcu varian that would do the rcu thing internally. Have you considered > that? I am pretty sure there will be more cases like these. > Adding RCU versions of for_each_thread and for_each_process (for_each_thread_rcu and for_each_process_rcu) would be useful. I also have some simplified code to go with them. I'll send a patchset later. Thanks. > Anyway > Acked-by: Michal Hocko > Thanks > >> --- >> v2: >> - Use scoped_guard instead of guard. >> - Link:https://lore.kernel.org/all/20260813032634.344946-1-ye.liu@linux.dev/ >> >> mm/oom_kill.c | 124 +++++++++++++++++++++++++------------------------- >> 1 file changed, 62 insertions(+), 62 deletions(-) >> >> diff --git a/mm/oom_kill.c b/mm/oom_kill.c >> index 5f372f6e26fa..0e8982e5be51 100644 >> --- a/mm/oom_kill.c >> +++ b/mm/oom_kill.c >> @@ -94,27 +94,27 @@ static bool oom_cpuset_eligible(struct task_struct *start, >> bool ret = false; >> const nodemask_t *mask = oc->nodemask; >> >> - rcu_read_lock(); >> - for_each_thread(start, tsk) { >> - if (mask) { >> - /* >> - * If this is a mempolicy constrained oom, tsk's >> - * cpuset is irrelevant. Only return true if its >> - * mempolicy intersects current, otherwise it may be >> - * needlessly killed. >> - */ >> - ret = mempolicy_in_oom_domain(tsk, mask); >> - } else { >> - /* >> - * This is not a mempolicy constrained oom, so only >> - * check the mems of tsk's cpuset. >> - */ >> - ret = cpuset_mems_allowed_intersects(current, tsk); >> + scoped_guard(rcu) { >> + for_each_thread(start, tsk) { >> + if (mask) { >> + /* >> + * If this is a mempolicy constrained oom, tsk's >> + * cpuset is irrelevant. Only return true if its >> + * mempolicy intersects current, otherwise it may be >> + * needlessly killed. >> + */ >> + ret = mempolicy_in_oom_domain(tsk, mask); >> + } else { >> + /* >> + * This is not a mempolicy constrained oom, so only >> + * check the mems of tsk's cpuset. >> + */ >> + ret = cpuset_mems_allowed_intersects(current, tsk); >> + } >> + if (ret) >> + break; >> } >> - if (ret) >> - break; >> } >> - rcu_read_unlock(); >> >> return ret; >> } >> @@ -368,11 +368,11 @@ static void select_bad_process(struct oom_control *oc) >> else { >> struct task_struct *p; >> >> - rcu_read_lock(); >> - for_each_process(p) >> - if (oom_evaluate_task(p, oc)) >> - break; >> - rcu_read_unlock(); >> + scoped_guard(rcu) { >> + for_each_process(p) >> + if (oom_evaluate_task(p, oc)) >> + break; >> + } >> } >> } >> >> @@ -430,14 +430,14 @@ static void dump_tasks(struct oom_control *oc) >> struct task_struct *p; >> int i = 0; >> >> - rcu_read_lock(); >> - for_each_process(p) { >> - /* Avoid potential softlockup warning */ >> - if ((++i & 1023) == 0) >> - touch_softlockup_watchdog(); >> - dump_task(p, oc); >> + scoped_guard(rcu) { >> + for_each_process(p) { >> + /* Avoid potential softlockup warning */ >> + if ((++i & 1023) == 0) >> + touch_softlockup_watchdog(); >> + dump_task(p, oc); >> + } >> } >> - rcu_read_unlock(); >> } >> } >> >> @@ -894,17 +894,17 @@ static bool task_will_free_mem(struct task_struct *task) >> * are dying as well to make sure that a) nobody pins its mm and >> * b) the task is also reapable by the oom reaper. >> */ >> - rcu_read_lock(); >> - for_each_process(p) { >> - if (!process_shares_mm(p, mm)) >> - continue; >> - if (same_thread_group(task, p)) >> - continue; >> - ret = __task_will_free_mem(p); >> - if (!ret) >> - break; >> + scoped_guard(rcu) { >> + for_each_process(p) { >> + if (!process_shares_mm(p, mm)) >> + continue; >> + if (same_thread_group(task, p)) >> + continue; >> + ret = __task_will_free_mem(p); >> + if (!ret) >> + break; >> + } >> } >> - rcu_read_unlock(); >> >> return ret; >> } >> @@ -960,29 +960,29 @@ static void __oom_kill_process(struct task_struct *victim, const char *message) >> * That thread will now get access to memory reserves since it has a >> * pending fatal signal. >> */ >> - rcu_read_lock(); >> - for_each_process(p) { >> - if (!process_shares_mm(p, mm)) >> - continue; >> - if (same_thread_group(p, victim)) >> - continue; >> - if (is_global_init(p)) { >> - can_oom_reap = false; >> - mm_flags_set(MMF_OOM_SKIP, mm); >> - pr_info("oom killer %d (%s) has mm pinned by %d (%s)\n", >> - task_pid_nr(victim), victim->comm, >> - task_pid_nr(p), p->comm); >> - continue; >> + scoped_guard(rcu) { >> + for_each_process(p) { >> + if (!process_shares_mm(p, mm)) >> + continue; >> + if (same_thread_group(p, victim)) >> + continue; >> + if (is_global_init(p)) { >> + can_oom_reap = false; >> + mm_flags_set(MMF_OOM_SKIP, mm); >> + pr_info("oom killer %d (%s) has mm pinned by %d (%s)\n", >> + task_pid_nr(victim), victim->comm, >> + task_pid_nr(p), p->comm); >> + continue; >> + } >> + /* >> + * No kthread_use_mm() user needs to read from the userspace so >> + * we are ok to reap it. >> + */ >> + if (unlikely(p->flags & PF_KTHREAD)) >> + continue; >> + do_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_TGID); >> } >> - /* >> - * No kthread_use_mm() user needs to read from the userspace so >> - * we are ok to reap it. >> - */ >> - if (unlikely(p->flags & PF_KTHREAD)) >> - continue; >> - do_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_TGID); >> } >> - rcu_read_unlock(); >> >> if (can_oom_reap) >> queue_oom_reaper(victim); >> -- >> 2.25.1 > -- Thanks, Ye Liu