mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-14 13:39:10 +00:00
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)
|
void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue)
|
||||||
{
|
{
|
||||||
atomic_dec(&queue->inflight_packets);
|
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)
|
int xenvif_schedulable(struct xenvif *vif)
|
||||||
|
@ -1541,7 +1541,6 @@ void xenvif_zerocopy_callback(struct ubuf_info *ubuf, bool zerocopy_success)
|
|||||||
smp_wmb();
|
smp_wmb();
|
||||||
queue->dealloc_prod++;
|
queue->dealloc_prod++;
|
||||||
} while (ubuf);
|
} while (ubuf);
|
||||||
wake_up(&queue->dealloc_wq);
|
|
||||||
spin_unlock_irqrestore(&queue->callback_lock, flags);
|
spin_unlock_irqrestore(&queue->callback_lock, flags);
|
||||||
|
|
||||||
if (likely(zerocopy_success))
|
if (likely(zerocopy_success))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user