Debugged version of the click patch, for Minlan
[linux-2.6.git] / linux-2.6-630-sched-fix.patch
index 7ebfc53..9b56c28 100644 (file)
@@ -1,59 +1,45 @@
-diff -Nurp linux-2.6.22-620/kernel/sched.c linux-2.6.22-630/kernel/sched.c
---- linux-2.6.22-620/kernel/sched.c    2008-06-23 17:20:25.000000000 -0400
-+++ linux-2.6.22-630/kernel/sched.c    2008-06-24 11:28:41.000000000 -0400
-@@ -3635,6 +3635,11 @@ struct event_spec {
+diff -NurpP --exclude '*.orig' --exclude '*.rej' linux-2.6.27.10-vs2.3.x-P/fs/proc/proc_misc.c linux-2.6.27.10-vs2.3.x-P630/fs/proc/proc_misc.c
+--- linux-2.6.27.10-vs2.3.x-P/fs/proc/proc_misc.c      2008-10-13 14:54:20.000000000 +0200
++++ linux-2.6.27.10-vs2.3.x-P630/fs/proc/proc_misc.c   2009-01-12 01:18:23.000000000 +0100
+@@ -877,6 +877,34 @@ static struct file_operations proc_kpage
  };
- #endif
-+/* Bypass the vx_unhold infinite loop */
-+unsigned int merry;
-+static int debug_630_dumped = 0;
-+EXPORT_SYMBOL(merry);
-+
- asmlinkage void __sched schedule(void)
- {
-       struct task_struct *prev, *next;
-@@ -3722,14 +3727,42 @@ need_resched_nonpreemptible:
+ #endif /* CONFIG_PROC_PAGE_MONITOR */
  
-       cpu = smp_processor_id();
-       vx_set_rq_time(rq, jiffies);
++extern char debug_630_dumped[4087];
++static int show_debug_630(struct seq_file *p, void *v)
++{
++      seq_printf(p, "%s\n", debug_630_dumped);
++      return 0;
++}
 +
-+      merry=0;
- try_unhold:
-       vx_try_unhold(rq, cpu);
- pick_next:
-       if (unlikely(!rq->nr_running)) {
-               /* can we skip idle time? */
--              if (vx_try_skip(rq, cpu))
-+              if (vx_try_skip(rq, cpu) && merry<10) {
-+                      merry++;
-                       goto try_unhold;
-+              }
-+              else if (merry==10 && !debug_630_dumped) {
-+                      debug_630_dumped = 1;
-+                      printk(KERN_EMERG "merry==10!\n");
-+                      if (list_empty(&rq->hold_queue))
-+                              printk(KERN_EMERG "hold queue is empty\n");
-+                      else {
-+                              struct list_head *l, *n;
-+                              printk(KERN_EMERG "rq->norm_time = %lu, rq->idle_time = %lu, rq->idle_skip = %d\n",
-+                                      rq->norm_time, rq->idle_time, rq->idle_skip);
-+                              list_for_each_safe(l, n, &rq->hold_queue) {
-+                                      struct task_struct *p;
-+                                      struct _vx_sched_pc *sched_pc;
-+                                      struct vx_info *vxi;
++static int debug_630_open(struct inode *inode, struct file *filp)
++{
++      int res;
++      struct seq_file *m;
 +
-+                                      p = list_entry(l, struct task_struct, run_list);
-+                                      vxi = p->vx_info;
-+                                      sched_pc = &vx_per_cpu(vxi, sched_pc, cpu);
++      res = single_open(filp, show_debug_630, NULL);
++      if (!res) {
++              m = filp->private_data;
++              m->buf = kmalloc(4096, GFP_KERNEL);
++              m->size = 4096;
++      }
++      return res;
++}
 +
-+                                      printk(KERN_EMERG "%u: sched_pc->norm_time = %lu, sched_pc->idle_time = %lu\n", vxi->vx_id,
-+                                              sched_pc->norm_time, sched_pc->idle_time);
-+                              }
-+                      }
-+              }
++static const struct file_operations proc_debug_630_operations = {
++      .open = debug_630_open,
++      .read = seq_read,
++      .llseek = seq_lseek,
++      .release = single_release,
++};
 +
+ struct proc_dir_entry *proc_root_kcore;
  
-               idle_balance(cpu, rq);
-               if (!rq->nr_running) {
+ void __init proc_misc_init(void)
+@@ -955,4 +983,6 @@ void __init proc_misc_init(void)
+ #ifdef CONFIG_MAGIC_SYSRQ
+       proc_create("sysrq-trigger", S_IWUSR, NULL, &proc_sysrq_trigger_operations);
+ #endif
++
++      create_seq_entry("debug_630", 0, &proc_debug_630_operations);
+ }