Lines Matching refs:zhdr
225 struct zbud_header *zhdr = page_address(page); in init_zbud_page() local
226 zhdr->first_chunks = 0; in init_zbud_page()
227 zhdr->last_chunks = 0; in init_zbud_page()
228 INIT_LIST_HEAD(&zhdr->buddy); in init_zbud_page()
229 INIT_LIST_HEAD(&zhdr->lru); in init_zbud_page()
230 zhdr->under_reclaim = 0; in init_zbud_page()
231 return zhdr; in init_zbud_page()
235 static void free_zbud_page(struct zbud_header *zhdr) in free_zbud_page() argument
237 __free_page(virt_to_page(zhdr)); in free_zbud_page()
244 static unsigned long encode_handle(struct zbud_header *zhdr, enum buddy bud) in encode_handle() argument
254 handle = (unsigned long)zhdr; in encode_handle()
259 handle += PAGE_SIZE - (zhdr->last_chunks << CHUNK_SHIFT); in encode_handle()
270 static int num_free_chunks(struct zbud_header *zhdr) in num_free_chunks() argument
276 return NCHUNKS - zhdr->first_chunks - zhdr->last_chunks; in num_free_chunks()
342 struct zbud_header *zhdr = NULL; in zbud_alloc() local
354 zhdr = NULL; in zbud_alloc()
357 zhdr = list_first_entry(&pool->unbuddied[i], in zbud_alloc()
359 list_del(&zhdr->buddy); in zbud_alloc()
360 if (zhdr->first_chunks == 0) in zbud_alloc()
375 zhdr = init_zbud_page(page); in zbud_alloc()
380 zhdr->first_chunks = chunks; in zbud_alloc()
382 zhdr->last_chunks = chunks; in zbud_alloc()
384 if (zhdr->first_chunks == 0 || zhdr->last_chunks == 0) { in zbud_alloc()
386 freechunks = num_free_chunks(zhdr); in zbud_alloc()
387 list_add(&zhdr->buddy, &pool->unbuddied[freechunks]); in zbud_alloc()
390 list_add(&zhdr->buddy, &pool->buddied); in zbud_alloc()
394 if (!list_empty(&zhdr->lru)) in zbud_alloc()
395 list_del(&zhdr->lru); in zbud_alloc()
396 list_add(&zhdr->lru, &pool->lru); in zbud_alloc()
398 *handle = encode_handle(zhdr, bud); in zbud_alloc()
416 struct zbud_header *zhdr; in zbud_free() local
420 zhdr = handle_to_zbud_header(handle); in zbud_free()
424 zhdr->last_chunks = 0; in zbud_free()
426 zhdr->first_chunks = 0; in zbud_free()
428 if (zhdr->under_reclaim) { in zbud_free()
435 list_del(&zhdr->buddy); in zbud_free()
437 if (zhdr->first_chunks == 0 && zhdr->last_chunks == 0) { in zbud_free()
439 list_del(&zhdr->lru); in zbud_free()
440 free_zbud_page(zhdr); in zbud_free()
444 freechunks = num_free_chunks(zhdr); in zbud_free()
445 list_add(&zhdr->buddy, &pool->unbuddied[freechunks]); in zbud_free()
492 struct zbud_header *zhdr; in zbud_reclaim_page() local
502 zhdr = list_tail_entry(&pool->lru, struct zbud_header, lru); in zbud_reclaim_page()
503 list_del(&zhdr->lru); in zbud_reclaim_page()
504 list_del(&zhdr->buddy); in zbud_reclaim_page()
506 zhdr->under_reclaim = true; in zbud_reclaim_page()
513 if (zhdr->first_chunks) in zbud_reclaim_page()
514 first_handle = encode_handle(zhdr, FIRST); in zbud_reclaim_page()
515 if (zhdr->last_chunks) in zbud_reclaim_page()
516 last_handle = encode_handle(zhdr, LAST); in zbud_reclaim_page()
532 zhdr->under_reclaim = false; in zbud_reclaim_page()
533 if (zhdr->first_chunks == 0 && zhdr->last_chunks == 0) { in zbud_reclaim_page()
538 free_zbud_page(zhdr); in zbud_reclaim_page()
542 } else if (zhdr->first_chunks == 0 || in zbud_reclaim_page()
543 zhdr->last_chunks == 0) { in zbud_reclaim_page()
545 freechunks = num_free_chunks(zhdr); in zbud_reclaim_page()
546 list_add(&zhdr->buddy, &pool->unbuddied[freechunks]); in zbud_reclaim_page()
549 list_add(&zhdr->buddy, &pool->buddied); in zbud_reclaim_page()
553 list_add(&zhdr->lru, &pool->lru); in zbud_reclaim_page()