mm: fix pages delete bug by pagetrace

PD#153090: mm: fix page delete bug by pagetrace

This change fix another bug when page del many times.

Change-Id: I5fe2cc9d688c2e19e2a7d6c6960229e23f8b133c
Signed-off-by: tao zeng <tao.zeng@amlogic.com>
This commit is contained in:
tao zeng
2017-10-26 15:53:21 +08:00
committed by Jianxin Pan
parent 14fb1b4ec1
commit df67f6cb1a

View File

@@ -528,34 +528,37 @@ EXPORT_SYMBOL(reset_page_trace);
static void __init page_trace_pre_work(struct page *start_page,
unsigned long size)
{
int i, order, j, tailed = 0;
struct page *page, *last_page;
int i, order, page_free = 0, tailed = 0;
struct page *page, *last_page, *next_page;
size = PAGE_ALIGN(size);
size >>= PAGE_SHIFT;
page = start_page;
next_page = page;
last_page = page + size;
for (i = 0; i < size;) {
for (i = 0; i < size; i++) {
order = page_private(page);
pr_debug("page:%p, order:%d\n", page, order);
list_del(&page->lru); /* del from buddy */;
set_page_private(page, 0);
for (j = 0; j < ((1 << order) - 1); j++) {
if (i < size)
set_init_page_trace(page, 0, GFP_KERNEL);
page++;
i++;
if (!list_empty(&page->lru))
list_del(&page->lru); /* del from buddy */
if (next_page <= page) {
page_free += (1 << order);
next_page += (1 << order);
}
set_page_private(page, 0);
set_init_page_trace(page, 0, GFP_KERNEL);
page++;
}
/* free tailed pages */
while (page >= last_page) {
while (i < page_free) {
__free_pages(page, 0);
page--;
page++;
i++;
tailed++;
}
pr_info("%s, %d, tailed:%d\n", __func__, __LINE__, tailed);
pr_info("%s, %d, tailed:%d, page:%lx\n",
__func__, __LINE__, tailed, page_to_pfn(page));
}
#define SHOW_CNT 1024