dm rq: do not update rq partially in each ending bio
authorMing Lei <ming.lei@redhat.com>
Thu, 24 Aug 2017 12:19:52 +0000 (20:19 +0800)
committerMike Snitzer <snitzer@redhat.com>
Mon, 28 Aug 2017 14:23:28 +0000 (10:23 -0400)
commitdc6364b5170dc446fca076d6523aaebc339d6511
tree344b391746798b7fe7659de27a04f8a40edb6a4f
parentd5c27f3ffbc2ee2d2f74ebfa1b2d789f67e9b3f1
dm rq: do not update rq partially in each ending bio

We don't need to update the original dm request partially when ending
each cloned bio: just update original dm request once when the whole
cloned request is finished.  This still allows full support for partial
completion because a new 'completed' counter accounts for incremental
progress as the clone bios complete.

Partial request update can be a bit expensive, so we should try to avoid
it, especially because it is run in softirq context.

Avoiding all the partial request updates fixes both hard lockup and
soft lockups that were easily reproduced while running Laurence's
test[1] on IB/SRP.

BTW, after d4acf3650c7c ("block: Make blk_mq_delay_kick_requeue_list()
rerun the queue at a quiet time"), we need to make the test more
aggressive for reproducing the lockup:

1) run hammer_write.sh 32 or 64 concurrently.
2) write 8M each time

[1] https://marc.info/?l=linux-block&m=150220185510245&w=2

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-rq.c
drivers/md/dm-rq.h