static void nvme_queue_keep_alive_work(struct nvme_ctrl *ctrl)
 {
-       queue_delayed_work(nvme_wq, &ctrl->ka_work,
-                          nvme_keep_alive_work_period(ctrl));
+       unsigned long now = jiffies;
+       unsigned long delay = nvme_keep_alive_work_period(ctrl);
+       unsigned long ka_next_check_tm = ctrl->ka_last_check_time + delay;
+
+       if (time_after(now, ka_next_check_tm))
+               delay = 0;
+       else
+               delay = ka_next_check_tm - now;
+
+       queue_delayed_work(nvme_wq, &ctrl->ka_work, delay);
 }
 
 static enum rq_end_io_ret nvme_keep_alive_end_io(struct request *rq,
        INIT_DELAYED_WORK(&ctrl->failfast_work, nvme_failfast_work);
        memset(&ctrl->ka_cmd, 0, sizeof(ctrl->ka_cmd));
        ctrl->ka_cmd.common.opcode = nvme_admin_keep_alive;
+       ctrl->ka_last_check_time = jiffies;
 
        BUILD_BUG_ON(NVME_DSM_MAX_RANGES * sizeof(struct nvme_dsm_range) >
                        PAGE_SIZE);