From patchwork Mon Jul 23 14:36:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 947810 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Y5J7Pwx+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Z3wL14n5z9s3Z for ; Tue, 24 Jul 2018 00:36:50 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388521AbeGWPiV (ORCPT ); Mon, 23 Jul 2018 11:38:21 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:37207 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387877AbeGWPiU (ORCPT ); Mon, 23 Jul 2018 11:38:20 -0400 Received: by mail-pl0-f68.google.com with SMTP id 31-v6so312186plc.4 for ; Mon, 23 Jul 2018 07:36:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WRUQYUYUce2hbgyitPiE3+gJ0Vg3QLBACCbMNslAQlY=; b=Y5J7Pwx+vnLzn4QHmumZimueA3raO9gSOznh/PoGJ8jVIXOzswqNduCxjQOtUrmRw2 I7zAso6dVIw5gQ+YfXClS+yaP3ylog8VlcccR/aoL+MFP2RJnkbSoudfswYZp9c4tA91 iJFYaKgg16GPHx6y0Cfx6GBrdhwlai3wJvlt0sUx84XVsViFBA/uz0S4GGxp4LIzy2KM 34tiFWJldQk8H2EyvKnFoNeJkYnvJ2svACbtwTIiRk2Uq10UV7nEPoh8XII6TAiDDFLd 2D+Dhi2aEPUcZQzytORZyd8aMO+UmyZxk4/g0KCwShvbD6j5Ou5IlUrFb5dHxtILNo5h rzJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WRUQYUYUce2hbgyitPiE3+gJ0Vg3QLBACCbMNslAQlY=; b=fPVxfyz9fBRQzV/jZIMWSTUQi2bYC1uOUUpJhxrT+0muloP2J43pa0tQr5TbluyoUN Hky6m/Ham7qg9SPH7+s2hCtXVsrW9DlygqpW367Yak9lQtCci8tmR4zxz0q2WhUweMAp vHDoUWYzugJZi9KsQQhBAvuex/AZnZI6tBZZU/qzZ2vbMMvilYT73gmgdmYZdLQACFlV uJzsgOprleyCJXnHVG8Osf96GpBqMAvhcjZ8Vw1Xt0M3z8Xy3BRhuNSKcO9jI3A0Ft3F QepBVW0+gA70yb1TSTgJZPWafvjfdJRwaC9xcOLSpFtdN6ygZQd710Z0sz6i6OTaRSfv gGMw== X-Gm-Message-State: AOUpUlGxBijkcvCCtfHAKp/Rhyb3jF+J850+KHNA+ZUpA6fXslTT0wsr VtLxO9J+cnewm+ehhZoGc5Q= X-Google-Smtp-Source: AAOMgpcD2CZTnvqhe7bvjPQwchqVtrkjpVxeJlBxhQHPw+kcaZC7kqVSevwP4NWeMabaZAeU4mYuEA== X-Received: by 2002:a17:902:8a90:: with SMTP id p16-v6mr4335279plo.106.1532356608048; Mon, 23 Jul 2018 07:36:48 -0700 (PDT) Received: from localhost.localdomain (i153-145-22-9.s42.a013.ap.plala.or.jp. [153.145.22.9]) by smtp.gmail.com with ESMTPSA id 65-v6sm14415503pfq.81.2018.07.23.07.36.45 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 23 Jul 2018 07:36:47 -0700 (PDT) From: Toshiaki Makita To: "Michael S. Tsirkin" , Jason Wang , "David S. Miller" Cc: Toshiaki Makita , netdev@vger.kernel.org, virtualization@lists.linux-foundation.org Subject: [PATCH net-next 5/6] virtio_net: Add XDP related stats Date: Mon, 23 Jul 2018 23:36:08 +0900 Message-Id: <20180723143609.2242-6-toshiaki.makita1@gmail.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180723143609.2242-1-toshiaki.makita1@gmail.com> References: <20180723143609.2242-1-toshiaki.makita1@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Toshiaki Makita Add counters below: * Tx - xdp_tx: frames sent by ndo_xdp_xmit or XDP_TX. - xdp_tx_drops: dropped frames out of xdp_tx ones. * Rx - xdp_packets: frames went through xdp program. - xdp_tx: XDP_TX frames. - xdp_redirects: XDP_REDIRECT frames. - xdp_drops: any dropped frames out of xdp_packets ones. Signed-off-by: Toshiaki Makita --- drivers/net/virtio_net.c | 71 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 12 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index eca9b13b859e..cb4ef331567c 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -82,12 +82,18 @@ struct virtnet_sq_stats { struct u64_stats_sync syncp; u64 packets; u64 bytes; + u64 xdp_tx; + u64 xdp_tx_drops; }; struct virtnet_rq_stat_items { u64 packets; u64 bytes; u64 drops; + u64 xdp_packets; + u64 xdp_tx; + u64 xdp_redirects; + u64 xdp_drops; }; struct virtnet_rq_stats { @@ -97,20 +103,30 @@ struct virtnet_rq_stats { struct virtnet_rx_stats { struct virtnet_rq_stat_items rx; + struct { + unsigned int xdp_tx; + unsigned int xdp_tx_drops; + } tx; }; #define VIRTNET_SQ_STAT(m) offsetof(struct virtnet_sq_stats, m) #define VIRTNET_RQ_STAT(m) offsetof(struct virtnet_rq_stat_items, m) static const struct virtnet_stat_desc virtnet_sq_stats_desc[] = { - { "packets", VIRTNET_SQ_STAT(packets) }, - { "bytes", VIRTNET_SQ_STAT(bytes) }, + { "packets", VIRTNET_SQ_STAT(packets) }, + { "bytes", VIRTNET_SQ_STAT(bytes) }, + { "xdp_tx", VIRTNET_SQ_STAT(xdp_tx) }, + { "xdp_tx_drops", VIRTNET_SQ_STAT(xdp_tx_drops) }, }; static const struct virtnet_stat_desc virtnet_rq_stats_desc[] = { - { "packets", VIRTNET_RQ_STAT(packets) }, - { "bytes", VIRTNET_RQ_STAT(bytes) }, - { "drops", VIRTNET_RQ_STAT(drops) }, + { "packets", VIRTNET_RQ_STAT(packets) }, + { "bytes", VIRTNET_RQ_STAT(bytes) }, + { "drops", VIRTNET_RQ_STAT(drops) }, + { "xdp_packets", VIRTNET_RQ_STAT(xdp_packets) }, + { "xdp_tx", VIRTNET_RQ_STAT(xdp_tx) }, + { "xdp_redirects", VIRTNET_RQ_STAT(xdp_redirects) }, + { "xdp_drops", VIRTNET_RQ_STAT(xdp_drops) }, }; #define VIRTNET_SQ_STATS_LEN ARRAY_SIZE(virtnet_sq_stats_desc) @@ -491,20 +507,26 @@ static int virtnet_xdp_xmit(struct net_device *dev, struct send_queue *sq; unsigned int len; int drops = 0; - int err; + int ret, err; int i; - if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) - return -EINVAL; - sq = virtnet_xdp_sq(vi); + if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) { + ret = -EINVAL; + drops = n; + goto out; + } + /* Only allow ndo_xdp_xmit if XDP is loaded on dev, as this * indicate XDP resources have been successfully allocated. */ xdp_prog = rcu_dereference(rq->xdp_prog); - if (!xdp_prog) - return -ENXIO; + if (!xdp_prog) { + ret = -ENXIO; + drops = n; + goto out; + } /* Free up any pending old buffers before queueing new ones. */ while ((xdpf_sent = virtqueue_get_buf(sq->vq, &len)) != NULL) @@ -519,11 +541,17 @@ static int virtnet_xdp_xmit(struct net_device *dev, drops++; } } + ret = n - drops; if (flags & XDP_XMIT_FLUSH) virtqueue_kick(sq->vq); +out: + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.xdp_tx += n; + sq->stats.xdp_tx_drops += drops; + u64_stats_update_end(&sq->stats.syncp); - return n - drops; + return ret; } static unsigned int virtnet_get_headroom(struct virtnet_info *vi) @@ -658,6 +686,7 @@ static struct sk_buff *receive_small(struct net_device *dev, xdp.rxq = &rq->xdp_rxq; orig_data = xdp.data; act = bpf_prog_run_xdp(xdp_prog, &xdp); + stats->rx.xdp_packets++; switch (act) { case XDP_PASS: @@ -666,11 +695,14 @@ static struct sk_buff *receive_small(struct net_device *dev, len = xdp.data_end - xdp.data; break; case XDP_TX: + stats->rx.xdp_tx++; xdpf = convert_to_xdp_frame(&xdp); if (unlikely(!xdpf)) goto err_xdp; + stats->tx.xdp_tx++; err = __virtnet_xdp_tx_xmit(vi, xdpf); if (unlikely(err)) { + stats->tx.xdp_tx_drops++; trace_xdp_exception(vi->dev, xdp_prog, act); goto err_xdp; } @@ -678,6 +710,7 @@ static struct sk_buff *receive_small(struct net_device *dev, rcu_read_unlock(); goto xdp_xmit; case XDP_REDIRECT: + stats->rx.xdp_redirects++; err = xdp_do_redirect(dev, &xdp, xdp_prog); if (err) goto err_xdp; @@ -711,6 +744,7 @@ static struct sk_buff *receive_small(struct net_device *dev, err_xdp: rcu_read_unlock(); + stats->rx.xdp_drops++; stats->rx.drops++; put_page(page); xdp_xmit: @@ -808,6 +842,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, xdp.rxq = &rq->xdp_rxq; act = bpf_prog_run_xdp(xdp_prog, &xdp); + stats->rx.xdp_packets++; switch (act) { case XDP_PASS: @@ -832,11 +867,14 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, } break; case XDP_TX: + stats->rx.xdp_tx++; xdpf = convert_to_xdp_frame(&xdp); if (unlikely(!xdpf)) goto err_xdp; + stats->tx.xdp_tx++; err = __virtnet_xdp_tx_xmit(vi, xdpf); if (unlikely(err)) { + stats->tx.xdp_tx_drops++; trace_xdp_exception(vi->dev, xdp_prog, act); if (unlikely(xdp_page != page)) put_page(xdp_page); @@ -848,6 +886,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, rcu_read_unlock(); goto xdp_xmit; case XDP_REDIRECT: + stats->rx.xdp_redirects++; err = xdp_do_redirect(dev, &xdp, xdp_prog); if (err) { if (unlikely(xdp_page != page)) @@ -943,6 +982,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, err_xdp: rcu_read_unlock(); + stats->rx.xdp_drops++; err_skb: put_page(page); while (num_buf-- > 1) { @@ -1262,6 +1302,7 @@ static int virtnet_receive(struct receive_queue *rq, int budget, { struct virtnet_info *vi = rq->vq->vdev->priv; struct virtnet_rx_stats stats = {}; + struct send_queue *sq; unsigned int len; void *buf; int i; @@ -1297,6 +1338,12 @@ static int virtnet_receive(struct receive_queue *rq, int budget, } u64_stats_update_end(&rq->stats.syncp); + sq = virtnet_xdp_sq(vi); + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.xdp_tx += stats.tx.xdp_tx; + sq->stats.xdp_tx_drops += stats.tx.xdp_tx_drops; + u64_stats_update_end(&sq->stats.syncp); + return stats.rx.packets; }