]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
NVMe: Set TASK_INTERRUPTIBLE before processing queues
authorArjan van de Ven <arjan@linux.intel.com>
Wed, 1 May 2013 20:38:23 +0000 (16:38 -0400)
committerMatthew Wilcox <matthew.r.wilcox@intel.com>
Wed, 1 May 2013 20:40:27 +0000 (16:40 -0400)
The kthread has two tasks; handling timeouts (for which it runs once per
second), and submitting queued BIOs.  If a BIO happens to be queued after
the thread has processed the queue but before it calls schedule_timeout(),
the thread will sleep for a second before submitting it, which can cause
performance problems in some rare cases (that will become more common in
a subsequent patch).

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Tested-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
drivers/block/nvme-core.c

index 40908a06bd5eeeac649e4c3ebbf04ab1cc23f738..358d17700c2082a55b8d93f925d09ce58fc819cf 100644 (file)
@@ -1291,7 +1291,7 @@ static int nvme_kthread(void *data)
        struct nvme_dev *dev;
 
        while (!kthread_should_stop()) {
-               __set_current_state(TASK_RUNNING);
+               set_current_state(TASK_INTERRUPTIBLE);
                spin_lock(&dev_list_lock);
                list_for_each_entry(dev, &dev_list, node) {
                        int i;
@@ -1308,7 +1308,6 @@ static int nvme_kthread(void *data)
                        }
                }
                spin_unlock(&dev_list_lock);
-               set_current_state(TASK_INTERRUPTIBLE);
                schedule_timeout(round_jiffies_relative(HZ));
        }
        return 0;