mm: stop leaking PageTables
4.10-rc loadtest (even on x86, and even without THPCache) fails with
"fork: Cannot allocate memory" or some such; and /proc/meminfo shows
Commit 953c66c2b22a ("mm: THP page cache support for ppc64") that got
merged in rc1 removed the freeing of an unused preallocated pagetable
after do_fault_around() has called map_pages().
This is usually a good optimization, so that the followup doesn't have
to reallocate one; but it's not sufficient to shift the freeing into
alloc_set_pte(), since there are failure cases (most commonly
VM_FAULT_RETRY) which never reach finish_fault().
Check and free it at the outer level in do_fault(), then we don't need
to worry in alloc_set_pte(), and can restore that to how it was (I
cannot find any reason to pte_free() under lock as it was doing).
And fix a separate pagetable leak, or crash, introduced by the same
change, that could only show up on some ppc64: why does do_set_pmd()'s
failure case attempt to withdraw a pagetable when it never deposited
one, at the same time overwriting (so leaking) the vmf->prealloc_pte?
Residue of an earlier implementation, perhaps? Delete it.
Fixes: 953c66c2b22a ("mm: THP page cache support for ppc64")
Cc: Aneesh Kumar K.V <firstname.lastname@example.org>
Cc: Kirill A. Shutemov <email@example.com>
Cc: Michael Ellerman <firstname.lastname@example.org>
Cc: Benjamin Herrenschmidt <email@example.com>
Cc: Michael Neuling <firstname.lastname@example.org>
Cc: Paul Mackerras <email@example.com>
Cc: Balbir Singh <firstname.lastname@example.org>
Cc: Andrew Morton <email@example.com>
Signed-off-by: Hugh Dickins <firstname.lastname@example.org>
Signed-off-by: Linus Torvalds <email@example.com>
1 file changed