diff options
author | Artur Rojek <ar@semihalf.com> | 2022-01-03 13:50:06 +0000 |
---|---|---|
committer | Marcin Wojtas <mw@FreeBSD.org> | 2022-01-23 19:38:12 +0000 |
commit | b168d0c850f34e8178d815ba3a87de2657a02ca9 (patch) | |
tree | 087e8ca4ec0ead4c98b406800d405569a6f19e77 | |
parent | 2bbef9d95dc10a69a3c5813a517f6e8fe583539a (diff) | |
download | src-b168d0c850f34e8178d815ba3a87de2657a02ca9.tar.gz src-b168d0c850f34e8178d815ba3a87de2657a02ca9.zip |
ena: rework tx req_id validation logic
Since `ena_com_tx_comp_req_id_get` already checks for `req_id` validity,
the logic was exiting early, never giving `validate_tx_req_id` a chance
to trigger device reset.
Rewrite the logic so that device reset is called based on return value
of `ena_com_tx_comp_req_id_get` instead.
Submitted by: Artur Rojek <ar@semihalf.com>
Obtained from: Semihalf
MFC after: 2 weeks
Sponsored by: Amazon, Inc.
-rw-r--r-- | sys/dev/ena/ena_datapath.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/sys/dev/ena/ena_datapath.c b/sys/dev/ena/ena_datapath.c index 3026671b6a19..c6798b3f7eb3 100644 --- a/sys/dev/ena/ena_datapath.c +++ b/sys/dev/ena/ena_datapath.c @@ -48,7 +48,8 @@ __FBSDID("$FreeBSD$"); static int ena_tx_cleanup(struct ena_ring *); static int ena_rx_cleanup(struct ena_ring *); -static inline int validate_tx_req_id(struct ena_ring *, uint16_t); +static inline int ena_get_tx_req_id(struct ena_ring *tx_ring, + struct ena_com_io_cq *io_cq, uint16_t *req_id); static void ena_rx_hash_mbuf(struct ena_ring *, struct ena_com_rx_ctx *, struct mbuf *); static struct mbuf* ena_rx_mbuf(struct ena_ring *, struct ena_com_rx_buf_info *, @@ -200,23 +201,27 @@ ena_qflush(if_t ifp) *********************************************************************/ static inline int -validate_tx_req_id(struct ena_ring *tx_ring, uint16_t req_id) +ena_get_tx_req_id(struct ena_ring *tx_ring, struct ena_com_io_cq *io_cq, + uint16_t *req_id) { struct ena_adapter *adapter = tx_ring->adapter; - struct ena_tx_buffer *tx_info = NULL; + int rc; - if (likely(req_id < tx_ring->ring_size)) { - tx_info = &tx_ring->tx_buffer_info[req_id]; - if (tx_info->mbuf != NULL) - return (0); - ena_log(adapter->pdev, ERR, - "tx_info doesn't have valid mbuf\n"); + rc = ena_com_tx_comp_req_id_get(io_cq, req_id); + if (rc == ENA_COM_TRY_AGAIN) + return (EAGAIN); + + if (unlikely(rc != 0)) { + ena_log(adapter->pdev, ERR, "Invalid req_id: %hu\n", *req_id); + counter_u64_add(tx_ring->tx_stats.bad_req_id, 1); + goto err; } - ena_log(adapter->pdev, ERR, "Invalid req_id: %hu\n", req_id); - counter_u64_add(tx_ring->tx_stats.bad_req_id, 1); + if (tx_ring->tx_buffer_info[*req_id].mbuf != NULL) + return (0); - /* Trigger device reset */ + ena_log(adapter->pdev, ERR, "tx_info doesn't have valid mbuf\n"); +err: ena_trigger_reset(adapter, ENA_REGS_RESET_INV_TX_REQ_ID); return (EFAULT); @@ -262,11 +267,7 @@ ena_tx_cleanup(struct ena_ring *tx_ring) struct ena_tx_buffer *tx_info; struct mbuf *mbuf; - rc = ena_com_tx_comp_req_id_get(io_cq, &req_id); - if (unlikely(rc != 0)) - break; - - rc = validate_tx_req_id(tx_ring, req_id); + rc = ena_get_tx_req_id(tx_ring, io_cq, &req_id); if (unlikely(rc != 0)) break; |