Re: [PATCH v10 04/12] mm, arm64: untag user pointers passed to memory syscalls

From: Dave Hansen
Date: Fri Feb 22 2019 - 18:07:50 EST


On 2/22/19 4:53 AM, Andrey Konovalov wrote:
> --- a/mm/mprotect.c
> +++ b/mm/mprotect.c
> @@ -578,6 +578,7 @@ static int do_mprotect_pkey(unsigned long start, size_t len,
> SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len,
> unsigned long, prot)
> {
> + start = untagged_addr(start);
> return do_mprotect_pkey(start, len, prot, -1);
> }
>
> @@ -586,6 +587,7 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len,
> SYSCALL_DEFINE4(pkey_mprotect, unsigned long, start, size_t, len,
> unsigned long, prot, int, pkey)
> {
> + start = untagged_addr(start);
> return do_mprotect_pkey(start, len, prot, pkey);
> }

This seems to have taken the approach of going as close as possible to
the syscall boundary and untagging the pointer there. I guess that's
OK, but it does lead to more churn than necessary. For instance, why
not just do the untagging in do_mprotect_pkey()?

I think that's an overall design question. I kinda asked the same thing
about patching call sites vs. VMA lookup functions.