Skip to content

Commit 12e967f

Browse files
Michal Hockotorvalds
authored andcommitted
mm: do not allow MADV_PAGEOUT for CoW pages
Jann has brought up a very interesting point [1]. While shared pages are excluded from MADV_PAGEOUT normally, CoW pages can be easily reclaimed that way. This can lead to all sorts of hard to debug problems. E.g. performance problems outlined by Daniel [2]. There are runtime environments where there is a substantial memory shared among security domains via CoW memory and a easy to reclaim way of that memory, which MADV_{COLD,PAGEOUT} offers, can lead to either performance degradation in for the parent process which might be more privileged or even open side channel attacks. The feasibility of the latter is not really clear to me TBH but there is no real reason for exposure at this stage. It seems there is no real use case to depend on reclaiming CoW memory via madvise at this stage so it is much easier to simply disallow it and this is what this patch does. Put it simply MADV_{PAGEOUT,COLD} can operate only on the exclusively owned memory which is a straightforward semantic. [1] http://lkml.kernel.org/r/CAG48ez0G3JkMq61gUmyQAaCq=_TwHbi1XKzWRooxZkv08PQKuw@mail.gmail.com [2] http://lkml.kernel.org/r/CAKOZueua_v8jHCpmEtTB6f3i9e2YnmX4mqdYVWhV4E=Z-n+zRQ@mail.gmail.com Fixes: 9c276cc ("mm: introduce MADV_COLD") Reported-by: Jann Horn <[email protected]> Signed-off-by: Michal Hocko <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Acked-by: Vlastimil Babka <[email protected]> Cc: Minchan Kim <[email protected]> Cc: Daniel Colascione <[email protected]> Cc: Dave Hansen <[email protected]> Cc: "Joel Fernandes (Google)" <[email protected]> Cc: <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Linus Torvalds <[email protected]>
1 parent e26733e commit 12e967f

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

mm/madvise.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,12 +335,14 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd,
335335
}
336336

337337
page = pmd_page(orig_pmd);
338+
339+
/* Do not interfere with other mappings of this page */
340+
if (page_mapcount(page) != 1)
341+
goto huge_unlock;
342+
338343
if (next - addr != HPAGE_PMD_SIZE) {
339344
int err;
340345

341-
if (page_mapcount(page) != 1)
342-
goto huge_unlock;
343-
344346
get_page(page);
345347
spin_unlock(ptl);
346348
lock_page(page);
@@ -426,6 +428,10 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd,
426428
continue;
427429
}
428430

431+
/* Do not interfere with other mappings of this page */
432+
if (page_mapcount(page) != 1)
433+
continue;
434+
429435
VM_BUG_ON_PAGE(PageTransCompound(page), page);
430436

431437
if (pte_young(ptent)) {

0 commit comments

Comments
 (0)