Thread (2 messages) 2 messages, 2 authors, 2024-07-22

Re: [PATCH v5] prctl.2: Add PR_RISCV_SET_ICACHE_FLUSH_CTX

From: Alejandro Colomar <alx@kernel.org>
Date: 2024-07-22 20:14:31

Hi Charlie,

On Tue, Jul 09, 2024 at 10:56:52AM GMT, Charlie Jenkins wrote:
Document the PR_RISCV_SET_ICACHE_FLUSH_CTX flag for prctl(2) that is
supported as of Linux 6.10.

Signed-off-by: Charlie Jenkins <redacted>
Thanks!  I've applied the patch, with some minor changes:
diff --git c/man/man2const/PR_RISCV_SET_ICACHE_FLUSH_CTX.2const i/man/man2const/PR_RISCV_SET_ICACHE_FLUSH_CTX.2const
index 138e45e0b..a0f0c736d 100644
--- c/man/man2const/PR_RISCV_SET_ICACHE_FLUSH_CTX.2const
+++ i/man/man2const/PR_RISCV_SET_ICACHE_FLUSH_CTX.2const
@@ -29,8 +29,8 @@ .SH DESCRIPTION
 .B PR_RISCV_SCOPE_PER_PROCESS
 all threads in the process are permitted to emit icache flushing instructions.
 Whenever any thread in the process is migrated,
-the corresponding hart's icache will be guaranteed
-to be consistent with instruction storage.
+the corresponding hart's icache will be
+guaranteed to be consistent with instruction storage.
 This does not enforce any guarantees outside of migration.
 If a thread modifies an instruction that another thread may attempt to execute,
 the other thread must still emit an icache flushing instruction
@@ -46,13 +46,12 @@ .SH DESCRIPTION
 guaranteed to be consistent with instruction storage.
 .P
 On kernels configured without SMP, this prctl
-.BR PR_RISCV_SET_ICACHE_FLUSH_CTX
+.B PR_RISCV_SET_ICACHE_FLUSH_CTX
 is a nop as migrations across harts will not occur.
 .P
 The following values for
 .I ctx
 can be specified:
-.RS
 .TP
 .BR PR_RISCV_CTX_SW_FENCEI_ON " (since Linux 6.10)"
 Allow fence.i in user space.
@@ -64,12 +63,10 @@ .SH DESCRIPTION
 Therefore, caution must be taken;
 use this flag only when you can guarantee that
 no thread in the process will emit fence.i from this point onward.
-.RE
-.IP
+.P
 The following values for
 .I scope
 can be specified:
-.RS
 .TP
 .BR PR_RISCV_SCOPE_PER_PROCESS " (since Linux 6.10)"
 Ensure the icache of any thread in this process is coherent with instruction
@@ -78,7 +75,6 @@ .SH DESCRIPTION
 .BR PR_RISCV_SCOPE_PER_THREAD " (since Linux 6.10)"
 Ensure the icache of the current thread is coherent with instruction storage
 upon migration.
-.RE
 .SH EXAMPLES
 The following files are meant to be compiled and linked with each other.
 The modify_instruction() function
@@ -94,7 +90,8 @@ .SS Program source: cmodx.c
 extern int get_value(void);
 extern void modify_instruction(void);
 \&
