On 09/22/2016 09:29 AM, Gerald Schaefer wrote:
>  static void dissolve_free_huge_page(struct page *page)
>  {
> +     struct page *head = compound_head(page);
> +     struct hstate *h = page_hstate(head);
> +     int nid = page_to_nid(head);
> +
>       spin_lock(&hugetlb_lock);
> -     if (PageHuge(page) && !page_count(page)) {
> -             struct hstate *h = page_hstate(page);
> -             int nid = page_to_nid(page);
> -             list_del(&page->lru);
> -             h->free_huge_pages--;
> -             h->free_huge_pages_node[nid]--;
> -             h->max_huge_pages--;
> -             update_and_free_page(h, page);
> -     }
> +     list_del(&head->lru);
> +     h->free_huge_pages--;
> +     h->free_huge_pages_node[nid]--;
> +     h->max_huge_pages--;
> +     update_and_free_page(h, head);
>       spin_unlock(&hugetlb_lock);
>  }

Do you need to revalidate anything once you acquire the lock?  Can this,
for instance, race with another thread doing vm.nr_hugepages=0?  Or a
thread faulting in and allocating the large page that's being dissolved?

Reply via email to