Re: [PATCH v2 11/24] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_stop()
在 2022/8/24 11:33, Kangjie Xu 写道: 在 2022/8/24 10:40, Jason Wang 写道: 在 2022/8/16 09:06, Kangjie Xu 写道: Introduce vhost_virtqueue_stop(), which can reset the virtqueue in the device. Then it will unmap vrings and the desc of the virtqueue. This patch only considers the case for vhost-kernel, when NetClientDriver is NET_CLIENT_DRIVER_TAP. Signed-off-by: Kangjie Xu Signed-off-by: Xuan Zhuo --- hw/net/vhost_net.c | 21 + include/net/vhost_net.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index ccac5b7a64..aa60dd901c 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -514,3 +514,24 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu) return vhost_ops->vhost_net_set_mtu(>dev, mtu); } + +void vhost_net_virtqueue_stop(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; + + assert(vhost_ops); + + idx = vhost_ops->vhost_get_vq_index(>dev, vq_index); + + if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) { + file.index = idx; + int r = vhost_net_set_backend(>dev, ); + assert(r >= 0); + } Let's have a vhost_ops here instead of open code it. Thanks I double-checked it, vhost_net_set_backend is already a wrapper of vhost_ops->vhost_net_set_backend(). It seems that, to further simplify it, we can only add idx and fd to the parameter list of vhost_net_set_backend(). Ok, so we can leave it as is. (Probably need a vhost_net_ops in the future). Thanks Thanks + + vhost_dev_virtqueue_stop(>dev, vdev, idx); +} diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index 387e913e4e..9b3aaf3814 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -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_stop(VirtIODevice *vdev, NetClientState *nc, + int vq_index); #endif
Re: [PATCH v2 11/24] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_stop()
在 2022/8/24 10:40, Jason Wang 写道: 在 2022/8/16 09:06, Kangjie Xu 写道: Introduce vhost_virtqueue_stop(), which can reset the virtqueue in the device. Then it will unmap vrings and the desc of the virtqueue. This patch only considers the case for vhost-kernel, when NetClientDriver is NET_CLIENT_DRIVER_TAP. Signed-off-by: Kangjie Xu Signed-off-by: Xuan Zhuo --- hw/net/vhost_net.c | 21 + include/net/vhost_net.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index ccac5b7a64..aa60dd901c 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -514,3 +514,24 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu) return vhost_ops->vhost_net_set_mtu(>dev, mtu); } + +void vhost_net_virtqueue_stop(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; + + assert(vhost_ops); + + idx = vhost_ops->vhost_get_vq_index(>dev, vq_index); + + if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) { + file.index = idx; + int r = vhost_net_set_backend(>dev, ); + assert(r >= 0); + } Let's have a vhost_ops here instead of open code it. Thanks I double-checked it, vhost_net_set_backend is already a wrapper of vhost_ops->vhost_net_set_backend(). It seems that, to further simplify it, we can only add idx and fd to the parameter list of vhost_net_set_backend(). Thanks + + vhost_dev_virtqueue_stop(>dev, vdev, idx); +} diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index 387e913e4e..9b3aaf3814 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -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_stop(VirtIODevice *vdev, NetClientState *nc, + int vq_index); #endif
Re: [PATCH v2 11/24] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_stop()
在 2022/8/24 10:40, Jason Wang 写道: 在 2022/8/16 09:06, Kangjie Xu 写道: Introduce vhost_virtqueue_stop(), which can reset the virtqueue in the device. Then it will unmap vrings and the desc of the virtqueue. This patch only considers the case for vhost-kernel, when NetClientDriver is NET_CLIENT_DRIVER_TAP. Signed-off-by: Kangjie Xu Signed-off-by: Xuan Zhuo --- hw/net/vhost_net.c | 21 + include/net/vhost_net.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index ccac5b7a64..aa60dd901c 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -514,3 +514,24 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu) return vhost_ops->vhost_net_set_mtu(>dev, mtu); } + +void vhost_net_virtqueue_stop(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; + + assert(vhost_ops); + + idx = vhost_ops->vhost_get_vq_index(>dev, vq_index); + + if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) { + file.index = idx; + int r = vhost_net_set_backend(>dev, ); + assert(r >= 0); + } Let's have a vhost_ops here instead of open code it. Thanks I share your view. Thanks + + vhost_dev_virtqueue_stop(>dev, vdev, idx); +} diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index 387e913e4e..9b3aaf3814 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -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_stop(VirtIODevice *vdev, NetClientState *nc, + int vq_index); #endif
Re: [PATCH v2 11/24] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_stop()
在 2022/8/16 09:06, Kangjie Xu 写道: Introduce vhost_virtqueue_stop(), which can reset the virtqueue in the device. Then it will unmap vrings and the desc of the virtqueue. This patch only considers the case for vhost-kernel, when NetClientDriver is NET_CLIENT_DRIVER_TAP. Signed-off-by: Kangjie Xu Signed-off-by: Xuan Zhuo --- hw/net/vhost_net.c | 21 + include/net/vhost_net.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index ccac5b7a64..aa60dd901c 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -514,3 +514,24 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu) return vhost_ops->vhost_net_set_mtu(>dev, mtu); } + +void vhost_net_virtqueue_stop(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; + +assert(vhost_ops); + +idx = vhost_ops->vhost_get_vq_index(>dev, vq_index); + +if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) { +file.index = idx; +int r = vhost_net_set_backend(>dev, ); +assert(r >= 0); +} Let's have a vhost_ops here instead of open code it. Thanks + +vhost_dev_virtqueue_stop(>dev, vdev, idx); +} diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index 387e913e4e..9b3aaf3814 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -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_stop(VirtIODevice *vdev, NetClientState *nc, + int vq_index); #endif
[PATCH v2 11/24] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_stop()
Introduce vhost_virtqueue_stop(), which can reset the virtqueue in the device. Then it will unmap vrings and the desc of the virtqueue. This patch only considers the case for vhost-kernel, when NetClientDriver is NET_CLIENT_DRIVER_TAP. Signed-off-by: Kangjie Xu Signed-off-by: Xuan Zhuo --- hw/net/vhost_net.c | 21 + include/net/vhost_net.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index ccac5b7a64..aa60dd901c 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -514,3 +514,24 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu) return vhost_ops->vhost_net_set_mtu(>dev, mtu); } + +void vhost_net_virtqueue_stop(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; + +assert(vhost_ops); + +idx = vhost_ops->vhost_get_vq_index(>dev, vq_index); + +if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) { +file.index = idx; +int r = vhost_net_set_backend(>dev, ); +assert(r >= 0); +} + +vhost_dev_virtqueue_stop(>dev, vdev, idx); +} diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index 387e913e4e..9b3aaf3814 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -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_stop(VirtIODevice *vdev, NetClientState *nc, + int vq_index); #endif -- 2.32.0