Re: [PATCH] zsmalloc: drop unused member 'mapping_area->huge'

From: xuyiping
Date: Tue Feb 16 2016 - 22:33:24 EST


HI, Sergery

On 2016/2/17 10:26, Sergey Senozhatsky wrote:
Hello,

On (02/17/16 09:56), YiPing Xu wrote:
static int create_handle_cache(struct zs_pool *pool)
@@ -1127,11 +1126,9 @@ static void __zs_unmap_object(struct mapping_area *area,
goto out;

buf = area->vm_buf;
- if (!area->huge) {
- buf = buf + ZS_HANDLE_SIZE;
- size -= ZS_HANDLE_SIZE;
- off += ZS_HANDLE_SIZE;
- }
+ buf = buf + ZS_HANDLE_SIZE;
+ size -= ZS_HANDLE_SIZE;
+ off += ZS_HANDLE_SIZE;

sizes[0] = PAGE_SIZE - off;
sizes[1] = size - sizes[0];


hm, indeed.

shouldn't it depend on class->huge?

void *zs_map_object()
{

if (off + class->size <= PAGE_SIZE) {

for huge object, the code will get into this branch, there is no more huge object process in __zs_map_object.

/* this object is contained entirely within a page */
area->vm_addr = kmap_atomic(page);
ret = area->vm_addr + off;
goto out;
}


void *ret = __zs_map_object(area, pages, off, class->size);

if (!class->huge)
ret += ZS_HANDLE_SIZE; /* area->vm_buf + ZS_HANDLE_SIZE */

return ret;
}

void zs_unmap_object(struct zs_pool *pool, unsigned long handle)
{
..

area = this_cpu_ptr(&zs_map_area);
if (off + class->size <= PAGE_SIZE)

for huge object, the code will get into this branch, so, in __zs_unmap_object there is no depend on class->huge.

it is a little implicated here.

kunmap_atomic(area->vm_addr);
else {
struct page *pages[2];

pages[0] = page;
pages[1] = get_next_page(page);
BUG_ON(!pages[1]);

__zs_unmap_object(area, pages, off, class->size);
}

..
}


static void __zs_unmap_object(struct mapping_area *area...)
{
char *buf = area->vm_buf;

/* handle is in page->private for class->huge */

buf = buf + ZS_HANDLE_SIZE;
size -= ZS_HANDLE_SIZE;
off += ZS_HANDLE_SIZE;

memcpy(..);
}

-ss

.