Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1425907
| From | Wenwei Tao <wwtao0320@163.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [RFC PATCH 2/3] mm, page_alloc: get page migreate type again when related to highatomic |
| Date | 2016-06-19 03:50 +0200 |
| Message-ID | <rLA26-3B6-3@gated-at.bofh.it> (permalink) |
| References | <rLkTn-2gj-1@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Wenwei Tao <ww.tao0320@gmail.com>
The migratetype might get staled, pages might have become highatomic when
we try to free them to the allocator, we might not want to put highatomic
pages into other buddy lists, since they are reserved only for atomic high
order use. And also highatomic pages could have been unreserved,
put them into the hightatomic buddy list might exceed the limit of
highatomic pages. So get the pages migreate type again to put them into
the right lists.
Signed-off-by: Wenwei Tao <ww.tao0320@gmail.com>
---
mm/page_alloc.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 19f9e76..b72b771 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1079,9 +1079,11 @@ static void free_pcppages_bulk(struct zone *zone, int count,
int batch_free = 0;
unsigned long nr_scanned;
bool isolated_pageblocks;
+ bool reserved_highatomic;
spin_lock(&zone->lock);
isolated_pageblocks = has_isolate_pageblock(zone);
+ reserved_highatomic = !!zone->nr_reserved_highatomic;
nr_scanned = zone_page_state(zone, NR_PAGES_SCANNED);
if (nr_scanned)
__mod_zone_page_state(zone, NR_PAGES_SCANNED, -nr_scanned);
@@ -1118,8 +1120,10 @@ static void free_pcppages_bulk(struct zone *zone, int count,
mt = get_pcppage_migratetype(page);
/* MIGRATE_ISOLATE page should not go to pcplists */
VM_BUG_ON_PAGE(is_migrate_isolate(mt), page);
+ VM_BUG_ON_PAGE(mt == MIGRATE_HIGHATOMIC, page);
/* Pageblock could have been isolated meanwhile */
- if (unlikely(isolated_pageblocks))
+ if (unlikely(isolated_pageblocks ||
+ reserved_highatomic))
mt = get_pageblock_migratetype(page);
if (bulkfree_pcp_prepare(page))
@@ -1144,7 +1148,9 @@ static void free_one_page(struct zone *zone,
__mod_zone_page_state(zone, NR_PAGES_SCANNED, -nr_scanned);
if (unlikely(has_isolate_pageblock(zone) ||
- is_migrate_isolate(migratetype))) {
+ zone->nr_reserved_highatomic ||
+ is_migrate_isolate(migratetype) ||
+ migratetype == MIGRATE_HIGHATOMIC)) {
migratetype = get_pfnblock_migratetype(page, pfn);
}
__free_one_page(page, pfn, zone, order, migratetype);
--
1.8.3.1
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[RFC PATCH 1/3] mm, page_alloc: free HIGHATOMIC page directly to the allocator Wenwei Tao <wwtao0320@163.com> - 2016-06-18 11:40 +0200
Re: [RFC PATCH 1/3] mm, page_alloc: free HIGHATOMIC page directly to the allocator Vlastimil Babka <vbabka@suse.cz> - 2016-06-18 12:20 +0200
Fwd: [RFC PATCH 1/3] mm, page_alloc: free HIGHATOMIC page directly to the allocator Wenwei Tao <ww.tao0320@gmail.com> - 2016-06-19 04:50 +0200
[RFC PATCH 2/3] mm, page_alloc: get page migreate type again when related to highatomic Wenwei Tao <wwtao0320@163.com> - 2016-06-19 03:50 +0200
[RFC PATCH 3/3] mm, page_alloc: prevent merge freepages between highatomic and others Wenwei Tao <wwtao0320@163.com> - 2016-06-19 04:00 +0200
csiph-web