[openib-general] [PATCH] [RFC] librdmacm: expose device list to users
Andrew Friedley
afriedle at open-mpi.org
Mon Jul 24 10:59:27 PDT 2006
What's the best way to map the ibv_context's return from
rdma_get_devices() to rdma_cm_id's for use with the rest of the RDMA
functions?
Should I allocate my own rdma_cm_id and fill it in (like
rdma_create_id()), or am I missing something?
Andrew
Sean Hefty wrote:
> The following patch adds calls to the userspace RDMA CM to return its list
> of RDMA devices. The calls are similar to ibv_get_device_list() /
> ibv_free_device_list().
>
> Currently, RDMA device contexts are handed to the user only after they
> create an rdma_cm_id and bind it to a local device. By exposing the device
> list to the user, it makes it easier for the user to allocate device
> specific resources (such as PDs, CQs, etc.) that are shared among multiple
> rdma_cm_id's.
>
> Signed-off-by: Sean Hefty <sean.hefty at intel.com>
> ---
> Index: include/rdma/rdma_cma.h
> ===================================================================
> --- include/rdma/rdma_cma.h (revision 8215)
> +++ include/rdma/rdma_cma.h (working copy)
> @@ -332,4 +332,20 @@ static inline uint16_t rdma_get_dst_port
> ((struct sockaddr_in *) &id->route.addr.dst_addr)->sin_port;
> }
>
> +/**
> + * rdma_get_devices - Get list of RDMA devices currently available.
> + * @num_devices: If non-NULL, set to the number of devices returned.
> + *
> + * Return a NULL-terminated array of opened RDMA devices. Callers can use this
> + * routine to allocate resources on specific RDMA devices that will be shared
> + * across multiple rdma_cm_id's.
> + * The array must be released by calling rdma_free_devices().
> + */
> +struct ibv_context **rdma_get_devices(int *num_devices);
> +
> +/**
> + * rdma_free_devices - Frees the list of devices returned by rdma_get_devices().
> + */
> +void rdma_free_devices(struct ibv_context **list);
> +
> #endif /* RDMA_CMA_H */
> Index: src/cma.c
> ===================================================================
> --- src/cma.c (revision 8517)
> +++ src/cma.c (working copy)
> @@ -216,6 +216,32 @@ err:
> return ret;
> }
>
> +struct ibv_context **rdma_get_devices(int *num_devices)
> +{
> + struct ibv_context **devs = NULL;
> + int i;
> +
> + if (!cma_dev_cnt && ucma_init())
> + goto out;
> +
> + devs = malloc(sizeof *devs * (cma_dev_cnt + 1));
> + if (!devs)
> + goto out;
> +
> + for (i = 0; i < cma_dev_cnt; i++)
> + devs[i] = cma_dev_array[i].verbs;
> + devs[i] = NULL;
> +out:
> + if (num_devices)
> + *num_devices = devs ? cma_dev_cnt : 0;
> + return devs;
> +}
> +
> +void rdma_free_devices(struct ibv_context **list)
> +{
> + free(list);
> +}
> +
> static void __attribute__((destructor)) rdma_cma_fini(void)
> {
> ucma_cleanup();
> Index: src/librdmacm.map
> ===================================================================
> --- src/librdmacm.map (revision 8215)
> +++ src/librdmacm.map (working copy)
> @@ -21,5 +21,7 @@ RDMACM_1.0 {
> rdma_get_dst_attr;
> rdma_join_multicast;
> rdma_leave_multicast;
> + rdma_get_devices;
> + rdma_free_devices;
> local: *;
> };
>
>
> _______________________________________________
> openib-general mailing list
> openib-general at openib.org
> http://openib.org/mailman/listinfo/openib-general
>
> To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
More information about the general
mailing list