* [dpdk-stable] [PATCH 18.11 2/3] net/avf: fix flow flush after PF reset
2020-12-03 9:47 [dpdk-stable] [PATCH 18.11 1/3] net/avf: fix command after PF reset Jeff Guo
@ 2020-12-03 9:47 ` Jeff Guo
2020-12-03 9:47 ` [dpdk-stable] [PATCH 18.11 3/3] net/avf: fix vector Rx Jeff Guo
2020-12-03 16:45 ` [dpdk-stable] [PATCH 18.11 1/3] net/avf: fix command after PF reset Kevin Traynor
2 siblings, 0 replies; 4+ messages in thread
From: Jeff Guo @ 2020-12-03 9:47 UTC (permalink / raw)
To: ktraynor; +Cc: stable, jia.guo, Qi Zhang
[ upstream commit c02ea7410e5124ad44ad7419ab16a43e1b3af647 ]
When VF begin reset after PF reset, VF will be uninitialized at first
and then be initialized, during the time any invalid cmd such as flow
flush should not be sent to PF until the uninitialization is finished.
Fixes: 3926cfffff2c ("net/avf: fix command after PF reset")
Signed-off-by: Jeff Guo <jia.guo@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
---
drivers/net/avf/avf_ethdev.c | 5 +++--
drivers/net/avf/avf_vchnl.c | 7 ++++---
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/net/avf/avf_ethdev.c b/drivers/net/avf/avf_ethdev.c
index 35a7debf64..d49de4344a 100644
--- a/drivers/net/avf/avf_ethdev.c
+++ b/drivers/net/avf/avf_ethdev.c
@@ -1137,8 +1137,6 @@ avf_init_vf(struct rte_eth_dev *dev)
}
}
- vf->vf_reset = false;
-
return 0;
err_rss:
rte_free(vf->rss_key);
@@ -1269,6 +1267,7 @@ avf_dev_init(struct rte_eth_dev *eth_dev)
static void
avf_dev_close(struct rte_eth_dev *dev)
{
+ struct avf_info *vf = AVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
struct avf_hw *hw = AVF_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
@@ -1282,6 +1281,8 @@ avf_dev_close(struct rte_eth_dev *dev)
rte_intr_callback_unregister(intr_handle,
avf_dev_interrupt_handler, dev);
avf_disable_irq0(hw);
+
+ vf->vf_reset = false;
}
static int
diff --git a/drivers/net/avf/avf_vchnl.c b/drivers/net/avf/avf_vchnl.c
index 29ef485184..39ae0c011c 100644
--- a/drivers/net/avf/avf_vchnl.c
+++ b/drivers/net/avf/avf_vchnl.c
@@ -73,12 +73,12 @@ avf_execute_vf_cmd(struct avf_adapter *adapter, struct avf_cmd_info *args)
int err = 0;
int i = 0;
- if (_atomic_set_cmd(vf, args->ops))
- return -1;
-
if (vf->vf_reset)
return -EIO;
+ if (_atomic_set_cmd(vf, args->ops))
+ return -1;
+
ret = avf_aq_send_msg_to_pf(hw, args->ops, AVF_SUCCESS,
args->in_args, args->in_args_size, NULL);
if (ret) {
@@ -150,6 +150,7 @@ avf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg,
switch (pf_msg->event) {
case VIRTCHNL_EVENT_RESET_IMPENDING:
PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_RESET_IMPENDING event");
+ vf->vf_reset = true;
_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET,
NULL);
break;
--
2.20.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [dpdk-stable] [PATCH 18.11 3/3] net/avf: fix vector Rx
2020-12-03 9:47 [dpdk-stable] [PATCH 18.11 1/3] net/avf: fix command after PF reset Jeff Guo
2020-12-03 9:47 ` [dpdk-stable] [PATCH 18.11 2/3] net/avf: fix flow flush " Jeff Guo
@ 2020-12-03 9:47 ` Jeff Guo
2020-12-03 16:45 ` [dpdk-stable] [PATCH 18.11 1/3] net/avf: fix command after PF reset Kevin Traynor
2 siblings, 0 replies; 4+ messages in thread
From: Jeff Guo @ 2020-12-03 9:47 UTC (permalink / raw)
To: ktraynor; +Cc: stable, jia.guo, Morten Brørup, Wei Ling, Qi Zhang
[ upstream commit 851b22ff688e759a961ed969ea620372b20581d9 ]
The limitation of burst size in vector rx was removed, since it should
retrieve as much received packets as possible. And also the scattered
receive path should use a wrapper function to achieve the goal of
burst maximizing.
Bugzilla ID: 516
Fixes: 319c421f3890 ("net/avf: enable SSE Rx Tx")
Signed-off-by: Jeff Guo <jia.guo@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Tested-by: Wei Ling <weix.ling@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
---
drivers/net/avf/avf_rxtx_vec_sse.c | 49 ++++++++++++++++++++++--------
1 file changed, 37 insertions(+), 12 deletions(-)
diff --git a/drivers/net/avf/avf_rxtx_vec_sse.c b/drivers/net/avf/avf_rxtx_vec_sse.c
index 13e94cebc0..4aa209f702 100644
--- a/drivers/net/avf/avf_rxtx_vec_sse.c
+++ b/drivers/net/avf/avf_rxtx_vec_sse.c
@@ -227,10 +227,12 @@ desc_to_ptype_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
rx_pkts[3]->packet_type = type_table[_mm_extract_epi8(ptype1, 8)];
}
-/* Notice:
+/**
+ * vPMD raw receive routine, only accept(nb_pkts >= AVF_VPMD_DESCS_PER_LOOP)
+ *
+ * Notice:
* - nb_pkts < AVF_VPMD_DESCS_PER_LOOP, just return no packet
- * - nb_pkts > AVF_VPMD_RX_MAX_BURST, only scan AVF_VPMD_RX_MAX_BURST
- * numbers of DD bits
+ * - floor align nb_pkts to a AVF_VPMD_DESCS_PER_LOOP power-of-two
*/
static inline uint16_t
_recv_raw_pkts_vec(struct avf_rx_queue *rxq, struct rte_mbuf **rx_pkts,
@@ -260,9 +262,6 @@ _recv_raw_pkts_vec(struct avf_rx_queue *rxq, struct rte_mbuf **rx_pkts,
offsetof(struct rte_mbuf, rx_descriptor_fields1) + 8);
__m128i dd_check, eop_check;
- /* nb_pkts shall be less equal than AVF_VPMD_RX_MAX_BURST */
- nb_pkts = RTE_MIN(nb_pkts, AVF_VPMD_RX_MAX_BURST);
-
/* nb_pkts has to be floor-aligned to AVF_VPMD_DESCS_PER_LOOP */
nb_pkts = RTE_ALIGN_FLOOR(nb_pkts, AVF_VPMD_DESCS_PER_LOOP);
@@ -486,15 +485,15 @@ avf_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
return _recv_raw_pkts_vec(rx_queue, rx_pkts, nb_pkts, NULL);
}
-/* vPMD receive routine that reassembles scattered packets
+/**
+ * vPMD receive routine that reassembles single burst of 32 scattered packets
+ *
* Notice:
* - nb_pkts < AVF_VPMD_DESCS_PER_LOOP, just return no packet
- * - nb_pkts > VPMD_RX_MAX_BURST, only scan AVF_VPMD_RX_MAX_BURST
- * numbers of DD bits
*/
-uint16_t
-avf_recv_scattered_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
- uint16_t nb_pkts)
+static uint16_t
+avf_recv_scattered_burst_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
+ uint16_t nb_pkts)
{
struct avf_rx_queue *rxq = rx_queue;
uint8_t split_flags[AVF_VPMD_RX_MAX_BURST] = {0};
@@ -527,6 +526,32 @@ avf_recv_scattered_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
&split_flags[i]);
}
+/**
+ * vPMD receive routine that reassembles scattered packets.
+ */
+uint16_t
+avf_recv_scattered_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
+ uint16_t nb_pkts)
+{
+ uint16_t retval = 0;
+
+ while (nb_pkts > AVF_VPMD_RX_MAX_BURST) {
+ uint16_t burst;
+
+ burst = avf_recv_scattered_burst_vec(rx_queue,
+ rx_pkts + retval,
+ AVF_VPMD_RX_MAX_BURST);
+ retval += burst;
+ nb_pkts -= burst;
+ if (burst < AVF_VPMD_RX_MAX_BURST)
+ return retval;
+ }
+
+ return retval + avf_recv_scattered_burst_vec(rx_queue,
+ rx_pkts + retval,
+ nb_pkts);
+}
+
static inline void
vtx1(volatile struct avf_tx_desc *txdp, struct rte_mbuf *pkt, uint64_t flags)
{
--
2.20.1
^ permalink raw reply [flat|nested] 4+ messages in thread