(trimmed down the cc list slightly as the message bounces) On Mon, Apr 29, 2019 at 09:09:15PM +0300, Leon Romanovsky wrote: > On Wed, Mar 20, 2019 at 03:51:30PM +0100, 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. > > > > mlx4_get_umem_mr() uses provided user pointers for vma lookups, which can > > only by done with untagged pointers. > > > > Untag user pointers in this function. > > > > Signed-off-by: Andrey Konovalov <andreyknvl@xxxxxxxxxx> > > --- > > drivers/infiniband/hw/mlx4/mr.c | 7 ++++--- > > 1 file changed, 4 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c > > index 395379a480cb..9a35ed2c6a6f 100644 > > --- a/drivers/infiniband/hw/mlx4/mr.c > > +++ b/drivers/infiniband/hw/mlx4/mr.c > > @@ -378,6 +378,7 @@ static struct ib_umem *mlx4_get_umem_mr(struct ib_udata *udata, u64 start, > > * again > > */ > > if (!ib_access_writable(access_flags)) { > > + unsigned long untagged_start = untagged_addr(start); > > struct vm_area_struct *vma; > > > > down_read(¤t->mm->mmap_sem); > > @@ -386,9 +387,9 @@ static struct ib_umem *mlx4_get_umem_mr(struct ib_udata *udata, u64 start, > > * cover the memory, but for now it requires a single vma to > > * entirely cover the MR to support RO mappings. > > */ > > - vma = find_vma(current->mm, start); > > - if (vma && vma->vm_end >= start + length && > > - vma->vm_start <= start) { > > + vma = find_vma(current->mm, untagged_start); > > + if (vma && vma->vm_end >= untagged_start + length && > > + vma->vm_start <= untagged_start) { > > if (vma->vm_flags & VM_WRITE) > > access_flags |= IB_ACCESS_LOCAL_WRITE; > > } else { > > -- > > Thanks, > Reviewed-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> Thanks for the review. > Interesting, the followup question is why mlx4 is only one driver in IB which > needs such code in umem_mr. I'll take a look on it. I don't know. Just using the light heuristics of find_vma() shows some other places. For example, ib_umem_odp_get() gets the umem->address via ib_umem_start(). This was previously set in ib_umem_get() as called from mlx4_get_umem_mr(). Should the above patch have just untagged "start" on entry? BTW, what's the provenience of such "start" address here? Is it something that the user would have malloc()'ed? We try to impose some restrictions one what is allowed to be tagged in user so that we don't have to untag the addresses in the kernel. For example, if it was the result of an mmap() on the device file, we don't allow tagging. Thanks. -- Catalin