linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yang Shi <yang.shi@linux.alibaba.com>
To: "Kirill A. Shutemov" <kirill@shutemov.name>
Cc: hughd@google.com, kirill.shutemov@linux.intel.com,
	aarcange@redhat.com, akpm@linux-foundation.org,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm: thp: clear PageDoubleMap flag when the last PMD map gone
Date: Fri, 25 Oct 2019 11:49:26 -0700	[thread overview]
Message-ID: <2171f0a9-d01a-e863-2009-3f1bfa249d6c@linux.alibaba.com> (raw)
In-Reply-To: <20191025163955.qsvkqic2hrorvdzj@box>



On 10/25/19 9:39 AM, Kirill A. Shutemov wrote:
> On Fri, Oct 25, 2019 at 07:32:33PM +0300, Kirill A. Shutemov wrote:
>> On Fri, Oct 25, 2019 at 08:58:22AM -0700, Yang Shi wrote:
>>>
>>> On 10/25/19 8:36 AM, Kirill A. Shutemov wrote:
>>>> On Fri, Oct 25, 2019 at 01:27:46AM +0800, Yang Shi wrote:
>>>>> File THP sets PageDoubleMap flag when the first it gets PTE mapped, but
>>>>> the flag is never cleared until the THP is freed.  This result in
>>>>> unbalanced state although it is not a big deal.
>>>>>
>>>>> Clear the flag when the last compound_mapcount is gone.  It should be
>>>>> cleared when all the PTE maps are gone (become PMD mapped only) as well,
>>>>> but this needs check all subpage's _mapcount every time any subpage's
>>>>> rmap is removed, the overhead may be not worth.  The anonymous THP also
>>>>> just clears PageDoubleMap flag when the last PMD map is gone.
>>>> NAK, sorry.
>>>>
>>>> The key difference with anon THP that file THP can be mapped again with
>>>> PMD after all PMD (or all) mappings are gone.
>>>>
>>>> Your patch breaks the case when you map the page with PMD again while the
>>>> page is still mapped with PTEs. Who would set PageDoubleMap() in this
>>>> case?
>>> Aha, yes, you are right. I missed that point. However, I'm wondering we
>>> might move this up a little bit like this:
>>>
>>> diff --git a/mm/rmap.c b/mm/rmap.c
>>> index d17cbf3..ac046fd 100644
>>> --- a/mm/rmap.c
>>> +++ b/mm/rmap.c
>>> @@ -1230,15 +1230,17 @@ static void page_remove_file_rmap(struct page *page,
>>> bool compound)
>>>                          if (atomic_add_negative(-1, &page[i]._mapcount))
>>>                                  nr++;
>>>                  }
>>> +
>>> +               /* No PTE map anymore */
>>> +               if (nr == HPAGE_PMD_NR)
>>> +                       ClearPageDoubleMap(compound_head(page));
>>> +
>>>                  if (!atomic_add_negative(-1, compound_mapcount_ptr(page)))
>>>                          goto out;
>>>                  if (PageSwapBacked(page))
>>>                          __dec_node_page_state(page, NR_SHMEM_PMDMAPPED);
>>>                  else
>>>                          __dec_node_page_state(page, NR_FILE_PMDMAPPED);
>>> -
>>> -               /* The last PMD map is gone */
>>> -               ClearPageDoubleMap(compound_head(page));
>>>          } else {
>>>                  if (!atomic_add_negative(-1, &page->_mapcount))
>>>                          goto out;
>>>
>>>
>>> This should guarantee no PTE map anymore, it should be safe to clear the
>>> flag.
>> At first glance looks safe, but let me think more about it. I didn't
>> expect it be that easy :P
> How do you protect from races? What prevents other thread/process to map
> the page as PTE after you've calculated 'nr'?
>
> I don't remember the code that well, but I believe we don't require
> PageLock for all cases... Or do we?

No, page lock is required by adding PTE rmap, but not required when 
removing rmap, i.e. huge pmd split. It looks we can't prevent from the 
races for processes, threads are protected by ptl.

>


      reply	other threads:[~2019-10-25 18:49 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-24 17:27 [PATCH] mm: thp: clear PageDoubleMap flag when the last PMD map gone Yang Shi
2019-10-24 19:26 ` Song Liu
2019-10-25 15:36 ` Kirill A. Shutemov
2019-10-25 15:58   ` Yang Shi
2019-10-25 16:32     ` Kirill A. Shutemov
2019-10-25 16:39       ` Kirill A. Shutemov
2019-10-25 18:49         ` Yang Shi [this message]

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=2171f0a9-d01a-e863-2009-3f1bfa249d6c@linux.alibaba.com \
    --to=yang.shi@linux.alibaba.com \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=hughd@google.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kirill@shutemov.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.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).