From: Veaceslav Falico <vfalico@gmail.com>
To: Michal Kubecek <mkubecek@suse.cz>
Cc: "David S. Miller" <davem@davemloft.net>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
Jay Vosburgh <j.vosburgh@gmail.com>,
Andy Gospodarek <andy@greyhouse.net>,
Jiri Pirko <jiri@resnulli.us>
Subject: Re: [PATCH net-next v2] net: generic dev_disable_lro() stacked device handling
Date: Thu, 13 Nov 2014 08:15:55 +0100 [thread overview]
Message-ID: <20141113071555.GA28547@raspberrypi> (raw)
In-Reply-To: <20141113065450.1645FA0BEF@unicorn.suse.cz>
On Thu, Nov 13, 2014 at 07:54:50AM +0100, Michal Kubecek wrote:
>Large receive offloading is known to cause problems if received packets
>are passed to other host. Therefore the kernel disables it by calling
>dev_disable_lro() whenever a network device is enslaved in a bridge or
>forwarding is enabled for it (or globally). For virtual devices we need
>to disable LRO on the underlying physical device (which is actually
>receiving the packets).
>
>Current dev_disable_lro() code handles this propagation for a vlan
>(including 802.1ad nested vlan), macvlan or a vlan on top of a macvlan.
>It doesn't handle other stacked devices and their combinations, in
>particular propagation from a bond to its slaves which often causes
>problems in virtualization setups.
>
>As we now have generic data structures describing the upper-lower device
>relationship, dev_disable_lro() can be generalized to disable LRO also
>for all lower devices (if any) once it is disabled for the device
>itself.
>
>For bonding and teaming devices, it is necessary to disable LRO not only
>on current slaves at the moment when dev_disable_lro() is called but
>also on any slave (port) added later.
>
>v2: use lower device links for all devices (including vlan and macvlan)
>
>Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Seems ok to me.
Acked-by: Veaceslav Falico <vfalico@gmail.com>
>---
> drivers/net/bonding/bond_main.c | 3 +++
> drivers/net/team/team.c | 3 +++
> net/core/dev.c | 15 +++++----------
> 3 files changed, 11 insertions(+), 10 deletions(-)
>
>diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>index b9b3456..8575fee 100644
>--- a/drivers/net/bonding/bond_main.c
>+++ b/drivers/net/bonding/bond_main.c
>@@ -1526,6 +1526,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
> }
> #endif
>
>+ if (!(bond_dev->features & NETIF_F_LRO))
>+ dev_disable_lro(slave_dev);
>+
> res = netdev_rx_handler_register(slave_dev, bond_handle_frame,
> new_slave);
> if (res) {
>diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
>index 2368395..93e2242 100644
>--- a/drivers/net/team/team.c
>+++ b/drivers/net/team/team.c
>@@ -1179,6 +1179,9 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
> goto err_enable_netpoll;
> }
>
>+ if (!(dev->features & NETIF_F_LRO))
>+ dev_disable_lro(port_dev);
>+
> err = netdev_rx_handler_register(port_dev, team_handle_frame,
> port);
> if (err) {
>diff --git a/net/core/dev.c b/net/core/dev.c
>index bb09b03..1ab168e 100644
>--- a/net/core/dev.c
>+++ b/net/core/dev.c
>@@ -1437,22 +1437,17 @@ EXPORT_SYMBOL(dev_close);
> */
> void dev_disable_lro(struct net_device *dev)
> {
>- /*
>- * If we're trying to disable lro on a vlan device
>- * use the underlying physical device instead
>- */
>- if (is_vlan_dev(dev))
>- dev = vlan_dev_real_dev(dev);
>-
>- /* the same for macvlan devices */
>- if (netif_is_macvlan(dev))
>- dev = macvlan_dev_real_dev(dev);
>+ struct net_device *lower_dev;
>+ struct list_head *iter;
>
> dev->wanted_features &= ~NETIF_F_LRO;
> netdev_update_features(dev);
>
> if (unlikely(dev->features & NETIF_F_LRO))
> netdev_WARN(dev, "failed to disable LRO!\n");
>+
>+ netdev_for_each_lower_dev(dev, lower_dev, iter)
>+ dev_disable_lro(lower_dev);
> }
> EXPORT_SYMBOL(dev_disable_lro);
>
>--
>1.8.4.5
>
next prev parent reply other threads:[~2014-11-13 7:16 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-11 8:21 [PATCH net-next 0/3] dev_disable_lro() improvements for stacked devices Michal Kubecek
2014-11-11 8:21 ` [PATCH net-next 1/3] net: handle more general stacking in dev_disable_lro() Michal Kubecek
2014-11-11 8:21 ` [PATCH net-next 2/3] team: add helper to check if device is a team master Michal Kubecek
2014-11-11 8:22 ` [PATCH net-next 3/3] net: propagate LRO disabling to bond and team slaves Michal Kubecek
2014-11-11 9:05 ` [PATCH net-next 0/3] dev_disable_lro() improvements for stacked devices Veaceslav Falico
2014-11-11 9:34 ` Michal Kubecek
2014-11-12 2:47 ` David Miller
2014-11-12 13:15 ` Michal Kubecek
2014-11-12 20:08 ` David Miller
2014-11-13 6:54 ` [PATCH net-next v2] net: generic dev_disable_lro() stacked device handling Michal Kubecek
2014-11-13 7:15 ` Veaceslav Falico [this message]
2014-11-13 19:49 ` David Miller
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=20141113071555.GA28547@raspberrypi \
--to=vfalico@gmail.com \
--cc=andy@greyhouse.net \
--cc=davem@davemloft.net \
--cc=j.vosburgh@gmail.com \
--cc=jiri@resnulli.us \
--cc=linux-kernel@vger.kernel.org \
--cc=mkubecek@suse.cz \
--cc=netdev@vger.kernel.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.