On Sat, May 18, 2024 at 9:00 AM Yangyu Chen <cyy@xxxxxxxxxxxx> wrote: > > The original documentation says hwprobe keys are bitmasks, but actually, > they are values. This patch clarifies this to avoid confusion. > > Signed-off-by: Yangyu Chen <cyy@xxxxxxxxxxxx> Hm, we also have this problem in the code, since hwprobe_key_is_bitmask() returns true for KEY_CPUPERF_0. This results in wrong information being returned for queries using the WHICH_CPU flag. If usermode asked for the set of CPUs that was specifically SLOW or EMULATED, the returned cpuset would also include cpus that were FAST. I believe all other queries are okay. The one-liner fix is to just not return true for that key in hwprobe_key_is_bitmask(). But that's technically user-visible: if some software relied on the buggy behavior of FAST cpus being swept up in the query for SLOW or EMULATED cpus, this change would expose that. The grownups-eat-their-vegetables thing to do would be to define a new key that returns this same value, but doesn't return true in hwprobe_key_is_bitmask(). What do people think? -Evan > --- > Documentation/arch/riscv/hwprobe.rst | 31 ++++++++++++++++------------ > 1 file changed, 18 insertions(+), 13 deletions(-) > > diff --git a/Documentation/arch/riscv/hwprobe.rst b/Documentation/arch/riscv/hwprobe.rst > index 239be63f5089..4abfa3f9fe44 100644 > --- a/Documentation/arch/riscv/hwprobe.rst > +++ b/Documentation/arch/riscv/hwprobe.rst > @@ -188,25 +188,30 @@ The following keys are defined: > manual starting from commit 95cf1f9 ("Add changes requested by Ved > during signoff") > > -* :c:macro:`RISCV_HWPROBE_KEY_CPUPERF_0`: A bitmask that contains performance > +* :c:macro:`RISCV_HWPROBE_KEY_CPUPERF_0`: A value that contains performance > information about the selected set of processors. > > - * :c:macro:`RISCV_HWPROBE_MISALIGNED_UNKNOWN`: The performance of misaligned > - scalar accesses is unknown. > + * :c:macro:`RISCV_HWPROBE_MISALIGNED_MASK`: The bitmask of the misaligned > + access performance field in the value of key `RISCV_HWPROBE_KEY_CPUPERF_0`. > > - * :c:macro:`RISCV_HWPROBE_MISALIGNED_EMULATED`: Misaligned scalar accesses are > - emulated via software, either in or below the kernel. These accesses are > - always extremely slow. > + The following values (not bitmasks) in this field are defined: > > - * :c:macro:`RISCV_HWPROBE_MISALIGNED_SLOW`: Misaligned scalar accesses are > - slower than equivalent byte accesses. Misaligned accesses may be supported > - directly in hardware, or trapped and emulated by software. > + * :c:macro:`RISCV_HWPROBE_MISALIGNED_UNKNOWN`: The performance of misaligned > + scalar accesses is unknown. > > - * :c:macro:`RISCV_HWPROBE_MISALIGNED_FAST`: Misaligned scalar accesses are > - faster than equivalent byte accesses. > + * :c:macro:`RISCV_HWPROBE_MISALIGNED_EMULATED`: Misaligned scalar accesses are > + emulated via software, either in or below the kernel. These accesses are > + always extremely slow. > > - * :c:macro:`RISCV_HWPROBE_MISALIGNED_UNSUPPORTED`: Misaligned scalar accesses > - are not supported at all and will generate a misaligned address fault. > + * :c:macro:`RISCV_HWPROBE_MISALIGNED_SLOW`: Misaligned scalar accesses are > + slower than equivalent byte accesses. Misaligned accesses may be supported > + directly in hardware, or trapped and emulated by software. > + > + * :c:macro:`RISCV_HWPROBE_MISALIGNED_FAST`: Misaligned scalar accesses are > + faster than equivalent byte accesses. > + > + * :c:macro:`RISCV_HWPROBE_MISALIGNED_UNSUPPORTED`: Misaligned scalar accesses > + are not supported at all and will generate a misaligned address fault. > > * :c:macro:`RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE`: An unsigned int which > represents the size of the Zicboz block in bytes. > -- > 2.43.0 >