Re: [PATCH testsuite] tests/userfaultfd: handle __NR_userfaultfd not being defined

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

 



On Wed, Mar 24, 2021 at 1:41 PM Lokesh Gidra <lokeshgidra@xxxxxxxxxx> wrote:
>
>
>
> On Wed, Mar 24, 2021 at 5:56 PM Ondrej Mosnacek <omosnace@xxxxxxxxxx> wrote:
>>
>> On some old kernels (think RHEL-7) __NR_userfaultfd may not be defined
>> on certain arches, even though the <linux/userfaultfd.h> header is
>> available. To avoid build errors in such environments, abstract the
>> userfaultfd syscall into a helper function and make it fail with ENOSYS
>> when __NR_userfaultfd is not defined.
>>
>> Signed-off-by: Ondrej Mosnacek <omosnace@xxxxxxxxxx>
>
>
> Reviewed-by: Lokesh Gidra <lokeshgidra@xxxxxxxxxx>

Thanks!

>
> Thanks for this fix.
>
> BTW, does it make sense to keep this test enabled on old kernels which don't have SELinux support for userfaultfd?

No, it doesn't - that's why I made it return ENOSYS in this case,
which will lead to the test being skipped.

>>
>> ---
>>  tests/userfaultfd/userfaultfd.c | 17 ++++++++++++++---
>>  1 file changed, 14 insertions(+), 3 deletions(-)
>>
>> diff --git a/tests/userfaultfd/userfaultfd.c b/tests/userfaultfd/userfaultfd.c
>> index a283a83..dd3a9f3 100644
>> --- a/tests/userfaultfd/userfaultfd.c
>> +++ b/tests/userfaultfd/userfaultfd.c
>> @@ -19,7 +19,7 @@ int page_size;
>>
>>  void *fault_handler_thread(void *arg)
>>  {
>> -       long uffd = (long)arg;
>> +       int uffd = (int)(intptr_t)arg;
>>         struct uffd_msg msg = {0};
>>         struct uffdio_copy uffdio_copy = {0};
>>         ssize_t nread;
>> @@ -83,6 +83,16 @@ void *fault_handler_thread(void *arg)
>>         }
>>  }
>>
>> +int syscall_userfaultfd(int flags)
>> +{
>> +#ifdef __NR_userfaultfd
>> +       return (int)syscall(__NR_userfaultfd, flags);
>> +#else
>> +       errno = ENOSYS;
>> +       return -1;
>> +#endif
>> +}
>> +
>>  int main (int argc, char *argv[])
>>  {
>>         char *addr;
>> @@ -92,7 +102,7 @@ int main (int argc, char *argv[])
>>         pthread_t thr; // ID of thread that handles page faults
>>         ssize_t ret;
>>
>> -       long uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK);
>> +       int uffd = syscall_userfaultfd(O_CLOEXEC | O_NONBLOCK);
>>         if (uffd < 0) {
>>                 if (errno == ENOSYS) {
>>                         return 8;
>> @@ -159,7 +169,8 @@ int main (int argc, char *argv[])
>>         }
>>
>>         // Create a thread that will process the userfaultfd events
>> -       ret = pthread_create(&thr, NULL, fault_handler_thread, (void *) uffd);
>> +       ret = pthread_create(&thr, NULL, fault_handler_thread,
>> +                            (void *)(intptr_t)uffd);
>>         if (ret != 0) {
>>                 errno = ret;
>>                 perror("pthread_create");
>> --
>> 2.30.2
>>


-- 
Ondrej Mosnacek
Software Engineer, Linux Security - SELinux kernel
Red Hat, Inc.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux