Re: [PATCH v5 4/5] mm: Make alloc_contig_range handle in-use hugetlb pages
From: Michal Hocko <mhocko@suse.com>
Date: 2021-03-18 10:13:28
Also in:
lkml
On Thu 18-03-21 10:59:10, Oscar Salvador wrote:
On Thu, Mar 18, 2021 at 10:29:57AM +0100, Michal Hocko wrote:quoted
On Thu 18-03-21 09:54:01, Oscar Salvador wrote: [...]quoted
@@ -2287,10 +2288,12 @@ static int alloc_and_dissolve_huge_page(struct hstate *h, struct page *old_page) goto unlock; } else if (page_count(old_page)) { /* - * Someone has grabbed the page, fail for now. + * Someone has grabbed the page, try to isolate it here. + * Fail with -EBUSY if not possible. */ - ret = -EBUSY; update_and_free_page(h, new_page); + if (!isolate_huge_page(old_page, list) + ret = -EBUSY; goto unlock; } else if (!HPageFreed(old_page)) {I do not think you want to call isolate_huge_page with hugetlb_lock held. You would need to drop the lock before calling isolate_huge_page.Yeah, that was an oversight. As I said I did not compile it(let alone test it), otherwise the system would have screamed I guess. I was more interested in knowing whether how did it look wrt. retry concerns:
Yes this looks much more to my taste. If we need to retry then it could just goto retry there. The caller doesn't really have to care.
quoted hunk ↗ jump to hunk
@@ -2287,10 +2288,14 @@ static int alloc_and_dissolve_huge_page(struct hstate *h, struct page *old_page) goto unlock; } else if (page_count(old_page)) { /* - * Someone has grabbed the page, fail for now. + * Someone has grabbed the page, try to isolate it here. + * Fail with -EBUSY if not possible. */ - ret = -EBUSY; update_and_free_page(h, new_page); + spin_unlock(&hugetlb_lock); + if (!isolate_huge_page(old_page, list) + ret = -EBUSY; + spin_lock(&hugetlb_lock); goto unlock;
simply return ret; here -- Michal Hocko SUSE Labs