[openib-general] [RFC] [PATCH 1/3] RDMA CM: add rdma_get/set_optioncalls to get/set path records
Michael S. Tsirkin
mst at mellanox.co.il
Wed Apr 26 09:44:55 PDT 2006
Quoting r. Sean Hefty <mshefty at ichips.intel.com>:
> Subject: Re: [openib-general] [RFC] [PATCH 1/3] RDMA CM: add?rdma_get/set_optioncalls to get/set path records
>
> Michael S. Tsirkin wrote:
> >>+int rdma_set_option(struct rdma_cm_id *id, int level, int optname,
> >>+ void *optval, size_t optlen);
> >>+
> >
> >It seems optval is a user pointer. Should it be parked as such
> >void __user *.
>
> The getsockopt / setsockopt calls both use char *optval in their
> interfaces. Internally, they do get_user(), put_user(), copy_to_user(), etc.
>
> It's my understanding, which could be way off, that both getsockopt and
> setsockopt are also callable from kernel modules. I have not had a chance
> to try these calls with kernel memory to see what copy_to_user() would do.
I think this works on typical intel, but not so sure about other architectures.
You might need to be in process context so that current pointer is valid.
> >>+static int cma_set_ib_paths(struct rdma_id_private *id_priv,
> >>+ void *optval, size_t optlen)
> >>+{
> >>+ struct rdma_route *route = &id_priv->id.route;
> >>+ struct ib_user_path_rec user_path;
> >>+ int ret, i;
> >>+
> >>+ if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ROUTE_RESOLVED))
> >>+ return -EINVAL;
> >>+
> >>+ if (optlen == sizeof(user_path))
> >>+ route->num_paths = 1;
> >>+ else if (optlen == (sizeof(user_path) << 1))
> >>+ route->num_paths = 2;
> >>+ else {
> >>+ ret = -EINVAL;
> >>+ goto err1;
> >>+ }
> >>+
> >>+ route->path_rec = kmalloc(sizeof *route->path_rec * route->num_paths,
> >>+ GFP_KERNEL);
> >>+ if (!route->path_rec) {
> >>+ ret = -ENOMEM;
> >>+ goto err2;
> >>+ }
> >>+
> >>+ for (i = 0; i < route->num_paths; i++, optval += sizeof(user_path)) {
> >>+ if (copy_from_user(&user_path, (void __user *) optval,
> >>+ sizeof(user_path))) {
> >
> >
> >Apparently you assume userspace pointer here: so the interface is not
> >intended
> >for kernel users? So why is it not in ucma?
>
> The call needs to be handled in the cma, as opposed to the ucma for a
> couple of reasons. For the get_option, I need to protect against device
> removal while accessing the list of available path records. For the
> set_option routine, the call changes the state of the rdma_cm_id.
How about doing copy_from_user in ucma, and implementing
rdma_set_path/rdma_get_path in cma?
--
MST
More information about the general
mailing list