Skip to content

Commit f5e27a2

Browse files
committed
Merge branch 'k.o/for-rc' into k.o/wip/dl-for-next
Several items of conflict have arisen between the RDMA stack's for-rc branch and upcoming for-next work: 9fd4350 ("IB/rxe: avoid double kfree_skb") directly conflicts with 2e47350 ("IB/rxe: optimize the function duplicate_request") Patches already submitted by Intel for the hfi1 driver will fail to apply cleanly without this merge Other people on the mailing list have notified that their upcoming patches also fail to apply cleanly without this merge Signed-off-by: Doug Ledford <[email protected]>
2 parents 064e526 + 9aa1692 commit f5e27a2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+407
-208
lines changed

drivers/infiniband/Kconfig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,12 @@ config INFINIBAND_ON_DEMAND_PAGING
6161
pages on demand instead.
6262

6363
config INFINIBAND_ADDR_TRANS
64-
bool
64+
bool "RDMA/CM"
6565
depends on INFINIBAND
6666
default y
67+
---help---
68+
Support for RDMA communication manager (CM).
69+
This allows for a generic connection abstraction over RDMA.
6770

6871
config INFINIBAND_ADDR_TRANS_CONFIGFS
6972
bool

drivers/infiniband/core/cache.c

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -291,14 +291,18 @@ static int find_gid(struct ib_gid_table *table, const union ib_gid *gid,
291291
* so lookup free slot only if requested.
292292
*/
293293
if (pempty && empty < 0) {
294-
if (data->props & GID_TABLE_ENTRY_INVALID) {
295-
/* Found an invalid (free) entry; allocate it */
296-
if (data->props & GID_TABLE_ENTRY_DEFAULT) {
297-
if (default_gid)
298-
empty = curr_index;
299-
} else {
300-
empty = curr_index;
301-
}
294+
if (data->props & GID_TABLE_ENTRY_INVALID &&
295+
(default_gid ==
296+
!!(data->props & GID_TABLE_ENTRY_DEFAULT))) {
297+
/*
298+
* Found an invalid (free) entry; allocate it.
299+
* If default GID is requested, then our
300+
* found slot must be one of the DEFAULT
301+
* reserved slots or we fail.
302+
* This ensures that only DEFAULT reserved
303+
* slots are used for default property GIDs.
304+
*/
305+
empty = curr_index;
302306
}
303307
}
304308

@@ -420,8 +424,10 @@ int ib_cache_gid_add(struct ib_device *ib_dev, u8 port,
420424
return ret;
421425
}
422426

423-
int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
424-
union ib_gid *gid, struct ib_gid_attr *attr)
427+
static int
428+
_ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
429+
union ib_gid *gid, struct ib_gid_attr *attr,
430+
unsigned long mask, bool default_gid)
425431
{
426432
struct ib_gid_table *table;
427433
int ret = 0;
@@ -431,11 +437,7 @@ int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
431437

432438
mutex_lock(&table->lock);
433439

434-
ix = find_gid(table, gid, attr, false,
435-
GID_ATTR_FIND_MASK_GID |
436-
GID_ATTR_FIND_MASK_GID_TYPE |
437-
GID_ATTR_FIND_MASK_NETDEV,
438-
NULL);
440+
ix = find_gid(table, gid, attr, default_gid, mask, NULL);
439441
if (ix < 0) {
440442
ret = -EINVAL;
441443
goto out_unlock;
@@ -452,6 +454,17 @@ int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
452454
return ret;
453455
}
454456

457+
int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
458+
union ib_gid *gid, struct ib_gid_attr *attr)
459+
{
460+
unsigned long mask = GID_ATTR_FIND_MASK_GID |
461+
GID_ATTR_FIND_MASK_GID_TYPE |
462+
GID_ATTR_FIND_MASK_DEFAULT |
463+
GID_ATTR_FIND_MASK_NETDEV;
464+
465+
return _ib_cache_gid_del(ib_dev, port, gid, attr, mask, false);
466+
}
467+
455468
int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
456469
struct net_device *ndev)
457470
{
@@ -728,15 +741,17 @@ void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
728741
unsigned long gid_type_mask,
729742
enum ib_cache_gid_default_mode mode)
730743
{
731-
union ib_gid gid;
744+
union ib_gid gid = { };
732745
struct ib_gid_attr gid_attr;
733746
struct ib_gid_table *table;
734747
unsigned int gid_type;
735748
unsigned long mask;
736749

737750
table = ib_dev->cache.ports[port - rdma_start_port(ib_dev)].gid;
738751

739-
make_default_gid(ndev, &gid);
752+
mask = GID_ATTR_FIND_MASK_GID_TYPE |
753+
GID_ATTR_FIND_MASK_DEFAULT |
754+
GID_ATTR_FIND_MASK_NETDEV;
740755
memset(&gid_attr, 0, sizeof(gid_attr));
741756
gid_attr.ndev = ndev;
742757

@@ -747,12 +762,12 @@ void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
747762
gid_attr.gid_type = gid_type;
748763

749764
if (mode == IB_CACHE_GID_DEFAULT_MODE_SET) {
750-
mask = GID_ATTR_FIND_MASK_GID_TYPE |
751-
GID_ATTR_FIND_MASK_DEFAULT;
765+
make_default_gid(ndev, &gid);
752766
__ib_cache_gid_add(ib_dev, port, &gid,
753767
&gid_attr, mask, true);
754768
} else if (mode == IB_CACHE_GID_DEFAULT_MODE_DELETE) {
755-
ib_cache_gid_del(ib_dev, port, &gid, &gid_attr);
769+
_ib_cache_gid_del(ib_dev, port, &gid,
770+
&gid_attr, mask, true);
756771
}
757772
}
758773
}

