Thread (72 messages) 72 messages, 9 authors, 2019-06-12

Re: [PATCH v16 12/16] IB, arm64: untag user pointers in ib_uverbs_(re)reg_mr()

From: Andrey Konovalov <hidden>
Date: 2019-06-04 13:09:40
Also in: amd-gfx, dri-devel, kvm, linux-kselftest, linux-media, linux-mm, linux-rdma, lkml

On Tue, Jun 4, 2019 at 3:02 PM Jason Gunthorpe [off-list ref] wrote:
On Tue, Jun 04, 2019 at 02:45:32PM +0200, Andrey Konovalov wrote:
quoted
On Tue, Jun 4, 2019 at 2:27 PM Jason Gunthorpe [off-list ref] wrote:
quoted
On Tue, Jun 04, 2019 at 02:18:19PM +0200, Andrey Konovalov wrote:
quoted
On Mon, Jun 3, 2019 at 7:46 PM Jason Gunthorpe [off-list ref] wrote:
quoted
On Mon, Jun 03, 2019 at 06:55:14PM +0200, Andrey Konovalov wrote:
quoted
This patch is a part of a series that extends arm64 kernel ABI to allow to
pass tagged user pointers (with the top byte set to something else other
than 0x00) as syscall arguments.

ib_uverbs_(re)reg_mr() use provided user pointers for vma lookups (through
e.g. mlx4_get_umem_mr()), which can only by done with untagged pointers.

Untag user pointers in these functions.

Signed-off-by: Andrey Konovalov <redacted>
 drivers/infiniband/core/uverbs_cmd.c | 4 ++++
 1 file changed, 4 insertions(+)
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 5a3a1780ceea..f88ee733e617 100644
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -709,6 +709,8 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
      if (ret)
              return ret;

+     cmd.start = untagged_addr(cmd.start);
+
      if ((cmd.start & ~PAGE_MASK) != (cmd.hca_va & ~PAGE_MASK))
              return -EINVAL;
I feel like we shouldn't thave to do this here, surely the cmd.start
should flow unmodified to get_user_pages, and gup should untag it?

ie, this sort of direction for the IB code (this would be a giant
patch, so I didn't have time to write it all, but I think it is much
saner):
Hi Jason,

ib_uverbs_reg_mr() passes cmd.start to mlx4_get_umem_mr(), which calls
find_vma(), which only accepts untagged addresses. Could you explain
how your patch helps?
That mlx4 is just a 'weird duck', it is not the normal flow, and I
don't think the core code should be making special consideration for
it.
How do you think we should do untagging (or something else) to deal
with this 'weird duck' case?
mlx4 should handle it around the call to find_vma like other patches
do, ideally as part of the cast from a void __user * to the unsigned
long that find_vma needs
So essentially what we had a few versions ago
(https://lkml.org/lkml/2019/4/30/785) plus changing unsigned longs to
__user * across all IB code? I think the second part is something
that's not related to this series and needs to be done separately. I
can move untagging back to mlx4_get_umem_mr() though.

Catalin, you've initially asked to to move untagging out of
mlx4_get_umem_mr(), do you have any comments on this?
Jason
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help