From ee04a8fbdfe558bd63cd5b0309f1387803d0e2f0 Mon Sep 17 00:00:00 2001 From: t_jeang Date: Tue, 6 Jan 2009 12:06:01 +0000 Subject: [PATCH] imported patch blktap-ioprio.patch --- include/linux/init_task.h | 1 + include/linux/resource.h | 1 + include/linux/sched.h | 1 + kernel/sys.c | 18 ++++++++++++++---- mm/page-writeback.c | 3 +++ 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/linux/init_task.h b/include/linux/init_task.h index b6ef1280..7277ebdf 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -89,6 +89,7 @@ extern struct group_info init_groups; .lock_depth = -1, \ .prio = MAX_PRIO-20, \ .static_prio = MAX_PRIO-20, \ + .special_prio = 0, \ .normal_prio = MAX_PRIO-20, \ .policy = SCHED_NORMAL, \ .cpus_allowed = CPU_MASK_ALL, \ diff --git a/include/linux/resource.h b/include/linux/resource.h index 14757afe..eec6bd96 100644 --- a/include/linux/resource.h +++ b/include/linux/resource.h @@ -46,6 +46,7 @@ struct rlimit { #define PRIO_MIN (-20) #define PRIO_MAX 20 +#define PRIO_SPECIAL_IO -9999 #define PRIO_PROCESS 0 #define PRIO_PGRP 1 diff --git a/include/linux/sched.h b/include/linux/sched.h index ee07ae3a..445b82e9 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -823,6 +823,7 @@ struct task_struct { struct prio_array *array; unsigned short ioprio; + short special_prio; unsigned int btrace_seq; unsigned long sleep_avg; diff --git a/kernel/sys.c b/kernel/sys.c index 7695fc56..25782410 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -444,6 +444,11 @@ static int set_one_prio(struct task_struct *p, int niceval, int error) error = -EPERM; goto out; } + if (niceval == PRIO_SPECIAL_IO) { + p->special_prio = PRIO_SPECIAL_IO; + error = 0; + goto out; + } if (niceval < task_nice(p) && !can_nice(p, niceval)) { error = -EACCES; goto out; @@ -471,10 +476,15 @@ asmlinkage long sys_setpriority(int which, int who, int niceval) /* normalize: avoid signed division (rounding problems) */ error = -ESRCH; - if (niceval < -20) - niceval = -20; - if (niceval > 19) - niceval = 19; + if (niceval == PRIO_SPECIAL_IO) { + if (which != PRIO_PROCESS) + return -EINVAL; + } else { + if (niceval < -20) + niceval = -20; + if (niceval > 19) + niceval = 19; + } read_lock(&tasklist_lock); switch (which) { diff --git a/mm/page-writeback.c b/mm/page-writeback.c index e9fb4024..c23c2558 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -220,6 +220,9 @@ static void balance_dirty_pages(struct address_space *mapping) pages_written += write_chunk - wbc.nr_to_write; if (pages_written >= write_chunk) break; /* We've done our duty */ + if (current->special_prio == PRIO_SPECIAL_IO) + break; /* Exempt IO processes */ + } blk_congestion_wait(WRITE, HZ/10); } -- 2.39.5