Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7a0ef31 authored by Sathya Perla's avatar Sathya Perla Committed by David S. Miller
Browse files

be2net: Fix early reset of rx-completion



be_rx_compl_get() must not reset(via the valid word) the rx_compl as the rx_compl is not processed yet; it must be reset after it is processed.

Signed-off-by: default avatarSathya Perla <sathyap@serverengines.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 76fbb429
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -876,12 +876,19 @@ static struct be_eth_rx_compl *be_rx_compl_get(struct be_adapter *adapter)

	be_dws_le_to_cpu(rxcp, sizeof(*rxcp));

	rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] = 0;

	queue_tail_inc(&adapter->rx_obj.cq);
	return rxcp;
}

/* To reset the valid bit, we need to reset the whole word as
 * when walking the queue the valid entries are little-endian
 * and invalid entries are host endian
 */
static inline void be_rx_compl_reset(struct be_eth_rx_compl *rxcp)
{
	rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] = 0;
}

static inline struct page *be_alloc_pages(u32 size)
{
	gfp_t alloc_flags = GFP_ATOMIC;
@@ -1013,6 +1020,7 @@ static void be_rx_q_clean(struct be_adapter *adapter)
	/* First cleanup pending rx completions */
	while ((rxcp = be_rx_compl_get(adapter)) != NULL) {
		be_rx_compl_discard(adapter, rxcp);
		be_rx_compl_reset(rxcp);
		be_cq_notify(&adapter->ctrl, rx_cq->id, true, 1);
	}

@@ -1294,6 +1302,8 @@ int be_poll_rx(struct napi_struct *napi, int budget)
			be_rx_compl_process_lro(adapter, rxcp);
		else
			be_rx_compl_process(adapter, rxcp);

		be_rx_compl_reset(rxcp);
	}

	lro_flush_all(&adapter->rx_obj.lro_mgr);