aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-05-14 15:41:05 -0400
committerDavid S. Miller <davem@davemloft.net>2014-05-14 15:41:05 -0400
commit005e35f5f0783925428a78bb2b21ae92f3514e9c (patch)
treedddddda6e3f4e417065e91febffa04f16b9186cd
parent3763e7ef17143f5e9ae044638e65d2b0c0305fcf (diff)
parent7572038409d0288ff5ba9c77a053ddec6791a43c (diff)
Merge branch 'mlx4-next'
Or Gerlitz says: ==================== Mellanox driver update 2014-05-12 This patchset introduce some small bug fixes: Eyal fixed some compilation and syntactic checkers warnings. Ido fixed a coruption in user priority mapping when changing number of channels. Shani fixed some other problems when modifying MAC address. Yuval fixed a problem when changing IRQ affinity during high traffic - IRQ changes got effective only after the first pause in traffic. This patchset was tested and applied over commit 93dccc5: "mdio_bus: fix devm_mdiobus_alloc_size export" Changes from V1: - applied feedback from Dave to use true/false and not 0/1 in patch 1/9 - removed the patch from Noa which adddressed a bug in flow steering table when using a bond device, as the fix might need to be in the bonding driver, this is now dicussed in the netdev thread "bonding directly changes underlying device address" Changes from V0: - Patch 1/9 - net/mlx4_core: Enforce irq affinity changes immediatly - Moved the new members to a hot cache line as Eric suggested ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c14
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cq.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_ethtool.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c12
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_rx.c11
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_tx.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/eq.c62
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c9
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mcg.c2
-rw-r--r--include/linux/mlx4/device.h3
10 files changed, 110 insertions, 15 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index 24201033661b..357dcb0f04fb 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -473,6 +473,13 @@ static int mlx4_cmd_poll(struct mlx4_dev *dev, u64 in_param, u64 *out_param,
473 goto out; 473 goto out;
474 } 474 }
475 475
476 if (out_is_imm && !out_param) {
477 mlx4_err(dev, "response expected while output mailbox is NULL for command 0x%x\n",
478 op);
479 err = -EINVAL;
480 goto out;
481 }
482
476 err = mlx4_cmd_post(dev, in_param, out_param ? *out_param : 0, 483 err = mlx4_cmd_post(dev, in_param, out_param ? *out_param : 0,
477 in_modifier, op_modifier, op, CMD_POLL_TOKEN, 0); 484 in_modifier, op_modifier, op, CMD_POLL_TOKEN, 0);
478 if (err) 485 if (err)
@@ -551,6 +558,13 @@ static int mlx4_cmd_wait(struct mlx4_dev *dev, u64 in_param, u64 *out_param,
551 cmd->free_head = context->next; 558 cmd->free_head = context->next;
552 spin_unlock(&cmd->context_lock); 559 spin_unlock(&cmd->context_lock);
553 560
561 if (out_is_imm && !out_param) {
562 mlx4_err(dev, "response expected while output mailbox is NULL for command 0x%x\n",
563 op);
564 err = -EINVAL;
565 goto out;
566 }
567
554 init_completion(&context->done); 568 init_completion(&context->done);
555 569
556 mlx4_cmd_post(dev, in_param, out_param ? *out_param : 0, 570 mlx4_cmd_post(dev, in_param, out_param ? *out_param : 0,
diff --git a/drivers/net/ethernet/mellanox/mlx4/cq.c b/drivers/net/ethernet/mellanox/mlx4/cq.c
index 0487121e4a0f..8542030b89cf 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cq.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cq.c
@@ -293,6 +293,9 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent,
293 atomic_set(&cq->refcount, 1); 293 atomic_set(&cq->refcount, 1);
294 init_completion(&cq->free); 294 init_completion(&cq->free);
295 295
296 cq->irq = priv->eq_table.eq[cq->vector].irq;
297 cq->irq_affinity_change = false;
298
296 return 0; 299 return 0;
297 300
298err_radix: 301err_radix:
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index c3736045e7af..a72d99fd7a2d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -1151,7 +1151,8 @@ static int mlx4_en_set_channels(struct net_device *dev,
1151 netif_set_real_num_tx_queues(dev, priv->tx_ring_num); 1151 netif_set_real_num_tx_queues(dev, priv->tx_ring_num);
1152 netif_set_real_num_rx_queues(dev, priv->rx_ring_num); 1152 netif_set_real_num_rx_queues(dev, priv->rx_ring_num);
1153 1153
1154 mlx4_en_setup_tc(dev, MLX4_EN_NUM_UP); 1154 if (dev->num_tc)
1155 mlx4_en_setup_tc(dev, MLX4_EN_NUM_UP);
1155 1156
1156 en_warn(priv, "Using %d TX rings\n", priv->tx_ring_num); 1157 en_warn(priv, "Using %d TX rings\n", priv->tx_ring_num);
1157 en_warn(priv, "Using %d RX rings\n", priv->rx_ring_num); 1158 en_warn(priv, "Using %d RX rings\n", priv->rx_ring_num);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 79c6f467d17e..58209bd0c94c 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -130,7 +130,7 @@ static enum mlx4_net_trans_rule_id mlx4_ip_proto_to_trans_rule_id(u8 ip_proto)
130 case IPPROTO_TCP: 130 case IPPROTO_TCP:
131 return MLX4_NET_TRANS_RULE_ID_TCP; 131 return MLX4_NET_TRANS_RULE_ID_TCP;
132 default: 132 default:
133 return -EPROTONOSUPPORT; 133 return MLX4_NET_TRANS_RULE_NUM;
134 } 134 }
135}; 135};
136 136
@@ -177,7 +177,7 @@ static void mlx4_en_filter_work(struct work_struct *work)
177 int rc; 177 int rc;
178 __be64 mac_mask = cpu_to_be64(MLX4_MAC_MASK << 16); 178 __be64 mac_mask = cpu_to_be64(MLX4_MAC_MASK << 16);
179 179
180 if (spec_tcp_udp.id < 0) { 180 if (spec_tcp_udp.id >= MLX4_NET_TRANS_RULE_NUM) {
181 en_warn(priv, "RFS: ignoring unsupported ip protocol (%d)\n", 181 en_warn(priv, "RFS: ignoring unsupported ip protocol (%d)\n",
182 filter->ip_proto); 182 filter->ip_proto);
183 goto ignore; 183 goto ignore;
@@ -770,11 +770,12 @@ static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv)
770 priv->dev->dev_addr, priv->prev_mac); 770 priv->dev->dev_addr, priv->prev_mac);
771 if (err) 771 if (err)
772 en_err(priv, "Failed changing HW MAC address\n"); 772 en_err(priv, "Failed changing HW MAC address\n");
773 memcpy(priv->prev_mac, priv->dev->dev_addr,
774 sizeof(priv->prev_mac));
775 } else 773 } else
776 en_dbg(HW, priv, "Port is down while registering mac, exiting...\n"); 774 en_dbg(HW, priv, "Port is down while registering mac, exiting...\n");
777 775
776 memcpy(priv->prev_mac, priv->dev->dev_addr,
777 sizeof(priv->prev_mac));
778
778 return err; 779 return err;
779} 780}
780 781
@@ -788,9 +789,8 @@ static int mlx4_en_set_mac(struct net_device *dev, void *addr)
788 if (!is_valid_ether_addr(saddr->sa_data)) 789 if (!is_valid_ether_addr(saddr->sa_data))
789 return -EADDRNOTAVAIL; 790 return -EADDRNOTAVAIL;
790 791
791 memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
792
793 mutex_lock(&mdev->state_lock); 792 mutex_lock(&mdev->state_lock);
793 memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
794 err = mlx4_en_do_set_mac(priv); 794 err = mlx4_en_do_set_mac(priv);
795 mutex_unlock(&mdev->state_lock); 795 mutex_unlock(&mdev->state_lock);
796 796
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index a1512450816d..e8c0d2b832b7 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -895,10 +895,17 @@ int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget)
895 mlx4_en_cq_unlock_napi(cq); 895 mlx4_en_cq_unlock_napi(cq);
896 896
897 /* If we used up all the quota - we're probably not done yet... */ 897 /* If we used up all the quota - we're probably not done yet... */
898 if (done == budget) 898 if (done == budget) {
899 INC_PERF_COUNTER(priv->pstats.napi_quota); 899 INC_PERF_COUNTER(priv->pstats.napi_quota);
900 else { 900 if (unlikely(cq->mcq.irq_affinity_change)) {
901 cq->mcq.irq_affinity_change = false;
902 napi_complete(napi);
903 mlx4_en_arm_cq(priv, cq);
904 return 0;
905 }
906 } else {
901 /* Done for now */ 907 /* Done for now */
908 cq->mcq.irq_affinity_change = false;
902 napi_complete(napi); 909 napi_complete(napi);
903 mlx4_en_arm_cq(priv, cq); 910 mlx4_en_arm_cq(priv, cq);
904 } 911 }
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index 89585c6311c3..cb964056d710 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -474,9 +474,15 @@ int mlx4_en_poll_tx_cq(struct napi_struct *napi, int budget)
474 /* If we used up all the quota - we're probably not done yet... */ 474 /* If we used up all the quota - we're probably not done yet... */
475 if (done < budget) { 475 if (done < budget) {
476 /* Done for now */ 476 /* Done for now */
477 cq->mcq.irq_affinity_change = false;
477 napi_complete(napi); 478 napi_complete(napi);
478 mlx4_en_arm_cq(priv, cq); 479 mlx4_en_arm_cq(priv, cq);
479 return done; 480 return done;
481 } else if (unlikely(cq->mcq.irq_affinity_change)) {
482 cq->mcq.irq_affinity_change = false;
483 napi_complete(napi);
484 mlx4_en_arm_cq(priv, cq);
485 return 0;
480 } 486 }
481 return budget; 487 return budget;
482} 488}
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c
index 6c088bc1845b..d954ec1eac17 100644
--- a/drivers/net/ethernet/mellanox/mlx4/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx4/eq.c
@@ -53,6 +53,11 @@ enum {
53 MLX4_EQ_ENTRY_SIZE = 0x20 53 MLX4_EQ_ENTRY_SIZE = 0x20
54}; 54};
55 55
56struct mlx4_irq_notify {
57 void *arg;
58 struct irq_affinity_notify notify;
59};
60
56#define MLX4_EQ_STATUS_OK ( 0 << 28) 61#define MLX4_EQ_STATUS_OK ( 0 << 28)
57#define MLX4_EQ_STATUS_WRITE_FAIL (10 << 28) 62#define MLX4_EQ_STATUS_WRITE_FAIL (10 << 28)
58#define MLX4_EQ_OWNER_SW ( 0 << 24) 63#define MLX4_EQ_OWNER_SW ( 0 << 24)
@@ -1083,6 +1088,57 @@ static void mlx4_unmap_clr_int(struct mlx4_dev *dev)
1083 iounmap(priv->clr_base); 1088 iounmap(priv->clr_base);
1084} 1089}
1085 1090
1091static void mlx4_irq_notifier_notify(struct irq_affinity_notify *notify,
1092 const cpumask_t *mask)
1093{
1094 struct mlx4_irq_notify *n = container_of(notify,
1095 struct mlx4_irq_notify,
1096 notify);
1097 struct mlx4_priv *priv = (struct mlx4_priv *)n->arg;
1098 struct radix_tree_iter iter;
1099 void **slot;
1100
1101 radix_tree_for_each_slot(slot, &priv->cq_table.tree, &iter, 0) {
1102 struct mlx4_cq *cq = (struct mlx4_cq *)(*slot);
1103
1104 if (cq->irq == notify->irq)
1105 cq->irq_affinity_change = true;
1106 }
1107}
1108
1109static void mlx4_release_irq_notifier(struct kref *ref)
1110{
1111 struct mlx4_irq_notify *n = container_of(ref, struct mlx4_irq_notify,
1112 notify.kref);
1113 kfree(n);
1114}
1115
1116static void mlx4_assign_irq_notifier(struct mlx4_priv *priv,
1117 struct mlx4_dev *dev, int irq)
1118{
1119 struct mlx4_irq_notify *irq_notifier = NULL;
1120 int err = 0;
1121
1122 irq_notifier = kzalloc(sizeof(*irq_notifier), GFP_KERNEL);
1123 if (!irq_notifier) {
1124 mlx4_warn(dev, "Failed to allocate irq notifier. irq %d\n",
1125 irq);
1126 return;
1127 }
1128
1129 irq_notifier->notify.irq = irq;
1130 irq_notifier->notify.notify = mlx4_irq_notifier_notify;
1131 irq_notifier->notify.release = mlx4_release_irq_notifier;
1132 irq_notifier->arg = priv;
1133 err = irq_set_affinity_notifier(irq, &irq_notifier->notify);
1134 if (err) {
1135 kfree(irq_notifier);
1136 irq_notifier = NULL;
1137 mlx4_warn(dev, "Failed to set irq notifier. irq %d\n", irq);
1138 }
1139}
1140
1141
1086int mlx4_alloc_eq_table(struct mlx4_dev *dev) 1142int mlx4_alloc_eq_table(struct mlx4_dev *dev)
1087{ 1143{
1088 struct mlx4_priv *priv = mlx4_priv(dev); 1144 struct mlx4_priv *priv = mlx4_priv(dev);
@@ -1353,6 +1409,9 @@ int mlx4_assign_eq(struct mlx4_dev *dev, char *name, struct cpu_rmap *rmap,
1353 continue; 1409 continue;
1354 /*we dont want to break here*/ 1410 /*we dont want to break here*/
1355 } 1411 }
1412 mlx4_assign_irq_notifier(priv, dev,
1413 priv->eq_table.eq[vec].irq);
1414
1356 eq_set_ci(&priv->eq_table.eq[vec], 1); 1415 eq_set_ci(&priv->eq_table.eq[vec], 1);
1357 } 1416 }
1358 } 1417 }
@@ -1379,6 +1438,9 @@ void mlx4_release_eq(struct mlx4_dev *dev, int vec)
1379 Belonging to a legacy EQ*/ 1438 Belonging to a legacy EQ*/
1380 mutex_lock(&priv->msix_ctl.pool_lock); 1439 mutex_lock(&priv->msix_ctl.pool_lock);
1381 if (priv->msix_ctl.pool_bm & 1ULL << i) { 1440 if (priv->msix_ctl.pool_bm & 1ULL << i) {
1441 irq_set_affinity_notifier(
1442 priv->eq_table.eq[vec].irq,
1443 NULL);
1382 free_irq(priv->eq_table.eq[vec].irq, 1444 free_irq(priv->eq_table.eq[vec].irq,
1383 &priv->eq_table.eq[vec]); 1445 &priv->eq_table.eq[vec]);
1384 priv->msix_ctl.pool_bm &= ~(1ULL << i); 1446 priv->msix_ctl.pool_bm &= ~(1ULL << i);
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 5db97a4fdc01..a56f6012258d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -104,8 +104,6 @@ module_param(enable_64b_cqe_eqe, bool, 0444);
104MODULE_PARM_DESC(enable_64b_cqe_eqe, 104MODULE_PARM_DESC(enable_64b_cqe_eqe,
105 "Enable 64 byte CQEs/EQEs when the FW supports this (default: True)"); 105 "Enable 64 byte CQEs/EQEs when the FW supports this (default: True)");
106 106
107#define HCA_GLOBAL_CAP_MASK 0
108
109#define PF_CONTEXT_BEHAVIOUR_MASK MLX4_FUNC_CAP_64B_EQE_CQE 107#define PF_CONTEXT_BEHAVIOUR_MASK MLX4_FUNC_CAP_64B_EQE_CQE
110 108
111static char mlx4_version[] = 109static char mlx4_version[] =
@@ -582,9 +580,10 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
582 return err; 580 return err;
583 } 581 }
584 582
585 /*fail if the hca has an unknown capability */ 583 /* fail if the hca has an unknown global capability
586 if ((hca_param.global_caps | HCA_GLOBAL_CAP_MASK) != 584 * at this time global_caps should be always zeroed
587 HCA_GLOBAL_CAP_MASK) { 585 */
586 if (hca_param.global_caps) {
588 mlx4_err(dev, "Unknown hca global capabilities\n"); 587 mlx4_err(dev, "Unknown hca global capabilities\n");
589 return -ENOSYS; 588 return -ENOSYS;
590 } 589 }
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c
index 7c6eba622186..4c36def8e10f 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mcg.c
+++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c
@@ -897,7 +897,7 @@ int mlx4_flow_attach(struct mlx4_dev *dev,
897 ret = parse_trans_rule(dev, cur, mailbox->buf + size); 897 ret = parse_trans_rule(dev, cur, mailbox->buf + size);
898 if (ret < 0) { 898 if (ret < 0) {
899 mlx4_free_cmd_mailbox(dev, mailbox); 899 mlx4_free_cmd_mailbox(dev, mailbox);
900 return -EINVAL; 900 return ret;
901 } 901 }
902 size += ret; 902 size += ret;
903 } 903 }
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index ba87bd21295a..c0468e6f0442 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -577,6 +577,9 @@ struct mlx4_cq {
577 577
578 u32 cons_index; 578 u32 cons_index;
579 579
580 u16 irq;
581 bool irq_affinity_change;
582
580 __be32 *set_ci_db; 583 __be32 *set_ci_db;
581 __be32 *arm_db; 584 __be32 *arm_db;
582 int arm_sn; 585 int arm_sn;