From: Ralph Campbell <rcampbell@nvidia.com> To: Jason Gunthorpe <jgg@mellanox.com> Cc: "linux-rdma@vger.kernel.org" <linux-rdma@vger.kernel.org>, "linux-mm@kvack.org" <linux-mm@kvack.org>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>, "nouveau@lists.freedesktop.org" <nouveau@lists.freedesktop.org>, "linux-kselftest@vger.kernel.org" <linux-kselftest@vger.kernel.org>, Jerome Glisse <jglisse@redhat.com>, "John Hubbard" <jhubbard@nvidia.com>, Christoph Hellwig <hch@lst.de>, Andrew Morton <akpm@linux-foundation.org>, Ben Skeggs <bskeggs@redhat.com>, Shuah Khan <shuah@kernel.org> Subject: Re: [PATCH v6 4/6] mm/mmu_notifier: add mmu_interval_notifier_find() Date: Wed, 15 Jan 2020 14:05:24 -0800 [thread overview] Message-ID: <528c1cff-608c-d342-1e72-90d780555204@nvidia.com> (raw) In-Reply-To: <20200114124956.GN20978@mellanox.com> On 1/14/20 4:49 AM, Jason Gunthorpe wrote: > On Mon, Jan 13, 2020 at 02:47:01PM -0800, Ralph Campbell wrote: >> diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c >> index 47ad9cc89aab..4efecc0f13cb 100644 >> +++ b/mm/mmu_notifier.c >> @@ -1171,6 +1171,39 @@ void mmu_interval_notifier_update(struct mmu_interval_notifier *mni, >> } >> EXPORT_SYMBOL_GPL(mmu_interval_notifier_update); >> >> +struct mmu_interval_notifier *mmu_interval_notifier_find(struct mm_struct *mm, >> + const struct mmu_interval_notifier_ops *ops, >> + unsigned long start, unsigned long last) >> +{ >> + struct mmu_notifier_mm *mmn_mm = mm->mmu_notifier_mm; >> + struct interval_tree_node *node; >> + struct mmu_interval_notifier *mni; >> + struct mmu_interval_notifier *res = NULL; >> + >> + spin_lock(&mmn_mm->lock); >> + node = interval_tree_iter_first(&mmn_mm->itree, start, last); >> + if (node) { >> + mni = container_of(node, struct mmu_interval_notifier, >> + interval_tree); >> + while (true) { >> + if (mni->ops == ops) { >> + res = mni; >> + break; >> + } >> + node = interval_tree_iter_next(&mni->interval_tree, >> + start, last); >> + if (!node) >> + break; >> + mni = container_of(node, struct mmu_interval_notifier, >> + interval_tree); >> + } >> + } >> + spin_unlock(&mmn_mm->lock); > > This doesn't seem safe at all, here we are returning a pointer to > memory from the interval tree with out any kind of lifetime > protection. It is memory that the driver has allocated and has full control over the lifetime since the driver does all the insertions and removals. The driver does have to hold the HW page table lock so lookups are synchronized with interval insertions and removals and page table entry insertions and removals. > If the interval tree is read it must be left in the read lock state > until the caller is done with the pointer. > > .. and this poses all sorts of questions about consistency with items > on the deferred list. Should find return an item undergoing deletion? I don't think so. The deferred operations are all complete when mmu_interval_read_begin() returns, and the sequence number check with mmu_interval_read_retry() guarantees there have been no changes while not holding the driver page table lock and calling hmm_range_fault(). > Should find return items using the old interval tree values or their > new updated values? > > Jason I think it should only look at the old interval tree and not the deferred insert/remove/updates as explained above.
WARNING: multiple messages have this Message-ID (diff)
From: Ralph Campbell <rcampbell-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> To: Jason Gunthorpe <jgg-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> Cc: "linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" <linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>, "linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org" <linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org>, "linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>, "nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org" <nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org>, "linux-kselftest-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" <linux-kselftest-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>, Jerome Glisse <jglisse-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>, John Hubbard <jhubbard-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>, Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>, Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>, Ben Skeggs <bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>, Shuah Khan <shuah-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> Subject: Re: [PATCH v6 4/6] mm/mmu_notifier: add mmu_interval_notifier_find() Date: Wed, 15 Jan 2020 14:05:24 -0800 [thread overview] Message-ID: <528c1cff-608c-d342-1e72-90d780555204@nvidia.com> (raw) In-Reply-To: <20200114124956.GN20978-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> On 1/14/20 4:49 AM, Jason Gunthorpe wrote: > On Mon, Jan 13, 2020 at 02:47:01PM -0800, Ralph Campbell wrote: >> diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c >> index 47ad9cc89aab..4efecc0f13cb 100644 >> +++ b/mm/mmu_notifier.c >> @@ -1171,6 +1171,39 @@ void mmu_interval_notifier_update(struct mmu_interval_notifier *mni, >> } >> EXPORT_SYMBOL_GPL(mmu_interval_notifier_update); >> >> +struct mmu_interval_notifier *mmu_interval_notifier_find(struct mm_struct *mm, >> + const struct mmu_interval_notifier_ops *ops, >> + unsigned long start, unsigned long last) >> +{ >> + struct mmu_notifier_mm *mmn_mm = mm->mmu_notifier_mm; >> + struct interval_tree_node *node; >> + struct mmu_interval_notifier *mni; >> + struct mmu_interval_notifier *res = NULL; >> + >> + spin_lock(&mmn_mm->lock); >> + node = interval_tree_iter_first(&mmn_mm->itree, start, last); >> + if (node) { >> + mni = container_of(node, struct mmu_interval_notifier, >> + interval_tree); >> + while (true) { >> + if (mni->ops == ops) { >> + res = mni; >> + break; >> + } >> + node = interval_tree_iter_next(&mni->interval_tree, >> + start, last); >> + if (!node) >> + break; >> + mni = container_of(node, struct mmu_interval_notifier, >> + interval_tree); >> + } >> + } >> + spin_unlock(&mmn_mm->lock); > > This doesn't seem safe at all, here we are returning a pointer to > memory from the interval tree with out any kind of lifetime > protection. It is memory that the driver has allocated and has full control over the lifetime since the driver does all the insertions and removals. The driver does have to hold the HW page table lock so lookups are synchronized with interval insertions and removals and page table entry insertions and removals. > If the interval tree is read it must be left in the read lock state > until the caller is done with the pointer. > > .. and this poses all sorts of questions about consistency with items > on the deferred list. Should find return an item undergoing deletion? I don't think so. The deferred operations are all complete when mmu_interval_read_begin() returns, and the sequence number check with mmu_interval_read_retry() guarantees there have been no changes while not holding the driver page table lock and calling hmm_range_fault(). > Should find return items using the old interval tree values or their > new updated values? > > Jason I think it should only look at the old interval tree and not the deferred insert/remove/updates as explained above.
next prev parent reply other threads:[~2020-01-15 22:05 UTC|newest] Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-13 22:46 [PATCH v6 0/6] mm/hmm/test: add self tests for HMM Ralph Campbell 2020-01-13 22:46 ` Ralph Campbell 2020-01-13 22:46 ` [PATCH v6 1/6] mm/mmu_notifier: add mmu_interval_notifier_insert_safe() Ralph Campbell 2020-01-13 22:46 ` Ralph Campbell 2020-01-16 10:07 ` Christoph Hellwig 2020-01-13 22:46 ` [PATCH v6 2/6] mm/mmu_notifier: add mmu_interval_notifier_put() Ralph Campbell 2020-01-13 22:46 ` Ralph Campbell 2020-01-13 22:47 ` [PATCH v6 3/6] mm/notifier: add mmu_interval_notifier_update() Ralph Campbell 2020-01-13 22:47 ` Ralph Campbell 2020-01-13 22:47 ` [PATCH v6 4/6] mm/mmu_notifier: add mmu_interval_notifier_find() Ralph Campbell 2020-01-13 22:47 ` Ralph Campbell 2020-01-14 12:49 ` Jason Gunthorpe 2020-01-14 12:49 ` Jason Gunthorpe 2020-01-15 22:05 ` Ralph Campbell [this message] 2020-01-15 22:05 ` Ralph Campbell 2020-01-16 14:11 ` Jason Gunthorpe 2020-01-13 22:47 ` [PATCH v6 5/6] nouveau: use new mmu interval notifiers Ralph Campbell 2020-01-13 22:47 ` Ralph Campbell 2020-01-14 13:00 ` Jason Gunthorpe 2020-01-14 13:00 ` Jason Gunthorpe 2020-01-15 22:09 ` Ralph Campbell 2020-01-16 16:00 ` Jason Gunthorpe 2020-01-16 20:16 ` Ralph Campbell 2020-01-16 20:16 ` Ralph Campbell 2020-01-16 20:21 ` Jason Gunthorpe 2020-02-20 1:10 ` Ralph Campbell 2020-02-20 1:10 ` Ralph Campbell 2020-01-13 22:47 ` [PATCH v6 6/6] mm/hmm/test: add self tests for HMM Ralph Campbell 2020-01-13 22:47 ` Ralph Campbell
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=528c1cff-608c-d342-1e72-90d780555204@nvidia.com \ --to=rcampbell@nvidia.com \ --cc=akpm@linux-foundation.org \ --cc=bskeggs@redhat.com \ --cc=hch@lst.de \ --cc=jgg@mellanox.com \ --cc=jglisse@redhat.com \ --cc=jhubbard@nvidia.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-kselftest@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-rdma@vger.kernel.org \ --cc=nouveau@lists.freedesktop.org \ --cc=shuah@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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.