diff options
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe.h | 48 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 46 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ethtool.c | 98 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | 132 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 103 | ||||
-rw-r--r-- | drivers/net/vxlan.c | 4 | ||||
-rw-r--r-- | include/linux/netdevice.h | 1 | ||||
-rw-r--r-- | include/net/vxlan.h | 11 |
9 files changed, 366 insertions, 81 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 41a79df373d5..be15938ba213 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -7204,8 +7204,10 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
7204 | */ | 7204 | */ |
7205 | len = sizeof(struct i40e_vsi *) * pf->hw.func_caps.num_vsis; | 7205 | len = sizeof(struct i40e_vsi *) * pf->hw.func_caps.num_vsis; |
7206 | pf->vsi = kzalloc(len, GFP_KERNEL); | 7206 | pf->vsi = kzalloc(len, GFP_KERNEL); |
7207 | if (!pf->vsi) | 7207 | if (!pf->vsi) { |
7208 | err = -ENOMEM; | ||
7208 | goto err_switch_setup; | 7209 | goto err_switch_setup; |
7210 | } | ||
7209 | 7211 | ||
7210 | err = i40e_setup_pf_switch(pf); | 7212 | err = i40e_setup_pf_switch(pf); |
7211 | if (err) { | 7213 | if (err) { |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index dc1588ee264a..f51fd1f4fb49 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h | |||
@@ -369,11 +369,13 @@ struct ixgbe_q_vector { | |||
369 | #ifdef CONFIG_NET_RX_BUSY_POLL | 369 | #ifdef CONFIG_NET_RX_BUSY_POLL |
370 | unsigned int state; | 370 | unsigned int state; |
371 | #define IXGBE_QV_STATE_IDLE 0 | 371 | #define IXGBE_QV_STATE_IDLE 0 |
372 | #define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */ | 372 | #define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */ |
373 | #define IXGBE_QV_STATE_POLL 2 /* poll owns this QV */ | 373 | #define IXGBE_QV_STATE_POLL 2 /* poll owns this QV */ |
374 | #define IXGBE_QV_LOCKED (IXGBE_QV_STATE_NAPI | IXGBE_QV_STATE_POLL) | 374 | #define IXGBE_QV_STATE_DISABLED 4 /* QV is disabled */ |
375 | #define IXGBE_QV_STATE_NAPI_YIELD 4 /* NAPI yielded this QV */ | 375 | #define IXGBE_QV_OWNED (IXGBE_QV_STATE_NAPI | IXGBE_QV_STATE_POLL) |
376 | #define IXGBE_QV_STATE_POLL_YIELD 8 /* poll yielded this QV */ | 376 | #define IXGBE_QV_LOCKED (IXGBE_QV_OWNED | IXGBE_QV_STATE_DISABLED) |
377 | #define IXGBE_QV_STATE_NAPI_YIELD 8 /* NAPI yielded this QV */ | ||
378 | #define IXGBE_QV_STATE_POLL_YIELD 16 /* poll yielded this QV */ | ||
377 | #define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD) | 379 | #define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD) |
378 | #define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD) | 380 | #define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD) |
379 | spinlock_t lock; | 381 | spinlock_t lock; |
@@ -394,7 +396,7 @@ static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) | |||
394 | static inline bool ixgbe_qv_lock_napi(struct ixgbe_q_vector *q_vector) | 396 | static inline bool ixgbe_qv_lock_napi(struct ixgbe_q_vector *q_vector) |
395 | { | 397 | { |
396 | int rc = true; | 398 | int rc = true; |
397 | spin_lock(&q_vector->lock); | 399 | spin_lock_bh(&q_vector->lock); |
398 | if (q_vector->state & IXGBE_QV_LOCKED) { | 400 | if (q_vector->state & IXGBE_QV_LOCKED) { |
399 | WARN_ON(q_vector->state & IXGBE_QV_STATE_NAPI); | 401 | WARN_ON(q_vector->state & IXGBE_QV_STATE_NAPI); |
400 | q_vector->state |= IXGBE_QV_STATE_NAPI_YIELD; | 402 | q_vector->state |= IXGBE_QV_STATE_NAPI_YIELD; |
@@ -405,7 +407,7 @@ static inline bool ixgbe_qv_lock_napi(struct ixgbe_q_vector *q_vector) | |||
405 | } else | 407 | } else |
406 | /* we don't care if someone yielded */ | 408 | /* we don't care if someone yielded */ |
407 | q_vector->state = IXGBE_QV_STATE_NAPI; | 409 | q_vector->state = IXGBE_QV_STATE_NAPI; |
408 | spin_unlock(&q_vector->lock); | 410 | spin_unlock_bh(&q_vector->lock); |
409 | return rc; | 411 | return rc; |
410 | } | 412 | } |
411 | 413 | ||
@@ -413,14 +415,15 @@ static inline bool ixgbe_qv_lock_napi(struct ixgbe_q_vector *q_vector) | |||
413 | static inline bool ixgbe_qv_unlock_napi(struct ixgbe_q_vector *q_vector) | 415 | static inline bool ixgbe_qv_unlock_napi(struct ixgbe_q_vector *q_vector) |
414 | { | 416 | { |
415 | int rc = false; | 417 | int rc = false; |
416 | spin_lock(&q_vector->lock); | 418 | spin_lock_bh(&q_vector->lock); |
417 | WARN_ON(q_vector->state & (IXGBE_QV_STATE_POLL | | 419 | WARN_ON(q_vector->state & (IXGBE_QV_STATE_POLL | |
418 | IXGBE_QV_STATE_NAPI_YIELD)); | 420 | IXGBE_QV_STATE_NAPI_YIELD)); |
419 | 421 | ||
420 | if (q_vector->state & IXGBE_QV_STATE_POLL_YIELD) | 422 | if (q_vector->state & IXGBE_QV_STATE_POLL_YIELD) |
421 | rc = true; | 423 | rc = true; |
422 | q_vector->state = IXGBE_QV_STATE_IDLE; | 424 | /* will reset state to idle, unless QV is disabled */ |
423 | spin_unlock(&q_vector->lock); | 425 | q_vector->state &= IXGBE_QV_STATE_DISABLED; |
426 | spin_unlock_bh(&q_vector->lock); | ||
424 | return rc; | 427 | return rc; |
425 | } | 428 | } |
426 | 429 | ||
@@ -451,7 +454,8 @@ static inline bool ixgbe_qv_unlock_poll(struct ixgbe_q_vector *q_vector) | |||
451 | 454 | ||
452 | if (q_vector->state & IXGBE_QV_STATE_POLL_YIELD) | 455 | if (q_vector->state & IXGBE_QV_STATE_POLL_YIELD) |
453 | rc = true; | 456 | rc = true; |
454 | q_vector->state = IXGBE_QV_STATE_IDLE; | 457 | /* will reset state to idle, unless QV is disabled */ |
458 | q_vector->state &= IXGBE_QV_STATE_DISABLED; | ||
455 | spin_unlock_bh(&q_vector->lock); | 459 | spin_unlock_bh(&q_vector->lock); |
456 | return rc; | 460 | return rc; |
457 | } | 461 | } |
@@ -459,9 +463,23 @@ static inline bool ixgbe_qv_unlock_poll(struct ixgbe_q_vector *q_vector) | |||
459 | /* true if a socket is polling, even if it did not get the lock */ | 463 | /* true if a socket is polling, even if it did not get the lock */ |
460 | static inline bool ixgbe_qv_busy_polling(struct ixgbe_q_vector *q_vector) | 464 | static inline bool ixgbe_qv_busy_polling(struct ixgbe_q_vector *q_vector) |
461 | { | 465 | { |
462 | WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED)); | 466 | WARN_ON(!(q_vector->state & IXGBE_QV_OWNED)); |
463 | return q_vector->state & IXGBE_QV_USER_PEND; | 467 | return q_vector->state & IXGBE_QV_USER_PEND; |
464 | } | 468 | } |
469 | |||
470 | /* false if QV is currently owned */ | ||
471 | static inline bool ixgbe_qv_disable(struct ixgbe_q_vector *q_vector) | ||
472 | { | ||
473 | int rc = true; | ||
474 | spin_lock_bh(&q_vector->lock); | ||
475 | if (q_vector->state & IXGBE_QV_OWNED) | ||
476 | rc = false; | ||
477 | q_vector->state |= IXGBE_QV_STATE_DISABLED; | ||
478 | spin_unlock_bh(&q_vector->lock); | ||
479 | |||
480 | return rc; | ||
481 | } | ||
482 | |||
465 | #else /* CONFIG_NET_RX_BUSY_POLL */ | 483 | #else /* CONFIG_NET_RX_BUSY_POLL */ |
466 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) | 484 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) |
467 | { | 485 | { |
@@ -491,6 +509,12 @@ static inline bool ixgbe_qv_busy_polling(struct ixgbe_q_vector *q_vector) | |||
491 | { | 509 | { |
492 | return false; | 510 | return false; |
493 | } | 511 | } |
512 | |||
513 | static inline bool ixgbe_qv_disable(struct ixgbe_q_vector *q_vector) | ||
514 | { | ||
515 | return true; | ||
516 | } | ||
517 | |||
494 | #endif /* CONFIG_NET_RX_BUSY_POLL */ | 518 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
495 | 519 | ||
496 | #ifdef CONFIG_IXGBE_HWMON | 520 | #ifdef CONFIG_IXGBE_HWMON |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index ce3eb603333e..a7d1a1c43f12 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -245,7 +245,7 @@ static void ixgbe_check_minimum_link(struct ixgbe_adapter *adapter, | |||
245 | max_gts = 4 * width; | 245 | max_gts = 4 * width; |
246 | break; | 246 | break; |
247 | case PCIE_SPEED_8_0GT: | 247 | case PCIE_SPEED_8_0GT: |
248 | /* 128b/130b encoding only reduces throughput by 1% */ | 248 | /* 128b/130b encoding reduces throughput by less than 2% */ |
249 | max_gts = 8 * width; | 249 | max_gts = 8 * width; |
250 | break; | 250 | break; |
251 | default: | 251 | default: |
@@ -263,7 +263,7 @@ static void ixgbe_check_minimum_link(struct ixgbe_adapter *adapter, | |||
263 | width, | 263 | width, |
264 | (speed == PCIE_SPEED_2_5GT ? "20%" : | 264 | (speed == PCIE_SPEED_2_5GT ? "20%" : |
265 | speed == PCIE_SPEED_5_0GT ? "20%" : | 265 | speed == PCIE_SPEED_5_0GT ? "20%" : |
266 | speed == PCIE_SPEED_8_0GT ? "N/a" : | 266 | speed == PCIE_SPEED_8_0GT ? "<2%" : |
267 | "Unknown")); | 267 | "Unknown")); |
268 | 268 | ||
269 | if (max_gts < expected_gts) { | 269 | if (max_gts < expected_gts) { |
@@ -3891,15 +3891,13 @@ static void ixgbe_napi_disable_all(struct ixgbe_adapter *adapter) | |||
3891 | { | 3891 | { |
3892 | int q_idx; | 3892 | int q_idx; |
3893 | 3893 | ||
3894 | local_bh_disable(); /* for ixgbe_qv_lock_napi() */ | ||
3895 | for (q_idx = 0; q_idx < adapter->num_q_vectors; q_idx++) { | 3894 | for (q_idx = 0; q_idx < adapter->num_q_vectors; q_idx++) { |
3896 | napi_disable(&adapter->q_vector[q_idx]->napi); | 3895 | napi_disable(&adapter->q_vector[q_idx]->napi); |
3897 | while (!ixgbe_qv_lock_napi(adapter->q_vector[q_idx])) { | 3896 | while (!ixgbe_qv_disable(adapter->q_vector[q_idx])) { |
3898 | pr_info("QV %d locked\n", q_idx); | 3897 | pr_info("QV %d locked\n", q_idx); |
3899 | mdelay(1); | 3898 | usleep_range(1000, 20000); |
3900 | } | 3899 | } |
3901 | } | 3900 | } |
3902 | local_bh_enable(); | ||
3903 | } | 3901 | } |
3904 | 3902 | ||
3905 | #ifdef CONFIG_IXGBE_DCB | 3903 | #ifdef CONFIG_IXGBE_DCB |
@@ -7754,29 +7752,6 @@ skip_sriov: | |||
7754 | if (ixgbe_pcie_from_parent(hw)) | 7752 | if (ixgbe_pcie_from_parent(hw)) |
7755 | ixgbe_get_parent_bus_info(adapter); | 7753 | ixgbe_get_parent_bus_info(adapter); |
7756 | 7754 | ||
7757 | /* print bus type/speed/width info */ | ||
7758 | e_dev_info("(PCI Express:%s:%s) %pM\n", | ||
7759 | (hw->bus.speed == ixgbe_bus_speed_8000 ? "8.0GT/s" : | ||
7760 | hw->bus.speed == ixgbe_bus_speed_5000 ? "5.0GT/s" : | ||
7761 | hw->bus.speed == ixgbe_bus_speed_2500 ? "2.5GT/s" : | ||
7762 | "Unknown"), | ||
7763 | (hw->bus.width == ixgbe_bus_width_pcie_x8 ? "Width x8" : | ||
7764 | hw->bus.width == ixgbe_bus_width_pcie_x4 ? "Width x4" : | ||
7765 | hw->bus.width == ixgbe_bus_width_pcie_x1 ? "Width x1" : | ||
7766 | "Unknown"), | ||
7767 | netdev->dev_addr); | ||
7768 | |||
7769 | err = ixgbe_read_pba_string_generic(hw, part_str, IXGBE_PBANUM_LENGTH); | ||
7770 | if (err) | ||
7771 | strncpy(part_str, "Unknown", IXGBE_PBANUM_LENGTH); | ||
7772 | if (ixgbe_is_sfp(hw) && hw->phy.sfp_type != ixgbe_sfp_type_not_present) | ||
7773 | e_dev_info("MAC: %d, PHY: %d, SFP+: %d, PBA No: %s\n", | ||
7774 | hw->mac.type, hw->phy.type, hw->phy.sfp_type, | ||
7775 | part_str); | ||
7776 | else | ||
7777 | e_dev_info("MAC: %d, PHY: %d, PBA No: %s\n", | ||
7778 | hw->mac.type, hw->phy.type, part_str); | ||
7779 | |||
7780 | /* calculate the expected PCIe bandwidth required for optimal | 7755 | /* calculate the expected PCIe bandwidth required for optimal |
7781 | * performance. Note that some older parts will never have enough | 7756 | * performance. Note that some older parts will never have enough |
7782 | * bandwidth due to being older generation PCIe parts. We clamp these | 7757 | * bandwidth due to being older generation PCIe parts. We clamp these |
@@ -7792,6 +7767,19 @@ skip_sriov: | |||
7792 | } | 7767 | } |
7793 | ixgbe_check_minimum_link(adapter, expected_gts); | 7768 | ixgbe_check_minimum_link(adapter, expected_gts); |
7794 | 7769 | ||
7770 | err = ixgbe_read_pba_string_generic(hw, part_str, IXGBE_PBANUM_LENGTH); | ||
7771 | if (err) | ||
7772 | strncpy(part_str, "Unknown", IXGBE_PBANUM_LENGTH); | ||
7773 | if (ixgbe_is_sfp(hw) && hw->phy.sfp_type != ixgbe_sfp_type_not_present) | ||
7774 | e_dev_info("MAC: %d, PHY: %d, SFP+: %d, PBA No: %s\n", | ||
7775 | hw->mac.type, hw->phy.type, hw->phy.sfp_type, | ||
7776 | part_str); | ||
7777 | else | ||
7778 | e_dev_info("MAC: %d, PHY: %d, PBA No: %s\n", | ||
7779 | hw->mac.type, hw->phy.type, part_str); | ||
7780 | |||
7781 | e_dev_info("%pM\n", netdev->dev_addr); | ||
7782 | |||
7795 | /* reset the hardware with the new settings */ | 7783 | /* reset the hardware with the new settings */ |
7796 | err = hw->mac.ops.start_hw(hw); | 7784 | err = hw->mac.ops.start_hw(hw); |
7797 | if (err == IXGBE_ERR_EEPROM_VERSION) { | 7785 | if (err == IXGBE_ERR_EEPROM_VERSION) { |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ethtool.c b/drivers/net/ethernet/intel/ixgbevf/ethtool.c index 21adb1bc1706..54d9acef9c4e 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ethtool.c +++ b/drivers/net/ethernet/intel/ixgbevf/ethtool.c | |||
@@ -45,16 +45,27 @@ | |||
45 | 45 | ||
46 | struct ixgbe_stats { | 46 | struct ixgbe_stats { |
47 | char stat_string[ETH_GSTRING_LEN]; | 47 | char stat_string[ETH_GSTRING_LEN]; |
48 | int sizeof_stat; | 48 | struct { |
49 | int stat_offset; | 49 | int sizeof_stat; |
50 | int base_stat_offset; | 50 | int stat_offset; |
51 | int saved_reset_offset; | 51 | int base_stat_offset; |
52 | int saved_reset_offset; | ||
53 | }; | ||
52 | }; | 54 | }; |
53 | 55 | ||
54 | #define IXGBEVF_STAT(m, b, r) sizeof(((struct ixgbevf_adapter *)0)->m), \ | 56 | #define IXGBEVF_STAT(m, b, r) { \ |
55 | offsetof(struct ixgbevf_adapter, m), \ | 57 | .sizeof_stat = FIELD_SIZEOF(struct ixgbevf_adapter, m), \ |
56 | offsetof(struct ixgbevf_adapter, b), \ | 58 | .stat_offset = offsetof(struct ixgbevf_adapter, m), \ |
57 | offsetof(struct ixgbevf_adapter, r) | 59 | .base_stat_offset = offsetof(struct ixgbevf_adapter, b), \ |
60 | .saved_reset_offset = offsetof(struct ixgbevf_adapter, r) \ | ||
61 | } | ||
62 | |||
63 | #define IXGBEVF_ZSTAT(m) { \ | ||
64 | .sizeof_stat = FIELD_SIZEOF(struct ixgbevf_adapter, m), \ | ||
65 | .stat_offset = offsetof(struct ixgbevf_adapter, m), \ | ||
66 | .base_stat_offset = -1, \ | ||
67 | .saved_reset_offset = -1 \ | ||
68 | } | ||
58 | 69 | ||
59 | static const struct ixgbe_stats ixgbe_gstrings_stats[] = { | 70 | static const struct ixgbe_stats ixgbe_gstrings_stats[] = { |
60 | {"rx_packets", IXGBEVF_STAT(stats.vfgprc, stats.base_vfgprc, | 71 | {"rx_packets", IXGBEVF_STAT(stats.vfgprc, stats.base_vfgprc, |
@@ -65,15 +76,20 @@ static const struct ixgbe_stats ixgbe_gstrings_stats[] = { | |||
65 | stats.saved_reset_vfgorc)}, | 76 | stats.saved_reset_vfgorc)}, |
66 | {"tx_bytes", IXGBEVF_STAT(stats.vfgotc, stats.base_vfgotc, | 77 | {"tx_bytes", IXGBEVF_STAT(stats.vfgotc, stats.base_vfgotc, |
67 | stats.saved_reset_vfgotc)}, | 78 | stats.saved_reset_vfgotc)}, |
68 | {"tx_busy", IXGBEVF_STAT(tx_busy, zero_base, zero_base)}, | 79 | {"tx_busy", IXGBEVF_ZSTAT(tx_busy)}, |
69 | {"multicast", IXGBEVF_STAT(stats.vfmprc, stats.base_vfmprc, | 80 | {"multicast", IXGBEVF_STAT(stats.vfmprc, stats.base_vfmprc, |
70 | stats.saved_reset_vfmprc)}, | 81 | stats.saved_reset_vfmprc)}, |
71 | {"rx_csum_offload_good", IXGBEVF_STAT(hw_csum_rx_good, zero_base, | 82 | {"rx_csum_offload_good", IXGBEVF_ZSTAT(hw_csum_rx_good)}, |
72 | zero_base)}, | 83 | {"rx_csum_offload_errors", IXGBEVF_ZSTAT(hw_csum_rx_error)}, |
73 | {"rx_csum_offload_errors", IXGBEVF_STAT(hw_csum_rx_error, zero_base, | 84 | {"tx_csum_offload_ctxt", IXGBEVF_ZSTAT(hw_csum_tx_good)}, |
74 | zero_base)}, | 85 | #ifdef BP_EXTENDED_STATS |
75 | {"tx_csum_offload_ctxt", IXGBEVF_STAT(hw_csum_tx_good, zero_base, | 86 | {"rx_bp_poll_yield", IXGBEVF_ZSTAT(bp_rx_yields)}, |
76 | zero_base)}, | 87 | {"rx_bp_cleaned", IXGBEVF_ZSTAT(bp_rx_cleaned)}, |
88 | {"rx_bp_misses", IXGBEVF_ZSTAT(bp_rx_missed)}, | ||
89 | {"tx_bp_napi_yield", IXGBEVF_ZSTAT(bp_tx_yields)}, | ||
90 | {"tx_bp_cleaned", IXGBEVF_ZSTAT(bp_tx_cleaned)}, | ||
91 | {"tx_bp_misses", IXGBEVF_ZSTAT(bp_tx_missed)}, | ||
92 | #endif | ||
77 | }; | 93 | }; |
78 | 94 | ||
79 | #define IXGBE_QUEUE_STATS_LEN 0 | 95 | #define IXGBE_QUEUE_STATS_LEN 0 |
@@ -390,22 +406,50 @@ static void ixgbevf_get_ethtool_stats(struct net_device *netdev, | |||
390 | struct ethtool_stats *stats, u64 *data) | 406 | struct ethtool_stats *stats, u64 *data) |
391 | { | 407 | { |
392 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); | 408 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); |
409 | char *base = (char *) adapter; | ||
393 | int i; | 410 | int i; |
411 | #ifdef BP_EXTENDED_STATS | ||
412 | u64 rx_yields = 0, rx_cleaned = 0, rx_missed = 0, | ||
413 | tx_yields = 0, tx_cleaned = 0, tx_missed = 0; | ||
414 | |||
415 | for (i = 0; i < adapter->num_rx_queues; i++) { | ||
416 | rx_yields += adapter->rx_ring[i].bp_yields; | ||
417 | rx_cleaned += adapter->rx_ring[i].bp_cleaned; | ||
418 | rx_yields += adapter->rx_ring[i].bp_yields; | ||
419 | } | ||
420 | |||
421 | for (i = 0; i < adapter->num_tx_queues; i++) { | ||
422 | tx_yields += adapter->tx_ring[i].bp_yields; | ||
423 | tx_cleaned += adapter->tx_ring[i].bp_cleaned; | ||
424 | tx_yields += adapter->tx_ring[i].bp_yields; | ||
425 | } | ||
426 | |||
427 | adapter->bp_rx_yields = rx_yields; | ||
428 | adapter->bp_rx_cleaned = rx_cleaned; | ||
429 | adapter->bp_rx_missed = rx_missed; | ||
430 | |||
431 | adapter->bp_tx_yields = tx_yields; | ||
432 | adapter->bp_tx_cleaned = tx_cleaned; | ||
433 | adapter->bp_tx_missed = tx_missed; | ||
434 | #endif | ||
394 | 435 | ||
395 | ixgbevf_update_stats(adapter); | 436 | ixgbevf_update_stats(adapter); |
396 | for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) { | 437 | for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) { |
397 | char *p = (char *)adapter + | 438 | char *p = base + ixgbe_gstrings_stats[i].stat_offset; |
398 | ixgbe_gstrings_stats[i].stat_offset; | 439 | char *b = base + ixgbe_gstrings_stats[i].base_stat_offset; |
399 | char *b = (char *)adapter + | 440 | char *r = base + ixgbe_gstrings_stats[i].saved_reset_offset; |
400 | ixgbe_gstrings_stats[i].base_stat_offset; | 441 | |
401 | char *r = (char *)adapter + | 442 | if (ixgbe_gstrings_stats[i].sizeof_stat == sizeof(u64)) { |
402 | ixgbe_gstrings_stats[i].saved_reset_offset; | 443 | if (ixgbe_gstrings_stats[i].base_stat_offset >= 0) |
403 | data[i] = ((ixgbe_gstrings_stats[i].sizeof_stat == | 444 | data[i] = *(u64 *)p - *(u64 *)b + *(u64 *)r; |
404 | sizeof(u64)) ? *(u64 *)p : *(u32 *)p) - | 445 | else |
405 | ((ixgbe_gstrings_stats[i].sizeof_stat == | 446 | data[i] = *(u64 *)p; |
406 | sizeof(u64)) ? *(u64 *)b : *(u32 *)b) + | 447 | } else { |
407 | ((ixgbe_gstrings_stats[i].sizeof_stat == | 448 | if (ixgbe_gstrings_stats[i].base_stat_offset >= 0) |
408 | sizeof(u64)) ? *(u64 *)r : *(u32 *)r); | 449 | data[i] = *(u32 *)p - *(u32 *)b + *(u32 *)r; |
450 | else | ||
451 | data[i] = *(u32 *)p; | ||
452 | } | ||
409 | } | 453 | } |
410 | } | 454 | } |
411 | 455 | ||
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h index d7837dcc9897..acf38067a700 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | |||
@@ -38,6 +38,11 @@ | |||
38 | 38 | ||
39 | #include "vf.h" | 39 | #include "vf.h" |
40 | 40 | ||
41 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
42 | #include <net/busy_poll.h> | ||
43 | #define BP_EXTENDED_STATS | ||
44 | #endif | ||
45 | |||
41 | /* wrapper around a pointer to a socket buffer, | 46 | /* wrapper around a pointer to a socket buffer, |
42 | * so a DMA handle can be stored along with the buffer */ | 47 | * so a DMA handle can be stored along with the buffer */ |
43 | struct ixgbevf_tx_buffer { | 48 | struct ixgbevf_tx_buffer { |
@@ -76,6 +81,11 @@ struct ixgbevf_ring { | |||
76 | struct u64_stats_sync syncp; | 81 | struct u64_stats_sync syncp; |
77 | u64 hw_csum_rx_error; | 82 | u64 hw_csum_rx_error; |
78 | u64 hw_csum_rx_good; | 83 | u64 hw_csum_rx_good; |
84 | #ifdef BP_EXTENDED_STATS | ||
85 | u64 bp_yields; | ||
86 | u64 bp_misses; | ||
87 | u64 bp_cleaned; | ||
88 | #endif | ||
79 | 89 | ||
80 | u16 head; | 90 | u16 head; |
81 | u16 tail; | 91 | u16 tail; |
@@ -145,7 +155,118 @@ struct ixgbevf_q_vector { | |||
145 | struct napi_struct napi; | 155 | struct napi_struct napi; |
146 | struct ixgbevf_ring_container rx, tx; | 156 | struct ixgbevf_ring_container rx, tx; |
147 | char name[IFNAMSIZ + 9]; | 157 | char name[IFNAMSIZ + 9]; |
158 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
159 | unsigned int state; | ||
160 | #define IXGBEVF_QV_STATE_IDLE 0 | ||
161 | #define IXGBEVF_QV_STATE_NAPI 1 /* NAPI owns this QV */ | ||
162 | #define IXGBEVF_QV_STATE_POLL 2 /* poll owns this QV */ | ||
163 | #define IXGBEVF_QV_STATE_DISABLED 4 /* QV is disabled */ | ||
164 | #define IXGBEVF_QV_OWNED (IXGBEVF_QV_STATE_NAPI | IXGBEVF_QV_STATE_POLL) | ||
165 | #define IXGBEVF_QV_LOCKED (IXGBEVF_QV_OWNED | IXGBEVF_QV_STATE_DISABLED) | ||
166 | #define IXGBEVF_QV_STATE_NAPI_YIELD 8 /* NAPI yielded this QV */ | ||
167 | #define IXGBEVF_QV_STATE_POLL_YIELD 16 /* poll yielded this QV */ | ||
168 | #define IXGBEVF_QV_YIELD (IXGBEVF_QV_STATE_NAPI_YIELD | IXGBEVF_QV_STATE_POLL_YIELD) | ||
169 | #define IXGBEVF_QV_USER_PEND (IXGBEVF_QV_STATE_POLL | IXGBEVF_QV_STATE_POLL_YIELD) | ||
170 | spinlock_t lock; | ||
171 | #endif /* CONFIG_NET_RX_BUSY_POLL */ | ||
148 | }; | 172 | }; |
173 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
174 | static inline void ixgbevf_qv_init_lock(struct ixgbevf_q_vector *q_vector) | ||
175 | { | ||
176 | |||
177 | spin_lock_init(&q_vector->lock); | ||
178 | q_vector->state = IXGBEVF_QV_STATE_IDLE; | ||
179 | } | ||
180 | |||
181 | /* called from the device poll routine to get ownership of a q_vector */ | ||
182 | static inline bool ixgbevf_qv_lock_napi(struct ixgbevf_q_vector *q_vector) | ||
183 | { | ||
184 | int rc = true; | ||
185 | spin_lock_bh(&q_vector->lock); | ||
186 | if (q_vector->state & IXGBEVF_QV_LOCKED) { | ||
187 | WARN_ON(q_vector->state & IXGBEVF_QV_STATE_NAPI); | ||
188 | q_vector->state |= IXGBEVF_QV_STATE_NAPI_YIELD; | ||
189 | rc = false; | ||
190 | #ifdef BP_EXTENDED_STATS | ||
191 | q_vector->tx.ring->bp_yields++; | ||
192 | #endif | ||
193 | } else { | ||
194 | /* we don't care if someone yielded */ | ||
195 | q_vector->state = IXGBEVF_QV_STATE_NAPI; | ||
196 | } | ||
197 | spin_unlock_bh(&q_vector->lock); | ||
198 | return rc; | ||
199 | } | ||
200 | |||
201 | /* returns true is someone tried to get the qv while napi had it */ | ||
202 | static inline bool ixgbevf_qv_unlock_napi(struct ixgbevf_q_vector *q_vector) | ||
203 | { | ||
204 | int rc = false; | ||
205 | spin_lock_bh(&q_vector->lock); | ||
206 | WARN_ON(q_vector->state & (IXGBEVF_QV_STATE_POLL | | ||
207 | IXGBEVF_QV_STATE_NAPI_YIELD)); | ||
208 | |||
209 | if (q_vector->state & IXGBEVF_QV_STATE_POLL_YIELD) | ||
210 | rc = true; | ||
211 | /* reset state to idle, unless QV is disabled */ | ||
212 | q_vector->state &= IXGBEVF_QV_STATE_DISABLED; | ||
213 | spin_unlock_bh(&q_vector->lock); | ||
214 | return rc; | ||
215 | } | ||
216 | |||
217 | /* called from ixgbevf_low_latency_poll() */ | ||
218 | static inline bool ixgbevf_qv_lock_poll(struct ixgbevf_q_vector *q_vector) | ||
219 | { | ||
220 | int rc = true; | ||
221 | spin_lock_bh(&q_vector->lock); | ||
222 | if ((q_vector->state & IXGBEVF_QV_LOCKED)) { | ||
223 | q_vector->state |= IXGBEVF_QV_STATE_POLL_YIELD; | ||
224 | rc = false; | ||
225 | #ifdef BP_EXTENDED_STATS | ||
226 | q_vector->rx.ring->bp_yields++; | ||
227 | #endif | ||
228 | } else { | ||
229 | /* preserve yield marks */ | ||
230 | q_vector->state |= IXGBEVF_QV_STATE_POLL; | ||
231 | } | ||
232 | spin_unlock_bh(&q_vector->lock); | ||
233 | return rc; | ||
234 | } | ||
235 | |||
236 | /* returns true if someone tried to get the qv while it was locked */ | ||
237 | static inline bool ixgbevf_qv_unlock_poll(struct ixgbevf_q_vector *q_vector) | ||
238 | { | ||
239 | int rc = false; | ||
240 | spin_lock_bh(&q_vector->lock); | ||
241 | WARN_ON(q_vector->state & (IXGBEVF_QV_STATE_NAPI)); | ||
242 | |||
243 | if (q_vector->state & IXGBEVF_QV_STATE_POLL_YIELD) | ||
244 | rc = true; | ||
245 | /* reset state to idle, unless QV is disabled */ | ||
246 | q_vector->state &= IXGBEVF_QV_STATE_DISABLED; | ||
247 | spin_unlock_bh(&q_vector->lock); | ||
248 | return rc; | ||
249 | } | ||
250 | |||
251 | /* true if a socket is polling, even if it did not get the lock */ | ||
252 | static inline bool ixgbevf_qv_busy_polling(struct ixgbevf_q_vector *q_vector) | ||
253 | { | ||
254 | WARN_ON(!(q_vector->state & IXGBEVF_QV_OWNED)); | ||
255 | return q_vector->state & IXGBEVF_QV_USER_PEND; | ||
256 | } | ||
257 | |||
258 | /* false if QV is currently owned */ | ||
259 | static inline bool ixgbevf_qv_disable(struct ixgbevf_q_vector *q_vector) | ||
260 | { | ||
261 | int rc = true; | ||
262 | spin_lock_bh(&q_vector->lock); | ||
263 | if (q_vector->state & IXGBEVF_QV_OWNED) | ||
264 | rc = false; | ||
265 | spin_unlock_bh(&q_vector->lock); | ||
266 | return rc; | ||
267 | } | ||
268 | |||
269 | #endif /* CONFIG_NET_RX_BUSY_POLL */ | ||
149 | 270 | ||
150 | /* | 271 | /* |
151 | * microsecond values for various ITR rates shifted by 2 to fit itr register | 272 | * microsecond values for various ITR rates shifted by 2 to fit itr register |
@@ -240,7 +361,6 @@ struct ixgbevf_adapter { | |||
240 | struct ixgbe_hw hw; | 361 | struct ixgbe_hw hw; |
241 | u16 msg_enable; | 362 | u16 msg_enable; |
242 | struct ixgbevf_hw_stats stats; | 363 | struct ixgbevf_hw_stats stats; |
243 | u64 zero_base; | ||
244 | /* Interrupt Throttle Rate */ | 364 | /* Interrupt Throttle Rate */ |
245 | u32 eitr_param; | 365 | u32 eitr_param; |
246 | 366 | ||
@@ -249,6 +369,16 @@ struct ixgbevf_adapter { | |||
249 | unsigned int tx_ring_count; | 369 | unsigned int tx_ring_count; |
250 | unsigned int rx_ring_count; | 370 | unsigned int rx_ring_count; |
251 | 371 | ||
372 | #ifdef BP_EXTENDED_STATS | ||
373 | u64 bp_rx_yields; | ||
374 | u64 bp_rx_cleaned; | ||
375 | u64 bp_rx_missed; | ||
376 | |||
377 | u64 bp_tx_yields; | ||
378 | u64 bp_tx_cleaned; | ||
379 | u64 bp_tx_missed; | ||
380 | #endif | ||
381 | |||
252 | u32 link_speed; | 382 | u32 link_speed; |
253 | bool link_up; | 383 | bool link_up; |
254 | 384 | ||
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 87279c8ab2b9..b16b694951b8 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
@@ -300,6 +300,30 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector, | |||
300 | } | 300 | } |
301 | 301 | ||
302 | /** | 302 | /** |
303 | * ixgbevf_rx_skb - Helper function to determine proper Rx method | ||
304 | * @q_vector: structure containing interrupt and ring information | ||
305 | * @skb: packet to send up | ||
306 | * @status: hardware indication of status of receive | ||
307 | * @rx_desc: rx descriptor | ||
308 | **/ | ||
309 | static void ixgbevf_rx_skb(struct ixgbevf_q_vector *q_vector, | ||
310 | struct sk_buff *skb, u8 status, | ||
311 | union ixgbe_adv_rx_desc *rx_desc) | ||
312 | { | ||
313 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
314 | skb_mark_napi_id(skb, &q_vector->napi); | ||
315 | |||
316 | if (ixgbevf_qv_busy_polling(q_vector)) { | ||
317 | netif_receive_skb(skb); | ||
318 | /* exit early if we busy polled */ | ||
319 | return; | ||
320 | } | ||
321 | #endif /* CONFIG_NET_RX_BUSY_POLL */ | ||
322 | |||
323 | ixgbevf_receive_skb(q_vector, skb, status, rx_desc); | ||
324 | } | ||
325 | |||
326 | /** | ||
303 | * ixgbevf_rx_checksum - indicate in skb if hw indicated a good cksum | 327 | * ixgbevf_rx_checksum - indicate in skb if hw indicated a good cksum |
304 | * @ring: pointer to Rx descriptor ring structure | 328 | * @ring: pointer to Rx descriptor ring structure |
305 | * @status_err: hardware indication of status of receive | 329 | * @status_err: hardware indication of status of receive |
@@ -396,9 +420,9 @@ static inline void ixgbevf_irq_enable_queues(struct ixgbevf_adapter *adapter, | |||
396 | IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, qmask); | 420 | IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, qmask); |
397 | } | 421 | } |
398 | 422 | ||
399 | static bool ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector, | 423 | static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector, |
400 | struct ixgbevf_ring *rx_ring, | 424 | struct ixgbevf_ring *rx_ring, |
401 | int budget) | 425 | int budget) |
402 | { | 426 | { |
403 | struct ixgbevf_adapter *adapter = q_vector->adapter; | 427 | struct ixgbevf_adapter *adapter = q_vector->adapter; |
404 | struct pci_dev *pdev = adapter->pdev; | 428 | struct pci_dev *pdev = adapter->pdev; |
@@ -494,7 +518,7 @@ static bool ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector, | |||
494 | goto next_desc; | 518 | goto next_desc; |
495 | } | 519 | } |
496 | 520 | ||
497 | ixgbevf_receive_skb(q_vector, skb, staterr, rx_desc); | 521 | ixgbevf_rx_skb(q_vector, skb, staterr, rx_desc); |
498 | 522 | ||
499 | next_desc: | 523 | next_desc: |
500 | rx_desc->wb.upper.status_error = 0; | 524 | rx_desc->wb.upper.status_error = 0; |
@@ -526,7 +550,7 @@ next_desc: | |||
526 | q_vector->rx.total_packets += total_rx_packets; | 550 | q_vector->rx.total_packets += total_rx_packets; |
527 | q_vector->rx.total_bytes += total_rx_bytes; | 551 | q_vector->rx.total_bytes += total_rx_bytes; |
528 | 552 | ||
529 | return !!budget; | 553 | return total_rx_packets; |
530 | } | 554 | } |
531 | 555 | ||
532 | /** | 556 | /** |
@@ -549,6 +573,11 @@ static int ixgbevf_poll(struct napi_struct *napi, int budget) | |||
549 | ixgbevf_for_each_ring(ring, q_vector->tx) | 573 | ixgbevf_for_each_ring(ring, q_vector->tx) |
550 | clean_complete &= ixgbevf_clean_tx_irq(q_vector, ring); | 574 | clean_complete &= ixgbevf_clean_tx_irq(q_vector, ring); |
551 | 575 | ||
576 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
577 | if (!ixgbevf_qv_lock_napi(q_vector)) | ||
578 | return budget; | ||
579 | #endif | ||
580 | |||
552 | /* attempt to distribute budget to each queue fairly, but don't allow | 581 | /* attempt to distribute budget to each queue fairly, but don't allow |
553 | * the budget to go below 1 because we'll exit polling */ | 582 | * the budget to go below 1 because we'll exit polling */ |
554 | if (q_vector->rx.count > 1) | 583 | if (q_vector->rx.count > 1) |
@@ -558,10 +587,15 @@ static int ixgbevf_poll(struct napi_struct *napi, int budget) | |||
558 | 587 | ||
559 | adapter->flags |= IXGBE_FLAG_IN_NETPOLL; | 588 | adapter->flags |= IXGBE_FLAG_IN_NETPOLL; |
560 | ixgbevf_for_each_ring(ring, q_vector->rx) | 589 | ixgbevf_for_each_ring(ring, q_vector->rx) |
561 | clean_complete &= ixgbevf_clean_rx_irq(q_vector, ring, | 590 | clean_complete &= (ixgbevf_clean_rx_irq(q_vector, ring, |
562 | per_ring_budget); | 591 | per_ring_budget) |
592 | < per_ring_budget); | ||
563 | adapter->flags &= ~IXGBE_FLAG_IN_NETPOLL; | 593 | adapter->flags &= ~IXGBE_FLAG_IN_NETPOLL; |
564 | 594 | ||
595 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
596 | ixgbevf_qv_unlock_napi(q_vector); | ||
597 | #endif | ||
598 | |||
565 | /* If all work not completed, return budget and keep polling */ | 599 | /* If all work not completed, return budget and keep polling */ |
566 | if (!clean_complete) | 600 | if (!clean_complete) |
567 | return budget; | 601 | return budget; |
@@ -596,6 +630,40 @@ void ixgbevf_write_eitr(struct ixgbevf_q_vector *q_vector) | |||
596 | IXGBE_WRITE_REG(hw, IXGBE_VTEITR(v_idx), itr_reg); | 630 | IXGBE_WRITE_REG(hw, IXGBE_VTEITR(v_idx), itr_reg); |
597 | } | 631 | } |
598 | 632 | ||
633 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
634 | /* must be called with local_bh_disable()d */ | ||
635 | static int ixgbevf_busy_poll_recv(struct napi_struct *napi) | ||
636 | { | ||
637 | struct ixgbevf_q_vector *q_vector = | ||
638 | container_of(napi, struct ixgbevf_q_vector, napi); | ||
639 | struct ixgbevf_adapter *adapter = q_vector->adapter; | ||
640 | struct ixgbevf_ring *ring; | ||
641 | int found = 0; | ||
642 | |||
643 | if (test_bit(__IXGBEVF_DOWN, &adapter->state)) | ||
644 | return LL_FLUSH_FAILED; | ||
645 | |||
646 | if (!ixgbevf_qv_lock_poll(q_vector)) | ||
647 | return LL_FLUSH_BUSY; | ||
648 | |||
649 | ixgbevf_for_each_ring(ring, q_vector->rx) { | ||
650 | found = ixgbevf_clean_rx_irq(q_vector, ring, 4); | ||
651 | #ifdef BP_EXTENDED_STATS | ||
652 | if (found) | ||
653 | ring->bp_cleaned += found; | ||
654 | else | ||
655 | ring->bp_misses++; | ||
656 | #endif | ||
657 | if (found) | ||
658 | break; | ||
659 | } | ||
660 | |||
661 | ixgbevf_qv_unlock_poll(q_vector); | ||
662 | |||
663 | return found; | ||
664 | } | ||
665 | #endif /* CONFIG_NET_RX_BUSY_POLL */ | ||
666 | |||
599 | /** | 667 | /** |
600 | * ixgbevf_configure_msix - Configure MSI-X hardware | 668 | * ixgbevf_configure_msix - Configure MSI-X hardware |
601 | * @adapter: board private structure | 669 | * @adapter: board private structure |
@@ -1282,6 +1350,9 @@ static void ixgbevf_napi_enable_all(struct ixgbevf_adapter *adapter) | |||
1282 | 1350 | ||
1283 | for (q_idx = 0; q_idx < q_vectors; q_idx++) { | 1351 | for (q_idx = 0; q_idx < q_vectors; q_idx++) { |
1284 | q_vector = adapter->q_vector[q_idx]; | 1352 | q_vector = adapter->q_vector[q_idx]; |
1353 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
1354 | ixgbevf_qv_init_lock(adapter->q_vector[q_idx]); | ||
1355 | #endif | ||
1285 | napi_enable(&q_vector->napi); | 1356 | napi_enable(&q_vector->napi); |
1286 | } | 1357 | } |
1287 | } | 1358 | } |
@@ -1295,6 +1366,12 @@ static void ixgbevf_napi_disable_all(struct ixgbevf_adapter *adapter) | |||
1295 | for (q_idx = 0; q_idx < q_vectors; q_idx++) { | 1366 | for (q_idx = 0; q_idx < q_vectors; q_idx++) { |
1296 | q_vector = adapter->q_vector[q_idx]; | 1367 | q_vector = adapter->q_vector[q_idx]; |
1297 | napi_disable(&q_vector->napi); | 1368 | napi_disable(&q_vector->napi); |
1369 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
1370 | while (!ixgbevf_qv_disable(adapter->q_vector[q_idx])) { | ||
1371 | pr_info("QV %d locked\n", q_idx); | ||
1372 | usleep_range(1000, 20000); | ||
1373 | } | ||
1374 | #endif /* CONFIG_NET_RX_BUSY_POLL */ | ||
1298 | } | 1375 | } |
1299 | } | 1376 | } |
1300 | 1377 | ||
@@ -1945,6 +2022,9 @@ static int ixgbevf_alloc_q_vectors(struct ixgbevf_adapter *adapter) | |||
1945 | q_vector->v_idx = q_idx; | 2022 | q_vector->v_idx = q_idx; |
1946 | netif_napi_add(adapter->netdev, &q_vector->napi, | 2023 | netif_napi_add(adapter->netdev, &q_vector->napi, |
1947 | ixgbevf_poll, 64); | 2024 | ixgbevf_poll, 64); |
2025 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
2026 | napi_hash_add(&q_vector->napi); | ||
2027 | #endif | ||
1948 | adapter->q_vector[q_idx] = q_vector; | 2028 | adapter->q_vector[q_idx] = q_vector; |
1949 | } | 2029 | } |
1950 | 2030 | ||
@@ -1954,6 +2034,9 @@ err_out: | |||
1954 | while (q_idx) { | 2034 | while (q_idx) { |
1955 | q_idx--; | 2035 | q_idx--; |
1956 | q_vector = adapter->q_vector[q_idx]; | 2036 | q_vector = adapter->q_vector[q_idx]; |
2037 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
2038 | napi_hash_del(&q_vector->napi); | ||
2039 | #endif | ||
1957 | netif_napi_del(&q_vector->napi); | 2040 | netif_napi_del(&q_vector->napi); |
1958 | kfree(q_vector); | 2041 | kfree(q_vector); |
1959 | adapter->q_vector[q_idx] = NULL; | 2042 | adapter->q_vector[q_idx] = NULL; |
@@ -1977,6 +2060,9 @@ static void ixgbevf_free_q_vectors(struct ixgbevf_adapter *adapter) | |||
1977 | struct ixgbevf_q_vector *q_vector = adapter->q_vector[q_idx]; | 2060 | struct ixgbevf_q_vector *q_vector = adapter->q_vector[q_idx]; |
1978 | 2061 | ||
1979 | adapter->q_vector[q_idx] = NULL; | 2062 | adapter->q_vector[q_idx] = NULL; |
2063 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
2064 | napi_hash_del(&q_vector->napi); | ||
2065 | #endif | ||
1980 | netif_napi_del(&q_vector->napi); | 2066 | netif_napi_del(&q_vector->napi); |
1981 | kfree(q_vector); | 2067 | kfree(q_vector); |
1982 | } | 2068 | } |
@@ -3308,6 +3394,9 @@ static const struct net_device_ops ixgbevf_netdev_ops = { | |||
3308 | .ndo_tx_timeout = ixgbevf_tx_timeout, | 3394 | .ndo_tx_timeout = ixgbevf_tx_timeout, |
3309 | .ndo_vlan_rx_add_vid = ixgbevf_vlan_rx_add_vid, | 3395 | .ndo_vlan_rx_add_vid = ixgbevf_vlan_rx_add_vid, |
3310 | .ndo_vlan_rx_kill_vid = ixgbevf_vlan_rx_kill_vid, | 3396 | .ndo_vlan_rx_kill_vid = ixgbevf_vlan_rx_kill_vid, |
3397 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
3398 | .ndo_busy_poll = ixgbevf_busy_poll_recv, | ||
3399 | #endif | ||
3311 | }; | 3400 | }; |
3312 | 3401 | ||
3313 | static void ixgbevf_assign_netdev_ops(struct net_device *dev) | 3402 | static void ixgbevf_assign_netdev_ops(struct net_device *dev) |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 75a3a740ce19..24260ced86d2 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -60,10 +60,6 @@ | |||
60 | 60 | ||
61 | #define VXLAN_N_VID (1u << 24) | 61 | #define VXLAN_N_VID (1u << 24) |
62 | #define VXLAN_VID_MASK (VXLAN_N_VID - 1) | 62 | #define VXLAN_VID_MASK (VXLAN_N_VID - 1) |
63 | /* IP header + UDP + VXLAN + Ethernet header */ | ||
64 | #define VXLAN_HEADROOM (20 + 8 + 8 + 14) | ||
65 | /* IPv6 header + UDP + VXLAN + Ethernet header */ | ||
66 | #define VXLAN6_HEADROOM (40 + 8 + 8 + 14) | ||
67 | #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr)) | 63 | #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr)) |
68 | 64 | ||
69 | #define VXLAN_FLAGS 0x08000000 /* struct vxlanhdr.vx_flags required value. */ | 65 | #define VXLAN_FLAGS 0x08000000 /* struct vxlanhdr.vx_flags required value. */ |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 27f62f746621..cb1d918ecdf1 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -483,6 +483,7 @@ void napi_hash_del(struct napi_struct *napi); | |||
483 | */ | 483 | */ |
484 | static inline void napi_disable(struct napi_struct *n) | 484 | static inline void napi_disable(struct napi_struct *n) |
485 | { | 485 | { |
486 | might_sleep(); | ||
486 | set_bit(NAPI_STATE_DISABLE, &n->state); | 487 | set_bit(NAPI_STATE_DISABLE, &n->state); |
487 | while (test_and_set_bit(NAPI_STATE_SCHED, &n->state)) | 488 | while (test_and_set_bit(NAPI_STATE_SCHED, &n->state)) |
488 | msleep(1); | 489 | msleep(1); |
diff --git a/include/net/vxlan.h b/include/net/vxlan.h index 2d64d3cd4999..6b6d180fb91a 100644 --- a/include/net/vxlan.h +++ b/include/net/vxlan.h | |||
@@ -36,5 +36,16 @@ int vxlan_xmit_skb(struct vxlan_sock *vs, | |||
36 | 36 | ||
37 | __be16 vxlan_src_port(__u16 port_min, __u16 port_max, struct sk_buff *skb); | 37 | __be16 vxlan_src_port(__u16 port_min, __u16 port_max, struct sk_buff *skb); |
38 | 38 | ||
39 | /* IP header + UDP + VXLAN + Ethernet header */ | ||
40 | #define VXLAN_HEADROOM (20 + 8 + 8 + 14) | ||
41 | /* IPv6 header + UDP + VXLAN + Ethernet header */ | ||
42 | #define VXLAN6_HEADROOM (40 + 8 + 8 + 14) | ||
43 | |||
44 | #if IS_ENABLED(CONFIG_VXLAN) | ||
39 | void vxlan_get_rx_port(struct net_device *netdev); | 45 | void vxlan_get_rx_port(struct net_device *netdev); |
46 | #else | ||
47 | static inline void vxlan_get_rx_port(struct net_device *netdev) | ||
48 | { | ||
49 | } | ||
50 | #endif | ||
40 | #endif | 51 | #endif |