zsmalloc: Stop using slab fields in struct page
The ->freelist and ->units members of struct page are for the use of slab only. I'm not particularly familiar with zsmalloc, so generate the same code by using page->index to store 'page' (page->index and page->freelist are at the same offset in struct page). This should be cleaned up properly at some point by somebody who is familiar with zsmalloc. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Acked-by: Minchan Kim <minchan@kernel.org> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Nitin Gupta <ngupta@vflare.org> Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
This commit is contained in:
parent
9c01e9af17
commit
ffedd09fa9
@ -17,10 +17,10 @@
|
|||||||
*
|
*
|
||||||
* Usage of struct page fields:
|
* Usage of struct page fields:
|
||||||
* page->private: points to zspage
|
* page->private: points to zspage
|
||||||
* page->freelist(index): links together all component pages of a zspage
|
* page->index: links together all component pages of a zspage
|
||||||
* For the huge page, this is always 0, so we use this field
|
* For the huge page, this is always 0, so we use this field
|
||||||
* to store handle.
|
* to store handle.
|
||||||
* page->units: first object offset in a subpage of zspage
|
* page->page_type: first object offset in a subpage of zspage
|
||||||
*
|
*
|
||||||
* Usage of struct page flags:
|
* Usage of struct page flags:
|
||||||
* PG_private: identifies the first component page
|
* PG_private: identifies the first component page
|
||||||
@ -489,12 +489,12 @@ static inline struct page *get_first_page(struct zspage *zspage)
|
|||||||
|
|
||||||
static inline int get_first_obj_offset(struct page *page)
|
static inline int get_first_obj_offset(struct page *page)
|
||||||
{
|
{
|
||||||
return page->units;
|
return page->page_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void set_first_obj_offset(struct page *page, int offset)
|
static inline void set_first_obj_offset(struct page *page, int offset)
|
||||||
{
|
{
|
||||||
page->units = offset;
|
page->page_type = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int get_freeobj(struct zspage *zspage)
|
static inline unsigned int get_freeobj(struct zspage *zspage)
|
||||||
@ -827,7 +827,7 @@ static struct page *get_next_page(struct page *page)
|
|||||||
if (unlikely(PageHugeObject(page)))
|
if (unlikely(PageHugeObject(page)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return page->freelist;
|
return (struct page *)page->index;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -901,7 +901,7 @@ static void reset_page(struct page *page)
|
|||||||
set_page_private(page, 0);
|
set_page_private(page, 0);
|
||||||
page_mapcount_reset(page);
|
page_mapcount_reset(page);
|
||||||
ClearPageHugeObject(page);
|
ClearPageHugeObject(page);
|
||||||
page->freelist = NULL;
|
page->index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int trylock_zspage(struct zspage *zspage)
|
static int trylock_zspage(struct zspage *zspage)
|
||||||
@ -1027,7 +1027,7 @@ static void create_page_chain(struct size_class *class, struct zspage *zspage,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate individual pages and link them together as:
|
* Allocate individual pages and link them together as:
|
||||||
* 1. all pages are linked together using page->freelist
|
* 1. all pages are linked together using page->index
|
||||||
* 2. each sub-page point to zspage using page->private
|
* 2. each sub-page point to zspage using page->private
|
||||||
*
|
*
|
||||||
* we set PG_private to identify the first page (i.e. no other sub-page
|
* we set PG_private to identify the first page (i.e. no other sub-page
|
||||||
@ -1036,7 +1036,7 @@ static void create_page_chain(struct size_class *class, struct zspage *zspage,
|
|||||||
for (i = 0; i < nr_pages; i++) {
|
for (i = 0; i < nr_pages; i++) {
|
||||||
page = pages[i];
|
page = pages[i];
|
||||||
set_page_private(page, (unsigned long)zspage);
|
set_page_private(page, (unsigned long)zspage);
|
||||||
page->freelist = NULL;
|
page->index = 0;
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
zspage->first_page = page;
|
zspage->first_page = page;
|
||||||
SetPagePrivate(page);
|
SetPagePrivate(page);
|
||||||
@ -1044,7 +1044,7 @@ static void create_page_chain(struct size_class *class, struct zspage *zspage,
|
|||||||
class->pages_per_zspage == 1))
|
class->pages_per_zspage == 1))
|
||||||
SetPageHugeObject(page);
|
SetPageHugeObject(page);
|
||||||
} else {
|
} else {
|
||||||
prev_page->freelist = page;
|
prev_page->index = (unsigned long)page;
|
||||||
}
|
}
|
||||||
prev_page = page;
|
prev_page = page;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user