summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2013-05-01 16:38:23 -0400
committerMatthew Wilcox <matthew.r.wilcox@intel.com>2013-05-01 16:40:27 -0400
commit564a232c059913d91b491e04c2b2d670b8f94615 (patch)
treef0f83ea760a81c9c2d05d23f39af419fcf462f5b
parent5e82e952f04681c10f35e02ee0a4a43ec027137a (diff)
downloadtalos-op-linux-564a232c059913d91b491e04c2b2d670b8f94615.tar.gz
talos-op-linux-564a232c059913d91b491e04c2b2d670b8f94615.zip
NVMe: Set TASK_INTERRUPTIBLE before processing queues
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>
-rw-r--r--drivers/block/nvme-core.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c
index 40908a06bd5e..358d17700c20 100644
--- a/drivers/block/nvme-core.c
+++ b/drivers/block/nvme-core.c
@@ -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;
OpenPOWER on IntegriCloud