Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d9dfd06 authored by Shamir Rabinovitch's avatar Shamir Rabinovitch Committed by Jason Gunthorpe
Browse files

IB/uverbs: Add ib_ucontext to uverbs_attr_bundle sent from ioctl and cmd flows



Add ib_ucontext to the uverbs_attr_bundle sent down the iocl and cmd flows
as soon as the flow has ib_uobject.

In addition, remove rdma_get_ucontext helper function that is only used by
ib_umem_get.

Signed-off-by: default avatarShamir Rabinovitch <shamir.rabinovitch@oracle.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 0dd9ce18
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -438,6 +438,38 @@ struct ib_uobject *rdma_lookup_get_uobject(const struct uverbs_api_object *obj,
	uverbs_uobject_put(uobj);
	return ERR_PTR(ret);
}
struct ib_uobject *_uobj_get_read(enum uverbs_default_objects type,
				  u32 object_id,
				  struct uverbs_attr_bundle *attrs)
{
	struct ib_uobject *uobj;

	uobj = rdma_lookup_get_uobject(uobj_get_type(attrs, type), attrs->ufile,
				       object_id, UVERBS_LOOKUP_READ);
	if (IS_ERR(uobj))
		return uobj;

	attrs->context = uobj->context;

	return uobj;
}

struct ib_uobject *_uobj_get_write(enum uverbs_default_objects type,
				   u32 object_id,
				   struct uverbs_attr_bundle *attrs)
{
	struct ib_uobject *uobj;

	uobj = rdma_lookup_get_uobject(uobj_get_type(attrs, type), attrs->ufile,
				       object_id, UVERBS_LOOKUP_WRITE);

	if (IS_ERR(uobj))
		return uobj;

	attrs->context = uobj->context;

	return uobj;
}

static struct ib_uobject *
alloc_begin_idr_uobject(const struct uverbs_api_object *obj,
+7 −3
Original line number Diff line number Diff line
@@ -96,9 +96,13 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
	struct scatterlist *sg, *sg_list_start;
	unsigned int gup_flags = FOLL_WRITE;

	context = rdma_get_ucontext(udata);
	if (IS_ERR(context))
		return ERR_CAST(context);
	if (!udata)
		return ERR_PTR(-EIO);

	context = container_of(udata, struct uverbs_attr_bundle, driver_udata)
			  ->context;
	if (!context)
		return ERR_PTR(-EIO);

	if (dmasync)
		dma_attrs |= DMA_ATTR_WRITE_BARRIER;
+1 −1
Original line number Diff line number Diff line
@@ -2634,7 +2634,7 @@ void flow_resources_add(struct ib_uflow_resources *uflow_res,
}
EXPORT_SYMBOL(flow_resources_add);

static int kern_spec_to_ib_spec_action(const struct uverbs_attr_bundle *attrs,
static int kern_spec_to_ib_spec_action(struct uverbs_attr_bundle *attrs,
				       struct ib_uverbs_flow_spec *kern_spec,
				       union ib_flow_spec *ib_spec,
				       struct ib_uflow_resources *uflow_res)
+3 −0
Original line number Diff line number Diff line
@@ -213,6 +213,7 @@ static int uverbs_process_idrs_array(struct bundle_priv *pbundle,
			ret = PTR_ERR(attr->uobjects[i]);
			break;
		}
		pbundle->bundle.context = attr->uobjects[i]->context;
	}

	attr->len = i;
@@ -330,6 +331,7 @@ static int uverbs_process_attr(struct bundle_priv *pbundle,
					uattr->data_s64);
		if (IS_ERR(o_attr->uobject))
			return PTR_ERR(o_attr->uobject);
		pbundle->bundle.context = o_attr->uobject->context;
		__set_bit(attr_bkey, pbundle->uobj_finalize);

		if (spec->u.obj.access == UVERBS_ACCESS_NEW) {
@@ -592,6 +594,7 @@ static int ib_uverbs_cmd_verbs(struct ib_uverbs_file *ufile,
	pbundle->method_elm = method_elm;
	pbundle->method_key = attrs_iter.index;
	pbundle->bundle.ufile = ufile;
	pbundle->bundle.context = NULL; /* only valid if bundle has uobject */
	pbundle->radix = &uapi->radix;
	pbundle->radix_slots = slot;
	pbundle->radix_slots_len = radix_tree_chunk_size(&attrs_iter);
+1 −24
Original line number Diff line number Diff line
@@ -101,30 +101,6 @@ struct ib_ucontext *ib_uverbs_get_ucontext_file(struct ib_uverbs_file *ufile)
}
EXPORT_SYMBOL(ib_uverbs_get_ucontext_file);

/* rdma_get_ucontext - Return the ucontext from a udata
 * @udata: The udata to get the context from
 *
 * This can only be called from within a uapi method that was passed ib_udata
 * as a parameter. It returns the ucontext associated with the udata, or ERR_PTR
 * if the udata is NULL or the ucontext has been disassociated.
 */
struct ib_ucontext *rdma_get_ucontext(struct ib_udata *udata)
{
	if (!udata)
		return ERR_PTR(-EIO);

	/*
	 * FIXME: Really all cases that get here with a udata will have
	 * already called ib_uverbs_get_ucontext_file, or located a uobject
	 * that points to a ucontext. We could store that result in the udata
	 * so this function can't fail.
	 */
	return ib_uverbs_get_ucontext_file(
		container_of(udata, struct uverbs_attr_bundle, driver_udata)
			->ufile);
}
EXPORT_SYMBOL(rdma_get_ucontext);

int uverbs_dealloc_mw(struct ib_mw *mw)
{
	struct ib_pd *pd = mw->pd;
@@ -719,6 +695,7 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,

	memset(bundle.attr_present, 0, sizeof(bundle.attr_present));
	bundle.ufile = file;
	bundle.context = NULL; /* only valid if bundle has uobject */
	if (!method_elm->is_ex) {
		size_t in_len = hdr.in_words * 4 - sizeof(hdr);
		size_t out_len = hdr.out_words * 4;
Loading