drivers/infiniband/core/cma.c

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,8 @@ struct cma_hdr {
381381
#define CMA_VERSION 0x00
382382

383383
struct cma_req_info {
384+
struct sockaddr_storage listen_addr_storage;
385+
struct sockaddr_storage src_addr_storage;
384386
struct ib_device *device;
385387
int port;
386388
union ib_gid local_gid;
@@ -865,7 +867,6 @@ static int cma_modify_qp_rtr(struct rdma_id_private *id_priv,
865867
{
866868
struct ib_qp_attr qp_attr;
867869
int qp_attr_mask, ret;
868-
union ib_gid sgid;
869870

870871
mutex_lock(&id_priv->qp_mutex);
871872
if (!id_priv->id.qp) {
@@ -888,12 +889,6 @@ static int cma_modify_qp_rtr(struct rdma_id_private *id_priv,
888889
if (ret)
889890
goto out;
890891

891-
ret = ib_query_gid(id_priv->id.device, id_priv->id.port_num,
892-
rdma_ah_read_grh(&qp_attr.ah_attr)->sgid_index,
893-
&sgid, NULL);
894-
if (ret)
895-
goto out;
896-
897892
BUG_ON(id_priv->cma_dev->device != id_priv->id.device);
898893

899894
if (conn_param)
@@ -1339,11 +1334,11 @@ static bool validate_net_dev(struct net_device *net_dev,
13391334
}
13401335

13411336
static struct net_device *cma_get_net_dev(struct ib_cm_event *ib_event,
1342-
const struct cma_req_info *req)
1337+
struct cma_req_info *req)
13431338
{
1344-
struct sockaddr_storage listen_addr_storage, src_addr_storage;
1345-
struct sockaddr *listen_addr = (struct sockaddr *)&listen_addr_storage,
1346-
*src_addr = (struct sockaddr *)&src_addr_storage;
1339+
struct sockaddr *listen_addr =
1340+
(struct sockaddr *)&req->listen_addr_storage;
1341+
struct sockaddr *src_addr = (struct sockaddr *)&req->src_addr_storage;
13471342
struct net_device *net_dev;
13481343
const union ib_gid *gid = req->has_gid ? &req->local_gid : NULL;
13491344
int err;
@@ -1358,11 +1353,6 @@ static struct net_device *cma_get_net_dev(struct ib_cm_event *ib_event,
13581353
if (!net_dev)
13591354
return ERR_PTR(-ENODEV);
13601355

1361-
if (!validate_net_dev(net_dev, listen_addr, src_addr)) {
1362-
dev_put(net_dev);
1363-
return ERR_PTR(-EHOSTUNREACH);
1364-
}
1365-
13661356
return net_dev;
13671357
}
13681358

@@ -1489,15 +1479,51 @@ static struct rdma_id_private *cma_id_from_event(struct ib_cm_id *cm_id,
14891479
}
14901480
}
14911481

1482+
/*
1483+
* Net namespace might be getting deleted while route lookup,
1484+
* cm_id lookup is in progress. Therefore, perform netdevice
1485+
* validation, cm_id lookup under rcu lock.
1486+
* RCU lock along with netdevice state check, synchronizes with
1487+
* netdevice migrating to different net namespace and also avoids
1488+
* case where net namespace doesn't get deleted while lookup is in
1489+
* progress.
1490+
* If the device state is not IFF_UP, its properties such as ifindex
1491+
* and nd_net cannot be trusted to remain valid without rcu lock.
1492+
* net/core/dev.c change_net_namespace() ensures to synchronize with
1493+
* ongoing operations on net device after device is closed using
1494+
* synchronize_net().
1495+
*/
1496+
rcu_read_lock();
1497+
if (*net_dev) {
1498+
/*
1499+
* If netdevice is down, it is likely that it is administratively
1500+
* down or it might be migrating to different namespace.
1501+
* In that case avoid further processing, as the net namespace
1502+
* or ifindex may change.
1503+
*/
1504+
if (((*net_dev)->flags & IFF_UP) == 0) {
1505+
id_priv = ERR_PTR(-EHOSTUNREACH);
1506+
goto err;
1507+
}
1508+
1509+
if (!validate_net_dev(*net_dev,
1510+
(struct sockaddr *)&req.listen_addr_storage,
1511+
(struct sockaddr *)&req.src_addr_storage)) {
1512+
id_priv = ERR_PTR(-EHOSTUNREACH);
1513+
goto err;
1514+
}
1515+
}
1516+
14921517
bind_list = cma_ps_find(*net_dev ? dev_net(*net_dev) : &init_net,
14931518
rdma_ps_from_service_id(req.service_id),
14941519
cma_port_from_service_id(req.service_id));
14951520
id_priv = cma_find_listener(bind_list, cm_id, ib_event, &req, *net_dev);
1521+
err:
1522+
rcu_read_unlock();
14961523
if (IS_ERR(id_priv) && *net_dev) {
14971524
dev_put(*net_dev);
14981525
*net_dev = NULL;
14991526
}
1500-
15011527
return id_priv;
15021528
}
15031529

drivers/infiniband/core/iwpm_util.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ int iwpm_create_mapinfo(struct sockaddr_storage *local_sockaddr,
114114
struct sockaddr_storage *mapped_sockaddr,
115115
u8 nl_client)
116116
{
117-
struct hlist_head *hash_bucket_head;
117+
struct hlist_head *hash_bucket_head = NULL;
118118
struct iwpm_mapping_info *map_info;
119119
unsigned long flags;
120120
int ret = -EINVAL;
@@ -142,6 +142,9 @@ int iwpm_create_mapinfo(struct sockaddr_storage *local_sockaddr,
142142
}
143143
}
144144
spin_unlock_irqrestore(&iwpm_mapinfo_lock, flags);
145+
146+
if (!hash_bucket_head)
147+
kfree(map_info);
145148
return ret;
146149
}
147150

drivers/infiniband/core/mad.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ module_param_named(recv_queue_size, mad_recvq_size, int, 0444);
5959
MODULE_PARM_DESC(recv_queue_size, "Size of receive queue in number of work requests");
6060

6161
static struct list_head ib_mad_port_list;
62-
static u32 ib_mad_client_id = 0;
62+
static atomic_t ib_mad_client_id = ATOMIC_INIT(0);
6363

6464
/* Port list lock */
6565
static DEFINE_SPINLOCK(ib_mad_port_list_lock);
@@ -377,7 +377,7 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
377377
}
378378

379379
spin_lock_irqsave(&port_priv->reg_lock, flags);
380-
mad_agent_priv->agent.hi_tid = ++ib_mad_client_id;
380+
mad_agent_priv->agent.hi_tid = atomic_inc_return(&ib_mad_client_id);
381381

382382
/*
383383
* Make sure MAD registration (if supplied)

drivers/infiniband/core/roce_gid_mgmt.c

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ static void bond_delete_netdev_default_gids(struct ib_device *ib_dev,
255255
struct net_device *rdma_ndev)
256256
{
257257
struct net_device *real_dev = rdma_vlan_dev_real_dev(event_ndev);
258+
unsigned long gid_type_mask;
258259

259260
if (!rdma_ndev)
260261
return;
@@ -264,21 +265,22 @@ static void bond_delete_netdev_default_gids(struct ib_device *ib_dev,
264265

265266
rcu_read_lock();
266267

267-
if (rdma_is_upper_dev_rcu(rdma_ndev, event_ndev) &&
268-
is_eth_active_slave_of_bonding_rcu(rdma_ndev, real_dev) ==
269-
BONDING_SLAVE_STATE_INACTIVE) {
270-
unsigned long gid_type_mask;
271-
268+
if (((rdma_ndev != event_ndev &&
269+
!rdma_is_upper_dev_rcu(rdma_ndev, event_ndev)) ||
270+
is_eth_active_slave_of_bonding_rcu(rdma_ndev, real_dev)
271+
==
272+
BONDING_SLAVE_STATE_INACTIVE)) {
272273
rcu_read_unlock();
274+
return;
275+
}
273276

274-
gid_type_mask = roce_gid_type_mask_support(ib_dev, port);
277+
rcu_read_unlock();
275278

276-
ib_cache_gid_set_default_gid(ib_dev, port, rdma_ndev,
277-
gid_type_mask,
278-
IB_CACHE_GID_DEFAULT_MODE_DELETE);
279-
} else {
280-
rcu_read_unlock();
281-
}
279+
gid_type_mask = roce_gid_type_mask_support(ib_dev, port);
280+
281+
ib_cache_gid_set_default_gid(ib_dev, port, rdma_ndev,
282+
gid_type_mask,
283+
IB_CACHE_GID_DEFAULT_MODE_DELETE);
282284
}
283285

284286
static void enum_netdev_ipv4_ips(struct ib_device *ib_dev,

0 commit comments

Comments
 (0)