MADV_FREE refactoring and fix KSM page
Get series with b4
b4 am [email protected]Versions newest first
- v1 Latest5 patches 20 repliesIn review
Patches in v1 No applies recorded yet
| # | Subject and files | Size | Replies | Applied |
|---|---|---|---|---|
| 1/5 | mm: MADV_FREE trivial clean upmm/ mm/ | +5 | 0 replies | |
| 2/5 | mm: skip huge zero page in MADV_FREEmm/ | +4 | 0 replies | |
| 3/5 | mm: clear PG_dirty to mark page freeablemm/ | +10 | 2 replies | |
| 4/5 | mm: simplify reclaim path for MADV_FREEinclude/ mm/ mm/ +2 more | +30 | 8 replies | |
| 5/5 | mm: mark stable page dirty in KSMmm/ | +12 | 2 replies |
Reviews trailers per patch
2 of 5 patches have a Reviewed-by or Acked-by.
| Patch | Hugh Dickins |
|---|---|
| 1/5 | |
| 2/5 | |
| 3/5 | A-b |
| 4/5 | A-b |
| 5/5 |
Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.
Cover letter [PATCH 0/5] MADV_FREE refactoring and fix KSM page
Hello, it's too late since I sent previos patch.
https://lkml.org/lkml/2015/6/3/37
This patch is alomost new compared to previos approach. I think this is more simple, clear and easy to review.
One thing I should notice is that I have tested this patch and couldn't find any critical problem so I rebased patchset onto recent mmotm(ie, mmotm-2015-10-15-15-20) to send formal patchset. Unfortunately, I start to see sudden discarding of the page we shouldn't do. IOW, application's valid anonymous page was disappeared suddenly.
When I look through THP changes, I think we could lose dirty bit of pte between freeze_page and unfreeze_page when we mark it as migration entry and restore it. So, I added below simple code without enough considering and cannot see the problem any more.
I hope it's good hint to find right fix this problem.
mm/huge_memory.c +3 -0
@@ -3138,6 +3138,9 @@ static void unfreeze_page_vma(struct vm_area_struct *vma, struct page *page,if (is_write_migration_entry (swp_entry)) entry =maybe_mkwrite (entry, vma); +if (PageDirty (page)) +SetPageDirty (page); +flush_dcache_page (page);set_pte_at (vma->vm_mm, address, pte + i, entry);
Although it fixes abvove problem, I can encounter below another bug in several hours.
BUG: Bad rss-counter state mm:ffff88007fc28000 idx:1 val:439 BUG: Bad rss-counter state mm:ffff88007fc28000 idx:2 val:73
Or
BUG: Bad rss-counter state mm:ffff88007fc28000 idx:1 val:512
It seems we are zapping THP page without decreasing MM_ANONPAGES and MM_SWAPENTS. Of course, it could be a bug of MADV_FREE and recent changes of THP reveals it. What I can say is I couldn't see any problem until mmotm-2015-10-06-16-30 so I guess there is some conflict with THP-refcount redesign of Kirill or it makes to reveal MADV_FREE's hidden bug.
I will hunt it down but I hope Kirill might catch it up earlier than me.
Major thing with this patch is two things.
1. Work with MADV_FREE on PG_dirty page.
So far, MADV_FREE doesn't work with page which is not in swap cache but has PG_dirty(ex, swapped-in page). Details are in [3/5].
2. Make MADV_FREE discard path simple
Current logic for discarding hinted page is really mess so [4/5] makes it simple and clean.
3. Fix with KSM page
A process can have KSM page which is no dirty bit in page table entry and no PG_dirty in page->flags so VM could discard it wrongly. [5/5] fixes it.
Minchan Kim (5):
[1/5] mm: MADV_FREE trivial clean up
[2/5] mm: skip huge zero page in MADV_FREE
[3/5] mm: clear PG_dirty to mark page freeable
[4/5] mm: simplify reclaim path for MADV_FREE
[5/5] mm: mark stable page dirty in KSM
include/linux/rmap.h | 6 +---- mm/huge_memory.c | 9 ++++---- mm/ksm.c | 12 ++++++++++ mm/madvise.c | 29 +++++++++++------------- mm/rmap.c | 46 +++++++------------------------------ mm/swap_state.c | 5 ++-- mm/vmscan.c | 64 ++++++++++++++++------------------------------------ 7 files changed, 60 insertions(+), 111 deletions(-)
Signature · 7 lines
1.9.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>