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
typedef void (elevator_deactivate_req_fn) (request_queue_t *, struct request *);

J
Jens Axboe 已提交
24
typedef void *(elevator_init_fn) (request_queue_t *, elevator_t *);
L
Linus Torvalds 已提交
25 26 27 28 29 30 31 32
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
};

#define ELV_NAME_MAX	(16)

56 57 58 59 60 61
struct elv_fs_entry {
	struct attribute attr;
	ssize_t (*show)(elevator_t *, char *);
	ssize_t (*store)(elevator_t *, const char *, size_t);
};

L
Linus Torvalds 已提交
62 63 64 65 66 67 68 69
/*
 * 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;
70
	struct elv_fs_entry *elevator_attrs;
L
Linus Torvalds 已提交
71 72 73 74 75
	char elevator_name[ELV_NAME_MAX];
	struct module *elevator_owner;
};

/*
A
Adrian Bunk 已提交
76
 * each queue has an elevator_queue associated with it
L
Linus Torvalds 已提交
77 78 79 80 81 82 83
 */
struct elevator_queue
{
	struct elevator_ops *ops;
	void *elevator_data;
	struct kobject kobj;
	struct elevator_type *elevator_type;
84
	struct mutex sysfs_lock;
L
Linus Torvalds 已提交
85 86 87 88 89
};

/*
 * block elevator interface
 */
J
Jens Axboe 已提交
90
extern void elv_dispatch_sort(request_queue_t *, struct request *);
L
Linus Torvalds 已提交
91 92
extern void elv_add_request(request_queue_t *, struct request *, int, int);
extern void __elv_add_request(request_queue_t *, struct request *, int, int);
93
extern void elv_insert(request_queue_t *, struct request *, int);
L
Linus Torvalds 已提交
94 95 96 97
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 *);
98
extern void elv_dequeue_request(request_queue_t *, struct request *);
L
Linus Torvalds 已提交
99 100 101 102 103 104 105
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);
106
extern int elv_may_queue(request_queue_t *, int, struct bio *);
L
Linus Torvalds 已提交
107
extern void elv_completed_request(request_queue_t *, struct request *);
A
Al Viro 已提交
108
extern int elv_set_request(request_queue_t *, struct request *, struct bio *, gfp_t);
L
Linus Torvalds 已提交
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 134 135 136 137 138 139
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
140
#define ELEVATOR_INSERT_REQUEUE	4
L
Linus Torvalds 已提交
141 142 143 144 145 146 147 148 149 150

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

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

L
Linus Torvalds 已提交
153
#endif