Commit 25c4b5e0 authored by Jens Axboe's avatar Jens Axboe

blk-ioprio: don't set bio priority if not needed

We don't need to write to the bio if:

1) No ioprio value has ever been assigned to the blkcg
2) We wouldn't anyway, depending on bio and blkcg IO priority
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 1e9c2303
...@@ -62,6 +62,7 @@ struct ioprio_blkg { ...@@ -62,6 +62,7 @@ struct ioprio_blkg {
struct ioprio_blkcg { struct ioprio_blkcg {
struct blkcg_policy_data cpd; struct blkcg_policy_data cpd;
enum prio_policy prio_policy; enum prio_policy prio_policy;
bool prio_set;
}; };
static inline struct ioprio_blkg *pd_to_ioprio(struct blkg_policy_data *pd) static inline struct ioprio_blkg *pd_to_ioprio(struct blkg_policy_data *pd)
...@@ -112,7 +113,7 @@ static ssize_t ioprio_set_prio_policy(struct kernfs_open_file *of, char *buf, ...@@ -112,7 +113,7 @@ static ssize_t ioprio_set_prio_policy(struct kernfs_open_file *of, char *buf,
if (ret < 0) if (ret < 0)
return ret; return ret;
blkcg->prio_policy = ret; blkcg->prio_policy = ret;
blkcg->prio_set = true;
return nbytes; return nbytes;
} }
...@@ -190,6 +191,10 @@ static void blkcg_ioprio_track(struct rq_qos *rqos, struct request *rq, ...@@ -190,6 +191,10 @@ static void blkcg_ioprio_track(struct rq_qos *rqos, struct request *rq,
struct bio *bio) struct bio *bio)
{ {
struct ioprio_blkcg *blkcg = ioprio_blkcg_from_bio(bio); struct ioprio_blkcg *blkcg = ioprio_blkcg_from_bio(bio);
u16 prio;
if (!blkcg->prio_set)
return;
/* /*
* Except for IOPRIO_CLASS_NONE, higher I/O priority numbers * Except for IOPRIO_CLASS_NONE, higher I/O priority numbers
...@@ -199,8 +204,10 @@ static void blkcg_ioprio_track(struct rq_qos *rqos, struct request *rq, ...@@ -199,8 +204,10 @@ static void blkcg_ioprio_track(struct rq_qos *rqos, struct request *rq,
* bio I/O priority is not modified. If the bio I/O priority equals * bio I/O priority is not modified. If the bio I/O priority equals
* IOPRIO_CLASS_NONE, the cgroup I/O priority is assigned to the bio. * IOPRIO_CLASS_NONE, the cgroup I/O priority is assigned to the bio.
*/ */
bio->bi_ioprio = max_t(u16, bio->bi_ioprio, prio = max_t(u16, bio->bi_ioprio,
IOPRIO_PRIO_VALUE(blkcg->prio_policy, 0)); IOPRIO_PRIO_VALUE(blkcg->prio_policy, 0));
if (prio > bio->bi_ioprio)
bio->bi_ioprio = prio;
} }
static void blkcg_ioprio_exit(struct rq_qos *rqos) static void blkcg_ioprio_exit(struct rq_qos *rqos)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment