elevator.h 4.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10
#ifndef _LINUX_ELEVATOR_H
#define _LINUX_ELEVATOR_H

typedef int (elevator_merge_fn) (request_queue_t *, struct request **,
				 struct bio *);

typedef void (elevator_merge_req_fn) (request_queue_t *, struct request *, struct request *);

typedef void (elevator_merged_fn) (request_queue_t *, struct request *);

11
typedef int (elevator_dispatch_fn) (request_queue_t *, int);
L
Linus Torvalds 已提交
12

13
typedef void (elevator_add_req_fn) (request_queue_t *, struct request *);
L
Linus Torvalds 已提交
14 15 16
typedef int (elevator_queue_empty_fn) (request_queue_t *);
typedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
typedef void (elevator_completed_req_fn) (request_queue_t *, struct request *);
17
typedef int (elevator_may_queue_fn) (request_queue_t *, int, struct bio *);
L
Linus Torvalds 已提交
18

A
Al Viro 已提交
19
typedef int (elevator_set_req_fn) (request_queue_t *, struct request *, struct bio *, gfp_t);
L
Linus Torvalds 已提交
20
typedef void (elevator_put_req_fn) (request_queue_t *, struct request *);
21
typedef void (elevator_activate_req_fn) (request_queue_t *, struct request *);
L
Linus Torvalds 已提交
22 23 24 25 26 27 28 29 30 31 32
typedef void (elevator_deactivate_req_fn) (request_queue_t *, struct request *);

typedef int (elevator_init_fn) (request_queue_t *, elevator_t *);
typedef void (elevator_exit_fn) (elevator_t *);

struct elevator_ops
{
	elevator_merge_fn *elevator_merge_fn;
	elevator_merged_fn *elevator_merged_fn;
	elevator_merge_req_fn *elevator_merge_req_fn;

33
	elevator_dispatch_fn *elevator_dispatch_fn;
L
Linus Torvalds 已提交
34
	elevator_add_req_fn *elevator_add_req_fn;
35
	elevator_activate_req_fn *elevator_activate_req_fn;
L
Linus Torvalds 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
	elevator_deactivate_req_fn *elevator_deactivate_req_fn;

	elevator_queue_empty_fn *elevator_queue_empty_fn;
	elevator_completed_req_fn *elevator_completed_req_fn;

	elevator_request_list_fn *elevator_former_req_fn;
	elevator_request_list_fn *elevator_latter_req_fn;

	elevator_set_req_fn *elevator_set_req_fn;
	elevator_put_req_fn *elevator_put_req_fn;

	elevator_may_queue_fn *elevator_may_queue_fn;

	elevator_init_fn *elevator_init_fn;
	elevator_exit_fn *elevator_exit_fn;
51
	void (*trim)(struct io_context *);
L
Linus Torvalds 已提交
52 53 54 55 56 57 58 59 60 61 62 63
};

#define ELV_NAME_MAX	(16)

/*
 * identifies an elevator type, such as AS or deadline
 */
struct elevator_type
{
	struct list_head list;
	struct elevator_ops ops;
	struct elevator_type *elevator_type;
64
	struct attribute **elevator_attrs;
L
Linus Torvalds 已提交
65 66 67 68 69
	char elevator_name[ELV_NAME_MAX];
	struct module *elevator_owner;
};

/*
A
Adrian Bunk 已提交
70
 * each queue has an elevator_queue associated with it
L
Linus Torvalds 已提交
71 72 73 74 75 76 77
 */
struct elevator_queue
{
	struct elevator_ops *ops;
	void *elevator_data;
	struct kobject kobj;
	struct elevator_type *elevator_type;
78
	struct mutex sysfs_lock;
L
Linus Torvalds 已提交
79 80 81 82 83
};

/*
 * block elevator interface
 */
J
Jens Axboe 已提交
84
extern void elv_dispatch_sort(request_queue_t *, struct request *);
L
Linus Torvalds 已提交
85 86
extern void elv_add_request(request_queue_t *, struct request *, int, int);
extern void __elv_add_request(request_queue_t *, struct request *, int, int);
87
extern void elv_insert(request_queue_t *, struct request *, int);
L
Linus Torvalds 已提交
88 89 90 91
extern int elv_merge(request_queue_t *, struct request **, struct bio *);
extern void elv_merge_requests(request_queue_t *, struct request *,
			       struct request *);
extern void elv_merged_request(request_queue_t *, struct request *);
92
extern void elv_dequeue_request(request_queue_t *, struct request *);
L
Linus Torvalds 已提交
93 94 95 96 97 98 99
extern void elv_requeue_request(request_queue_t *, struct request *);
extern int elv_queue_empty(request_queue_t *);
extern struct request *elv_next_request(struct request_queue *q);
extern struct request *elv_former_request(request_queue_t *, struct request *);
extern struct request *elv_latter_request(request_queue_t *, struct request *);
extern int elv_register_queue(request_queue_t *q);
extern void elv_unregister_queue(request_queue_t *q);
100
extern int elv_may_queue(request_queue_t *, int, struct bio *);
L
Linus Torvalds 已提交
101
extern void elv_completed_request(request_queue_t *, struct request *);
A
Al Viro 已提交
102
extern int elv_set_request(request_queue_t *, struct request *, struct bio *, gfp_t);
L
Linus Torvalds 已提交
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
extern void elv_put_request(request_queue_t *, struct request *);

/*
 * io scheduler registration
 */
extern int elv_register(struct elevator_type *);
extern void elv_unregister(struct elevator_type *);

/*
 * io scheduler sysfs switching
 */
extern ssize_t elv_iosched_show(request_queue_t *, char *);
extern ssize_t elv_iosched_store(request_queue_t *, const char *, size_t);

extern int elevator_init(request_queue_t *, char *);
extern void elevator_exit(elevator_t *);
extern int elv_rq_merge_ok(struct request *, struct bio *);

/*
 * Return values from elevator merger
 */
#define ELEVATOR_NO_MERGE	0
#define ELEVATOR_FRONT_MERGE	1
#define ELEVATOR_BACK_MERGE	2

/*
 * Insertion selection
 */
#define ELEVATOR_INSERT_FRONT	1
#define ELEVATOR_INSERT_BACK	2
#define ELEVATOR_INSERT_SORT	3
134
#define ELEVATOR_INSERT_REQUEUE	4
L
Linus Torvalds 已提交
135 136 137 138 139 140 141 142 143 144

/*
 * return values from elevator_may_queue_fn
 */
enum {
	ELV_MQUEUE_MAY,
	ELV_MQUEUE_NO,
	ELV_MQUEUE_MUST,
};

145 146 147 148 149 150
struct elv_fs_entry {
	struct attribute attr;
	ssize_t (*show)(elevator_t *, char *);
	ssize_t (*store)(elevator_t *, const char *, size_t);
};

J
Jens Axboe 已提交
151 152
#define rq_end_sector(rq)	((rq)->sector + (rq)->nr_sectors)

L
Linus Torvalds 已提交
153
#endif