Skip to content

Commit

Permalink
net/ena: prevent double doorbell
Browse files Browse the repository at this point in the history
[ upstream commit 1d973d8 ]

Add per-tx-ring flag for packets that were pushed to HW but await
doorbell. That is to prevent a situation when a doorbell is sent due to
reaching Tx burst threshold and next send fails (e.g., due to queue
full). In such case we shouldn't send another doorbell because there are
no actual packets waiting for transmission.

Fixes: c7519ea ("net/ena: call additional doorbells if needed")

Signed-off-by: Igor Chauskin <igorch@amazon.com>
Reviewed-by: Michal Krawczyk <mk@semihalf.com>
  • Loading branch information
Igor Chauskin authored and bluca committed Feb 4, 2021
1 parent bde94e8 commit 0eedd3e
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
7 changes: 5 additions & 2 deletions drivers/net/ena/ena_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1282,6 +1282,7 @@ static int ena_tx_queue_setup(struct rte_eth_dev *dev,
txq->ring_size = nb_desc;
txq->size_mask = nb_desc - 1;
txq->numa_socket_id = socket_id;
txq->pkts_without_db = false;

txq->tx_buffer_info = rte_zmalloc("txq->tx_buffer_info",
sizeof(struct ena_tx_buffer) *
Expand Down Expand Up @@ -2522,6 +2523,7 @@ static int ena_xmit_mbuf(struct ena_ring *tx_ring, struct rte_mbuf *mbuf)
tx_ring->id);
ena_com_write_sq_doorbell(tx_ring->ena_com_io_sq);
tx_ring->tx_stats.doorbells++;
tx_ring->pkts_without_db = false;
}

/* prepare the packet's descriptors to dma engine */
Expand Down Expand Up @@ -2603,7 +2605,7 @@ static uint16_t eth_ena_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
for (sent_idx = 0; sent_idx < nb_pkts; sent_idx++) {
if (ena_xmit_mbuf(tx_ring, tx_pkts[sent_idx]))
break;

tx_ring->pkts_without_db = true;
rte_prefetch0(tx_pkts[ENA_IDX_ADD_MASKED(sent_idx, 4,
tx_ring->size_mask)]);
}
Expand All @@ -2612,10 +2614,11 @@ static uint16_t eth_ena_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
ena_com_free_q_entries(tx_ring->ena_com_io_sq);

/* If there are ready packets to be xmitted... */
if (sent_idx > 0) {
if (likely(tx_ring->pkts_without_db)) {
/* ...let HW do its best :-) */
ena_com_write_sq_doorbell(tx_ring->ena_com_io_sq);
tx_ring->tx_stats.doorbells++;
tx_ring->pkts_without_db = false;
}

ena_tx_cleanup(tx_ring);
Expand Down
4 changes: 4 additions & 0 deletions drivers/net/ena/ena_ethdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ struct ena_ring {

enum ena_ring_type type;
enum ena_admin_placement_policy_type tx_mem_queue_type;

/* Indicate there are Tx packets pushed to the device and wait for db */
bool pkts_without_db;

/* Holds the empty requests for TX/RX OOO completions */
union {
uint16_t *empty_tx_reqs;
Expand Down

0 comments on commit 0eedd3e

Please sign in to comment.