From: Andrew Morton <akpm@linux-foundation.org>
To: Daniel Jordan <daniel.m.jordan@oracle.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>,
kvm@vger.kernel.org, Alan Tull <atull@kernel.org>,
Alexey Kardashevskiy <aik@ozlabs.ru>,
linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org,
kvm-ppc@vger.kernel.org, linux-mm@kvack.org,
Alex Williamson <alex.williamson@redhat.com>,
Moritz Fischer <mdf@kernel.org>, Christoph Lameter <cl@linux.com>,
linuxppc-dev@lists.ozlabs.org, Wu Hao <hao.wu@intel.com>
Subject: Re: [PATCH 1/6] mm: change locked_vm's type from unsigned long to atomic64_t
Date: Tue, 2 Apr 2019 15:04:24 -0700 [thread overview]
Message-ID: <20190402150424.5cf64e19deeafa58fc6c1a9f@linux-foundation.org> (raw)
In-Reply-To: <20190402204158.27582-2-daniel.m.jordan@oracle.com>
On Tue, 2 Apr 2019 16:41:53 -0400 Daniel Jordan <daniel.m.jordan@oracle.com> wrote:
> Taking and dropping mmap_sem to modify a single counter, locked_vm, is
> overkill when the counter could be synchronized separately.
>
> Make mmap_sem a little less coarse by changing locked_vm to an atomic,
> the 64-bit variety to avoid issues with overflow on 32-bit systems.
>
> ...
>
> --- a/arch/powerpc/kvm/book3s_64_vio.c
> +++ b/arch/powerpc/kvm/book3s_64_vio.c
> @@ -59,32 +59,34 @@ static unsigned long kvmppc_stt_pages(unsigned long tce_pages)
> static long kvmppc_account_memlimit(unsigned long stt_pages, bool inc)
> {
> long ret = 0;
> + s64 locked_vm;
>
> if (!current || !current->mm)
> return ret; /* process exited */
>
> down_write(¤t->mm->mmap_sem);
>
> + locked_vm = atomic64_read(¤t->mm->locked_vm);
> if (inc) {
> unsigned long locked, lock_limit;
>
> - locked = current->mm->locked_vm + stt_pages;
> + locked = locked_vm + stt_pages;
> lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
> if (locked > lock_limit && !capable(CAP_IPC_LOCK))
> ret = -ENOMEM;
> else
> - current->mm->locked_vm += stt_pages;
> + atomic64_add(stt_pages, ¤t->mm->locked_vm);
> } else {
> - if (WARN_ON_ONCE(stt_pages > current->mm->locked_vm))
> - stt_pages = current->mm->locked_vm;
> + if (WARN_ON_ONCE(stt_pages > locked_vm))
> + stt_pages = locked_vm;
>
> - current->mm->locked_vm -= stt_pages;
> + atomic64_sub(stt_pages, ¤t->mm->locked_vm);
> }
With the current code, current->mm->locked_vm cannot go negative.
After the patch, it can go negative. If someone else decreased
current->mm->locked_vm between this function's atomic64_read() and
atomic64_sub().
I guess this is a can't-happen in this case because the racing code
which performed the modification would have taken it negative anyway.
But this all makes me rather queazy.
Also, we didn't remove any down_write(mmap_sem)s from core code so I'm
thinking that the benefit of removing a few mmap_sem-takings from a few
obscure drivers (sorry ;)) is pretty small.
Also, the argument for switching 32-bit arches to a 64-bit counter was
suspiciously vague. What overflow issues? Or are we just being lazy?
next prev parent reply other threads:[~2019-04-02 22:06 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-02 20:41 [PATCH 0/6] convert locked_vm from unsigned long to atomic64_t Daniel Jordan
2019-04-02 20:41 ` [PATCH 1/6] mm: change locked_vm's type " Daniel Jordan
2019-04-02 22:04 ` Andrew Morton [this message]
2019-04-02 23:43 ` Davidlohr Bueso
2019-04-03 16:07 ` Daniel Jordan
2019-04-03 15:58 ` Daniel Jordan
2019-04-03 4:46 ` Christophe Leroy
2019-04-03 16:09 ` Daniel Jordan
2019-04-11 4:22 ` Alexey Kardashevskiy
2019-04-11 9:55 ` Mark Rutland
2019-04-11 20:28 ` Daniel Jordan
2019-04-16 23:33 ` Andrew Morton
2019-04-22 15:54 ` Daniel Jordan
2019-04-02 20:41 ` [PATCH 5/6] powerpc/mmu: drop mmap_sem now that locked_vm is atomic Daniel Jordan
2019-04-03 4:58 ` Christophe Leroy
2019-04-03 16:40 ` Daniel Jordan
2019-04-24 2:15 ` Davidlohr Bueso
2019-04-24 2:31 ` Davidlohr Bueso
2019-04-24 11:10 ` Jason Gunthorpe
2019-04-25 1:47 ` Daniel Jordan
2019-04-02 20:41 ` [PATCH 6/6] kvm/book3s: " Daniel Jordan
2019-04-03 12:51 ` [PATCH 0/6] convert locked_vm from unsigned long to atomic64_t Steven Sistare
2019-04-03 16:52 ` Daniel Jordan
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=20190402150424.5cf64e19deeafa58fc6c1a9f@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=aik@ozlabs.ru \
--cc=alex.williamson@redhat.com \
--cc=atull@kernel.org \
--cc=cl@linux.com \
--cc=daniel.m.jordan@oracle.com \
--cc=dave@stgolabs.net \
--cc=hao.wu@intel.com \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-fpga@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mdf@kernel.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).