FROMLIST: Documentation: document the preferred tag checking mode feature
Document the functionality added in the previous patches. Link: https://linux-review.googlesource.com/id/I48217cc3e8b8da33abc08cbaddc11cf4360a1b86 Signed-off-by: Peter Collingbourne <pcc@google.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Link: https://lore.kernel.org/linux-arm-kernel/20210713234801.3858018-6-pcc@google.com/ Bug: 189966263 Change-Id: I48217cc3e8b8da33abc08cbaddc11cf4360a1b86
This commit is contained in:

committed by
Todd Kjos

parent
5adf29adb5
commit
3972be647a
@@ -648,3 +648,21 @@ Description: SPURR ticks for cpuX when it was idle.
|
|||||||
|
|
||||||
This sysfs interface exposes the number of SPURR ticks
|
This sysfs interface exposes the number of SPURR ticks
|
||||||
for cpuX when it was idle.
|
for cpuX when it was idle.
|
||||||
|
|
||||||
|
What: /sys/devices/system/cpu/cpuX/mte_tcf_preferred
|
||||||
|
Date: July 2021
|
||||||
|
Contact: Linux ARM Kernel Mailing list <linux-arm-kernel@lists.infradead.org>
|
||||||
|
Description: Preferred MTE tag checking mode
|
||||||
|
|
||||||
|
When a user program specifies more than one MTE tag checking
|
||||||
|
mode, this sysfs node is used to specify which mode should
|
||||||
|
be preferred when running on that CPU. Possible values:
|
||||||
|
|
||||||
|
================ ==============================================
|
||||||
|
"sync" Prefer synchronous mode
|
||||||
|
"async" Prefer asynchronous mode
|
||||||
|
================ ==============================================
|
||||||
|
|
||||||
|
Changes to this sysfs node may not take effect immediately.
|
||||||
|
|
||||||
|
See also: Documentation/arm64/memory-tagging-extension.rst
|
||||||
|
@@ -77,14 +77,20 @@ configurable behaviours:
|
|||||||
address is unknown).
|
address is unknown).
|
||||||
|
|
||||||
The user can select the above modes, per thread, using the
|
The user can select the above modes, per thread, using the
|
||||||
``prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0)`` system call where
|
``prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0)`` system call where ``flags``
|
||||||
``flags`` contain one of the following values in the ``PR_MTE_TCF_MASK``
|
contains any number of the following values in the ``PR_MTE_TCF_MASK``
|
||||||
bit-field:
|
bit-field:
|
||||||
|
|
||||||
- ``PR_MTE_TCF_NONE`` - *Ignore* tag check faults
|
- ``PR_MTE_TCF_NONE`` - *Ignore* tag check faults
|
||||||
|
(ignored if combined with other options)
|
||||||
- ``PR_MTE_TCF_SYNC`` - *Synchronous* tag check fault mode
|
- ``PR_MTE_TCF_SYNC`` - *Synchronous* tag check fault mode
|
||||||
- ``PR_MTE_TCF_ASYNC`` - *Asynchronous* tag check fault mode
|
- ``PR_MTE_TCF_ASYNC`` - *Asynchronous* tag check fault mode
|
||||||
|
|
||||||
|
If no modes are specified, tag check faults are ignored. If a single
|
||||||
|
mode is specified, the program will run in that mode. If multiple
|
||||||
|
modes are specified, the mode is selected as described in the "Per-CPU
|
||||||
|
preferred tag checking modes" section below.
|
||||||
|
|
||||||
The current tag check fault mode can be read using the
|
The current tag check fault mode can be read using the
|
||||||
``prctl(PR_GET_TAGGED_ADDR_CTRL, 0, 0, 0, 0)`` system call.
|
``prctl(PR_GET_TAGGED_ADDR_CTRL, 0, 0, 0, 0)`` system call.
|
||||||
|
|
||||||
@@ -120,13 +126,39 @@ in the ``PR_MTE_TAG_MASK`` bit-field.
|
|||||||
interface provides an include mask. An include mask of ``0`` (exclusion
|
interface provides an include mask. An include mask of ``0`` (exclusion
|
||||||
mask ``0xffff``) results in the CPU always generating tag ``0``.
|
mask ``0xffff``) results in the CPU always generating tag ``0``.
|
||||||
|
|
||||||
|
Per-CPU preferred tag checking mode
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
On some CPUs the performance of MTE in stricter tag checking modes
|
||||||
|
is similar to that of less strict tag checking modes. This makes it
|
||||||
|
worthwhile to enable stricter checks on those CPUs when a less strict
|
||||||
|
checking mode is requested, in order to gain the error detection
|
||||||
|
benefits of the stricter checks without the performance downsides. To
|
||||||
|
support this scenario, a privileged user may configure a stricter
|
||||||
|
tag checking mode as the CPU's preferred tag checking mode.
|
||||||
|
|
||||||
|
The preferred tag checking mode for each CPU is controlled by
|
||||||
|
``/sys/devices/system/cpu/cpu<N>/mte_tcf_preferred``, to which a
|
||||||
|
privileged user may write the value ``async`` or ``sync``. The default
|
||||||
|
preferred mode for each CPU is ``async``.
|
||||||
|
|
||||||
|
To allow a program to potentially run in the CPU's preferred tag
|
||||||
|
checking mode, the user program may set multiple tag check fault mode
|
||||||
|
bits in the ``flags`` argument to the ``prctl(PR_SET_TAGGED_ADDR_CTRL,
|
||||||
|
flags, 0, 0, 0)`` system call. If the CPU's preferred tag checking
|
||||||
|
mode is in the task's set of provided tag checking modes (this will
|
||||||
|
always be the case at present because the kernel only supports two
|
||||||
|
tag checking modes, but future kernels may support more modes), that
|
||||||
|
mode will be selected. Otherwise, one of the modes in the task's mode
|
||||||
|
set will be selected in a currently unspecified manner.
|
||||||
|
|
||||||
Initial process state
|
Initial process state
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
On ``execve()``, the new process has the following configuration:
|
On ``execve()``, the new process has the following configuration:
|
||||||
|
|
||||||
- ``PR_TAGGED_ADDR_ENABLE`` set to 0 (disabled)
|
- ``PR_TAGGED_ADDR_ENABLE`` set to 0 (disabled)
|
||||||
- Tag checking mode set to ``PR_MTE_TCF_NONE``
|
- No tag checking modes are selected (tag check faults ignored)
|
||||||
- ``PR_MTE_TAG_MASK`` set to 0 (all tags excluded)
|
- ``PR_MTE_TAG_MASK`` set to 0 (all tags excluded)
|
||||||
- ``PSTATE.TCO`` set to 0
|
- ``PSTATE.TCO`` set to 0
|
||||||
- ``PROT_MTE`` not set on any of the initial memory maps
|
- ``PROT_MTE`` not set on any of the initial memory maps
|
||||||
@@ -251,11 +283,13 @@ Example of correct usage
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable the tagged address ABI, synchronous MTE tag check faults and
|
* Enable the tagged address ABI, synchronous or asynchronous MTE
|
||||||
* allow all non-zero tags in the randomly generated set.
|
* tag check faults (based on per-CPU preference) and allow all
|
||||||
|
* non-zero tags in the randomly generated set.
|
||||||
*/
|
*/
|
||||||
if (prctl(PR_SET_TAGGED_ADDR_CTRL,
|
if (prctl(PR_SET_TAGGED_ADDR_CTRL,
|
||||||
PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | (0xfffe << PR_MTE_TAG_SHIFT),
|
PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC |
|
||||||
|
(0xfffe << PR_MTE_TAG_SHIFT),
|
||||||
0, 0, 0)) {
|
0, 0, 0)) {
|
||||||
perror("prctl() failed");
|
perror("prctl() failed");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
Reference in New Issue
Block a user