rseq: uapi: Update uapi comments

Update rseq uapi header comments to reflect that user-space need to do
thread-local loads/stores from/to the struct rseq fields.

As a consequence of this added requirement, the kernel does not need
to perform loads/stores with single-copy atomicity.

Update the comment associated to the "flags" fields to describe
more accurately that it's only useful to facilitate single-stepping
through rseq critical sections with debuggers.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-api@vger.kernel.org
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: "Paul E . McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Dave Watson <davejwatson@fb.com>
Cc: Paul Turner <pjt@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: "H . Peter Anvin" <hpa@zytor.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Chris Lameter <cl@linux.com>
Cc: Ben Maurer <bmaurer@fb.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Michael Kerrisk <mtk.manpages@gmail.com>
Cc: Joel Fernandes <joelaf@google.com>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Link: https://lkml.kernel.org/r/20180709195155.7654-4-mathieu.desnoyers@efficios.com
This commit is contained in:
Mathieu Desnoyers 2018-07-09 15:51:52 -04:00 коммит произвёл Thomas Gleixner
Родитель 8f28177014
Коммит 0fb9a1abc8
2 изменённых файлов: 37 добавлений и 34 удалений

Просмотреть файл

@ -67,28 +67,30 @@ struct rseq_cs {
struct rseq { struct rseq {
/* /*
* Restartable sequences cpu_id_start field. Updated by the * Restartable sequences cpu_id_start field. Updated by the
* kernel, and read by user-space with single-copy atomicity * kernel. Read by user-space with single-copy atomicity
* semantics. Aligned on 32-bit. Always contains a value in the * semantics. This field should only be read by the thread which
* range of possible CPUs, although the value may not be the * registered this data structure. Aligned on 32-bit. Always
* actual current CPU (e.g. if rseq is not initialized). This * contains a value in the range of possible CPUs, although the
* CPU number value should always be compared against the value * value may not be the actual current CPU (e.g. if rseq is not
* of the cpu_id field before performing a rseq commit or * initialized). This CPU number value should always be compared
* returning a value read from a data structure indexed using * against the value of the cpu_id field before performing a rseq
* the cpu_id_start value. * commit or returning a value read from a data structure indexed
* using the cpu_id_start value.
*/ */
__u32 cpu_id_start; __u32 cpu_id_start;
/* /*
* Restartable sequences cpu_id field. Updated by the kernel, * Restartable sequences cpu_id field. Updated by the kernel.
* and read by user-space with single-copy atomicity semantics. * Read by user-space with single-copy atomicity semantics. This
* Aligned on 32-bit. Values RSEQ_CPU_ID_UNINITIALIZED and * field should only be read by the thread which registered this
* RSEQ_CPU_ID_REGISTRATION_FAILED have a special semantic: the * data structure. Aligned on 32-bit. Values
* former means "rseq uninitialized", and latter means "rseq * RSEQ_CPU_ID_UNINITIALIZED and RSEQ_CPU_ID_REGISTRATION_FAILED
* initialization failed". This value is meant to be read within * have a special semantic: the former means "rseq uninitialized",
* rseq critical sections and compared with the cpu_id_start * and latter means "rseq initialization failed". This value is
* value previously read, before performing the commit instruction, * meant to be read within rseq critical sections and compared
* or read and compared with the cpu_id_start value before returning * with the cpu_id_start value previously read, before performing
* a value loaded from a data structure indexed using the * the commit instruction, or read and compared with the
* cpu_id_start value. * cpu_id_start value before returning a value loaded from a data
* structure indexed using the cpu_id_start value.
*/ */
__u32 cpu_id; __u32 cpu_id;
/* /*
@ -105,27 +107,28 @@ struct rseq {
* targeted by the rseq_cs. Also needs to be set to NULL by user-space * targeted by the rseq_cs. Also needs to be set to NULL by user-space
* before reclaiming memory that contains the targeted struct rseq_cs. * before reclaiming memory that contains the targeted struct rseq_cs.
* *
* Read and set by the kernel with single-copy atomicity semantics. * Read and set by the kernel. Set by user-space with single-copy
* Set by user-space with single-copy atomicity semantics. Aligned * atomicity semantics. This field should only be updated by the
* on 64-bit. * thread which registered this data structure. Aligned on 64-bit.
*/ */
LINUX_FIELD_u32_u64(rseq_cs); LINUX_FIELD_u32_u64(rseq_cs);
/* /*
* - RSEQ_DISABLE flag: * Restartable sequences flags field.
*
* This field should only be updated by the thread which
* registered this data structure. Read by the kernel.
* Mainly used for single-stepping through rseq critical sections
* with debuggers.
* *
* Fallback fast-track flag for single-stepping.
* Set by user-space if lack of progress is detected.
* Cleared by user-space after rseq finish.
* Read by the kernel.
* - RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT * - RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT
* Inhibit instruction sequence block restart and event * Inhibit instruction sequence block restart on preemption
* counter increment on preemption for this thread. * for this thread.
* - RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL * - RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL
* Inhibit instruction sequence block restart and event * Inhibit instruction sequence block restart on signal
* counter increment on signal delivery for this thread. * delivery for this thread.
* - RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE * - RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE
* Inhibit instruction sequence block restart and event * Inhibit instruction sequence block restart on migration for
* counter increment on migration for this thread. * this thread.
*/ */
__u32 flags; __u32 flags;
} __attribute__((aligned(4 * sizeof(__u64)))); } __attribute__((aligned(4 * sizeof(__u64))));

Просмотреть файл

@ -201,7 +201,7 @@ static int clear_rseq_cs(struct task_struct *t)
* of code outside of the rseq assembly block. This performs * of code outside of the rseq assembly block. This performs
* a lazy clear of the rseq_cs field. * a lazy clear of the rseq_cs field.
* *
* Set rseq_cs to NULL with single-copy atomicity. * Set rseq_cs to NULL.
*/ */
return put_user(0UL, &t->rseq->rseq_cs); return put_user(0UL, &t->rseq->rseq_cs);
} }