Skip to contentSkip to conversation

port iopriorities to CFQ for 2.6.8.1

PATCH New Shailabh Nagar 1 participant 1 message Sep 24, 2004

Subsystems (5)
VFS Block layer MM core Scheduler +1 more subsystems
lore
Share & tools
lore
#0 lore raw

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
diff -Nru a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S
@@ -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
diff -Nru a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S
@@ -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
diff -Nru a/drivers/block/elevator.c b/drivers/block/elevator.c
@@ -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
diff -Nru a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h
@@ -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
diff -Nru a/include/asm-ppc/unistd.h b/include/asm-ppc/unistd.h
@@ -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
diff -Nru a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h
@@ -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
diff -Nru a/include/linux/elevator.h b/include/linux/elevator.h
@@ -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
diff -Nru a/include/linux/fs.h b/include/linux/fs.h
@@ -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
diff -Nru a/include/linux/init_task.h b/include/linux/init_task.h
@@ -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
diff -Nru a/include/linux/sched.h b/include/linux/sched.h
@@ -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
diff -Nru a/kernel/fork.c b/kernel/fork.c
@@ -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;