netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net] macvlan: Disable LRO on lowerdev; warn if it's turned back on
@ 2012-02-21 19:13 Ben Hutchings
  2012-02-21 20:01 ` John Fastabend
  0 siblings, 1 reply; 6+ messages in thread
From: Ben Hutchings @ 2012-02-21 19:13 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Shradha Shah, Patrick McHardy, Eric W. Biederman

Large Receive Offload (LRO) is only appropriate for packets that are
destined for the host, and should be disabled if received packets may
be forwarded.

Further, macvtap_skb_to_vnet_hdr() will BUG() on a packet received
with LRO (but not GRO).

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
I'm not really familiar with macvlan so I'm not certain that this should
be applied to all modes.

Ben.

 drivers/net/macvlan.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 9ea9921..c64e26c 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -168,6 +168,11 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)
 	unsigned int len = 0;
 	int ret = NET_RX_DROP;
 
+	if (skb_warn_if_lro(skb)) {
+		kfree_skb(skb);
+		return RX_HANDLER_CONSUMED;
+	}
+
 	port = macvlan_port_get_rcu(skb->dev);
 	if (is_multicast_ether_addr(eth->h_dest)) {
 		skb = ip_check_defrag(skb, IP_DEFRAG_MACVLAN);
@@ -717,6 +722,8 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
 		memcpy(dev->dev_addr, lowerdev->dev_addr, ETH_ALEN);
 	}
 
+	dev_disable_lro(lowerdev);
+
 	port->count += 1;
 	err = register_netdevice(dev);
 	if (err < 0)
-- 
1.7.7.6


-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH net] macvlan: Disable LRO on lowerdev; warn if it's turned back on
  2012-02-21 19:13 [PATCH net] macvlan: Disable LRO on lowerdev; warn if it's turned back on Ben Hutchings
@ 2012-02-21 20:01 ` John Fastabend
  2012-02-21 20:28   ` Ben Hutchings
  0 siblings, 1 reply; 6+ messages in thread
From: John Fastabend @ 2012-02-21 20:01 UTC (permalink / raw)
  To: Ben Hutchings
  Cc: David Miller, netdev, Shradha Shah, Patrick McHardy,
	Eric W. Biederman

On 2/21/2012 11:13 AM, Ben Hutchings wrote:
> Large Receive Offload (LRO) is only appropriate for packets that are
> destined for the host, and should be disabled if received packets may
> be forwarded.
> 
> Further, macvtap_skb_to_vnet_hdr() will BUG() on a packet received
> with LRO (but not GRO).
> 
> Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
> ---
> I'm not really familiar with macvlan so I'm not certain that this should
> be applied to all modes.
> 
> Ben.
> 
>  drivers/net/macvlan.c |    7 +++++++
>  1 files changed, 7 insertions(+), 0 deletions(-)
> 

But this patch assumes the macvlan is forwarding traffic to a guest
via macvtap. Which is an assumption that may not be true.

It seems more appropriate for the macvtap driver to do these checks
after all its the driver that may BUG() with LRO.

Thanks,
John

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net] macvlan: Disable LRO on lowerdev; warn if it's turned back on
  2012-02-21 20:01 ` John Fastabend
@ 2012-02-21 20:28   ` Ben Hutchings
  2012-02-21 21:46     ` Ben Greear
  0 siblings, 1 reply; 6+ messages in thread
From: Ben Hutchings @ 2012-02-21 20:28 UTC (permalink / raw)
  To: John Fastabend
  Cc: David Miller, netdev, Shradha Shah, Patrick McHardy,
	Eric W. Biederman

On Tue, 2012-02-21 at 12:01 -0800, John Fastabend wrote:
> On 2/21/2012 11:13 AM, Ben Hutchings wrote:
> > Large Receive Offload (LRO) is only appropriate for packets that are
> > destined for the host, and should be disabled if received packets may
> > be forwarded.
> > 
> > Further, macvtap_skb_to_vnet_hdr() will BUG() on a packet received
> > with LRO (but not GRO).
> > 
> > Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
> > ---
> > I'm not really familiar with macvlan so I'm not certain that this should
> > be applied to all modes.
> > 
> > Ben.
> > 
> >  drivers/net/macvlan.c |    7 +++++++
> >  1 files changed, 7 insertions(+), 0 deletions(-)
> > 
> 
> But this patch assumes the macvlan is forwarding traffic to a guest
> via macvtap. Which is an assumption that may not be true.
> 
> It seems more appropriate for the macvtap driver to do these checks
> after all its the driver that may BUG() with LRO.

