X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fnet%2Fifb.c;h=ccbd6554f6eb922e1211f12fdd74bf028287e13d;hb=2aec609fb45e84d65bc8eabc7b650bbecb1cc179;hp=15949d3df17e082726033593ae0246ce57e3191f;hpb=347c53dca73fca317d57781f510f5ff4f6c0d0d7;p=linux-2.6 diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c index 15949d3df1..ccbd6554f6 100644 --- a/drivers/net/ifb.c +++ b/drivers/net/ifb.c @@ -35,6 +35,7 @@ #include #include #include +#include #define TX_TIMEOUT (2*HZ) @@ -227,6 +228,16 @@ static struct rtnl_link_ops ifb_link_ops __read_mostly = { module_param(numifbs, int, 0); MODULE_PARM_DESC(numifbs, "Number of ifb devices"); +/* + * dev_ifb->tx_queue.lock is usually taken after dev->rx_queue.lock, + * reversely to e.g. qdisc_lock_tree(). It should be safe until + * ifb doesn't take dev->tx_queue.lock with dev_ifb->rx_queue.lock. + * But lockdep should know that ifb has different locks from dev. + */ +static struct lock_class_key ifb_tx_queue_lock_key; +static struct lock_class_key ifb_rx_queue_lock_key; + + static int __init ifb_init_one(int index) { struct net_device *dev_ifb; @@ -246,6 +257,10 @@ static int __init ifb_init_one(int index) err = register_netdevice(dev_ifb); if (err < 0) goto err; + + lockdep_set_class(&dev_ifb->tx_queue.lock, &ifb_tx_queue_lock_key); + lockdep_set_class(&dev_ifb->rx_queue.lock, &ifb_rx_queue_lock_key); + return 0; err: