mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
vhost-net: vhost-kernel: introduce vhost_net_virtqueue_reset()
Introduce vhost_virtqueue_reset(), which can reset the specific virtqueue in the device. Then it will unmap vrings and the desc of the virtqueue. Here we do not reuse the vhost_net_stop_one() or vhost_dev_stop(), because they work at queue pair level. We do not use vhost_virtqueue_stop() because it may stop the device in the backend. This patch only considers the case of vhost-kernel, when NetClientDriver is NET_CLIENT_DRIVER_TAP. Furthermore, we do not need net->nc->info->poll() because it enables userspace datapath and we want to stop all datapaths for this reset virtqueue here. Signed-off-by: Kangjie Xu <kangjie.xu@linux.alibaba.com> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Acked-by: Jason Wang <jasowang@redhat.com> Message-Id: <20221017092558.111082-10-xuanzhuo@linux.alibaba.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
e1f101d9f6
commit
c2daa08e17
3 changed files with 33 additions and 0 deletions
|
@ -101,3 +101,9 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vhost_net_virtqueue_reset(VirtIODevice *vdev, NetClientState *nc,
|
||||||
|
int vq_index)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -531,3 +531,28 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu)
|
||||||
|
|
||||||
return vhost_ops->vhost_net_set_mtu(&net->dev, mtu);
|
return vhost_ops->vhost_net_set_mtu(&net->dev, mtu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vhost_net_virtqueue_reset(VirtIODevice *vdev, NetClientState *nc,
|
||||||
|
int vq_index)
|
||||||
|
{
|
||||||
|
VHostNetState *net = get_vhost_net(nc->peer);
|
||||||
|
const VhostOps *vhost_ops = net->dev.vhost_ops;
|
||||||
|
struct vhost_vring_file file = { .fd = -1 };
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
/* should only be called after backend is connected */
|
||||||
|
assert(vhost_ops);
|
||||||
|
|
||||||
|
idx = vhost_ops->vhost_get_vq_index(&net->dev, vq_index);
|
||||||
|
|
||||||
|
if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) {
|
||||||
|
file.index = idx;
|
||||||
|
int r = vhost_net_set_backend(&net->dev, &file);
|
||||||
|
assert(r >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
vhost_virtqueue_stop(&net->dev,
|
||||||
|
vdev,
|
||||||
|
net->dev.vqs + idx,
|
||||||
|
net->dev.vq_index + idx);
|
||||||
|
}
|
||||||
|
|
|
@ -48,4 +48,6 @@ uint64_t vhost_net_get_acked_features(VHostNetState *net);
|
||||||
|
|
||||||
int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu);
|
int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu);
|
||||||
|
|
||||||
|
void vhost_net_virtqueue_reset(VirtIODevice *vdev, NetClientState *nc,
|
||||||
|
int vq_index);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue