On 07/17/2018 06:49 AM, Ram Pai wrote:
> Generally the signal handler restores the state of the pkey register
> before returning. However there are times when the read/write operation
> can legitamely fail without invoking the signal handler.  Eg: A
> sys_read() operaton to a write-protected page should be disallowed.  In
> such a case the state of the pkey register is not restored to its
> original state.  Test cases may not remember to restoring the key
> register state. During cleanup generically restore the key permissions.

This would, indeed be a good thing to do for a well-behaved application.

But, for selftests, why does it matter what state we leave the key in?
Doesn't the test itself need to establish permissions?  Don't we *do*
that at pkey_alloc() anyway?

What problem does this solve?

> diff --git a/tools/testing/selftests/vm/protection_keys.c 
> b/tools/testing/selftests/vm/protection_keys.c
> index 8a6afdd..ea3cf04 100644
> --- a/tools/testing/selftests/vm/protection_keys.c
> +++ b/tools/testing/selftests/vm/protection_keys.c
> @@ -1476,8 +1476,13 @@ void run_tests_once(void)
>               pkey_tests[test_nr](ptr, pkey);
>               dprintf1("freeing test memory: %p\n", ptr);
>               free_pkey_malloc(ptr);
> +
> +             /* restore the permission on the key after use */
> +             pkey_access_allow(pkey);
> +             pkey_write_allow(pkey);
>               sys_pkey_free(pkey);
>  
> +
>               dprintf1("pkey_faults: %d\n", pkey_faults);
>               dprintf1("orig_pkey_faults: %d\n", orig_pkey_faults);



Reply via email to