ioremap() supports pmd mappings on x86-PAE. However, kernel's pmd tables are not shared among processes on x86-PAE. Therefore, any update to sync'd pmd entries need re-syncing. Freeing a pte page also leads to a vmalloc fault and hits the BUG_ON in vmalloc_sync_one().
Disable free page handling on x86-PAE. pud_free_pmd_page() and pmd_free_pte_page() simply return 0 if a given pud/pmd entry is present. This assures that ioremap() does not update sync'd pmd entries at the cost of falling back to pte mappings.
Fixes: 28ee90fe6048 ("x86/mm: implement free pmd/pte page interfaces") Reported-by: Joerg Roedel joro@8bytes.org Signed-off-by: Toshi Kani toshi.kani@hpe.com Cc: Andrew Morton akpm@linux-foundation.org Cc: Michal Hocko mhocko@suse.com Cc: Thomas Gleixner tglx@linutronix.de Cc: Ingo Molnar mingo@redhat.com Cc: "H. Peter Anvin" hpa@zytor.com Cc: Joerg Roedel joro@8bytes.org Cc: stable@vger.kernel.org --- arch/x86/mm/pgtable.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index ffc8c13c50e4..08cdd7c13619 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -715,6 +715,7 @@ int pmd_clear_huge(pmd_t *pmd) return 0; }
+#ifdef CONFIG_X86_64 /** * pud_free_pmd_page - Clear pud entry and free pmd page. * @pud: Pointer to a PUD. @@ -762,4 +763,22 @@ int pmd_free_pte_page(pmd_t *pmd)
return 1; } + +#else /* !CONFIG_X86_64 */ + +int pud_free_pmd_page(pud_t *pud, unsigned long addr) +{ + return pud_none(*pud); +} + +/* + * Disable free page handling on x86-PAE. This assures that ioremap() + * does not update sync'd pmd entries. See vmalloc_sync_one(). + */ +int pmd_free_pte_page(pmd_t *pmd, unsigned long addr) +{ + return pmd_none(*pmd); +} + +#endif /* CONFIG_X86_64 */ #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
Hi Toshi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on arm64/for-next/core] [also build test ERROR on v4.17-rc5 next-20180515] [cannot apply to tip/x86/core] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Toshi-Kani/fix-free-pmd-pte-page-ha... base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core config: i386-randconfig-x013-201819 (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386
Note: the linux-review/Toshi-Kani/fix-free-pmd-pte-page-handlings-on-x86/20180516-183317 HEAD 93944422fcef9bfadf22e345c1d7a34723cc3203 builds fine. It only hurts bisectibility.
All errors (new ones prefixed by >>):
arch/x86/mm/pgtable.c:757:5: error: conflicting types for 'pud_free_pmd_page'
int pud_free_pmd_page(pud_t *pud, unsigned long addr) ^~~~~~~~~~~~~~~~~ In file included from arch/x86/include/asm/pgtable.h:1301:0, from include/linux/memremap.h:8, from include/linux/mm.h:27, from arch/x86/mm/pgtable.c:2: include/asm-generic/pgtable.h:1022:5: note: previous declaration of 'pud_free_pmd_page' was here int pud_free_pmd_page(pud_t *pud); ^~~~~~~~~~~~~~~~~
arch/x86/mm/pgtable.c:766:5: error: conflicting types for 'pmd_free_pte_page'
int pmd_free_pte_page(pmd_t *pmd, unsigned long addr) ^~~~~~~~~~~~~~~~~ In file included from arch/x86/include/asm/pgtable.h:1301:0, from include/linux/memremap.h:8, from include/linux/mm.h:27, from arch/x86/mm/pgtable.c:2: include/asm-generic/pgtable.h:1023:5: note: previous declaration of 'pmd_free_pte_page' was here int pmd_free_pte_page(pmd_t *pmd); ^~~~~~~~~~~~~~~~~
vim +/pud_free_pmd_page +757 arch/x86/mm/pgtable.c
756
757 int pud_free_pmd_page(pud_t *pud, unsigned long addr)
758 { 759 return pud_none(*pud); 760 } 761 762 /* 763 * Disable free page handling on x86-PAE. This assures that ioremap() 764 * does not update sync'd pmd entries. See vmalloc_sync_one(). 765 */
766 int pmd_free_pte_page(pmd_t *pmd, unsigned long addr)
767 { 768 return pmd_none(*pmd); 769 } 770
--- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
On Wed, 2018-05-16 at 19:00 +0800, kbuild test robot wrote:
Hi Toshi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on arm64/for-next/core] [also build test ERROR on v4.17-rc5 next-20180515] [cannot apply to tip/x86/core] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Toshi-Kani/fix-free-pmd-pte-page-ha... base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core config: i386-randconfig-x013-201819 (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386
Note: the linux-review/Toshi-Kani/fix-free-pmd-pte-page-handlings-on-x86/20180516-183317 HEAD 93944422fcef9bfadf22e345c1d7a34723cc3203 builds fine. It only hurts bisectibility.
All errors (new ones prefixed by >>):
arch/x86/mm/pgtable.c:757:5: error: conflicting types for 'pud_free_pmd_page'
int pud_free_pmd_page(pud_t *pud, unsigned long addr) ^~~~~~~~~~~~~~~~~
Thanks for catching this! Patch reordering caused this. Will fix. -Toshi
linux-stable-mirror@lists.linaro.org