|
@@ -268,13 +268,14 @@ void prep_compound_page(struct page *page, unsigned long order)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
int nr_pages = 1 << order;
|
|
int nr_pages = 1 << order;
|
|
|
|
+ struct page *p = page + 1;
|
|
|
|
|
|
set_compound_page_dtor(page, free_compound_page);
|
|
set_compound_page_dtor(page, free_compound_page);
|
|
set_compound_order(page, order);
|
|
set_compound_order(page, order);
|
|
__SetPageHead(page);
|
|
__SetPageHead(page);
|
|
- for (i = 1; i < nr_pages; i++) {
|
|
|
|
- struct page *p = page + i;
|
|
|
|
-
|
|
|
|
|
|
+ for (i = 1; i < nr_pages; i++, p++) {
|
|
|
|
+ if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0))
|
|
|
|
+ p = pfn_to_page(page_to_pfn(page) + i);
|
|
__SetPageTail(p);
|
|
__SetPageTail(p);
|
|
p->first_page = page;
|
|
p->first_page = page;
|
|
}
|
|
}
|
|
@@ -284,6 +285,7 @@ static void destroy_compound_page(struct page *page, unsigned long order)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
int nr_pages = 1 << order;
|
|
int nr_pages = 1 << order;
|
|
|
|
+ struct page *p = page + 1;
|
|
|
|
|
|
if (unlikely(compound_order(page) != order))
|
|
if (unlikely(compound_order(page) != order))
|
|
bad_page(page);
|
|
bad_page(page);
|
|
@@ -291,8 +293,9 @@ static void destroy_compound_page(struct page *page, unsigned long order)
|
|
if (unlikely(!PageHead(page)))
|
|
if (unlikely(!PageHead(page)))
|
|
bad_page(page);
|
|
bad_page(page);
|
|
__ClearPageHead(page);
|
|
__ClearPageHead(page);
|
|
- for (i = 1; i < nr_pages; i++) {
|
|
|
|
- struct page *p = page + i;
|
|
|
|
|
|
+ for (i = 1; i < nr_pages; i++, p++) {
|
|
|
|
+ if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0))
|
|
|
|
+ p = pfn_to_page(page_to_pfn(page) + i);
|
|
|
|
|
|
if (unlikely(!PageTail(p) |
|
|
if (unlikely(!PageTail(p) |
|
|
(p->first_page != page)))
|
|
(p->first_page != page)))
|