• Tejun Heo's avatar
    iocost: don't let vrate run wild while there's no saturation signal · 81ca627a
    Tejun Heo authored
    When the QoS targets are met and nothing is being throttled, there's
    no way to tell how saturated the underlying device is - it could be
    almost entirely idle, at the cusp of saturation or anywhere inbetween.
    Given that there's no information, it's best to keep vrate as-is in
    this state.  Before 7cd806a9 ("iocost: improve nr_lagging
    handling"), this was the case - if the device isn't missing QoS
    targets and nothing is being throttled, busy_level was reset to zero.
    
    While fixing nr_lagging handling, 7cd806a9 ("iocost: improve
    nr_lagging handling") broke this.  Now, while the device is hitting
    QoS targets and nothing is being throttled, vrate keeps getting
    adjusted according to the existing busy_level.
    
    This led to vrate keeping climing till it hits max when there's an IO
    issuer with limited request concurrency if the vrate started low.
    vrate starts getting adjusted upwards until the issuer can issue IOs
    w/o being throttled.  From then on, QoS targets keeps getting met and
    nothing on the system needs throttling and vrate keeps getting
    increased due to the existing busy_level.
    
    This patch makes the following changes to the busy_level logic.
    
    * Reset busy_level if nr_shortages is zero to avoid the above
      scenario.
    
    * Make non-zero nr_lagging block lowering nr_level but still clear
      positive busy_level if there's clear non-saturation signal - QoS
      targets are met and nr_shortages is non-zero.  nr_lagging's role is
      preventing adjusting vrate upwards while there are long-running
      commands and it shouldn't keep busy_level positive while there's
      clear non-saturation signal.
    
    * Restructure code for clarity and add comments.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarAndy Newell <newella@fb.com>
    Fixes: 7cd806a9 ("iocost: improve nr_lagging handling")
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    81ca627a
blk-iocost.c 68.9 KB