Commit adb4a57a authored by Parav Pandit's avatar Parav Pandit Committed by Jason Gunthorpe

RDMA/cma: Use rdma_read_gid_attr_ndev_rcu to access netdev

To access the netdevice of the GID attribute, use an existing API
rdma_read_gid_attr_ndev_rcu().

This further reduces dependency on open access to netdevice of GID
attribute.
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent a70c0739
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <net/addrconf.h> #include <net/addrconf.h>
#include <net/ip6_route.h> #include <net/ip6_route.h>
#include <rdma/ib_addr.h> #include <rdma/ib_addr.h>
#include <rdma/ib_cache.h>
#include <rdma/ib_sa.h> #include <rdma/ib_sa.h>
#include <rdma/ib.h> #include <rdma/ib.h>
#include <rdma/rdma_netlink.h> #include <rdma/rdma_netlink.h>
......
...@@ -1249,6 +1249,7 @@ struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr) ...@@ -1249,6 +1249,7 @@ struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr)
read_unlock_irqrestore(&table->rwlock, flags); read_unlock_irqrestore(&table->rwlock, flags);
return ndev; return ndev;
} }
EXPORT_SYMBOL(rdma_read_gid_attr_ndev_rcu);
static int get_lower_dev_vlan(struct net_device *lower_dev, void *data) static int get_lower_dev_vlan(struct net_device *lower_dev, void *data)
{ {
......
...@@ -1486,6 +1486,7 @@ static struct net_device * ...@@ -1486,6 +1486,7 @@ static struct net_device *
roce_get_net_dev_by_cm_event(const struct ib_cm_event *ib_event) roce_get_net_dev_by_cm_event(const struct ib_cm_event *ib_event)
{ {
const struct ib_gid_attr *sgid_attr = NULL; const struct ib_gid_attr *sgid_attr = NULL;
struct net_device *ndev;
if (ib_event->event == IB_CM_REQ_RECEIVED) if (ib_event->event == IB_CM_REQ_RECEIVED)
sgid_attr = ib_event->param.req_rcvd.ppath_sgid_attr; sgid_attr = ib_event->param.req_rcvd.ppath_sgid_attr;
...@@ -1494,8 +1495,15 @@ roce_get_net_dev_by_cm_event(const struct ib_cm_event *ib_event) ...@@ -1494,8 +1495,15 @@ roce_get_net_dev_by_cm_event(const struct ib_cm_event *ib_event)
if (!sgid_attr) if (!sgid_attr)
return NULL; return NULL;
dev_hold(sgid_attr->ndev);
return sgid_attr->ndev; rcu_read_lock();
ndev = rdma_read_gid_attr_ndev_rcu(sgid_attr);
if (IS_ERR(ndev))
ndev = NULL;
else
dev_hold(ndev);
rcu_read_unlock();
return ndev;
} }
static struct net_device *cma_get_net_dev(const struct ib_cm_event *ib_event, static struct net_device *cma_get_net_dev(const struct ib_cm_event *ib_event,
......
...@@ -56,6 +56,7 @@ const struct ib_gid_attr *rdma_find_gid_by_filter( ...@@ -56,6 +56,7 @@ const struct ib_gid_attr *rdma_find_gid_by_filter(
int rdma_read_gid_l2_fields(const struct ib_gid_attr *attr, int rdma_read_gid_l2_fields(const struct ib_gid_attr *attr,
u16 *vlan_id, u8 *smac); u16 *vlan_id, u8 *smac);
struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr);
/** /**
* ib_get_cached_pkey - Returns a cached PKey table entry * ib_get_cached_pkey - Returns a cached PKey table entry
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment