Message ID | alpine.LSU.2.11.2008021204390.27773@eggly.anvils (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | khugepaged: collapse_pte_mapped_thp() flush the right range | expand |
On Sun, Aug 02, 2020 at 12:12:42PM -0700, Hugh Dickins wrote: > pmdp_collapse_flush() should be given the start address at which the huge > page is mapped, haddr: it was given addr, which at that point has been > used as a local variable, incremented to the end address of the extent. > > Found by source inspection while chasing a hugepage locking bug, which > I then could not explain by this. At first I thought this was very bad; > then saw that all of the page translations that were not flushed would > actually still point to the right pages afterwards, so harmless; then > realized that I know nothing of how different architectures and models > cache intermediate paging structures, so maybe it matters after all - > particularly since the page table concerned is immediately freed. > > Much easier to fix than to think about. > > Fixes: 27e1f8273113 ("khugepaged: enable collapse pmd for pte-mapped THP") > Signed-off-by: Hugh Dickins <hughd@google.com> > Cc: stable@vger.kernel.org # v5.4+ Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
--- 5.8-rc7/mm/khugepaged.c 2020-07-26 16:58:02.189038680 -0700 +++ linux/mm/khugepaged.c 2020-08-02 10:48:59.890925896 -0700 @@ -1502,7 +1502,7 @@ void collapse_pte_mapped_thp(struct mm_s /* step 4: collapse pmd */ ptl = pmd_lock(vma->vm_mm, pmd); - _pmd = pmdp_collapse_flush(vma, addr, pmd); + _pmd = pmdp_collapse_flush(vma, haddr, pmd); spin_unlock(ptl); mm_dec_nr_ptes(mm); pte_free(mm, pmd_pgtable(_pmd));
pmdp_collapse_flush() should be given the start address at which the huge page is mapped, haddr: it was given addr, which at that point has been used as a local variable, incremented to the end address of the extent. Found by source inspection while chasing a hugepage locking bug, which I then could not explain by this. At first I thought this was very bad; then saw that all of the page translations that were not flushed would actually still point to the right pages afterwards, so harmless; then realized that I know nothing of how different architectures and models cache intermediate paging structures, so maybe it matters after all - particularly since the page table concerned is immediately freed. Much easier to fix than to think about. Fixes: 27e1f8273113 ("khugepaged: enable collapse pmd for pte-mapped THP") Signed-off-by: Hugh Dickins <hughd@google.com> Cc: stable@vger.kernel.org # v5.4+ --- mm/khugepaged.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)