From: Jason Wang <jasowang@redhat.com>
To: John Fastabend <john.fastabend@gmail.com>
Cc: davem@davemloft.net, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, mst@redhat.com,
John Fastabend <john.r.fastabend@intel.com>,
Neil Horman <nhorman@tuxdriver.com>
Subject: Re: [PATCH net 1/2] macvlan: forbid L2 fowarding offload for macvtap
Date: Mon, 06 Jan 2014 15:54:21 +0800 [thread overview]
Message-ID: <52CA612D.2000902@redhat.com> (raw)
In-Reply-To: <52CA5CDA.1020503@gmail.com>
On 01/06/2014 03:35 PM, John Fastabend wrote:
> On 01/05/2014 07:21 PM, Jason Wang wrote:
>> L2 fowarding offload will bypass the rx handler of real device. This
>> will make
>> the packet could not be forwarded to macvtap device. Another problem
>> is the
>> dev_hard_start_xmit() called for macvtap does not have any
>> synchronization.
>>
>> Fix this by forbidding L2 forwarding for macvtap.
>>
>> Cc: John Fastabend <john.r.fastabend@intel.com>
>> Cc: Neil Horman <nhorman@tuxdriver.com>
>> Signed-off-by: Jason Wang <jasowang@redhat.com>
>> ---
>> drivers/net/macvlan.c | 5 ++++-
>> 1 files changed, 4 insertions(+), 1 deletions(-)
>>
>
> I must be missing something.
>
> The lower layer device should set skb->dev to the correct macvtap
> device on receive so that in netif_receive_skb_core() the macvtap
> handler is hit. Skipping the macvlan receive handler should be OK
> because the switching was done by the hardware. If I read macvtap.c
> correctly macvlan_common_newlink() is called with 'dev' where 'dev'
> is the macvtap device. Any idea what I'm missing? I guess I'll need
> to setup a macvtap test case.
Unlike macvlan, macvtap depends on rx handler on the lower device to
work. In this case macvlan_handle_frame() will call macvtap_receive().
So doing netif_receive_skb_core() for macvtap device directly won't work
since we need to forward the packet to userspace instead of kernel.
For net-next.git, it may work since commit
6acf54f1cf0a6747bac9fea26f34cfc5a9029523 let macvtap device register an
rx handler for itself.
>
> And what synchronization are you worried about on dev_hard_start_xmit()?
> In the L2 forwarding offload case macvlan_open() clears the NETIF_F_LLTX
> flag so HARD_TX_LOCK protects the driver txq. We might hit this warning
> in dev_queue_xmit() though,
>
> net_crit_ratelimited("Virtual device %s asks to queue packet!\n",
>
> Perhaps we can remove it.
The problem is macvtap does not call dev_queue_xmit() for macvlan
device. It calls macvlan_start_xmit() directly from macvtap_get_user().
So HARD_TX_LOCK was not done for the txq.
>
>> diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
>> index 60406b0..5360f73 100644
>> --- a/drivers/net/macvlan.c
>> +++ b/drivers/net/macvlan.c
>> @@ -338,6 +338,8 @@ static const struct header_ops
>> macvlan_hard_header_ops = {
>> .cache_update = eth_header_cache_update,
>> };
>>
>> +static struct rtnl_link_ops macvlan_link_ops;
>> +
>> static int macvlan_open(struct net_device *dev)
>> {
>> struct macvlan_dev *vlan = netdev_priv(dev);
>> @@ -353,7 +355,8 @@ static int macvlan_open(struct net_device *dev)
>> goto hash_add;
>> }
>>
>> - if (lowerdev->features & NETIF_F_HW_L2FW_DOFFLOAD) {
>> + if (lowerdev->features & NETIF_F_HW_L2FW_DOFFLOAD &&
>> + dev->rtnl_link_ops == &macvlan_link_ops) {
>> vlan->fwd_priv =
>> lowerdev->netdev_ops->ndo_dfwd_add_station(lowerdev,
>> dev);
>>
>>
>
>
next prev parent reply other threads:[~2014-01-06 7:54 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-06 3:21 [PATCH net 1/2] macvlan: forbid L2 fowarding offload for macvtap Jason Wang
2014-01-06 3:21 ` [PATCH net 2/2] net: core: explicitly select a txq before doing l2 forwarding Jason Wang
2014-01-06 3:21 ` Jason Wang
2014-01-06 12:04 ` [E1000-devel] " Jeff Kirsher
2014-01-06 12:04 ` Jeff Kirsher
2014-01-06 12:42 ` Neil Horman
2014-01-06 15:06 ` John Fastabend
2014-01-06 15:06 ` John Fastabend
2014-01-06 15:29 ` Neil Horman
2014-01-06 15:29 ` Neil Horman
2014-01-07 3:42 ` Jason Wang
2014-01-07 3:42 ` Jason Wang
2014-01-07 13:17 ` Neil Horman
2014-01-08 3:21 ` Jason Wang
2014-01-08 3:21 ` Jason Wang
2014-01-08 14:40 ` Neil Horman
2014-01-09 8:28 ` Jason Wang
2014-01-09 8:28 ` Jason Wang
2014-01-09 11:53 ` Neil Horman
2014-01-09 11:53 ` Neil Horman
2014-01-07 8:22 ` John Fastabend
2014-01-07 8:37 ` John Fastabend
2014-01-06 7:35 ` [PATCH net 1/2] macvlan: forbid L2 fowarding offload for macvtap John Fastabend
2014-01-06 7:54 ` Jason Wang [this message]
2014-01-06 12:26 ` Neil Horman
2014-01-07 3:10 ` Jason Wang
2014-01-07 5:15 ` John Fastabend
2014-01-07 6:22 ` Jason Wang
2014-01-07 7:26 ` John Fastabend
2014-01-07 9:00 ` Jason Wang
2014-01-08 12:55 ` Michael S. Tsirkin
2014-01-08 19:05 ` John Fastabend
2014-01-09 7:17 ` Michael S. Tsirkin
2014-01-09 8:55 ` Jason Wang
2014-01-09 21:39 ` Stephen Hemminger
2014-01-09 22:03 ` Michael S. Tsirkin
2014-01-09 22:20 ` Stephen Hemminger
2014-01-10 7:06 ` Jason Wang
2014-01-10 16:40 ` Vlad Yasevich
2014-01-07 5:16 ` John Fastabend
2014-01-06 20:47 ` David Miller
2014-01-07 3:17 ` Jason Wang
2014-01-07 5:57 ` 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=52CA612D.2000902@redhat.com \
--to=jasowang@redhat.com \
--cc=davem@davemloft.net \
--cc=john.fastabend@gmail.com \
--cc=john.r.fastabend@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=nhorman@tuxdriver.com \
/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.