ixgbe: bulk free SKBs during TX completion cleanup cycle
There is an opportunity to bulk free SKBs during reclaiming of resources after DMA transmit completes in ixgbe_clean_tx_irq. Thus, bulk freeing at this point does not introduce any added latency. Simply use napi_consume_skb() which were recently introduced. The napi_budget parameter is needed by napi_consume_skb() to detect if it is called from netpoll. Benchmarking IPv4-forwarding, on CPU i7-4790K @4.2GHz (no turbo boost) Single CPU/flow numbers: before: 1982144 pps -> after : 2064446 pps Improvement: +82302 pps, -20 nanosec, +4.1% (SLUB and GCC version 5.1.1 20150618 (Red Hat 5.1.1-4)) Joint work with Alexander Duyck. Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
15fad714be
commit
a3a8749d34
@@ -1089,7 +1089,7 @@ static void ixgbe_tx_timeout_reset(struct ixgbe_adapter *adapter)
|
|||||||
* @tx_ring: tx ring to clean
|
* @tx_ring: tx ring to clean
|
||||||
**/
|
**/
|
||||||
static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
|
static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
|
||||||
struct ixgbe_ring *tx_ring)
|
struct ixgbe_ring *tx_ring, int napi_budget)
|
||||||
{
|
{
|
||||||
struct ixgbe_adapter *adapter = q_vector->adapter;
|
struct ixgbe_adapter *adapter = q_vector->adapter;
|
||||||
struct ixgbe_tx_buffer *tx_buffer;
|
struct ixgbe_tx_buffer *tx_buffer;
|
||||||
@@ -1127,7 +1127,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
|
|||||||
total_packets += tx_buffer->gso_segs;
|
total_packets += tx_buffer->gso_segs;
|
||||||
|
|
||||||
/* free the skb */
|
/* free the skb */
|
||||||
dev_consume_skb_any(tx_buffer->skb);
|
napi_consume_skb(tx_buffer->skb, napi_budget);
|
||||||
|
|
||||||
/* unmap skb header data */
|
/* unmap skb header data */
|
||||||
dma_unmap_single(tx_ring->dev,
|
dma_unmap_single(tx_ring->dev,
|
||||||
@@ -2784,7 +2784,7 @@ int ixgbe_poll(struct napi_struct *napi, int budget)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
ixgbe_for_each_ring(ring, q_vector->tx)
|
ixgbe_for_each_ring(ring, q_vector->tx)
|
||||||
clean_complete &= !!ixgbe_clean_tx_irq(q_vector, ring);
|
clean_complete &= !!ixgbe_clean_tx_irq(q_vector, ring, budget);
|
||||||
|
|
||||||
/* Exit if we are called by netpoll or busy polling is active */
|
/* Exit if we are called by netpoll or busy polling is active */
|
||||||
if ((budget <= 0) || !ixgbe_qv_lock_napi(q_vector))
|
if ((budget <= 0) || !ixgbe_qv_lock_napi(q_vector))
|
||||||
|
|||||||
Reference in New Issue
Block a user