rseq/membarrier: Add MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ
This patchset is based on Google-internal RSEQ work done by Paul Turner and Andrew Hunter. When working with per-CPU RSEQ-based memory allocations, it is sometimes important to make sure that a global memory location is no longer accessed from RSEQ critical sections. For example, there can be two per-CPU lists, one is "active" and accessed per-CPU, while another one is inactive and worked on asynchronously "off CPU" (e.g. garbage collection is performed). Then at some point the two lists are swapped, and a fast RCU-like mechanism is required to make sure that the previously active list is no longer accessed. This patch introduces such a mechanism: in short, membarrier() syscall issues an IPI to a CPU, restarting a potentially active RSEQ critical section on the CPU. Signed-off-by: Peter Oskolkov <posk@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Link: https://lkml.kernel.org/r/20200923233618.2572849-1-posk@google.com
This commit is contained in:

committed by
Peter Zijlstra

parent
233e7aca4c
commit
2a36ab717e
@@ -114,6 +114,26 @@
|
||||
* If this command is not implemented by an
|
||||
* architecture, -EINVAL is returned.
|
||||
* Returns 0 on success.
|
||||
* @MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ:
|
||||
* Ensure the caller thread, upon return from
|
||||
* system call, that all its running thread
|
||||
* siblings have any currently running rseq
|
||||
* critical sections restarted if @flags
|
||||
* parameter is 0; if @flags parameter is
|
||||
* MEMBARRIER_CMD_FLAG_CPU,
|
||||
* then this operation is performed only
|
||||
* on CPU indicated by @cpu_id. If this command is
|
||||
* not implemented by an architecture, -EINVAL
|
||||
* is returned. A process needs to register its
|
||||
* intent to use the private expedited rseq
|
||||
* command prior to using it, otherwise
|
||||
* this command returns -EPERM.
|
||||
* @MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ:
|
||||
* Register the process intent to use
|
||||
* MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ.
|
||||
* If this command is not implemented by an
|
||||
* architecture, -EINVAL is returned.
|
||||
* Returns 0 on success.
|
||||
* @MEMBARRIER_CMD_SHARED:
|
||||
* Alias to MEMBARRIER_CMD_GLOBAL. Provided for
|
||||
* header backward compatibility.
|
||||
@@ -131,9 +151,15 @@ enum membarrier_cmd {
|
||||
MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = (1 << 4),
|
||||
MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = (1 << 5),
|
||||
MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = (1 << 6),
|
||||
MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = (1 << 7),
|
||||
MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = (1 << 8),
|
||||
|
||||
/* Alias for header backward compatibility. */
|
||||
MEMBARRIER_CMD_SHARED = MEMBARRIER_CMD_GLOBAL,
|
||||
};
|
||||
|
||||
enum membarrier_cmd_flag {
|
||||
MEMBARRIER_CMD_FLAG_CPU = (1 << 0),
|
||||
};
|
||||
|
||||
#endif /* _UAPI_LINUX_MEMBARRIER_H */
|
||||
|
Reference in New Issue
Block a user