mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
vhost-user: back SET/GET_CONFIG requests with a protocol feature
Without a dedicated protocol feature, QEMU cannot know whether the backend can handle VHOST_USER_SET_CONFIG and VHOST_USER_GET_CONFIG messages. This patch adds a protocol feature that is only advertised by QEMU if the device implements the config ops. Vhost user init fails if the device support the feature but the backend doesn't. The backend should only send VHOST_USER_SLAVE_CONFIG_CHANGE_MSG requests if the protocol feature has been negotiated. Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
parent
bc6abcff7c
commit
1c3e5a2617
2 changed files with 34 additions and 9 deletions
|
@ -46,6 +46,7 @@ enum VhostUserProtocolFeature {
|
|||
VHOST_USER_PROTOCOL_F_CROSS_ENDIAN = 6,
|
||||
VHOST_USER_PROTOCOL_F_CRYPTO_SESSION = 7,
|
||||
VHOST_USER_PROTOCOL_F_PAGEFAULT = 8,
|
||||
VHOST_USER_PROTOCOL_F_CONFIG = 9,
|
||||
VHOST_USER_PROTOCOL_F_MAX
|
||||
};
|
||||
|
||||
|
@ -1211,6 +1212,17 @@ static int vhost_user_init(struct vhost_dev *dev, void *opaque)
|
|||
|
||||
dev->protocol_features =
|
||||
protocol_features & VHOST_USER_PROTOCOL_FEATURE_MASK;
|
||||
|
||||
if (!dev->config_ops || !dev->config_ops->vhost_dev_config_notifier) {
|
||||
/* Don't acknowledge CONFIG feature if device doesn't support it */
|
||||
dev->protocol_features &= ~(1ULL << VHOST_USER_PROTOCOL_F_CONFIG);
|
||||
} else if (!(protocol_features &
|
||||
(1ULL << VHOST_USER_PROTOCOL_F_CONFIG))) {
|
||||
error_report("Device expects VHOST_USER_PROTOCOL_F_CONFIG "
|
||||
"but backend does not support it.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = vhost_user_set_protocol_features(dev, dev->protocol_features);
|
||||
if (err < 0) {
|
||||
return err;
|
||||
|
@ -1405,6 +1417,11 @@ static int vhost_user_get_config(struct vhost_dev *dev, uint8_t *config,
|
|||
.hdr.size = VHOST_USER_CONFIG_HDR_SIZE + config_len,
|
||||
};
|
||||
|
||||
if (!virtio_has_feature(dev->protocol_features,
|
||||
VHOST_USER_PROTOCOL_F_CONFIG)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (config_len > VHOST_USER_MAX_CONFIG_SIZE) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -1448,6 +1465,11 @@ static int vhost_user_set_config(struct vhost_dev *dev, const uint8_t *data,
|
|||
.hdr.size = VHOST_USER_CONFIG_HDR_SIZE + size,
|
||||
};
|
||||
|
||||
if (!virtio_has_feature(dev->protocol_features,
|
||||
VHOST_USER_PROTOCOL_F_CONFIG)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (reply_supported) {
|
||||
msg.hdr.flags |= VHOST_USER_NEED_REPLY_MASK;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue