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:
parent
2df4dd31e1
commit
8170ab3f43
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue