[ofa-general] Re: [PATCH RFC] rds: add iwarp support
Steve Wise
swise at opengridcomputing.com
Mon Jul 7 14:14:20 PDT 2008
> diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
> index 0751697..0c5028a 100644
> --- a/drivers/infiniband/core/cma.c
> +++ b/drivers/infiniband/core/cma.c
> @@ -36,6 +36,7 @@
> #include <linux/random.h>
> #include <linux/idr.h>
> #include <linux/inetdevice.h>
> +#include <linux/if_arp.h>
>
> #include <net/tcp.h>
>
> @@ -200,6 +201,43 @@ struct sdp_hah {
> #define CMA_VERSION 0x00
> #define SDP_MAJ_VERSION 0x2
>
> +struct ib_device *ipaddr_to_ibdev(u32 addr)
> +{
> + struct rdma_dev_addr dev_addr;
> + struct cma_device *cma_dev;
> + struct net_device *dev;
> + union ib_gid gid;
> +
> + dev = ip_dev_find(addr);
> + if (!dev)
> + goto out;
> +
> + rdma_copy_addr(&dev_addr, dev, NULL);
> +
> + switch (dev->type) {
> + case ARPHRD_INFINIBAND:
> + ib_addr_get_sgid(&dev_addr, &gid);
> + break;
> + case ARPHRD_ETHER:
> + iw_addr_get_sgid(&dev_addr, &gid);
> + break;
> + default:
> + goto out;
> + }
> +
> + list_for_each_entry(cma_dev, &dev_list, list) {
> + int ret;
> + u8 port;
> +
> + ret = ib_find_cached_gid(cma_dev->device, &gid, &port, NULL);
> + if (!ret)
> + return cma_dev->device;
> + }
> +out:
> + return NULL;
> +}
> +EXPORT_SYMBOL(ipaddr_to_ibdev);
> +
> static int cma_comp(struct rdma_id_private *id_priv, enum cma_state comp)
> {
> unsigned long flags;
>
Pending our discussion on whether this service will even survive, there
is a bug in it. Function ip_dev_find() keeps a reference on the netdev.
So before returning, this function should do a dev_put(dev) to release
the reference...
More information about the general
mailing list