Lines Matching refs:zhdr

240 	struct zbud_header *zhdr = page_address(page);  in init_zbud_page()  local
241 zhdr->first_chunks = 0; in init_zbud_page()
242 zhdr->last_chunks = 0; in init_zbud_page()
243 INIT_LIST_HEAD(&zhdr->buddy); in init_zbud_page()
244 INIT_LIST_HEAD(&zhdr->lru); in init_zbud_page()
245 zhdr->under_reclaim = 0; in init_zbud_page()
246 return zhdr; in init_zbud_page()
250 static void free_zbud_page(struct zbud_header *zhdr) in free_zbud_page() argument
252 __free_page(virt_to_page(zhdr)); in free_zbud_page()
259 static unsigned long encode_handle(struct zbud_header *zhdr, enum buddy bud) in encode_handle() argument
269 handle = (unsigned long)zhdr; in encode_handle()
274 handle += PAGE_SIZE - (zhdr->last_chunks << CHUNK_SHIFT); in encode_handle()
285 static int num_free_chunks(struct zbud_header *zhdr) in num_free_chunks() argument
291 return NCHUNKS - zhdr->first_chunks - zhdr->last_chunks; in num_free_chunks()
357 struct zbud_header *zhdr = NULL; in zbud_alloc() local
369 zhdr = NULL; in zbud_alloc()
372 zhdr = list_first_entry(&pool->unbuddied[i], in zbud_alloc()
374 list_del(&zhdr->buddy); in zbud_alloc()
375 if (zhdr->first_chunks == 0) in zbud_alloc()
390 zhdr = init_zbud_page(page); in zbud_alloc()
395 zhdr->first_chunks = chunks; in zbud_alloc()
397 zhdr->last_chunks = chunks; in zbud_alloc()
399 if (zhdr->first_chunks == 0 || zhdr->last_chunks == 0) { in zbud_alloc()
401 freechunks = num_free_chunks(zhdr); in zbud_alloc()
402 list_add(&zhdr->buddy, &pool->unbuddied[freechunks]); in zbud_alloc()
405 list_add(&zhdr->buddy, &pool->buddied); in zbud_alloc()
409 if (!list_empty(&zhdr->lru)) in zbud_alloc()
410 list_del(&zhdr->lru); in zbud_alloc()
411 list_add(&zhdr->lru, &pool->lru); in zbud_alloc()
413 *handle = encode_handle(zhdr, bud); in zbud_alloc()
431 struct zbud_header *zhdr; in zbud_free() local
435 zhdr = handle_to_zbud_header(handle); in zbud_free()
439 zhdr->last_chunks = 0; in zbud_free()
441 zhdr->first_chunks = 0; in zbud_free()
443 if (zhdr->under_reclaim) { in zbud_free()
450 list_del(&zhdr->buddy); in zbud_free()
452 if (zhdr->first_chunks == 0 && zhdr->last_chunks == 0) { in zbud_free()
454 list_del(&zhdr->lru); in zbud_free()
455 free_zbud_page(zhdr); in zbud_free()
459 freechunks = num_free_chunks(zhdr); in zbud_free()
460 list_add(&zhdr->buddy, &pool->unbuddied[freechunks]); in zbud_free()
507 struct zbud_header *zhdr; in zbud_reclaim_page() local
517 zhdr = list_tail_entry(&pool->lru, struct zbud_header, lru); in zbud_reclaim_page()
518 list_del(&zhdr->lru); in zbud_reclaim_page()
519 list_del(&zhdr->buddy); in zbud_reclaim_page()
521 zhdr->under_reclaim = true; in zbud_reclaim_page()
528 if (zhdr->first_chunks) in zbud_reclaim_page()
529 first_handle = encode_handle(zhdr, FIRST); in zbud_reclaim_page()
530 if (zhdr->last_chunks) in zbud_reclaim_page()
531 last_handle = encode_handle(zhdr, LAST); in zbud_reclaim_page()
547 zhdr->under_reclaim = false; in zbud_reclaim_page()
548 if (zhdr->first_chunks == 0 && zhdr->last_chunks == 0) { in zbud_reclaim_page()
553 free_zbud_page(zhdr); in zbud_reclaim_page()
557 } else if (zhdr->first_chunks == 0 || in zbud_reclaim_page()
558 zhdr->last_chunks == 0) { in zbud_reclaim_page()
560 freechunks = num_free_chunks(zhdr); in zbud_reclaim_page()
561 list_add(&zhdr->buddy, &pool->unbuddied[freechunks]); in zbud_reclaim_page()
564 list_add(&zhdr->buddy, &pool->buddied); in zbud_reclaim_page()
568 list_add(&zhdr->lru, &pool->lru); in zbud_reclaim_page()