diff mbox series

[v2] syscalls/userfaultfd01: add hint about unprivileged_userfaultfd

Message ID 1576641763-18305-1-git-send-email-xuyang2018.jy@cn.fujitsu.com
State Accepted, archived
Headers show
Series [v2] syscalls/userfaultfd01: add hint about unprivileged_userfaultfd | expand

Commit Message

Yang Xu Dec. 18, 2019, 4:02 a.m. UTC
Since commit cefdca0a86be ("userfaultfd/sysctl: add vm.unprivileged_userfaultfd").
, it adds a global sysctl knob "vm.unprivileged_userfaultfd" to control whether
unprivileged users can use the userfaultfd system calls. Set this to 1 to allow
unprivileged users to use the userfaultfd system calls, or set this to 0 to
restrict userfaultfd to only privileged users (with SYS_CAP_PTRACE capability). The
default value is 1. Add hint about it.

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 .../syscalls/userfaultfd/userfaultfd01.c      | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

Comments

Yang Xu Jan. 6, 2020, 7:32 a.m. UTC | #1
Hi
Ping.
> Since commit cefdca0a86be ("userfaultfd/sysctl: add vm.unprivileged_userfaultfd").
> , it adds a global sysctl knob "vm.unprivileged_userfaultfd" to control whether
> unprivileged users can use the userfaultfd system calls. Set this to 1 to allow
> unprivileged users to use the userfaultfd system calls, or set this to 0 to
> restrict userfaultfd to only privileged users (with SYS_CAP_PTRACE capability). The
> default value is 1. Add hint about it.
> 
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
>   .../syscalls/userfaultfd/userfaultfd01.c      | 19 +++++++++++++------
>   1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> index a5e142209..4e178b4f8 100644
> --- a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> +++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> @@ -82,12 +82,19 @@ static void run(void)
>   
>   	set_pages();
>   
> -	uffd = sys_userfaultfd(O_CLOEXEC | O_NONBLOCK);
> -
> -	if (uffd == -1)
> -		tst_brk(TBROK | TERRNO,
> -			"Could not create userfault file descriptor");
> -
> +	TEST(sys_userfaultfd(O_CLOEXEC | O_NONBLOCK));
> +
> +	if (TST_RET == -1) {
> +		if (TST_ERR == EPERM) {
> +			tst_res(TCONF, "Hint: check /proc/sys/vm/unprivileged_userfaultfd");
> +			tst_brk(TCONF | TTERRNO,
> +				"userfaultfd() requires CAP_SYS_PTRACE on this system");
> +		} else
> +			tst_brk(TBROK | TTERRNO,
> +				"Could not create userfault file descriptor");
> +	}
> +
> +	uffd = TST_RET;
>   	uffdio_api.api = UFFD_API;
>   	uffdio_api.features = 0;
>   	SAFE_IOCTL(uffd, UFFDIO_API, &uffdio_api);
>
Li Wang Jan. 6, 2020, 8:06 a.m. UTC | #2
On Wed, Dec 18, 2019 at 12:02 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com>
wrote:

