linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Mike Kravetz <mike.kravetz@oracle.com>
To: Michal Hocko <mhocko@suse.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Roman Gushchin <guro@fb.com>, Shakeel Butt <shakeelb@google.com>,
	Oscar Salvador <osalvador@suse.de>,
	David Hildenbrand <david@redhat.com>,
	Muchun Song <songmuchun@bytedance.com>,
	David Rientjes <rientjes@google.com>,
	Miaohe Lin <linmiaohe@huawei.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Matthew Wilcox <willy@infradead.org>,
	HORIGUCHI NAOYA <naoya.horiguchi@nec.com>,
	"Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
	Waiman Long <longman@redhat.com>, Peter Xu <peterx@redhat.com>,
	Mina Almasry <almasrymina@google.com>,
	Hillf Danton <hdanton@sina.com>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH 6/8] hugetlb: change free_pool_huge_page to remove_pool_huge_page
Date: Thu, 25 Mar 2021 10:29:01 -0700	[thread overview]
Message-ID: <c47d8c15-dec9-8f65-d9ac-e0abb27b65ea@oracle.com> (raw)
In-Reply-To: <YFxurrhDuZZG1FlQ@dhcp22.suse.cz>

On 3/25/21 4:06 AM, Michal Hocko wrote:
> On Wed 24-03-21 17:28:33, Mike Kravetz wrote:
> [...]
>> @@ -2074,17 +2067,16 @@ static int gather_surplus_pages(struct hstate *h, long delta)
>>   *    to the associated reservation map.
>>   * 2) Free any unused surplus pages that may have been allocated to satisfy
>>   *    the reservation.  As many as unused_resv_pages may be freed.
>> - *
>> - * Called with hugetlb_lock held.  However, the lock could be dropped (and
>> - * reacquired) during calls to cond_resched_lock.  Whenever dropping the lock,
>> - * we must make sure nobody else can claim pages we are in the process of
>> - * freeing.  Do this by ensuring resv_huge_page always is greater than the
>> - * number of huge pages we plan to free when dropping the lock.
>>   */
>>  static void return_unused_surplus_pages(struct hstate *h,
>>  					unsigned long unused_resv_pages)
>>  {
>>  	unsigned long nr_pages;
>> +	struct page *page, *t_page;
>> +	struct list_head page_list;
>> +
>> +	/* Uncommit the reservation */
>> +	h->resv_huge_pages -= unused_resv_pages;
> 
> Is this ok for cases where remove_pool_huge_page fails early? I have to
> say I am kinda lost in the resv_huge_pages accounting here. The original
> code was already quite supicious to me. TBH.

Yes, it is safe.  The existing code will do the same but perhaps in a
different way.

Some history is in the changelog for commit e5bbc8a6c992 ("mm/hugetlb.c:
fix reservation race when freeing surplus pages").  The race fixed by
that commit was introduced by the cond_resched_lock() which we are
removing in this patch.  Therefore, we can remove the tricky code that
was added to deal with dropping the lock.

I should add an explanation to the commit message.

Additionally, I suspect we may end up once again dropping the lock in
the below loop when adding vmemmap support.  Then, we would need to add
back the code in commit e5bbc8a6c992.  Sigh.

>>  
>>  	/* Cannot return gigantic pages currently */
>>  	if (hstate_is_gigantic(h))
>> @@ -2101,24 +2093,27 @@ static void return_unused_surplus_pages(struct hstate *h,
>>  	 * evenly across all nodes with memory. Iterate across these nodes
>>  	 * until we can no longer free unreserved surplus pages. This occurs
>>  	 * when the nodes with surplus pages have no free pages.
>> -	 * free_pool_huge_page() will balance the freed pages across the
>> +	 * remove_pool_huge_page() will balance the freed pages across the
>>  	 * on-line nodes with memory and will handle the hstate accounting.
>> -	 *
>> -	 * Note that we decrement resv_huge_pages as we free the pages.  If
>> -	 * we drop the lock, resv_huge_pages will still be sufficiently large
>> -	 * to cover subsequent pages we may free.
>>  	 */
>> +	INIT_LIST_HEAD(&page_list);
>>  	while (nr_pages--) {
>> -		h->resv_huge_pages--;
>> -		unused_resv_pages--;
>> -		if (!free_pool_huge_page(h, &node_states[N_MEMORY], 1))
>> +		page = remove_pool_huge_page(h, &node_states[N_MEMORY], 1);
>> +		if (!page)
>>  			goto out;
>> -		cond_resched_lock(&hugetlb_lock);
>> +
>> +		INIT_LIST_HEAD(&page->lru);
> 
> again unnecessary INIT_LIST_HEAD
> 
>> +		list_add(&page->lru, &page_list);
>>  	}
>>  
>>  out:
>> -	/* Fully uncommit the reservation */
>> -	h->resv_huge_pages -= unused_resv_pages;
>> +	spin_unlock(&hugetlb_lock);
>> +	list_for_each_entry_safe(page, t_page, &page_list, lru) {
>> +		list_del(&page->lru);
>> +		update_and_free_page(h, page);
>> +		cond_resched();
>> +	}
> 
> You have the same construct at 3 different places maybe it deserves a
> little helper update_and_free_page_batch.

Sure.  I will add it.

-- 
Mike Kravetz


  reply	other threads:[~2021-03-25 17:29 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-25  0:28 [PATCH 0/8] make hugetlb put_page safe for all calling contexts Mike Kravetz
2021-03-25  0:28 ` [PATCH 1/8] mm: cma: introduce cma_release_nowait() Mike Kravetz
2021-03-25  9:39   ` Oscar Salvador
2021-03-25  9:45   ` Michal Hocko
2021-03-25  9:54     ` Oscar Salvador
2021-03-25 10:10       ` Michal Hocko
2021-03-25 10:11     ` Michal Hocko
2021-03-25 10:13       ` David Hildenbrand
2021-03-25 10:17       ` Oscar Salvador
2021-03-25 10:24         ` Michal Hocko
2021-03-25  9:56   ` David Hildenbrand
2021-03-25 10:22     ` Michal Hocko
2021-03-25 16:56       ` Mike Kravetz
2021-03-25 17:15         ` David Hildenbrand
2021-03-25 20:12           ` Minchan Kim
2021-03-25 23:19             ` Roman Gushchin
2021-03-25 23:49               ` Mike Kravetz
2021-03-26 21:32                 ` Mike Kravetz
2021-03-29  7:46                   ` Michal Hocko
2021-03-29 22:27                     ` Mike Kravetz
2021-03-25  0:28 ` [PATCH 2/8] mm: hugetlb: don't drop hugetlb_lock around cma_release() call Mike Kravetz
2021-03-25  0:28 ` [PATCH 3/8] hugetlb: add per-hstate mutex to synchronize user adjustments Mike Kravetz
2021-03-25 10:47   ` Michal Hocko
2021-03-25 12:29   ` Oscar Salvador
2021-03-26  1:52   ` Miaohe Lin
2021-03-25  0:28 ` [PATCH 4/8] hugetlb: create remove_hugetlb_page() to separate functionality Mike Kravetz
2021-03-25 10:49   ` Michal Hocko
2021-03-26  2:10   ` Miaohe Lin
2021-03-26 19:57     ` Mike Kravetz
2021-03-27  1:40       ` Miaohe Lin
2021-03-27  6:36   ` [External] " Muchun Song
2021-03-25  0:28 ` [PATCH 5/8] hugetlb: call update_and_free_page without hugetlb_lock Mike Kravetz
2021-03-25 10:55   ` Michal Hocko
2021-03-25 17:12     ` Mike Kravetz
2021-03-25 19:39       ` Michal Hocko
2021-03-25 20:33         ` Mike Kravetz
2021-03-27  6:54   ` [External] " Muchun Song
2021-03-28 21:40     ` Mike Kravetz
2021-03-25  0:28 ` [PATCH 6/8] hugetlb: change free_pool_huge_page to remove_pool_huge_page Mike Kravetz
2021-03-25 11:06   ` Michal Hocko
2021-03-25 17:29     ` Mike Kravetz [this message]
2021-03-25  0:28 ` [PATCH 7/8] hugetlb: make free_huge_page irq safe Mike Kravetz
2021-03-25 11:21   ` Michal Hocko
2021-03-25 17:32     ` Mike Kravetz
2021-03-27  7:06   ` [External] " Muchun Song
2021-03-29  7:49     ` Michal Hocko
2021-03-29 22:44       ` Mike Kravetz
2021-03-25  0:28 ` [PATCH 8/8] hugetlb: add lockdep_assert_held() calls for hugetlb_lock Mike Kravetz
2021-03-25 11:22   ` Michal Hocko
2021-03-26  2:12   ` Miaohe Lin
2021-03-27  8:14   ` [External] " Muchun Song
2021-03-26  1:42 ` [PATCH 0/8] make hugetlb put_page safe for all calling contexts Miaohe Lin
2021-03-26 20:00   ` Mike Kravetz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c47d8c15-dec9-8f65-d9ac-e0abb27b65ea@oracle.com \
    --to=mike.kravetz@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=almasrymina@google.com \
    --cc=aneesh.kumar@linux.ibm.com \
    --cc=david@redhat.com \
    --cc=guro@fb.com \
    --cc=hdanton@sina.com \
    --cc=linmiaohe@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=longman@redhat.com \
    --cc=mhocko@suse.com \
    --cc=naoya.horiguchi@nec.com \
    --cc=osalvador@suse.de \
    --cc=peterx@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rientjes@google.com \
    --cc=shakeelb@google.com \
    --cc=songmuchun@bytedance.com \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).