That's what I thought at first, but then I looked through what macvlan
was doing and it certainly appears to re-transmit skbs in all modes.
That's not valid when gso_size != 0 and gso_type == 0.

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net] macvlan: Disable LRO on lowerdev; warn if it's turned back on
  2012-02-21 20:28   ` Ben Hutchings
@ 2012-02-21 21:46     ` Ben Greear
  2012-02-25 22:07       ` Eric W. Biederman
  0 siblings, 1 reply; 6+ messages in thread
From: Ben Greear @ 2012-02-21 21:46 UTC (permalink / raw)
  To: Ben Hutchings
  Cc: John Fastabend, David Miller, netdev, Shradha Shah,
	Patrick McHardy, Eric W. Biederman

On 02/21/2012 12:28 PM, Ben Hutchings wrote:
> On Tue, 2012-02-21 at 12:01 -0800, John Fastabend wrote:
>> On 2/21/2012 11:13 AM, Ben Hutchings wrote:
>>> Large Receive Offload (LRO) is only appropriate for packets that are
>>> destined for the host, and should be disabled if received packets may
>>> be forwarded.
>>>
>>> Further, macvtap_skb_to_vnet_hdr() will BUG() on a packet received
>>> with LRO (but not GRO).
>>>
>>> Signed-off-by: Ben Hutchings<bhutchings@solarflare.com>
>>> ---
>>> I'm not really familiar with macvlan so I'm not certain that this should
>>> be applied to all modes.
>>>
>>> Ben.
>>>
>>>   drivers/net/macvlan.c |    7 +++++++
>>>   1 files changed, 7 insertions(+), 0 deletions(-)
>>>
>>
>> But this patch assumes the macvlan is forwarding traffic to a guest
>> via macvtap. Which is an assumption that may not be true.
>>
>> It seems more appropriate for the macvtap driver to do these checks
>> after all its the driver that may BUG() with LRO.
>
> That's what I thought at first, but then I looked through what macvlan
> was doing and it certainly appears to re-transmit skbs in all modes.
> That's not valid when gso_size != 0 and gso_type == 0.

You can put an IP on a mac-vlan and receive packets on it like
normal Ethernet interfaces.  They wouldn't be re-transmitted
in that case, would they?

>
> Ben.
>


-- 
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc  http://www.candelatech.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net] macvlan: Disable LRO on lowerdev; warn if it's turned back on
  2012-02-21 21:46     ` Ben Greear
@ 2012-02-25 22:07       ` Eric W. Biederman
  2012-02-25 22:49         ` Ben Hutchings
  0 siblings, 1 reply; 6+ messages in thread
From: Eric W. Biederman @ 2012-02-25 22:07 UTC (permalink / raw)
  To: Ben Greear
  Cc: Ben Hutchings, John Fastabend, David Miller, netdev, Shradha Shah,
	Patrick McHardy

Ben Greear <greearb@candelatech.com> writes:

> On 02/21/2012 12:28 PM, Ben Hutchings wrote:
>> On Tue, 2012-02-21 at 12:01 -0800, John Fastabend wrote:
>>> On 2/21/2012 11:13 AM, Ben Hutchings wrote:
>>>> Large Receive Offload (LRO) is only appropriate for packets that are
>>>> destined for the host, and should be disabled if received packets may
>>>> be forwarded.
>>>>
>>>> Further, macvtap_skb_to_vnet_hdr() will BUG() on a packet received
>>>> with LRO (but not GRO).
>>>>
>>>> Signed-off-by: Ben Hutchings<bhutchings@solarflare.com>
>>>> ---
>>>> I'm not really familiar with macvlan so I'm not certain that this should
>>>> be applied to all modes.
>>>>
>>>> Ben.
>>>>
>>>>   drivers/net/macvlan.c |    7 +++++++
>>>>   1 files changed, 7 insertions(+), 0 deletions(-)
>>>>
>>>
>>> But this patch assumes the macvlan is forwarding traffic to a guest
>>> via macvtap. Which is an assumption that may not be true.
>>>
>>> It seems more appropriate for the macvtap driver to do these checks
>>> after all its the driver that may BUG() with LRO.
>>
>> That's what I thought at first, but then I looked through what macvlan
>> was doing and it certainly appears to re-transmit skbs in all modes.
>> That's not valid when gso_size != 0 and gso_type == 0.
>
> You can put an IP on a mac-vlan and receive packets on it like
> normal Ethernet interfaces.  They wouldn't be re-transmitted
> in that case, would they?

