ok,
         new patch. with sysctl for
/proc/sys/kernel/rtsched_{period,reserved}. a single limit for all rt
fifo processes. same caveats as last time.

                rob

--- pristine/linux-2.4.20/kernel/sched.c        2003-03-17 23:24:02.000000000 -0500
+++ linux/kernel/sched.c        2003-03-18 13:22:38.000000000 -0500
@@ -43,6 +43,12 @@ extern void immediate_bh(void);
 
 unsigned securebits = SECUREBITS_DEFAULT; /* systemwide security settings */
 
+unsigned long rt_period_start = 0; 
+unsigned long rt_period_end = 0; 
+unsigned long rt_period_remain = 0; 
+unsigned long rt_period_length = 50;
+unsigned long rt_period_reserved = 45;
+
 extern void mem_use(void);
 
 /*
@@ -188,7 +194,35 @@ static inline int goodness(struct task_s
         * runqueue (taking priorities within processes
         * into account).
         */
+
+       
+       
+       /*
+        *   check if we are in the right time period
+        *
+        *   XXX if it burns though it's entire quantum and
+        *       into the next ? 
+        *     
+        */
+       if (jiffies >= rt_period_end) { 
+         /* no, start over from now */
+         rt_period_start = jiffies;
+         rt_period_end = rt_period_length + rt_period_start;
+         rt_period_remain = rt_period_reserved; 
+       }
+       
+       /*
+        *  is there any remaining time ? 
+        *  
+        */
+       
+       if (rt_period_remain > 0) { 
        weight = 1000 + p->rt_priority;
+       }  else { 
+         /* redundent, for clarity */
+         weight = -1; 
+       }
+
 out:
        return weight;
 }
--- pristine/linux-2.4.20/kernel/sysctl.c       2003-03-17 23:24:02.000000000 -0500
+++ linux/kernel/sysctl.c       2003-03-18 13:05:22.000000000 -0500
@@ -51,6 +51,11 @@ extern int sysrq_enabled;
 extern int core_uses_pid;
 extern int cad_pid;
 
+
+extern unsigned long rt_period_length;
+extern unsigned long rt_period_reserved;
+
+
 /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
 static int maxolduid = 65535;
 static int minolduid;
@@ -260,6 +265,12 @@ static ctl_table kern_table[] = {
        {KERN_LOWLATENCY, "lowlatency", &enable_lowlatency, sizeof (int),
         0644, NULL, &proc_dointvec},
 #endif
+
+       {KERN_FIFOSCHED_PERIOD, "rtsched-period", &rt_period_length, 
+          sizeof (int), 0644, NULL, &proc_dointvec},
+       {KERN_FIFOSCHED_RESERV, "rtsched-reserve", 
+        &rt_period_reserved, sizeof (int), 0644, NULL, &proc_dointvec},
+
        {0}
 };
 
--- pristine/linux-2.4.20/include/linux/sysctl.h        2003-03-17 23:24:02.000000000 
-0500
+++ linux/include/linux/sysctl.h        2003-03-18 13:03:37.000000000 -0500
@@ -125,6 +125,8 @@ enum
        KERN_TAINTED=53,        /* int: various kernel tainted flags */
        KERN_CADPID=54,         /* int: PID of the process to notify on CAD */
        KERN_LOWLATENCY=55,     /* int: enable low latency scheduling */
+       KERN_FIFOSCHED_PERIOD=56, /* max time rt processes can take up */
+       KERN_FIFOSCHED_RESERV=57, /* "" */
 };
 
 
--- pristine/linux-2.4.20/kernel/timer.c        2002-11-28 18:53:15.000000000 -0500
+++ linux/kernel/timer.c        2003-03-18 12:41:05.000000000 -0500
@@ -105,6 +105,16 @@ static struct list_head * run_timer_list
 
 #define NOOF_TVECS (sizeof(tvecs) / sizeof(tvecs[0]))
 
+extern unsigned long rt_period_start; 
+extern unsigned long rt_period_end;  
+extern unsigned long rt_period_remain; 
+extern unsigned long rt_period_length;
+extern unsigned long rt_period_reserved;
+
+
+
+
+
 void init_timervecs (void)
 {
        int i;
@@ -610,6 +620,15 @@ void update_process_times(int user_tick)
                                p->need_resched = 1;
                        }
                }
+               
+               if (p->policy == SCHED_FIFO) { 
+                 if (rt_period_remain == 0) { 
+                   p->need_resched = 1;
+                 } else { 
+                   rt_period_remain--;
+                 }
+               }
+
                if (p->nice > 0)
                        kstat.per_cpu_nice[cpu] += user_tick;
                else



----
Robert Melby
Georgia Institute of Technology, Atlanta Georgia, 30332
uucp:     ...!{decvax,hplabs,ncar,purdue,rutgers}!gatech!prism!gt4255a
Internet: [EMAIL PROTECTED]

Reply via email to