-int main(void)
+int
+main(void)
 {
     int value = get_value();
 \&

Have a lovely night!
Alex
quoted hunk ↗ jump to hunk
---
Changes in v5:
- Change "." to "\&" for newlines in example
- Fix whitespace
- Link to v4: https://lore.kernel.org/r/20240701-fencei_prctl-v4-1-9e181287d872@rivosinc.com (local)

Changes in v4:
- Move release information to Standards/History
- Fix typo in prctl
- Use semantic newlines
- Add magic comments for code and fix style issues (clang-tidy warns
  about prctl flags that are available in the 6.10 rc's)
- Link to v3: https://lore.kernel.org/r/20240628-fencei_prctl-v3-1-56fd31155129@rivosinc.com (local)

Changes in v3:
- Rebase onto master
- Add example usage
- Link to v2: https://lore.kernel.org/r/20240212-fencei_prctl-v2-1-32d940981b05@rivosinc.com (local)

Changes in v2:
- Update formatting (Alejandro)
- Link to v1: https://lore.kernel.org/r/20240124-fencei_prctl-v1-1-0bddafcef331@rivosinc.com (local)
---
 man/man2/prctl.2                                   |   3 +
 man/man2const/PR_RISCV_SET_ICACHE_FLUSH_CTX.2const | 155 +++++++++++++++++++++
 2 files changed, 158 insertions(+)
diff --git a/man/man2/prctl.2 b/man/man2/prctl.2
index 6db916587..31a3f9064 100644
--- a/man/man2/prctl.2
+++ b/man/man2/prctl.2
@@ -157,6 +157,8 @@ The first argument can be:
 .B PR_SET_MDWE
 .TQ
 .B PR_GET_MDWE
+.TQ
+.B PR_RISCV_SET_ICACHE_FLUSH_CTX
 .SH RETURN VALUE
 On success,
 a nonnegative value is returned.
@@ -268,4 +270,5 @@ so these operations should be used with care.
 .BR PR_GET_AUXV (2const),
 .BR PR_SET_MDWE (2const),
 .BR PR_GET_MDWE (2const),
+.BR PR_RISCV_SET_ICACHE_FLUSH_CTX (2const),
 .BR core (5)
diff --git a/man/man2const/PR_RISCV_SET_ICACHE_FLUSH_CTX.2const b/man/man2const/PR_RISCV_SET_ICACHE_FLUSH_CTX.2const
new file mode 100644
index 000000000..138e45e0b
--- /dev/null
+++ b/man/man2const/PR_RISCV_SET_ICACHE_FLUSH_CTX.2const
@@ -0,0 +1,155 @@
+.\" Copyright 2024 Rivos Inc.
+.\"
+.\" SPDX-License-Identifier: Linux-man-pages-copyleft
+.\"
+.TH PR_RISCV_SET_ICACHE_FLUSH_CTX 2const (date) "Linux man-pages (unreleased)"
+.SH NAME
+PR_RISCV_SET_ICACHE_FLUSH_CTX
+\-
+Enable/disable icache flushing instructions in userspace.
+.SH LIBRARY
+Standard C library
+.RI ( libc ", " \-lc )
+.SH SYNOPSIS
+.nf
+.BR "#include <linux/prctl.h>" "  /* Definition of " PR_* " constants */"
+.B #include <sys/prctl.h>
+.P
+.BI "int prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, unsigned long " ctx,
+.BI "          unsigned long " scope );
+.fi
+.SH DESCRIPTION
+The context and the scope can be provided using
+.I ctx
+and
+.I scope
+respectively.
+.P
+When scope is set to
+.B PR_RISCV_SCOPE_PER_PROCESS
+all threads in the process are permitted to emit icache flushing instructions.
+Whenever any thread in the process is migrated,
+the corresponding hart's icache will be guaranteed
+to be consistent with instruction storage.
+This does not enforce any guarantees outside of migration.
+If a thread modifies an instruction that another thread may attempt to execute,
+the other thread must still emit an icache flushing instruction
+before attempting to execute the potentially modified instruction.
+This must be performed by the user-space program.
+.P
+In per-thread context (eg. scope is set to
+.BR PR_RISCV_SCOPE_PER_THREAD )
+only the thread calling this function is permitted to
+emit icache flushing instructions.
+When the thread is migrated,
+the corresponding hart's icache will be
+guaranteed to be consistent with instruction storage.
+.P
+On kernels configured without SMP, this prctl
+.BR PR_RISCV_SET_ICACHE_FLUSH_CTX
+is a nop as migrations across harts will not occur.
+.P
+The following values for
+.I ctx
+can be specified:
+.RS
+.TP
+.BR PR_RISCV_CTX_SW_FENCEI_ON " (since Linux 6.10)"
+Allow fence.i in user space.
+.TP
+.BR PR_RISCV_CTX_SW_FENCEI_OFF " (since Linux 6.10)"
+Disallow fence.i in user space.
+All threads in a process will be affected when scope is set to
+.BR PR_RISCV_SCOPE_PER_PROCESS .
+Therefore, caution must be taken;
+use this flag only when you can guarantee that
+no thread in the process will emit fence.i from this point onward.
+.RE
+.IP
+The following values for
+.I scope
+can be specified:
+.RS
+.TP
+.BR PR_RISCV_SCOPE_PER_PROCESS " (since Linux 6.10)"
+Ensure the icache of any thread in this process is coherent with instruction
+storage upon migration.
+.TP
+.BR PR_RISCV_SCOPE_PER_THREAD " (since Linux 6.10)"
+Ensure the icache of the current thread is coherent with instruction storage
+upon migration.
+.RE
+.SH EXAMPLES
+The following files are meant to be compiled and linked with each other.
+The modify_instruction() function
+replaces an add with zero with an add with one,
+causing the instruction sequence in get_value() to change from
+returning a zero to returning a one.
+.SS Program source: cmodx.c
+.\" SRC BEGIN (cmodx.c)
+.EX
+#include <stdio.h>
+#include <sys/prctl.h>
+\&
+extern int get_value(void);
+extern void modify_instruction(void);
+\&
+int main(void)
+{
+    int value = get_value();
+\&
+    printf("Value before cmodx: %d\[rs]n", value);
+\&
+    // Call prctl before first fence.i is called
+    prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, PR_RISCV_CTX_SW_FENCEI_ON,
+          PR_RISCV_SCOPE_PER_PROCESS);
+\&
+    modify_instruction();
+\&
+    // Call prctl after final fence.i is called in process
+    prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, PR_RISCV_CTX_SW_FENCEI_OFF,
+          PR_RISCV_SCOPE_PER_PROCESS);
+\&
+    value = get_value();
+    printf("Value after cmodx: %d\[rs]n", value);
+    return 0;
+}
+.EE
+.\" SRC END
+.SS Program source: cmodx.S
+.EX
+\&.option norvc
+\&
+\&.text
+\&.global modify_instruction
+modify_instruction:
+lw a0, new_insn
+lui a5,%hi(old_insn)
+sw  a0,%lo(old_insn)(a5)
+fence.i
+ret
+\&
+\&.section modifiable, "awx"
+\&.global get_value
+get_value:
+li a0, 0
+old_insn:
+addi a0, a0, 0
+ret
+\&
+\&.data
+new_insn:
+addi a0, a0, 1
+.EE
+.SS Expected result
+.EX
+Value before cmodx: 0
+Value after cmodx: 1
+.EE
+.SH STANDARDS
+Linux. RISC-V only.
+.SH HISTORY
+.TP
+Linux 6.10 (RISC-V).
+.SH SEE ALSO
+.BR prctl (2)

---
base-commit: d0621648b4b5a356e86cea23e842f2591461f0cf
change-id: 20240124-fencei_prctl-c24da2643379

Best regards,
-- 
Charlie Jenkins [off-list ref]
-- 
<https://www.alejandro-colomar.es/>

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help