On Tue, Jun 4, 2019 at 3:02 PM Jason Gunthorpe jgg@ziepe.ca wrote:
On Tue, Jun 04, 2019 at 02:45:32PM +0200, Andrey Konovalov wrote:
On Tue, Jun 4, 2019 at 2:27 PM Jason Gunthorpe jgg@ziepe.ca wrote:
On Tue, Jun 04, 2019 at 02:18:19PM +0200, Andrey Konovalov wrote:
On Mon, Jun 3, 2019 at 7:46 PM Jason Gunthorpe jgg@ziepe.ca wrote:
On Mon, Jun 03, 2019 at 06:55:14PM +0200, Andrey Konovalov wrote:
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 andreyknvl@google.com 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