From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Jonas Oberhauser <jonas.oberhauser@huaweicloud.com>,
Boqun Feng <boqun.feng@gmail.com>,
"Paul E. McKenney" <paulmck@kernel.org>
Cc: linux-kernel@vger.kernel.org, Will Deacon <will@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Alan Stern <stern@rowland.harvard.edu>,
John Stultz <jstultz@google.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Frederic Weisbecker <frederic@kernel.org>,
Joel Fernandes <joel@joelfernandes.org>,
Josh Triplett <josh@joshtriplett.org>,
Uladzislau Rezki <urezki@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Lai Jiangshan <jiangshanlai@gmail.com>,
Zqiang <qiang.zhang1211@gmail.com>,
Ingo Molnar <mingo@redhat.com>, Waiman Long <longman@redhat.com>,
Mark Rutland <mark.rutland@arm.com>,
Thomas Gleixner <tglx@linutronix.de>,
Vlastimil Babka <vbabka@suse.cz>,
maged.michael@gmail.com, Mateusz Guzik <mjguzik@gmail.com>,
rcu@vger.kernel.org, linux-mm@kvack.org, lkmm@lists.linux.dev
Subject: Re: [RFC PATCH 1/1] hpref: Hazard Pointers with Reference Counter
Date: Sat, 28 Sep 2024 07:33:37 -0400 [thread overview]
Message-ID: <2ca589bc-2a60-48ef-95a0-d9ee4a814dea@efficios.com> (raw)
In-Reply-To: <db17633f-354d-428e-97c2-bcd455766c3a@huaweicloud.com>
On 2024-09-28 13:22, Jonas Oberhauser wrote:
> Two more questions below:
>
> Am 9/21/2024 um 6:42 PM schrieb Mathieu Desnoyers:
>> +#define NR_PERCPU_SLOTS_BITS 3
>
> Have you measured any advantage of this multi-slot version vs a version
> with just one normal slot and one emergency slot?
No, I have not. That being said, I am taking a minimalistic
approach that takes things even further in the "simple" direction
for what I will send as RFC against the Linux kernel:
there is just the one "emergency slot", irqs are disabled around
use of the HP slot, and promotion to refcount is done before
returning to the caller.
> With just one normal slot, the normal slot version would always be zero,
> and there'd be no need to increment etc., which might make the common
> case (no conflict) faster.
The multi-slots allows preemption while holding the slot. It also allows
HP slots users to keep it longer without doing to refcount right away.
I even have a patch that dynamically adapts the scan depth (increase
by reader, decrease by synchronize, with an hysteresis) in my userspace
prototype. This splits the number of allocated slots from the scan
depth. But I keep that for later and will focus on the simple case
first (single HP slot, only used with irqoff).
>
> Either way I recommend stress testing with just one normal slot to
> increase the chance of conflict (and hence triggering corner cases)
> during stress testing.
Good point.
>
>> +retry:
>> + node = uatomic_load(node_p, CMM_RELAXED);
>> + if (!node)
>> + return false;
>> + /* Use rseq to try setting current slot hp. Store B. */
>> + if (rseq_load_cbne_store__ptr(RSEQ_MO_RELAXED, RSEQ_PERCPU_CPU_ID,
>> + (intptr_t *) &slot->node, (intptr_t) NULL,
>> + (intptr_t) node, cpu)) {
>> + slot = &cpu_slots->slots[HPREF_EMERGENCY_SLOT];
>> + use_refcount = true;
>> + /*
>> + * This may busy-wait for another reader using the
>> + * emergency slot to transition to refcount.
>> + */
>> + caa_cpu_relax();
>> + goto retry;
>> + }
>
> I'm not familiar with Linux' preemption model. Can this deadlock if a
> low-interrupt-level thread is occupying the EMERGENCY slot and a
> higher-interrupt-level thread is also trying to take it?
This is a userspace prototype. This will behave similarly to a userspace
spinlock in that case, which is not great in terms of CPU usage, but
should eventually unblock the waiter, unless it has a RT priority that
really prevents any progress from the emergency slot owner.
On my TODO list, I have a bullet about integrating with sys_futex to
block on wait, wake up on slot release. I would then use the wait/wakeup
code based on sys_futex already present in liburcu.
Thanks!
Mathieu
>
>
>
>
> Best wishes,
> jonas
>
--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com
next prev parent reply other threads:[~2024-09-28 11:35 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-21 16:42 Mathieu Desnoyers
2024-09-21 21:07 ` Lai Jiangshan
2024-09-22 7:47 ` Mathieu Desnoyers
2024-09-25 5:57 ` Jonas Oberhauser
2024-09-25 6:35 ` Mathieu Desnoyers
2024-09-25 10:06 ` Jonas Oberhauser
2024-09-25 11:36 ` Mathieu Desnoyers
2024-09-25 12:02 ` Jonas Oberhauser
2024-09-28 11:22 ` Jonas Oberhauser
2024-09-28 11:33 ` Mathieu Desnoyers [this message]
2024-09-28 11:50 ` Jonas Oberhauser
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=2ca589bc-2a60-48ef-95a0-d9ee4a814dea@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=boqun.feng@gmail.com \
--cc=frederic@kernel.org \
--cc=jiangshanlai@gmail.com \
--cc=joel@joelfernandes.org \
--cc=jonas.oberhauser@huaweicloud.com \
--cc=josh@joshtriplett.org \
--cc=jstultz@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lkmm@lists.linux.dev \
--cc=longman@redhat.com \
--cc=maged.michael@gmail.com \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=mjguzik@gmail.com \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=qiang.zhang1211@gmail.com \
--cc=rcu@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=stern@rowland.harvard.edu \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=urezki@gmail.com \
--cc=vbabka@suse.cz \
--cc=will@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox