port iopriorities to CFQ for 2.6.8.1
Subsystems (5)
cover port iopriorities to CFQ for 2.6.8.1
Here is a patch that adds I/O priorities to the CFQ I/O scheduler in 2.6.8.1. Its a forward port of the version Jens had posted a while back (http://www.ussg.iu.edu/hypermail/linux/kernel/0311.1/0024.html)
The patch sustains 2 diskhogs running at different I/O priorities for over 10 minutes and pounding on an IDE disk.
The patch was developed to continue CKRM's I/O scheduler work. Since this scheduler is needed for CKRM, any feedback from testing will be much appreciated. Please cc: [email protected].
A subsequent patch will export per-priority level statistics of interest but is not required for correct functioning of this patch.
-- Shailabh
arch/i386/kernel/entry.S +2 -0
@@ -886,5 +886,7 @@ .long sys_mq_notify .long sys_mq_getsetattr .long sys_ni_syscall /* reserved for kexec */ + .long sys_ioprio_set + .long sys_ioprio_get /* 285 */ syscall_table_size=(.-sys_call_table)
arch/ppc/kernel/misc.S +2 -0
@@ -1450,3 +1450,5 @@ .long sys_mq_notify .long sys_mq_getsetattr .long sys_ni_syscall /* 268 reserved for sys_kexec_load */ + .long sys_ioprio_set + .long sys_ioprio_get
drivers/block/cfq-iosched.c +551 -155
1,110 lines not on this page · raw message
drivers/block/elevator.c +9 -1
@@ -339,6 +339,14 @@ e->elevator_put_req_fn (q, rq); } +void elv_set_congested (request_queue_t *q) +{ +elevator_t *e = &q->elevator; + +if (e->elevator_set_congested_fn) + e->elevator_set_congested_fn (q); +} +int elv_may_queue (request_queue_t *q,int rw) {elevator_t *e = &q->elevator;
@@ -346,7 +354,7 @@if (e->elevator_may_queue_fn)return e->elevator_may_queue_fn (q, rw); -return 0 ; +return 1 ; }void elv_completed_request (request_queue_t *q,struct request *rq)
drivers/block/ll_rw_blk.c +34 -11
72 lines not on this page · raw message
include/asm-i386/unistd.h +3 -1
@@ -289,8 +289,10 @@#define __NR_mq_notify (__NR_mq_open+4)#define __NR_mq_getsetattr (__NR_mq_open+5)#define __NR_sys_kexec_load 283 +#define __NR_ioprio_set 284 +#define __NR_ioprio_get 285 -#define NR_syscalls 284 +#define NR_syscalls 286/* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
include/asm-ppc/unistd.h +3 -1
@@ -273,8 +273,10 @@#define __NR_mq_notify 266#define __NR_mq_getsetattr 267#define __NR_kexec_load 268 +#define __NR_ioprio_set 269 +#define __NR_ioprio_get 270 -#define __NR_syscalls 269 +#define __NR_syscalls 271#define __NR (n) #n
include/asm-x86_64/unistd.h +5 -1
@@ -554,8 +554,12 @@ __SYSCALL(__NR_mq_getsetattr, sys_mq_getsetattr)#define __NR_kexec_load 246 __SYSCALL(__NR_kexec_load, sys_ni_syscall) +#define __NR_ioprio_set 247 +__SYSCALL (__NR_ioprio_set, sys_ioprio_set); +#define __NR_ioprio_get 248 +__SYSCALL (__NR_ioprio_get, sys_ioprio_get); -#define __NR_syscall_max __NR_kexec_load +#define __NR_syscall_max __NR_ioprio_get#ifndef __NO_STUBS/* user-visible error numbers are in the range -1 - -4095 */
include/linux/elevator.h +5 -0
@@ -17,6 +17,7 @@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 ); +typedef void (elevator_set_congested_fn ) (request_queue_t *);typedef int (elevator_set_req_fn ) (request_queue_t *,struct request *,int );typedef void (elevator_put_req_fn ) (request_queue_t *,struct request *);
@@ -45,6 +46,7 @@elevator_put_req_fn *elevator_put_req_fn;elevator_may_queue_fn *elevator_may_queue_fn; +elevator_set_congested_fn *elevator_set_congested_fn;elevator_init_fn *elevator_init_fn;elevator_exit_fn *elevator_exit_fn;
@@ -74,6 +76,7 @@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 ); +extern void elv_set_congested (request_queue_t *);extern void elv_completed_request (request_queue_t *,struct request *);extern int elv_set_request (request_queue_t *,struct request *,int );extern void elv_put_request (request_queue_t *,struct request *);
@@ -118,5 +121,7 @@#define ELEVATOR_INSERT_FRONT 1#define ELEVATOR_INSERT_BACK 2#define ELEVATOR_INSERT_SORT 3 + +#define RQ_ELV_DATA (rq) (rq)->elevator_private#endif
include/linux/fs.h +12 -0
@@ -1570,5 +1570,17 @@ { }#endif /* CONFIG_SECURITY */ +/* io priorities */ + +#define IOPRIO_NR 21 + +#define IOPRIO_IDLE 0 +#define IOPRIO_NORM 10 +#define IOPRIO_RT 20 + +asmlinkage int sys_ioprio_set(int ioprio); +asmlinkage int sys_ioprio_get(void); + +#endif /* __KERNEL__ */ #endif /* _LINUX_FS_H */
include/linux/init_task.h +1 -0
@@ -112,6 +112,7 @@ .proc_lock = SPIN_LOCK_UNLOCKED, \ .switch_lock = SPIN_LOCK_UNLOCKED, \ .journal_info = NULL, \ + .ioprio = IOPRIO_NORM, \ }
include/linux/sched.h +2 -0
@@ -520,6 +520,8 @@struct io_context *io_context; +int ioprio; +unsigned long ptrace_message;siginfo_t *last_siginfo;/* For ptrace use. */
kernel/fork.c +1 -0
@@ -1092,6 +1092,7 @@ }else link_pid (p, p->pids +PIDTYPE_TGID , &p->group_leader->pids[PIDTYPE_TGID ].pid); + p->ioprio = current->ioprio; nr_threads++;write_unlock_irq (&tasklist_lock); retval =0 ;