]> git.baikalelectronics.ru Git - kernel.git/commit
block-throttle: avoid double charge
authorShaohua Li <shli@fb.com>
Wed, 20 Dec 2017 18:10:17 +0000 (11:10 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 20 Dec 2017 18:10:17 +0000 (11:10 -0700)
commit790c89a6d34acbe6c0a738ce99b342be17ac92c5
treefe3766fcad8f4996f049d2562ad0d62b7bb8fc98
parentd3fde5cf033db760cff2ee5dbe22deb9d814317a
block-throttle: avoid double charge

If a bio is throttled and split after throttling, the bio could be
resubmited and enters the throttling again. This will cause part of the
bio to be charged multiple times. If the cgroup has an IO limit, the
double charge will significantly harm the performance. The bio split
becomes quite common after arbitrary bio size change.

To fix this, we always set the BIO_THROTTLED flag if a bio is throttled.
If the bio is cloned/split, we copy the flag to new bio too to avoid a
double charge. However, cloned bio could be directed to a new disk,
keeping the flag be a problem. The observation is we always set new disk
for the bio in this case, so we can clear the flag in bio_set_dev().

This issue exists for a long time, arbitrary bio size change just makes
it worse, so this should go into stable at least since v4.2.

V1-> V2: Not add extra field in bio based on discussion with Tejun

Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: stable@vger.kernel.org
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c
block/blk-throttle.c
include/linux/bio.h
include/linux/blk_types.h