Re: [PATCH V2 2/3] vDPA/ifcvf: detect and report max allowed vq size

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux