|
@@ -308,6 +308,8 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
|
|
|
struct vhost_virtqueue *vq = ubufs->vq;
|
|
|
int cnt;
|
|
|
|
|
|
+ rcu_read_lock_bh();
|
|
|
+
|
|
|
/* set len to mark this desc buffers done DMA */
|
|
|
vq->heads[ubuf->desc].len = success ?
|
|
|
VHOST_DMA_DONE_LEN : VHOST_DMA_FAILED_LEN;
|
|
@@ -322,6 +324,8 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
|
|
|
*/
|
|
|
if (cnt <= 1 || !(cnt % 16))
|
|
|
vhost_poll_queue(&vq->poll);
|
|
|
+
|
|
|
+ rcu_read_unlock_bh();
|
|
|
}
|
|
|
|
|
|
/* Expects to be always run from workqueue - which acts as
|
|
@@ -799,6 +803,8 @@ static int vhost_net_release(struct inode *inode, struct file *f)
|
|
|
fput(tx_sock->file);
|
|
|
if (rx_sock)
|
|
|
fput(rx_sock->file);
|
|
|
+ /* Make sure no callbacks are outstanding */
|
|
|
+ synchronize_rcu_bh();
|
|
|
/* We do an extra flush before freeing memory,
|
|
|
* since jobs can re-queue themselves. */
|
|
|
vhost_net_flush(n);
|