zsmalloc: fix obj_to_head use page_private(page) as value but not pointer
In obj_malloc(): if (!class->huge) /* record handle in the header of allocated chunk */ link->handle = handle; else /* record handle in first_page->private */ set_page_private(first_page, handle); In the hugepage we save handle to private directly. But in obj_to_head(): if (class->huge) { VM_BUG_ON(!is_first_page(page)); return *(unsigned long *)page_private(page); } else return *(unsigned long *)obj; It is used as a pointer. The reason why there is no problem until now is huge-class page is born with ZS_FULL so it can't be migrated. However, we need this patch for future work: "VM-aware zsmalloced page migration" to reduce external fragmentation. Signed-off-by: Hui Zhu <zhuhui@xiaomi.com> Acked-by: Minchan Kim <minchan@kernel.org> Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8f958c98f2
commit
12a7bfad58
|
@ -825,7 +825,7 @@ static unsigned long obj_to_head(struct size_class *class, struct page *page,
|
|||
{
|
||||
if (class->huge) {
|
||||
VM_BUG_ON(!is_first_page(page));
|
||||
return *(unsigned long *)page_private(page);
|
||||
return page_private(page);
|
||||
} else
|
||||
return *(unsigned long *)obj;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue