Le lundi 20 septembre 2010 Ã 11:27 -0700, David Miller a Ãcrit : > From: Michal Nazarewicz <m.nazarewicz@xxxxxxxxxxx> > Date: Mon, 20 Sep 2010 20:23:04 +0200 > > > This commit removes the call to dev_get_stats() from the > > gen_ndis_query_resp() function. Since spin_lock_bh() was > > added to dev_txq_stats_fold() the call started causing > > warnings. This is because gen_ndis_query_resp() can be > > (indirectly) called from rndis_command_complete() which is > > called with interrupts disabled. > > > > While at it, this commit also changes the > > gen_ndis_query_resp() function so that "net" local variable is > > used instead of "rndis_per_dev_params[configNr].dev" in all > > places this is referenced. > > > > Signed-off-by: Michal Nazarewicz <m.nazarewicz@xxxxxxxxxxx> > > The way this works is dev_get_stats() takes that "temp" object the > caller provides, it writes the correct statistics into it (with any > necessary translations), and then passes back a pointer to it. > > See net/core/dev.c:dev_get_stats() > > You must use dev_get_stats() or else the statistics won't be properly > converted. > > Like I originally suggested, you need to rearrange the code in this > driver such that the gen_ndis_query_resp() work happens in a tasklet, > workqueue, or some other non-hardware-irq context. Hmm, maybe its a bit difficult to fix this problem for stable kernel. What we could do is assume rndis wont use a device driver that actually needs txq tx stats folding, and just use following interim patch ? diff --git a/net/core/dev.c b/net/core/dev.c index b9b22a3..31d5424 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -5288,6 +5288,14 @@ void dev_txq_stats_fold(const struct net_device *dev, unsigned int i; struct netdev_queue *txq; + /* temporary hack : rndis calls us under hard irq */ + if (WARN_ON_ONCE(in_irq())) { + stats->tx_bytes = dev->stats.tx_bytes; + stats->tx_packets = dev->stats.tx_packets; + stats->tx_dropped = dev->stats.tx_dropped; + return; + } + for (i = 0; i < dev->num_tx_queues; i++) { txq = netdev_get_tx_queue(dev, i); spin_lock_bh(&txq->_xmit_lock); -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html