All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lorenzo Stoakes <ljs@kernel.org>
To: "David Hildenbrand (Arm)" <david@kernel.org>
Cc: Xuewen Wang <wangxuewen@kylinos.cn>,
	akpm@linux-foundation.org,  liam@infradead.org,
	vbabka@kernel.org, jannh@google.com, pfalcato@suse.de,
	 chrisl@kernel.org, kasong@tencent.com,
	shikemeng@huaweicloud.com, nphamcs@gmail.com,
	 baoquan.he@linux.dev, baohua@kernel.org, youngjun.park@lge.com,
	qi.zheng@linux.dev,  shakeel.butt@linux.dev,
	axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com,
	 linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3] mm: annotate data-race in cpu_needs_drain()
Date: Mon, 29 Jun 2026 11:23:26 +0100	[thread overview]
Message-ID: <akJHit8BV-hWRXYk@lucifer> (raw)
In-Reply-To: <04ea3e05-5b83-4c2d-8759-67c544a7b484@kernel.org>

On Fri, Jun 26, 2026 at 10:17:14AM +0200, David Hildenbrand (Arm) wrote:
> On 6/26/26 07:37, Xuewen Wang wrote:
> > KCSAN reports a data-race when cpu_needs_drain() reads another CPU's
> > per-cpu folio_batch->nr without locking, while the owning CPU writes
> > to it via folio_batch_add().
> >
> > Reading a slightly stale value is harmless -- cpu_needs_drain() only
> > decides whether to schedule a drain, and the next iteration of
> > __lru_add_drain_all() will re-check. Use data_race() to annotate
> > the intentional race.
> >
> > Signed-off-by: Xuewen Wang <wangxuewen@kylinos.cn>
> > ---
> > Changes in v3:
> > - Wrap the entire || expression in a single data_race() instead of wrapping
> >   each folio_batch_count() call individually, as suggested by Pedro and Lorenzo.
> >   This is equally effective and more readable.
> > - Remove data_race() from need_mlock_drain(), as it is now covered by the data_race()
> >   in cpu_needs_drain().
> > v2:
> >   https://lore.kernel.org/all/20260625065153.1581419-1-wangxuewen@kylinos.cn/
> > v1:
> >   https://lore.kernel.org/all/20260624092606.1083449-1-wangxuewen@kylinos.cn/
> > ---
> >  mm/swap.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/mm/swap.c b/mm/swap.c
> > index 588f50d8f1a8..46ea207e0624 100644
> > --- a/mm/swap.c
> > +++ b/mm/swap.c
> > @@ -828,13 +828,13 @@ static bool cpu_needs_drain(unsigned int cpu)
> >  	struct cpu_fbatches *fbatches = &per_cpu(cpu_fbatches, cpu);
> >
> >  	/* Check these in order of likelihood that they're not zero */
> > -	return folio_batch_count(&fbatches->lru_add) ||
> > +	return data_race(folio_batch_count(&fbatches->lru_add) ||
> >  		folio_batch_count(&fbatches->lru_move_tail) ||
> >  		folio_batch_count(&fbatches->lru_deactivate_file) ||
> >  		folio_batch_count(&fbatches->lru_deactivate) ||
> >  		folio_batch_count(&fbatches->lru_lazyfree) ||
> >  		folio_batch_count(&fbatches->lru_activate) ||
> > -		need_mlock_drain(cpu) ||
> > +		need_mlock_drain(cpu)) ||
>
> The indentation is a bit suboptimal now.
>
> Would read nicer as
>
> diff --git a/mm/swap.c b/mm/swap.c
> index 588f50d8f1a8c..5958e6fdd3593 100644
> --- a/mm/swap.c
> +++ b/mm/swap.c
> @@ -828,13 +828,13 @@ static bool cpu_needs_drain(unsigned int cpu)
>         struct cpu_fbatches *fbatches = &per_cpu(cpu_fbatches, cpu);
>
>         /* Check these in order of likelihood that they're not zero */
> -       return folio_batch_count(&fbatches->lru_add) ||
> -               folio_batch_count(&fbatches->lru_move_tail) ||
> -               folio_batch_count(&fbatches->lru_deactivate_file) ||
> -               folio_batch_count(&fbatches->lru_deactivate) ||
> -               folio_batch_count(&fbatches->lru_lazyfree) ||
> -               folio_batch_count(&fbatches->lru_activate) ||
> -               need_mlock_drain(cpu) ||
> +       return data_race(folio_batch_count(&fbatches->lru_add) ||
> +                        folio_batch_count(&fbatches->lru_move_tail) ||
> +                        folio_batch_count(&fbatches->lru_deactivate_file) ||
> +                        folio_batch_count(&fbatches->lru_deactivate) ||
> +                        folio_batch_count(&fbatches->lru_lazyfree) ||
> +                        folio_batch_count(&fbatches->lru_activate) ||
> +                        need_mlock_drain(cpu)) ||
>                 has_bh_in_lru(cpu, NULL);

Yeah that works for me.

Andrew - maybe easier if you fix that up? :)

>  }
>
> But I'll let others decide :)
>
> Acked-by: David Hildenbrand (Arm) <david@kernel.org>
>
> --
> Cheers,
>
> David

Cheers, Lorenzo


  reply	other threads:[~2026-06-29 10:23 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-26  5:37 [PATCH v3] mm: annotate data-race in cpu_needs_drain() Xuewen Wang
2026-06-26  8:17 ` David Hildenbrand (Arm)
2026-06-29 10:23   ` Lorenzo Stoakes [this message]
2026-06-29 16:34     ` Andrew Morton
2026-06-29 16:45       ` Lorenzo Stoakes
2026-06-29 18:20         ` Pedro Falcato
2026-06-26  8:32 ` Pedro Falcato
2026-06-29 10:22 ` Lorenzo Stoakes

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=akJHit8BV-hWRXYk@lucifer \
    --to=ljs@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=axelrasmussen@google.com \
    --cc=baohua@kernel.org \
    --cc=baoquan.he@linux.dev \
    --cc=chrisl@kernel.org \
    --cc=david@kernel.org \
    --cc=jannh@google.com \
    --cc=kasong@tencent.com \
    --cc=liam@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=nphamcs@gmail.com \
    --cc=pfalcato@suse.de \
    --cc=qi.zheng@linux.dev \
    --cc=shakeel.butt@linux.dev \
    --cc=shikemeng@huaweicloud.com \
    --cc=vbabka@kernel.org \
    --cc=wangxuewen@kylinos.cn \
    --cc=weixugc@google.com \
    --cc=youngjun.park@lge.com \
    --cc=yuanchu@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.