Patch "x86/mm: Fix slow_virt_to_phys() for X86_PAE again" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
x86/mm: Fix slow_virt_to_phys() for X86_PAE again
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-mm-fix-slow_virt_to_phys-for-x86_pae-again.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
bf70e5513dfea29c3682e7eb3dbb45f0723bac09Mon Sep 17 00:00:00 2001
From: Dexuan Cui <[email protected]>
Date: Thu, 25 Feb 2016 01:58:12 -0800
Subject: x86/mm: Fix slow_virt_to_phys() for X86_PAE again
From: Dexuan Cui <[email protected]>
commit bf70e5513dfea29c3682e7eb3dbb45f0723bac09 upstream.
"d1cd12108346: x86, pageattr: Prevent overflow in slow_virt_to_phys() for X86_PAE" was unintentionally removed by the recent "34437e67a672: x86/mm: Fix slow_virt_to_phys() to handle large PAT bit".
And, the variable 'phys_addr' was defined as "unsigned long" by mistake -- it should be "phys_addr_t".
As a result, Hyper-V network driver in 32-PAE Linux guest can't work again.
--- arch/x86/mm/pageattr.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
arch/x86/mm/pageattr.c +10 -4
@@ -414,24 +414,30 @@ pmd_t *lookup_pmd_address(unsigned longphys_addr_t slow_virt_to_phys (void *__virt_addr) {unsigned long virt_addr = (unsigned long )__virt_addr; -unsigned long phys_addr, offset; +phys_addr_t phys_addr; +unsigned long offset;enum pg_level level;pte_t *pte; pte =lookup_address (virt_addr, &level);BUG_ON (!pte); +/* +* pXX_pfn() returns unsigned long, which must be cast to phys_addr_t +* before being left-shifted PAGE_SHIFT bits -- this trick is to +* make 32-PAE kernel work correctly. +*/ switch (level) {case PG_LEVEL_1G : - phys_addr =pud_pfn (*(pud_t *)pte) <<PAGE_SHIFT ; + phys_addr = (phys_addr_t )pud_pfn (*(pud_t *)pte) <<PAGE_SHIFT ; offset = virt_addr & ~PUD_PAGE_MASK ;break ;case PG_LEVEL_2M : - phys_addr =pmd_pfn (*(pmd_t *)pte) <<PAGE_SHIFT ; + phys_addr = (phys_addr_t )pmd_pfn (*(pmd_t *)pte) <<PAGE_SHIFT ; offset = virt_addr & ~PMD_PAGE_MASK ;break ;default : - phys_addr =pte_pfn (*pte) <<PAGE_SHIFT ; + phys_addr = (phys_addr_t )pte_pfn (*pte) <<PAGE_SHIFT ; offset = virt_addr & ~PAGE_MASK ; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/x86-mm-fix-slow_virt_to_phys-for-x86_pae-again.patch