blkg_rwstat: separate op from flags

The bio and request operation and flags are going to be separate
definitions, so we cannot pass them in as a bitmap. This patch
converts the blkg_rwstat code and its caller, cfq, to pass in the
values separately.

Signed-off-by: Mike Christie <mchristi@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
Mike Christie 2016-06-05 14:32:14 -05:00 committed by Jens Axboe
parent ba568ea0a2
commit 63a4cc2486
2 changed files with 36 additions and 26 deletions

View File

@ -667,9 +667,10 @@ static inline void cfqg_put(struct cfq_group *cfqg)
} while (0) } while (0)
static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg, static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg,
struct cfq_group *curr_cfqg, int rw) struct cfq_group *curr_cfqg, int op,
int op_flags)
{ {
blkg_rwstat_add(&cfqg->stats.queued, rw, 1); blkg_rwstat_add(&cfqg->stats.queued, op, op_flags, 1);
cfqg_stats_end_empty_time(&cfqg->stats); cfqg_stats_end_empty_time(&cfqg->stats);
cfqg_stats_set_start_group_wait_time(cfqg, curr_cfqg); cfqg_stats_set_start_group_wait_time(cfqg, curr_cfqg);
} }
@ -683,26 +684,30 @@ static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg,
#endif #endif
} }
static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int rw) static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int op,
int op_flags)
{ {
blkg_rwstat_add(&cfqg->stats.queued, rw, -1); blkg_rwstat_add(&cfqg->stats.queued, op, op_flags, -1);
} }
static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int rw) static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int op,
int op_flags)
{ {
blkg_rwstat_add(&cfqg->stats.merged, rw, 1); blkg_rwstat_add(&cfqg->stats.merged, op, op_flags, 1);
} }
static inline void cfqg_stats_update_completion(struct cfq_group *cfqg, static inline void cfqg_stats_update_completion(struct cfq_group *cfqg,
uint64_t start_time, uint64_t io_start_time, int rw) uint64_t start_time, uint64_t io_start_time, int op,
int op_flags)
{ {
struct cfqg_stats *stats = &cfqg->stats; struct cfqg_stats *stats = &cfqg->stats;
unsigned long long now = sched_clock(); unsigned long long now = sched_clock();
if (time_after64(now, io_start_time)) if (time_after64(now, io_start_time))
blkg_rwstat_add(&stats->service_time, rw, now - io_start_time); blkg_rwstat_add(&stats->service_time, op, op_flags,
now - io_start_time);
if (time_after64(io_start_time, start_time)) if (time_after64(io_start_time, start_time))
blkg_rwstat_add(&stats->wait_time, rw, blkg_rwstat_add(&stats->wait_time, op, op_flags,
io_start_time - start_time); io_start_time - start_time);
} }
@ -781,13 +786,16 @@ static inline void cfqg_put(struct cfq_group *cfqg) { }
#define cfq_log_cfqg(cfqd, cfqg, fmt, args...) do {} while (0) #define cfq_log_cfqg(cfqd, cfqg, fmt, args...) do {} while (0)
static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg, static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg,
struct cfq_group *curr_cfqg, int rw) { } struct cfq_group *curr_cfqg, int op, int op_flags) { }
static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg, static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg,
unsigned long time, unsigned long unaccounted_time) { } unsigned long time, unsigned long unaccounted_time) { }
static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int rw) { } static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int op,
static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int rw) { } int op_flags) { }
static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int op,
int op_flags) { }
static inline void cfqg_stats_update_completion(struct cfq_group *cfqg, static inline void cfqg_stats_update_completion(struct cfq_group *cfqg,
uint64_t start_time, uint64_t io_start_time, int rw) { } uint64_t start_time, uint64_t io_start_time, int op,
int op_flags) { }
#endif /* CONFIG_CFQ_GROUP_IOSCHED */ #endif /* CONFIG_CFQ_GROUP_IOSCHED */
@ -2461,10 +2469,10 @@ static void cfq_reposition_rq_rb(struct cfq_queue *cfqq, struct request *rq)
{ {
elv_rb_del(&cfqq->sort_list, rq); elv_rb_del(&cfqq->sort_list, rq);
cfqq->queued[rq_is_sync(rq)]--; cfqq->queued[rq_is_sync(rq)]--;
cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->cmd_flags); cfqg_stats_update_io_remove(RQ_CFQG(rq), req_op(rq), rq->cmd_flags);
cfq_add_rq_rb(rq); cfq_add_rq_rb(rq);
cfqg_stats_update_io_add(RQ_CFQG(rq), cfqq->cfqd->serving_group, cfqg_stats_update_io_add(RQ_CFQG(rq), cfqq->cfqd->serving_group,
rq->cmd_flags); req_op(rq), rq->cmd_flags);
} }
static struct request * static struct request *
@ -2517,7 +2525,7 @@ static void cfq_remove_request(struct request *rq)
cfq_del_rq_rb(rq); cfq_del_rq_rb(rq);
cfqq->cfqd->rq_queued--; cfqq->cfqd->rq_queued--;
cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->cmd_flags); cfqg_stats_update_io_remove(RQ_CFQG(rq), req_op(rq), rq->cmd_flags);
if (rq->cmd_flags & REQ_PRIO) { if (rq->cmd_flags & REQ_PRIO) {
WARN_ON(!cfqq->prio_pending); WARN_ON(!cfqq->prio_pending);
cfqq->prio_pending--; cfqq->prio_pending--;
@ -2552,7 +2560,7 @@ static void cfq_merged_request(struct request_queue *q, struct request *req,
static void cfq_bio_merged(struct request_queue *q, struct request *req, static void cfq_bio_merged(struct request_queue *q, struct request *req,
struct bio *bio) struct bio *bio)
{ {
cfqg_stats_update_io_merged(RQ_CFQG(req), bio->bi_rw); cfqg_stats_update_io_merged(RQ_CFQG(req), bio_op(bio), bio->bi_rw);
} }
static void static void
@ -2575,7 +2583,7 @@ cfq_merged_requests(struct request_queue *q, struct request *rq,
if (cfqq->next_rq == next) if (cfqq->next_rq == next)
cfqq->next_rq = rq; cfqq->next_rq = rq;
cfq_remove_request(next); cfq_remove_request(next);
cfqg_stats_update_io_merged(RQ_CFQG(rq), next->cmd_flags); cfqg_stats_update_io_merged(RQ_CFQG(rq), req_op(next), next->cmd_flags);
cfqq = RQ_CFQQ(next); cfqq = RQ_CFQQ(next);
/* /*
@ -4108,7 +4116,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq)
rq->fifo_time = jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]; rq->fifo_time = jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)];
list_add_tail(&rq->queuelist, &cfqq->fifo); list_add_tail(&rq->queuelist, &cfqq->fifo);
cfq_add_rq_rb(rq); cfq_add_rq_rb(rq);
cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, req_op(rq),
rq->cmd_flags); rq->cmd_flags);
cfq_rq_enqueued(cfqd, cfqq, rq); cfq_rq_enqueued(cfqd, cfqq, rq);
} }
@ -4206,7 +4214,8 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
cfqq->dispatched--; cfqq->dispatched--;
(RQ_CFQG(rq))->dispatched--; (RQ_CFQG(rq))->dispatched--;
cfqg_stats_update_completion(cfqq->cfqg, rq_start_time_ns(rq), cfqg_stats_update_completion(cfqq->cfqg, rq_start_time_ns(rq),
rq_io_start_time_ns(rq), rq->cmd_flags); rq_io_start_time_ns(rq), req_op(rq),
rq->cmd_flags);
cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--; cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--;

View File

@ -590,25 +590,26 @@ static inline void blkg_rwstat_exit(struct blkg_rwstat *rwstat)
/** /**
* blkg_rwstat_add - add a value to a blkg_rwstat * blkg_rwstat_add - add a value to a blkg_rwstat
* @rwstat: target blkg_rwstat * @rwstat: target blkg_rwstat
* @rw: mask of REQ_{WRITE|SYNC} * @op: REQ_OP
* @op_flags: rq_flag_bits
* @val: value to add * @val: value to add
* *
* Add @val to @rwstat. The counters are chosen according to @rw. The * Add @val to @rwstat. The counters are chosen according to @rw. The
* caller is responsible for synchronizing calls to this function. * caller is responsible for synchronizing calls to this function.
*/ */
static inline void blkg_rwstat_add(struct blkg_rwstat *rwstat, static inline void blkg_rwstat_add(struct blkg_rwstat *rwstat,
int rw, uint64_t val) int op, int op_flags, uint64_t val)
{ {
struct percpu_counter *cnt; struct percpu_counter *cnt;
if (op_is_write(rw)) if (op_is_write(op))
cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_WRITE]; cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_WRITE];
else else
cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_READ]; cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_READ];
__percpu_counter_add(cnt, val, BLKG_STAT_CPU_BATCH); __percpu_counter_add(cnt, val, BLKG_STAT_CPU_BATCH);
if (rw & REQ_SYNC) if (op_flags & REQ_SYNC)
cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_SYNC]; cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_SYNC];
else else
cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_ASYNC]; cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_ASYNC];
@ -713,9 +714,9 @@ static inline bool blkcg_bio_issue_check(struct request_queue *q,
if (!throtl) { if (!throtl) {
blkg = blkg ?: q->root_blkg; blkg = blkg ?: q->root_blkg;
blkg_rwstat_add(&blkg->stat_bytes, bio->bi_rw, blkg_rwstat_add(&blkg->stat_bytes, bio_op(bio), bio->bi_rw,
bio->bi_iter.bi_size); bio->bi_iter.bi_size);
blkg_rwstat_add(&blkg->stat_ios, bio->bi_rw, 1); blkg_rwstat_add(&blkg->stat_ios, bio_op(bio), bio->bi_rw, 1);
} }
rcu_read_unlock(); rcu_read_unlock();