diff mbox

[-next,2/2] virtio_net: Read the advised MTU

Message ID 1464882211-18723-3-git-send-email-aconole@redhat.com
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Aaron Conole June 2, 2016, 3:43 p.m. UTC
This patch checks the feature bit for the VIRTIO_NET_F_MTU feature. If it
exists, read the advised MTU and use it.

No proper error handling is provided for the case where a user changes the
negotiated MTU. A future commit will add proper error handling. Instead, a
warning is emitted if the guest changes the device MTU after previously
being given advice.

Signed-off-by: Aaron Conole <aconole@redhat.com>
---
 drivers/net/virtio_net.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Michael S. Tsirkin June 2, 2016, 4:16 p.m. UTC | #1
On Thu, Jun 02, 2016 at 11:43:31AM -0400, Aaron Conole wrote:
> This patch checks the feature bit for the VIRTIO_NET_F_MTU feature. If it
> exists, read the advised MTU and use it.
> 
> No proper error handling is provided for the case where a user changes the
> negotiated MTU. A future commit will add proper error handling. Instead, a
> warning is emitted if the guest changes the device MTU after previously
> being given advice.

I don't see a warning and I don't think it's needed.
Patch is ok commit log isn't.

> Signed-off-by: Aaron Conole <aconole@redhat.com>
> ---
>  drivers/net/virtio_net.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index e0638e5..ef5ee01 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1896,6 +1896,12 @@ static int virtnet_probe(struct virtio_device *vdev)
>  	if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
>  		vi->has_cvq = true;
>  
> +	if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
> +		dev->mtu = virtio_cread16(vdev,
> +					  offsetof(struct virtio_net_config,
> +						   mtu));
> +	}
> +
>  	if (vi->any_header_sg)
>  		dev->needed_headroom = vi->hdr_len;
>  
> @@ -2067,6 +2073,7 @@ static unsigned int features[] = {
>  	VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
>  	VIRTIO_NET_F_CTRL_MAC_ADDR,
>  	VIRTIO_F_ANY_LAYOUT,
> +	VIRTIO_NET_F_MTU,
>  };
>  
>  static struct virtio_driver virtio_net_driver = {
> -- 
> 2.5.5
Aaron Conole June 2, 2016, 5:06 p.m. UTC | #2
Hi Rick,

In the future, please don't cut the list.

Rick Jones <rick.jones2@hpe.com> writes:

> On 06/02/2016 08:43 AM, Aaron Conole wrote:
>> This patch checks the feature bit for the VIRTIO_NET_F_MTU feature. If it
>> exists, read the advised MTU and use it.
>>
>> No proper error handling is provided for the case where a user changes the
>> negotiated MTU. A future commit will add proper error handling. Instead, a
>> warning is emitted if the guest changes the device MTU after previously
>> being given advice.
>
> One of the things I've been doing has been setting-up a cluster
> (OpenStack) with JumboFrames, and then setting MTUs on instance vNICs
> by hand to measure different MTU sizes.  It would be a shame if such a
> thing were not possible in the future.  Keeping a warning if shrinking
> the MTU would be good, leave the error (perhaps) to if an attempt is
> made to go beyond the advised value.

This was cut because it didn't make sense for such a warning to
be issued, but it seems like perhaps you may want such a feature?  I
agree with Michael, after thinking about it, that I don't know what sort
of use the warning would serve.  After all, if you're changing the MTU,
you must have wanted such a change to occur?

-Aaron

> happy benchmarking,
>
> rick jones
Aaron Conole June 2, 2016, 5:10 p.m. UTC | #3
"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Thu, Jun 02, 2016 at 11:43:31AM -0400, Aaron Conole wrote:
>> This patch checks the feature bit for the VIRTIO_NET_F_MTU feature. If it
>> exists, read the advised MTU and use it.
>> 
>> No proper error handling is provided for the case where a user changes the
>> negotiated MTU. A future commit will add proper error handling. Instead, a
>> warning is emitted if the guest changes the device MTU after previously
>> being given advice.
>
> I don't see a warning and I don't think it's needed.
> Patch is ok commit log isn't.

Okay, I'll fix it when I submit v2.

>> Signed-off-by: Aaron Conole <aconole@redhat.com>
>> ---
>>  drivers/net/virtio_net.c | 7 +++++++
>>  1 file changed, 7 insertions(+)
>> 
>> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
>> index e0638e5..ef5ee01 100644
>> --- a/drivers/net/virtio_net.c
>> +++ b/drivers/net/virtio_net.c
>> @@ -1896,6 +1896,12 @@ static int virtnet_probe(struct virtio_device *vdev)
>>  	if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
>>  		vi->has_cvq = true;
>>  
>> +	if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
>> +		dev->mtu = virtio_cread16(vdev,
>> +					  offsetof(struct virtio_net_config,
>> +						   mtu));
>> +	}
>> +
>>  	if (vi->any_header_sg)
>>  		dev->needed_headroom = vi->hdr_len;
>>  
>> @@ -2067,6 +2073,7 @@ static unsigned int features[] = {
>>  	VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
>>  	VIRTIO_NET_F_CTRL_MAC_ADDR,
>>  	VIRTIO_F_ANY_LAYOUT,
>> +	VIRTIO_NET_F_MTU,
>>  };
>>  
>>  static struct virtio_driver virtio_net_driver = {
>> -- 
>> 2.5.5
kernel test robot June 2, 2016, 5:25 p.m. UTC | #4
Hi,

[auto build test ERROR on next-20160602]

url:    https://github.com/0day-ci/linux/commits/Aaron-Conole/virtio-net-Advised-MTU-feature/20160603-000714
config: i386-allmodconfig (attached as .config)
compiler: gcc-6 (Debian 6.1.1-1) 6.1.1 20160430
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

Note: the linux-review/Aaron-Conole/virtio-net-Advised-MTU-feature/20160603-000714 HEAD d909da4df3c52f78b4f5fcccd89aea5e38722d10 builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

   drivers/net/virtio_net.c: In function 'virtnet_probe':
>> drivers/net/virtio_net.c:1899:31: error: 'VIRTIO_NET_F_MTU' undeclared (first use in this function)
     if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
                                  ^~~~~~~~~~~~~~~~
   drivers/net/virtio_net.c:1899:31: note: each undeclared identifier is reported only once for each function it appears in
   drivers/net/virtio_net.c: At top level:
>> drivers/net/virtio_net.c:2076:2: error: 'VIRTIO_NET_F_MTU' undeclared here (not in a function)
     VIRTIO_NET_F_MTU,
     ^~~~~~~~~~~~~~~~

vim +/VIRTIO_NET_F_MTU +1899 drivers/net/virtio_net.c

  1893		    virtio_has_feature(vdev, VIRTIO_F_VERSION_1))
  1894			vi->any_header_sg = true;
  1895	
  1896		if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
  1897			vi->has_cvq = true;
  1898	
