• Tejun Heo's avatar
    iocost: Fix divide-by-zero on donation from low hweight cgroup · edaa2633
    Tejun Heo authored
    The donation calculation logic assumes that the donor has non-zero
    after-donation hweight, so the lowest active hweight a donating cgroup can
    have is 2 so that it can donate 1 while keeping the other 1 for itself.
    Earlier, we only donated from cgroups with sizable surpluses so this
    condition was always true. However, with the precise donation algorithm
    implemented, f1de2439 ("blk-iocost: revamp donation amount
    determination") made the donation amount calculation exact enabling even low
    hweight cgroups to donate.
    
    This means that in rare occasions, a cgroup with active hweight of 1 can
    enter donation calculation triggering the following warning and then a
    divide-by-zero oops.
    
     WARNING: CPU: 4 PID: 0 at block/blk-iocost.c:1928 transfer_surpluses.cold+0x0/0x53 [884/94867]
     ...
     RIP: 0010:transfer_surpluses.cold+0x0/0x53
     Code: 92 ff 48 c7 c7 28 d1 ab b5 65 48 8b 34 25 00 ae 01 00 48 81 c6 90 06 00 00 e8 8b 3f fe ff 48 c7 c0 ea ff ff ff e9 95 ff 92 ff <0f> 0b 48 c7 c7 30 da ab b5 e8 71 3f fe ff 4c 89 e8 4d 85 ed 74 0
    4
     ...
     Call Trace:
      <IRQ>
      ioc_timer_fn+0x1043/0x1390
      call_timer_fn+0xa1/0x2c0
      __run_timers.part.0+0x1ec/0x2e0
      run_timer_softirq+0x35/0x70
     ...
     iocg: invalid donation weights in /a/b: active=1 donating=1 after=0
    
    Fix it by excluding cgroups w/ active hweight < 2 from donating. Excluding
    these extreme low hweight donations shouldn't affect work conservation in
    any meaningful way.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Fixes: f1de2439 ("blk-iocost: revamp donation amount determination")
    Cc: stable@vger.kernel.org # v5.10+
    Link: https://lore.kernel.org/r/Ybfh86iSvpWKxhVM@slm.duckdns.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    edaa2633
blk-iocost.c 96.6 KB