Skip to content

Commit 48107c4

Browse files
committed
Merge tag 'rdma-rc-2017-07-26' of git://git.kernel.org/pub/scm/linux/kernel/git/leon/linux-rdma into leon-ipoib
IPoIB fixes for 4.13 The patchset provides various fixes for IPoIB. It is combination of fixes to various issues discovered during verification along with static checkers cleanup patches. Most of the patches are from pre-git era and hence lack of Fixes lines. There is one exception in this IPoIB group - addition of patch revert: Revert "IB/core: Allow QP state transition from reset to error", but it followed by proper fix to the annoying print, so I thought it is appropriate to include it. Signed-off-by: Doug Ledford <[email protected]>
2 parents 5db465f + 5dc78ad commit 48107c4

File tree

7 files changed

+50
-33
lines changed

7 files changed

+50
-33
lines changed

drivers/infiniband/core/verbs.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,6 @@ static const struct {
895895
} qp_state_table[IB_QPS_ERR + 1][IB_QPS_ERR + 1] = {
896896
[IB_QPS_RESET] = {
897897
[IB_QPS_RESET] = { .valid = 1 },
898-
[IB_QPS_ERR] = { .valid = 1 },
899898
[IB_QPS_INIT] = {
900899
.valid = 1,
901900
.req_param = {

drivers/infiniband/ulp/ipoib/ipoib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ struct ipoib_dev_priv {
336336
unsigned long flags;
337337

338338
struct rw_semaphore vlan_rwsem;
339+
struct mutex mcast_mutex;
339340

340341
struct rb_root path_tree;
341342
struct list_head path_list;

drivers/infiniband/ulp/ipoib/ipoib_cm.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,6 @@ static int ipoib_cm_rx_handler(struct ib_cm_id *cm_id,
511511
case IB_CM_REQ_RECEIVED:
512512
return ipoib_cm_req_handler(cm_id, event);
513513
case IB_CM_DREQ_RECEIVED:
514-
p = cm_id->context;
515514
ib_send_cm_drep(cm_id, NULL, 0);
516515
/* Fall through */
517516
case IB_CM_REJ_RECEIVED:

drivers/infiniband/ulp/ipoib/ipoib_ethtool.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ static const struct ipoib_stats ipoib_gstrings_stats[] = {
5252
IPOIB_NETDEV_STAT(tx_bytes),
5353
IPOIB_NETDEV_STAT(tx_errors),
5454
IPOIB_NETDEV_STAT(rx_dropped),
55-
IPOIB_NETDEV_STAT(tx_dropped)
55+
IPOIB_NETDEV_STAT(tx_dropped),
56+
IPOIB_NETDEV_STAT(multicast),
5657
};
5758

5859
#define IPOIB_GLOBAL_STATS_LEN ARRAY_SIZE(ipoib_gstrings_stats)

drivers/infiniband/ulp/ipoib/ipoib_ib.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
256256

257257
++dev->stats.rx_packets;
258258
dev->stats.rx_bytes += skb->len;
259+
if (skb->pkt_type == PACKET_MULTICAST)
260+
dev->stats.multicast++;
259261

260262
skb->dev = dev;
261263
if ((dev->features & NETIF_F_RXCSUM) &&
@@ -709,6 +711,27 @@ static int recvs_pending(struct net_device *dev)
709711
return pending;
710712
}
711713

714+
static void check_qp_movement_and_print(struct ipoib_dev_priv *priv,
715+
struct ib_qp *qp,
716+
enum ib_qp_state new_state)
717+
{
718+
struct ib_qp_attr qp_attr;
719+
struct ib_qp_init_attr query_init_attr;
720+
int ret;
721+
722+
ret = ib_query_qp(qp, &qp_attr, IB_QP_STATE, &query_init_attr);
723+
if (ret) {
724+
ipoib_warn(priv, "%s: Failed to query QP\n", __func__);
725+
return;
726+
}
727+
/* print according to the new-state and the previous state.*/
728+
if (new_state == IB_QPS_ERR && qp_attr.qp_state == IB_QPS_RESET)
729+
ipoib_dbg(priv, "Failed modify QP, IB_QPS_RESET to IB_QPS_ERR, acceptable\n");
730+
else
731+
ipoib_warn(priv, "Failed to modify QP to state: %d from state: %d\n",
732+
new_state, qp_attr.qp_state);
733+
}
734+
712735
int ipoib_ib_dev_stop_default(struct net_device *dev)
713736
{
714737
struct ipoib_dev_priv *priv = ipoib_priv(dev);
@@ -728,7 +751,7 @@ int ipoib_ib_dev_stop_default(struct net_device *dev)
728751
*/
729752
qp_attr.qp_state = IB_QPS_ERR;
730753
if (ib_modify_qp(priv->qp, &qp_attr, IB_QP_STATE))
731-
ipoib_warn(priv, "Failed to modify QP to ERROR state\n");
754+
check_qp_movement_and_print(priv, priv->qp, IB_QPS_ERR);
732755

733756
/* Wait for all sends and receives to complete */
734757
begin = jiffies;

drivers/infiniband/ulp/ipoib/ipoib_main.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,6 +1560,7 @@ static void ipoib_flush_neighs(struct ipoib_dev_priv *priv)
15601560
int i, wait_flushed = 0;
15611561

15621562
init_completion(&priv->ntbl.flushed);
1563+
set_bit(IPOIB_NEIGH_TBL_FLUSH, &priv->flags);
15631564

15641565
spin_lock_irqsave(&priv->lock, flags);
15651566

@@ -1604,7 +1605,6 @@ static void ipoib_neigh_hash_uninit(struct net_device *dev)
16041605

16051606
ipoib_dbg(priv, "ipoib_neigh_hash_uninit\n");
16061607
init_completion(&priv->ntbl.deleted);
1607-
set_bit(IPOIB_NEIGH_TBL_FLUSH, &priv->flags);
16081608

16091609
/* Stop GC if called at init fail need to cancel work */
16101610
stopped = test_and_set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags);
@@ -1847,6 +1847,7 @@ static const struct net_device_ops ipoib_netdev_ops_vf = {
18471847
.ndo_tx_timeout = ipoib_timeout,
18481848
.ndo_set_rx_mode = ipoib_set_mcast_list,
18491849
.ndo_get_iflink = ipoib_get_iflink,
1850+
.ndo_get_stats64 = ipoib_get_stats,
18501851
};
18511852

18521853
void ipoib_setup_common(struct net_device *dev)
@@ -1877,6 +1878,7 @@ static void ipoib_build_priv(struct net_device *dev)
18771878
priv->dev = dev;
18781879
spin_lock_init(&priv->lock);
18791880
init_rwsem(&priv->vlan_rwsem);
1881+
mutex_init(&priv->mcast_mutex);
18801882

18811883
INIT_LIST_HEAD(&priv->path_list);
18821884
INIT_LIST_HEAD(&priv->child_intfs);
@@ -2173,14 +2175,14 @@ static struct net_device *ipoib_add_port(const char *format,
21732175
priv->dev->dev_id = port - 1;
21742176

21752177
result = ib_query_port(hca, port, &attr);
2176-
if (!result)
2177-
priv->max_ib_mtu = ib_mtu_enum_to_int(attr.max_mtu);
2178-
else {
2178+
if (result) {
21792179
printk(KERN_WARNING "%s: ib_query_port %d failed\n",
21802180
hca->name, port);
21812181
goto device_init_failed;
21822182
}
21832183

2184+
priv->max_ib_mtu = ib_mtu_enum_to_int(attr.max_mtu);
2185+
21842186
/* MTU will be reset when mcast join happens */
21852187
priv->dev->mtu = IPOIB_UD_MTU(priv->max_ib_mtu);
21862188
priv->mcast_mtu = priv->admin_mtu = priv->dev->mtu;
@@ -2211,12 +2213,14 @@ static struct net_device *ipoib_add_port(const char *format,
22112213
printk(KERN_WARNING "%s: ib_query_gid port %d failed (ret = %d)\n",
22122214
hca->name, port, result);
22132215
goto device_init_failed;
2214-
} else
2215-
memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid));
2216+
}
2217+
2218+
memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw,
2219+
sizeof(union ib_gid));
22162220
set_bit(IPOIB_FLAG_DEV_ADDR_SET, &priv->flags);
22172221

22182222
result = ipoib_dev_init(priv->dev, hca, port);
2219-
if (result < 0) {
2223+
if (result) {
22202224
printk(KERN_WARNING "%s: failed to initialize port %d (ret = %d)\n",
22212225
hca->name, port, result);
22222226
goto device_init_failed;
@@ -2365,6 +2369,7 @@ static int __init ipoib_init_module(void)
23652369
ipoib_sendq_size = max3(ipoib_sendq_size, 2 * MAX_SEND_CQE, IPOIB_MIN_QUEUE_SIZE);
23662370
#ifdef CONFIG_INFINIBAND_IPOIB_CM
23672371
ipoib_max_conn_qp = min(ipoib_max_conn_qp, IPOIB_CM_MAX_CONN_QP);
2372+
ipoib_max_conn_qp = max(ipoib_max_conn_qp, 0);
23682373
#endif
23692374

23702375
/*

drivers/infiniband/ulp/ipoib/ipoib_multicast.c

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -684,15 +684,10 @@ void ipoib_mcast_start_thread(struct net_device *dev)
684684
int ipoib_mcast_stop_thread(struct net_device *dev)
685685
{
686686
struct ipoib_dev_priv *priv = ipoib_priv(dev);
687-
unsigned long flags;
688687

689688
ipoib_dbg_mcast(priv, "stopping multicast thread\n");
690689

691-
spin_lock_irqsave(&priv->lock, flags);
692-
cancel_delayed_work(&priv->mcast_task);
693-
spin_unlock_irqrestore(&priv->lock, flags);
694-
695-
flush_workqueue(priv->wq);
690+
cancel_delayed_work_sync(&priv->mcast_task);
696691

697692
return 0;
698693
}
@@ -748,6 +743,14 @@ void ipoib_mcast_remove_list(struct list_head *remove_list)
748743
{
749744
struct ipoib_mcast *mcast, *tmcast;
750745

746+
/*
747+
* make sure the in-flight joins have finished before we attempt
748+
* to leave
749+
*/
750+
list_for_each_entry_safe(mcast, tmcast, remove_list, list)
751+
if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
752+
wait_for_completion(&mcast->done);
753+
751754
list_for_each_entry_safe(mcast, tmcast, remove_list, list) {
752755
ipoib_mcast_leave(mcast->dev, mcast);
753756
ipoib_mcast_free(mcast);
@@ -838,6 +841,7 @@ void ipoib_mcast_dev_flush(struct net_device *dev)
838841
struct ipoib_mcast *mcast, *tmcast;
839842
unsigned long flags;
840843

844+
mutex_lock(&priv->mcast_mutex);
841845
ipoib_dbg_mcast(priv, "flushing multicast list\n");
842846

843847
spin_lock_irqsave(&priv->lock, flags);
@@ -856,15 +860,8 @@ void ipoib_mcast_dev_flush(struct net_device *dev)
856860

857861
spin_unlock_irqrestore(&priv->lock, flags);
858862

859-
/*
860-
* make sure the in-flight joins have finished before we attempt
861-
* to leave
862-
*/
863-
list_for_each_entry_safe(mcast, tmcast, &remove_list, list)
864-
if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
865-
wait_for_completion(&mcast->done);
866-
867863
ipoib_mcast_remove_list(&remove_list);
864+
mutex_unlock(&priv->mcast_mutex);
868865
}
869866

870867
static int ipoib_mcast_addr_is_valid(const u8 *addr, const u8 *broadcast)
@@ -982,14 +979,6 @@ void ipoib_mcast_restart_task(struct work_struct *work)
982979
netif_addr_unlock(dev);
983980
local_irq_restore(flags);
984981

985-
/*
986-
* make sure the in-flight joins have finished before we attempt
987-
* to leave
988-
*/
989-
list_for_each_entry_safe(mcast, tmcast, &remove_list, list)
990-
if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
991-
wait_for_completion(&mcast->done);
992-
993982
ipoib_mcast_remove_list(&remove_list);
994983

995984
/*

0 commit comments

Comments
 (0)