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
@ -101,3 +101,9 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
void vhost_net_virtqueue_reset(VirtIODevice *vdev, NetClientState *nc,
|
||||
int vq_index);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user