2019-07-15 11:03:33

by Joerg Roedel

[permalink] [raw]
Subject: [PATCH 1/3] x86/mm: Check for pfn instead of page in vmalloc_sync_one()

From: Joerg Roedel <[email protected]>

Do not require a struct page for the mapped memory location
because it might not exist. This can happen when an
ioremapped region is mapped with 2MB pages.

Signed-off-by: Joerg Roedel <[email protected]>
---
arch/x86/mm/fault.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 794f364cb882..4a4049f6d458 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -200,7 +200,7 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address)
if (!pmd_present(*pmd))
set_pmd(pmd, *pmd_k);
else
- BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k));
+ BUG_ON(pmd_pfn(*pmd) != pmd_pfn(*pmd_k));

return pmd_k;
}
--
2.17.1


2019-07-15 13:10:39

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH 1/3] x86/mm: Check for pfn instead of page in vmalloc_sync_one()

On Mon, 15 Jul 2019, Joerg Roedel wrote:

> From: Joerg Roedel <[email protected]>
>
> Do not require a struct page for the mapped memory location
> because it might not exist. This can happen when an
> ioremapped region is mapped with 2MB pages.
>
> Signed-off-by: Joerg Roedel <[email protected]>

Lacks a Fixes tag, hmm?

2019-07-15 15:45:54

by Jörg Rödel

[permalink] [raw]
Subject: Re: [PATCH 1/3] x86/mm: Check for pfn instead of page in vmalloc_sync_one()

On Mon, Jul 15, 2019 at 03:08:42PM +0200, Thomas Gleixner wrote:
> On Mon, 15 Jul 2019, Joerg Roedel wrote:
>
> > From: Joerg Roedel <[email protected]>
> >
> > Do not require a struct page for the mapped memory location
> > because it might not exist. This can happen when an
> > ioremapped region is mapped with 2MB pages.
> >
> > Signed-off-by: Joerg Roedel <[email protected]>
>
> Lacks a Fixes tag, hmm?

Yeah, right, the question is, which commit to put in there. The problem
results from two changes:

1) Introduction of !SHARED_KERNEL_PMD path in x86-32. In itself
this is not a problem, and the path was only enabled for
Xen-PV.

2) Huge IORemapings which use the PMD level. Also not a problem
by itself, but together with !SHARED_KERNEL_PMD problematic
because it requires to sync the PMD entries between all
page-tables, and that was not implemented.

Before PTI-x32 was merged this problem did not show up, maybe because
the 32-bit Xen-PV users did not trigger it. But with PTI-x32 all PAE
users run with !SHARED_KERNEL_PMD and the problem popped up.

For the last patch I put the PTI-x32 enablement commit in the fixes tag,
because that was the one that showed up during bisection. But more
correct would probably be

5d72b4fba40e ('x86, mm: support huge I/O mapping capability I/F')

Or do I miss something?

Regards,

Joerg


2019-07-15 18:49:08

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH 1/3] x86/mm: Check for pfn instead of page in vmalloc_sync_one()

On Mon, 15 Jul 2019, Joerg Roedel wrote:
> On Mon, Jul 15, 2019 at 03:08:42PM +0200, Thomas Gleixner wrote:
> > On Mon, 15 Jul 2019, Joerg Roedel wrote:
> >
> > > From: Joerg Roedel <[email protected]>
> > >
> > > Do not require a struct page for the mapped memory location
> > > because it might not exist. This can happen when an
> > > ioremapped region is mapped with 2MB pages.
> > >
> > > Signed-off-by: Joerg Roedel <[email protected]>
> >
> > Lacks a Fixes tag, hmm?
>
> Yeah, right, the question is, which commit to put in there. The problem
> results from two changes:
>
> 1) Introduction of !SHARED_KERNEL_PMD path in x86-32. In itself
> this is not a problem, and the path was only enabled for
> Xen-PV.
>
> 2) Huge IORemapings which use the PMD level. Also not a problem
> by itself, but together with !SHARED_KERNEL_PMD problematic
> because it requires to sync the PMD entries between all
> page-tables, and that was not implemented.
>
> Before PTI-x32 was merged this problem did not show up, maybe because
> the 32-bit Xen-PV users did not trigger it. But with PTI-x32 all PAE
> users run with !SHARED_KERNEL_PMD and the problem popped up.
>
> For the last patch I put the PTI-x32 enablement commit in the fixes tag,
> because that was the one that showed up during bisection. But more
> correct would probably be
>
> 5d72b4fba40e ('x86, mm: support huge I/O mapping capability I/F')

Looks about right.

Thanks,

tglx