summaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorSuresh Jayaraman <sjayaraman@suse.de>2011-09-21 10:00:16 +0200
committerJens Axboe <axboe@kernel.dk>2011-09-21 10:00:16 +0200
commit75df713627f28f88b901b329c8857747545fd4ab (patch)
tree0986bc4d82595dae4a3fabb15fce4780c053f004 /block
parent27a84d54c02591e815d291ae0ee4bfb9cfd21065 (diff)
downloadlinux-3.10-75df713627f28f88b901b329c8857747545fd4ab.tar.gz
linux-3.10-75df713627f28f88b901b329c8857747545fd4ab.tar.bz2
linux-3.10-75df713627f28f88b901b329c8857747545fd4ab.zip
block: document blk-plug
Thus spake Andrew Morton: "And I have the usual maintainability whine. If someone comes up to vmscan.c and sees it calling blk_start_plug(), how are they supposed to work out why that call is there? They go look at the blk_start_plug() definition and it is undocumented. I think we can do better than this?" Adapted from the LWN article - http://lwn.net/Articles/438256/ by Jens Axboe and from an earlier attempt by Shaohua Li to document blk-plug. [akpm@linux-foundation.org: grammatical and spelling tweaks] Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de> Cc: Shaohua Li <shaohua.li@intel.com> Cc: Jonathan Corbet <corbet@lwn.net> Signed-off-by: Andrew Morton <akpm@google.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r--block/blk-core.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 684d7eb33d4..97e9e5405b8 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -2595,6 +2595,20 @@ EXPORT_SYMBOL(kblockd_schedule_delayed_work);
#define PLUG_MAGIC 0x91827364
+/**
+ * blk_start_plug - initialize blk_plug and track it inside the task_struct
+ * @plug: The &struct blk_plug that needs to be initialized
+ *
+ * Description:
+ * Tracking blk_plug inside the task_struct will help with auto-flushing the
+ * pending I/O should the task end up blocking between blk_start_plug() and
+ * blk_finish_plug(). This is important from a performance perspective, but
+ * also ensures that we don't deadlock. For instance, if the task is blocking
+ * for a memory allocation, memory reclaim could end up wanting to free a
+ * page belonging to that request that is currently residing in our private
+ * plug. By flushing the pending I/O when the process goes to sleep, we avoid
+ * this kind of deadlock.
+ */
void blk_start_plug(struct blk_plug *plug)
{
struct task_struct *tsk = current;