From: Andrei Vagin <avagin@gmail.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: Dmitry Safonov <dima@arista.com>,
Catalin Marinas <catalin.marinas@arm.com>,
linux-kernel@vger.kernel.org,
Thomas Gleixner <tglx@linutronix.de>,
Vincenzo Frascino <vincenzo.frascino@arm.com>,
Will Deacon <will@kernel.org>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 1/6] arm64/vdso: use the fault callback to map vvar pages
Date: Thu, 18 Jun 2020 00:27:05 -0700 [thread overview]
Message-ID: <20200618072705.GA334958@gmail.com> (raw)
In-Reply-To: <20200616105920.GB11780@C02TD0UTHF1T.local>
On Tue, Jun 16, 2020 at 11:59:20AM +0100, Mark Rutland wrote:
> On Tue, Jun 16, 2020 at 12:55:40AM -0700, Andrei Vagin wrote:
> > This is required to support time namespaces where a time namespace data
> > page is different for each namespace.
>
> Can you please give a bit more of an introduction to the changes here?
> As-is, this doesn't give reviewers the necessary context to understand
> the change, nor does it justify it.
>
> Ideally, a commit message for this should look something like:
Mark, thank you for the review. I will write more details message and
fix this patch according with your other comments.
>
> | Currently the vdso has no awareness of time namespaces, which may
> | apply distinct offsets to processes in different namespaces. To handle
> | this within the vdso, we'll need to expose a per-namespace data page.
> |
> | As a preparatory step, this patch separates the vdso data page from
> | the code pages, and has it faulted in via its own fault callback.
> | Subsquent patches will extend this to support distinct pages per time
> | namespace.
>
> Otherwise, I have a few minor comments below.
>
> > Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
> > Reviewed-by: Dmitry Safonov <dima@arista.com>
> > Signed-off-by: Andrei Vagin <avagin@gmail.com>
> > ---
> > arch/arm64/kernel/vdso.c | 24 +++++++++++++++---------
> > 1 file changed, 15 insertions(+), 9 deletions(-)
> >
> > diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
> > index 4e016574bd91..b0aec4e8c9b4 100644
> > --- a/arch/arm64/kernel/vdso.c
> > +++ b/arch/arm64/kernel/vdso.c
> > @@ -108,28 +108,32 @@ static int __vdso_init(enum vdso_abi abi)
> > PAGE_SHIFT;
> >
> > /* Allocate the vDSO pagelist, plus a page for the data. */
> > - vdso_pagelist = kcalloc(vdso_info[abi].vdso_pages + 1,
> > + vdso_pagelist = kcalloc(vdso_info[abi].vdso_pages,
> > sizeof(struct page *),
> > GFP_KERNEL);
>
> The comment above is now stale. Can you please update it, or (event
> better) delete it entirely?
I will delete it.
>
> > if (vdso_pagelist == NULL)
> > return -ENOMEM;
> >
> > - /* Grab the vDSO data page. */
> > - vdso_pagelist[0] = phys_to_page(__pa_symbol(vdso_data));
> > -
> > -
> > /* Grab the vDSO code pages. */
> > pfn = sym_to_pfn(vdso_info[abi].vdso_code_start);
> >
> > for (i = 0; i < vdso_info[abi].vdso_pages; i++)
> > - vdso_pagelist[i + 1] = pfn_to_page(pfn + i);
> > + vdso_pagelist[i] = pfn_to_page(pfn + i);
> >
> > - vdso_info[abi].dm->pages = &vdso_pagelist[0];
> > - vdso_info[abi].cm->pages = &vdso_pagelist[1];
> > + vdso_info[abi].cm->pages = vdso_pagelist;
> >
> > return 0;
> > }
> >
> > +static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
> > + struct vm_area_struct *vma, struct vm_fault *vmf)
> > +{
> > + if (vmf->pgoff == 0)
> > + return vmf_insert_pfn(vma, vmf->address,
> > + sym_to_pfn(vdso_data));
> > + return VM_FAULT_SIGBUS;
> > +}
>
> This might look better as:
In the next patch, this function will handle more pages and this form
will look better.
>
> | if (vmf->pgoff != 0)
> | return VM_FAULT_SIGBUS;
> |
> | return vmf_insert_pfn(vma, vmf->address, sym_to_pfn(vdso_data));
>
> > +
> > static int __setup_additional_pages(enum vdso_abi abi,
> > struct mm_struct *mm,
> > struct linux_binprm *bprm,
> > @@ -150,7 +154,7 @@ static int __setup_additional_pages(enum vdso_abi abi,
> > }
> >
> > ret = _install_special_mapping(mm, vdso_base, PAGE_SIZE,
> > - VM_READ|VM_MAYREAD,
> > + VM_READ|VM_MAYREAD|VM_PFNMAP,
>
> This change needs to be explained in the commit message. WHy is it
> necessary, and why only so for the data page?
I will update the commit message. VM_PFNMAP is required to handle faults
from a vma fault callback. In this case, it is vvar_fault.
>
> Thanks,
> Mark.
>
> > vdso_info[abi].dm);
> > if (IS_ERR(ret))
> > goto up_fail;
> > @@ -209,6 +213,7 @@ static struct vm_special_mapping aarch32_vdso_maps[] = {
> > #ifdef CONFIG_COMPAT_VDSO
> > [AA32_MAP_VVAR] = {
> > .name = "[vvar]",
> > + .fault = vvar_fault,
> > },
> > [AA32_MAP_VDSO] = {
> > .name = "[vdso]",
> > @@ -376,6 +381,7 @@ enum aarch64_map {
> > static struct vm_special_mapping aarch64_vdso_maps[] __ro_after_init = {
> > [AA64_MAP_VVAR] = {
> > .name = "[vvar]",
> > + .fault = vvar_fault,
> > },
> > [AA64_MAP_VDSO] = {
> > .name = "[vdso]",
> > --
> > 2.24.1
> >
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: Andrei Vagin <avagin@gmail.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: linux-arm-kernel@lists.infradead.org,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
linux-kernel@vger.kernel.org,
Vincenzo Frascino <vincenzo.frascino@arm.com>,
Thomas Gleixner <tglx@linutronix.de>,
Dmitry Safonov <dima@arista.com>
Subject: Re: [PATCH 1/6] arm64/vdso: use the fault callback to map vvar pages
Date: Thu, 18 Jun 2020 00:27:05 -0700 [thread overview]
Message-ID: <20200618072705.GA334958@gmail.com> (raw)
In-Reply-To: <20200616105920.GB11780@C02TD0UTHF1T.local>
On Tue, Jun 16, 2020 at 11:59:20AM +0100, Mark Rutland wrote:
> On Tue, Jun 16, 2020 at 12:55:40AM -0700, Andrei Vagin wrote:
> > This is required to support time namespaces where a time namespace data
> > page is different for each namespace.
>
> Can you please give a bit more of an introduction to the changes here?
> As-is, this doesn't give reviewers the necessary context to understand
> the change, nor does it justify it.
>
> Ideally, a commit message for this should look something like:
Mark, thank you for the review. I will write more details message and
fix this patch according with your other comments.
>
> | Currently the vdso has no awareness of time namespaces, which may
> | apply distinct offsets to processes in different namespaces. To handle
> | this within the vdso, we'll need to expose a per-namespace data page.
> |
> | As a preparatory step, this patch separates the vdso data page from
> | the code pages, and has it faulted in via its own fault callback.
> | Subsquent patches will extend this to support distinct pages per time
> | namespace.
>
> Otherwise, I have a few minor comments below.
>
> > Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
> > Reviewed-by: Dmitry Safonov <dima@arista.com>
> > Signed-off-by: Andrei Vagin <avagin@gmail.com>
> > ---
> > arch/arm64/kernel/vdso.c | 24 +++++++++++++++---------
> > 1 file changed, 15 insertions(+), 9 deletions(-)
> >
> > diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
> > index 4e016574bd91..b0aec4e8c9b4 100644
> > --- a/arch/arm64/kernel/vdso.c
> > +++ b/arch/arm64/kernel/vdso.c
> > @@ -108,28 +108,32 @@ static int __vdso_init(enum vdso_abi abi)
> > PAGE_SHIFT;
> >
> > /* Allocate the vDSO pagelist, plus a page for the data. */
> > - vdso_pagelist = kcalloc(vdso_info[abi].vdso_pages + 1,
> > + vdso_pagelist = kcalloc(vdso_info[abi].vdso_pages,
> > sizeof(struct page *),
> > GFP_KERNEL);
>
> The comment above is now stale. Can you please update it, or (event
> better) delete it entirely?
I will delete it.
>
> > if (vdso_pagelist == NULL)
> > return -ENOMEM;
> >
> > - /* Grab the vDSO data page. */
> > - vdso_pagelist[0] = phys_to_page(__pa_symbol(vdso_data));
> > -
> > -
> > /* Grab the vDSO code pages. */
> > pfn = sym_to_pfn(vdso_info[abi].vdso_code_start);
> >
> > for (i = 0; i < vdso_info[abi].vdso_pages; i++)
> > - vdso_pagelist[i + 1] = pfn_to_page(pfn + i);
> > + vdso_pagelist[i] = pfn_to_page(pfn + i);
> >
> > - vdso_info[abi].dm->pages = &vdso_pagelist[0];
> > - vdso_info[abi].cm->pages = &vdso_pagelist[1];
> > + vdso_info[abi].cm->pages = vdso_pagelist;
> >
> > return 0;
> > }
> >
> > +static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
> > + struct vm_area_struct *vma, struct vm_fault *vmf)
> > +{
> > + if (vmf->pgoff == 0)
> > + return vmf_insert_pfn(vma, vmf->address,
> > + sym_to_pfn(vdso_data));
> > + return VM_FAULT_SIGBUS;
> > +}
>
> This might look better as:
In the next patch, this function will handle more pages and this form
will look better.
>
> | if (vmf->pgoff != 0)
> | return VM_FAULT_SIGBUS;
> |
> | return vmf_insert_pfn(vma, vmf->address, sym_to_pfn(vdso_data));
>
> > +
> > static int __setup_additional_pages(enum vdso_abi abi,
> > struct mm_struct *mm,
> > struct linux_binprm *bprm,
> > @@ -150,7 +154,7 @@ static int __setup_additional_pages(enum vdso_abi abi,
> > }
> >
> > ret = _install_special_mapping(mm, vdso_base, PAGE_SIZE,
> > - VM_READ|VM_MAYREAD,
> > + VM_READ|VM_MAYREAD|VM_PFNMAP,
>
> This change needs to be explained in the commit message. WHy is it
> necessary, and why only so for the data page?
I will update the commit message. VM_PFNMAP is required to handle faults
from a vma fault callback. In this case, it is vvar_fault.
>
> Thanks,
> Mark.
>
> > vdso_info[abi].dm);
> > if (IS_ERR(ret))
> > goto up_fail;
> > @@ -209,6 +213,7 @@ static struct vm_special_mapping aarch32_vdso_maps[] = {
> > #ifdef CONFIG_COMPAT_VDSO
> > [AA32_MAP_VVAR] = {
> > .name = "[vvar]",
> > + .fault = vvar_fault,
> > },
> > [AA32_MAP_VDSO] = {
> > .name = "[vdso]",
> > @@ -376,6 +381,7 @@ enum aarch64_map {
> > static struct vm_special_mapping aarch64_vdso_maps[] __ro_after_init = {
> > [AA64_MAP_VVAR] = {
> > .name = "[vvar]",
> > + .fault = vvar_fault,
> > },
> > [AA64_MAP_VDSO] = {
> > .name = "[vdso]",
> > --
> > 2.24.1
> >
next prev parent reply other threads:[~2020-06-18 7:27 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-16 7:55 [PATCH v4 0/6] arm64: add the time namespace support Andrei Vagin
2020-06-16 7:55 ` Andrei Vagin
2020-06-16 7:55 ` [PATCH 1/6] arm64/vdso: use the fault callback to map vvar pages Andrei Vagin
2020-06-16 7:55 ` Andrei Vagin
2020-06-16 10:59 ` Mark Rutland
2020-06-16 10:59 ` Mark Rutland
2020-06-18 7:27 ` Andrei Vagin [this message]
2020-06-18 7:27 ` Andrei Vagin
2020-06-16 7:55 ` [PATCH 2/6] arm64/vdso: Zap vvar pages when switching to a time namespace Andrei Vagin
2020-06-16 7:55 ` Andrei Vagin
2020-06-16 11:24 ` Mark Rutland
2020-06-16 11:24 ` Mark Rutland
2020-06-16 13:47 ` Dmitry Safonov
2020-06-16 13:47 ` Dmitry Safonov
2020-06-19 15:38 ` Christian Brauner
2020-06-19 15:38 ` Christian Brauner
2020-06-23 7:33 ` Andrei Vagin
2020-06-23 8:40 ` Christian Brauner
2020-06-16 7:55 ` [PATCH 3/6] arm64/vdso: Add time namespace page Andrei Vagin
2020-06-16 7:55 ` Andrei Vagin
2020-06-16 7:55 ` [PATCH 4/6] arm64/vdso: Handle faults on timens page Andrei Vagin
2020-06-16 7:55 ` Andrei Vagin
2020-06-16 7:55 ` [PATCH 5/6] arm64/vdso: Restrict splitting VVAR VMA Andrei Vagin
2020-06-16 7:55 ` Andrei Vagin
2020-06-16 7:55 ` [PATCH 6/6] arm64: enable time namespace support Andrei Vagin
2020-06-16 7:55 ` Andrei Vagin
-- strict thread matches above, loose matches on Subject: below --
2020-06-24 8:33 [PATCH v5 0/6] arm64: add the " Andrei Vagin
2020-06-24 8:33 ` [PATCH 1/6] arm64/vdso: use the fault callback to map vvar pages Andrei Vagin
2020-06-24 8:33 ` Andrei Vagin
2020-07-24 17:26 ` Catalin Marinas
2020-07-27 6:45 ` Andrei Vagin
2020-07-27 6:45 ` Andrei Vagin
2020-06-02 18:02 [PATCH RESEND v3 0/6] arm64: add the time namespace support Andrei Vagin
2020-06-02 18:02 ` [PATCH 1/6] arm64/vdso: use the fault callback to map vvar pages Andrei Vagin
2020-06-02 18:02 ` Andrei Vagin
2020-04-16 5:26 [PATCH v3 0/6] arm64: add the time namespace support Andrei Vagin
2020-04-16 5:26 ` [PATCH 1/6] arm64/vdso: use the fault callback to map vvar pages Andrei Vagin
2020-04-16 5:26 ` Andrei Vagin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200618072705.GA334958@gmail.com \
--to=avagin@gmail.com \
--cc=catalin.marinas@arm.com \
--cc=dima@arista.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=tglx@linutronix.de \
--cc=vincenzo.frascino@arm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.