vhost: add method vhost_set_vring_err

Kernel and user vhost may report virtqueue errors via eventfd.
This is only reliable way to get notification about protocol error.

Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Message-Id: <20220623161325.18813-2-vsementsov@yandex-team.ru>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Roman Kagan <rvkagan@yandex-team.ru>
This commit is contained in:
Konstantin Khlebnikov 2022-06-23 19:13:24 +03:00 committed by Michael S. Tsirkin
parent 71e3d00482
commit 60dc3c5be9
3 changed files with 16 additions and 0 deletions

View File

@ -146,6 +146,12 @@ static int vhost_kernel_set_vring_call(struct vhost_dev *dev,
return vhost_kernel_call(dev, VHOST_SET_VRING_CALL, file); return vhost_kernel_call(dev, VHOST_SET_VRING_CALL, file);
} }
static int vhost_kernel_set_vring_err(struct vhost_dev *dev,
struct vhost_vring_file *file)
{
return vhost_kernel_call(dev, VHOST_SET_VRING_ERR, file);
}
static int vhost_kernel_set_vring_busyloop_timeout(struct vhost_dev *dev, static int vhost_kernel_set_vring_busyloop_timeout(struct vhost_dev *dev,
struct vhost_vring_state *s) struct vhost_vring_state *s)
{ {
@ -309,6 +315,7 @@ const VhostOps kernel_ops = {
.vhost_get_vring_base = vhost_kernel_get_vring_base, .vhost_get_vring_base = vhost_kernel_get_vring_base,
.vhost_set_vring_kick = vhost_kernel_set_vring_kick, .vhost_set_vring_kick = vhost_kernel_set_vring_kick,
.vhost_set_vring_call = vhost_kernel_set_vring_call, .vhost_set_vring_call = vhost_kernel_set_vring_call,
.vhost_set_vring_err = vhost_kernel_set_vring_err,
.vhost_set_vring_busyloop_timeout = .vhost_set_vring_busyloop_timeout =
vhost_kernel_set_vring_busyloop_timeout, vhost_kernel_set_vring_busyloop_timeout,
.vhost_set_features = vhost_kernel_set_features, .vhost_set_features = vhost_kernel_set_features,

View File

@ -1313,6 +1313,11 @@ static int vhost_user_set_vring_call(struct vhost_dev *dev,
return vhost_set_vring_file(dev, VHOST_USER_SET_VRING_CALL, file); return vhost_set_vring_file(dev, VHOST_USER_SET_VRING_CALL, file);
} }
static int vhost_user_set_vring_err(struct vhost_dev *dev,
struct vhost_vring_file *file)
{
return vhost_set_vring_file(dev, VHOST_USER_SET_VRING_ERR, file);
}
static int vhost_user_get_u64(struct vhost_dev *dev, int request, uint64_t *u64) static int vhost_user_get_u64(struct vhost_dev *dev, int request, uint64_t *u64)
{ {
@ -2616,6 +2621,7 @@ const VhostOps user_ops = {
.vhost_get_vring_base = vhost_user_get_vring_base, .vhost_get_vring_base = vhost_user_get_vring_base,
.vhost_set_vring_kick = vhost_user_set_vring_kick, .vhost_set_vring_kick = vhost_user_set_vring_kick,
.vhost_set_vring_call = vhost_user_set_vring_call, .vhost_set_vring_call = vhost_user_set_vring_call,
.vhost_set_vring_err = vhost_user_set_vring_err,
.vhost_set_features = vhost_user_set_features, .vhost_set_features = vhost_user_set_features,
.vhost_get_features = vhost_user_get_features, .vhost_get_features = vhost_user_get_features,
.vhost_set_owner = vhost_user_set_owner, .vhost_set_owner = vhost_user_set_owner,

View File

@ -69,6 +69,8 @@ typedef int (*vhost_set_vring_kick_op)(struct vhost_dev *dev,
struct vhost_vring_file *file); struct vhost_vring_file *file);
typedef int (*vhost_set_vring_call_op)(struct vhost_dev *dev, typedef int (*vhost_set_vring_call_op)(struct vhost_dev *dev,
struct vhost_vring_file *file); struct vhost_vring_file *file);
typedef int (*vhost_set_vring_err_op)(struct vhost_dev *dev,
struct vhost_vring_file *file);
typedef int (*vhost_set_vring_busyloop_timeout_op)(struct vhost_dev *dev, typedef int (*vhost_set_vring_busyloop_timeout_op)(struct vhost_dev *dev,
struct vhost_vring_state *r); struct vhost_vring_state *r);
typedef int (*vhost_set_features_op)(struct vhost_dev *dev, typedef int (*vhost_set_features_op)(struct vhost_dev *dev,
@ -145,6 +147,7 @@ typedef struct VhostOps {
vhost_get_vring_base_op vhost_get_vring_base; vhost_get_vring_base_op vhost_get_vring_base;
vhost_set_vring_kick_op vhost_set_vring_kick; vhost_set_vring_kick_op vhost_set_vring_kick;
vhost_set_vring_call_op vhost_set_vring_call; vhost_set_vring_call_op vhost_set_vring_call;
vhost_set_vring_err_op vhost_set_vring_err;
vhost_set_vring_busyloop_timeout_op vhost_set_vring_busyloop_timeout; vhost_set_vring_busyloop_timeout_op vhost_set_vring_busyloop_timeout;
vhost_set_features_op vhost_set_features; vhost_set_features_op vhost_set_features;
vhost_get_features_op vhost_get_features; vhost_get_features_op vhost_get_features;