Blame view
block/blk-wbt.h
4.04 KB
b24413180 License cleanup: ... |
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
e34cbd307 blk-wbt: add gene... |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#ifndef WB_THROTTLE_H #define WB_THROTTLE_H #include <linux/kernel.h> #include <linux/atomic.h> #include <linux/wait.h> #include <linux/timer.h> #include <linux/ktime.h> #include "blk-stat.h" enum wbt_flags { WBT_TRACKED = 1, /* write, tracked for throttling */ WBT_READ = 2, /* read */ WBT_KSWAPD = 4, /* write, from kswapd */ WBT_NR_BITS = 3, /* number of bits */ }; enum { WBT_NUM_RWQ = 2, }; |
d62118b6d blk-wbt: allow wb... |
24 25 26 27 28 29 30 31 |
/* * Enable states. Either off, or on by default (done at init time), * or on through manual setup in sysfs. */ enum { WBT_STATE_ON_DEFAULT = 1, WBT_STATE_ON_MANUAL = 2, }; |
e34cbd307 blk-wbt: add gene... |
32 33 |
static inline void wbt_clear_state(struct blk_issue_stat *stat) { |
88eeca495 block: track requ... |
34 |
stat->stat &= ~BLK_STAT_RES_MASK; |
e34cbd307 blk-wbt: add gene... |
35 36 37 38 |
} static inline enum wbt_flags wbt_stat_to_mask(struct blk_issue_stat *stat) { |
88eeca495 block: track requ... |
39 |
return (stat->stat & BLK_STAT_RES_MASK) >> BLK_STAT_RES_SHIFT; |
e34cbd307 blk-wbt: add gene... |
40 41 42 43 |
} static inline void wbt_track(struct blk_issue_stat *stat, enum wbt_flags wb_acct) { |
88eeca495 block: track requ... |
44 |
stat->stat |= ((u64) wb_acct) << BLK_STAT_RES_SHIFT; |
e34cbd307 blk-wbt: add gene... |
45 46 47 48 |
} static inline bool wbt_is_tracked(struct blk_issue_stat *stat) { |
88eeca495 block: track requ... |
49 |
return (stat->stat >> BLK_STAT_RES_SHIFT) & WBT_TRACKED; |
e34cbd307 blk-wbt: add gene... |
50 51 52 53 |
} static inline bool wbt_is_read(struct blk_issue_stat *stat) { |
88eeca495 block: track requ... |
54 |
return (stat->stat >> BLK_STAT_RES_SHIFT) & WBT_READ; |
e34cbd307 blk-wbt: add gene... |
55 |
} |
e34cbd307 blk-wbt: add gene... |
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
struct rq_wait { wait_queue_head_t wait; atomic_t inflight; }; struct rq_wb { /* * Settings that govern how we throttle */ unsigned int wb_background; /* background writeback */ unsigned int wb_normal; /* normal writeback */ unsigned int wb_max; /* max throughput writeback */ int scale_step; bool scaled_max; |
d62118b6d blk-wbt: allow wb... |
70 |
short enable_state; /* WBT_STATE_* */ |
e34cbd307 blk-wbt: add gene... |
71 72 73 74 75 76 77 78 |
/* * Number of consecutive periods where we don't have enough * information to make a firm scale up/down decision. */ unsigned int unknown_cnt; u64 win_nsec; /* default window size */ u64 cur_win_nsec; /* current window size */ |
34dbad5d2 blk-stat: convert... |
79 |
struct blk_stat_callback *cb; |
e34cbd307 blk-wbt: add gene... |
80 81 82 83 84 85 86 87 88 89 |
s64 sync_issue; void *sync_cookie; unsigned int wc; unsigned int queue_depth; unsigned long last_issue; /* last non-throttled issue */ unsigned long last_comp; /* last non-throttled comp */ unsigned long min_lat_nsec; |
d8a0cbfd7 blk-wbt: store qu... |
90 |
struct request_queue *queue; |
e34cbd307 blk-wbt: add gene... |
91 |
struct rq_wait rq_wait[WBT_NUM_RWQ]; |
e34cbd307 blk-wbt: add gene... |
92 93 94 95 96 97 98 99 100 101 102 |
}; static inline unsigned int wbt_inflight(struct rq_wb *rwb) { unsigned int i, ret = 0; for (i = 0; i < WBT_NUM_RWQ; i++) ret += atomic_read(&rwb->rq_wait[i].inflight); return ret; } |
e34cbd307 blk-wbt: add gene... |
103 104 105 106 107 |
#ifdef CONFIG_BLK_WBT void __wbt_done(struct rq_wb *, enum wbt_flags); void wbt_done(struct rq_wb *, struct blk_issue_stat *); enum wbt_flags wbt_wait(struct rq_wb *, struct bio *, spinlock_t *); |
8054b89f8 blk-wbt: remove s... |
108 |
int wbt_init(struct request_queue *); |
e34cbd307 blk-wbt: add gene... |
109 110 111 112 |
void wbt_exit(struct request_queue *); void wbt_update_limits(struct rq_wb *); void wbt_requeue(struct rq_wb *, struct blk_issue_stat *); void wbt_issue(struct rq_wb *, struct blk_issue_stat *); |
fa224eed2 blk-wbt: cleanup ... |
113 |
void wbt_disable_default(struct request_queue *); |
8330cdb0f block: Make write... |
114 |
void wbt_enable_default(struct request_queue *); |
e34cbd307 blk-wbt: add gene... |
115 116 117 |
void wbt_set_queue_depth(struct rq_wb *, unsigned int); void wbt_set_write_cache(struct rq_wb *, bool); |
80e091d10 blk-wbt: allow re... |
118 |
u64 wbt_default_latency_nsec(struct request_queue *); |
e34cbd307 blk-wbt: add gene... |
119 120 121 122 123 124 125 126 127 128 129 130 131 |
#else static inline void __wbt_done(struct rq_wb *rwb, enum wbt_flags flags) { } static inline void wbt_done(struct rq_wb *rwb, struct blk_issue_stat *stat) { } static inline enum wbt_flags wbt_wait(struct rq_wb *rwb, struct bio *bio, spinlock_t *lock) { return 0; } |
8054b89f8 blk-wbt: remove s... |
132 |
static inline int wbt_init(struct request_queue *q) |
e34cbd307 blk-wbt: add gene... |
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
{ return -EINVAL; } static inline void wbt_exit(struct request_queue *q) { } static inline void wbt_update_limits(struct rq_wb *rwb) { } static inline void wbt_requeue(struct rq_wb *rwb, struct blk_issue_stat *stat) { } static inline void wbt_issue(struct rq_wb *rwb, struct blk_issue_stat *stat) { } |
fa224eed2 blk-wbt: cleanup ... |
148 |
static inline void wbt_disable_default(struct request_queue *q) |
e34cbd307 blk-wbt: add gene... |
149 150 |
{ } |
8330cdb0f block: Make write... |
151 152 153 |
static inline void wbt_enable_default(struct request_queue *q) { } |
e34cbd307 blk-wbt: add gene... |
154 155 156 157 158 159 |
static inline void wbt_set_queue_depth(struct rq_wb *rwb, unsigned int depth) { } static inline void wbt_set_write_cache(struct rq_wb *rwb, bool wc) { } |
80e091d10 blk-wbt: allow re... |
160 161 162 163 |
static inline u64 wbt_default_latency_nsec(struct request_queue *q) { return 0; } |
e34cbd307 blk-wbt: add gene... |
164 165 166 167 |
#endif /* CONFIG_BLK_WBT */ #endif |