xen/netback: Wake dealloc thread after completing zerocopy work
Waking the dealloc thread before decrementing inflight_packets is racy because it means the thread may go to sleep before inflight_packets is decremented. If kthread_stop() has already been called, the dealloc thread may wait forever with nothing to wake it. Instead, wake the thread only after decrementing inflight_packets. Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a0a2a66024
commit
57b229063a
@ -61,6 +61,12 @@ void xenvif_skb_zerocopy_prepare(struct xenvif_queue *queue,
|
||||
void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue)
|
||||
{
|
||||
atomic_dec(&queue->inflight_packets);
|
||||
|
||||
/* Wake the dealloc thread _after_ decrementing inflight_packets so
|
||||
* that if kthread_stop() has already been called, the dealloc thread
|
||||
* does not wait forever with nothing to wake it.
|
||||
*/
|
||||
wake_up(&queue->dealloc_wq);
|
||||
}
|
||||
|
||||
int xenvif_schedulable(struct xenvif *vif)
|
||||
|
@ -1541,7 +1541,6 @@ void xenvif_zerocopy_callback(struct ubuf_info *ubuf, bool zerocopy_success)
|
||||
smp_wmb();
|
||||
queue->dealloc_prod++;
|
||||
} while (ubuf);
|
||||
wake_up(&queue->dealloc_wq);
|
||||
spin_unlock_irqrestore(&queue->callback_lock, flags);
|
||||
|
||||
if (likely(zerocopy_success))
|
||||
|
Loading…
Reference in New Issue
Block a user