> @@ -2627,7 +2752,30 @@ static int nvme_pci_get_address(struct nvme_ctrl 
> *ctrl, char *buf, int size)
>  
>  static void nvme_pci_get_ams(struct nvme_ctrl *ctrl, u32 *ams)
>  {
> -     *ams = NVME_CC_AMS_RR;
> +     /* if deivce doesn't support WRR, force reset wrr queues to 0 */
> +     if (!NVME_CAP_AMS_WRRU(ctrl->cap)) {
> +             wrr_low_queues = 0;
> +             wrr_medium_queues = 0;
> +             wrr_high_queues = 0;
> +             wrr_urgent_queues = 0;

Could we avoid this kind of reset variables in get_XXX() function?  I
guess it would be great if it just tries to get some value which is
mainly focused to do.

> +
> +             *ams = NVME_CC_AMS_RR;
> +             ctrl->wrr_enabled = false;
> +             return;
> +     }
> +
> +     /*
> +      * if device support WRR, check wrr queue count, all wrr queues are
> +      * 0, don't enable device's WRR.
> +      */
> +     if ((wrr_low_queues + wrr_medium_queues + wrr_high_queues +
> +                             wrr_urgent_queues) > 0) {
> +             *ams = NVME_CC_AMS_WRRU;
> +             ctrl->wrr_enabled = true;
> +     } else {
> +             *ams = NVME_CC_AMS_RR;
> +             ctrl->wrr_enabled = false;

These two line can be merged into above condition:

        if (!NVME_CAP_AMS_WRRU(ctrl->cap) ||
                wrr_low_queues + wrr_medium_queues + wrr_high_queues +
                        wrr_urgent_queues <= 0) {
                *ams = NVME_CC_AMS_RR;
                ctrl->wrr_enabled = false;
        }

Reply via email to