blk-throttle: Trim/adjust slice_end once a bio has been dispatched
authorVivek Goyal <vgoyal@redhat.com>
Wed, 1 Dec 2010 18:34:46 +0000 (19:34 +0100)
committerJens Axboe <jaxboe@fusionio.com>
Wed, 1 Dec 2010 18:34:46 +0000 (19:34 +0100)
commitd1ae8ffdfaa16b2ab2e9346e81cf0ab6eaaae347
treed34fabaf556ec4471e076b4794fa1de8515956f0
parent5478755616ae2ef1ce144dded589b62b2a50d575
blk-throttle: Trim/adjust slice_end once a bio has been dispatched

o During some testing I did following and noticed throttling stops working.

        - Put a very low limit on a cgroup, say 1 byte per second.
        - Start some reads, this will set slice_end to a very high value.
        - Change the limit to higher value say 1MB/s
        - Now IO unthrottles and finishes as expected.
        - Try to do the read again but IO is not limited to 1MB/s as expected.

o What is happening.
        - Initially low value of limit sets slice_end to a very high value.
        - During updation of limit, slice_end is not being truncated.
        - Very high value of slice_end leads to keeping the existing slice
          valid for a very long time and new slice does not start.
        - tg_may_dispatch() is called in blk_throtle_bio(), and trim_slice()
          is not called in this path. So slice_start is some old value and
          practically we are able to do huge amount of IO.

o There are many ways it can be fixed. I have fixed it by trying to
  adjust/cleanup slice_end in trim_slice(). Generally we extend slices if bio
  is big and can't be dispatched in one slice. After dispatch of bio, readjust
  the slice_end to make sure we don't end up with huge values.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
block/blk-throttle.c