Commit 4e1ad31c authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'ena-driver-bug-fixes'

David Arinzon says:

====================
ENA driver bug fixes

From: David Arinzon <darinzon@amazon.com>

This patchset contains multiple bug fixes for the
ENA driver.
====================

Link: https://lore.kernel.org/r/20240410091358.16289-1-darinzon@amazon.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents fe3eb406 36a1ca01
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -351,7 +351,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,
			ENA_COM_BOUNCE_BUFFER_CNTRL_CNT;
		io_sq->bounce_buf_ctrl.next_to_use = 0;

		size = io_sq->bounce_buf_ctrl.buffer_size *
		size = (size_t)io_sq->bounce_buf_ctrl.buffer_size *
			io_sq->bounce_buf_ctrl.buffers_num;

		dev_node = dev_to_node(ena_dev->dmadev);
+23 −12
Original line number Diff line number Diff line
@@ -718,8 +718,11 @@ void ena_unmap_tx_buff(struct ena_ring *tx_ring,
static void ena_free_tx_bufs(struct ena_ring *tx_ring)
{
	bool print_once = true;
	bool is_xdp_ring;
	u32 i;

	is_xdp_ring = ENA_IS_XDP_INDEX(tx_ring->adapter, tx_ring->qid);

	for (i = 0; i < tx_ring->ring_size; i++) {
		struct ena_tx_buffer *tx_info = &tx_ring->tx_buffer_info[i];

@@ -739,8 +742,13 @@ static void ena_free_tx_bufs(struct ena_ring *tx_ring)

		ena_unmap_tx_buff(tx_ring, tx_info);

		if (is_xdp_ring)
			xdp_return_frame(tx_info->xdpf);
		else
			dev_kfree_skb_any(tx_info->skb);
	}

	if (!is_xdp_ring)
		netdev_tx_reset_queue(netdev_get_tx_queue(tx_ring->netdev,
							  tx_ring->qid));
}
@@ -3481,10 +3489,11 @@ static void check_for_missing_completions(struct ena_adapter *adapter)
{
	struct ena_ring *tx_ring;
	struct ena_ring *rx_ring;
	int i, budget, rc;
	int qid, budget, rc;
	int io_queue_count;

	io_queue_count = adapter->xdp_num_queues + adapter->num_io_queues;

	/* Make sure the driver doesn't turn the device in other process */
	smp_rmb();

@@ -3497,27 +3506,29 @@ static void check_for_missing_completions(struct ena_adapter *adapter)
	if (adapter->missing_tx_completion_to == ENA_HW_HINTS_NO_TIMEOUT)
		return;

	budget = ENA_MONITORED_TX_QUEUES;
	budget = min_t(u32, io_queue_count, ENA_MONITORED_TX_QUEUES);

	for (i = adapter->last_monitored_tx_qid; i < io_queue_count; i++) {
		tx_ring = &adapter->tx_ring[i];
		rx_ring = &adapter->rx_ring[i];
	qid = adapter->last_monitored_tx_qid;

	while (budget) {
		qid = (qid + 1) % io_queue_count;

		tx_ring = &adapter->tx_ring[qid];
		rx_ring = &adapter->rx_ring[qid];

		rc = check_missing_comp_in_tx_queue(adapter, tx_ring);
		if (unlikely(rc))
			return;

		rc =  !ENA_IS_XDP_INDEX(adapter, i) ?
		rc =  !ENA_IS_XDP_INDEX(adapter, qid) ?
			check_for_rx_interrupt_queue(adapter, rx_ring) : 0;
		if (unlikely(rc))
			return;

		budget--;
		if (!budget)
			break;
	}

	adapter->last_monitored_tx_qid = i % io_queue_count;
	adapter->last_monitored_tx_qid = qid;
}

/* trigger napi schedule after 2 consecutive detections */
+3 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ int ena_xdp_xmit_frame(struct ena_ring *tx_ring,

	rc = ena_xdp_tx_map_frame(tx_ring, tx_info, xdpf, &ena_tx_ctx);
	if (unlikely(rc))
		return rc;
		goto err;

	ena_tx_ctx.req_id = req_id;

@@ -112,7 +112,9 @@ int ena_xdp_xmit_frame(struct ena_ring *tx_ring,

error_unmap_dma:
	ena_unmap_tx_buff(tx_ring, tx_info);
err:
	tx_info->xdpf = NULL;

	return rc;
}