> 1899		if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
  1900			dev->mtu = virtio_cread16(vdev,
  1901						  offsetof(struct virtio_net_config,
  1902							   mtu));
  1903		}
  1904	
  1905		if (vi->any_header_sg)
  1906			dev->needed_headroom = vi->hdr_len;
  1907	
  1908		/* Use single tx/rx queue pair as default */
  1909		vi->curr_queue_pairs = 1;
  1910		vi->max_queue_pairs = max_queue_pairs;
  1911	
  1912		/* Allocate/initialize the rx/tx queues, and invoke find_vqs */
  1913		err = init_vqs(vi);
  1914		if (err)
  1915			goto free_stats;
  1916	
  1917	#ifdef CONFIG_SYSFS
  1918		if (vi->mergeable_rx_bufs)
  1919			dev->sysfs_rx_queue_group = &virtio_net_mrg_rx_group;
  1920	#endif
  1921		netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs);
  1922		netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs);
  1923	
  1924		virtnet_init_settings(dev);
  1925	
  1926		err = register_netdev(dev);
  1927		if (err) {
  1928			pr_debug("virtio_net: registering device failed\n");
  1929			goto free_vqs;
  1930		}
  1931	
  1932		virtio_device_ready(vdev);
  1933	
  1934		vi->nb.notifier_call = &virtnet_cpu_callback;
  1935		err = register_hotcpu_notifier(&vi->nb);
  1936		if (err) {
  1937			pr_debug("virtio_net: registering cpu notifier failed\n");
  1938			goto free_unregister_netdev;
  1939		}
  1940	
  1941		/* Assume link up if device can't report link status,
  1942		   otherwise get link status from config. */
  1943		if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_STATUS)) {
  1944			netif_carrier_off(dev);
  1945			schedule_work(&vi->config_work);
  1946		} else {
  1947			vi->status = VIRTIO_NET_S_LINK_UP;
  1948			netif_carrier_on(dev);
  1949		}
  1950	
  1951		pr_debug("virtnet: registered device %s with %d RX and TX vq's\n",
  1952			 dev->name, max_queue_pairs);
  1953	
  1954		return 0;
  1955	
  1956	free_unregister_netdev:
  1957		vi->vdev->config->reset(vdev);
  1958	
  1959		unregister_netdev(dev);
  1960	free_vqs:
  1961		cancel_delayed_work_sync(&vi->refill);
  1962		free_receive_page_frags(vi);
  1963		virtnet_del_vqs(vi);
  1964	free_stats:
  1965		free_percpu(vi->stats);
  1966	free:
  1967		free_netdev(dev);
  1968		return err;
  1969	}
  1970	
  1971	static void remove_vq_common(struct virtnet_info *vi)
  1972	{
  1973		vi->vdev->config->reset(vi->vdev);
  1974	
  1975		/* Free unused buffers in both send and recv, if any. */
  1976		free_unused_bufs(vi);
  1977	
  1978		free_receive_bufs(vi);
  1979	
  1980		free_receive_page_frags(vi);
  1981	
  1982		virtnet_del_vqs(vi);
  1983	}
  1984	
  1985	static void virtnet_remove(struct virtio_device *vdev)
  1986	{
  1987		struct virtnet_info *vi = vdev->priv;
  1988	
  1989		unregister_hotcpu_notifier(&vi->nb);
  1990	
  1991		/* Make sure no work handler is accessing the device. */
  1992		flush_work(&vi->config_work);
  1993	
  1994		unregister_netdev(vi->dev);
  1995	
  1996		remove_vq_common(vi);
  1997	
  1998		free_percpu(vi->stats);
  1999		free_netdev(vi->dev);
  2000	}
  2001	
  2002	#ifdef CONFIG_PM_SLEEP
  2003	static int virtnet_freeze(struct virtio_device *vdev)
  2004	{
  2005		struct virtnet_info *vi = vdev->priv;
  2006		int i;
  2007	
  2008		unregister_hotcpu_notifier(&vi->nb);
  2009	
  2010		/* Make sure no work handler is accessing the device */
  2011		flush_work(&vi->config_work);
  2012	
  2013		netif_device_detach(vi->dev);
  2014		cancel_delayed_work_sync(&vi->refill);
  2015	
  2016		if (netif_running(vi->dev)) {
  2017			for (i = 0; i < vi->max_queue_pairs; i++)
  2018				napi_disable(&vi->rq[i].napi);
  2019		}
  2020	
  2021		remove_vq_common(vi);
  2022	
  2023		return 0;
  2024	}
  2025	
  2026	static int virtnet_restore(struct virtio_device *vdev)
  2027	{
  2028		struct virtnet_info *vi = vdev->priv;
  2029		int err, i;
  2030	
  2031		err = init_vqs(vi);
  2032		if (err)
  2033			return err;
  2034	
  2035		virtio_device_ready(vdev);
  2036	
  2037		if (netif_running(vi->dev)) {
  2038			for (i = 0; i < vi->curr_queue_pairs; i++)
  2039				if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL))
  2040					schedule_delayed_work(&vi->refill, 0);
  2041	
  2042			for (i = 0; i < vi->max_queue_pairs; i++)
  2043				virtnet_napi_enable(&vi->rq[i]);
  2044		}
  2045	
  2046		netif_device_attach(vi->dev);
  2047	
  2048		rtnl_lock();
  2049		virtnet_set_queues(vi, vi->curr_queue_pairs);
  2050		rtnl_unlock();
  2051	
  2052		err = register_hotcpu_notifier(&vi->nb);
  2053		if (err)
  2054			return err;
  2055	
  2056		return 0;
  2057	}
  2058	#endif
  2059	
  2060	static struct virtio_device_id id_table[] = {
  2061		{ VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
  2062		{ 0 },
  2063	};
  2064	
  2065	static unsigned int features[] = {
  2066		VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM,
  2067		VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC,
  2068		VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6,
  2069		VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
  2070		VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO,
  2071		VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
  2072		VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
  2073		VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
  2074		VIRTIO_NET_F_CTRL_MAC_ADDR,
  2075		VIRTIO_F_ANY_LAYOUT,
> 2076		VIRTIO_NET_F_MTU,
  2077	};
  2078	
  2079	static struct virtio_driver virtio_net_driver = {

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Aaron Conole June 2, 2016, 5:48 p.m. UTC | #5
kbuild test robot <lkp@intel.com> writes:

> Hi,
>
> [auto build test ERROR on next-20160602]
>
> url:    https://github.com/0day-ci/linux/commits/Aaron-Conole/virtio-net-Advised-MTU-feature/20160603-000714
> config: i386-allmodconfig (attached as .config)
> compiler: gcc-6 (Debian 6.1.1-1) 6.1.1 20160430
> reproduce:
>         # save the attached .config to linux build tree
>         make ARCH=i386 
>
> Note: the linux-review/Aaron-Conole/virtio-net-Advised-MTU-feature/20160603-000714 HEAD d909da4df3c52f78b4f5fcccd89aea5e38722d10 builds fine.
>       It only hurts bisectibility.
>
> All errors (new ones prefixed by >>):
>
>    drivers/net/virtio_net.c: In function 'virtnet_probe':
>>> drivers/net/virtio_net.c:1899:31: error: 'VIRTIO_NET_F_MTU'
>>> undeclared (first use in this function)
>      if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
>                                   ^~~~~~~~~~~~~~~~
>    drivers/net/virtio_net.c:1899:31: note: each undeclared identifier is reported only once for each function it appears in
>    drivers/net/virtio_net.c: At top level:
>>> drivers/net/virtio_net.c:2076:2: error: 'VIRTIO_NET_F_MTU'
>>> undeclared here (not in a function)
>      VIRTIO_NET_F_MTU,
>      ^~~~~~~~~~~~~~~~

Oops, hunk was dropped during rebase.  Sorry for this, v2 will fix this
error, as well and I'll do a boot test before submission.

Thanks kbuild robot!

> vim +/VIRTIO_NET_F_MTU +1899 drivers/net/virtio_net.c
>
>   1893		    virtio_has_feature(vdev, VIRTIO_F_VERSION_1))
>   1894			vi->any_header_sg = true;
>   1895	
>   1896		if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
>   1897			vi->has_cvq = true;
>   1898	
>> 1899		if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
>   1900			dev->mtu = virtio_cread16(vdev,
>   1901 offsetof(struct virtio_net_config,
>   1902							   mtu));
>   1903		}
>   1904	
>   1905		if (vi->any_header_sg)
>   1906			dev->needed_headroom = vi->hdr_len;
>   1907	
>   1908		/* Use single tx/rx queue pair as default */
>   1909		vi->curr_queue_pairs = 1;
>   1910		vi->max_queue_pairs = max_queue_pairs;
>   1911	
>   1912		/* Allocate/initialize the rx/tx queues, and invoke find_vqs */
>   1913		err = init_vqs(vi);
>   1914		if (err)
>   1915			goto free_stats;
>   1916	
>   1917	#ifdef CONFIG_SYSFS
>   1918		if (vi->mergeable_rx_bufs)
>   1919			dev->sysfs_rx_queue_group = &virtio_net_mrg_rx_group;
>   1920	#endif
>   1921		netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs);
>   1922		netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs);
>   1923	
>   1924		virtnet_init_settings(dev);
>   1925	
>   1926		err = register_netdev(dev);
>   1927		if (err) {
>   1928			pr_debug("virtio_net: registering device failed\n");
>   1929			goto free_vqs;
>   1930		}
>   1931	
>   1932		virtio_device_ready(vdev);
>   1933	
>   1934		vi->nb.notifier_call = &virtnet_cpu_callback;
>   1935		err = register_hotcpu_notifier(&vi->nb);
>   1936		if (err) {
>   1937			pr_debug("virtio_net: registering cpu notifier failed\n");
>   1938			goto free_unregister_netdev;
>   1939		}
>   1940	
>   1941		/* Assume link up if device can't report link status,
>   1942		   otherwise get link status from config. */
>   1943		if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_STATUS)) {
>   1944			netif_carrier_off(dev);
>   1945			schedule_work(&vi->config_work);
>   1946		} else {
>   1947			vi->status = VIRTIO_NET_S_LINK_UP;
>   1948			netif_carrier_on(dev);
>   1949		}
>   1950	
>   1951		pr_debug("virtnet: registered device %s with %d RX and TX vq's\n",
>   1952			 dev->name, max_queue_pairs);
>   1953	
>   1954		return 0;
>   1955	
>   1956	free_unregister_netdev:
>   1957		vi->vdev->config->reset(vdev);
>   1958	
>   1959		unregister_netdev(dev);
>   1960	free_vqs:
>   1961		cancel_delayed_work_sync(&vi->refill);
>   1962		free_receive_page_frags(vi);
>   1963		virtnet_del_vqs(vi);
>   1964	free_stats:
>   1965		free_percpu(vi->stats);
>   1966	free:
>   1967		free_netdev(dev);
>   1968		return err;
>   1969	}
>   1970	
>   1971	static void remove_vq_common(struct virtnet_info *vi)
>   1972	{
>   1973		vi->vdev->config->reset(vi->vdev);
>   1974	
>   1975		/* Free unused buffers in both send and recv, if any. */
>   1976		free_unused_bufs(vi);
>   1977	
>   1978		free_receive_bufs(vi);
>   1979	
>   1980		free_receive_page_frags(vi);
>   1981	
>   1982		virtnet_del_vqs(vi);
>   1983	}
>   1984	
>   1985	static void virtnet_remove(struct virtio_device *vdev)
>   1986	{
>   1987		struct virtnet_info *vi = vdev->priv;
>   1988	
>   1989		unregister_hotcpu_notifier(&vi->nb);
>   1990	
>   1991		/* Make sure no work handler is accessing the device. */
>   1992		flush_work(&vi->config_work);
>   1993	
>   1994		unregister_netdev(vi->dev);
>   1995	
>   1996		remove_vq_common(vi);
>   1997	
>   1998		free_percpu(vi->stats);
>   1999		free_netdev(vi->dev);
>   2000	}
>   2001	
>   2002	#ifdef CONFIG_PM_SLEEP
>   2003	static int virtnet_freeze(struct virtio_device *vdev)
>   2004	{
>   2005		struct virtnet_info *vi = vdev->priv;
>   2006		int i;
>   2007	
>   2008		unregister_hotcpu_notifier(&vi->nb);
>   2009	
>   2010		/* Make sure no work handler is accessing the device */
>   2011		flush_work(&vi->config_work);
>   2012	
>   2013		netif_device_detach(vi->dev);
>   2014		cancel_delayed_work_sync(&vi->refill);
>   2015	
>   2016		if (netif_running(vi->dev)) {
>   2017			for (i = 0; i < vi->max_queue_pairs; i++)
>   2018				napi_disable(&vi->rq[i].napi);
>   2019		}
>   2020	
>   2021		remove_vq_common(vi);
>   2022	
>   2023		return 0;
>   2024	}
>   2025	
>   2026	static int virtnet_restore(struct virtio_device *vdev)
>   2027	{
>   2028		struct virtnet_info *vi = vdev->priv;
>   2029		int err, i;
>   2030	
>   2031		err = init_vqs(vi);
>   2032		if (err)
>   2033			return err;
>   2034	
>   2035		virtio_device_ready(vdev);
>   2036	
>   2037		if (netif_running(vi->dev)) {
>   2038			for (i = 0; i < vi->curr_queue_pairs; i++)
>   2039				if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL))
>   2040					schedule_delayed_work(&vi->refill, 0);
>   2041	
>   2042			for (i = 0; i < vi->max_queue_pairs; i++)
>   2043				virtnet_napi_enable(&vi->rq[i]);
>   2044		}
>   2045	
>   2046		netif_device_attach(vi->dev);
>   2047	
>   2048		rtnl_lock();
>   2049		virtnet_set_queues(vi, vi->curr_queue_pairs);
>   2050		rtnl_unlock();
>   2051	
>   2052		err = register_hotcpu_notifier(&vi->nb);
>   2053		if (err)
>   2054			return err;
>   2055	
>   2056		return 0;
>   2057	}
>   2058	#endif
>   2059	
>   2060	static struct virtio_device_id id_table[] = {
>   2061		{ VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
>   2062		{ 0 },
>   2063	};
>   2064	
>   2065	static unsigned int features[] = {
>   2066		VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM,
>   2067		VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC,
>   2068 VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO,
> VIRTIO_NET_F_HOST_TSO6,
>   2069 VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4,
> VIRTIO_NET_F_GUEST_TSO6,
>   2070		VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO,
>   2071		VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
>   2072		VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
>   2073		VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
>   2074		VIRTIO_NET_F_CTRL_MAC_ADDR,
>   2075		VIRTIO_F_ANY_LAYOUT,
>> 2076		VIRTIO_NET_F_MTU,
>   2077	};
>   2078	
>   2079	static struct virtio_driver virtio_net_driver = {
>
> ---
> 0-DAY kernel test infrastructure                Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Rick Jones June 2, 2016, 6:02 p.m. UTC | #6
On 06/02/2016 10:06 AM, Aaron Conole wrote:
> Rick Jones <rick.jones2@hpe.com> writes:
>> One of the things I've been doing has been setting-up a cluster
>> (OpenStack) with JumboFrames, and then setting MTUs on instance vNICs
>> by hand to measure different MTU sizes.  It would be a shame if such a
>> thing were not possible in the future.  Keeping a warning if shrinking
>> the MTU would be good, leave the error (perhaps) to if an attempt is
>> made to go beyond the advised value.
>
> This was cut because it didn't make sense for such a warning to
> be issued, but it seems like perhaps you may want such a feature?  I
> agree with Michael, after thinking about it, that I don't know what sort
> of use the warning would serve.  After all, if you're changing the MTU,
> you must have wanted such a change to occur?

I don't need a warning, was simply willing to live with one when 
shrinking the MTU.  Didn't want an error.

happy benchmarking,

rick jones
diff mbox

Patch

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index e0638e5..ef5ee01 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1896,6 +1896,12 @@  static int virtnet_probe(struct virtio_device *vdev)
 	if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
 		vi->has_cvq = true;
 
+	if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
+		dev->mtu = virtio_cread16(vdev,
+					  offsetof(struct virtio_net_config,
+						   mtu));
+	}
+
 	if (vi->any_header_sg)
 		dev->needed_headroom = vi->hdr_len;
 
@@ -2067,6 +2073,7 @@  static unsigned int features[] = {
 	VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
 	VIRTIO_NET_F_CTRL_MAC_ADDR,
 	VIRTIO_F_ANY_LAYOUT,
+	VIRTIO_NET_F_MTU,
 };
 
 static struct virtio_driver virtio_net_driver = {