Messages in this thread | | | Date | Wed, 25 Aug 2010 11:02:02 +0800 | From | Wu Fengguang <> | Subject | Re: [PATCH 6/8] HWPOISON, hugetlb: soft offlining for hugepage |
| |
> +static int is_hugepage_on_freelist(struct page *hpage) > +{ > + struct page *page; > + struct page *tmp; > + struct hstate *h = page_hstate(hpage); > + int nid = page_to_nid(hpage); > + > + spin_lock(&hugetlb_lock); > + list_for_each_entry_safe(page, tmp, &h->hugepage_freelists[nid], lru) { > + if (page == hpage) { > + spin_unlock(&hugetlb_lock); > + return 1; > + } > + } > + spin_unlock(&hugetlb_lock); > + return 0; > +}
Ha! That looks better than the page_count test in my previous email.
> +void isolate_hwpoisoned_huge_page(struct page *hpage) > +{ > + lock_page(hpage); > + if (is_hugepage_on_freelist(hpage)) > + __isolate_hwpoisoned_huge_page(hpage); > + unlock_page(hpage); > +}
However it should still be racy if the test/isolate actions are not performed in the same hugetlb_lock.
Thanks, Fengguang
| |