From patchwork Fri Jan 17 06:23:30 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Dalton X-Patchwork-Id: 311943 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 109862C009E for ; Fri, 17 Jan 2014 17:23:57 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751701AbaAQGXx (ORCPT ); Fri, 17 Jan 2014 01:23:53 -0500 Received: from mail-yh0-f73.google.com ([209.85.213.73]:41270 "EHLO mail-yh0-f73.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751453AbaAQGXo (ORCPT ); Fri, 17 Jan 2014 01:23:44 -0500 Received: by mail-yh0-f73.google.com with SMTP id f10so396706yha.4 for ; Thu, 16 Jan 2014 22:23:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=v1fwFzP7Ng/luibOG/F/EGFPnrRELJm2caozXuWdkD0=; b=E3wxtOLW9W5412xi6krTO7+FRaJ/6IV7Ey80uvXNnzL6Ch0xq+ufdZg2juSuVwFKZ3 XTv0cMC/I/tR4/xKSaD/gK2vOR634JKSvifdH/hbafDfXAcs8zQEN2ZN3lskjnaokIsv 75VbdaU3yYzDdbbIsCkPPT60H44IsciNpbdKw7aIpyqWrlTGmafv/aCWE6hUV3WjZEox Tu7yuV9nGREe27VWcWG/o0Ux/l9ce/j9THH1up7jrEP40TYrIuRrviBmanxxE1XG9D9e 7OqlZpKWVAQFpR/GyoPNJnomoePiDLh5e7B/2JGTYF0kr6dhtbKuVVv6bmJPw/nXZJT9 Q6ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=v1fwFzP7Ng/luibOG/F/EGFPnrRELJm2caozXuWdkD0=; b=GSSynAG44L4bHEr9Rv95ZTWpzR2iUxTzxxtcQOFgBGKLlzr1UUBPUed+rAjqpyRtU3 V3YlUQcKUgyAlF4y0gDyznoejyw+GOzW1kl1/7ojB8KrbQW+3rS2KgYDbLoJVda4Zi4C 1PTqA/P2aWvtycT3fbYx7J3ryCNf4QbJKgggRPvQufdP1ZtU7E1Q8cZvH2/QjSfLm/cM 879V4YkRNoakQ3sEFhNmgk+6axpvkpee/yd4IpISwzR8nlYC+Pfs4gdFkW+YhQf8iEJh fSWUYfIfjwFAzYcHfP1Lj8O1R80NWhEeLCc4GuIWo9On13FXFTxy1QKuaEkDhXkiDKY7 uufw== X-Gm-Message-State: ALoCoQnXmvet+08qxX0Ohg0b3O7xKnd4CyH1MVFYKtEZcf586kXVTMJF1Vu62eQecEq5/yoEVYhZIMK/kPFFAWJD46QGHzVr0ogvz+/TYICToroMT0nGfbKXRkVYYtWkmCxj0IsJTWUVDQtHxhUSJDB5lS613onwCAosJ8VF3spY9F4A1j6YoaB4+HfZARm0P8TES8j0ONiUNeTiFp5uYwflF9gJCRamGA== X-Received: by 10.236.191.136 with SMTP id g8mr46141yhn.48.1389939824282; Thu, 16 Jan 2014 22:23:44 -0800 (PST) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id 48si3244215yhf.7.2014.01.16.22.23.44 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 16 Jan 2014 22:23:44 -0800 (PST) Received: from midgard.mtv.corp.google.com (midgard.mtv.corp.google.com [172.18.126.13]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id 0D0565A428C; Thu, 16 Jan 2014 22:23:44 -0800 (PST) Received: by midgard.mtv.corp.google.com (Postfix, from userid 157258) id C3987E0937; Thu, 16 Jan 2014 22:23:43 -0800 (PST) From: Michael Dalton To: "David S. Miller" Cc: netdev@vger.kernel.org, Eric Dumazet , Rusty Russell , "Michael S. Tsirkin" , Jason Wang , Ben Hutchings , virtualization@lists.linux-foundation.org, Michael Dalton Subject: [PATCH net-next v6 6/6] virtio-net: initial rx sysfs support, export mergeable rx buffer size Date: Thu, 16 Jan 2014 22:23:30 -0800 Message-Id: <1389939810-14998-7-git-send-email-mwdalton@google.com> X-Mailer: git-send-email 1.8.5.2 In-Reply-To: <1389939810-14998-1-git-send-email-mwdalton@google.com> References: <1389939810-14998-1-git-send-email-mwdalton@google.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add initial support for per-rx queue sysfs attributes to virtio-net. If mergeable packet buffers are enabled, adds a read-only mergeable packet buffer size sysfs attribute for each RX queue. Suggested-by: Michael S. Tsirkin Acked-by: Michael S. Tsirkin Signed-off-by: Michael Dalton --- v3->v4: Remove seqcount due to EWMA changes in patch 5. Add missing Suggested-By. drivers/net/virtio_net.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index dacd43b..d75f8ed 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -600,18 +600,25 @@ static int add_recvbuf_big(struct receive_queue *rq, gfp_t gfp) return err; } -static int add_recvbuf_mergeable(struct receive_queue *rq, gfp_t gfp) +static unsigned int get_mergeable_buf_len(struct ewma *avg_pkt_len) { const size_t hdr_len = sizeof(struct virtio_net_hdr_mrg_rxbuf); + unsigned int len; + + len = hdr_len + clamp_t(unsigned int, ewma_read(avg_pkt_len), + GOOD_PACKET_LEN, PAGE_SIZE - hdr_len); + return ALIGN(len, MERGEABLE_BUFFER_ALIGN); +} + +static int add_recvbuf_mergeable(struct receive_queue *rq, gfp_t gfp) +{ struct page_frag *alloc_frag = &rq->alloc_frag; char *buf; unsigned long ctx; int err; unsigned int len, hole; - len = hdr_len + clamp_t(unsigned int, ewma_read(&rq->mrg_avg_pkt_len), - GOOD_PACKET_LEN, PAGE_SIZE - hdr_len); - len = ALIGN(len, MERGEABLE_BUFFER_ALIGN); + len = get_mergeable_buf_len(&rq->mrg_avg_pkt_len); if (unlikely(!skb_page_frag_refill(len, alloc_frag, gfp))) return -ENOMEM; @@ -1584,6 +1591,33 @@ err: return ret; } +#ifdef CONFIG_SYSFS +static ssize_t mergeable_rx_buffer_size_show(struct netdev_rx_queue *queue, + struct rx_queue_attribute *attribute, char *buf) +{ + struct virtnet_info *vi = netdev_priv(queue->dev); + unsigned int queue_index = get_netdev_rx_queue_index(queue); + struct ewma *avg; + + BUG_ON(queue_index >= vi->max_queue_pairs); + avg = &vi->rq[queue_index].mrg_avg_pkt_len; + return sprintf(buf, "%u\n", get_mergeable_buf_len(avg)); +} + +static struct rx_queue_attribute mergeable_rx_buffer_size_attribute = + __ATTR_RO(mergeable_rx_buffer_size); + +static struct attribute *virtio_net_mrg_rx_attrs[] = { + &mergeable_rx_buffer_size_attribute.attr, + NULL +}; + +static const struct attribute_group virtio_net_mrg_rx_group = { + .name = "virtio_net", + .attrs = virtio_net_mrg_rx_attrs +}; +#endif + static int virtnet_probe(struct virtio_device *vdev) { int i, err; @@ -1698,6 +1732,10 @@ static int virtnet_probe(struct virtio_device *vdev) if (err) goto free_stats; +#ifdef CONFIG_SYSFS + if (vi->mergeable_rx_bufs) + dev->sysfs_rx_queue_group = &virtio_net_mrg_rx_group; +#endif netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs); netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs);