On Wed, Nov 30, 2022 at 7:43 AM Jason Wang <jasowang@xxxxxxxxxx> wrote: > > On Thu, Nov 24, 2022 at 11:52 PM Eugenio Pérez <eperezma@xxxxxxxxxx> wrote: > > > > It can be allocated either if all virtqueues must be shadowed or if > > vdpa-net detects it can shadow only cvq. > > > > Extract in its own function so we can reuse it. > > > > Signed-off-by: Eugenio Pérez <eperezma@xxxxxxxxxx> > > --- > > net/vhost-vdpa.c | 29 +++++++++++++++++------------ > > 1 file changed, 17 insertions(+), 12 deletions(-) > > > > diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c > > index 88e0eec5fa..9ee3bc4cd3 100644 > > --- a/net/vhost-vdpa.c > > +++ b/net/vhost-vdpa.c > > @@ -240,6 +240,22 @@ static NetClientInfo net_vhost_vdpa_info = { > > .check_peer_type = vhost_vdpa_check_peer_type, > > }; > > > > +static int vhost_vdpa_get_iova_range(int fd, > > + struct vhost_vdpa_iova_range *iova_range) > > +{ > > + int ret = ioctl(fd, VHOST_VDPA_GET_IOVA_RANGE, iova_range); > > + > > + return ret < 0 ? -errno : 0; > > +} > > I don't get why this needs to be moved to net specific code. > It was already in net, this code just extracted it in its own function. It's done in net because iova_tree must be the same for all queuepair vhost, so we need to allocate before them. Thanks! > Thanks > > > + > > +static VhostIOVATree *vhost_vdpa_svq_allocate_iova_tree(int vdpa_device_fd) > > +{ > > + struct vhost_vdpa_iova_range iova_range; > > + > > + vhost_vdpa_get_iova_range(vdpa_device_fd, &iova_range); > > + return vhost_iova_tree_new(iova_range.first, iova_range.last); > > +} > > + > > static void vhost_vdpa_cvq_unmap_buf(struct vhost_vdpa *v, void *addr) > > { > > VhostIOVATree *tree = v->iova_tree; > > @@ -587,14 +603,6 @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer, > > return nc; > > } > > > > -static int vhost_vdpa_get_iova_range(int fd, > > - struct vhost_vdpa_iova_range *iova_range) > > -{ > > - int ret = ioctl(fd, VHOST_VDPA_GET_IOVA_RANGE, iova_range); > > - > > - return ret < 0 ? -errno : 0; > > -} > > - > > static int vhost_vdpa_get_features(int fd, uint64_t *features, Error **errp) > > { > > int ret = ioctl(fd, VHOST_GET_FEATURES, features); > > @@ -690,14 +698,11 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name, > > } > > > > 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); > > + iova_tree = vhost_vdpa_svq_allocate_iova_tree(vdpa_device_fd); > > } > > > > ncs = g_malloc0(sizeof(*ncs) * queue_pairs); > > -- > > 2.31.1 > > >