forked from mirrors/linux
		
	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
					
				
					 1 changed files with 9 additions and 9 deletions
				
			
		|  | @ -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 a new issue
	
	 Matthew Wilcox (Oracle)
						Matthew Wilcox (Oracle)