Re: Kernel WARNING: at net/core/dev.c:1330 __netif_schedule+0x2c/0x98()

Jarek Poplawski
2008-07-25T18:36:06Z

On Fri, Jul 25, 2008 at 07:04:36PM +0200, Ingo Oeser wrote:
...
> I'm sure as hell, I miss sth. but can't it be done by this pseudo-code:

...And I really doubt it can't be done like this.

Jarek P.

>
> netif_tx_lock(device)
> {
> mutex_lock(device->queue_entry_mutex);
> foreach_queue_entries(queue, device->queues)
> {
> spin_lock(queue->tx_lock);
> set_noop_tx_handler(queue);
> spin_unlock(queue->tx_lock);
> }
> mutex_unlock(device->queue_entry_mutex);
> }
>
> netif_tx_unlock(device)
> {
> mutex_lock(device->queue_entry_mutex);
> foreach_queue_entries(queue, device->queues)
> {
> spin_lock(queue->tx_lock);
> set_useful_tx_handler(queue);
> spin_unlock(queue->tx_lock);
> }
> mutex_unlock(device->queue_entry_mutex);
> }
>
> Then protect use of the queues by queue->tx_lock in transmit path.
> The first setup of the queue doesn't need to be protected, since no-one
> knows the device. The final cleanup of the device doesn't need to be
> protected either, because netif_tx_lock() and netif_tx_unlock() should
> not be called after entering the final cleanup.
>
> Some VM locking works this way...
>
>
> Best Regards
>
> Ingo Oeser