1a497ee34SChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0-or-later */ 2ea25da48SPaolo Valente /* 3ea25da48SPaolo Valente * Header file for the BFQ I/O scheduler: data structures and 4ea25da48SPaolo Valente * prototypes of interface functions among BFQ components. 5ea25da48SPaolo Valente */ 6ea25da48SPaolo Valente #ifndef _BFQ_H 7ea25da48SPaolo Valente #define _BFQ_H 8ea25da48SPaolo Valente 9ea25da48SPaolo Valente #include <linux/blktrace_api.h> 10ea25da48SPaolo Valente #include <linux/hrtimer.h> 11ea25da48SPaolo Valente #include <linux/blk-cgroup.h> 12ea25da48SPaolo Valente 131d156646STejun Heo #include "blk-cgroup-rwstat.h" 141d156646STejun Heo 15ea25da48SPaolo Valente #define BFQ_IOPRIO_CLASSES 3 16ea25da48SPaolo Valente #define BFQ_CL_IDLE_TIMEOUT (HZ/5) 17ea25da48SPaolo Valente 18ea25da48SPaolo Valente #define BFQ_MIN_WEIGHT 1 19ea25da48SPaolo Valente #define BFQ_MAX_WEIGHT 1000 20ea25da48SPaolo Valente #define BFQ_WEIGHT_CONVERSION_COEFF 10 21ea25da48SPaolo Valente 22ea25da48SPaolo Valente #define BFQ_DEFAULT_QUEUE_IOPRIO 4 23ea25da48SPaolo Valente 24ea25da48SPaolo Valente #define BFQ_WEIGHT_LEGACY_DFL 100 25ea25da48SPaolo Valente #define BFQ_DEFAULT_GRP_IOPRIO 0 26ea25da48SPaolo Valente #define BFQ_DEFAULT_GRP_CLASS IOPRIO_CLASS_BE 27ea25da48SPaolo Valente 281e66413cSFrancesco Pollicino #define MAX_PID_STR_LENGTH 12 291e66413cSFrancesco Pollicino 30ea25da48SPaolo Valente /* 31ea25da48SPaolo Valente * Soft real-time applications are extremely more latency sensitive 32ea25da48SPaolo Valente * than interactive ones. Over-raise the weight of the former to 33ea25da48SPaolo Valente * privilege them against the latter. 34ea25da48SPaolo Valente */ 35ea25da48SPaolo Valente #define BFQ_SOFTRT_WEIGHT_FACTOR 100 36ea25da48SPaolo Valente 37ea25da48SPaolo Valente struct bfq_entity; 38ea25da48SPaolo Valente 39ea25da48SPaolo Valente /** 40ea25da48SPaolo Valente * struct bfq_service_tree - per ioprio_class service tree. 41ea25da48SPaolo Valente * 42ea25da48SPaolo Valente * Each service tree represents a B-WF2Q+ scheduler on its own. Each 43ea25da48SPaolo Valente * ioprio_class has its own independent scheduler, and so its own 44ea25da48SPaolo Valente * bfq_service_tree. All the fields are protected by the queue lock 45ea25da48SPaolo Valente * of the containing bfqd. 46ea25da48SPaolo Valente */ 47ea25da48SPaolo Valente struct bfq_service_tree { 48ea25da48SPaolo Valente /* tree for active entities (i.e., those backlogged) */ 49ea25da48SPaolo Valente struct rb_root active; 5038c91407SHou Tao /* tree for idle entities (i.e., not backlogged, with V < F_i)*/ 51ea25da48SPaolo Valente struct rb_root idle; 52ea25da48SPaolo Valente 53ea25da48SPaolo Valente /* idle entity with minimum F_i */ 54ea25da48SPaolo Valente struct bfq_entity *first_idle; 55ea25da48SPaolo Valente /* idle entity with maximum F_i */ 56ea25da48SPaolo Valente struct bfq_entity *last_idle; 57ea25da48SPaolo Valente 58ea25da48SPaolo Valente /* scheduler virtual time */ 59ea25da48SPaolo Valente u64 vtime; 60ea25da48SPaolo Valente /* scheduler weight sum; active and idle entities contribute to it */ 61ea25da48SPaolo Valente unsigned long wsum; 62ea25da48SPaolo Valente }; 63ea25da48SPaolo Valente 64ea25da48SPaolo Valente /** 65ea25da48SPaolo Valente * struct bfq_sched_data - multi-class scheduler. 66ea25da48SPaolo Valente * 67ea25da48SPaolo Valente * bfq_sched_data is the basic scheduler queue. It supports three 68ea25da48SPaolo Valente * ioprio_classes, and can be used either as a toplevel queue or as an 6946d556e6SPaolo Valente * intermediate queue in a hierarchical setup. 70ea25da48SPaolo Valente * 71ea25da48SPaolo Valente * The supported ioprio_classes are the same as in CFQ, in descending 72ea25da48SPaolo Valente * priority order, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE. 73ea25da48SPaolo Valente * Requests from higher priority queues are served before all the 74ea25da48SPaolo Valente * requests from lower priority queues; among requests of the same 75ea25da48SPaolo Valente * queue requests are served according to B-WF2Q+. 7646d556e6SPaolo Valente * 7746d556e6SPaolo Valente * The schedule is implemented by the service trees, plus the field 7846d556e6SPaolo Valente * @next_in_service, which points to the entity on the active trees 7946d556e6SPaolo Valente * that will be served next, if 1) no changes in the schedule occurs 8046d556e6SPaolo Valente * before the current in-service entity is expired, 2) the in-service 8146d556e6SPaolo Valente * queue becomes idle when it expires, and 3) if the entity pointed by 8246d556e6SPaolo Valente * in_service_entity is not a queue, then the in-service child entity 8346d556e6SPaolo Valente * of the entity pointed by in_service_entity becomes idle on 8446d556e6SPaolo Valente * expiration. This peculiar definition allows for the following 8546d556e6SPaolo Valente * optimization, not yet exploited: while a given entity is still in 8646d556e6SPaolo Valente * service, we already know which is the best candidate for next 87636b8fe8SAngelo Ruocco * service among the other active entities in the same parent 8846d556e6SPaolo Valente * entity. We can then quickly compare the timestamps of the 8946d556e6SPaolo Valente * in-service entity with those of such best candidate. 9046d556e6SPaolo Valente * 9146d556e6SPaolo Valente * All fields are protected by the lock of the containing bfqd. 92ea25da48SPaolo Valente */ 93ea25da48SPaolo Valente struct bfq_sched_data { 94ea25da48SPaolo Valente /* entity in service */ 95ea25da48SPaolo Valente struct bfq_entity *in_service_entity; 96ea25da48SPaolo Valente /* head-of-line entity (see comments above) */ 97ea25da48SPaolo Valente struct bfq_entity *next_in_service; 98ea25da48SPaolo Valente /* array of service trees, one per ioprio_class */ 99ea25da48SPaolo Valente struct bfq_service_tree service_tree[BFQ_IOPRIO_CLASSES]; 100ea25da48SPaolo Valente /* last time CLASS_IDLE was served */ 101ea25da48SPaolo Valente unsigned long bfq_class_idle_last_service; 102ea25da48SPaolo Valente 103ea25da48SPaolo Valente }; 104ea25da48SPaolo Valente 105ea25da48SPaolo Valente /** 1062d29c9f8SFederico Motta * struct bfq_weight_counter - counter of the number of all active queues 107ea25da48SPaolo Valente * with a given weight. 108ea25da48SPaolo Valente */ 109ea25da48SPaolo Valente struct bfq_weight_counter { 1102d29c9f8SFederico Motta unsigned int weight; /* weight of the queues this counter refers to */ 1112d29c9f8SFederico Motta unsigned int num_active; /* nr of active queues with this weight */ 112ea25da48SPaolo Valente /* 1132d29c9f8SFederico Motta * Weights tree member (see bfq_data's @queue_weights_tree) 114ea25da48SPaolo Valente */ 115ea25da48SPaolo Valente struct rb_node weights_node; 116ea25da48SPaolo Valente }; 117ea25da48SPaolo Valente 118ea25da48SPaolo Valente /** 119ea25da48SPaolo Valente * struct bfq_entity - schedulable entity. 120ea25da48SPaolo Valente * 121ea25da48SPaolo Valente * A bfq_entity is used to represent either a bfq_queue (leaf node in the 122ea25da48SPaolo Valente * cgroup hierarchy) or a bfq_group into the upper level scheduler. Each 123ea25da48SPaolo Valente * entity belongs to the sched_data of the parent group in the cgroup 124ea25da48SPaolo Valente * hierarchy. Non-leaf entities have also their own sched_data, stored 125ea25da48SPaolo Valente * in @my_sched_data. 126ea25da48SPaolo Valente * 127ea25da48SPaolo Valente * Each entity stores independently its priority values; this would 128ea25da48SPaolo Valente * allow different weights on different devices, but this 129ea25da48SPaolo Valente * functionality is not exported to userspace by now. Priorities and 130ea25da48SPaolo Valente * weights are updated lazily, first storing the new values into the 131ea25da48SPaolo Valente * new_* fields, then setting the @prio_changed flag. As soon as 132ea25da48SPaolo Valente * there is a transition in the entity state that allows the priority 133ea25da48SPaolo Valente * update to take place the effective and the requested priority 134ea25da48SPaolo Valente * values are synchronized. 135ea25da48SPaolo Valente * 136ea25da48SPaolo Valente * Unless cgroups are used, the weight value is calculated from the 137ea25da48SPaolo Valente * ioprio to export the same interface as CFQ. When dealing with 138636b8fe8SAngelo Ruocco * "well-behaved" queues (i.e., queues that do not spend too much 139ea25da48SPaolo Valente * time to consume their budget and have true sequential behavior, and 140ea25da48SPaolo Valente * when there are no external factors breaking anticipation) the 141ea25da48SPaolo Valente * relative weights at each level of the cgroups hierarchy should be 142ea25da48SPaolo Valente * guaranteed. All the fields are protected by the queue lock of the 143ea25da48SPaolo Valente * containing bfqd. 144ea25da48SPaolo Valente */ 145ea25da48SPaolo Valente struct bfq_entity { 146ea25da48SPaolo Valente /* service_tree member */ 147ea25da48SPaolo Valente struct rb_node rb_node; 148ea25da48SPaolo Valente 149ea25da48SPaolo Valente /* 150ea25da48SPaolo Valente * Flag, true if the entity is on a tree (either the active or 151ea25da48SPaolo Valente * the idle one of its service_tree) or is in service. 152ea25da48SPaolo Valente */ 153*33a16a98SPaolo Valente bool on_st_or_in_serv; 154ea25da48SPaolo Valente 155ea25da48SPaolo Valente /* B-WF2Q+ start and finish timestamps [sectors/weight] */ 156ea25da48SPaolo Valente u64 start, finish; 157ea25da48SPaolo Valente 158ea25da48SPaolo Valente /* tree the entity is enqueued into; %NULL if not on a tree */ 159ea25da48SPaolo Valente struct rb_root *tree; 160ea25da48SPaolo Valente 161ea25da48SPaolo Valente /* 162ea25da48SPaolo Valente * minimum start time of the (active) subtree rooted at this 163ea25da48SPaolo Valente * entity; used for O(log N) lookups into active trees 164ea25da48SPaolo Valente */ 165ea25da48SPaolo Valente u64 min_start; 166ea25da48SPaolo Valente 167ea25da48SPaolo Valente /* amount of service received during the last service slot */ 168ea25da48SPaolo Valente int service; 169ea25da48SPaolo Valente 170ea25da48SPaolo Valente /* budget, used also to calculate F_i: F_i = S_i + @budget / @weight */ 171ea25da48SPaolo Valente int budget; 172ea25da48SPaolo Valente 173795fe54cSFam Zheng /* device weight, if non-zero, it overrides the default weight of 174795fe54cSFam Zheng * bfq_group_data */ 175795fe54cSFam Zheng int dev_weight; 176ea25da48SPaolo Valente /* weight of the queue */ 177ea25da48SPaolo Valente int weight; 178ea25da48SPaolo Valente /* next weight if a change is in progress */ 179ea25da48SPaolo Valente int new_weight; 180ea25da48SPaolo Valente 181ea25da48SPaolo Valente /* original weight, used to implement weight boosting */ 182ea25da48SPaolo Valente int orig_weight; 183ea25da48SPaolo Valente 184ea25da48SPaolo Valente /* parent entity, for hierarchical scheduling */ 185ea25da48SPaolo Valente struct bfq_entity *parent; 186ea25da48SPaolo Valente 187ea25da48SPaolo Valente /* 188ea25da48SPaolo Valente * For non-leaf nodes in the hierarchy, the associated 189ea25da48SPaolo Valente * scheduler queue, %NULL on leaf nodes. 190ea25da48SPaolo Valente */ 191ea25da48SPaolo Valente struct bfq_sched_data *my_sched_data; 192ea25da48SPaolo Valente /* the scheduler queue this entity belongs to */ 193ea25da48SPaolo Valente struct bfq_sched_data *sched_data; 194ea25da48SPaolo Valente 195ea25da48SPaolo Valente /* flag, set to request a weight, ioprio or ioprio_class change */ 196ea25da48SPaolo Valente int prio_changed; 197ba7aeae5SPaolo Valente 198ba7aeae5SPaolo Valente /* flag, set if the entity is counted in groups_with_pending_reqs */ 199ba7aeae5SPaolo Valente bool in_groups_with_pending_reqs; 200ea25da48SPaolo Valente }; 201ea25da48SPaolo Valente 202ea25da48SPaolo Valente struct bfq_group; 203ea25da48SPaolo Valente 204ea25da48SPaolo Valente /** 205ea25da48SPaolo Valente * struct bfq_ttime - per process thinktime stats. 206ea25da48SPaolo Valente */ 207ea25da48SPaolo Valente struct bfq_ttime { 208ea25da48SPaolo Valente /* completion time of the last request */ 209ea25da48SPaolo Valente u64 last_end_request; 210ea25da48SPaolo Valente 211ea25da48SPaolo Valente /* total process thinktime */ 212ea25da48SPaolo Valente u64 ttime_total; 213ea25da48SPaolo Valente /* number of thinktime samples */ 214ea25da48SPaolo Valente unsigned long ttime_samples; 215ea25da48SPaolo Valente /* average process thinktime */ 216ea25da48SPaolo Valente u64 ttime_mean; 217ea25da48SPaolo Valente }; 218ea25da48SPaolo Valente 219ea25da48SPaolo Valente /** 220ea25da48SPaolo Valente * struct bfq_queue - leaf schedulable entity. 221ea25da48SPaolo Valente * 222ea25da48SPaolo Valente * A bfq_queue is a leaf request queue; it can be associated with an 223ea25da48SPaolo Valente * io_context or more, if it is async or shared between cooperating 224ea25da48SPaolo Valente * processes. @cgroup holds a reference to the cgroup, to be sure that it 225ea25da48SPaolo Valente * does not disappear while a bfqq still references it (mostly to avoid 226ea25da48SPaolo Valente * races between request issuing and task migration followed by cgroup 227ea25da48SPaolo Valente * destruction). 228ea25da48SPaolo Valente * All the fields are protected by the queue lock of the containing bfqd. 229ea25da48SPaolo Valente */ 230ea25da48SPaolo Valente struct bfq_queue { 231ea25da48SPaolo Valente /* reference counter */ 232ea25da48SPaolo Valente int ref; 233ea25da48SPaolo Valente /* parent bfq_data */ 234ea25da48SPaolo Valente struct bfq_data *bfqd; 235ea25da48SPaolo Valente 236ea25da48SPaolo Valente /* current ioprio and ioprio class */ 237ea25da48SPaolo Valente unsigned short ioprio, ioprio_class; 238ea25da48SPaolo Valente /* next ioprio and ioprio class if a change is in progress */ 239ea25da48SPaolo Valente unsigned short new_ioprio, new_ioprio_class; 240ea25da48SPaolo Valente 2412341d662SPaolo Valente /* last total-service-time sample, see bfq_update_inject_limit() */ 2422341d662SPaolo Valente u64 last_serv_time_ns; 2432341d662SPaolo Valente /* limit for request injection */ 2442341d662SPaolo Valente unsigned int inject_limit; 2452341d662SPaolo Valente /* last time the inject limit has been decreased, in jiffies */ 2462341d662SPaolo Valente unsigned long decrease_time_jif; 2472341d662SPaolo Valente 248ea25da48SPaolo Valente /* 249ea25da48SPaolo Valente * Shared bfq_queue if queue is cooperating with one or more 250ea25da48SPaolo Valente * other queues. 251ea25da48SPaolo Valente */ 252ea25da48SPaolo Valente struct bfq_queue *new_bfqq; 253ea25da48SPaolo Valente /* request-position tree member (see bfq_group's @rq_pos_tree) */ 254ea25da48SPaolo Valente struct rb_node pos_node; 255ea25da48SPaolo Valente /* request-position tree root (see bfq_group's @rq_pos_tree) */ 256ea25da48SPaolo Valente struct rb_root *pos_root; 257ea25da48SPaolo Valente 258ea25da48SPaolo Valente /* sorted list of pending requests */ 259ea25da48SPaolo Valente struct rb_root sort_list; 260ea25da48SPaolo Valente /* if fifo isn't expired, next request to serve */ 261ea25da48SPaolo Valente struct request *next_rq; 262ea25da48SPaolo Valente /* number of sync and async requests queued */ 263ea25da48SPaolo Valente int queued[2]; 264ea25da48SPaolo Valente /* number of requests currently allocated */ 265ea25da48SPaolo Valente int allocated; 266ea25da48SPaolo Valente /* number of pending metadata requests */ 267ea25da48SPaolo Valente int meta_pending; 268ea25da48SPaolo Valente /* fifo list of requests in sort_list */ 269ea25da48SPaolo Valente struct list_head fifo; 270ea25da48SPaolo Valente 271ea25da48SPaolo Valente /* entity representing this queue in the scheduler */ 272ea25da48SPaolo Valente struct bfq_entity entity; 273ea25da48SPaolo Valente 2742d29c9f8SFederico Motta /* pointer to the weight counter associated with this entity */ 2752d29c9f8SFederico Motta struct bfq_weight_counter *weight_counter; 2762d29c9f8SFederico Motta 277ea25da48SPaolo Valente /* maximum budget allowed from the feedback mechanism */ 278ea25da48SPaolo Valente int max_budget; 279ea25da48SPaolo Valente /* budget expiration (in jiffies) */ 280ea25da48SPaolo Valente unsigned long budget_timeout; 281ea25da48SPaolo Valente 282ea25da48SPaolo Valente /* number of requests on the dispatch list or inside driver */ 283ea25da48SPaolo Valente int dispatched; 284ea25da48SPaolo Valente 285ea25da48SPaolo Valente /* status flags */ 286ea25da48SPaolo Valente unsigned long flags; 287ea25da48SPaolo Valente 288ea25da48SPaolo Valente /* node for active/idle bfqq list inside parent bfqd */ 289ea25da48SPaolo Valente struct list_head bfqq_list; 290ea25da48SPaolo Valente 291ea25da48SPaolo Valente /* associated @bfq_ttime struct */ 292ea25da48SPaolo Valente struct bfq_ttime ttime; 293ea25da48SPaolo Valente 294ea25da48SPaolo Valente /* bit vector: a 1 for each seeky requests in history */ 295ea25da48SPaolo Valente u32 seek_history; 296ea25da48SPaolo Valente 297ea25da48SPaolo Valente /* node for the device's burst list */ 298ea25da48SPaolo Valente struct hlist_node burst_list_node; 299ea25da48SPaolo Valente 300ea25da48SPaolo Valente /* position of the last request enqueued */ 301ea25da48SPaolo Valente sector_t last_request_pos; 302ea25da48SPaolo Valente 303ea25da48SPaolo Valente /* Number of consecutive pairs of request completion and 304ea25da48SPaolo Valente * arrival, such that the queue becomes idle after the 305ea25da48SPaolo Valente * completion, but the next request arrives within an idle 306ea25da48SPaolo Valente * time slice; used only if the queue's IO_bound flag has been 307ea25da48SPaolo Valente * cleared. 308ea25da48SPaolo Valente */ 309ea25da48SPaolo Valente unsigned int requests_within_timer; 310ea25da48SPaolo Valente 311ea25da48SPaolo Valente /* pid of the process owning the queue, used for logging purposes */ 312ea25da48SPaolo Valente pid_t pid; 313ea25da48SPaolo Valente 314ea25da48SPaolo Valente /* 315ea25da48SPaolo Valente * Pointer to the bfq_io_cq owning the bfq_queue, set to %NULL 316ea25da48SPaolo Valente * if the queue is shared. 317ea25da48SPaolo Valente */ 318ea25da48SPaolo Valente struct bfq_io_cq *bic; 319ea25da48SPaolo Valente 320ea25da48SPaolo Valente /* current maximum weight-raising time for this queue */ 321ea25da48SPaolo Valente unsigned long wr_cur_max_time; 322ea25da48SPaolo Valente /* 323ea25da48SPaolo Valente * Minimum time instant such that, only if a new request is 324ea25da48SPaolo Valente * enqueued after this time instant in an idle @bfq_queue with 325ea25da48SPaolo Valente * no outstanding requests, then the task associated with the 326ea25da48SPaolo Valente * queue it is deemed as soft real-time (see the comments on 327ea25da48SPaolo Valente * the function bfq_bfqq_softrt_next_start()) 328ea25da48SPaolo Valente */ 329ea25da48SPaolo Valente unsigned long soft_rt_next_start; 330ea25da48SPaolo Valente /* 331ea25da48SPaolo Valente * Start time of the current weight-raising period if 332ea25da48SPaolo Valente * the @bfq-queue is being weight-raised, otherwise 333ea25da48SPaolo Valente * finish time of the last weight-raising period. 334ea25da48SPaolo Valente */ 335ea25da48SPaolo Valente unsigned long last_wr_start_finish; 336ea25da48SPaolo Valente /* factor by which the weight of this queue is multiplied */ 337ea25da48SPaolo Valente unsigned int wr_coeff; 338ea25da48SPaolo Valente /* 339ea25da48SPaolo Valente * Time of the last transition of the @bfq_queue from idle to 340ea25da48SPaolo Valente * backlogged. 341ea25da48SPaolo Valente */ 342ea25da48SPaolo Valente unsigned long last_idle_bklogged; 343ea25da48SPaolo Valente /* 344ea25da48SPaolo Valente * Cumulative service received from the @bfq_queue since the 345ea25da48SPaolo Valente * last transition from idle to backlogged. 346ea25da48SPaolo Valente */ 347ea25da48SPaolo Valente unsigned long service_from_backlogged; 3488a8747dcSPaolo Valente /* 3498a8747dcSPaolo Valente * Cumulative service received from the @bfq_queue since its 3508a8747dcSPaolo Valente * last transition to weight-raised state. 3518a8747dcSPaolo Valente */ 3528a8747dcSPaolo Valente unsigned long service_from_wr; 353ea25da48SPaolo Valente 354ea25da48SPaolo Valente /* 355ea25da48SPaolo Valente * Value of wr start time when switching to soft rt 356ea25da48SPaolo Valente */ 357ea25da48SPaolo Valente unsigned long wr_start_at_switch_to_srt; 358ea25da48SPaolo Valente 359ea25da48SPaolo Valente unsigned long split_time; /* time of last split */ 3607b8fa3b9SPaolo Valente 3617b8fa3b9SPaolo Valente unsigned long first_IO_time; /* time of first I/O for this queue */ 362d0edc247SPaolo Valente 363d0edc247SPaolo Valente /* max service rate measured so far */ 364d0edc247SPaolo Valente u32 max_service_rate; 36513a857a4SPaolo Valente 36613a857a4SPaolo Valente /* 36713a857a4SPaolo Valente * Pointer to the waker queue for this queue, i.e., to the 36813a857a4SPaolo Valente * queue Q such that this queue happens to get new I/O right 36913a857a4SPaolo Valente * after some I/O request of Q is completed. For details, see 37013a857a4SPaolo Valente * the comments on the choice of the queue for injection in 37113a857a4SPaolo Valente * bfq_select_queue(). 37213a857a4SPaolo Valente */ 37313a857a4SPaolo Valente struct bfq_queue *waker_bfqq; 37413a857a4SPaolo Valente /* node for woken_list, see below */ 37513a857a4SPaolo Valente struct hlist_node woken_list_node; 37613a857a4SPaolo Valente /* 37713a857a4SPaolo Valente * Head of the list of the woken queues for this queue, i.e., 37813a857a4SPaolo Valente * of the list of the queues for which this queue is a waker 37913a857a4SPaolo Valente * queue. This list is used to reset the waker_bfqq pointer in 38013a857a4SPaolo Valente * the woken queues when this queue exits. 38113a857a4SPaolo Valente */ 38213a857a4SPaolo Valente struct hlist_head woken_list; 383ea25da48SPaolo Valente }; 384ea25da48SPaolo Valente 385ea25da48SPaolo Valente /** 386ea25da48SPaolo Valente * struct bfq_io_cq - per (request_queue, io_context) structure. 387ea25da48SPaolo Valente */ 388ea25da48SPaolo Valente struct bfq_io_cq { 389ea25da48SPaolo Valente /* associated io_cq structure */ 390ea25da48SPaolo Valente struct io_cq icq; /* must be the first member */ 391ea25da48SPaolo Valente /* array of two process queues, the sync and the async */ 392ea25da48SPaolo Valente struct bfq_queue *bfqq[2]; 393ea25da48SPaolo Valente /* per (request_queue, blkcg) ioprio */ 394ea25da48SPaolo Valente int ioprio; 395ea25da48SPaolo Valente #ifdef CONFIG_BFQ_GROUP_IOSCHED 396ea25da48SPaolo Valente uint64_t blkcg_serial_nr; /* the current blkcg serial */ 397ea25da48SPaolo Valente #endif 398ea25da48SPaolo Valente /* 399d5be3fefSPaolo Valente * Snapshot of the has_short_time flag before merging; taken 400d5be3fefSPaolo Valente * to remember its value while the queue is merged, so as to 401d5be3fefSPaolo Valente * be able to restore it in case of split. 402ea25da48SPaolo Valente */ 403d5be3fefSPaolo Valente bool saved_has_short_ttime; 404ea25da48SPaolo Valente /* 405ea25da48SPaolo Valente * Same purpose as the previous two fields for the I/O bound 406ea25da48SPaolo Valente * classification of a queue. 407ea25da48SPaolo Valente */ 408ea25da48SPaolo Valente bool saved_IO_bound; 409ea25da48SPaolo Valente 410ea25da48SPaolo Valente /* 411ea25da48SPaolo Valente * Same purpose as the previous fields for the value of the 412ea25da48SPaolo Valente * field keeping the queue's belonging to a large burst 413ea25da48SPaolo Valente */ 414ea25da48SPaolo Valente bool saved_in_large_burst; 415ea25da48SPaolo Valente /* 416ea25da48SPaolo Valente * True if the queue belonged to a burst list before its merge 417ea25da48SPaolo Valente * with another cooperating queue. 418ea25da48SPaolo Valente */ 419ea25da48SPaolo Valente bool was_in_burst_list; 420ea25da48SPaolo Valente 421ea25da48SPaolo Valente /* 422fffca087SFrancesco Pollicino * Save the weight when a merge occurs, to be able 423fffca087SFrancesco Pollicino * to restore it in case of split. If the weight is not 424fffca087SFrancesco Pollicino * correctly resumed when the queue is recycled, 425fffca087SFrancesco Pollicino * then the weight of the recycled queue could differ 426fffca087SFrancesco Pollicino * from the weight of the original queue. 427fffca087SFrancesco Pollicino */ 428fffca087SFrancesco Pollicino unsigned int saved_weight; 429fffca087SFrancesco Pollicino 430fffca087SFrancesco Pollicino /* 431ea25da48SPaolo Valente * Similar to previous fields: save wr information. 432ea25da48SPaolo Valente */ 433ea25da48SPaolo Valente unsigned long saved_wr_coeff; 434ea25da48SPaolo Valente unsigned long saved_last_wr_start_finish; 435ea25da48SPaolo Valente unsigned long saved_wr_start_at_switch_to_srt; 436ea25da48SPaolo Valente unsigned int saved_wr_cur_max_time; 437ea25da48SPaolo Valente struct bfq_ttime saved_ttime; 438ea25da48SPaolo Valente }; 439ea25da48SPaolo Valente 440ea25da48SPaolo Valente /** 441ea25da48SPaolo Valente * struct bfq_data - per-device data structure. 442ea25da48SPaolo Valente * 443ea25da48SPaolo Valente * All the fields are protected by @lock. 444ea25da48SPaolo Valente */ 445ea25da48SPaolo Valente struct bfq_data { 446ea25da48SPaolo Valente /* device request queue */ 447ea25da48SPaolo Valente struct request_queue *queue; 448ea25da48SPaolo Valente /* dispatch queue */ 449ea25da48SPaolo Valente struct list_head dispatch; 450ea25da48SPaolo Valente 451ea25da48SPaolo Valente /* root bfq_group for the device */ 452ea25da48SPaolo Valente struct bfq_group *root_group; 453ea25da48SPaolo Valente 454ea25da48SPaolo Valente /* 455ea25da48SPaolo Valente * rbtree of weight counters of @bfq_queues, sorted by 456ea25da48SPaolo Valente * weight. Used to keep track of whether all @bfq_queues have 457ea25da48SPaolo Valente * the same weight. The tree contains one counter for each 458ea25da48SPaolo Valente * distinct weight associated to some active and not 459ea25da48SPaolo Valente * weight-raised @bfq_queue (see the comments to the functions 460ea25da48SPaolo Valente * bfq_weights_tree_[add|remove] for further details). 461ea25da48SPaolo Valente */ 462fb53ac6cSPaolo Valente struct rb_root_cached queue_weights_tree; 463ba7aeae5SPaolo Valente 464ea25da48SPaolo Valente /* 465ba7aeae5SPaolo Valente * Number of groups with at least one descendant process that 466ba7aeae5SPaolo Valente * has at least one request waiting for completion. Note that 467ba7aeae5SPaolo Valente * this accounts for also requests already dispatched, but not 468ba7aeae5SPaolo Valente * yet completed. Therefore this number of groups may differ 469ba7aeae5SPaolo Valente * (be larger) than the number of active groups, as a group is 470ba7aeae5SPaolo Valente * considered active only if its corresponding entity has 471ba7aeae5SPaolo Valente * descendant queues with at least one request queued. This 472ba7aeae5SPaolo Valente * number is used to decide whether a scenario is symmetric. 473ba7aeae5SPaolo Valente * For a detailed explanation see comments on the computation 474ba7aeae5SPaolo Valente * of the variable asymmetric_scenario in the function 475ba7aeae5SPaolo Valente * bfq_better_to_idle(). 476ba7aeae5SPaolo Valente * 477ba7aeae5SPaolo Valente * However, it is hard to compute this number exactly, for 478ba7aeae5SPaolo Valente * groups with multiple descendant processes. Consider a group 479ba7aeae5SPaolo Valente * that is inactive, i.e., that has no descendant process with 480ba7aeae5SPaolo Valente * pending I/O inside BFQ queues. Then suppose that 481ba7aeae5SPaolo Valente * num_groups_with_pending_reqs is still accounting for this 482ba7aeae5SPaolo Valente * group, because the group has descendant processes with some 483ba7aeae5SPaolo Valente * I/O request still in flight. num_groups_with_pending_reqs 484ba7aeae5SPaolo Valente * should be decremented when the in-flight request of the 485ba7aeae5SPaolo Valente * last descendant process is finally completed (assuming that 486ba7aeae5SPaolo Valente * nothing else has changed for the group in the meantime, in 487ba7aeae5SPaolo Valente * terms of composition of the group and active/inactive state of child 488ba7aeae5SPaolo Valente * groups and processes). To accomplish this, an additional 489ba7aeae5SPaolo Valente * pending-request counter must be added to entities, and must 490ba7aeae5SPaolo Valente * be updated correctly. To avoid this additional field and operations, 491ba7aeae5SPaolo Valente * we resort to the following tradeoff between simplicity and 492ba7aeae5SPaolo Valente * accuracy: for an inactive group that is still counted in 493ba7aeae5SPaolo Valente * num_groups_with_pending_reqs, we decrement 494ba7aeae5SPaolo Valente * num_groups_with_pending_reqs when the first descendant 495ba7aeae5SPaolo Valente * process of the group remains with no request waiting for 496ba7aeae5SPaolo Valente * completion. 497ba7aeae5SPaolo Valente * 498ba7aeae5SPaolo Valente * Even this simpler decrement strategy requires a little 499ba7aeae5SPaolo Valente * carefulness: to avoid multiple decrements, we flag a group, 500ba7aeae5SPaolo Valente * more precisely an entity representing a group, as still 501ba7aeae5SPaolo Valente * counted in num_groups_with_pending_reqs when it becomes 502ba7aeae5SPaolo Valente * inactive. Then, when the first descendant queue of the 503ba7aeae5SPaolo Valente * entity remains with no request waiting for completion, 504ba7aeae5SPaolo Valente * num_groups_with_pending_reqs is decremented, and this flag 505ba7aeae5SPaolo Valente * is reset. After this flag is reset for the entity, 506ba7aeae5SPaolo Valente * num_groups_with_pending_reqs won't be decremented any 507ba7aeae5SPaolo Valente * longer in case a new descendant queue of the entity remains 508ba7aeae5SPaolo Valente * with no request waiting for completion. 509ea25da48SPaolo Valente */ 510ba7aeae5SPaolo Valente unsigned int num_groups_with_pending_reqs; 511ea25da48SPaolo Valente 512ea25da48SPaolo Valente /* 51373d58118SPaolo Valente * Per-class (RT, BE, IDLE) number of bfq_queues containing 51473d58118SPaolo Valente * requests (including the queue in service, even if it is 51573d58118SPaolo Valente * idling). 516ea25da48SPaolo Valente */ 51773d58118SPaolo Valente unsigned int busy_queues[3]; 518ea25da48SPaolo Valente /* number of weight-raised busy @bfq_queues */ 519ea25da48SPaolo Valente int wr_busy_queues; 520ea25da48SPaolo Valente /* number of queued requests */ 521ea25da48SPaolo Valente int queued; 522ea25da48SPaolo Valente /* number of requests dispatched and waiting for completion */ 523ea25da48SPaolo Valente int rq_in_driver; 524ea25da48SPaolo Valente 5258cacc5abSPaolo Valente /* true if the device is non rotational and performs queueing */ 5268cacc5abSPaolo Valente bool nonrot_with_queueing; 5278cacc5abSPaolo Valente 528ea25da48SPaolo Valente /* 529ea25da48SPaolo Valente * Maximum number of requests in driver in the last 530ea25da48SPaolo Valente * @hw_tag_samples completed requests. 531ea25da48SPaolo Valente */ 532ea25da48SPaolo Valente int max_rq_in_driver; 533ea25da48SPaolo Valente /* number of samples used to calculate hw_tag */ 534ea25da48SPaolo Valente int hw_tag_samples; 535ea25da48SPaolo Valente /* flag set to one if the driver is showing a queueing behavior */ 536ea25da48SPaolo Valente int hw_tag; 537ea25da48SPaolo Valente 538ea25da48SPaolo Valente /* number of budgets assigned */ 539ea25da48SPaolo Valente int budgets_assigned; 540ea25da48SPaolo Valente 541ea25da48SPaolo Valente /* 542ea25da48SPaolo Valente * Timer set when idling (waiting) for the next request from 543ea25da48SPaolo Valente * the queue in service. 544ea25da48SPaolo Valente */ 545ea25da48SPaolo Valente struct hrtimer idle_slice_timer; 546ea25da48SPaolo Valente 547ea25da48SPaolo Valente /* bfq_queue in service */ 548ea25da48SPaolo Valente struct bfq_queue *in_service_queue; 549ea25da48SPaolo Valente 550ea25da48SPaolo Valente /* on-disk position of the last served request */ 551ea25da48SPaolo Valente sector_t last_position; 552ea25da48SPaolo Valente 553058fdeccSPaolo Valente /* position of the last served request for the in-service queue */ 554058fdeccSPaolo Valente sector_t in_serv_last_pos; 555058fdeccSPaolo Valente 556ea25da48SPaolo Valente /* time of last request completion (ns) */ 557ea25da48SPaolo Valente u64 last_completion; 558ea25da48SPaolo Valente 55913a857a4SPaolo Valente /* bfqq owning the last completed rq */ 56013a857a4SPaolo Valente struct bfq_queue *last_completed_rq_bfqq; 56113a857a4SPaolo Valente 5622341d662SPaolo Valente /* time of last transition from empty to non-empty (ns) */ 5632341d662SPaolo Valente u64 last_empty_occupied_ns; 5642341d662SPaolo Valente 5652341d662SPaolo Valente /* 5662341d662SPaolo Valente * Flag set to activate the sampling of the total service time 5672341d662SPaolo Valente * of a just-arrived first I/O request (see 5682341d662SPaolo Valente * bfq_update_inject_limit()). This will cause the setting of 5692341d662SPaolo Valente * waited_rq when the request is finally dispatched. 5702341d662SPaolo Valente */ 5712341d662SPaolo Valente bool wait_dispatch; 5722341d662SPaolo Valente /* 5732341d662SPaolo Valente * If set, then bfq_update_inject_limit() is invoked when 5742341d662SPaolo Valente * waited_rq is eventually completed. 5752341d662SPaolo Valente */ 5762341d662SPaolo Valente struct request *waited_rq; 5772341d662SPaolo Valente /* 5782341d662SPaolo Valente * True if some request has been injected during the last service hole. 5792341d662SPaolo Valente */ 5802341d662SPaolo Valente bool rqs_injected; 5812341d662SPaolo Valente 582ea25da48SPaolo Valente /* time of first rq dispatch in current observation interval (ns) */ 583ea25da48SPaolo Valente u64 first_dispatch; 584ea25da48SPaolo Valente /* time of last rq dispatch in current observation interval (ns) */ 585ea25da48SPaolo Valente u64 last_dispatch; 586ea25da48SPaolo Valente 587ea25da48SPaolo Valente /* beginning of the last budget */ 588ea25da48SPaolo Valente ktime_t last_budget_start; 589ea25da48SPaolo Valente /* beginning of the last idle slice */ 590ea25da48SPaolo Valente ktime_t last_idling_start; 5912341d662SPaolo Valente unsigned long last_idling_start_jiffies; 592ea25da48SPaolo Valente 593ea25da48SPaolo Valente /* number of samples in current observation interval */ 594ea25da48SPaolo Valente int peak_rate_samples; 595ea25da48SPaolo Valente /* num of samples of seq dispatches in current observation interval */ 596ea25da48SPaolo Valente u32 sequential_samples; 597ea25da48SPaolo Valente /* total num of sectors transferred in current observation interval */ 598ea25da48SPaolo Valente u64 tot_sectors_dispatched; 599ea25da48SPaolo Valente /* max rq size seen during current observation interval (sectors) */ 600ea25da48SPaolo Valente u32 last_rq_max_size; 601ea25da48SPaolo Valente /* time elapsed from first dispatch in current observ. interval (us) */ 602ea25da48SPaolo Valente u64 delta_from_first; 603ea25da48SPaolo Valente /* 604ea25da48SPaolo Valente * Current estimate of the device peak rate, measured in 605bc56e2caSPaolo Valente * [(sectors/usec) / 2^BFQ_RATE_SHIFT]. The left-shift by 606ea25da48SPaolo Valente * BFQ_RATE_SHIFT is performed to increase precision in 607ea25da48SPaolo Valente * fixed-point calculations. 608ea25da48SPaolo Valente */ 609ea25da48SPaolo Valente u32 peak_rate; 610ea25da48SPaolo Valente 611ea25da48SPaolo Valente /* maximum budget allotted to a bfq_queue before rescheduling */ 612ea25da48SPaolo Valente int bfq_max_budget; 613ea25da48SPaolo Valente 614ea25da48SPaolo Valente /* list of all the bfq_queues active on the device */ 615ea25da48SPaolo Valente struct list_head active_list; 616ea25da48SPaolo Valente /* list of all the bfq_queues idle on the device */ 617ea25da48SPaolo Valente struct list_head idle_list; 618ea25da48SPaolo Valente 619ea25da48SPaolo Valente /* 620ea25da48SPaolo Valente * Timeout for async/sync requests; when it fires, requests 621ea25da48SPaolo Valente * are served in fifo order. 622ea25da48SPaolo Valente */ 623ea25da48SPaolo Valente u64 bfq_fifo_expire[2]; 624ea25da48SPaolo Valente /* weight of backward seeks wrt forward ones */ 625ea25da48SPaolo Valente unsigned int bfq_back_penalty; 626ea25da48SPaolo Valente /* maximum allowed backward seek */ 627ea25da48SPaolo Valente unsigned int bfq_back_max; 628ea25da48SPaolo Valente /* maximum idling time */ 629ea25da48SPaolo Valente u32 bfq_slice_idle; 630ea25da48SPaolo Valente 631ea25da48SPaolo Valente /* user-configured max budget value (0 for auto-tuning) */ 632ea25da48SPaolo Valente int bfq_user_max_budget; 633ea25da48SPaolo Valente /* 634ea25da48SPaolo Valente * Timeout for bfq_queues to consume their budget; used to 635ea25da48SPaolo Valente * prevent seeky queues from imposing long latencies to 636ea25da48SPaolo Valente * sequential or quasi-sequential ones (this also implies that 637ea25da48SPaolo Valente * seeky queues cannot receive guarantees in the service 638ea25da48SPaolo Valente * domain; after a timeout they are charged for the time they 639ea25da48SPaolo Valente * have been in service, to preserve fairness among them, but 640ea25da48SPaolo Valente * without service-domain guarantees). 641ea25da48SPaolo Valente */ 642ea25da48SPaolo Valente unsigned int bfq_timeout; 643ea25da48SPaolo Valente 644ea25da48SPaolo Valente /* 645ea25da48SPaolo Valente * Number of consecutive requests that must be issued within 646ea25da48SPaolo Valente * the idle time slice to set again idling to a queue which 647ea25da48SPaolo Valente * was marked as non-I/O-bound (see the definition of the 648ea25da48SPaolo Valente * IO_bound flag for further details). 649ea25da48SPaolo Valente */ 650ea25da48SPaolo Valente unsigned int bfq_requests_within_timer; 651ea25da48SPaolo Valente 652ea25da48SPaolo Valente /* 653ea25da48SPaolo Valente * Force device idling whenever needed to provide accurate 654ea25da48SPaolo Valente * service guarantees, without caring about throughput 655ea25da48SPaolo Valente * issues. CAVEAT: this may even increase latencies, in case 656ea25da48SPaolo Valente * of useless idling for processes that did stop doing I/O. 657ea25da48SPaolo Valente */ 658ea25da48SPaolo Valente bool strict_guarantees; 659ea25da48SPaolo Valente 660ea25da48SPaolo Valente /* 661ea25da48SPaolo Valente * Last time at which a queue entered the current burst of 662ea25da48SPaolo Valente * queues being activated shortly after each other; for more 663ea25da48SPaolo Valente * details about this and the following parameters related to 664ea25da48SPaolo Valente * a burst of activations, see the comments on the function 665ea25da48SPaolo Valente * bfq_handle_burst. 666ea25da48SPaolo Valente */ 667ea25da48SPaolo Valente unsigned long last_ins_in_burst; 668ea25da48SPaolo Valente /* 669ea25da48SPaolo Valente * Reference time interval used to decide whether a queue has 670ea25da48SPaolo Valente * been activated shortly after @last_ins_in_burst. 671ea25da48SPaolo Valente */ 672ea25da48SPaolo Valente unsigned long bfq_burst_interval; 673ea25da48SPaolo Valente /* number of queues in the current burst of queue activations */ 674ea25da48SPaolo Valente int burst_size; 675ea25da48SPaolo Valente 676ea25da48SPaolo Valente /* common parent entity for the queues in the burst */ 677ea25da48SPaolo Valente struct bfq_entity *burst_parent_entity; 678ea25da48SPaolo Valente /* Maximum burst size above which the current queue-activation 679ea25da48SPaolo Valente * burst is deemed as 'large'. 680ea25da48SPaolo Valente */ 681ea25da48SPaolo Valente unsigned long bfq_large_burst_thresh; 682ea25da48SPaolo Valente /* true if a large queue-activation burst is in progress */ 683ea25da48SPaolo Valente bool large_burst; 684ea25da48SPaolo Valente /* 685ea25da48SPaolo Valente * Head of the burst list (as for the above fields, more 686ea25da48SPaolo Valente * details in the comments on the function bfq_handle_burst). 687ea25da48SPaolo Valente */ 688ea25da48SPaolo Valente struct hlist_head burst_list; 689ea25da48SPaolo Valente 690ea25da48SPaolo Valente /* if set to true, low-latency heuristics are enabled */ 691ea25da48SPaolo Valente bool low_latency; 692ea25da48SPaolo Valente /* 693ea25da48SPaolo Valente * Maximum factor by which the weight of a weight-raised queue 694ea25da48SPaolo Valente * is multiplied. 695ea25da48SPaolo Valente */ 696ea25da48SPaolo Valente unsigned int bfq_wr_coeff; 697ea25da48SPaolo Valente /* maximum duration of a weight-raising period (jiffies) */ 698ea25da48SPaolo Valente unsigned int bfq_wr_max_time; 699ea25da48SPaolo Valente 700ea25da48SPaolo Valente /* Maximum weight-raising duration for soft real-time processes */ 701ea25da48SPaolo Valente unsigned int bfq_wr_rt_max_time; 702ea25da48SPaolo Valente /* 703ea25da48SPaolo Valente * Minimum idle period after which weight-raising may be 704ea25da48SPaolo Valente * reactivated for a queue (in jiffies). 705ea25da48SPaolo Valente */ 706ea25da48SPaolo Valente unsigned int bfq_wr_min_idle_time; 707ea25da48SPaolo Valente /* 708ea25da48SPaolo Valente * Minimum period between request arrivals after which 709ea25da48SPaolo Valente * weight-raising may be reactivated for an already busy async 710ea25da48SPaolo Valente * queue (in jiffies). 711ea25da48SPaolo Valente */ 712ea25da48SPaolo Valente unsigned long bfq_wr_min_inter_arr_async; 713ea25da48SPaolo Valente 714ea25da48SPaolo Valente /* Max service-rate for a soft real-time queue, in sectors/sec */ 715ea25da48SPaolo Valente unsigned int bfq_wr_max_softrt_rate; 716ea25da48SPaolo Valente /* 717e24f1c24SPaolo Valente * Cached value of the product ref_rate*ref_wr_duration, used 718e24f1c24SPaolo Valente * for computing the maximum duration of weight raising 719e24f1c24SPaolo Valente * automatically. 720ea25da48SPaolo Valente */ 721e24f1c24SPaolo Valente u64 rate_dur_prod; 722ea25da48SPaolo Valente 723ea25da48SPaolo Valente /* fallback dummy bfqq for extreme OOM conditions */ 724ea25da48SPaolo Valente struct bfq_queue oom_bfqq; 725ea25da48SPaolo Valente 726ea25da48SPaolo Valente spinlock_t lock; 727ea25da48SPaolo Valente 728ea25da48SPaolo Valente /* 729ea25da48SPaolo Valente * bic associated with the task issuing current bio for 730ea25da48SPaolo Valente * merging. This and the next field are used as a support to 731ea25da48SPaolo Valente * be able to perform the bic lookup, needed by bio-merge 732ea25da48SPaolo Valente * functions, before the scheduler lock is taken, and thus 733ea25da48SPaolo Valente * avoid taking the request-queue lock while the scheduler 734ea25da48SPaolo Valente * lock is being held. 735ea25da48SPaolo Valente */ 736ea25da48SPaolo Valente struct bfq_io_cq *bio_bic; 737ea25da48SPaolo Valente /* bfqq associated with the task issuing current bio for merging */ 738ea25da48SPaolo Valente struct bfq_queue *bio_bfqq; 739a52a69eaSPaolo Valente 740a52a69eaSPaolo Valente /* 741a52a69eaSPaolo Valente * Depth limits used in bfq_limit_depth (see comments on the 742a52a69eaSPaolo Valente * function) 743a52a69eaSPaolo Valente */ 744a52a69eaSPaolo Valente unsigned int word_depths[2][2]; 745ea25da48SPaolo Valente }; 746ea25da48SPaolo Valente 747ea25da48SPaolo Valente enum bfqq_state_flags { 748ea25da48SPaolo Valente BFQQF_just_created = 0, /* queue just allocated */ 749ea25da48SPaolo Valente BFQQF_busy, /* has requests or is in service */ 750ea25da48SPaolo Valente BFQQF_wait_request, /* waiting for a request */ 751ea25da48SPaolo Valente BFQQF_non_blocking_wait_rq, /* 752ea25da48SPaolo Valente * waiting for a request 753ea25da48SPaolo Valente * without idling the device 754ea25da48SPaolo Valente */ 755ea25da48SPaolo Valente BFQQF_fifo_expire, /* FIFO checked in this slice */ 756d5be3fefSPaolo Valente BFQQF_has_short_ttime, /* queue has a short think time */ 757ea25da48SPaolo Valente BFQQF_sync, /* synchronous queue */ 758ea25da48SPaolo Valente BFQQF_IO_bound, /* 759ea25da48SPaolo Valente * bfqq has timed-out at least once 760ea25da48SPaolo Valente * having consumed at most 2/10 of 761ea25da48SPaolo Valente * its budget 762ea25da48SPaolo Valente */ 763ea25da48SPaolo Valente BFQQF_in_large_burst, /* 764ea25da48SPaolo Valente * bfqq activated in a large burst, 765ea25da48SPaolo Valente * see comments to bfq_handle_burst. 766ea25da48SPaolo Valente */ 767ea25da48SPaolo Valente BFQQF_softrt_update, /* 768ea25da48SPaolo Valente * may need softrt-next-start 769ea25da48SPaolo Valente * update 770ea25da48SPaolo Valente */ 771ea25da48SPaolo Valente BFQQF_coop, /* bfqq is shared */ 77213a857a4SPaolo Valente BFQQF_split_coop, /* shared bfqq will be split */ 77313a857a4SPaolo Valente BFQQF_has_waker /* bfqq has a waker queue */ 774ea25da48SPaolo Valente }; 775ea25da48SPaolo Valente 776ea25da48SPaolo Valente #define BFQ_BFQQ_FNS(name) \ 777ea25da48SPaolo Valente void bfq_mark_bfqq_##name(struct bfq_queue *bfqq); \ 778ea25da48SPaolo Valente void bfq_clear_bfqq_##name(struct bfq_queue *bfqq); \ 779ea25da48SPaolo Valente int bfq_bfqq_##name(const struct bfq_queue *bfqq); 780ea25da48SPaolo Valente 781ea25da48SPaolo Valente BFQ_BFQQ_FNS(just_created); 782ea25da48SPaolo Valente BFQ_BFQQ_FNS(busy); 783ea25da48SPaolo Valente BFQ_BFQQ_FNS(wait_request); 784ea25da48SPaolo Valente BFQ_BFQQ_FNS(non_blocking_wait_rq); 785ea25da48SPaolo Valente BFQ_BFQQ_FNS(fifo_expire); 786d5be3fefSPaolo Valente BFQ_BFQQ_FNS(has_short_ttime); 787ea25da48SPaolo Valente BFQ_BFQQ_FNS(sync); 788ea25da48SPaolo Valente BFQ_BFQQ_FNS(IO_bound); 789ea25da48SPaolo Valente BFQ_BFQQ_FNS(in_large_burst); 790ea25da48SPaolo Valente BFQ_BFQQ_FNS(coop); 791ea25da48SPaolo Valente BFQ_BFQQ_FNS(split_coop); 792ea25da48SPaolo Valente BFQ_BFQQ_FNS(softrt_update); 79313a857a4SPaolo Valente BFQ_BFQQ_FNS(has_waker); 794ea25da48SPaolo Valente #undef BFQ_BFQQ_FNS 795ea25da48SPaolo Valente 796ea25da48SPaolo Valente /* Expiration reasons. */ 797ea25da48SPaolo Valente enum bfqq_expiration { 798ea25da48SPaolo Valente BFQQE_TOO_IDLE = 0, /* 799ea25da48SPaolo Valente * queue has been idling for 800ea25da48SPaolo Valente * too long 801ea25da48SPaolo Valente */ 802ea25da48SPaolo Valente BFQQE_BUDGET_TIMEOUT, /* budget took too long to be used */ 803ea25da48SPaolo Valente BFQQE_BUDGET_EXHAUSTED, /* budget consumed */ 804ea25da48SPaolo Valente BFQQE_NO_MORE_REQUESTS, /* the queue has no more requests */ 805ea25da48SPaolo Valente BFQQE_PREEMPTED /* preemption in progress */ 806ea25da48SPaolo Valente }; 807ea25da48SPaolo Valente 808c0ce79dcSChristoph Hellwig struct bfq_stat { 809c0ce79dcSChristoph Hellwig struct percpu_counter cpu_cnt; 810c0ce79dcSChristoph Hellwig atomic64_t aux_cnt; 811c0ce79dcSChristoph Hellwig }; 812c0ce79dcSChristoph Hellwig 813ea25da48SPaolo Valente struct bfqg_stats { 814fd41e603STejun Heo /* basic stats */ 815fd41e603STejun Heo struct blkg_rwstat bytes; 816fd41e603STejun Heo struct blkg_rwstat ios; 8178060c47bSChristoph Hellwig #ifdef CONFIG_BFQ_CGROUP_DEBUG 818ea25da48SPaolo Valente /* number of ios merged */ 819ea25da48SPaolo Valente struct blkg_rwstat merged; 820ea25da48SPaolo Valente /* total time spent on device in ns, may not be accurate w/ queueing */ 821ea25da48SPaolo Valente struct blkg_rwstat service_time; 822ea25da48SPaolo Valente /* total time spent waiting in scheduler queue in ns */ 823ea25da48SPaolo Valente struct blkg_rwstat wait_time; 824ea25da48SPaolo Valente /* number of IOs queued up */ 825ea25da48SPaolo Valente struct blkg_rwstat queued; 826ea25da48SPaolo Valente /* total disk time and nr sectors dispatched by this group */ 827c0ce79dcSChristoph Hellwig struct bfq_stat time; 828ea25da48SPaolo Valente /* sum of number of ios queued across all samples */ 829c0ce79dcSChristoph Hellwig struct bfq_stat avg_queue_size_sum; 830ea25da48SPaolo Valente /* count of samples taken for average */ 831c0ce79dcSChristoph Hellwig struct bfq_stat avg_queue_size_samples; 832ea25da48SPaolo Valente /* how many times this group has been removed from service tree */ 833c0ce79dcSChristoph Hellwig struct bfq_stat dequeue; 834ea25da48SPaolo Valente /* total time spent waiting for it to be assigned a timeslice. */ 835c0ce79dcSChristoph Hellwig struct bfq_stat group_wait_time; 836ea25da48SPaolo Valente /* time spent idling for this blkcg_gq */ 837c0ce79dcSChristoph Hellwig struct bfq_stat idle_time; 838ea25da48SPaolo Valente /* total time with empty current active q with other requests queued */ 839c0ce79dcSChristoph Hellwig struct bfq_stat empty_time; 840ea25da48SPaolo Valente /* fields after this shouldn't be cleared on stat reset */ 84184c7afceSOmar Sandoval u64 start_group_wait_time; 84284c7afceSOmar Sandoval u64 start_idle_time; 84384c7afceSOmar Sandoval u64 start_empty_time; 844ea25da48SPaolo Valente uint16_t flags; 8458060c47bSChristoph Hellwig #endif /* CONFIG_BFQ_CGROUP_DEBUG */ 846ea25da48SPaolo Valente }; 847ea25da48SPaolo Valente 848ea25da48SPaolo Valente #ifdef CONFIG_BFQ_GROUP_IOSCHED 849ea25da48SPaolo Valente 850ea25da48SPaolo Valente /* 851ea25da48SPaolo Valente * struct bfq_group_data - per-blkcg storage for the blkio subsystem. 852ea25da48SPaolo Valente * 853ea25da48SPaolo Valente * @ps: @blkcg_policy_storage that this structure inherits 854ea25da48SPaolo Valente * @weight: weight of the bfq_group 855ea25da48SPaolo Valente */ 856ea25da48SPaolo Valente struct bfq_group_data { 857ea25da48SPaolo Valente /* must be the first member */ 858ea25da48SPaolo Valente struct blkcg_policy_data pd; 859ea25da48SPaolo Valente 860ea25da48SPaolo Valente unsigned int weight; 861ea25da48SPaolo Valente }; 862ea25da48SPaolo Valente 863ea25da48SPaolo Valente /** 864ea25da48SPaolo Valente * struct bfq_group - per (device, cgroup) data structure. 865ea25da48SPaolo Valente * @entity: schedulable entity to insert into the parent group sched_data. 866ea25da48SPaolo Valente * @sched_data: own sched_data, to contain child entities (they may be 867ea25da48SPaolo Valente * both bfq_queues and bfq_groups). 868ea25da48SPaolo Valente * @bfqd: the bfq_data for the device this group acts upon. 869ea25da48SPaolo Valente * @async_bfqq: array of async queues for all the tasks belonging to 870ea25da48SPaolo Valente * the group, one queue per ioprio value per ioprio_class, 871ea25da48SPaolo Valente * except for the idle class that has only one queue. 872ea25da48SPaolo Valente * @async_idle_bfqq: async queue for the idle class (ioprio is ignored). 873ea25da48SPaolo Valente * @my_entity: pointer to @entity, %NULL for the toplevel group; used 874ea25da48SPaolo Valente * to avoid too many special cases during group creation/ 875ea25da48SPaolo Valente * migration. 876ea25da48SPaolo Valente * @stats: stats for this bfqg. 877ea25da48SPaolo Valente * @active_entities: number of active entities belonging to the group; 878ea25da48SPaolo Valente * unused for the root group. Used to know whether there 879ea25da48SPaolo Valente * are groups with more than one active @bfq_entity 880ea25da48SPaolo Valente * (see the comments to the function 881ea25da48SPaolo Valente * bfq_bfqq_may_idle()). 882ea25da48SPaolo Valente * @rq_pos_tree: rbtree sorted by next_request position, used when 883ea25da48SPaolo Valente * determining if two or more queues have interleaving 884ea25da48SPaolo Valente * requests (see bfq_find_close_cooperator()). 885ea25da48SPaolo Valente * 886ea25da48SPaolo Valente * Each (device, cgroup) pair has its own bfq_group, i.e., for each cgroup 887ea25da48SPaolo Valente * there is a set of bfq_groups, each one collecting the lower-level 888ea25da48SPaolo Valente * entities belonging to the group that are acting on the same device. 889ea25da48SPaolo Valente * 890ea25da48SPaolo Valente * Locking works as follows: 891ea25da48SPaolo Valente * o @bfqd is protected by the queue lock, RCU is used to access it 892ea25da48SPaolo Valente * from the readers. 893ea25da48SPaolo Valente * o All the other fields are protected by the @bfqd queue lock. 894ea25da48SPaolo Valente */ 895ea25da48SPaolo Valente struct bfq_group { 896ea25da48SPaolo Valente /* must be the first member */ 897ea25da48SPaolo Valente struct blkg_policy_data pd; 898ea25da48SPaolo Valente 8998f9bebc3SPaolo Valente /* cached path for this blkg (see comments in bfq_bic_update_cgroup) */ 9008f9bebc3SPaolo Valente char blkg_path[128]; 9018f9bebc3SPaolo Valente 9028f9bebc3SPaolo Valente /* reference counter (see comments in bfq_bic_update_cgroup) */ 9038f9bebc3SPaolo Valente int ref; 9048f9bebc3SPaolo Valente 905ea25da48SPaolo Valente struct bfq_entity entity; 906ea25da48SPaolo Valente struct bfq_sched_data sched_data; 907ea25da48SPaolo Valente 908ea25da48SPaolo Valente void *bfqd; 909ea25da48SPaolo Valente 910ea25da48SPaolo Valente struct bfq_queue *async_bfqq[2][IOPRIO_BE_NR]; 911ea25da48SPaolo Valente struct bfq_queue *async_idle_bfqq; 912ea25da48SPaolo Valente 913ea25da48SPaolo Valente struct bfq_entity *my_entity; 914ea25da48SPaolo Valente 915ea25da48SPaolo Valente int active_entities; 916ea25da48SPaolo Valente 917ea25da48SPaolo Valente struct rb_root rq_pos_tree; 918ea25da48SPaolo Valente 919ea25da48SPaolo Valente struct bfqg_stats stats; 920ea25da48SPaolo Valente }; 921ea25da48SPaolo Valente 922ea25da48SPaolo Valente #else 923ea25da48SPaolo Valente struct bfq_group { 924ea25da48SPaolo Valente struct bfq_sched_data sched_data; 925ea25da48SPaolo Valente 926ea25da48SPaolo Valente struct bfq_queue *async_bfqq[2][IOPRIO_BE_NR]; 927ea25da48SPaolo Valente struct bfq_queue *async_idle_bfqq; 928ea25da48SPaolo Valente 929ea25da48SPaolo Valente struct rb_root rq_pos_tree; 930ea25da48SPaolo Valente }; 931ea25da48SPaolo Valente #endif 932ea25da48SPaolo Valente 933ea25da48SPaolo Valente struct bfq_queue *bfq_entity_to_bfqq(struct bfq_entity *entity); 934ea25da48SPaolo Valente 935ea25da48SPaolo Valente /* --------------- main algorithm interface ----------------- */ 936ea25da48SPaolo Valente 937ea25da48SPaolo Valente #define BFQ_SERVICE_TREE_INIT ((struct bfq_service_tree) \ 938ea25da48SPaolo Valente { RB_ROOT, RB_ROOT, NULL, NULL, 0, 0 }) 939ea25da48SPaolo Valente 940ea25da48SPaolo Valente extern const int bfq_timeout; 941ea25da48SPaolo Valente 942ea25da48SPaolo Valente struct bfq_queue *bic_to_bfqq(struct bfq_io_cq *bic, bool is_sync); 943ea25da48SPaolo Valente void bic_set_bfqq(struct bfq_io_cq *bic, struct bfq_queue *bfqq, bool is_sync); 944ea25da48SPaolo Valente struct bfq_data *bic_to_bfqd(struct bfq_io_cq *bic); 945ea25da48SPaolo Valente void bfq_pos_tree_add_move(struct bfq_data *bfqd, struct bfq_queue *bfqq); 9462d29c9f8SFederico Motta void bfq_weights_tree_add(struct bfq_data *bfqd, struct bfq_queue *bfqq, 947fb53ac6cSPaolo Valente struct rb_root_cached *root); 9480471559cSPaolo Valente void __bfq_weights_tree_remove(struct bfq_data *bfqd, 9492d29c9f8SFederico Motta struct bfq_queue *bfqq, 950fb53ac6cSPaolo Valente struct rb_root_cached *root); 9510471559cSPaolo Valente void bfq_weights_tree_remove(struct bfq_data *bfqd, 9520471559cSPaolo Valente struct bfq_queue *bfqq); 953ea25da48SPaolo Valente void bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq, 954ea25da48SPaolo Valente bool compensate, enum bfqq_expiration reason); 955ea25da48SPaolo Valente void bfq_put_queue(struct bfq_queue *bfqq); 956ea25da48SPaolo Valente void bfq_end_wr_async_queues(struct bfq_data *bfqd, struct bfq_group *bfqg); 957ea25da48SPaolo Valente void bfq_schedule_dispatch(struct bfq_data *bfqd); 958ea25da48SPaolo Valente void bfq_put_async_queues(struct bfq_data *bfqd, struct bfq_group *bfqg); 959ea25da48SPaolo Valente 960ea25da48SPaolo Valente /* ------------ end of main algorithm interface -------------- */ 961ea25da48SPaolo Valente 962ea25da48SPaolo Valente /* ---------------- cgroups-support interface ---------------- */ 963ea25da48SPaolo Valente 964fd41e603STejun Heo void bfqg_stats_update_legacy_io(struct request_queue *q, struct request *rq); 965ea25da48SPaolo Valente void bfqg_stats_update_io_add(struct bfq_group *bfqg, struct bfq_queue *bfqq, 966ea25da48SPaolo Valente unsigned int op); 967ea25da48SPaolo Valente void bfqg_stats_update_io_remove(struct bfq_group *bfqg, unsigned int op); 968ea25da48SPaolo Valente void bfqg_stats_update_io_merged(struct bfq_group *bfqg, unsigned int op); 96984c7afceSOmar Sandoval void bfqg_stats_update_completion(struct bfq_group *bfqg, u64 start_time_ns, 97084c7afceSOmar Sandoval u64 io_start_time_ns, unsigned int op); 971ea25da48SPaolo Valente void bfqg_stats_update_dequeue(struct bfq_group *bfqg); 972ea25da48SPaolo Valente void bfqg_stats_set_start_empty_time(struct bfq_group *bfqg); 973ea25da48SPaolo Valente void bfqg_stats_update_idle_time(struct bfq_group *bfqg); 974ea25da48SPaolo Valente void bfqg_stats_set_start_idle_time(struct bfq_group *bfqg); 975ea25da48SPaolo Valente void bfqg_stats_update_avg_queue_size(struct bfq_group *bfqg); 976ea25da48SPaolo Valente void bfq_bfqq_move(struct bfq_data *bfqd, struct bfq_queue *bfqq, 977ea25da48SPaolo Valente struct bfq_group *bfqg); 978ea25da48SPaolo Valente 979ea25da48SPaolo Valente void bfq_init_entity(struct bfq_entity *entity, struct bfq_group *bfqg); 980ea25da48SPaolo Valente void bfq_bic_update_cgroup(struct bfq_io_cq *bic, struct bio *bio); 981ea25da48SPaolo Valente void bfq_end_wr_async(struct bfq_data *bfqd); 982ea25da48SPaolo Valente struct bfq_group *bfq_find_set_group(struct bfq_data *bfqd, 983ea25da48SPaolo Valente struct blkcg *blkcg); 984ea25da48SPaolo Valente struct blkcg_gq *bfqg_to_blkg(struct bfq_group *bfqg); 985ea25da48SPaolo Valente struct bfq_group *bfqq_group(struct bfq_queue *bfqq); 986ea25da48SPaolo Valente struct bfq_group *bfq_create_group_hierarchy(struct bfq_data *bfqd, int node); 9878f9bebc3SPaolo Valente void bfqg_and_blkg_put(struct bfq_group *bfqg); 988ea25da48SPaolo Valente 989ea25da48SPaolo Valente #ifdef CONFIG_BFQ_GROUP_IOSCHED 990659b3394SJens Axboe extern struct cftype bfq_blkcg_legacy_files[]; 991659b3394SJens Axboe extern struct cftype bfq_blkg_files[]; 992ea25da48SPaolo Valente extern struct blkcg_policy blkcg_policy_bfq; 993ea25da48SPaolo Valente #endif 994ea25da48SPaolo Valente 995ea25da48SPaolo Valente /* ------------- end of cgroups-support interface ------------- */ 996ea25da48SPaolo Valente 997ea25da48SPaolo Valente /* - interface of the internal hierarchical B-WF2Q+ scheduler - */ 998ea25da48SPaolo Valente 999ea25da48SPaolo Valente #ifdef CONFIG_BFQ_GROUP_IOSCHED 1000ea25da48SPaolo Valente /* both next loops stop at one of the child entities of the root group */ 1001ea25da48SPaolo Valente #define for_each_entity(entity) \ 1002ea25da48SPaolo Valente for (; entity ; entity = entity->parent) 1003ea25da48SPaolo Valente 1004ea25da48SPaolo Valente /* 1005ea25da48SPaolo Valente * For each iteration, compute parent in advance, so as to be safe if 1006ea25da48SPaolo Valente * entity is deallocated during the iteration. Such a deallocation may 1007ea25da48SPaolo Valente * happen as a consequence of a bfq_put_queue that frees the bfq_queue 1008ea25da48SPaolo Valente * containing entity. 1009ea25da48SPaolo Valente */ 1010ea25da48SPaolo Valente #define for_each_entity_safe(entity, parent) \ 1011ea25da48SPaolo Valente for (; entity && ({ parent = entity->parent; 1; }); entity = parent) 1012ea25da48SPaolo Valente 1013ea25da48SPaolo Valente #else /* CONFIG_BFQ_GROUP_IOSCHED */ 1014ea25da48SPaolo Valente /* 1015ea25da48SPaolo Valente * Next two macros are fake loops when cgroups support is not 1016ea25da48SPaolo Valente * enabled. I fact, in such a case, there is only one level to go up 1017ea25da48SPaolo Valente * (to reach the root group). 1018ea25da48SPaolo Valente */ 1019ea25da48SPaolo Valente #define for_each_entity(entity) \ 1020ea25da48SPaolo Valente for (; entity ; entity = NULL) 1021ea25da48SPaolo Valente 1022ea25da48SPaolo Valente #define for_each_entity_safe(entity, parent) \ 1023ea25da48SPaolo Valente for (parent = NULL; entity ; entity = parent) 1024ea25da48SPaolo Valente #endif /* CONFIG_BFQ_GROUP_IOSCHED */ 1025ea25da48SPaolo Valente 1026ea25da48SPaolo Valente struct bfq_group *bfq_bfqq_to_bfqg(struct bfq_queue *bfqq); 1027ea25da48SPaolo Valente struct bfq_queue *bfq_entity_to_bfqq(struct bfq_entity *entity); 102873d58118SPaolo Valente unsigned int bfq_tot_busy_queues(struct bfq_data *bfqd); 1029ea25da48SPaolo Valente struct bfq_service_tree *bfq_entity_service_tree(struct bfq_entity *entity); 1030ea25da48SPaolo Valente struct bfq_entity *bfq_entity_of(struct rb_node *node); 1031ea25da48SPaolo Valente unsigned short bfq_ioprio_to_weight(int ioprio); 1032ea25da48SPaolo Valente void bfq_put_idle_entity(struct bfq_service_tree *st, 1033ea25da48SPaolo Valente struct bfq_entity *entity); 1034ea25da48SPaolo Valente struct bfq_service_tree * 1035ea25da48SPaolo Valente __bfq_entity_update_weight_prio(struct bfq_service_tree *old_st, 1036431b17f9SPaolo Valente struct bfq_entity *entity, 1037431b17f9SPaolo Valente bool update_class_too); 1038ea25da48SPaolo Valente void bfq_bfqq_served(struct bfq_queue *bfqq, int served); 1039ea25da48SPaolo Valente void bfq_bfqq_charge_time(struct bfq_data *bfqd, struct bfq_queue *bfqq, 1040ea25da48SPaolo Valente unsigned long time_ms); 1041ea25da48SPaolo Valente bool __bfq_deactivate_entity(struct bfq_entity *entity, 1042ea25da48SPaolo Valente bool ins_into_idle_tree); 1043ea25da48SPaolo Valente bool next_queue_may_preempt(struct bfq_data *bfqd); 1044ea25da48SPaolo Valente struct bfq_queue *bfq_get_next_queue(struct bfq_data *bfqd); 1045eed47d19SPaolo Valente bool __bfq_bfqd_reset_in_service(struct bfq_data *bfqd); 1046ea25da48SPaolo Valente void bfq_deactivate_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq, 1047ea25da48SPaolo Valente bool ins_into_idle_tree, bool expiration); 1048ea25da48SPaolo Valente void bfq_activate_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq); 104980294c3bSPaolo Valente void bfq_requeue_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq, 105080294c3bSPaolo Valente bool expiration); 1051ea25da48SPaolo Valente void bfq_del_bfqq_busy(struct bfq_data *bfqd, struct bfq_queue *bfqq, 1052ea25da48SPaolo Valente bool expiration); 1053ea25da48SPaolo Valente void bfq_add_bfqq_busy(struct bfq_data *bfqd, struct bfq_queue *bfqq); 1054ea25da48SPaolo Valente 1055ea25da48SPaolo Valente /* --------------- end of interface of B-WF2Q+ ---------------- */ 1056ea25da48SPaolo Valente 1057ea25da48SPaolo Valente /* Logging facilities. */ 10581e66413cSFrancesco Pollicino static inline void bfq_pid_to_str(int pid, char *str, int len) 10591e66413cSFrancesco Pollicino { 10601e66413cSFrancesco Pollicino if (pid != -1) 10611e66413cSFrancesco Pollicino snprintf(str, len, "%d", pid); 10621e66413cSFrancesco Pollicino else 10631e66413cSFrancesco Pollicino snprintf(str, len, "SHARED-"); 10641e66413cSFrancesco Pollicino } 10651e66413cSFrancesco Pollicino 1066ea25da48SPaolo Valente #ifdef CONFIG_BFQ_GROUP_IOSCHED 1067ea25da48SPaolo Valente struct bfq_group *bfqq_group(struct bfq_queue *bfqq); 1068ea25da48SPaolo Valente 1069ea25da48SPaolo Valente #define bfq_log_bfqq(bfqd, bfqq, fmt, args...) do { \ 10701e66413cSFrancesco Pollicino char pid_str[MAX_PID_STR_LENGTH]; \ 107140d47c15SDmitry Monakhov if (likely(!blk_trace_note_message_enabled((bfqd)->queue))) \ 107240d47c15SDmitry Monakhov break; \ 10731e66413cSFrancesco Pollicino bfq_pid_to_str((bfqq)->pid, pid_str, MAX_PID_STR_LENGTH); \ 107435fe6d76SShaohua Li blk_add_cgroup_trace_msg((bfqd)->queue, \ 107535fe6d76SShaohua Li bfqg_to_blkg(bfqq_group(bfqq))->blkcg, \ 10761e66413cSFrancesco Pollicino "bfq%s%c " fmt, pid_str, \ 107735fe6d76SShaohua Li bfq_bfqq_sync((bfqq)) ? 'S' : 'A', ##args); \ 1078ea25da48SPaolo Valente } while (0) 1079ea25da48SPaolo Valente 108035fe6d76SShaohua Li #define bfq_log_bfqg(bfqd, bfqg, fmt, args...) do { \ 108135fe6d76SShaohua Li blk_add_cgroup_trace_msg((bfqd)->queue, \ 108235fe6d76SShaohua Li bfqg_to_blkg(bfqg)->blkcg, fmt, ##args); \ 108335fe6d76SShaohua Li } while (0) 1084ea25da48SPaolo Valente 1085ea25da48SPaolo Valente #else /* CONFIG_BFQ_GROUP_IOSCHED */ 1086ea25da48SPaolo Valente 10871e66413cSFrancesco Pollicino #define bfq_log_bfqq(bfqd, bfqq, fmt, args...) do { \ 10881e66413cSFrancesco Pollicino char pid_str[MAX_PID_STR_LENGTH]; \ 108940d47c15SDmitry Monakhov if (likely(!blk_trace_note_message_enabled((bfqd)->queue))) \ 109040d47c15SDmitry Monakhov break; \ 10911e66413cSFrancesco Pollicino bfq_pid_to_str((bfqq)->pid, pid_str, MAX_PID_STR_LENGTH); \ 10921e66413cSFrancesco Pollicino blk_add_trace_msg((bfqd)->queue, "bfq%s%c " fmt, pid_str, \ 1093ea25da48SPaolo Valente bfq_bfqq_sync((bfqq)) ? 'S' : 'A', \ 10941e66413cSFrancesco Pollicino ##args); \ 10951e66413cSFrancesco Pollicino } while (0) 1096ea25da48SPaolo Valente #define bfq_log_bfqg(bfqd, bfqg, fmt, args...) do {} while (0) 1097ea25da48SPaolo Valente 1098ea25da48SPaolo Valente #endif /* CONFIG_BFQ_GROUP_IOSCHED */ 1099ea25da48SPaolo Valente 1100ea25da48SPaolo Valente #define bfq_log(bfqd, fmt, args...) \ 1101ea25da48SPaolo Valente blk_add_trace_msg((bfqd)->queue, "bfq " fmt, ##args) 1102ea25da48SPaolo Valente 1103ea25da48SPaolo Valente #endif /* _BFQ_H */ 1104