All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wang Chen <wangchen@cn.fujitsu.com>
To: David Miller <davem@davemloft.net>
Cc: kaber@trash.net, netdev@vger.kernel.org
Subject: [PATCH] af_packet: po->mclist needs locker in reader side(WAS: [PATCH 1/9] af_packet: Check return of dev_set_promiscuity/allmulti)
Date: Tue, 15 Jul 2008 15:52:31 +0800	[thread overview]
Message-ID: <487C573F.3020803@cn.fujitsu.com> (raw)
In-Reply-To: <20080714.205110.266962405.davem@davemloft.net>

David Miller said the following on 2008-7-15 11:51:
> From: Wang Chen <wangchen@cn.fujitsu.com>
> Date: Tue, 15 Jul 2008 10:59:09 +0800
> 
>> dev_set_promiscuity/allmulti might overflow.
>> Commit: "netdevice: Fix promiscuity and allmulti overflow" in net-next makes
>> dev_set_promiscuity/allmulti return error number if overflow happened.
>>
>> In af_packet, we check all positive increment for promiscuity and allmulti
>> to get error return.
>>
>> Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com>
>> Acked-by: Patrick McHardy <kaber@trash.net> 
> 
> Applied, thanks.
> 
> What are the exact locking rules for po->mclist btw?  Obviously
> changes to the list are RTNL protected, but what about readers?
> 
> If readers lock differently, this error recovery where we unlink 'i'
> could cause an OOPS.  It is ok to add new elements while allowing
> readers to traverse independantly but removal needs to interlock with
> such readers.

As my understanding, packet_dev_mclist() is the only reader who doesn't
use same lock as writers(actually it doesn't use any lock).
My proposal is that use RTNL to prevent synchronous access to po->mclist.
Because packet_dev_mclist() is only called when device be unregistered,
the lock will not affect speed too much. 

Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com>
---
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 2cee87d..9eb39f7 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1196,10 +1196,12 @@ static void packet_dev_mc(struct net_device *dev, struct packet_mclist *i, int w
 
 static void packet_dev_mclist(struct net_device *dev, struct packet_mclist *i, int what)
 {
+	rtnl_lock();
 	for ( ; i; i=i->next) {
 		if (i->ifindex == dev->ifindex)
 			packet_dev_mc(dev, i, what);
 	}
+	rtnl_unlock();
 }
 
 static int packet_mc_add(struct sock *sk, struct packet_mreq_max *mreq)


  reply	other threads:[~2008-07-15  7:57 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <487C0ABA.1070506@cn.fujitsu.com>
2008-07-15  2:59 ` v4 [PATCH 1/9] af_packet: Check return of dev_set_promiscuity/allmulti Wang Chen
2008-07-15  3:51   ` David Miller
2008-07-15  7:52     ` Wang Chen [this message]
2008-07-15  9:11       ` [PATCH] af_packet: po->mclist needs locker in reader side David Miller
2008-07-15 10:32         ` Wang Chen
2008-07-15  2:59 ` v4 [PATCH 2/9] bonding: Check return of dev_set_promiscuity/allmulti Wang Chen
2008-07-15  3:51   ` David Miller
2008-07-15  2:59 ` v4 [PATCH 3/9] bridge: Check return of dev_set_promiscuity Wang Chen
2008-07-15  3:54   ` David Miller
2008-07-15  2:59 ` v4 [PATCH 4/9] ipv6: Check return of dev_set_allmulti Wang Chen
2008-07-15  3:54   ` David Miller
2008-07-15  2:59 ` v4 [PATCH 5/9] ipv6: Fix using after dev_put() Wang Chen
2008-07-15  3:55   ` David Miller
2008-07-15  2:59 ` v4 [PATCH 6/9] ipv4: Check return of dev_set_allmulti Wang Chen
2008-07-15  3:55   ` David Miller
2008-07-15  2:59 ` v4 [PATCH 7/9] ipv4: Fix ipmr unregister device oops Wang Chen
2008-07-15  3:56   ` David Miller
2008-07-15  2:59 ` v4 [PATCH 8/9] macvlan: Check return of dev_set_allmulti Wang Chen
2008-07-15  3:57   ` David Miller
2008-07-15  2:59 ` v4 [PATCH 9/9] 8021q: Check return of dev_set_promiscuity/allmulti Wang Chen
2008-07-15  4:00   ` David Miller
2008-07-15  6:04     ` Wang Chen
2008-07-17  5:41       ` git clone net-next-2.6 Wang Chen

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=487C573F.3020803@cn.fujitsu.com \
    --to=wangchen@cn.fujitsu.com \
    --cc=davem@davemloft.net \
    --cc=kaber@trash.net \
    --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.