diff options
author | Faisal Latif <faisal.latif@intel.com> | 2009-03-06 18:12:11 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2009-03-06 18:12:11 -0500 |
commit | 2869975cfbd58dc6591d8c3ba1f171e7f758be28 (patch) | |
tree | 5a664309bcef41dbc79fd12eb87c63f06369b181 | |
parent | fd87778cb99429f5e2e041213a5c9c564bbe7b78 (diff) |
RDMA/nes: Remove LLTX
NETIF_F_LLTX is deprecated. Remove private TX locking from the driver
and remove the NETIF_F_LLTX feature flag. This also fixes a warning
in some configs that comes from doing skb_linearize() call in the
hard_start_xmit method with IRQs disabled (if HIGHMEM is enabled,
skb_linearize() may end up enabling BHs, which is a no-no if hard IRQs
are disabled in that context). By getting rid of LLTX, we do not
disable IRQs when skb_linearize() is called.
Remove the sq_lock as it is not needed for non-LLTX. Fix ethtool not
to show the counter for sq_lock.
Reported-by: aluno3@poczta.onet.pl
Signed-off-by: Faisal Latif <faisal.latif@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.c | 5 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.h | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_nic.c | 140 |
3 files changed, 63 insertions, 84 deletions
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 1c5e946ce226..9a51f25c6cee 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -1644,7 +1644,6 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev) | |||
1644 | nesvnic->post_cqp_request = nes_post_cqp_request; | 1644 | nesvnic->post_cqp_request = nes_post_cqp_request; |
1645 | nesvnic->mcrq_mcast_filter = NULL; | 1645 | nesvnic->mcrq_mcast_filter = NULL; |
1646 | 1646 | ||
1647 | spin_lock_init(&nesvnic->nic.sq_lock); | ||
1648 | spin_lock_init(&nesvnic->nic.rq_lock); | 1647 | spin_lock_init(&nesvnic->nic.rq_lock); |
1649 | 1648 | ||
1650 | /* setup the RQ */ | 1649 | /* setup the RQ */ |
@@ -2632,9 +2631,9 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) | |||
2632 | } else | 2631 | } else |
2633 | break; | 2632 | break; |
2634 | } | 2633 | } |
2635 | if (skb) | ||
2636 | dev_kfree_skb_any(skb); | ||
2637 | } | 2634 | } |
2635 | if (skb) | ||
2636 | dev_kfree_skb_any(skb); | ||
2638 | nesnic->sq_tail++; | 2637 | nesnic->sq_tail++; |
2639 | nesnic->sq_tail &= nesnic->sq_size-1; | 2638 | nesnic->sq_tail &= nesnic->sq_size-1; |
2640 | if (sq_cqes > 128) { | 2639 | if (sq_cqes > 128) { |
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index bf7ecfa5f976..f41a8710d2a8 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h | |||
@@ -876,7 +876,6 @@ struct nes_hw_nic { | |||
876 | u8 replenishing_rq; | 876 | u8 replenishing_rq; |
877 | u8 reserved; | 877 | u8 reserved; |
878 | 878 | ||
879 | spinlock_t sq_lock; | ||
880 | spinlock_t rq_lock; | 879 | spinlock_t rq_lock; |
881 | }; | 880 | }; |
882 | 881 | ||
@@ -1148,7 +1147,6 @@ struct nes_ib_device; | |||
1148 | struct nes_vnic { | 1147 | struct nes_vnic { |
1149 | struct nes_ib_device *nesibdev; | 1148 | struct nes_ib_device *nesibdev; |
1150 | u64 sq_full; | 1149 | u64 sq_full; |
1151 | u64 sq_locked; | ||
1152 | u64 tso_requests; | 1150 | u64 tso_requests; |
1153 | u64 segmented_tso_requests; | 1151 | u64 segmented_tso_requests; |
1154 | u64 linearized_skbs; | 1152 | u64 linearized_skbs; |
diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c index 8e1d073913ec..025ed9f7d9c2 100644 --- a/drivers/infiniband/hw/nes/nes_nic.c +++ b/drivers/infiniband/hw/nes/nes_nic.c | |||
@@ -400,8 +400,7 @@ static int nes_nic_send(struct sk_buff *skb, struct net_device *netdev) | |||
400 | if (skb_headlen(skb) == skb->len) { | 400 | if (skb_headlen(skb) == skb->len) { |
401 | if (skb_headlen(skb) <= NES_FIRST_FRAG_SIZE) { | 401 | if (skb_headlen(skb) <= NES_FIRST_FRAG_SIZE) { |
402 | nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_2_1_IDX] = 0; | 402 | nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_2_1_IDX] = 0; |
403 | nesnic->tx_skb[nesnic->sq_head] = NULL; | 403 | nesnic->tx_skb[nesnic->sq_head] = skb; |
404 | dev_kfree_skb(skb); | ||
405 | } | 404 | } |
406 | } else { | 405 | } else { |
407 | /* Deal with Fragments */ | 406 | /* Deal with Fragments */ |
@@ -453,7 +452,6 @@ static int nes_netdev_start_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
453 | u32 wqe_count=1; | 452 | u32 wqe_count=1; |
454 | u32 send_rc; | 453 | u32 send_rc; |
455 | struct iphdr *iph; | 454 | struct iphdr *iph; |
456 | unsigned long flags; | ||
457 | __le16 *wqe_fragment_length; | 455 | __le16 *wqe_fragment_length; |
458 | u32 nr_frags; | 456 | u32 nr_frags; |
459 | u32 original_first_length; | 457 | u32 original_first_length; |
@@ -480,13 +478,6 @@ static int nes_netdev_start_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
480 | if (netif_queue_stopped(netdev)) | 478 | if (netif_queue_stopped(netdev)) |
481 | return NETDEV_TX_BUSY; | 479 | return NETDEV_TX_BUSY; |
482 | 480 | ||
483 | local_irq_save(flags); | ||
484 | if (!spin_trylock(&nesnic->sq_lock)) { | ||
485 | local_irq_restore(flags); | ||
486 | nesvnic->sq_locked++; | ||
487 | return NETDEV_TX_LOCKED; | ||
488 | } | ||
489 | |||
490 | /* Check if SQ is full */ | 481 | /* Check if SQ is full */ |
491 | if ((((nesnic->sq_tail+(nesnic->sq_size*2))-nesnic->sq_head) & (nesnic->sq_size - 1)) == 1) { | 482 | if ((((nesnic->sq_tail+(nesnic->sq_size*2))-nesnic->sq_head) & (nesnic->sq_size - 1)) == 1) { |
492 | if (!netif_queue_stopped(netdev)) { | 483 | if (!netif_queue_stopped(netdev)) { |
@@ -498,7 +489,6 @@ static int nes_netdev_start_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
498 | } | 489 | } |
499 | } | 490 | } |
500 | nesvnic->sq_full++; | 491 | nesvnic->sq_full++; |
501 | spin_unlock_irqrestore(&nesnic->sq_lock, flags); | ||
502 | return NETDEV_TX_BUSY; | 492 | return NETDEV_TX_BUSY; |
503 | } | 493 | } |
504 | 494 | ||
@@ -531,7 +521,6 @@ sq_no_longer_full: | |||
531 | } | 521 | } |
532 | } | 522 | } |
533 | nesvnic->sq_full++; | 523 | nesvnic->sq_full++; |
534 | spin_unlock_irqrestore(&nesnic->sq_lock, flags); | ||
535 | nes_debug(NES_DBG_NIC_TX, "%s: HNIC SQ full- TSO request has too many frags!\n", | 524 | nes_debug(NES_DBG_NIC_TX, "%s: HNIC SQ full- TSO request has too many frags!\n", |
536 | netdev->name); | 525 | netdev->name); |
537 | return NETDEV_TX_BUSY; | 526 | return NETDEV_TX_BUSY; |
@@ -656,17 +645,13 @@ tso_sq_no_longer_full: | |||
656 | skb_set_transport_header(skb, hoffset); | 645 | skb_set_transport_header(skb, hoffset); |
657 | skb_set_network_header(skb, nhoffset); | 646 | skb_set_network_header(skb, nhoffset); |
658 | send_rc = nes_nic_send(skb, netdev); | 647 | send_rc = nes_nic_send(skb, netdev); |
659 | if (send_rc != NETDEV_TX_OK) { | 648 | if (send_rc != NETDEV_TX_OK) |
660 | spin_unlock_irqrestore(&nesnic->sq_lock, flags); | ||
661 | return NETDEV_TX_OK; | 649 | return NETDEV_TX_OK; |
662 | } | ||
663 | } | 650 | } |
664 | } else { | 651 | } else { |
665 | send_rc = nes_nic_send(skb, netdev); | 652 | send_rc = nes_nic_send(skb, netdev); |
666 | if (send_rc != NETDEV_TX_OK) { | 653 | if (send_rc != NETDEV_TX_OK) |
667 | spin_unlock_irqrestore(&nesnic->sq_lock, flags); | ||
668 | return NETDEV_TX_OK; | 654 | return NETDEV_TX_OK; |
669 | } | ||
670 | } | 655 | } |
671 | 656 | ||
672 | barrier(); | 657 | barrier(); |
@@ -676,7 +661,6 @@ tso_sq_no_longer_full: | |||
676 | (wqe_count << 24) | (1 << 23) | nesvnic->nic.qp_id); | 661 | (wqe_count << 24) | (1 << 23) | nesvnic->nic.qp_id); |
677 | 662 | ||
678 | netdev->trans_start = jiffies; | 663 | netdev->trans_start = jiffies; |
679 | spin_unlock_irqrestore(&nesnic->sq_lock, flags); | ||
680 | 664 | ||
681 | return NETDEV_TX_OK; | 665 | return NETDEV_TX_OK; |
682 | } | 666 | } |
@@ -1012,7 +996,6 @@ static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = { | |||
1012 | "Pause Frames Received", | 996 | "Pause Frames Received", |
1013 | "Internal Routing Errors", | 997 | "Internal Routing Errors", |
1014 | "SQ SW Dropped SKBs", | 998 | "SQ SW Dropped SKBs", |
1015 | "SQ Locked", | ||
1016 | "SQ Full", | 999 | "SQ Full", |
1017 | "Segmented TSO Requests", | 1000 | "Segmented TSO Requests", |
1018 | "Rx Symbol Errors", | 1001 | "Rx Symbol Errors", |
@@ -1129,16 +1112,17 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev, | |||
1129 | struct nes_device *nesdev = nesvnic->nesdev; | 1112 | struct nes_device *nesdev = nesvnic->nesdev; |
1130 | u32 nic_count; | 1113 | u32 nic_count; |
1131 | u32 u32temp; | 1114 | u32 u32temp; |
1115 | u32 index = 0; | ||
1132 | 1116 | ||
1133 | target_ethtool_stats->n_stats = NES_ETHTOOL_STAT_COUNT; | 1117 | target_ethtool_stats->n_stats = NES_ETHTOOL_STAT_COUNT; |
1134 | target_stat_values[0] = nesvnic->nesdev->link_status_interrupts; | 1118 | target_stat_values[index] = nesvnic->nesdev->link_status_interrupts; |
1135 | target_stat_values[1] = nesvnic->linearized_skbs; | 1119 | target_stat_values[++index] = nesvnic->linearized_skbs; |
1136 | target_stat_values[2] = nesvnic->tso_requests; | 1120 | target_stat_values[++index] = nesvnic->tso_requests; |
1137 | 1121 | ||
1138 | u32temp = nes_read_indexed(nesdev, | 1122 | u32temp = nes_read_indexed(nesdev, |
1139 | NES_IDX_MAC_TX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200)); | 1123 | NES_IDX_MAC_TX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200)); |
1140 | nesvnic->nesdev->mac_pause_frames_sent += u32temp; | 1124 | nesvnic->nesdev->mac_pause_frames_sent += u32temp; |
1141 | target_stat_values[3] = nesvnic->nesdev->mac_pause_frames_sent; | 1125 | target_stat_values[++index] = nesvnic->nesdev->mac_pause_frames_sent; |
1142 | 1126 | ||
1143 | u32temp = nes_read_indexed(nesdev, | 1127 | u32temp = nes_read_indexed(nesdev, |
1144 | NES_IDX_MAC_RX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200)); | 1128 | NES_IDX_MAC_RX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200)); |
@@ -1209,60 +1193,59 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev, | |||
1209 | nesvnic->endnode_ipv4_tcp_retransmits += u32temp; | 1193 | nesvnic->endnode_ipv4_tcp_retransmits += u32temp; |
1210 | } | 1194 | } |
1211 | 1195 | ||
1212 | target_stat_values[4] = nesvnic->nesdev->mac_pause_frames_received; | 1196 | target_stat_values[++index] = nesvnic->nesdev->mac_pause_frames_received; |
1213 | target_stat_values[5] = nesdev->nesadapter->nic_rx_eth_route_err; | 1197 | target_stat_values[++index] = nesdev->nesadapter->nic_rx_eth_route_err; |
1214 | target_stat_values[6] = nesvnic->tx_sw_dropped; | 1198 | target_stat_values[++index] = nesvnic->tx_sw_dropped; |
1215 | target_stat_values[7] = nesvnic->sq_locked; | 1199 | target_stat_values[++index] = nesvnic->sq_full; |
1216 | target_stat_values[8] = nesvnic->sq_full; | 1200 | target_stat_values[++index] = nesvnic->segmented_tso_requests; |
1217 | target_stat_values[9] = nesvnic->segmented_tso_requests; | 1201 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_symbol_err_frames; |
1218 | target_stat_values[10] = nesvnic->nesdev->mac_rx_symbol_err_frames; | 1202 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_jabber_frames; |
1219 | target_stat_values[11] = nesvnic->nesdev->mac_rx_jabber_frames; | 1203 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_oversized_frames; |
1220 | target_stat_values[12] = nesvnic->nesdev->mac_rx_oversized_frames; | 1204 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_short_frames; |
1221 | target_stat_values[13] = nesvnic->nesdev->mac_rx_short_frames; | 1205 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_discard; |
1222 | target_stat_values[14] = nesvnic->endnode_nstat_rx_discard; | 1206 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_octets; |
1223 | target_stat_values[15] = nesvnic->endnode_nstat_rx_octets; | 1207 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_frames; |
1224 | target_stat_values[16] = nesvnic->endnode_nstat_rx_frames; | 1208 | target_stat_values[++index] = nesvnic->endnode_nstat_tx_octets; |
1225 | target_stat_values[17] = nesvnic->endnode_nstat_tx_octets; | 1209 | target_stat_values[++index] = nesvnic->endnode_nstat_tx_frames; |
1226 | target_stat_values[18] = nesvnic->endnode_nstat_tx_frames; | 1210 | target_stat_values[++index] = mh_detected; |
1227 | target_stat_values[19] = mh_detected; | 1211 | target_stat_values[++index] = mh_pauses_sent; |
1228 | target_stat_values[20] = mh_pauses_sent; | 1212 | target_stat_values[++index] = nesvnic->endnode_ipv4_tcp_retransmits; |
1229 | target_stat_values[21] = nesvnic->endnode_ipv4_tcp_retransmits; | 1213 | target_stat_values[++index] = atomic_read(&cm_connects); |
1230 | target_stat_values[22] = atomic_read(&cm_connects); | 1214 | target_stat_values[++index] = atomic_read(&cm_accepts); |
1231 | target_stat_values[23] = atomic_read(&cm_accepts); | 1215 | target_stat_values[++index] = atomic_read(&cm_disconnects); |
1232 | target_stat_values[24] = atomic_read(&cm_disconnects); | 1216 | target_stat_values[++index] = atomic_read(&cm_connecteds); |
1233 | target_stat_values[25] = atomic_read(&cm_connecteds); | 1217 | target_stat_values[++index] = atomic_read(&cm_connect_reqs); |
1234 | target_stat_values[26] = atomic_read(&cm_connect_reqs); | 1218 | target_stat_values[++index] = atomic_read(&cm_rejects); |
1235 | target_stat_values[27] = atomic_read(&cm_rejects); | 1219 | target_stat_values[++index] = atomic_read(&mod_qp_timouts); |
1236 | target_stat_values[28] = atomic_read(&mod_qp_timouts); | 1220 | target_stat_values[++index] = atomic_read(&qps_created); |
1237 | target_stat_values[29] = atomic_read(&qps_created); | 1221 | target_stat_values[++index] = atomic_read(&sw_qps_destroyed); |
1238 | target_stat_values[30] = atomic_read(&sw_qps_destroyed); | 1222 | target_stat_values[++index] = atomic_read(&qps_destroyed); |
1239 | target_stat_values[31] = atomic_read(&qps_destroyed); | 1223 | target_stat_values[++index] = atomic_read(&cm_closes); |
1240 | target_stat_values[32] = atomic_read(&cm_closes); | 1224 | target_stat_values[++index] = cm_packets_sent; |
1241 | target_stat_values[33] = cm_packets_sent; | 1225 | target_stat_values[++index] = cm_packets_bounced; |
1242 | target_stat_values[34] = cm_packets_bounced; | 1226 | target_stat_values[++index] = cm_packets_created; |
1243 | target_stat_values[35] = cm_packets_created; | 1227 | target_stat_values[++index] = cm_packets_received; |
1244 | target_stat_values[36] = cm_packets_received; | 1228 | target_stat_values[++index] = cm_packets_dropped; |
1245 | target_stat_values[37] = cm_packets_dropped; | 1229 | target_stat_values[++index] = cm_packets_retrans; |
1246 | target_stat_values[38] = cm_packets_retrans; | 1230 | target_stat_values[++index] = cm_listens_created; |
1247 | target_stat_values[39] = cm_listens_created; | 1231 | target_stat_values[++index] = cm_listens_destroyed; |
1248 | target_stat_values[40] = cm_listens_destroyed; | 1232 | target_stat_values[++index] = cm_backlog_drops; |
1249 | target_stat_values[41] = cm_backlog_drops; | 1233 | target_stat_values[++index] = atomic_read(&cm_loopbacks); |
1250 | target_stat_values[42] = atomic_read(&cm_loopbacks); | 1234 | target_stat_values[++index] = atomic_read(&cm_nodes_created); |
1251 | target_stat_values[43] = atomic_read(&cm_nodes_created); | 1235 | target_stat_values[++index] = atomic_read(&cm_nodes_destroyed); |
1252 | target_stat_values[44] = atomic_read(&cm_nodes_destroyed); | 1236 | target_stat_values[++index] = atomic_read(&cm_accel_dropped_pkts); |
1253 | target_stat_values[45] = atomic_read(&cm_accel_dropped_pkts); | 1237 | target_stat_values[++index] = atomic_read(&cm_resets_recvd); |
1254 | target_stat_values[46] = atomic_read(&cm_resets_recvd); | 1238 | target_stat_values[++index] = int_mod_timer_init; |
1255 | target_stat_values[47] = int_mod_timer_init; | 1239 | target_stat_values[++index] = int_mod_cq_depth_1; |
1256 | target_stat_values[48] = int_mod_cq_depth_1; | 1240 | target_stat_values[++index] = int_mod_cq_depth_4; |
1257 | target_stat_values[49] = int_mod_cq_depth_4; | 1241 | target_stat_values[++index] = int_mod_cq_depth_16; |
1258 | target_stat_values[50] = int_mod_cq_depth_16; | 1242 | target_stat_values[++index] = int_mod_cq_depth_24; |
1259 | target_stat_values[51] = int_mod_cq_depth_24; | 1243 | target_stat_values[++index] = int_mod_cq_depth_32; |
1260 | target_stat_values[52] = int_mod_cq_depth_32; | 1244 | target_stat_values[++index] = int_mod_cq_depth_128; |
1261 | target_stat_values[53] = int_mod_cq_depth_128; | 1245 | target_stat_values[++index] = int_mod_cq_depth_256; |
1262 | target_stat_values[54] = int_mod_cq_depth_256; | 1246 | target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated; |
1263 | target_stat_values[55] = nesvnic->lro_mgr.stats.aggregated; | 1247 | target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed; |
1264 | target_stat_values[56] = nesvnic->lro_mgr.stats.flushed; | 1248 | target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc; |
1265 | target_stat_values[57] = nesvnic->lro_mgr.stats.no_desc; | ||
1266 | 1249 | ||
1267 | } | 1250 | } |
1268 | 1251 | ||
@@ -1616,7 +1599,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, | |||
1616 | nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n"); | 1599 | nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n"); |
1617 | netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 1600 | netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
1618 | netdev->vlan_rx_register = nes_netdev_vlan_rx_register; | 1601 | netdev->vlan_rx_register = nes_netdev_vlan_rx_register; |
1619 | netdev->features |= NETIF_F_LLTX; | ||
1620 | 1602 | ||
1621 | /* Fill in the port structure */ | 1603 | /* Fill in the port structure */ |
1622 | nesvnic->netdev = netdev; | 1604 | nesvnic->netdev = netdev; |