membarrier.2: Update for Linux 5.10

Linux kernel commit 2a36ab717e8fe678d98f81c14a0b124712719840
(part of 5.10 release) changed sys_membarrier prototype/parameters
and added two new commands [MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ
and MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ]. This
man-pages patch reflects these changes, by mostly copying comments
from the kernel patch into the man-page ([Peter Oskolkov] was also
the author of the kernel change).

[mtk: commit message tweaked]

Signed-off-by: Peter Oskolkov <posk@google.com>
Cowritten-by: Alejandro Colomar <colomar.6.4.3@gmail.com>
Signed-off-by: Alejandro Colomar <colomar.6.4.3@gmail.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Peter Oskolkov 2020-11-05 12:32:00 +01:00 committed by Michael Kerrisk
parent 73cf5b8390
commit d98b1454fc
1 changed files with 53 additions and 7 deletions

View File

@ -30,7 +30,7 @@ membarrier \- issue memory barriers on a set of threads
.PP
.B #include <linux/membarrier.h>
.PP
.BI "int membarrier(int " cmd ", int " flags ");"
.BI "int membarrier(int " cmd ", unsigned int " flags ", int " cpu_id );
.fi
.PP
.IR Note :
@ -165,6 +165,29 @@ core command prior to using it.
Register the process's intent to use
.BR MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE .
.TP
.BR MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ " (since Linux 5.10)"
Ensure the caller thread, upon return from system call, that all its
running thread siblings have any currently running rseq critical sections
restarted if
.I flags
parameter is 0; if
.I flags
parameter is
.BR MEMBARRIER_CMD_FLAG_CPU ,
then this operation is performed only on CPU indicated by
.IR cpu_id .
This guarantee is provided only for threads in
the same process as the calling thread.
.IP
RSEQ membarrier is only available in the "private expedited" form.
.IP
A process must register its intent to use the private expedited rseq
command prior to using it.
.TP
.BR MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ " (since Linux 5.10)"
Register the process's intent to use
.BR MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ .
.TP
.BR MEMBARRIER_CMD_SHARED " (since Linux 4.3)"
This is an alias for
.BR MEMBARRIER_CMD_GLOBAL
@ -172,7 +195,21 @@ that exists for header backward compatibility.
.PP
The
.I flags
argument is currently unused and must be specified as 0.
argument must be specified as 0 unless the command is
.BR MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ ,
in which case
.I flags
can be either 0 or
.BR MEMBARRIER_CMD_FLAG_CPU .
.PP
The
.I cpu_id
argument is ignored unless
.I flags
is
.BR MEMBARRIER_CMD_FLAG_CPU ,
in which case it must specify the CPU targeted by this membarrier
command.
.PP
All memory accesses performed in program order from each targeted thread
are guaranteed to be ordered with respect to
@ -251,7 +288,16 @@ commands.
The
.BR membarrier ()
system call was added in Linux 4.3.
.\"
.PP
Before Linux 5.10, the prototype for
.BR membarrier ()
was:
.PP
.in +4n
.EX
.BI "int membarrier(int " cmd ", int " flags );
.EE
.in
.SH CONFORMING TO
.BR membarrier ()
is Linux-specific.
@ -350,9 +396,9 @@ becomes:
static volatile int a, b;
static int
membarrier(int cmd, int flags)
membarrier(int cmd, unsigned int flags, int cpu_id)
{
return syscall(__NR_membarrier, cmd, flags);
return syscall(__NR_membarrier, cmd, flags, cpu_id);
}
static int
@ -362,7 +408,7 @@ init_membarrier(void)
/* Check that membarrier() is supported. */
ret = membarrier(MEMBARRIER_CMD_QUERY, 0);
ret = membarrier(MEMBARRIER_CMD_QUERY, 0, 0);
if (ret < 0) {
perror("membarrier");
return \-1;
@ -389,7 +435,7 @@ static void
slow_path(int *read_a)
{
b = 1;
membarrier(MEMBARRIER_CMD_GLOBAL, 0);
membarrier(MEMBARRIER_CMD_GLOBAL, 0, 0);
*read_a = a;
}