From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Boqun Feng <boqun.feng@gmail.com>,
Andy Lutomirski <luto@amacapital.net>,
Dave Watson <davejwatson@fb.com>,
linux-kernel <linux-kernel@vger.kernel.org>,
linux-api <linux-api@vger.kernel.org>,
Paul Turner <pjt@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
Russell King <linux@arm.linux.org.uk>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
Andrew Hunter <ahh@google.com>, Andi Kleen <andi@firstfloor.org>,
Chris Lameter <cl@linux.com>, Ben Maurer <bmaurer@fb.com>,
rostedt <rostedt@goodmis.org>,
Josh Triplett <josh@joshtriplett.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>,
Michael Kerrisk <mtk.manpages@gmail.com>,
shuah <shuah@kernel.org>,
linux-kselftest <linux-kselftest@vger.kernel.org>
Subject: Re: [RFC PATCH for 4.15 v3 15/22] rseq: selftests: Provide self-tests
Date: Fri, 24 Nov 2017 13:55:47 +0000 (UTC) [thread overview]
Message-ID: <1080135963.21671.1511531747949.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <20171123085511.ohwuobf5v32vggho@hirez.programming.kicks-ass.net>
----- On Nov 23, 2017, at 3:55 AM, Peter Zijlstra peterz@infradead.org wrote:
> On Tue, Nov 21, 2017 at 09:18:53AM -0500, Mathieu Desnoyers wrote:
>> +int percpu_list_push(struct percpu_list *list, struct percpu_list_node *node)
>> +{
>> + intptr_t *targetptr, newval, expect;
>> + int cpu, ret;
>> +
>> + /* Try fast path. */
>> + cpu = rseq_cpu_start();
>
>> + /* Load list->c[cpu].head with single-copy atomicity. */
>> + expect = (intptr_t)READ_ONCE(list->c[cpu].head);
>> + newval = (intptr_t)node;
>> + targetptr = (intptr_t *)&list->c[cpu].head;
>> + node->next = (struct percpu_list_node *)expect;
>
>> + ret = rseq_cmpeqv_storev(targetptr, expect, newval, cpu);
>
>> + if (likely(!ret))
>> + return cpu;
>
>> + return cpu;
>> +}
>
>> +static inline __attribute__((always_inline))
>> +int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv,
>> + int cpu)
>> +{
>> + __asm__ __volatile__ goto (
>> + RSEQ_ASM_DEFINE_TABLE(3, __rseq_table, 0x0, 0x0, 1f, 2f-1f, 4f)
>> + RSEQ_ASM_STORE_RSEQ_CS(1, 3b, rseq_cs)
>
>> + RSEQ_ASM_CMP_CPU_ID(cpu_id, current_cpu_id, 4f)
>
> So the actual C part of the RSEQ is subject to an ABA, right? We can get
> migrated to another CPU and back again without then failing here.
Yes, that's correct. All algorithms preparing something in C and
then using a compare-and-other-stuff sequence need to ensure they
do not have ABA situations. For instance, a list push does not care
if the list head is reclaimed and re-inserted concurrently, because
none of the preparation steps in C involve the head next pointer.
>
> It used to be that this was caught by the sequence count, but that is
> now gone.
The sequence count introduced other weirdness: although it would catch
those migration cases, it is a sequence read-lock, which means
the C code "protected" by this sequence read-lock needed to be
extremely careful about not accessing reclaimed memory.
The sequence lock ensures consistency of the data when they comparison
matches, but it does not protect against other side-effects.
So removing this sequence lock is actually a good thing: it removes
any expectation that users may have about that sequence counter being
anything stronger than a read seqlock.
>
> The thing that makes it work is the compare against @v:
>
>> + "cmpq %[v], %[expect]\n\t"
>> + "jnz 5f\n\t"
>
> That then ensures things are still as we observed them before (although
> this itself is also subject to ABA).
Yes.
>
> This means all RSEQ primitives that have a C part must have a cmp-and-
> form, but I suppose that was already pretty much the case anyway. I just
> don't remember seeing that spelled out anywhere. Then again, I've not
> yet read that manpage.
Yes, pretty much. The only primitives that don't have the compare are
things like "rseq_addv()", which does not have much in the C part
(it's just incrementing a counter).
I did not state anything like "typical rseq c.s. do a compare and other stuff"
in rseq(2), given that the role of this man page, AFAIU, is to explain
how to interact with the kernel system call, and not really a document
about user-space implementation guide lines.
But let me know if I should expand it with a user-space sequence implementation
guide lines, which would include notes about being careful about ABA. I'm
not sure it belongs there though.
Thanks!
Mathieu
>
>> + /* final store */
>> + "movq %[newv], %[v]\n\t"
>> + "2:\n\t"
>> + RSEQ_ASM_DEFINE_ABORT(4, __rseq_failure, RSEQ_SIG, "", abort)
>> + RSEQ_ASM_DEFINE_CMPFAIL(5, __rseq_failure, "", cmpfail)
>> + : /* gcc asm goto does not allow outputs */
>> + : [cpu_id]"r"(cpu),
>> + [current_cpu_id]"m"(__rseq_abi.cpu_id),
>> + [rseq_cs]"m"(__rseq_abi.rseq_cs),
>> + [v]"m"(*v),
>> + [expect]"r"(expect),
>> + [newv]"r"(newv)
>> + : "memory", "cc", "rax"
>> + : abort, cmpfail
>> + );
>> + return 0;
>> +abort:
>> + return -1;
>> +cmpfail:
>> + return 1;
> > +}
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
next prev parent reply other threads:[~2017-11-24 13:54 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-21 14:18 [RFC PATCH for 4.15 v12 00/22] Restartable sequences and CPU op vector Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 01/22] uapi headers: Provide types_32_64.h Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 v12 02/22] rseq: Introduce restartable sequences system call Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 03/22] arm: Add restartable sequences support Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 04/22] arm: Wire up restartable sequences system call Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 05/22] x86: Add support for restartable sequences Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 06/22] x86: Wire up restartable sequence system call Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 07/22] powerpc: Add support for restartable sequences Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 08/22] powerpc: Wire up restartable sequences system call Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 09/22] sched: Implement push_task_to_cpu Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 v4 10/22] cpu_opv: Provide cpu_opv system call Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 11/22] x86: Wire up " Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 12/22] powerpc: " Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 13/22] arm: " Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 v3 14/22] cpu_opv: selftests: Implement selftests Mathieu Desnoyers
2017-11-21 15:17 ` Shuah Khan
2017-11-21 16:46 ` Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 v3 15/22] rseq: selftests: Provide self-tests Mathieu Desnoyers
2017-11-21 15:34 ` Shuah Khan
2017-11-21 17:05 ` Mathieu Desnoyers
2017-11-21 17:40 ` Shuah Khan
2017-11-21 21:22 ` Mathieu Desnoyers
2017-11-21 21:24 ` Shuah Khan
2017-11-21 21:44 ` Mathieu Desnoyers
2017-11-22 19:38 ` Peter Zijlstra
2017-11-23 21:16 ` Mathieu Desnoyers
2017-11-22 21:48 ` Peter Zijlstra
2017-11-23 22:53 ` Mathieu Desnoyers
2017-11-23 8:55 ` Peter Zijlstra
2017-11-23 8:57 ` Peter Zijlstra
2017-11-24 14:15 ` Mathieu Desnoyers
2017-11-24 13:55 ` Mathieu Desnoyers [this message]
2017-11-21 14:18 ` [RFC PATCH for 4.15 16/22] rseq: selftests: arm: workaround gcc asm size guess Mathieu Desnoyers
2017-11-21 15:39 ` Shuah Khan
2017-11-21 14:18 ` [RFC PATCH for 4.15 17/22] Fix: membarrier: add missing preempt off around smp_call_function_many Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 18/22] membarrier: selftest: Test private expedited cmd Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 v7 19/22] powerpc: membarrier: Skip memory barrier in switch_mm() Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 v5 20/22] membarrier: Document scheduler barrier requirements Mathieu Desnoyers
2017-11-21 14:18 ` [RFC PATCH for 4.15 v2 21/22] membarrier: provide SHARED_EXPEDITED command Mathieu Desnoyers
2017-11-21 14:19 ` [RFC PATCH for 4.15 22/22] membarrier: selftest: Test shared expedited cmd Mathieu Desnoyers
2017-11-21 17:21 ` [RFC PATCH for 4.15 v12 00/22] Restartable sequences and CPU op vector Andi Kleen
2017-11-21 22:05 ` Mathieu Desnoyers
2017-11-21 22:59 ` Thomas Gleixner
2017-11-22 12:36 ` Mathieu Desnoyers
2017-11-22 15:25 ` Thomas Gleixner
2017-11-22 15:28 ` Andy Lutomirski
2017-11-22 16:43 ` Mathieu Desnoyers
2017-11-22 18:10 ` Andi Kleen
2017-11-22 19:32 ` Peter Zijlstra
2017-11-22 19:37 ` Will Deacon
2017-11-23 21:15 ` Mathieu Desnoyers
2017-11-23 22:51 ` Thomas Gleixner
2017-11-23 23:01 ` Mathieu Desnoyers
2017-11-23 23:38 ` Thomas Gleixner
2017-11-24 0:04 ` Mathieu Desnoyers
2017-11-24 14:47 ` Thomas Gleixner
2017-11-23 21:13 ` Mathieu Desnoyers
2017-11-23 21:49 ` Andi Kleen
2017-11-21 22:19 ` [PATCH update for 4.15 1/3] selftests: lib.mk: Introduce OVERRIDE_TARGETS Mathieu Desnoyers
2017-11-21 22:22 ` Mathieu Desnoyers
2017-11-22 15:16 ` Shuah Khan
2017-11-21 22:19 ` [PATCH update for 4.15 2/3] cpu_opv: selftests: Implement selftests (v4) Mathieu Desnoyers
2017-11-22 15:20 ` Shuah Khan
2017-11-21 22:19 ` [PATCH update for 4.15 3/3] rseq: selftests: Provide self-tests (v4) Mathieu Desnoyers
2017-11-22 15:23 ` Shuah Khan
2017-11-22 16:31 ` Mathieu Desnoyers
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=1080135963.21671.1511531747949.JavaMail.zimbra@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=ahh@google.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=bmaurer@fb.com \
--cc=boqun.feng@gmail.com \
--cc=catalin.marinas@arm.com \
--cc=cl@linux.com \
--cc=davejwatson@fb.com \
--cc=hpa@zytor.com \
--cc=josh@joshtriplett.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=luto@amacapital.net \
--cc=mingo@redhat.com \
--cc=mtk.manpages@gmail.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=rostedt@goodmis.org \
--cc=shuah@kernel.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=will.deacon@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox