[PATCH] block: Prevent hang_check firing during long I/O

From: Mark Lord
Date: Fri Sep 24 2010 - 09:51:23 EST


During long I/O operations, the hang_check timer may fire,
trigger stack dumps that unnecessarily alarm the user.

Eg. hdparm --security-erase NULL /dev/sdb ## can take *hours* to complete

So, if hang_check is armed, we should wake up periodically
to prevent it from triggering. This patch uses a wake-up interval
equal to half the hang_check timer period, which keeps overhead low enough.

Signed-off-by: Mark Lord <mlord@xxxxxxxxx>

--- old/block/blk-exec.c 2010-09-20 19:56:53.000000000 -0400
+++ linux/block/blk-exec.c 2010-09-24 09:43:32.342604574 -0400
@@ -80,6 +80,7 @@
DECLARE_COMPLETION_ONSTACK(wait);
char sense[SCSI_SENSE_BUFFERSIZE];
int err = 0;
+ unsigned long hang_check;

/*
* we need an extra reference to the request, so we can look at
@@ -95,7 +96,13 @@

rq->end_io_data = &wait;
blk_execute_rq_nowait(q, bd_disk, rq, at_head, blk_end_sync_rq);
- wait_for_completion(&wait);
+
+ /* Prevent hang_check timer from firing at us during very long I/O */
+ hang_check = sysctl_hung_task_timeout_secs;
+ if (hang_check)
+ while (!wait_for_completion_timeout(&wait, hang_check * (HZ/2)));
+ else
+ wait_for_completion(&wait);

if (rq->errors)
err = -EIO;


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/