Blame view
include/linux/elevator.h
5.35 KB
b24413180
|
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
1da177e4c
|
2 3 |
#ifndef _LINUX_ELEVATOR_H #define _LINUX_ELEVATOR_H |
4a893e837
|
4 |
#include <linux/percpu.h> |
242d98f07
|
5 |
#include <linux/hashtable.h> |
4a893e837
|
6 |
|
9361401eb
|
7 |
#ifdef CONFIG_BLOCK |
7e5a87944
|
8 |
struct io_cq; |
d50235b7b
|
9 |
struct elevator_type; |
d332ce091
|
10 11 12 |
#ifdef CONFIG_BLK_DEBUG_FS struct blk_mq_debugfs_attr; #endif |
7e5a87944
|
13 |
|
34fe7c054
|
14 15 16 17 18 19 20 |
/* * Return values from elevator merger */ enum elv_merge { ELEVATOR_NO_MERGE = 0, ELEVATOR_FRONT_MERGE = 1, ELEVATOR_BACK_MERGE = 2, |
1e739730c
|
21 |
ELEVATOR_DISCARD_MERGE = 3, |
34fe7c054
|
22 |
}; |
bd166ef18
|
23 24 25 26 27 28 |
struct blk_mq_alloc_data; struct blk_mq_hw_ctx; struct elevator_mq_ops { int (*init_sched)(struct request_queue *, struct elevator_type *); void (*exit_sched)(struct elevator_queue *); |
ee056f981
|
29 30 |
int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int); void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); |
77f1e0a52
|
31 |
void (*depth_updated)(struct blk_mq_hw_ctx *); |
bd166ef18
|
32 33 |
bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); |
14ccb66b3
|
34 |
bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *, unsigned int); |
bd166ef18
|
35 |
int (*request_merge)(struct request_queue *q, struct request **, struct bio *); |
34fe7c054
|
36 |
void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); |
bd166ef18
|
37 |
void (*requests_merged)(struct request_queue *, struct request *, struct request *); |
5bbf4e5a8
|
38 |
void (*limit_depth)(unsigned int, struct blk_mq_alloc_data *); |
5d9c305b8
|
39 |
void (*prepare_request)(struct request *); |
7b9e93616
|
40 |
void (*finish_request)(struct request *); |
bd166ef18
|
41 |
void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, bool); |
c13660a08
|
42 |
struct request *(*dispatch_request)(struct blk_mq_hw_ctx *); |
bd166ef18
|
43 |
bool (*has_work)(struct blk_mq_hw_ctx *); |
ed88660a5
|
44 |
void (*completed_request)(struct request *, u64); |
bd166ef18
|
45 46 47 |
void (*requeue_request)(struct request *); struct request *(*former_request)(struct request_queue *, struct request *); struct request *(*next_request)(struct request_queue *, struct request *); |
bd166ef18
|
48 49 50 |
void (*init_icq)(struct io_cq *); void (*exit_icq)(struct io_cq *); }; |
1da177e4c
|
51 |
#define ELV_NAME_MAX (16) |
e572ec7e4
|
52 53 |
struct elv_fs_entry { struct attribute attr; |
b374d18a4
|
54 55 |
ssize_t (*show)(struct elevator_queue *, char *); ssize_t (*store)(struct elevator_queue *, const char *, size_t); |
e572ec7e4
|
56 |
}; |
1da177e4c
|
57 58 59 60 61 |
/* * identifies an elevator type, such as AS or deadline */ struct elevator_type { |
3d3c2379f
|
62 63 64 65 |
/* managed by elevator core */ struct kmem_cache *icq_cache; /* fields provided by elevator implementation */ |
f9cd4bfe9
|
66 |
struct elevator_mq_ops ops; |
a1ce35fa4
|
67 |
|
f1f8cc946
|
68 69 |
size_t icq_size; /* see iocontext.h */ size_t icq_align; /* ditto */ |
e572ec7e4
|
70 |
struct elv_fs_entry *elevator_attrs; |
9305d5d72
|
71 |
const char *elevator_name; |
8ac0d9a81
|
72 |
const char *elevator_alias; |
68c43f133
|
73 |
const unsigned int elevator_features; |
1da177e4c
|
74 |
struct module *elevator_owner; |
d332ce091
|
75 76 77 78 |
#ifdef CONFIG_BLK_DEBUG_FS const struct blk_mq_debugfs_attr *queue_debugfs_attrs; const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; #endif |
3d3c2379f
|
79 80 |
/* managed by elevator core */ |
9bd2bbc01
|
81 |
char icq_cache_name[ELV_NAME_MAX + 6]; /* elvname + "_io_cq" */ |
22f746e23
|
82 |
struct list_head list; |
1da177e4c
|
83 |
}; |
242d98f07
|
84 |
#define ELV_HASH_BITS 6 |
70b3ea056
|
85 86 87 88 |
void elv_rqhash_del(struct request_queue *q, struct request *rq); void elv_rqhash_add(struct request_queue *q, struct request *rq); void elv_rqhash_reposition(struct request_queue *q, struct request *rq); struct request *elv_rqhash_find(struct request_queue *q, sector_t offset); |
1da177e4c
|
89 |
/* |
540695886
|
90 |
* each queue has an elevator_queue associated with it |
1da177e4c
|
91 92 93 |
*/ struct elevator_queue { |
22f746e23
|
94 |
struct elevator_type *type; |
1da177e4c
|
95 96 |
void *elevator_data; struct kobject kobj; |
3d1ab40f4
|
97 |
struct mutex sysfs_lock; |
430c62fb2
|
98 |
unsigned int registered:1; |
242d98f07
|
99 |
DECLARE_HASHTABLE(hash, ELV_HASH_BITS); |
1da177e4c
|
100 101 102 103 104 |
}; /* * block elevator interface */ |
34fe7c054
|
105 106 |
extern enum elv_merge elv_merge(struct request_queue *, struct request **, struct bio *); |
165125e1e
|
107 |
extern void elv_merge_requests(struct request_queue *, struct request *, |
1da177e4c
|
108 |
struct request *); |
34fe7c054
|
109 110 |
extern void elv_merged_request(struct request_queue *, struct request *, enum elv_merge); |
bd166ef18
|
111 |
extern bool elv_attempt_insert_merge(struct request_queue *, struct request *); |
165125e1e
|
112 113 |
extern struct request *elv_former_request(struct request_queue *, struct request *); extern struct request *elv_latter_request(struct request_queue *, struct request *); |
1da177e4c
|
114 115 116 117 |
/* * io scheduler registration */ |
e567bf711
|
118 |
extern int elv_register(struct elevator_type *); |
1da177e4c
|
119 120 121 122 123 |
extern void elv_unregister(struct elevator_type *); /* * io scheduler sysfs switching */ |
165125e1e
|
124 125 |
extern ssize_t elv_iosched_show(struct request_queue *, char *); extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t); |
1da177e4c
|
126 |
|
72ef799b3
|
127 |
extern bool elv_bio_merge_ok(struct request *, struct bio *); |
d50235b7b
|
128 129 |
extern struct elevator_queue *elevator_alloc(struct request_queue *, struct elevator_type *); |
1da177e4c
|
130 131 |
/* |
2e662b65f
|
132 133 |
* Helper functions. */ |
165125e1e
|
134 135 |
extern struct request *elv_rb_former_request(struct request_queue *, struct request *); extern struct request *elv_rb_latter_request(struct request_queue *, struct request *); |
2e662b65f
|
136 137 138 139 |
/* * rb support functions. */ |
796d5116c
|
140 |
extern void elv_rb_add(struct rb_root *, struct request *); |
2e662b65f
|
141 142 143 144 |
extern void elv_rb_del(struct rb_root *, struct request *); extern struct request *elv_rb_find(struct rb_root *, sector_t); /* |
1da177e4c
|
145 146 147 148 149 |
* Insertion selection */ #define ELEVATOR_INSERT_FRONT 1 #define ELEVATOR_INSERT_BACK 2 #define ELEVATOR_INSERT_SORT 3 |
797e7dbbe
|
150 |
#define ELEVATOR_INSERT_REQUEUE 4 |
ae1b15396
|
151 |
#define ELEVATOR_INSERT_FLUSH 5 |
5e84ea3a9
|
152 |
#define ELEVATOR_INSERT_SORT_MERGE 6 |
1da177e4c
|
153 |
|
2e46e8b27
|
154 |
#define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq)) |
2e662b65f
|
155 |
#define rb_entry_rq(node) rb_entry((node), struct request, rb_node) |
1b47f531e
|
156 |
|
1fbfdfcdd
|
157 |
#define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist) |
d9a74df51
|
158 |
#define rq_fifo_clear(rq) list_del_init(&(rq)->queuelist) |
1fbfdfcdd
|
159 |
|
68c43f133
|
160 161 162 163 164 165 |
/* * Elevator features. */ /* Supports zoned block devices sequential write constraint */ #define ELEVATOR_F_ZBD_SEQ_WRITE (1U << 0) |
9361401eb
|
166 |
#endif /* CONFIG_BLOCK */ |
1da177e4c
|
167 |
#endif |