mirror of
https://github.com/torvalds/linux.git
synced 2024-12-20 01:52:13 +00:00
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: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
4e1ad31ce3
@ -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);
|
||||
|
@ -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,10 +742,15 @@ static void ena_free_tx_bufs(struct ena_ring *tx_ring)
|
||||
|
||||
ena_unmap_tx_buff(tx_ring, tx_info);
|
||||
|
||||
dev_kfree_skb_any(tx_info->skb);
|
||||
if (is_xdp_ring)
|
||||
xdp_return_frame(tx_info->xdpf);
|
||||
else
|
||||
dev_kfree_skb_any(tx_info->skb);
|
||||
}
|
||||
netdev_tx_reset_queue(netdev_get_tx_queue(tx_ring->netdev,
|
||||
tx_ring->qid));
|
||||
|
||||
if (!is_xdp_ring)
|
||||
netdev_tx_reset_queue(netdev_get_tx_queue(tx_ring->netdev,
|
||||
tx_ring->qid));
|
||||
}
|
||||
|
||||
static void ena_free_all_tx_bufs(struct ena_adapter *adapter)
|
||||
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user