From: Patrick McHardy <kaber@trash.net>
To: Jesper Dangaard Brouer <hawk@diku.dk>
Cc: Jesper Dangaard Brouer <jdb@comx.dk>,
"netdev@vger.kernel.org" <netdev@vger.kernel.org>
Subject: Re: Bisect'ed BUG in VLAN promisc mode (6c78dcbd47)
Date: Mon, 06 Oct 2008 13:03:26 +0200 [thread overview]
Message-ID: <48E9F07E.9060609@trash.net> (raw)
In-Reply-To: <Pine.LNX.4.64.0810021835390.8590@tyr.diku.dk>
[-- Attachment #1: Type: text/plain, Size: 204 bytes --]
Jesper Dangaard Brouer wrote:
>
> Here is a quick fix for the bug...
> Patrick promised he would do a more clean fix later ;-)
And here it is. Could you verify that it also fixes the problem?
Thanks!
[-- Attachment #2: x --]
[-- Type: text/plain, Size: 2701 bytes --]
commit 79a95e393b63c26f270c676075b95c9421d3faba
Author: Patrick McHardy <kaber@trash.net>
Date: Mon Oct 6 13:01:26 2008 +0200
net: only invoke dev->change_rx_flags when device is UP
Jesper Dangaard Brouer <hawk@comx.dk> reported a bug when setting a VLAN
device down that is in promiscous mode:
When the VLAN device is set down, the promiscous count on the real
device is decremented by one by vlan_dev_stop(). When removing the
promiscous flag from the VLAN device afterwards, the promiscous
count on the real device is decremented a second time by the
vlan_change_rx_flags() callback.
The root cause for this is that the ->change_rx_flags() callback is
invoked while the device is down. The synchronization is meant to mirror
the behaviour of the ->set_rx_mode callbacks, meaning the ->open function
is responsible for doing a full sync on open, the ->close() function is
responsible for doing full cleanup on ->stop() and ->change_rx_flags()
is meant to do incremental changes while the device is UP.
Only invoke ->change_rx_flags() while the device is UP to provide the
intended behaviour.
Signed-off-by: Patrick McHardy <kaber@trash.net>
diff --git a/net/core/dev.c b/net/core/dev.c
index e8eb2b4..fd992c0 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2918,6 +2918,12 @@ int netdev_set_master(struct net_device *slave, struct net_device *master)
return 0;
}
+static void dev_change_rx_flags(struct net_device *dev, int flags)
+{
+ if (dev->flags & IFF_UP && dev->change_rx_flags)
+ dev->change_rx_flags(dev, flags);
+}
+
static int __dev_set_promiscuity(struct net_device *dev, int inc)
{
unsigned short old_flags = dev->flags;
@@ -2955,8 +2961,7 @@ static int __dev_set_promiscuity(struct net_device *dev, int inc)
current->uid, current->gid,
audit_get_sessionid(current));
- if (dev->change_rx_flags)
- dev->change_rx_flags(dev, IFF_PROMISC);
+ dev_change_rx_flags(dev, IFF_PROMISC);
}
return 0;
}
@@ -3022,8 +3027,7 @@ int dev_set_allmulti(struct net_device *dev, int inc)
}
}
if (dev->flags ^ old_flags) {
- if (dev->change_rx_flags)
- dev->change_rx_flags(dev, IFF_ALLMULTI);
+ dev_change_rx_flags(dev, IFF_ALLMULTI);
dev_set_rx_mode(dev);
}
return 0;
@@ -3347,8 +3351,8 @@ int dev_change_flags(struct net_device *dev, unsigned flags)
* Load in the correct multicast list now the flags have changed.
*/
- if (dev->change_rx_flags && (old_flags ^ flags) & IFF_MULTICAST)
- dev->change_rx_flags(dev, IFF_MULTICAST);
+ if ((old_flags ^ flags) & IFF_MULTICAST)
+ dev_change_rx_flags(dev, IFF_MULTICAST);
dev_set_rx_mode(dev);
next prev parent reply other threads:[~2008-10-06 11:03 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-26 14:00 Bisect'ed BUG in VLAN promisc mode (6c78dcbd47) Jesper Dangaard Brouer
2008-09-26 16:14 ` Patrick McHardy
2008-09-26 19:22 ` Jesper Dangaard Brouer
2008-09-26 19:24 ` Patrick McHardy
2008-09-26 19:28 ` Patrick McHardy
2008-09-26 19:34 ` Jesper Dangaard Brouer
2008-09-26 19:41 ` Patrick McHardy
2008-09-26 20:10 ` Patrick McHardy
2008-10-02 16:38 ` Jesper Dangaard Brouer
2008-10-06 11:03 ` Patrick McHardy [this message]
2008-10-07 11:03 ` Jesper Dangaard Brouer
2008-10-07 11:10 ` Patrick McHardy
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=48E9F07E.9060609@trash.net \
--to=kaber@trash.net \
--cc=hawk@diku.dk \
--cc=jdb@comx.dk \
--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 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).