• Tejun Heo's avatar
    blk-iocost: fix weight updates of inner active iocgs · e9f4eee9
    Tejun Heo authored
    When the weight of an active iocg is updated, weight_updated() is called
    which in turn calls __propagate_weights() to update the active and inuse
    weights so that the effective hierarchical weights are update accordingly.
    
    The current implementation is incorrect for inner active nodes. For an
    active leaf iocg, inuse can be any value between 1 and active and the
    difference represents how much the iocg is donating. When weight is updated,
    as long as inuse is clamped between 1 and the new weight, we're alright and
    this is what __propagate_weights() currently implements.
    
    However, that's not how an active inner node's inuse is set. An inner node's
    inuse is solely determined by the ratio between the sums of inuse's and
    active's of its children - ie. they're results of propagating the leaves'
    active and inuse weights upwards. __propagate_weights() incorrectly applies
    the same clamping as for a leaf when an active inner node's weight is
    updated. Consider a hier...
    e9f4eee9
blk-iocost.c 96.4 KB