Blame view

block/blk-wbt.h 4.04 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
e34cbd307   Jens Axboe   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   Jens Axboe   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   Jens Axboe   blk-wbt: add gene...
32
33
  static inline void wbt_clear_state(struct blk_issue_stat *stat)
  {
88eeca495   Shaohua Li   block: track requ...
34
  	stat->stat &= ~BLK_STAT_RES_MASK;
e34cbd307   Jens Axboe   blk-wbt: add gene...
35
36
37
38
  }
  
  static inline enum wbt_flags wbt_stat_to_mask(struct blk_issue_stat *stat)
  {
88eeca495   Shaohua Li   block: track requ...
39
  	return (stat->stat & BLK_STAT_RES_MASK) >> BLK_STAT_RES_SHIFT;
e34cbd307   Jens Axboe   blk-wbt: add gene...
40
41
42
43
  }
  
  static inline void wbt_track(struct blk_issue_stat *stat, enum wbt_flags wb_acct)
  {
88eeca495   Shaohua Li   block: track requ...
44
  	stat->stat |= ((u64) wb_acct) << BLK_STAT_RES_SHIFT;
e34cbd307   Jens Axboe   blk-wbt: add gene...
45
46
47
48
  }
  
  static inline bool wbt_is_tracked(struct blk_issue_stat *stat)
  {
88eeca495   Shaohua Li   block: track requ...
49
  	return (stat->stat >> BLK_STAT_RES_SHIFT) & WBT_TRACKED;
e34cbd307   Jens Axboe   blk-wbt: add gene...
50
51
52
53
  }
  
  static inline bool wbt_is_read(struct blk_issue_stat *stat)
  {
88eeca495   Shaohua Li   block: track requ...
54
  	return (stat->stat >> BLK_STAT_RES_SHIFT) & WBT_READ;
e34cbd307   Jens Axboe   blk-wbt: add gene...
55
  }
e34cbd307   Jens Axboe   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   Jens Axboe   blk-wbt: allow wb...
70
  	short enable_state;			/* WBT_STATE_* */
e34cbd307   Jens Axboe   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   Omar Sandoval   blk-stat: convert...
79
  	struct blk_stat_callback *cb;
e34cbd307   Jens Axboe   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   Jens Axboe   blk-wbt: store qu...
90
  	struct request_queue *queue;
e34cbd307   Jens Axboe   blk-wbt: add gene...
91
  	struct rq_wait rq_wait[WBT_NUM_RWQ];
e34cbd307   Jens Axboe   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   Jens Axboe   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   Jens Axboe   blk-wbt: remove s...
108
  int wbt_init(struct request_queue *);
e34cbd307   Jens Axboe   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   Jens Axboe   blk-wbt: cleanup ...
113
  void wbt_disable_default(struct request_queue *);
8330cdb0f   Jan Kara   block: Make write...
114
  void wbt_enable_default(struct request_queue *);
e34cbd307   Jens Axboe   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   Jens Axboe   blk-wbt: allow re...
118
  u64 wbt_default_latency_nsec(struct request_queue *);
e34cbd307   Jens Axboe   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   Jens Axboe   blk-wbt: remove s...
132
  static inline int wbt_init(struct request_queue *q)
e34cbd307   Jens Axboe   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   Jens Axboe   blk-wbt: cleanup ...
148
  static inline void wbt_disable_default(struct request_queue *q)
e34cbd307   Jens Axboe   blk-wbt: add gene...
149
150
  {
  }
8330cdb0f   Jan Kara   block: Make write...
151
152
153
  static inline void wbt_enable_default(struct request_queue *q)
  {
  }
e34cbd307   Jens Axboe   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   Jens Axboe   blk-wbt: allow re...
160
161
162
163
  static inline u64 wbt_default_latency_nsec(struct request_queue *q)
  {
  	return 0;
  }
e34cbd307   Jens Axboe   blk-wbt: add gene...
164
165
166
167
  
  #endif /* CONFIG_BLK_WBT */
  
  #endif