Lines Matching refs:resv
250 get_file_region_entry_from_cache(struct resv_map *resv, long from, long to)
254 VM_BUG_ON(resv->region_cache_count <= 0);
256 resv->region_cache_count--;
257 nrg = list_first_entry(&resv->region_cache, struct file_region, link);
280 struct resv_map *resv,
299 if (!resv->pages_per_hpage)
300 resv->pages_per_hpage = pages_per_huge_page(h);
304 VM_BUG_ON(resv->pages_per_hpage != pages_per_huge_page(h));
333 static void coalesce_file_region(struct resv_map *resv, struct file_region *rg)
338 if (&prg->link != &resv->regions && prg->to == rg->from &&
350 if (&nrg->link != &resv->regions && nrg->from == rg->to &&
361 * Must be called with resv->lock held.
368 static long add_reservation_in_range(struct resv_map *resv, long f, long t,
373 struct list_head *head = &resv->regions;
408 resv, last_accounted_offset, rg->from);
410 resv, nrg);
412 coalesce_file_region(resv, nrg);
427 resv, last_accounted_offset, t);
428 record_hugetlb_cgroup_uncharge_info(h_cg, h, resv, nrg);
430 coalesce_file_region(resv, nrg);
439 /* Must be called with resv->lock acquired. Will drop lock to allocate entries.
441 static int allocate_file_region_entries(struct resv_map *resv,
443 __must_hold(&resv->lock)
462 while (resv->region_cache_count <
463 (resv->adds_in_progress + regions_needed)) {
464 to_allocate = resv->adds_in_progress + regions_needed -
465 resv->region_cache_count;
471 VM_BUG_ON(resv->region_cache_count < resv->adds_in_progress);
473 spin_unlock(&resv->lock);
481 spin_lock(&resv->lock);
483 list_splice(&allocated_regions, &resv->region_cache);
484 resv->region_cache_count += to_allocate;
514 static long region_add(struct resv_map *resv, long f, long t,
520 spin_lock(&resv->lock);
524 add_reservation_in_range(resv, f, t, NULL, NULL,
537 resv->region_cache_count <
538 resv->adds_in_progress +
546 resv, actual_regions_needed - in_regions_needed)) {
553 add = add_reservation_in_range(resv, f, t, h_cg, h, NULL);
555 resv->adds_in_progress -= in_regions_needed;
557 spin_unlock(&resv->lock);
574 * resv->adds_in_progress. This value needs to be provided to a follow up call
582 static long region_chg(struct resv_map *resv, long f, long t,
587 spin_lock(&resv->lock);
590 chg = add_reservation_in_range(resv, f, t, NULL, NULL,
596 if (allocate_file_region_entries(resv, *out_regions_needed))
599 resv->adds_in_progress += *out_regions_needed;
601 spin_unlock(&resv->lock);
618 static void region_abort(struct resv_map *resv, long f, long t,
621 spin_lock(&resv->lock);
622 VM_BUG_ON(!resv->region_cache_count);
623 resv->adds_in_progress -= regions_needed;
624 spin_unlock(&resv->lock);
641 static long region_del(struct resv_map *resv, long f, long t)
643 struct list_head *head = &resv->regions;
649 spin_lock(&resv->lock);
670 resv->region_cache_count > resv->adds_in_progress) {
671 nrg = list_first_entry(&resv->region_cache,
675 resv->region_cache_count--;
679 spin_unlock(&resv->lock);
688 resv, rg, t - f, false);
708 hugetlb_cgroup_uncharge_file_region(resv, rg,
716 hugetlb_cgroup_uncharge_file_region(resv, rg,
722 hugetlb_cgroup_uncharge_file_region(resv, rg,
730 spin_unlock(&resv->lock);
768 static long region_count(struct resv_map *resv, long f, long t)
770 struct list_head *head = &resv->regions;
774 spin_lock(&resv->lock);
790 spin_unlock(&resv->lock);
2200 struct resv_map *resv;
2205 resv = vma_resv_map(vma);
2206 if (!resv)
2212 ret = region_chg(resv, idx, idx + 1, &dummy_out_regions_needed);
2214 * 1 page, and that adding to resv map a 1 page entry can only
2220 ret = region_add(resv, idx, idx + 1, 1, NULL, NULL);
2225 region_abort(resv, idx, idx + 1, 1);
2230 ret = region_add(resv, idx, idx + 1, 1, NULL, NULL);
2234 region_abort(resv, idx, idx + 1, 1);
2235 ret = region_del(resv, idx, idx + 1);
3671 struct resv_map *resv = vma_resv_map(vma);
3681 if (resv && is_vma_resv_set(vma, HPAGE_RESV_OWNER)) {
3682 resv_map_dup_hugetlb_cgroup_uncharge_info(resv);
3683 kref_get(&resv->refs);
3690 struct resv_map *resv = vma_resv_map(vma);
3695 if (!resv || !is_vma_resv_set(vma, HPAGE_RESV_OWNER))
3701 reserve = (end - start) - region_count(resv, start, end);
3702 hugetlb_cgroup_uncharge_counter(resv, start, end);
3712 kref_put(&resv->refs, resv_map_release);