[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20070319.192206.21926062.davem@davemloft.net>
Date: Mon, 19 Mar 2007 19:22:06 -0700 (PDT)
From: David Miller <davem@...emloft.net>
To: chris@...lexsecurity.com
Cc: netdev@...r.kernel.org, hadi@...erus.ca, tgraf@...g.ch
Subject: Re: Oops in filter add
From: Chris Madden <chris@...lexsecurity.com>
Date: Mon, 19 Mar 2007 16:10:29 -0400
> I did some digging, and it appears the filter add isn't mutexed right.
> Inside net/core/dev.c, ing_filter, I see:
>
> spin_lock(&dev->ingress_lock);
> if ((q = dev->qdisc_ingress) != NULL)
> result = q->enqueue(skb, q);
> spin_unlock(&dev->ingress_lock);
>
> And unless I'm missing something, this is the only place this lock is
> used ( other than initialization ). In net/sched/cls_api.c, I see we do
> qdisc_lock_tree/qdisc_unlock_tree (which locks dev->queue_lock). As
> near as I can tell, this is our problem ( our mutexes don't prohibit
> manipulation while packets are flowing ).
I think this should use dev->queue_lock.
It looks like the idea might have been to allow more parallelized
running of ingress filters, but this is done wrong and leads to
the crashes you are seeing.
Can you just replace the above with dev->queue_lock and see if
that makes your problem go away? THanks.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists