From: Lorenzo Bianconi <lorenzo@kernel.org>
To: Toshiaki Makita <toshiaki.makita1@gmail.com>
Cc: netdev@vger.kernel.org, davem@davemloft.net, brouer@redhat.com,
dsahern@gmail.com, lorenzo.bianconi@redhat.com, toke@redhat.com
Subject: Re: [PATCH net-next 4/5] veth: introduce more xdp counters
Date: Fri, 20 Mar 2020 14:37:37 +0100 [thread overview]
Message-ID: <20200320133737.GA2329672@lore-desk-wlan> (raw)
In-Reply-To: <a3555c02-6cb1-c40c-65bb-12378439b12f@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3257 bytes --]
> On 2020/03/20 1:41, Lorenzo Bianconi wrote:
> > Introduce xdp_xmit counter in order to distinguish between XDP_TX and
> > ndo_xdp_xmit stats. Introduce the following ethtool counters:
> > - rx_xdp_tx
> > - rx_xdp_tx_errors
> > - tx_xdp_xmit
> > - tx_xdp_xmit_errors
> > - rx_xdp_redirect
>
> Thank you for working on this!
>
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> > ---
> ...
> > @@ -395,7 +404,8 @@ static int veth_xdp_xmit(struct net_device *dev, int n,
> > }
> > rcv_priv = netdev_priv(rcv);
> > - rq = &rcv_priv->rq[veth_select_rxq(rcv)];
> > + qidx = veth_select_rxq(rcv);
> > + rq = &rcv_priv->rq[qidx];
> > /* Non-NULL xdp_prog ensures that xdp_ring is initialized on receive
> > * side. This means an XDP program is loaded on the peer and the peer
> > * device is up.
> > @@ -424,6 +434,17 @@ static int veth_xdp_xmit(struct net_device *dev, int n,
> > if (flags & XDP_XMIT_FLUSH)
> > __veth_xdp_flush(rq);
> > + rq = &priv->rq[qidx];
>
> I think there is no guarantee that this rq exists. Qidx is less than
> rcv->real_num_rx_queues, but not necessarily less than
> dev->real_num_rx_queues.
>
> > + u64_stats_update_begin(&rq->stats.syncp);
>
> So this can cuase NULL pointer dereference.
oh right, thanks for spotting this.
I think we can recompute qidx for tx netdevice in this case, doing something
like:
qidx = veth_select_rxq(dev);
rq = &priv->rq[qidx];
what do you think?
Regards,
Lorenzo
>
> Toshiaki Makita
>
> > + if (ndo_xmit) {
> > + rq->stats.vs.xdp_xmit += n - drops;
> > + rq->stats.vs.xdp_xmit_err += drops;
> > + } else {
> > + rq->stats.vs.xdp_tx += n - drops;
> > + rq->stats.vs.xdp_tx_err += drops;
> > + }
> > + u64_stats_update_end(&rq->stats.syncp);
> > +
> > if (likely(!drops)) {
> > rcu_read_unlock();
> > return n;
> > @@ -437,11 +458,17 @@ static int veth_xdp_xmit(struct net_device *dev, int n,
> > return ret;
> > }
> > +static int veth_ndo_xdp_xmit(struct net_device *dev, int n,
> > + struct xdp_frame **frames, u32 flags)
> > +{
> > + return veth_xdp_xmit(dev, n, frames, flags, true);
> > +}
> > +
> > static void veth_xdp_flush_bq(struct net_device *dev, struct veth_xdp_tx_bq *bq)
> > {
> > int sent, i, err = 0;
> > - sent = veth_xdp_xmit(dev, bq->count, bq->q, 0);
> > + sent = veth_xdp_xmit(dev, bq->count, bq->q, 0, false);
> > if (sent < 0) {
> > err = sent;
> > sent = 0;
> > @@ -753,6 +780,7 @@ static int veth_xdp_rcv(struct veth_rq *rq, int budget,
> > }
> > u64_stats_update_begin(&rq->stats.syncp);
> > + rq->stats.vs.xdp_redirect += stats->xdp_redirect;
> > rq->stats.vs.xdp_bytes += stats->xdp_bytes;
> > rq->stats.vs.xdp_drops += stats->xdp_drops;
> > rq->stats.vs.rx_drops += stats->rx_drops;
> > @@ -1172,7 +1200,7 @@ static const struct net_device_ops veth_netdev_ops = {
> > .ndo_features_check = passthru_features_check,
> > .ndo_set_rx_headroom = veth_set_rx_headroom,
> > .ndo_bpf = veth_xdp,
> > - .ndo_xdp_xmit = veth_xdp_xmit,
> > + .ndo_xdp_xmit = veth_ndo_xdp_xmit,
> > };
> > #define VETH_FEATURES (NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HW_CSUM | \
> >
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
next prev parent reply other threads:[~2020-03-20 13:37 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-19 16:41 [PATCH net-next 0/5] add more xdp stats to veth driver Lorenzo Bianconi
2020-03-19 16:41 ` [PATCH net-next 1/5] veth: move xdp stats in a dedicated structure Lorenzo Bianconi
2020-03-19 16:41 ` [PATCH net-next 2/5] veth: introduce more specialized counters in veth_stats Lorenzo Bianconi
2020-03-19 16:41 ` [PATCH net-next 3/5] veth: distinguish between rx_drops and xdp_drops Lorenzo Bianconi
2020-03-19 16:41 ` [PATCH net-next 4/5] veth: introduce more xdp counters Lorenzo Bianconi
2020-03-20 13:22 ` Toshiaki Makita
2020-03-20 13:37 ` Lorenzo Bianconi [this message]
2020-03-21 13:38 ` Toshiaki Makita
2020-03-21 14:30 ` Lorenzo Bianconi
2020-03-22 14:29 ` Toshiaki Makita
2020-03-23 17:31 ` Lorenzo Bianconi
2020-03-24 14:21 ` Toshiaki Makita
2020-03-24 14:36 ` Lorenzo Bianconi
2020-03-25 13:08 ` Toshiaki Makita
2020-03-25 14:53 ` Lorenzo Bianconi
2020-03-19 16:41 ` [PATCH net-next 5/5] veth: remove atomic64_add from veth_xdp_xmit hotpath Lorenzo Bianconi
2020-03-20 4:25 ` [PATCH net-next 0/5] add more xdp stats to veth driver David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200320133737.GA2329672@lore-desk-wlan \
--to=lorenzo@kernel.org \
--cc=brouer@redhat.com \
--cc=davem@davemloft.net \
--cc=dsahern@gmail.com \
--cc=lorenzo.bianconi@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=toke@redhat.com \
--cc=toshiaki.makita1@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.