diff mbox series

iocost: check active_list of all the ancestors in iocg_activate()

Message ID 1573629691-6619-1-git-send-email-jiufei.xue@linux.alibaba.com (mailing list archive)
State New, archived
Headers show
Series iocost: check active_list of all the ancestors in iocg_activate() | expand

Commit Message

Jiufei Xue Nov. 13, 2019, 7:21 a.m. UTC
There is a bug that checking the same active_list over and over again
in iocg_activate(). The intention of the code was checking whether all
the ancestors and self have already been activated. So fix it.

Signed-off-by: Jiufei Xue <jiufei.xue@linux.alibaba.com>
---
 block/blk-iocost.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Tejun Heo Nov. 13, 2019, 4:20 p.m. UTC | #1
On Wed, Nov 13, 2019 at 03:21:31PM +0800, Jiufei Xue wrote:
> There is a bug that checking the same active_list over and over again
> in iocg_activate(). The intention of the code was checking whether all
> the ancestors and self have already been activated. So fix it.
> 
> Signed-off-by: Jiufei Xue <jiufei.xue@linux.alibaba.com>

Fixes: 7caa47151ab2 ("blkcg: implement blk-iocost")
Acked-by: Tejun Heo <tj@kernel.org>

Jens, can you please apply this patch?

Thans.
Jens Axboe Nov. 14, 2019, 8:57 p.m. UTC | #2
On 11/13/19 9:20 AM, Tejun Heo wrote:
> On Wed, Nov 13, 2019 at 03:21:31PM +0800, Jiufei Xue wrote:
>> There is a bug that checking the same active_list over and over again
>> in iocg_activate(). The intention of the code was checking whether all
>> the ancestors and self have already been activated. So fix it.
>>
>> Signed-off-by: Jiufei Xue <jiufei.xue@linux.alibaba.com>
> 
> Fixes: 7caa47151ab2 ("blkcg: implement blk-iocost")
> Acked-by: Tejun Heo <tj@kernel.org>
> 
> Jens, can you please apply this patch?

Applied for 5.4, thanks.
diff mbox series

Patch

diff --git a/block/blk-iocost.c b/block/blk-iocost.c
index a7ed434..e01267f 100644
--- a/block/blk-iocost.c
+++ b/block/blk-iocost.c
@@ -1057,9 +1057,12 @@  static bool iocg_activate(struct ioc_gq *iocg, struct ioc_now *now)
 	atomic64_set(&iocg->active_period, cur_period);
 
 	/* already activated or breaking leaf-only constraint? */
-	for (i = iocg->level; i > 0; i--)
-		if (!list_empty(&iocg->active_list))
+	if (!list_empty(&iocg->active_list))
+		goto succeed_unlock;
+	for (i = iocg->level - 1; i > 0; i--)
+		if (!list_empty(&iocg->ancestors[i]->active_list))
 			goto fail_unlock;
+
 	if (iocg->child_active_sum)
 		goto fail_unlock;
 
@@ -1101,6 +1104,7 @@  static bool iocg_activate(struct ioc_gq *iocg, struct ioc_now *now)
 		ioc_start_period(ioc, now);
 	}
 
+succeed_unlock:
 	spin_unlock_irq(&ioc->lock);
 	return true;