> @@ -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; }