From: "David Hildenbrand (Arm)" <david@kernel.org>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: linux-kernel@vger.kernel.org, Miaohe Lin <linmiaohe@huawei.com>,
Naoya Horiguchi <nao.horiguchi@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
Oscar Salvador <osalvador@suse.de>,
Andi Kleen <andi@firstfloor.org>,
Hidehiro Kawai <hidehiro.kawai.ez@hitachi.com>,
Rik van Riel <riel@redhat.com>,
Vlastimil Babka <vbabka@kernel.org>,
Lorenzo Stoakes <ljs@kernel.org>,
"Liam R. Howlett" <liam@infradead.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
Brendan Jackman <jackmanb@google.com>,
Johannes Weiner <hannes@cmpxchg.org>, Zi Yan <ziy@nvidia.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
Nico Pache <npache@redhat.com>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Barry Song <baohua@kernel.org>, Lance Yang <lance.yang@linux.dev>,
Christoph Lameter <cl@gentwo.org>,
David Rientjes <rientjes@google.com>,
Roman Gushchin <roman.gushchin@linux.dev>,
Harry Yoo <harry@kernel.org>, Hao Li <hao.li@linux.dev>,
Kiryl Shutsemau <kas@kernel.org>,
Byungchul Park <byungchul@sk.com>,
linux-mm@kvack.org, linux-cxl@vger.kernel.org
Subject: Re: [PATCH 0/2] mm: memory-failure: fix HWPoison flag race with non-atomic page flag ops
Date: Tue, 30 Jun 2026 08:34:44 +0200 [thread overview]
Message-ID: <0fb36931-9097-43db-98bb-d087b7b0fa12@kernel.org> (raw)
In-Reply-To: <20260630022129-mutt-send-email-mst@kernel.org>
On 6/30/26 08:27, Michael S. Tsirkin wrote:
> On Tue, Jun 30, 2026 at 08:17:42AM +0200, David Hildenbrand (Arm) wrote:
>> On 6/30/26 01:34, Michael S. Tsirkin wrote:
>>>
>>> Wait a sec, what about call_rcu_tasks? Use that and re-check the bit is
>>> still set?
>>
>> So, in essence the idea I had yestarday when it was late was the following:
>>
>> Assume we
>>
>> 1) Can have a way to guarantee that a function on a CPU cannot execute within
>> our critical section (while updating the flags)
>>
>> 2) We can request to execute a function on each CPU and wait for completion
>>
>> I think we could just let each CPU execute our desired action (e.g., try setting
>> the bit).
>>
>> E.g.,
>>
>> local_irq_save(flags);
>> page->flags &= whatever;
>> local_irq_restore(flags);
>>
>> And assume we want to set the bit, do a
>>
>> SetPageHWPoison(page);
>> smp_call_function(set_hwpoison_smp_sync, page, 1);
>>
>> whereby
>>
>> static void set_hwpoison_smp_sync(void *info)
>> {
>> SetPageHWPoison(page);
>> }
>>
>>
>> The idea is (that needs double checking) that a CPU will execute the
>> SetPageHWPoison() either before the local_irq_save() or after the
>> local_irq_restore(). So it's own non-atomic update cannot get interrupted.
>>
>> Now, IIUC when it comes to "how expensive is this" I think we have (cheap to
>> expensive):
>>
>> 1) preempt_disable()
>> 2) rcu_read_lock()
>> 3) local_irq_save()
>>
>>
>> So the above wouldn't be better than an rcu-based approach we have right now.
>> We'd need something that relies on disabled preemption only.
>>
>> Huh, but I read that "anything that disables preemption also marks an RCU-sched
>> read-side critical section including preempt_disable() and preempt_enable()".
>>
>> So for our use case we should be able to use preempt_disable() instead of
>> local_irq_save(). That should already work for your existing implementation.
>>
>> --
>> Cheers,
>>
>> David
>
> We have:
>
> #else /* #ifdef CONFIG_PREEMPT_RCU */
>
>
> static inline void __rcu_read_lock(void)
> {
> preempt_disable();
> }
>
> ...
>
>
> static __always_inline void rcu_read_lock(void)
> __acquires_shared(RCU)
> {
> __rcu_read_lock();
> __acquire_shared(RCU);
> rcu_lock_acquire(&rcu_lock_map);
> RCU_LOCKDEP_WARN(!rcu_is_watching(),
> "rcu_read_lock() used illegally while idle");
> }
>
>
>
> So on non-debug build witout CONFIG_PREEMPT_RCU (what I tested), rcu_lock
> is exactly same as preempt_disable. It's relatively cheap but not free.
>
>
> preempt_disable is not going to be cheaper.
Well, it will be cheaper in the general case (CONFIG_PREEMPT_RCU) :)
But yes, not for this case.
>
> I can test if you want but it seems clear.
>
If you measured only !CONFIG_PREEMPT_RCU, then yes, it won't change a thing for
that scenario.
>
> But IIUC task rcu might be cheaper - IIUC it does not need rcu
> lock/unlock at all, it relies on readers to invoke the scheduler
> instead.
> No?
I thought that still requires protection of sorts (preempt_disable /
rcu_read_lock), because it might fire whenever the task is preempted?
--
Cheers,
David
next prev parent reply other threads:[~2026-06-30 6:34 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-28 21:45 [PATCH 0/2] mm: memory-failure: fix HWPoison flag race with non-atomic page flag ops Michael S. Tsirkin
2026-06-28 21:45 ` [PATCH 1/2] mm: memory-failure: use RCU to fix HWPoison flag race Michael S. Tsirkin
2026-06-28 21:45 ` [PATCH 2/2] mm: wrap non-atomic page flag ops in RCU for HWPoison safety Michael S. Tsirkin
2026-06-29 2:11 ` [PATCH 0/2] mm: memory-failure: fix HWPoison flag race with non-atomic page flag ops Andi Kleen
2026-06-29 8:10 ` Michael S. Tsirkin
2026-06-29 8:21 ` David Hildenbrand (Arm)
2026-06-29 8:39 ` Michael S. Tsirkin
2026-06-29 16:54 ` Andi Kleen
2026-06-29 17:04 ` David Hildenbrand (Arm)
2026-06-29 20:43 ` Michael S. Tsirkin
2026-06-29 6:49 ` David Hildenbrand (Arm)
2026-06-29 7:34 ` Michael S. Tsirkin
2026-06-29 13:05 ` David Hildenbrand (Arm)
2026-06-29 20:08 ` Michael S. Tsirkin
2026-06-29 20:55 ` Andi Kleen
2026-06-29 21:17 ` Michael S. Tsirkin
2026-06-29 21:39 ` Andi Kleen
2026-06-29 21:59 ` Michael S. Tsirkin
2026-06-29 21:22 ` David Hildenbrand (Arm)
2026-06-29 21:43 ` David Hildenbrand (Arm)
2026-06-29 23:34 ` Michael S. Tsirkin
2026-06-30 6:17 ` David Hildenbrand (Arm)
2026-06-30 6:27 ` Michael S. Tsirkin
2026-06-30 6:34 ` David Hildenbrand (Arm) [this message]
2026-06-30 7:25 ` Michael S. Tsirkin
2026-06-29 21:50 ` Michael S. Tsirkin
2026-06-30 6:30 ` David Hildenbrand (Arm)
2026-06-30 6:41 ` David Hildenbrand (Arm)
2026-06-30 21:58 ` Michael S. Tsirkin
2026-07-01 8:08 ` David Hildenbrand (Arm)
2026-07-01 8:18 ` Michael S. Tsirkin
2026-07-01 8:26 ` David Hildenbrand (Arm)
2026-07-01 8:33 ` Michael S. Tsirkin
2026-07-01 8:36 ` David Hildenbrand (Arm)
2026-07-01 15:54 ` Michael S. Tsirkin
2026-07-01 16:17 ` David Hildenbrand (Arm)
2026-07-01 22:18 ` Michael S. Tsirkin
2026-06-29 21:54 ` Michael S. Tsirkin
2026-07-01 7:25 ` David Hildenbrand (Arm)
2026-06-29 23:29 ` Michael S. Tsirkin
2026-07-01 7:31 ` David Hildenbrand (Arm)
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=0fb36931-9097-43db-98bb-d087b7b0fa12@kernel.org \
--to=david@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=byungchul@sk.com \
--cc=cl@gentwo.org \
--cc=dev.jain@arm.com \
--cc=hannes@cmpxchg.org \
--cc=hao.li@linux.dev \
--cc=harry@kernel.org \
--cc=hidehiro.kawai.ez@hitachi.com \
--cc=jackmanb@google.com \
--cc=kas@kernel.org \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linmiaohe@huawei.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@suse.com \
--cc=mst@redhat.com \
--cc=nao.horiguchi@gmail.com \
--cc=npache@redhat.com \
--cc=osalvador@suse.de \
--cc=riel@redhat.com \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=surenb@google.com \
--cc=vbabka@kernel.org \
--cc=ziy@nvidia.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.