brintos

brintos / linux-shallow public Read only

0
0
Text · 21.7 KiB · 6dfc659 Raw
937 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * buffered writeback throttling. loosely based on CoDel. We can't drop4 * packets for IO scheduling, so the logic is something like this:5 *6 * - Monitor latencies in a defined window of time.7 * - If the minimum latency in the above window exceeds some target, increment8 *   scaling step and scale down queue depth by a factor of 2x. The monitoring9 *   window is then shrunk to 100 / sqrt(scaling step + 1).10 * - For any window where we don't have solid data on what the latencies11 *   look like, retain status quo.12 * - If latencies look good, decrement scaling step.13 * - If we're only doing writes, allow the scaling step to go negative. This14 *   will temporarily boost write performance, snapping back to a stable15 *   scaling step of 0 if reads show up or the heavy writers finish. Unlike16 *   positive scaling steps where we shrink the monitoring window, a negative17 *   scaling step retains the default step==0 window size.18 *19 * Copyright (C) 2016 Jens Axboe20 *21 */22#include <linux/kernel.h>23#include <linux/blk_types.h>24#include <linux/slab.h>25#include <linux/backing-dev.h>26#include <linux/swap.h>27 28#include "blk-stat.h"29#include "blk-wbt.h"30#include "blk-rq-qos.h"31#include "elevator.h"32#include "blk.h"33 34#define CREATE_TRACE_POINTS35#include <trace/events/wbt.h>36 37enum wbt_flags {38	WBT_TRACKED		= 1,	/* write, tracked for throttling */39	WBT_READ		= 2,	/* read */40	WBT_SWAP		= 4,	/* write, from swap_writepage() */41	WBT_DISCARD		= 8,	/* discard */42 43	WBT_NR_BITS		= 4,	/* number of bits */44};45 46enum {47	WBT_RWQ_BG		= 0,48	WBT_RWQ_SWAP,49	WBT_RWQ_DISCARD,50	WBT_NUM_RWQ,51};52 53/*54 * If current state is WBT_STATE_ON/OFF_DEFAULT, it can be covered to any other55 * state, if current state is WBT_STATE_ON/OFF_MANUAL, it can only be covered56 * to WBT_STATE_OFF/ON_MANUAL.57 */58enum {59	WBT_STATE_ON_DEFAULT	= 1,	/* on by default */60	WBT_STATE_ON_MANUAL	= 2,	/* on manually by sysfs */61	WBT_STATE_OFF_DEFAULT	= 3,	/* off by default */62	WBT_STATE_OFF_MANUAL	= 4,	/* off manually by sysfs */63};64 65struct rq_wb {66	/*67	 * Settings that govern how we throttle68	 */69	unsigned int wb_background;		/* background writeback */70	unsigned int wb_normal;			/* normal writeback */71 72	short enable_state;			/* WBT_STATE_* */73 74	/*75	 * Number of consecutive periods where we don't have enough76	 * information to make a firm scale up/down decision.77	 */78	unsigned int unknown_cnt;79 80	u64 win_nsec;				/* default window size */81	u64 cur_win_nsec;			/* current window size */82 83	struct blk_stat_callback *cb;84 85	u64 sync_issue;86	void *sync_cookie;87 88	unsigned long last_issue;		/* last non-throttled issue */89	unsigned long last_comp;		/* last non-throttled comp */90	unsigned long min_lat_nsec;91	struct rq_qos rqos;92	struct rq_wait rq_wait[WBT_NUM_RWQ];93	struct rq_depth rq_depth;94};95 96static inline struct rq_wb *RQWB(struct rq_qos *rqos)97{98	return container_of(rqos, struct rq_wb, rqos);99}100 101static inline void wbt_clear_state(struct request *rq)102{103	rq->wbt_flags = 0;104}105 106static inline enum wbt_flags wbt_flags(struct request *rq)107{108	return rq->wbt_flags;109}110 111static inline bool wbt_is_tracked(struct request *rq)112{113	return rq->wbt_flags & WBT_TRACKED;114}115 116static inline bool wbt_is_read(struct request *rq)117{118	return rq->wbt_flags & WBT_READ;119}120 121enum {122	/*123	 * Default setting, we'll scale up (to 75% of QD max) or down (min 1)124	 * from here depending on device stats125	 */126	RWB_DEF_DEPTH	= 16,127 128	/*129	 * 100msec window130	 */131	RWB_WINDOW_NSEC		= 100 * 1000 * 1000ULL,132 133	/*134	 * Disregard stats, if we don't meet this minimum135	 */136	RWB_MIN_WRITE_SAMPLES	= 3,137 138	/*139	 * If we have this number of consecutive windows with not enough140	 * information to scale up or down, scale up.141	 */142	RWB_UNKNOWN_BUMP	= 5,143};144 145static inline bool rwb_enabled(struct rq_wb *rwb)146{147	return rwb && rwb->enable_state != WBT_STATE_OFF_DEFAULT &&148		      rwb->enable_state != WBT_STATE_OFF_MANUAL;149}150 151static void wb_timestamp(struct rq_wb *rwb, unsigned long *var)152{153	if (rwb_enabled(rwb)) {154		const unsigned long cur = jiffies;155 156		if (cur != *var)157			*var = cur;158	}159}160 161/*162 * If a task was rate throttled in balance_dirty_pages() within the last163 * second or so, use that to indicate a higher cleaning rate.164 */165static bool wb_recent_wait(struct rq_wb *rwb)166{167	struct backing_dev_info *bdi = rwb->rqos.disk->bdi;168 169	return time_before(jiffies, bdi->last_bdp_sleep + HZ);170}171 172static inline struct rq_wait *get_rq_wait(struct rq_wb *rwb,173					  enum wbt_flags wb_acct)174{175	if (wb_acct & WBT_SWAP)176		return &rwb->rq_wait[WBT_RWQ_SWAP];177	else if (wb_acct & WBT_DISCARD)178		return &rwb->rq_wait[WBT_RWQ_DISCARD];179 180	return &rwb->rq_wait[WBT_RWQ_BG];181}182 183static void rwb_wake_all(struct rq_wb *rwb)184{185	int i;186 187	for (i = 0; i < WBT_NUM_RWQ; i++) {188		struct rq_wait *rqw = &rwb->rq_wait[i];189 190		if (wq_has_sleeper(&rqw->wait))191			wake_up_all(&rqw->wait);192	}193}194 195static void wbt_rqw_done(struct rq_wb *rwb, struct rq_wait *rqw,196			 enum wbt_flags wb_acct)197{198	int inflight, limit;199 200	inflight = atomic_dec_return(&rqw->inflight);201 202	/*203	 * For discards, our limit is always the background. For writes, if204	 * the device does write back caching, drop further down before we205	 * wake people up.206	 */207	if (wb_acct & WBT_DISCARD)208		limit = rwb->wb_background;209	else if (blk_queue_write_cache(rwb->rqos.disk->queue) &&210		 !wb_recent_wait(rwb))211		limit = 0;212	else213		limit = rwb->wb_normal;214 215	/*216	 * Don't wake anyone up if we are above the normal limit.217	 */218	if (inflight && inflight >= limit)219		return;220 221	if (wq_has_sleeper(&rqw->wait)) {222		int diff = limit - inflight;223 224		if (!inflight || diff >= rwb->wb_background / 2)225			wake_up_all(&rqw->wait);226	}227}228 229static void __wbt_done(struct rq_qos *rqos, enum wbt_flags wb_acct)230{231	struct rq_wb *rwb = RQWB(rqos);232	struct rq_wait *rqw;233 234	if (!(wb_acct & WBT_TRACKED))235		return;236 237	rqw = get_rq_wait(rwb, wb_acct);238	wbt_rqw_done(rwb, rqw, wb_acct);239}240 241/*242 * Called on completion of a request. Note that it's also called when243 * a request is merged, when the request gets freed.244 */245static void wbt_done(struct rq_qos *rqos, struct request *rq)246{247	struct rq_wb *rwb = RQWB(rqos);248 249	if (!wbt_is_tracked(rq)) {250		if (rwb->sync_cookie == rq) {251			rwb->sync_issue = 0;252			rwb->sync_cookie = NULL;253		}254 255		if (wbt_is_read(rq))256			wb_timestamp(rwb, &rwb->last_comp);257	} else {258		WARN_ON_ONCE(rq == rwb->sync_cookie);259		__wbt_done(rqos, wbt_flags(rq));260	}261	wbt_clear_state(rq);262}263 264static inline bool stat_sample_valid(struct blk_rq_stat *stat)265{266	/*267	 * We need at least one read sample, and a minimum of268	 * RWB_MIN_WRITE_SAMPLES. We require some write samples to know269	 * that it's writes impacting us, and not just some sole read on270	 * a device that is in a lower power state.271	 */272	return (stat[READ].nr_samples >= 1 &&273		stat[WRITE].nr_samples >= RWB_MIN_WRITE_SAMPLES);274}275 276static u64 rwb_sync_issue_lat(struct rq_wb *rwb)277{278	u64 issue = READ_ONCE(rwb->sync_issue);279 280	if (!issue || !rwb->sync_cookie)281		return 0;282 283	return blk_time_get_ns() - issue;284}285 286static inline unsigned int wbt_inflight(struct rq_wb *rwb)287{288	unsigned int i, ret = 0;289 290	for (i = 0; i < WBT_NUM_RWQ; i++)291		ret += atomic_read(&rwb->rq_wait[i].inflight);292 293	return ret;294}295 296enum {297	LAT_OK = 1,298	LAT_UNKNOWN,299	LAT_UNKNOWN_WRITES,300	LAT_EXCEEDED,301};302 303static int latency_exceeded(struct rq_wb *rwb, struct blk_rq_stat *stat)304{305	struct backing_dev_info *bdi = rwb->rqos.disk->bdi;306	struct rq_depth *rqd = &rwb->rq_depth;307	u64 thislat;308 309	/*310	 * If our stored sync issue exceeds the window size, or it311	 * exceeds our min target AND we haven't logged any entries,312	 * flag the latency as exceeded. wbt works off completion latencies,313	 * but for a flooded device, a single sync IO can take a long time314	 * to complete after being issued. If this time exceeds our315	 * monitoring window AND we didn't see any other completions in that316	 * window, then count that sync IO as a violation of the latency.317	 */318	thislat = rwb_sync_issue_lat(rwb);319	if (thislat > rwb->cur_win_nsec ||320	    (thislat > rwb->min_lat_nsec && !stat[READ].nr_samples)) {321		trace_wbt_lat(bdi, thislat);322		return LAT_EXCEEDED;323	}324 325	/*326	 * No read/write mix, if stat isn't valid327	 */328	if (!stat_sample_valid(stat)) {329		/*330		 * If we had writes in this stat window and the window is331		 * current, we're only doing writes. If a task recently332		 * waited or still has writes in flights, consider us doing333		 * just writes as well.334		 */335		if (stat[WRITE].nr_samples || wb_recent_wait(rwb) ||336		    wbt_inflight(rwb))337			return LAT_UNKNOWN_WRITES;338		return LAT_UNKNOWN;339	}340 341	/*342	 * If the 'min' latency exceeds our target, step down.343	 */344	if (stat[READ].min > rwb->min_lat_nsec) {345		trace_wbt_lat(bdi, stat[READ].min);346		trace_wbt_stat(bdi, stat);347		return LAT_EXCEEDED;348	}349 350	if (rqd->scale_step)351		trace_wbt_stat(bdi, stat);352 353	return LAT_OK;354}355 356static void rwb_trace_step(struct rq_wb *rwb, const char *msg)357{358	struct backing_dev_info *bdi = rwb->rqos.disk->bdi;359	struct rq_depth *rqd = &rwb->rq_depth;360 361	trace_wbt_step(bdi, msg, rqd->scale_step, rwb->cur_win_nsec,362			rwb->wb_background, rwb->wb_normal, rqd->max_depth);363}364 365static void calc_wb_limits(struct rq_wb *rwb)366{367	if (rwb->min_lat_nsec == 0) {368		rwb->wb_normal = rwb->wb_background = 0;369	} else if (rwb->rq_depth.max_depth <= 2) {370		rwb->wb_normal = rwb->rq_depth.max_depth;371		rwb->wb_background = 1;372	} else {373		rwb->wb_normal = (rwb->rq_depth.max_depth + 1) / 2;374		rwb->wb_background = (rwb->rq_depth.max_depth + 3) / 4;375	}376}377 378static void scale_up(struct rq_wb *rwb)379{380	if (!rq_depth_scale_up(&rwb->rq_depth))381		return;382	calc_wb_limits(rwb);383	rwb->unknown_cnt = 0;384	rwb_wake_all(rwb);385	rwb_trace_step(rwb, tracepoint_string("scale up"));386}387 388static void scale_down(struct rq_wb *rwb, bool hard_throttle)389{390	if (!rq_depth_scale_down(&rwb->rq_depth, hard_throttle))391		return;392	calc_wb_limits(rwb);393	rwb->unknown_cnt = 0;394	rwb_trace_step(rwb, tracepoint_string("scale down"));395}396 397static void rwb_arm_timer(struct rq_wb *rwb)398{399	struct rq_depth *rqd = &rwb->rq_depth;400 401	if (rqd->scale_step > 0) {402		/*403		 * We should speed this up, using some variant of a fast404		 * integer inverse square root calculation. Since we only do405		 * this for every window expiration, it's not a huge deal,406		 * though.407		 */408		rwb->cur_win_nsec = div_u64(rwb->win_nsec << 4,409					int_sqrt((rqd->scale_step + 1) << 8));410	} else {411		/*412		 * For step < 0, we don't want to increase/decrease the413		 * window size.414		 */415		rwb->cur_win_nsec = rwb->win_nsec;416	}417 418	blk_stat_activate_nsecs(rwb->cb, rwb->cur_win_nsec);419}420 421static void wb_timer_fn(struct blk_stat_callback *cb)422{423	struct rq_wb *rwb = cb->data;424	struct rq_depth *rqd = &rwb->rq_depth;425	unsigned int inflight = wbt_inflight(rwb);426	int status;427 428	if (!rwb->rqos.disk)429		return;430 431	status = latency_exceeded(rwb, cb->stat);432 433	trace_wbt_timer(rwb->rqos.disk->bdi, status, rqd->scale_step, inflight);434 435	/*436	 * If we exceeded the latency target, step down. If we did not,437	 * step one level up. If we don't know enough to say either exceeded438	 * or ok, then don't do anything.439	 */440	switch (status) {441	case LAT_EXCEEDED:442		scale_down(rwb, true);443		break;444	case LAT_OK:445		scale_up(rwb);446		break;447	case LAT_UNKNOWN_WRITES:448		/*449		 * We started a the center step, but don't have a valid450		 * read/write sample, but we do have writes going on.451		 * Allow step to go negative, to increase write perf.452		 */453		scale_up(rwb);454		break;455	case LAT_UNKNOWN:456		if (++rwb->unknown_cnt < RWB_UNKNOWN_BUMP)457			break;458		/*459		 * We get here when previously scaled reduced depth, and we460		 * currently don't have a valid read/write sample. For that461		 * case, slowly return to center state (step == 0).462		 */463		if (rqd->scale_step > 0)464			scale_up(rwb);465		else if (rqd->scale_step < 0)466			scale_down(rwb, false);467		break;468	default:469		break;470	}471 472	/*473	 * Re-arm timer, if we have IO in flight474	 */475	if (rqd->scale_step || inflight)476		rwb_arm_timer(rwb);477}478 479static void wbt_update_limits(struct rq_wb *rwb)480{481	struct rq_depth *rqd = &rwb->rq_depth;482 483	rqd->scale_step = 0;484	rqd->scaled_max = false;485 486	rq_depth_calc_max_depth(rqd);487	calc_wb_limits(rwb);488 489	rwb_wake_all(rwb);490}491 492bool wbt_disabled(struct request_queue *q)493{494	struct rq_qos *rqos = wbt_rq_qos(q);495 496	return !rqos || !rwb_enabled(RQWB(rqos));497}498 499u64 wbt_get_min_lat(struct request_queue *q)500{501	struct rq_qos *rqos = wbt_rq_qos(q);502	if (!rqos)503		return 0;504	return RQWB(rqos)->min_lat_nsec;505}506 507void wbt_set_min_lat(struct request_queue *q, u64 val)508{509	struct rq_qos *rqos = wbt_rq_qos(q);510	if (!rqos)511		return;512 513	RQWB(rqos)->min_lat_nsec = val;514	if (val)515		RQWB(rqos)->enable_state = WBT_STATE_ON_MANUAL;516	else517		RQWB(rqos)->enable_state = WBT_STATE_OFF_MANUAL;518 519	wbt_update_limits(RQWB(rqos));520}521 522 523static bool close_io(struct rq_wb *rwb)524{525	const unsigned long now = jiffies;526 527	return time_before(now, rwb->last_issue + HZ / 10) ||528		time_before(now, rwb->last_comp + HZ / 10);529}530 531#define REQ_HIPRIO	(REQ_SYNC | REQ_META | REQ_PRIO | REQ_SWAP)532 533static inline unsigned int get_limit(struct rq_wb *rwb, blk_opf_t opf)534{535	unsigned int limit;536 537	if ((opf & REQ_OP_MASK) == REQ_OP_DISCARD)538		return rwb->wb_background;539 540	/*541	 * At this point we know it's a buffered write. If this is542	 * swap trying to free memory, or REQ_SYNC is set, then543	 * it's WB_SYNC_ALL writeback, and we'll use the max limit for544	 * that. If the write is marked as a background write, then use545	 * the idle limit, or go to normal if we haven't had competing546	 * IO for a bit.547	 */548	if ((opf & REQ_HIPRIO) || wb_recent_wait(rwb))549		limit = rwb->rq_depth.max_depth;550	else if ((opf & REQ_BACKGROUND) || close_io(rwb)) {551		/*552		 * If less than 100ms since we completed unrelated IO,553		 * limit us to half the depth for background writeback.554		 */555		limit = rwb->wb_background;556	} else557		limit = rwb->wb_normal;558 559	return limit;560}561 562struct wbt_wait_data {563	struct rq_wb *rwb;564	enum wbt_flags wb_acct;565	blk_opf_t opf;566};567 568static bool wbt_inflight_cb(struct rq_wait *rqw, void *private_data)569{570	struct wbt_wait_data *data = private_data;571	return rq_wait_inc_below(rqw, get_limit(data->rwb, data->opf));572}573 574static void wbt_cleanup_cb(struct rq_wait *rqw, void *private_data)575{576	struct wbt_wait_data *data = private_data;577	wbt_rqw_done(data->rwb, rqw, data->wb_acct);578}579 580/*581 * Block if we will exceed our limit, or if we are currently waiting for582 * the timer to kick off queuing again.583 */584static void __wbt_wait(struct rq_wb *rwb, enum wbt_flags wb_acct,585		       blk_opf_t opf)586{587	struct rq_wait *rqw = get_rq_wait(rwb, wb_acct);588	struct wbt_wait_data data = {589		.rwb = rwb,590		.wb_acct = wb_acct,591		.opf = opf,592	};593 594	rq_qos_wait(rqw, &data, wbt_inflight_cb, wbt_cleanup_cb);595}596 597static inline bool wbt_should_throttle(struct bio *bio)598{599	switch (bio_op(bio)) {600	case REQ_OP_WRITE:601		/*602		 * Don't throttle WRITE_ODIRECT603		 */604		if ((bio->bi_opf & (REQ_SYNC | REQ_IDLE)) ==605		    (REQ_SYNC | REQ_IDLE))606			return false;607		fallthrough;608	case REQ_OP_DISCARD:609		return true;610	default:611		return false;612	}613}614 615static enum wbt_flags bio_to_wbt_flags(struct rq_wb *rwb, struct bio *bio)616{617	enum wbt_flags flags = 0;618 619	if (!rwb_enabled(rwb))620		return 0;621 622	if (bio_op(bio) == REQ_OP_READ) {623		flags = WBT_READ;624	} else if (wbt_should_throttle(bio)) {625		if (bio->bi_opf & REQ_SWAP)626			flags |= WBT_SWAP;627		if (bio_op(bio) == REQ_OP_DISCARD)628			flags |= WBT_DISCARD;629		flags |= WBT_TRACKED;630	}631	return flags;632}633 634static void wbt_cleanup(struct rq_qos *rqos, struct bio *bio)635{636	struct rq_wb *rwb = RQWB(rqos);637	enum wbt_flags flags = bio_to_wbt_flags(rwb, bio);638	__wbt_done(rqos, flags);639}640 641/*642 * May sleep, if we have exceeded the writeback limits. Caller can pass643 * in an irq held spinlock, if it holds one when calling this function.644 * If we do sleep, we'll release and re-grab it.645 */646static void wbt_wait(struct rq_qos *rqos, struct bio *bio)647{648	struct rq_wb *rwb = RQWB(rqos);649	enum wbt_flags flags;650 651	flags = bio_to_wbt_flags(rwb, bio);652	if (!(flags & WBT_TRACKED)) {653		if (flags & WBT_READ)654			wb_timestamp(rwb, &rwb->last_issue);655		return;656	}657 658	__wbt_wait(rwb, flags, bio->bi_opf);659 660	if (!blk_stat_is_active(rwb->cb))661		rwb_arm_timer(rwb);662}663 664static void wbt_track(struct rq_qos *rqos, struct request *rq, struct bio *bio)665{666	struct rq_wb *rwb = RQWB(rqos);667	rq->wbt_flags |= bio_to_wbt_flags(rwb, bio);668}669 670static void wbt_issue(struct rq_qos *rqos, struct request *rq)671{672	struct rq_wb *rwb = RQWB(rqos);673 674	if (!rwb_enabled(rwb))675		return;676 677	/*678	 * Track sync issue, in case it takes a long time to complete. Allows us679	 * to react quicker, if a sync IO takes a long time to complete. Note680	 * that this is just a hint. The request can go away when it completes,681	 * so it's important we never dereference it. We only use the address to682	 * compare with, which is why we store the sync_issue time locally.683	 */684	if (wbt_is_read(rq) && !rwb->sync_issue) {685		rwb->sync_cookie = rq;686		rwb->sync_issue = rq->io_start_time_ns;687	}688}689 690static void wbt_requeue(struct rq_qos *rqos, struct request *rq)691{692	struct rq_wb *rwb = RQWB(rqos);693	if (!rwb_enabled(rwb))694		return;695	if (rq == rwb->sync_cookie) {696		rwb->sync_issue = 0;697		rwb->sync_cookie = NULL;698	}699}700 701/*702 * Enable wbt if defaults are configured that way703 */704void wbt_enable_default(struct gendisk *disk)705{706	struct request_queue *q = disk->queue;707	struct rq_qos *rqos;708	bool enable = IS_ENABLED(CONFIG_BLK_WBT_MQ);709 710	if (q->elevator &&711	    test_bit(ELEVATOR_FLAG_DISABLE_WBT, &q->elevator->flags))712		enable = false;713 714	/* Throttling already enabled? */715	rqos = wbt_rq_qos(q);716	if (rqos) {717		if (enable && RQWB(rqos)->enable_state == WBT_STATE_OFF_DEFAULT)718			RQWB(rqos)->enable_state = WBT_STATE_ON_DEFAULT;719		return;720	}721 722	/* Queue not registered? Maybe shutting down... */723	if (!blk_queue_registered(q))724		return;725 726	if (queue_is_mq(q) && enable)727		wbt_init(disk);728}729EXPORT_SYMBOL_GPL(wbt_enable_default);730 731u64 wbt_default_latency_nsec(struct request_queue *q)732{733	/*734	 * We default to 2msec for non-rotational storage, and 75msec735	 * for rotational storage.736	 */737	if (blk_queue_nonrot(q))738		return 2000000ULL;739	else740		return 75000000ULL;741}742 743static int wbt_data_dir(const struct request *rq)744{745	const enum req_op op = req_op(rq);746 747	if (op == REQ_OP_READ)748		return READ;749	else if (op_is_write(op))750		return WRITE;751 752	/* don't account */753	return -1;754}755 756static void wbt_queue_depth_changed(struct rq_qos *rqos)757{758	RQWB(rqos)->rq_depth.queue_depth = blk_queue_depth(rqos->disk->queue);759	wbt_update_limits(RQWB(rqos));760}761 762static void wbt_exit(struct rq_qos *rqos)763{764	struct rq_wb *rwb = RQWB(rqos);765 766	blk_stat_remove_callback(rqos->disk->queue, rwb->cb);767	blk_stat_free_callback(rwb->cb);768	kfree(rwb);769}770 771/*772 * Disable wbt, if enabled by default.773 */774void wbt_disable_default(struct gendisk *disk)775{776	struct rq_qos *rqos = wbt_rq_qos(disk->queue);777	struct rq_wb *rwb;778	if (!rqos)779		return;780	rwb = RQWB(rqos);781	if (rwb->enable_state == WBT_STATE_ON_DEFAULT) {782		blk_stat_deactivate(rwb->cb);783		rwb->enable_state = WBT_STATE_OFF_DEFAULT;784	}785}786EXPORT_SYMBOL_GPL(wbt_disable_default);787 788#ifdef CONFIG_BLK_DEBUG_FS789static int wbt_curr_win_nsec_show(void *data, struct seq_file *m)790{791	struct rq_qos *rqos = data;792	struct rq_wb *rwb = RQWB(rqos);793 794	seq_printf(m, "%llu\n", rwb->cur_win_nsec);795	return 0;796}797 798static int wbt_enabled_show(void *data, struct seq_file *m)799{800	struct rq_qos *rqos = data;801	struct rq_wb *rwb = RQWB(rqos);802 803	seq_printf(m, "%d\n", rwb->enable_state);804	return 0;805}806 807static int wbt_id_show(void *data, struct seq_file *m)808{809	struct rq_qos *rqos = data;810 811	seq_printf(m, "%u\n", rqos->id);812	return 0;813}814 815static int wbt_inflight_show(void *data, struct seq_file *m)816{817	struct rq_qos *rqos = data;818	struct rq_wb *rwb = RQWB(rqos);819	int i;820 821	for (i = 0; i < WBT_NUM_RWQ; i++)822		seq_printf(m, "%d: inflight %d\n", i,823			   atomic_read(&rwb->rq_wait[i].inflight));824	return 0;825}826 827static int wbt_min_lat_nsec_show(void *data, struct seq_file *m)828{829	struct rq_qos *rqos = data;830	struct rq_wb *rwb = RQWB(rqos);831 832	seq_printf(m, "%lu\n", rwb->min_lat_nsec);833	return 0;834}835 836static int wbt_unknown_cnt_show(void *data, struct seq_file *m)837{838	struct rq_qos *rqos = data;839	struct rq_wb *rwb = RQWB(rqos);840 841	seq_printf(m, "%u\n", rwb->unknown_cnt);842	return 0;843}844 845static int wbt_normal_show(void *data, struct seq_file *m)846{847	struct rq_qos *rqos = data;848	struct rq_wb *rwb = RQWB(rqos);849 850	seq_printf(m, "%u\n", rwb->wb_normal);851	return 0;852}853 854static int wbt_background_show(void *data, struct seq_file *m)855{856	struct rq_qos *rqos = data;857	struct rq_wb *rwb = RQWB(rqos);858 859	seq_printf(m, "%u\n", rwb->wb_background);860	return 0;861}862 863static const struct blk_mq_debugfs_attr wbt_debugfs_attrs[] = {864	{"curr_win_nsec", 0400, wbt_curr_win_nsec_show},865	{"enabled", 0400, wbt_enabled_show},866	{"id", 0400, wbt_id_show},867	{"inflight", 0400, wbt_inflight_show},868	{"min_lat_nsec", 0400, wbt_min_lat_nsec_show},869	{"unknown_cnt", 0400, wbt_unknown_cnt_show},870	{"wb_normal", 0400, wbt_normal_show},871	{"wb_background", 0400, wbt_background_show},872	{},873};874#endif875 876static const struct rq_qos_ops wbt_rqos_ops = {877	.throttle = wbt_wait,878	.issue = wbt_issue,879	.track = wbt_track,880	.requeue = wbt_requeue,881	.done = wbt_done,882	.cleanup = wbt_cleanup,883	.queue_depth_changed = wbt_queue_depth_changed,884	.exit = wbt_exit,885#ifdef CONFIG_BLK_DEBUG_FS886	.debugfs_attrs = wbt_debugfs_attrs,887#endif888};889 890int wbt_init(struct gendisk *disk)891{892	struct request_queue *q = disk->queue;893	struct rq_wb *rwb;894	int i;895	int ret;896 897	rwb = kzalloc(sizeof(*rwb), GFP_KERNEL);898	if (!rwb)899		return -ENOMEM;900 901	rwb->cb = blk_stat_alloc_callback(wb_timer_fn, wbt_data_dir, 2, rwb);902	if (!rwb->cb) {903		kfree(rwb);904		return -ENOMEM;905	}906 907	for (i = 0; i < WBT_NUM_RWQ; i++)908		rq_wait_init(&rwb->rq_wait[i]);909 910	rwb->last_comp = rwb->last_issue = jiffies;911	rwb->win_nsec = RWB_WINDOW_NSEC;912	rwb->enable_state = WBT_STATE_ON_DEFAULT;913	rwb->rq_depth.default_depth = RWB_DEF_DEPTH;914	rwb->min_lat_nsec = wbt_default_latency_nsec(q);915	rwb->rq_depth.queue_depth = blk_queue_depth(q);916	wbt_update_limits(rwb);917 918	/*919	 * Assign rwb and add the stats callback.920	 */921	mutex_lock(&q->rq_qos_mutex);922	ret = rq_qos_add(&rwb->rqos, disk, RQ_QOS_WBT, &wbt_rqos_ops);923	mutex_unlock(&q->rq_qos_mutex);924	if (ret)925		goto err_free;926 927	blk_stat_add_callback(q, rwb->cb);928 929	return 0;930 931err_free:932	blk_stat_free_callback(rwb->cb);933	kfree(rwb);934	return ret;935 936}937