vdpa: Extract get features part from vhost_vdpa_get_max_queue_pairs

To know the device features is needed for CVQ SVQ, so SVQ knows if it
can handle all commands or not. Extract from
vhost_vdpa_get_max_queue_pairs so we can reuse it.

Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Eugenio Pérez 2022-07-20 08:59:44 +02:00 committed by Jason Wang
parent 2df4dd31e1
commit 8170ab3f43

View File

@ -474,20 +474,24 @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
return nc; return nc;
} }
static int vhost_vdpa_get_max_queue_pairs(int fd, int *has_cvq, Error **errp) static int vhost_vdpa_get_features(int fd, uint64_t *features, Error **errp)
{
int ret = ioctl(fd, VHOST_GET_FEATURES, features);
if (unlikely(ret < 0)) {
error_setg_errno(errp, errno,
"Fail to query features from vhost-vDPA device");
}
return ret;
}
static int vhost_vdpa_get_max_queue_pairs(int fd, uint64_t features,
int *has_cvq, Error **errp)
{ {
unsigned long config_size = offsetof(struct vhost_vdpa_config, buf); unsigned long config_size = offsetof(struct vhost_vdpa_config, buf);
g_autofree struct vhost_vdpa_config *config = NULL; g_autofree struct vhost_vdpa_config *config = NULL;
__virtio16 *max_queue_pairs; __virtio16 *max_queue_pairs;
uint64_t features;
int ret; int ret;
ret = ioctl(fd, VHOST_GET_FEATURES, &features);
if (ret) {
error_setg(errp, "Fail to query features from vhost-vDPA device");
return ret;
}
if (features & (1 << VIRTIO_NET_F_CTRL_VQ)) { if (features & (1 << VIRTIO_NET_F_CTRL_VQ)) {
*has_cvq = 1; *has_cvq = 1;
} else { } else {
@ -517,10 +521,11 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
NetClientState *peer, Error **errp) NetClientState *peer, Error **errp)
{ {
const NetdevVhostVDPAOptions *opts; const NetdevVhostVDPAOptions *opts;
uint64_t features;
int vdpa_device_fd; int vdpa_device_fd;
g_autofree NetClientState **ncs = NULL; g_autofree NetClientState **ncs = NULL;
NetClientState *nc; NetClientState *nc;
int queue_pairs, i, has_cvq = 0; int queue_pairs, r, i, has_cvq = 0;
assert(netdev->type == NET_CLIENT_DRIVER_VHOST_VDPA); assert(netdev->type == NET_CLIENT_DRIVER_VHOST_VDPA);
opts = &netdev->u.vhost_vdpa; opts = &netdev->u.vhost_vdpa;
@ -534,7 +539,12 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
return -errno; return -errno;
} }
queue_pairs = vhost_vdpa_get_max_queue_pairs(vdpa_device_fd, r = vhost_vdpa_get_features(vdpa_device_fd, &features, errp);
if (unlikely(r < 0)) {
return r;
}
queue_pairs = vhost_vdpa_get_max_queue_pairs(vdpa_device_fd, features,
&has_cvq, errp); &has_cvq, errp);
if (queue_pairs < 0) { if (queue_pairs < 0) {
qemu_close(vdpa_device_fd); qemu_close(vdpa_device_fd);