> Since commit cefdca0a86be ("userfaultfd/sysctl: add
> vm.unprivileged_userfaultfd").
> , it adds a global sysctl knob "vm.unprivileged_userfaultfd" to control
> whether
> unprivileged users can use the userfaultfd system calls. Set this to 1 to
> allow
> unprivileged users to use the userfaultfd system calls, or set this to 0 to
> restrict userfaultfd to only privileged users (with SYS_CAP_PTRACE
> capability). The
> default value is 1. Add hint about it.
>

Can we do the "vm.unprivileged_userfaultfd" check in the setup() and do set
to 1 if it exists?
And maybe we need more tests for the global sysctl knob
"vm.unprivileged_userfaultfd".


> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
>  .../syscalls/userfaultfd/userfaultfd01.c      | 19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> index a5e142209..4e178b4f8 100644
> --- a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> +++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> @@ -82,12 +82,19 @@ static void run(void)
>
>         set_pages();
>
> -       uffd = sys_userfaultfd(O_CLOEXEC | O_NONBLOCK);
> -
> -       if (uffd == -1)
> -               tst_brk(TBROK | TERRNO,
> -                       "Could not create userfault file descriptor");
> -
> +       TEST(sys_userfaultfd(O_CLOEXEC | O_NONBLOCK));
> +
> +       if (TST_RET == -1) {
> +               if (TST_ERR == EPERM) {
> +                       tst_res(TCONF, "Hint: check
> /proc/sys/vm/unprivileged_userfaultfd");
> +                       tst_brk(TCONF | TTERRNO,
> +                               "userfaultfd() requires CAP_SYS_PTRACE on
> this system");
> +               } else
> +                       tst_brk(TBROK | TTERRNO,
> +                               "Could not create userfault file
> descriptor");
> +       }
> +
> +       uffd = TST_RET;
>         uffdio_api.api = UFFD_API;
>         uffdio_api.features = 0;
>         SAFE_IOCTL(uffd, UFFDIO_API, &uffdio_api);
> --
> 2.18.0
>
>
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>
>
Yang Xu Jan. 6, 2020, 9:10 a.m. UTC | #3
Hi Li
> 
> 
> On Wed, Dec 18, 2019 at 12:02 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com 
> <mailto:xuyang2018.jy@cn.fujitsu.com>> wrote:
> 
>     Since commit cefdca0a86be ("userfaultfd/sysctl: add
>     vm.unprivileged_userfaultfd").
>     , it adds a global sysctl knob "vm.unprivileged_userfaultfd" to
>     control whether
>     unprivileged users can use the userfaultfd system calls. Set this to
>     1 to allow
>     unprivileged users to use the userfaultfd system calls, or set this
>     to 0 to
>     restrict userfaultfd to only privileged users (with SYS_CAP_PTRACE
>     capability). The
>     default value is 1. Add hint about it.
> 
> 
> Can we do the "vm.unprivileged_userfaultfd" check in the setup() and do 
> set to 1 if it exists?
I remembered Jan Stancek has a patch about bpf hint about 
unprivileged_bpf_disabled, I do as same as that patch did.

Also, month agos about acct02 discussion, Cyril points about adjusting
the threshold value of resume and suppend to make case passes.

So, I have a question that we have unified standards about these cases
(bpf, acct02, affected by sysctl)? Report TCONF or modify argument to
make case passes?

@Cyril and @Jan Stancek What do you think about it?

> And maybe we need more tests for the global sysctl knob 
> "vm.unprivileged_userfaultfd".Eeven though we don't have case to test unprivileged_bpf_disabled. I 
still think testing unprivileged_userfaultfd is meaningful and we can 
begin with it.

Best Regards
Yang Xu
> 
> 
>     Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com
>     <mailto:xuyang2018.jy@cn.fujitsu.com>>
>     ---
>       .../syscalls/userfaultfd/userfaultfd01.c      | 19 +++++++++++++------
>       1 file changed, 13 insertions(+), 6 deletions(-)
> 
>     diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
>     b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
>     index a5e142209..4e178b4f8 100644
>     --- a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
>     +++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
>     @@ -82,12 +82,19 @@ static void run(void)
> 
>              set_pages();
> 
>     -       uffd = sys_userfaultfd(O_CLOEXEC | O_NONBLOCK);
>     -
>     -       if (uffd == -1)
>     -               tst_brk(TBROK | TERRNO,
>     -                       "Could not create userfault file descriptor");
>     -
>     +       TEST(sys_userfaultfd(O_CLOEXEC | O_NONBLOCK));
>     +
>     +       if (TST_RET == -1) {
>     +               if (TST_ERR == EPERM) {
>     +                       tst_res(TCONF, "Hint: check
>     /proc/sys/vm/unprivileged_userfaultfd");
>     +                       tst_brk(TCONF | TTERRNO,
>     +                               "userfaultfd() requires
>     CAP_SYS_PTRACE on this system");
>     +               } else
>     +                       tst_brk(TBROK | TTERRNO,
>     +                               "Could not create userfault file
>     descriptor");
>     +       }
>     +
>     +       uffd = TST_RET;
>              uffdio_api.api = UFFD_API;
>              uffdio_api.features = 0;
>              SAFE_IOCTL(uffd, UFFDIO_API, &uffdio_api);
>     -- 
>     2.18.0
> 
> 
> 
> 
>     -- 
>     Mailing list info: https://lists.linux.it/listinfo/ltp
> 
> 
> 
> -- 
> Regards,
> Li Wang
Li Wang Jan. 6, 2020, 9:32 a.m. UTC | #4
On Mon, Jan 6, 2020 at 5:10 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com> wrote:

> Hi Li
> >
> >
> > On Wed, Dec 18, 2019 at 12:02 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com
> > <mailto:xuyang2018.jy@cn.fujitsu.com>> wrote:
> >
> >     Since commit cefdca0a86be ("userfaultfd/sysctl: add
> >     vm.unprivileged_userfaultfd").
> >     , it adds a global sysctl knob "vm.unprivileged_userfaultfd" to
> >     control whether
> >     unprivileged users can use the userfaultfd system calls. Set this to
> >     1 to allow
> >     unprivileged users to use the userfaultfd system calls, or set this
> >     to 0 to
> >     restrict userfaultfd to only privileged users (with SYS_CAP_PTRACE
> >     capability). The
> >     default value is 1. Add hint about it.
> >
> >
> > Can we do the "vm.unprivileged_userfaultfd" check in the setup() and do
> > set to 1 if it exists?
> I remembered Jan Stancek has a patch about bpf hint about
> unprivileged_bpf_disabled, I do as same as that patch did.
>

I just echo the nob file "unprivileged_bpf_disabled" and find it can't be
changed at runtime. So if the "vm.unprivileged_userfaultfd" is like this
behavior too, probably we can only do TCONF as your original patch. AnywayI
will take a close look at the kernel commit later.

# cat /proc/sys/kernel/unprivileged_bpf_disabled
1
# echo 0 > /proc/sys/kernel/unprivileged_bpf_disabled
-bash: echo: write error: Invalid argument



>
> Also, month agos about acct02 discussion, Cyril points about adjusting
> the threshold value of resume and suppend to make case passes.
>
> So, I have a question that we have unified standards about these cases
> (bpf, acct02, affected by sysctl)? Report TCONF or modify argument to
> make case passes?
>
> @Cyril and @Jan Stancek What do you think about it?
>
> > And maybe we need more tests for the global sysctl knob
> > "vm.unprivileged_userfaultfd".Eeven though we don't have case to test
> unprivileged_bpf_disabled. I
> still think testing unprivileged_userfaultfd is meaningful and we can
> begin with it.
>
> Best Regards
> Yang Xu
> >
> >
> >     Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com
> >     <mailto:xuyang2018.jy@cn.fujitsu.com>>
> >     ---
> >       .../syscalls/userfaultfd/userfaultfd01.c      | 19
> +++++++++++++------
> >       1 file changed, 13 insertions(+), 6 deletions(-)
> >
> >     diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> >     b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> >     index a5e142209..4e178b4f8 100644
> >     --- a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> >     +++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
> >     @@ -82,12 +82,19 @@ static void run(void)
> >
> >              set_pages();
> >
> >     -       uffd = sys_userfaultfd(O_CLOEXEC | O_NONBLOCK);
> >     -
> >     -       if (uffd == -1)
> >     -               tst_brk(TBROK | TERRNO,
> >     -                       "Could not create userfault file
> descriptor");
> >     -
> >     +       TEST(sys_userfaultfd(O_CLOEXEC | O_NONBLOCK));
> >     +
> >     +       if (TST_RET == -1) {
> >     +               if (TST_ERR == EPERM) {
> >     +                       tst_res(TCONF, "Hint: check
> >     /proc/sys/vm/unprivileged_userfaultfd");
> >     +                       tst_brk(TCONF | TTERRNO,
> >     +                               "userfaultfd() requires
> >     CAP_SYS_PTRACE on this system");
> >     +               } else
> >     +                       tst_brk(TBROK | TTERRNO,
> >     +                               "Could not create userfault file
> >     descriptor");
> >     +       }
> >     +
> >     +       uffd = TST_RET;
> >              uffdio_api.api = UFFD_API;
> >              uffdio_api.features = 0;
> >              SAFE_IOCTL(uffd, UFFDIO_API, &uffdio_api);
> >     --
> >     2.18.0
> >
> >
> >
> >
> >     --
> >     Mailing list info: https://lists.linux.it/listinfo/ltp
> >
> >
> >
> > --
> > Regards,
> > Li Wang
>
>
>
Li Wang Jan. 7, 2020, 4:56 a.m. UTC | #5
Hi Yang,

On Mon, Jan 6, 2020 at 5:10 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com> wrote:

> ...
> > Can we do the "vm.unprivileged_userfaultfd" check in the setup() and do
> > set to 1 if it exists?
> I remembered Jan Stancek has a patch about bpf hint about
> unprivileged_bpf_disabled, I do as same as that patch did.
>
> Also, month agos about acct02 discussion, Cyril points about adjusting
> the threshold value of resume and suppend to make case passes.
>
> So, I have a question that we have unified standards about these cases
> (bpf, acct02, affected by sysctl)? Report TCONF or modify argument to
> make case passes?
>

After thinking over, to report TCONF is the wise method here because this
test might run with an unprivileged user and it can not modify the knob
"vm.unprivileged_userfaultfd".

Sorry and now I pull back my last comment.

Reviewed-by: Li Wang <liwang@redhat.com>
Jan Stancek Jan. 7, 2020, 8:49 a.m. UTC | #6
----- Original Message -----
> 
> After thinking over, to report TCONF is the wise method here because this
> test might run with an unprivileged user and it can not modify the knob
> "vm.unprivileged_userfaultfd".
> 
> Sorry and now I pull back my last comment.
> 
> Reviewed-by: Li Wang <liwang@redhat.com>

Pushed, thanks.
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
index a5e142209..4e178b4f8 100644
--- a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
+++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
@@ -82,12 +82,19 @@  static void run(void)
 
 	set_pages();
 
-	uffd = sys_userfaultfd(O_CLOEXEC | O_NONBLOCK);
-
-	if (uffd == -1)
-		tst_brk(TBROK | TERRNO,
-			"Could not create userfault file descriptor");
-
+	TEST(sys_userfaultfd(O_CLOEXEC | O_NONBLOCK));
+
+	if (TST_RET == -1) {
+		if (TST_ERR == EPERM) {
+			tst_res(TCONF, "Hint: check /proc/sys/vm/unprivileged_userfaultfd");
+			tst_brk(TCONF | TTERRNO,
+				"userfaultfd() requires CAP_SYS_PTRACE on this system");
+		} else
+			tst_brk(TBROK | TTERRNO,
+				"Could not create userfault file descriptor");
+	}
+
+	uffd = TST_RET;
 	uffdio_api.api = UFFD_API;
 	uffdio_api.features = 0;
 	SAFE_IOCTL(uffd, UFFDIO_API, &uffdio_api);