linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Hugh Dickins <hughd@google.com>
To: Liam Howlett <liam.howlett@oracle.com>
Cc: Hugh Dickins <hughd@google.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Oleg Nesterov <oleg@redhat.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>
Subject: Re: [PATCH mmotm] mempolicy: mbind_range() set_policy() after vma_merge()
Date: Tue, 8 Mar 2022 13:32:18 -0800 (PST)	[thread overview]
Message-ID: <6036627b-6110-cc58-ca1-a6f736553dd@google.com> (raw)
In-Reply-To: <20220308160552.d3dlcaclkqnlkzzj@revolver>

On Tue, 8 Mar 2022, Liam Howlett wrote:
> * Hugh Dickins <hughd@google.com> [220304 21:29]:
> > On Sat, 5 Mar 2022, Liam Howlett wrote:
> > > * Hugh Dickins <hughd@google.com> [220304 17:48]:
> > > > On Fri, 4 Mar 2022, Liam Howlett wrote:
> > > > > * Liam R. Howlett <Liam.Howlett@Oracle.com> [220304 13:49]:
> > > > > > * Hugh Dickins <hughd@google.com> [220303 23:36]:
> > > > > 
> > > > > I just thought of something after my initial email
> > > > > 
> > > > > How does the ->set_policy() requirement on tmpfs play out for the
> > > > > mpol_equal() check earlier in that for loop?
> > > > 
> > > > It took me a while to page all this back in (and remind myself of
> > > > what is case 8) to answer that question!
> > > > 
> > > > The answer is that the mpol_equal() check at the top of the loop is on
> > > > an existing, unmodified vma; so it's right to assume that any necessary
> > > > set_policy() has already been done.
> > > > 
> > > > Whereas the mpol_equal() check being removed in this patch, is being
> > > > done on a vma which may have just been extended to cover a greater range:
> > > > so although the relevant set_policy() may have already been done on a part
> > > > of its range, there is now another part which needs the policy applied.
> > > 
> > > Doesn't the policy get checked during vma_merge()?  Specifically the
> > > mpol_equal(policy, vma_policy(next)) check?
> > 
> > Sorry, I'm reduced to the unhelpful reply of "Yes. So?"
> > 
> > If vma_merge() finds that vma's new_pol allows it to be merged with prev,
> > that still requires mbind_range() (or its call to vma_replace_policy())
> > to set_policy() on prev (now assigned to vma), to apply that new_pol to
> > the extension of prev - vma_merge() would have checked mpol_equal(),
> > but would not have done the set_policy().
> 
> I must be missing something.  If mpol_equal() isn't sufficient to ensure
> we don't need to set_policy(), then why are the other vma_merge() cases
> okay - such as madvise_update_vma() and mlock_fixup()?  Won't the mem
> policy change in the same way in these cases?

mlock provides a good example to compare.

Mlocking pages is the business of mlock(), and mlock_fixup() needs to
attend to mm->locked_vm, and calling something to mark as PageMlocked
those pages already in the area now covered by mlock.  But it doesn't
need to worry about set_policy(), that's not its business, and is
unaffected by mlock changes (though merging of vmas needs mpol_equal()
to check that policy is the same, and merging and splitting of vmas
need to maintain the refcount of the shared policy if any).

Whereas NUMA mempolicy is the business of mbind(), and mbind_range()
needs to attend to vma->vm_policy, and if it's a mapping of something
supporting a shared set_policy(), call that to establish the new range
on the object mapped.  But it doesn't need to worry about mm->locked_vm
or whether pages are Mlocked, that's not its business, and is unaffected
by mbind changes (though merging of vmas needs to check VM_LOCKED among
other flags to check that they are the same before it can merge).

Does that help?

Hugh

  reply	other threads:[~2022-03-08 21:32 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-04  4:36 [PATCH mmotm] mempolicy: mbind_range() set_policy() after vma_merge() Hugh Dickins
2022-03-04 18:06 ` Oleg Nesterov
2022-03-04 22:33   ` Hugh Dickins
2022-03-04 18:49 ` Liam Howlett
2022-03-04 19:05   ` Liam Howlett
2022-03-04 22:48     ` Hugh Dickins
2022-03-05  2:00       ` Liam Howlett
2022-03-05  2:28         ` Hugh Dickins
2022-03-08 16:05           ` Liam Howlett
2022-03-08 21:32             ` Hugh Dickins [this message]
2022-03-09 12:41               ` Vlastimil Babka
2022-03-09 19:10                 ` Liam Howlett
2022-03-11  9:33                   ` Hugh Dickins
2022-03-11  8:54                 ` Hugh Dickins
2022-03-11 12:47                   ` Vlastimil Babka

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=6036627b-6110-cc58-ca1-a6f736553dd@google.com \
    --to=hughd@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=liam.howlett@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=oleg@redhat.com \
    /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).