mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 17:24:17 +08:00
veth: Account for packet drops in ndo_xdp_xmit
Use existing atomic drop counter. Since drop path is really an exceptional case here, I'm thinking atomic ops would not hurt the performance. XDP packets and bytes are not counted in ndo_xdp_xmit, but will be accounted on rx side by the following commit. Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
acad76a5f6
commit
2131479df6
@ -308,16 +308,20 @@ static int veth_xdp_xmit(struct net_device *dev, int n,
|
||||
{
|
||||
struct veth_priv *rcv_priv, *priv = netdev_priv(dev);
|
||||
struct net_device *rcv;
|
||||
int i, ret, drops = n;
|
||||
unsigned int max_len;
|
||||
struct veth_rq *rq;
|
||||
int i, drops = 0;
|
||||
|
||||
if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
|
||||
return -EINVAL;
|
||||
if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) {
|
||||
ret = -EINVAL;
|
||||
goto drop;
|
||||
}
|
||||
|
||||
rcv = rcu_dereference(priv->peer);
|
||||
if (unlikely(!rcv))
|
||||
return -ENXIO;
|
||||
if (unlikely(!rcv)) {
|
||||
ret = -ENXIO;
|
||||
goto drop;
|
||||
}
|
||||
|
||||
rcv_priv = netdev_priv(rcv);
|
||||
rq = &rcv_priv->rq[veth_select_rxq(rcv)];
|
||||
@ -325,9 +329,12 @@ static int veth_xdp_xmit(struct net_device *dev, int n,
|
||||
* side. This means an XDP program is loaded on the peer and the peer
|
||||
* device is up.
|
||||
*/
|
||||
if (!rcu_access_pointer(rq->xdp_prog))
|
||||
return -ENXIO;
|
||||
if (!rcu_access_pointer(rq->xdp_prog)) {
|
||||
ret = -ENXIO;
|
||||
goto drop;
|
||||
}
|
||||
|
||||
drops = 0;
|
||||
max_len = rcv->mtu + rcv->hard_header_len + VLAN_HLEN;
|
||||
|
||||
spin_lock(&rq->xdp_ring.producer_lock);
|
||||
@ -346,7 +353,14 @@ static int veth_xdp_xmit(struct net_device *dev, int n,
|
||||
if (flags & XDP_XMIT_FLUSH)
|
||||
__veth_xdp_flush(rq);
|
||||
|
||||
return n - drops;
|
||||
if (likely(!drops))
|
||||
return n;
|
||||
|
||||
ret = n - drops;
|
||||
drop:
|
||||
atomic64_add(drops, &priv->dropped);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void veth_xdp_flush(struct net_device *dev)
|
||||
|
Loading…
Reference in New Issue
Block a user