Re: [PATCH v3 0/5] Improve arm64 pkeys handling in signal delivery

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



+Kees and Jorge and Jann

On Tue, Oct 29, 2024 at 7:45 AM Kevin Brodsky <kevin.brodsky@xxxxxxx> wrote:
>
> This series is a follow-up to Joey's Permission Overlay Extension (POE)
> series [1] that recently landed on mainline. The goal is to improve the
> way we handle the register that governs which pkeys/POIndex are
> accessible (POR_EL0) during signal delivery. As things stand, we may
> unexpectedly fail to write the signal frame on the stack because POR_EL0
> is not reset before the uaccess operations. See patch 1 for more details
> and the main changes this series brings.
>
> A similar series landed recently for x86/MPK [2]; the present series
> aims at aligning arm64 with x86. Worth noting: once the signal frame is
> written, POR_EL0 is still set to POR_EL0_INIT, granting access to pkey 0
> only. This means that a program that sets up an alternate signal stack
> with a non-zero pkey will need some assembly trampoline to set POR_EL0
> before invoking the real signal handler, as discussed here [3]. This is
> not ideal, but it makes experimentation with pkeys in signal handlers
> possible while waiting for a potential interface to control the pkey
> state when delivering a signal. See Pierre's reply [4] for more
> information about use-cases and a potential interface.
>
Apologize in advance  that I'm unfamiliar with ARM's POR, up to review
this patch series, so I might ask silly questions or based on wrong
understanding.

It seems that the patch has the same logic as Aruna Ramakrishna
proposed for X86, is this correct ?

In the latest version of x86 change [1], I have a comment if we want
to consider adding a new flag SS_PKEYALTSTACK (see SS_AUTODISARM as an
example) in sigaltstack, and restrict this mechanism (overwriting
PKRU/POR_EL0 and sigframe)  to sigaltstack() with SS_PKEYALTSTACK.
There is a subtle difference if we do that, i.e. the existing
signaling handling user might not care or do not use PKEY/POE, and
overwriting PKRU/POR_EL0 and  sigframe every time will add extra CPU
time on the signaling delivery, which could be real-time sensitive.

Since I raised this comment on X86, I think raising it for ARM for
discussion would be ok,
it might make sense to have consistent API experience for arm/x86 here.

Thanks
-Jeff

[1] https://lore.kernel.org/lkml/CABi2SkWjF2Sicrr71=a6H8XJyf9q9L_Nd5FPp0CJ2mvB46Rrrg@xxxxxxxxxxxxxx/



> The x86 series also added kselftests to ensure that no spurious SIGSEGV
> occurs during signal delivery regardless of which pkey is accessible at
> the point where the signal is delivered. This series adapts those
> kselftests to allow running them on arm64 (patch 4-5). There is a
> dependency on Yury's PKEY_UNRESTRICTED patch [7] for patch 4
> specifically.
>
> Finally patch 2 is a clean-up following feedback on Joey's series [5].
>
> I have tested this series on arm64 and x86_64 (booting and running the
> protection_keys and pkey_sighandler_tests mm kselftests).
>
> - Kevin
>
> ---
>
> v2..v3:
> * Reordered patches (patch 1 is now the main patch).
> * Patch 1: compute por_enable_all with an explicit loop, based on
>   arch_max_pkey() (suggestion from Dave M).
> * Patch 4: improved naming, replaced global pkey reg value with inline
>   helper, made use of Yury's PKEY_UNRESTRICTED macro [7] (suggestions
>   from Dave H).
>
> v2: https://lore.kernel.org/linux-arm-kernel/20241023150511.3923558-1-kevin.brodsky@xxxxxxx/
>
> v1..v2:
> * In setup_rt_frame(), ensured that POR_EL0 is reset to its original
>   value if we fail to deliver the signal (addresses Catalin's concern [6]).
> * Renamed *unpriv_access* to *user_access* in patch 3 (suggestion from
>   Dave).
> * Made what patch 1-2 do explicit in the commit message body (suggestion
>   from Dave).
>
> v1: https://lore.kernel.org/linux-arm-kernel/20241017133909.3837547-1-kevin.brodsky@xxxxxxx/
>
> [1] https://lore.kernel.org/linux-arm-kernel/20240822151113.1479789-1-joey.gouly@xxxxxxx/
> [2] https://lore.kernel.org/lkml/20240802061318.2140081-1-aruna.ramakrishna@xxxxxxxxxx/
> [3] https://lore.kernel.org/lkml/CABi2SkWxNkP2O7ipkP67WKz0-LV33e5brReevTTtba6oKUfHRw@xxxxxxxxxxxxxx/
> [4] https://lore.kernel.org/linux-arm-kernel/87plns8owh.fsf@xxxxxxx/
> [5] https://lore.kernel.org/linux-arm-kernel/20241015114116.GA19334@willie-the-truck/
> [6] https://lore.kernel.org/linux-arm-kernel/Zw6D2waVyIwYE7wd@xxxxxxx/
> [7] https://lore.kernel.org/all/20241028090715.509527-2-yury.khrustalev@xxxxxxx/
>
> Cc: akpm@xxxxxxxxxxxxxxxxxxxx
> Cc: anshuman.khandual@xxxxxxx
> Cc: aruna.ramakrishna@xxxxxxxxxx
> Cc: broonie@xxxxxxxxxx
> Cc: catalin.marinas@xxxxxxx
> Cc: dave.hansen@xxxxxxxxxxxxxxx
> Cc: Dave.Martin@xxxxxxx
> Cc: jeffxu@xxxxxxxxxxxx
> Cc: joey.gouly@xxxxxxx
> Cc: keith.lucas@xxxxxxxxxx
> Cc: pierre.langlois@xxxxxxx
> Cc: shuah@xxxxxxxxxx
> Cc: sroettger@xxxxxxxxxx
> Cc: tglx@xxxxxxxxxxxxx
> Cc: will@xxxxxxxxxx
> Cc: yury.khrustalev@xxxxxxx
> Cc: linux-kselftest@xxxxxxxxxxxxxxx
> Cc: x86@xxxxxxxxxx
>
> Kevin Brodsky (5):
>   arm64: signal: Improve POR_EL0 handling to avoid uaccess failures
>   arm64: signal: Remove unnecessary check when saving POE state
>   arm64: signal: Remove unused macro
>   selftests/mm: Use generic pkey register manipulation
>   selftests/mm: Enable pkey_sighandler_tests on arm64
>
>  arch/arm64/kernel/signal.c                    |  95 ++++++++++++---
>  tools/testing/selftests/mm/Makefile           |   8 +-
>  tools/testing/selftests/mm/pkey-arm64.h       |   1 +
>  tools/testing/selftests/mm/pkey-x86.h         |   2 +
>  .../selftests/mm/pkey_sighandler_tests.c      | 115 ++++++++++++++----
>  5 files changed, 176 insertions(+), 45 deletions(-)
>
> --
> 2.43.0
>





[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux