OSDN Git Service

blk-iocost: read 'ioc->params' inside 'ioc->lock' in ioc_timer_fn()
authorYu Kuai <yukuai3@huawei.com>
Wed, 12 Oct 2022 09:40:35 +0000 (17:40 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 24 Oct 2022 00:59:17 +0000 (18:59 -0600)
'ioc->params' is updated in ioc_refresh_params(), which is proteced by
'ioc->lock', however, ioc_timer_fn() read params outside the lock.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Acked-by: Tejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20221012094035.390056-5-yukuai1@huaweicloud.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-iocost.c

index 5acc5f1..f013599 100644 (file)
@@ -2203,8 +2203,8 @@ static void ioc_timer_fn(struct timer_list *timer)
        LIST_HEAD(surpluses);
        int nr_debtors, nr_shortages = 0, nr_lagging = 0;
        u64 usage_us_sum = 0;
-       u32 ppm_rthr = MILLION - ioc->params.qos[QOS_RPPM];
-       u32 ppm_wthr = MILLION - ioc->params.qos[QOS_WPPM];
+       u32 ppm_rthr;
+       u32 ppm_wthr;
        u32 missed_ppm[2], rq_wait_pct;
        u64 period_vtime;
        int prev_busy_level;
@@ -2215,6 +2215,8 @@ static void ioc_timer_fn(struct timer_list *timer)
        /* take care of active iocgs */
        spin_lock_irq(&ioc->lock);
 
+       ppm_rthr = MILLION - ioc->params.qos[QOS_RPPM];
+       ppm_wthr = MILLION - ioc->params.qos[QOS_WPPM];
        ioc_now(ioc, &now);
 
        period_vtime = now.vnow - ioc->period_at_vtime;