• Vivek Goyal's avatar
    blk-throttle: Trim/adjust slice_end once a bio has been dispatched · d1ae8ffd
    Vivek Goyal authored
    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: default avatarVivek Goyal <vgoyal@redhat.com>
    Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
    d1ae8ffd
blk-throttle.c 28.3 KB