From patchwork Mon Jul 23 14:36:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 947805 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="U2aXyEZs"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Z3w83795z9s4Z for ; Tue, 24 Jul 2018 00:36:40 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388490AbeGWPiK (ORCPT ); Mon, 23 Jul 2018 11:38:10 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:40142 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387877AbeGWPiK (ORCPT ); Mon, 23 Jul 2018 11:38:10 -0400 Received: by mail-pg1-f194.google.com with SMTP id x5-v6so531270pgp.7 for ; Mon, 23 Jul 2018 07:36:37 -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=m2ICIg96s9kuKwbBqDXYmTCJ2WfaaUNvd1/n8E6L6BE=; b=U2aXyEZsd+g7Gzgt/vtDOwYw14NCtUqzW+xtAFABZRSjSV7SNjIOA49VuULQ0tGEyV 1y4kwL27/q+Igt2aA1M/yjg4qA+fILIP6ovEwm+8Ls95xguwYmOexMyNX7CLWbdj/dHF 16YGWXlmZjAqS3kflLQx1Ydh7YVSsMO7ZDJcV4LJSPTfKnbV8KBlzIbB39k+AbR4Ti05 xgumwlqf2q4/Ce6st6h9jYVh3XWIh6icFq8WvULB3ie5OfB/bNFXK2EKiyXHIyRVjQEC Ue0vMcpsYbh3elN2kJ1xo6gdes7EBaxPtkIZ6HvG6X3I8E2FNUVD1ofHlz3GxS7CLmar nU6g== 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=m2ICIg96s9kuKwbBqDXYmTCJ2WfaaUNvd1/n8E6L6BE=; b=bowCXA36WB2xcJkS5fDsV5jikrhdujcyJiRxgAigPNlp4Sm4BC1IRC44kVWRXfGObh rttocKkQWPt839+Bf/GyBPMDnQ2UJS5lJ1Zf5zcuhUs8JfUdXeZSAor3GqiUtMXhy4VA KtjEU11DYQtUKhAlpV7jd7HwmnFvxcPns0zlVQWHGuojcCq24hfmkt61Dde+IoynG9Xp sKxrJbuG84TwP+QjiMP5fkyYs5uErVoeooEcZIwg9eTrqe/6n4pWQw3n7ubpOYLDWc6k kWrmaOOmjzajrLmcgMDNAKG45D/sOgDqIewRVxMM1nehF8pyVe/ylNlc2y10/NlgRGOd FHYg== X-Gm-Message-State: AOUpUlEfJfXT/F8DV9lpc8Ly2t+Io90BKPACCGIhwuqlsS4CdmSRH2La xBzopjCrrfl5htmUEa5CuYdKwmXY X-Google-Smtp-Source: AAOMgpd35Ojb4DfKB/h2o/Hye8pTgULFfq1nKgS70RjrKUNqNL6o80PTTWAZ25uqjLDb6m3z8udz1g== X-Received: by 2002:a63:fc0a:: with SMTP id j10-v6mr12448165pgi.1.1532356597068; Mon, 23 Jul 2018 07:36:37 -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.34 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 23 Jul 2018 07:36:36 -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 1/6] virtio_net: Fix incosistent received bytes counter Date: Mon, 23 Jul 2018 23:36:04 +0900 Message-Id: <20180723143609.2242-2-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 When received packets are dropped in virtio_net driver, received packets counter is incremented but bytes counter is not. As a result, for instance if we drop all packets by XDP, only received is counted and bytes stays 0, which looks inconsistent. IMHO received packets/bytes should be counted if packets are produced by the hypervisor, like what common NICs on physical machines are doing. So fix the bytes counter. Signed-off-by: Toshiaki Makita --- drivers/net/virtio_net.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 2ff08bc103a9..abbd3bc83b62 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -586,7 +586,8 @@ static struct sk_buff *receive_small(struct net_device *dev, struct receive_queue *rq, void *buf, void *ctx, unsigned int len, - unsigned int *xdp_xmit) + unsigned int *xdp_xmit, + unsigned int *rbytes) { struct sk_buff *skb; struct bpf_prog *xdp_prog; @@ -601,6 +602,7 @@ static struct sk_buff *receive_small(struct net_device *dev, int err; len -= vi->hdr_len; + *rbytes += len; rcu_read_lock(); xdp_prog = rcu_dereference(rq->xdp_prog); @@ -705,11 +707,13 @@ static struct sk_buff *receive_big(struct net_device *dev, struct virtnet_info *vi, struct receive_queue *rq, void *buf, - unsigned int len) + unsigned int len, + unsigned int *rbytes) { struct page *page = buf; struct sk_buff *skb = page_to_skb(vi, rq, page, 0, len, PAGE_SIZE); + *rbytes += len - vi->hdr_len; if (unlikely(!skb)) goto err; @@ -727,7 +731,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, void *buf, void *ctx, unsigned int len, - unsigned int *xdp_xmit) + unsigned int *xdp_xmit, + unsigned int *rbytes) { struct virtio_net_hdr_mrg_rxbuf *hdr = buf; u16 num_buf = virtio16_to_cpu(vi->vdev, hdr->num_buffers); @@ -740,6 +745,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, int err; head_skb = NULL; + *rbytes += len - vi->hdr_len; rcu_read_lock(); xdp_prog = rcu_dereference(rq->xdp_prog); @@ -877,6 +883,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, goto err_buf; } + *rbytes += len; page = virt_to_head_page(buf); truesize = mergeable_ctx_to_truesize(ctx); @@ -932,6 +939,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, dev->stats.rx_length_errors++; break; } + *rbytes += len; page = virt_to_head_page(buf); put_page(page); } @@ -942,14 +950,13 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, return NULL; } -static int receive_buf(struct virtnet_info *vi, struct receive_queue *rq, - void *buf, unsigned int len, void **ctx, - unsigned int *xdp_xmit) +static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, + void *buf, unsigned int len, void **ctx, + unsigned int *xdp_xmit, unsigned int *rbytes) { struct net_device *dev = vi->dev; struct sk_buff *skb; struct virtio_net_hdr_mrg_rxbuf *hdr; - int ret; if (unlikely(len < vi->hdr_len + ETH_HLEN)) { pr_debug("%s: short packet %i\n", dev->name, len); @@ -961,23 +968,22 @@ static int receive_buf(struct virtnet_info *vi, struct receive_queue *rq, } else { put_page(virt_to_head_page(buf)); } - return 0; + return; } if (vi->mergeable_rx_bufs) - skb = receive_mergeable(dev, vi, rq, buf, ctx, len, xdp_xmit); + skb = receive_mergeable(dev, vi, rq, buf, ctx, len, xdp_xmit, + rbytes); else if (vi->big_packets) - skb = receive_big(dev, vi, rq, buf, len); + skb = receive_big(dev, vi, rq, buf, len, rbytes); else - skb = receive_small(dev, vi, rq, buf, ctx, len, xdp_xmit); + skb = receive_small(dev, vi, rq, buf, ctx, len, xdp_xmit, rbytes); if (unlikely(!skb)) - return 0; + return; hdr = skb_vnet_hdr(skb); - ret = skb->len; - if (hdr->hdr.flags & VIRTIO_NET_HDR_F_DATA_VALID) skb->ip_summed = CHECKSUM_UNNECESSARY; @@ -994,12 +1000,11 @@ static int receive_buf(struct virtnet_info *vi, struct receive_queue *rq, ntohs(skb->protocol), skb->len, skb->pkt_type); napi_gro_receive(&rq->napi, skb); - return ret; + return; frame_err: dev->stats.rx_frame_errors++; dev_kfree_skb(skb); - return 0; } /* Unlike mergeable buffers, all buffers are allocated to the @@ -1249,13 +1254,13 @@ static int virtnet_receive(struct receive_queue *rq, int budget, while (received < budget && (buf = virtqueue_get_buf_ctx(rq->vq, &len, &ctx))) { - bytes += receive_buf(vi, rq, buf, len, ctx, xdp_xmit); + receive_buf(vi, rq, buf, len, ctx, xdp_xmit, &bytes); received++; } } else { while (received < budget && (buf = virtqueue_get_buf(rq->vq, &len)) != NULL) { - bytes += receive_buf(vi, rq, buf, len, NULL, xdp_xmit); + receive_buf(vi, rq, buf, len, NULL, xdp_xmit, &bytes); received++; } } From patchwork Mon Jul 23 14:36:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 947807 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="mCqQAd/d"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Z3wC2kXZz9s4s for ; Tue, 24 Jul 2018 00:36:43 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388495AbeGWPiN (ORCPT ); Mon, 23 Jul 2018 11:38:13 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:37194 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387877AbeGWPiN (ORCPT ); Mon, 23 Jul 2018 11:38:13 -0400 Received: by mail-pl0-f68.google.com with SMTP id 31-v6so312013plc.4 for ; Mon, 23 Jul 2018 07:36:40 -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=tYQFHwnNtaIS+BvyZx2Kv83q9K8xCBMfv2g77oS/a9g=; b=mCqQAd/dQFBYDDWSLaNReY1iyjX/RNVSwi43Eh9waD51GRuc2HQ13fiVJJxvc0LEX+ iZPzjpBjf4GWXC9W8Y1CxesGoeo2Qt3wC959czCNka1omlqfiyombnjzj2usSSsmTcrq NMmKJOi33QnBS3PDixgaACg1FhC6G5zcGUsxCk1sJ5+61o6rhrCXP72Fc9MAiIZaYbEg aJgC56FMtFKT6RZNJcO54ROYfr6UggotBRBykPw+ULESpw/0d41BILgHY8nuIeMUVkFI gLeBLYu6LyLZnxvmUud8LjqLf0KhZJo5rN17/duDnDrQH43slgQKGZKCR8ixbtmjW87L VI1A== 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=tYQFHwnNtaIS+BvyZx2Kv83q9K8xCBMfv2g77oS/a9g=; b=beH3n0Eo335DGiVvEpCMtQTWSr1YLwHRe9Qs2WzGaMop6HCUfuHnWfBNPwSkn9I1eT n/fWFsLti+yvZ5/JVoTDP6VC1b9UetCNOz4ajaMypJxHTSTxHPIAHx2MPkz9mbZEc2Mh u3PEHJDm+6u/NslcJUYWxskYwH54/GAWzbdhy95rtjTmqUh+PlPNgAHsBEXPpYG0QKcA rvdmyKE4aWJCK6iQ/YCByuNBIQIE8BlUZEFUMS/XdRmvyd8r8pvtCrWlMmsSzSqnHN8x fcBSwOHxgXXEq9Q4JpfAdc6w0tw6dF2ksO6KeQf8DxsHnv0zNhN/vN7yXX8EEv4Cg6qj QIHQ== X-Gm-Message-State: AOUpUlELTsDGNYLllvujxElgCGZYlJvloR4rAht2q/pbA9f28T08V3g4 nSCIx8y5LQQI+xiXTrwxJE0= X-Google-Smtp-Source: AAOMgpcaNKNdGzzr6uceXEti9ijbTg+yKnzlKnWBqD8ZP+ebMDufCf4Xim/cQVFef7FNqGXCSN1Wow== X-Received: by 2002:a17:902:7482:: with SMTP id h2-v6mr13365744pll.185.1532356600028; Mon, 23 Jul 2018 07:36:40 -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.37 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 23 Jul 2018 07:36:39 -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 2/6] virtio_net: Use temporary storage for accounting rx stats Date: Mon, 23 Jul 2018 23:36:05 +0900 Message-Id: <20180723143609.2242-3-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 The purpose is to keep receive_buf arguments simple when more per-queue counter items are added later. Also XDP_TX related sq counters will be updated in the following changes so create a container struct virtnet_rx_stats which will includes both rq and sq statistics. For now it only covers rq stats. Signed-off-by: Toshiaki Makita --- drivers/net/virtio_net.c | 72 +++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index abbd3bc83b62..d03bfc4fce8e 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -84,14 +84,22 @@ struct virtnet_sq_stats { u64 bytes; }; -struct virtnet_rq_stats { - struct u64_stats_sync syncp; +struct virtnet_rq_stat_items { u64 packets; u64 bytes; }; +struct virtnet_rq_stats { + struct u64_stats_sync syncp; + struct virtnet_rq_stat_items items; +}; + +struct virtnet_rx_stats { + struct virtnet_rq_stat_items rx; +}; + #define VIRTNET_SQ_STAT(m) offsetof(struct virtnet_sq_stats, m) -#define VIRTNET_RQ_STAT(m) offsetof(struct virtnet_rq_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) }, @@ -587,7 +595,7 @@ static struct sk_buff *receive_small(struct net_device *dev, void *buf, void *ctx, unsigned int len, unsigned int *xdp_xmit, - unsigned int *rbytes) + struct virtnet_rx_stats *stats) { struct sk_buff *skb; struct bpf_prog *xdp_prog; @@ -602,7 +610,7 @@ static struct sk_buff *receive_small(struct net_device *dev, int err; len -= vi->hdr_len; - *rbytes += len; + stats->rx.bytes += len; rcu_read_lock(); xdp_prog = rcu_dereference(rq->xdp_prog); @@ -708,12 +716,12 @@ static struct sk_buff *receive_big(struct net_device *dev, struct receive_queue *rq, void *buf, unsigned int len, - unsigned int *rbytes) + struct virtnet_rx_stats *stats) { struct page *page = buf; struct sk_buff *skb = page_to_skb(vi, rq, page, 0, len, PAGE_SIZE); - *rbytes += len - vi->hdr_len; + stats->rx.bytes += len - vi->hdr_len; if (unlikely(!skb)) goto err; @@ -732,7 +740,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, void *ctx, unsigned int len, unsigned int *xdp_xmit, - unsigned int *rbytes) + struct virtnet_rx_stats *stats) { struct virtio_net_hdr_mrg_rxbuf *hdr = buf; u16 num_buf = virtio16_to_cpu(vi->vdev, hdr->num_buffers); @@ -745,7 +753,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, int err; head_skb = NULL; - *rbytes += len - vi->hdr_len; + stats->rx.bytes += len - vi->hdr_len; rcu_read_lock(); xdp_prog = rcu_dereference(rq->xdp_prog); @@ -883,7 +891,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, goto err_buf; } - *rbytes += len; + stats->rx.bytes += len; page = virt_to_head_page(buf); truesize = mergeable_ctx_to_truesize(ctx); @@ -939,7 +947,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, dev->stats.rx_length_errors++; break; } - *rbytes += len; + stats->rx.bytes += len; page = virt_to_head_page(buf); put_page(page); } @@ -952,7 +960,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, void *buf, unsigned int len, void **ctx, - unsigned int *xdp_xmit, unsigned int *rbytes) + unsigned int *xdp_xmit, + struct virtnet_rx_stats *stats) { struct net_device *dev = vi->dev; struct sk_buff *skb; @@ -973,11 +982,11 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, if (vi->mergeable_rx_bufs) skb = receive_mergeable(dev, vi, rq, buf, ctx, len, xdp_xmit, - rbytes); + stats); else if (vi->big_packets) - skb = receive_big(dev, vi, rq, buf, len, rbytes); + skb = receive_big(dev, vi, rq, buf, len, stats); else - skb = receive_small(dev, vi, rq, buf, ctx, len, xdp_xmit, rbytes); + skb = receive_small(dev, vi, rq, buf, ctx, len, xdp_xmit, stats); if (unlikely(!skb)) return; @@ -1246,22 +1255,24 @@ static int virtnet_receive(struct receive_queue *rq, int budget, unsigned int *xdp_xmit) { struct virtnet_info *vi = rq->vq->vdev->priv; - unsigned int len, received = 0, bytes = 0; + struct virtnet_rx_stats stats = {}; + unsigned int len; void *buf; + int i; if (!vi->big_packets || vi->mergeable_rx_bufs) { void *ctx; - while (received < budget && + while (stats.rx.packets < budget && (buf = virtqueue_get_buf_ctx(rq->vq, &len, &ctx))) { - receive_buf(vi, rq, buf, len, ctx, xdp_xmit, &bytes); - received++; + receive_buf(vi, rq, buf, len, ctx, xdp_xmit, &stats); + stats.rx.packets++; } } else { - while (received < budget && + while (stats.rx.packets < budget && (buf = virtqueue_get_buf(rq->vq, &len)) != NULL) { - receive_buf(vi, rq, buf, len, NULL, xdp_xmit, &bytes); - received++; + receive_buf(vi, rq, buf, len, NULL, xdp_xmit, &stats); + stats.rx.packets++; } } @@ -1271,11 +1282,16 @@ static int virtnet_receive(struct receive_queue *rq, int budget, } u64_stats_update_begin(&rq->stats.syncp); - rq->stats.bytes += bytes; - rq->stats.packets += received; + for (i = 0; i < VIRTNET_RQ_STATS_LEN; i++) { + size_t offset = virtnet_rq_stats_desc[i].offset; + u64 *item; + + item = (u64 *)((u8 *)&rq->stats.items + offset); + *item += *(u64 *)((u8 *)&stats.rx + offset); + } u64_stats_update_end(&rq->stats.syncp); - return received; + return stats.rx.packets; } static void free_old_xmit_skbs(struct send_queue *sq) @@ -1628,8 +1644,8 @@ static void virtnet_stats(struct net_device *dev, do { start = u64_stats_fetch_begin_irq(&rq->stats.syncp); - rpackets = rq->stats.packets; - rbytes = rq->stats.bytes; + rpackets = rq->stats.items.packets; + rbytes = rq->stats.items.bytes; } while (u64_stats_fetch_retry_irq(&rq->stats.syncp, start)); tot->rx_packets += rpackets; @@ -2019,7 +2035,7 @@ static void virtnet_get_ethtool_stats(struct net_device *dev, for (i = 0; i < vi->curr_queue_pairs; i++) { struct receive_queue *rq = &vi->rq[i]; - stats_base = (u8 *)&rq->stats; + stats_base = (u8 *)&rq->stats.items; do { start = u64_stats_fetch_begin_irq(&rq->stats.syncp); for (j = 0; j < VIRTNET_RQ_STATS_LEN; j++) { From patchwork Mon Jul 23 14:36:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 947808 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="fIXPq1kg"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Z3wD59Wxz9s4Z for ; Tue, 24 Jul 2018 00:36:44 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388501AbeGWPiP (ORCPT ); Mon, 23 Jul 2018 11:38:15 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:33399 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387877AbeGWPiP (ORCPT ); Mon, 23 Jul 2018 11:38:15 -0400 Received: by mail-pl0-f68.google.com with SMTP id 6-v6so319647plb.0 for ; Mon, 23 Jul 2018 07:36:43 -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=H801NZPtTO3nQdd2RQdcRAzVMoZ8IbYzzd0HMI13g0U=; b=fIXPq1kgDSBEoaPuPcCwFyXzQgaT0DrD8VcUuOYzmtg79PnNiNXtCrU3ECQyi1ZvMP KNpHhajDCJYDNN1L3IDi4JnGTEO9shhIWlVE7TIqpmTpOw0lSIOmFjvNof5/WMoyMdjh 3x21mK45Y9RZhZdYH3rmSpjJQ5oUlzLYR5pOf8HC/O5FmBrKRCG2/Ivh0ldup/WJQdBf 0NbfUrYjm+K5ioFbIRMj9UdcgvX2fz6z1njGRk5iZaKLiy3vFdyiPwZeE+SnQV2tor2P p+2KF9PbC1Vb+rLqjFUc0Zz0imongalQehPCPJoLhSOR6ZncWL5heZXe0jzLamjazc89 AYkQ== 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=H801NZPtTO3nQdd2RQdcRAzVMoZ8IbYzzd0HMI13g0U=; b=mxsgvEK/nEqdT+b06D+pXgE4V0E9t8Yf3gBMjDPjlresmXZW/ZSXOC6KLFH7/bFzac SBo/Ks4h8RrbFnTO9j/jzBbhj562Ud4GeWaClG3kMvnAoWzyCkKtJzBxONTVfoezJY5u tMtazwJa0sM4Ejb+VLmZEMyP+mNuhg7lHoWv+pgiwJIdJtEe9P+hgmyU/wn1EBgaeqkF i6u/kd89dKLsdj7vkdxAxTF340R0K4r1NGqKNzlh1pnqm+5OH7pScKvHv6CiBBRPFhN3 LmSwuKo312/zAJc7nWyDVT+psEHq2QCe1LanF4hSogXtAxNCJPt4CP49RLmDHhISu1kZ +ECw== X-Gm-Message-State: AOUpUlGrzQJrddYYThPl3oWEjNz8gZDBOEc1Ugbs/ZWAKNXAOMpVPjDy lSjzdz8YyTMaAqS9dtYL16c= X-Google-Smtp-Source: AAOMgpc7DtFJyG0qR71qp812wIlXQG0NxaPY9PRVuFk9f6Eu29NaXjhVSRKHzvY9pO/+sTuAFKQuBg== X-Received: by 2002:a17:902:aa8f:: with SMTP id d15-v6mr13348952plr.64.1532356602730; Mon, 23 Jul 2018 07:36:42 -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.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 23 Jul 2018 07:36:41 -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 3/6] virtio_net: Make drop counter per-queue Date: Mon, 23 Jul 2018 23:36:06 +0900 Message-Id: <20180723143609.2242-4-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 Since when XDP was introduced, drop counter has been able to be updated much more frequently than before, as XDP_DROP increments the counter. Thus for performance analysis per-queue drop counter would be useful. Also this avoids cache contention and race on updating the counter. It is currently racy because napi handlers read-modify-write it without any locks. There are more counters in dev->stats that are racy, but I left them per-device, because they are rarely updated and does not worth being per-queue counters IMHO. To fix them we need atomic ops or some kind of locks. Signed-off-by: Toshiaki Makita --- drivers/net/virtio_net.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index d03bfc4fce8e..7a47ce750a43 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -87,6 +87,7 @@ struct virtnet_sq_stats { struct virtnet_rq_stat_items { u64 packets; u64 bytes; + u64 drops; }; struct virtnet_rq_stats { @@ -109,6 +110,7 @@ static const struct virtnet_stat_desc virtnet_sq_stats_desc[] = { 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) }, }; #define VIRTNET_SQ_STATS_LEN ARRAY_SIZE(virtnet_sq_stats_desc) @@ -705,7 +707,7 @@ static struct sk_buff *receive_small(struct net_device *dev, err_xdp: rcu_read_unlock(); - dev->stats.rx_dropped++; + stats->rx.drops++; put_page(page); xdp_xmit: return NULL; @@ -728,7 +730,7 @@ static struct sk_buff *receive_big(struct net_device *dev, return skb; err: - dev->stats.rx_dropped++; + stats->rx.drops++; give_pages(rq, page); return NULL; } @@ -952,7 +954,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, put_page(page); } err_buf: - dev->stats.rx_dropped++; + stats->rx.drops++; dev_kfree_skb(head_skb); xdp_xmit: return NULL; @@ -1632,7 +1634,7 @@ static void virtnet_stats(struct net_device *dev, int i; for (i = 0; i < vi->max_queue_pairs; i++) { - u64 tpackets, tbytes, rpackets, rbytes; + u64 tpackets, tbytes, rpackets, rbytes, rdrops; struct receive_queue *rq = &vi->rq[i]; struct send_queue *sq = &vi->sq[i]; @@ -1646,17 +1648,18 @@ static void virtnet_stats(struct net_device *dev, start = u64_stats_fetch_begin_irq(&rq->stats.syncp); rpackets = rq->stats.items.packets; rbytes = rq->stats.items.bytes; + rdrops = rq->stats.items.drops; } while (u64_stats_fetch_retry_irq(&rq->stats.syncp, start)); tot->rx_packets += rpackets; tot->tx_packets += tpackets; tot->rx_bytes += rbytes; tot->tx_bytes += tbytes; + tot->rx_dropped += rdrops; } tot->tx_dropped = dev->stats.tx_dropped; tot->tx_fifo_errors = dev->stats.tx_fifo_errors; - tot->rx_dropped = dev->stats.rx_dropped; tot->rx_length_errors = dev->stats.rx_length_errors; tot->rx_frame_errors = dev->stats.rx_frame_errors; } From patchwork Mon Jul 23 14:36:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 947809 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="QKzjIZfv"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Z3wH3Dfmz9s4s for ; Tue, 24 Jul 2018 00:36:47 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388507AbeGWPiS (ORCPT ); Mon, 23 Jul 2018 11:38:18 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:39015 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387877AbeGWPiS (ORCPT ); Mon, 23 Jul 2018 11:38:18 -0400 Received: by mail-pg1-f194.google.com with SMTP id g2-v6so527590pgs.6 for ; Mon, 23 Jul 2018 07:36:45 -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=7Y7Dm5ds9y0tbo9HpQ1saXEl5UsFPCCB13NnUF0qhnE=; b=QKzjIZfvNyFcMhy+kP89+3n7oc8hQUS29sQggatCuEHeKKVJZZrJ+9sI3nQ0e8nEz/ 8lVS4PenW+OZyBbCPBnK6+02uLk9suBCVtQ4t0jheKEAeQMGw/MSxn4L/0CQuUHkC+hR jMHBsHUGbT6/5EtPgv9hNSL4NmrjTSyf2Q41eMxnXHz2HcVL4qNAjVErYE/M6pFBh5+E LlEF++2tY9VOeA0y+/IChn0fMoZQToM0D1aO3S5zWlm57/NH4cb3wTqv2gBz+u0nbZvp UwnNSgdQSePXP+dIHjtLZYQKxCkNrkc3NEXGlwXOOaRkX1Qctnh9V5D7BpPj+alOb6ej 1Jtw== 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=7Y7Dm5ds9y0tbo9HpQ1saXEl5UsFPCCB13NnUF0qhnE=; b=ng8/bbt/ErZqcej5sjlMyeBZ+htb7tfjpkB2YLhSqm+SNdPJ5oMPe1hoakv0ejZsS4 PUBfrruYongkLQOqhieRFaxzXzG+9rjp/7QIGwgfbG0argZ3cra/QE5u42HlU5gMQAdy zSSoz4G1srGLr4YSBYLOgS57t2FzLijF23gz9mVg9n27505hCxlGwWJF0RDoz7rwzAiy iHqkDBuYNcZPmlyNgXfX0uW+gKZ+8qKxzBM+oQ5PmGVrkKsecil/GdJoi9dV2ue/grU9 3/PnNbuYRP2toQXUljZMaL+bv9+J1a4ShAcbP9NuAXaqH+q6lGuETNaVYq8eSO7vXsUZ j9Ow== X-Gm-Message-State: AOUpUlErbw7C//hMOMoua/8Luo1bJd5XACKB7S2f7L938UYlD1keWpDy bUVfRmPY3yLkXgNMa0vaRXs= X-Google-Smtp-Source: AAOMgpe35+6glABv7oQ8eveXmQ1gSaKdW1w9erE8hwZr6AptiPb81WXXeXuye6d/Cq2fWQEkMlpOQA== X-Received: by 2002:a63:1126:: with SMTP id g38-v6mr12371267pgl.122.1532356605293; Mon, 23 Jul 2018 07:36:45 -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.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 23 Jul 2018 07:36:44 -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 4/6] virtio_net: Factor out the logic to determine xdp sq Date: Mon, 23 Jul 2018 23:36:07 +0900 Message-Id: <20180723143609.2242-5-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 Make sure to use the same logic in all places to determine xdp sq. This is useful for xdp counters which the following commit will introduce as well. Signed-off-by: Toshiaki Makita --- drivers/net/virtio_net.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 7a47ce750a43..eca9b13b859e 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -457,16 +457,22 @@ static int __virtnet_xdp_xmit_one(struct virtnet_info *vi, return 0; } +static struct send_queue *virtnet_xdp_sq(struct virtnet_info *vi) +{ + unsigned int qp; + + qp = vi->curr_queue_pairs - vi->xdp_queue_pairs + smp_processor_id(); + return &vi->sq[qp]; +} + static int __virtnet_xdp_tx_xmit(struct virtnet_info *vi, struct xdp_frame *xdpf) { struct xdp_frame *xdpf_sent; struct send_queue *sq; unsigned int len; - unsigned int qp; - qp = vi->curr_queue_pairs - vi->xdp_queue_pairs + smp_processor_id(); - sq = &vi->sq[qp]; + sq = virtnet_xdp_sq(vi); /* Free up any pending old buffers before queueing new ones. */ while ((xdpf_sent = virtqueue_get_buf(sq->vq, &len)) != NULL) @@ -484,7 +490,6 @@ static int virtnet_xdp_xmit(struct net_device *dev, struct bpf_prog *xdp_prog; struct send_queue *sq; unsigned int len; - unsigned int qp; int drops = 0; int err; int i; @@ -492,8 +497,7 @@ static int virtnet_xdp_xmit(struct net_device *dev, if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) return -EINVAL; - qp = vi->curr_queue_pairs - vi->xdp_queue_pairs + smp_processor_id(); - sq = &vi->sq[qp]; + sq = virtnet_xdp_sq(vi); /* Only allow ndo_xdp_xmit if XDP is loaded on dev, as this * indicate XDP resources have been successfully allocated. @@ -1349,7 +1353,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget) container_of(napi, struct receive_queue, napi); struct virtnet_info *vi = rq->vq->vdev->priv; struct send_queue *sq; - unsigned int received, qp; + unsigned int received; unsigned int xdp_xmit = 0; virtnet_poll_cleantx(rq); @@ -1364,9 +1368,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget) xdp_do_flush_map(); if (xdp_xmit & VIRTIO_XDP_TX) { - qp = vi->curr_queue_pairs - vi->xdp_queue_pairs + - smp_processor_id(); - sq = &vi->sq[qp]; + sq = virtnet_xdp_sq(vi); virtqueue_kick(sq->vq); } 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; } From patchwork Mon Jul 23 14:36:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 947811 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="cvKUcn8C"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Z3wN5C2Vz9s3Z for ; Tue, 24 Jul 2018 00:36:52 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388531AbeGWPiX (ORCPT ); Mon, 23 Jul 2018 11:38:23 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:46692 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387877AbeGWPiX (ORCPT ); Mon, 23 Jul 2018 11:38:23 -0400 Received: by mail-pl0-f66.google.com with SMTP id t17-v6so304385ply.13 for ; Mon, 23 Jul 2018 07:36:50 -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=Mg2fwnWTHqGG+q1SQ2O7WF68+U33V6ndSsZS3OCztEg=; b=cvKUcn8CWYiQZDnPYA/Y36qON1KGvpUZnk72rtNxb81xGvHmTgcuT01xjlWXTsK3kf 3gDq52MDKjVZFIaTx1BPGh+dDek3E5kyhAT3ahldBM6RRp3iCdPCwLwgkNUJKAWKhUfp H/ebaCJ8GbS1GEMsdTKQZJnUKzJn3qfWziE2o6xtzPtcpKHFqtn0zdhIWKT5kI/IWijs WEOUI265mnP4snGL7hPTIZHv6KlPf3emXf6ccQD5RMgev/vAsoYvgzMdqtuoNfWZsSAv Suh99jvS0XpCJZK5PzwT4sxJC7pCMwrreLZRQVbOdgo4hFGvg6THOipCXgLGGJuJht0e KIgw== 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=Mg2fwnWTHqGG+q1SQ2O7WF68+U33V6ndSsZS3OCztEg=; b=VE/ugI3QkNVZ7jTve17sRGgvhH2p2y0Rs7t9g11SakyJa0gaAuRCQjtzYc28bAu5BW sQmupsfkJu51Tzy+05z+b3C+KU3JK9aqj9CfHNx1bMLXXTPRYC71hQ03/gELU/z1usBI UtNTkZzPsnNj50TUudUwR56g9GoJakLOV0kIqNIo67Gbm8OavRhppw/oMUAA6GFtg4V9 CKridYDug2Zb6uqtgoNBC3ScT0h6YFozvlNuqNp+tRyxe6kPq6sFi4qugc+VSobOSplY Vtfqpg06r4i1WI6cnjDI9mUOtlTus+WF/NNopBAIHz8T5hUPkfrbIEJH1/sUXCH1dXVX encA== X-Gm-Message-State: AOUpUlFqybYcrWbV1zJK8nzN09HKCn7zeeMB6+TdvHmKRYXHqVKNhFii NIO2Slr2rjgGR5MYjlmDTuI= X-Google-Smtp-Source: AAOMgpceq0xFEq3iT4EYjRGf2dx+0IOUkq39lpcZyE7iM/1extTytyC9Pti6jUaY9ww7SXhdTu8jSA== X-Received: by 2002:a17:902:b7c6:: with SMTP id v6-v6mr12796750plz.49.1532356610535; Mon, 23 Jul 2018 07:36:50 -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.48 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 23 Jul 2018 07:36:49 -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 6/6] virtio_net: Add kick stats Date: Mon, 23 Jul 2018 23:36:09 +0900 Message-Id: <20180723143609.2242-7-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 So we can infer the number of VM-Exits. Signed-off-by: Toshiaki Makita --- drivers/net/virtio_net.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index cb4ef331567c..1880c86e84b4 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -84,6 +84,7 @@ struct virtnet_sq_stats { u64 bytes; u64 xdp_tx; u64 xdp_tx_drops; + u64 kicks; }; struct virtnet_rq_stat_items { @@ -94,6 +95,7 @@ struct virtnet_rq_stat_items { u64 xdp_tx; u64 xdp_redirects; u64 xdp_drops; + u64 kicks; }; struct virtnet_rq_stats { @@ -117,6 +119,7 @@ static const struct virtnet_stat_desc virtnet_sq_stats_desc[] = { { "bytes", VIRTNET_SQ_STAT(bytes) }, { "xdp_tx", VIRTNET_SQ_STAT(xdp_tx) }, { "xdp_tx_drops", VIRTNET_SQ_STAT(xdp_tx_drops) }, + { "kicks", VIRTNET_SQ_STAT(kicks) }, }; static const struct virtnet_stat_desc virtnet_rq_stats_desc[] = { @@ -127,6 +130,7 @@ static const struct virtnet_stat_desc virtnet_rq_stats_desc[] = { { "xdp_tx", VIRTNET_RQ_STAT(xdp_tx) }, { "xdp_redirects", VIRTNET_RQ_STAT(xdp_redirects) }, { "xdp_drops", VIRTNET_RQ_STAT(xdp_drops) }, + { "kicks", VIRTNET_RQ_STAT(kicks) }, }; #define VIRTNET_SQ_STATS_LEN ARRAY_SIZE(virtnet_sq_stats_desc) @@ -507,6 +511,7 @@ static int virtnet_xdp_xmit(struct net_device *dev, struct send_queue *sq; unsigned int len; int drops = 0; + int kicks = 0; int ret, err; int i; @@ -543,12 +548,15 @@ static int virtnet_xdp_xmit(struct net_device *dev, } ret = n - drops; - if (flags & XDP_XMIT_FLUSH) - virtqueue_kick(sq->vq); + if (flags & XDP_XMIT_FLUSH) { + if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) + kicks = 1; + } out: u64_stats_update_begin(&sq->stats.syncp); sq->stats.xdp_tx += n; sq->stats.xdp_tx_drops += drops; + sq->stats.kicks += kicks; u64_stats_update_end(&sq->stats.syncp); return ret; @@ -1226,7 +1234,12 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq, if (err) break; } while (rq->vq->num_free); - virtqueue_kick(rq->vq); + if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) { + u64_stats_update_begin(&rq->stats.syncp); + rq->stats.items.kicks++; + u64_stats_update_end(&rq->stats.syncp); + } + return !oom; } @@ -1416,7 +1429,11 @@ static int virtnet_poll(struct napi_struct *napi, int budget) if (xdp_xmit & VIRTIO_XDP_TX) { sq = virtnet_xdp_sq(vi); - virtqueue_kick(sq->vq); + if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) { + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.kicks++; + u64_stats_update_end(&sq->stats.syncp); + } } return received; @@ -1578,8 +1595,13 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) } } - if (kick || netif_xmit_stopped(txq)) - virtqueue_kick(sq->vq); + if (kick || netif_xmit_stopped(txq)) { + if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) { + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.kicks++; + u64_stats_update_end(&sq->stats.syncp); + } + } return NETDEV_TX_OK; }