On Mon, Jun 12, 2023 at 3:14 PM Zhu Lingshan <lingshan.zhu@xxxxxxxxx> wrote: > > Rather than a hardcode, this commit detects > and reports the max value of allowed size > of the virtqueues > > Signed-off-by: Zhu Lingshan <lingshan.zhu@xxxxxxxxx> Acked-by: Jason Wang <jasowang@xxxxxxxxxx> Thanks > --- > drivers/vdpa/ifcvf/ifcvf_base.c | 31 +++++++++++++++++++++++++++++++ > drivers/vdpa/ifcvf/ifcvf_base.h | 2 +- > drivers/vdpa/ifcvf/ifcvf_main.c | 4 +++- > 3 files changed, 35 insertions(+), 2 deletions(-) > > diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c > index f86495ace825..f4d7d96c4c86 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_base.c > +++ b/drivers/vdpa/ifcvf/ifcvf_base.c > @@ -69,6 +69,37 @@ static int ifcvf_read_config_range(struct pci_dev *dev, > return 0; > } > > +static u16 ifcvf_get_vq_size(struct ifcvf_hw *hw, u16 qid) > +{ > + u16 queue_size; > + > + vp_iowrite16(qid, &hw->common_cfg->queue_select); > + queue_size = vp_ioread16(&hw->common_cfg->queue_size); > + > + return queue_size; > +} > + > +/* This function returns the max allowed safe size for > + * all virtqueues. It is the minimal size that can be > + * suppprted by all virtqueues. > + */ > +u16 ifcvf_get_max_vq_size(struct ifcvf_hw *hw) > +{ > + u16 queue_size, max_size, qid; > + > + max_size = ifcvf_get_vq_size(hw, 0); > + for (qid = 1; qid < hw->nr_vring; qid++) { > + queue_size = ifcvf_get_vq_size(hw, qid); > + /* 0 means the queue is unavailable */ > + if (!queue_size) > + continue; > + > + max_size = min(queue_size, max_size); > + } > + > + return max_size; > +} > + > int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev) > { > struct virtio_pci_cap cap; > diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h > index fa797184056b..30935a95b672 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_base.h > +++ b/drivers/vdpa/ifcvf/ifcvf_base.h > @@ -28,7 +28,6 @@ > #define IFCVF_MAX_QUEUES 17 > > #define IFCVF_QUEUE_ALIGNMENT PAGE_SIZE > -#define IFCVF_QUEUE_MAX 32768 > #define IFCVF_PCI_MAX_RESOURCE 6 > > #define IFCVF_LM_CFG_SIZE 0x40 > @@ -138,4 +137,5 @@ bool ifcvf_get_vq_ready(struct ifcvf_hw *hw, u16 qid); > void ifcvf_set_vq_ready(struct ifcvf_hw *hw, u16 qid, bool ready); > void ifcvf_set_driver_features(struct ifcvf_hw *hw, u64 features); > u64 ifcvf_get_driver_features(struct ifcvf_hw *hw); > +u16 ifcvf_get_max_vq_size(struct ifcvf_hw *hw); > #endif /* _IFCVF_H_ */ > diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c > index 2af0de771b49..c3ece395caf7 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_main.c > +++ b/drivers/vdpa/ifcvf/ifcvf_main.c > @@ -451,7 +451,9 @@ static int ifcvf_vdpa_reset(struct vdpa_device *vdpa_dev) > > static u16 ifcvf_vdpa_get_vq_num_max(struct vdpa_device *vdpa_dev) > { > - return IFCVF_QUEUE_MAX; > + struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev); > + > + return ifcvf_get_max_vq_size(vf); > } > > static int ifcvf_vdpa_get_vq_state(struct vdpa_device *vdpa_dev, u16 qid, > -- > 2.39.1 > _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization