Skip to content

Commit

Permalink
net: socionext: Use descriptor info instead of MMIO reads on Rx
Browse files Browse the repository at this point in the history
MMIO reads for remaining packets in queue occur (at least)twice per
invocation of netsec_process_rx(). We can use the packet descriptor to
identify if it's owned by the hardware and break out, avoiding the more
expensive MMIO read operations. This has a ~2% increase on the pps of the
Rx path when tested with 64byte packets

Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ilias Apalodimas authored and David S. Miller committed Aug 11, 2018
1 parent 78aca3b commit 63ae794
Showing 1 changed file with 10 additions and 15 deletions.
25 changes: 10 additions & 15 deletions drivers/net/ethernet/socionext/netsec.c
Original file line number Diff line number Diff line change
Expand Up @@ -642,8 +642,6 @@ static struct sk_buff *netsec_get_rx_pkt_data(struct netsec_priv *priv,

tmp_skb = netsec_alloc_skb(priv, &td);

dma_rmb();

tail = dring->tail;

if (!tmp_skb) {
Expand All @@ -657,8 +655,6 @@ static struct sk_buff *netsec_get_rx_pkt_data(struct netsec_priv *priv,
/* move tail ahead */
dring->tail = (dring->tail + 1) % DESC_NUM;

dring->pkt_cnt--;

return skb;
}

Expand Down Expand Up @@ -731,25 +727,24 @@ static int netsec_process_rx(struct netsec_priv *priv, int budget)
struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX];
struct net_device *ndev = priv->ndev;
struct netsec_rx_pkt_info rx_info;
int done = 0, rx_num = 0;
int done = 0;
struct netsec_desc desc;
struct sk_buff *skb;
u16 len;

while (done < budget) {
if (!rx_num) {
rx_num = netsec_read(priv, NETSEC_REG_NRM_RX_PKTCNT);
dring->pkt_cnt += rx_num;
u16 idx = dring->tail;
struct netsec_de *de = dring->vaddr + (DESC_SZ * idx);

/* move head 'rx_num' */
dring->head = (dring->head + rx_num) % DESC_NUM;
if (de->attr & (1U << NETSEC_RX_PKT_OWN_FIELD))
break;

rx_num = dring->pkt_cnt;
if (!rx_num)
break;
}
/* This barrier is needed to keep us from reading
* any other fields out of the netsec_de until we have
* verified the descriptor has been written back
*/
dma_rmb();
done++;
rx_num--;
skb = netsec_get_rx_pkt_data(priv, &rx_info, &desc, &len);
if (unlikely(!skb) || rx_info.err_flag) {
netif_err(priv, drv, priv->ndev,
Expand Down

0 comments on commit 63ae794

Please sign in to comment.