net/virtio-user: support vhost status setting
This patch adds support for VHOST_USER_SET_STATUS request. It is used to make the backend aware of Virtio devices status update. It is useful for the backend to know when the Virtio driver is done with the Virtio device configuration. Reviewed-by: Chenbo Xia <chenbo.xia@intel.com> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
This commit is contained in:
parent
e84a9dab7d
commit
5791282461
@ -57,6 +57,10 @@ struct vhost_vring_addr {
|
|||||||
#define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
|
#define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef VHOST_USER_PROTOCOL_F_STATUS
|
||||||
|
#define VHOST_USER_PROTOCOL_F_STATUS 16
|
||||||
|
#endif
|
||||||
|
|
||||||
enum vhost_user_request {
|
enum vhost_user_request {
|
||||||
VHOST_USER_NONE = 0,
|
VHOST_USER_NONE = 0,
|
||||||
VHOST_USER_GET_FEATURES = 1,
|
VHOST_USER_GET_FEATURES = 1,
|
||||||
@ -77,6 +81,8 @@ enum vhost_user_request {
|
|||||||
VHOST_USER_SET_PROTOCOL_FEATURES = 16,
|
VHOST_USER_SET_PROTOCOL_FEATURES = 16,
|
||||||
VHOST_USER_GET_QUEUE_NUM = 17,
|
VHOST_USER_GET_QUEUE_NUM = 17,
|
||||||
VHOST_USER_SET_VRING_ENABLE = 18,
|
VHOST_USER_SET_VRING_ENABLE = 18,
|
||||||
|
VHOST_USER_SET_STATUS = 39,
|
||||||
|
VHOST_USER_GET_STATUS = 40,
|
||||||
VHOST_USER_MAX
|
VHOST_USER_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -244,6 +244,8 @@ const char * const vhost_msg_strings[] = {
|
|||||||
[VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE",
|
[VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE",
|
||||||
[VHOST_USER_GET_PROTOCOL_FEATURES] = "VHOST_USER_GET_PROTOCOL_FEATURES",
|
[VHOST_USER_GET_PROTOCOL_FEATURES] = "VHOST_USER_GET_PROTOCOL_FEATURES",
|
||||||
[VHOST_USER_SET_PROTOCOL_FEATURES] = "VHOST_USER_SET_PROTOCOL_FEATURES",
|
[VHOST_USER_SET_PROTOCOL_FEATURES] = "VHOST_USER_SET_PROTOCOL_FEATURES",
|
||||||
|
[VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS",
|
||||||
|
[VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS",
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -280,6 +282,14 @@ vhost_user_sock(struct virtio_user_dev *dev,
|
|||||||
need_reply = 1;
|
need_reply = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VHOST_USER_SET_STATUS:
|
||||||
|
if (!(dev->protocol_features &
|
||||||
|
(1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (has_reply_ack)
|
||||||
|
msg.flags |= VHOST_USER_NEED_REPLY_MASK;
|
||||||
|
/* Fallthrough */
|
||||||
case VHOST_USER_SET_FEATURES:
|
case VHOST_USER_SET_FEATURES:
|
||||||
case VHOST_USER_SET_PROTOCOL_FEATURES:
|
case VHOST_USER_SET_PROTOCOL_FEATURES:
|
||||||
case VHOST_USER_SET_LOG_BASE:
|
case VHOST_USER_SET_LOG_BASE:
|
||||||
|
@ -424,7 +424,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev)
|
|||||||
|
|
||||||
#define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES \
|
#define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES \
|
||||||
(1ULL << VHOST_USER_PROTOCOL_F_MQ | \
|
(1ULL << VHOST_USER_PROTOCOL_F_MQ | \
|
||||||
1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)
|
1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK | \
|
||||||
|
1ULL << VHOST_USER_PROTOCOL_F_STATUS)
|
||||||
|
|
||||||
int
|
int
|
||||||
virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
|
virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
|
||||||
@ -783,3 +784,26 @@ virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx)
|
|||||||
__atomic_add_fetch(&vring->used->idx, 1, __ATOMIC_RELAXED);
|
__atomic_add_fetch(&vring->used->idx, 1, __ATOMIC_RELAXED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
uint64_t arg = status;
|
||||||
|
|
||||||
|
/* Vhost-user only for now */
|
||||||
|
if (!is_vhost_user_by_type(dev->path))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = dev->ops->send_request(dev, VHOST_USER_SET_STATUS, &arg);
|
||||||
|
if (ret) {
|
||||||
|
PMD_INIT_LOG(ERR, "VHOST_USER_SET_STATUS failed (%d): %s", ret,
|
||||||
|
strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -72,4 +72,5 @@ void virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx);
|
|||||||
void virtio_user_handle_cq_packed(struct virtio_user_dev *dev,
|
void virtio_user_handle_cq_packed(struct virtio_user_dev *dev,
|
||||||
uint16_t queue_idx);
|
uint16_t queue_idx);
|
||||||
uint8_t virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs);
|
uint8_t virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs);
|
||||||
|
int virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status);
|
||||||
#endif
|
#endif
|
||||||
|
@ -272,6 +272,7 @@ virtio_user_set_status(struct virtio_hw *hw, uint8_t status)
|
|||||||
else if (status == VIRTIO_CONFIG_STATUS_RESET)
|
else if (status == VIRTIO_CONFIG_STATUS_RESET)
|
||||||
virtio_user_reset(hw);
|
virtio_user_reset(hw);
|
||||||
dev->status = status;
|
dev->status = status;
|
||||||
|
virtio_user_send_status_update(dev, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t
|
static uint8_t
|
||||||
|
Loading…
Reference in New Issue
Block a user