mirror of
https://github.com/mborgerson/xemu.git
synced 2025-12-01 16:10:01 +00:00
vdpa: request iova_range only once
Currently iova range is requested once per queue pair in the case of net. Reduce the number of ioctls asking it once at initialization and reusing that value for each vhost_vdpa. Signed-off-by: Eugenio Pérez <eperezma@redhat.com> Message-Id: <20221215113144.322011-7-eperezma@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Jason Wang <jasonwang@redhat.com>
This commit is contained in:
committed by
Michael S. Tsirkin
parent
36e4647247
commit
a585fad26b
@ -541,14 +541,15 @@ static const VhostShadowVirtqueueOps vhost_vdpa_net_svq_ops = {
|
||||
};
|
||||
|
||||
static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
|
||||
const char *device,
|
||||
const char *name,
|
||||
int vdpa_device_fd,
|
||||
int queue_pair_index,
|
||||
int nvqs,
|
||||
bool is_datapath,
|
||||
bool svq,
|
||||
VhostIOVATree *iova_tree)
|
||||
const char *device,
|
||||
const char *name,
|
||||
int vdpa_device_fd,
|
||||
int queue_pair_index,
|
||||
int nvqs,
|
||||
bool is_datapath,
|
||||
bool svq,
|
||||
struct vhost_vdpa_iova_range iova_range,
|
||||
VhostIOVATree *iova_tree)
|
||||
{
|
||||
NetClientState *nc = NULL;
|
||||
VhostVDPAState *s;
|
||||
@ -567,6 +568,7 @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
|
||||
s->vhost_vdpa.device_fd = vdpa_device_fd;
|
||||
s->vhost_vdpa.index = queue_pair_index;
|
||||
s->vhost_vdpa.shadow_vqs_enabled = svq;
|
||||
s->vhost_vdpa.iova_range = iova_range;
|
||||
s->vhost_vdpa.iova_tree = iova_tree;
|
||||
if (!is_datapath) {
|
||||
s->cvq_cmd_out_buffer = qemu_memalign(qemu_real_host_page_size(),
|
||||
@ -646,6 +648,7 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
|
||||
int vdpa_device_fd;
|
||||
g_autofree NetClientState **ncs = NULL;
|
||||
g_autoptr(VhostIOVATree) iova_tree = NULL;
|
||||
struct vhost_vdpa_iova_range iova_range;
|
||||
NetClientState *nc;
|
||||
int queue_pairs, r, i = 0, has_cvq = 0;
|
||||
|
||||
@ -689,14 +692,12 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
|
||||
return queue_pairs;
|
||||
}
|
||||
|
||||
vhost_vdpa_get_iova_range(vdpa_device_fd, &iova_range);
|
||||
if (opts->x_svq) {
|
||||
struct vhost_vdpa_iova_range iova_range;
|
||||
|
||||
if (!vhost_vdpa_net_valid_svq_features(features, errp)) {
|
||||
goto err_svq;
|
||||
}
|
||||
|
||||
vhost_vdpa_get_iova_range(vdpa_device_fd, &iova_range);
|
||||
iova_tree = vhost_iova_tree_new(iova_range.first, iova_range.last);
|
||||
}
|
||||
|
||||
@ -705,7 +706,7 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
|
||||
for (i = 0; i < queue_pairs; i++) {
|
||||
ncs[i] = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
|
||||
vdpa_device_fd, i, 2, true, opts->x_svq,
|
||||
iova_tree);
|
||||
iova_range, iova_tree);
|
||||
if (!ncs[i])
|
||||
goto err;
|
||||
}
|
||||
@ -713,7 +714,7 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
|
||||
if (has_cvq) {
|
||||
nc = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
|
||||
vdpa_device_fd, i, 1, false,
|
||||
opts->x_svq, iova_tree);
|
||||
opts->x_svq, iova_range, iova_tree);
|
||||
if (!nc)
|
||||
goto err;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user