Long story short.

With the macvlan driver the normal case is not to turn packets around
but to go directly to the nic or to come directly from the nic.

In the case where packets are turned around and packets go from one
software interface the design is that the drivers are supposed to
do software emulation of hardware features like gro so that we don't
have to take a performance hit when it happens.

If we are not doing proper software emulation of features like gro
in macvtap that is a problem.

I am fuzzy about all of the details but last I looked we were doing
proper software emulation of the features when just macvlan was
involved.  I also remember that the macvtap driver really wanted
gro so that it could work efficiently with emulated hardware.

So I don't know why people are having a problem, but the correct
solution is not to give up but to fix the silly software side of
the drivers to actually handle things properly.

Disabling LRO on the lowerdev just so we can avoid writing the
support in macvtap just sounds sad.

Eric

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net] macvlan: Disable LRO on lowerdev; warn if it's turned back on
  2012-02-25 22:07       ` Eric W. Biederman
@ 2012-02-25 22:49         ` Ben Hutchings
  0 siblings, 0 replies; 6+ messages in thread
From: Ben Hutchings @ 2012-02-25 22:49 UTC (permalink / raw)
  To: Eric W. Biederman
  Cc: Ben Greear, John Fastabend, David Miller, netdev, Shradha Shah,
	Patrick McHardy

On Sat, 2012-02-25 at 14:07 -0800, Eric W. Biederman wrote:
> Ben Greear <greearb@candelatech.com> writes:
> 
> > On 02/21/2012 12:28 PM, Ben Hutchings wrote:
> >> On Tue, 2012-02-21 at 12:01 -0800, John Fastabend wrote:
> >>> On 2/21/2012 11:13 AM, Ben Hutchings wrote:
> >>>> Large Receive Offload (LRO) is only appropriate for packets that are
> >>>> destined for the host, and should be disabled if received packets may
> >>>> be forwarded.
> >>>>
> >>>> Further, macvtap_skb_to_vnet_hdr() will BUG() on a packet received
> >>>> with LRO (but not GRO).
[...]
> Long story short.
> 
> With the macvlan driver the normal case is not to turn packets around
> but to go directly to the nic or to come directly from the nic.
>
> In the case where packets are turned around and packets go from one
> software interface the design is that the drivers are supposed to
> do software emulation of hardware features like gro so that we don't
> have to take a performance hit when it happens.
> 
> If we are not doing proper software emulation of features like gro
> in macvtap that is a problem.
> 
> I am fuzzy about all of the details but last I looked we were doing
> proper software emulation of the features when just macvlan was
> involved.  I also remember that the macvtap driver really wanted
> gro so that it could work efficiently with emulated hardware.

This doesn't disable GRO; you can still benefit from that.

> So I don't know why people are having a problem, but the correct
> solution is not to give up but to fix the silly software side of
> the drivers to actually handle things properly.

This is not a deficiency in macvtap.  Any skb received with LRO cannot
be re-sent through dev_queue_xmit() or dev_hard_start_xmit().

> Disabling LRO on the lowerdev just so we can avoid writing the
> support in macvtap just sounds sad.

The regular bridge driver and the IPv4 and IPv6 protocols already
disable LRO when enabling forwarding on a device.  This is 'normal'.

Now we could decide that the possible loss of some header information
through LRO is acceptable and we should just require drivers using LRO
to label their skbs with the proper gso_type for re-sending.  Indeed,
although GRO preserves packet boundaries they are actually lost in
re-transmission as GSO/TSO re-segments at regular intervals.  So that's
already happening to an extent.

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-02-25 22:49 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-21 19:13 [PATCH net] macvlan: Disable LRO on lowerdev; warn if it's turned back on Ben Hutchings
2012-02-21 20:01 ` John Fastabend
2012-02-21 20:28   ` Ben Hutchings
2012-02-21 21:46     ` Ben Greear
2012-02-25 22:07       ` Eric W. Biederman
2012-02-25 22:49         ` Ben Hutchings

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).