From e166c2000fd3c984378f955df7cdbb2dbcf6ef8a Mon Sep 17 00:00:00 2001 From: Joseph Qi Date: Thu, 16 Jul 2020 16:34:06 +0800 Subject: [PATCH 1717/2944] alinux: blk-iocost: bypass IOs earlier if disabled to #29357063 The blkg lookup or create logic may bring much overhead even iocost is disabled. So bypass it earlier in such case. Fixes: 9da41925c6eb ("alinux: iocost: fix NULL pointer dereference in ioc_rqos_throttle") Reported-by: Hongnan Li Signed-off-by: Joseph Qi Acked-by: Xiaoguang Wang Reviewed-by: Jiufei Xue --- block/blk-iocost.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/block/blk-iocost.c b/block/blk-iocost.c index 0d5c740..d8777e0 100644 --- a/block/blk-iocost.c +++ b/block/blk-iocost.c @@ -1709,6 +1709,10 @@ static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio, spinlock_t * u32 hw_active, hw_inuse; u64 abs_cost, cost, vtime; + /* bypass IOs if disabled */ + if (!ioc->enabled) + return; + rcu_read_lock(); blkcg = bio_blkcg(bio); bio_associate_blkcg(bio, &blkcg->css); @@ -1731,8 +1735,8 @@ static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio, spinlock_t * rcu_read_unlock(); iocg = blkg_to_iocg(blkg); - /* bypass IOs if disabled or for root cgroup */ - if (!ioc->enabled || !iocg->level) + /* bypass IOs for root cgroup */ + if (!iocg->level) return; /* always activate so that even 0 cost IOs get protected to some level */ @@ -1858,6 +1862,10 @@ static void ioc_rqos_merge(struct rq_qos *rqos, struct request *rq, u32 hw_inuse; u64 abs_cost, cost; + /* bypass if disabled */ + if (!ioc->enabled) + return; + rcu_read_lock(); blkcg = bio_blkcg(bio); bio_associate_blkcg(bio, &blkcg->css); @@ -1870,8 +1878,8 @@ static void ioc_rqos_merge(struct rq_qos *rqos, struct request *rq, rcu_read_unlock(); iocg = blkg_to_iocg(blkg); - /* bypass if disabled or for root cgroup */ - if (!ioc->enabled || !iocg->level) + /* bypass for root cgroup */ + if (!iocg->level) return; abs_cost = calc_vtime_cost(bio, iocg, true); -- 1.8.3.1