mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-25 02:09:42 +00:00
![Jens Axboe](/assets/img/avatar_default.png)
This updates the CFQ io scheduler to the new time sliced design (cfq v3). It provides full process fairness, while giving excellent aggregate system throughput even for many competing processes. It supports io priorities, either inherited from the cpu nice value or set directly with the ioprio_get/set syscalls. The latter closely mimic set/getpriority. This import is based on my latest from -mm. Signed-off-by: Jens Axboe <axboe@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
145 lines
4.8 KiB
C
145 lines
4.8 KiB
C
#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 *);
|
|
|
|
typedef struct request *(elevator_next_req_fn) (request_queue_t *);
|
|
|
|
typedef void (elevator_add_req_fn) (request_queue_t *, struct request *, int);
|
|
typedef int (elevator_queue_empty_fn) (request_queue_t *);
|
|
typedef void (elevator_remove_req_fn) (request_queue_t *, struct request *);
|
|
typedef void (elevator_requeue_req_fn) (request_queue_t *, struct request *);
|
|
typedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
|
|
typedef void (elevator_completed_req_fn) (request_queue_t *, struct request *);
|
|
typedef int (elevator_may_queue_fn) (request_queue_t *, int, struct bio *);
|
|
|
|
typedef int (elevator_set_req_fn) (request_queue_t *, struct request *, struct bio *, int);
|
|
typedef void (elevator_put_req_fn) (request_queue_t *, struct request *);
|
|
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;
|
|
|
|
elevator_next_req_fn *elevator_next_req_fn;
|
|
elevator_add_req_fn *elevator_add_req_fn;
|
|
elevator_remove_req_fn *elevator_remove_req_fn;
|
|
elevator_requeue_req_fn *elevator_requeue_req_fn;
|
|
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;
|
|
};
|
|
|
|
/*
|
|
* each queue has an elevator_queue assoicated with it
|
|
*/
|
|
struct elevator_queue
|
|
{
|
|
struct elevator_ops *ops;
|
|
void *elevator_data;
|
|
struct kobject kobj;
|
|
struct elevator_type *elevator_type;
|
|
};
|
|
|
|
/*
|
|
* block elevator interface
|
|
*/
|
|
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 *);
|
|
extern void elv_remove_request(request_queue_t *, struct request *);
|
|
extern void elv_requeue_request(request_queue_t *, struct request *);
|
|
extern void elv_deactivate_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);
|
|
extern int elv_may_queue(request_queue_t *, int, struct bio *);
|
|
extern void elv_completed_request(request_queue_t *, struct request *);
|
|
extern int elv_set_request(request_queue_t *, struct request *, struct bio *, int);
|
|
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 *);
|
|
extern int elv_try_merge(struct request *, struct bio *);
|
|
extern int elv_try_last_merge(request_queue_t *, 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
|
|
|
|
/*
|
|
* return values from elevator_may_queue_fn
|
|
*/
|
|
enum {
|
|
ELV_MQUEUE_MAY,
|
|
ELV_MQUEUE_NO,
|
|
ELV_MQUEUE_MUST,
|
|
};
|
|
|
|
#endif
|