elevator.h 4.6 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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
	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;
};

#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;
	struct kobj_type *elevator_ktype;
	char elevator_name[ELV_NAME_MAX];
	struct module *elevator_owner;
};

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

/*
 * block elevator interface
 */
J
Jens Axboe 已提交
82
extern void elv_dispatch_sort(request_queue_t *, struct request *);
L
Linus Torvalds 已提交
83 84 85 86 87 88
extern void elv_add_request(request_queue_t *, struct request *, int, int);
extern void __elv_add_request(request_queue_t *, struct request *, int, int);
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 *);
89
extern void elv_dequeue_request(request_queue_t *, struct request *);
L
Linus Torvalds 已提交
90 91 92 93 94 95 96
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);
97
extern int elv_may_queue(request_queue_t *, int, struct bio *);
L
Linus Torvalds 已提交
98
extern void elv_completed_request(request_queue_t *, struct request *);
A
Al Viro 已提交
99
extern int elv_set_request(request_queue_t *, struct request *, struct bio *, gfp_t);
L
Linus Torvalds 已提交
100 101 102 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
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
131
#define ELEVATOR_INSERT_REQUEUE	4
L
Linus Torvalds 已提交
132 133 134 135 136 137 138 139 140 141

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

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

L
Linus Torvalds 已提交
144
#endif