All of lore.kernel.org
 help / color / mirror / Atom feed
From: Solio Sarabia <solio.sarabia@intel.com>
To: netdev@vger.kernel.org, davem@davemloft.net, stephen@networkplumber.org
Cc: kys@microsoft.com, shiny.sebastian@intel.com,
	solio.sarabia@intel.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] net-sysfs: export gso_max_size attribute
Date: Thu, 23 Nov 2017 13:48:57 -0800	[thread overview]
Message-ID: <20171123214857.GA41@intel.com> (raw)
In-Reply-To: <1511397041-27994-1-git-send-email-solio.sarabia@intel.com>

On Wed, Nov 22, 2017 at 04:30:41PM -0800, Solio Sarabia wrote:
> The netdevice gso_max_size is exposed to allow users fine-control on
> systems with multiple NICs with different GSO buffer sizes, and where
> the virtual devices like bridge and veth, need to be aware of the GSO
> size of the underlying devices.
> 
> In a virtualized environment, setting the right GSO sizes for physical
> and virtual devices makes all TSO work to be on physical NIC, improving
> throughput and reducing CPU util. If virtual devices send buffers
> greater than what NIC supports, it forces host to do TSO for buffers
> exceeding the limit, increasing CPU utilization in host.
> 
> Suggested-by: Shiny Sebastian <shiny.sebastian@intel.com>
> Signed-off-by: Solio Sarabia <solio.sarabia@intel.com>
> ---
> In one test scenario with Hyper-V host, Ubuntu 16.04 VM, with Docker
> inside VM, and NTttcp sending 40 Gbps from one container, setting the
> right gso_max_size values for all network devices in the chain, reduces
> CPU overhead about 3x (for the sender), since all TSO work is done by
> physical NIC.
> 
>  net/core/net-sysfs.c | 30 ++++++++++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
> 
> diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
> index 799b752..7314bc8 100644
> --- a/net/core/net-sysfs.c
> +++ b/net/core/net-sysfs.c
> @@ -376,6 +376,35 @@ static ssize_t gro_flush_timeout_store(struct device *dev,
>  }
>  NETDEVICE_SHOW_RW(gro_flush_timeout, fmt_ulong);
>  
> +static int change_gso_max_size(struct net_device *dev, unsigned long new_size)
> +{
> +	unsigned int orig_size = dev->gso_max_size;
> +
> +	if (new_size != (unsigned int)new_size)
> +		return -ERANGE;
> +
> +	if (new_size == orig_size)
> +		return 0;
> +
> +	if (new_size <= 0 || new_size > GSO_MAX_SIZE)
> +		return -ERANGE;
> +
> +	dev->gso_max_size = new_size;
> +	return 0;
> +}
Hindsight, we need to re-evaluate the valid range. As it is now, in a
virtualized environment, users could set the gso to a value greater than
what NICs expose, which would inflict the original issue: overhead in
the host os due to a configuration value in the vm.

> +
> +static ssize_t gso_max_size_store(struct device *dev,
> +				  struct device_attribute *attr,
> +				  const char *buf, size_t len)
> +{
> +	if (!capable(CAP_NET_ADMIN))
> +		return -EPERM;
> +
> +	return netdev_store(dev, attr, buf, len, change_gso_max_size);
> +}
> +
> +NETDEVICE_SHOW_RW(gso_max_size, fmt_dec);
> +
>  static ssize_t ifalias_store(struct device *dev, struct device_attribute *attr,
>  			     const char *buf, size_t len)
>  {
> @@ -543,6 +572,7 @@ static struct attribute *net_class_attrs[] __ro_after_init = {
>  	&dev_attr_flags.attr,
>  	&dev_attr_tx_queue_len.attr,
>  	&dev_attr_gro_flush_timeout.attr,
> +	&dev_attr_gso_max_size.attr,
>  	&dev_attr_phys_port_id.attr,
>  	&dev_attr_phys_port_name.attr,
>  	&dev_attr_phys_switch_id.attr,
> -- 
> 2.7.4
> 

  reply	other threads:[~2017-11-23 21:49 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-23  0:30 [PATCH] net-sysfs: export gso_max_size attribute Solio Sarabia
2017-11-23 21:48 ` Solio Sarabia [this message]
2017-11-24  5:18 ` Stephen Hemminger
2017-11-24 17:14 ` David Ahern
2017-11-24 18:32   ` Eric Dumazet
2017-11-24 18:43     ` David Ahern
2017-11-24 18:52       ` Eric Dumazet
2017-11-27 21:47     ` Solio Sarabia

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=20171123214857.GA41@intel.com \
    --to=solio.sarabia@intel.com \
    --cc=davem@davemloft.net \
    --cc=kys@microsoft.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=shiny.sebastian@intel.com \
    --cc=stephen@networkplumber.org \
    /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.