Dump the data one time per boot.
[linux-2.6.git] / linux-2.6-630-sched-fix.patch
1 diff -Nurp linux-2.6.22-620/kernel/sched.c linux-2.6.22-630/kernel/sched.c
2 --- linux-2.6.22-620/kernel/sched.c     2008-06-23 17:20:25.000000000 -0400
3 +++ linux-2.6.22-630/kernel/sched.c     2008-06-24 11:28:41.000000000 -0400
4 @@ -3635,6 +3635,11 @@ struct event_spec {
5  };
6  #endif
7  
8 +/* Bypass the vx_unhold infinite loop */
9 +unsigned int merry;
10 +static int debug_630_dumped = 0;
11 +EXPORT_SYMBOL(merry);
12 +
13  asmlinkage void __sched schedule(void)
14  {
15         struct task_struct *prev, *next;
16 @@ -3722,14 +3727,42 @@ need_resched_nonpreemptible:
17  
18         cpu = smp_processor_id();
19         vx_set_rq_time(rq, jiffies);
20 +
21 +       merry=0;
22  try_unhold:
23         vx_try_unhold(rq, cpu);
24  pick_next:
25  
26         if (unlikely(!rq->nr_running)) {
27                 /* can we skip idle time? */
28 -               if (vx_try_skip(rq, cpu))
29 +               if (vx_try_skip(rq, cpu) && merry<10) {
30 +                       merry++;
31                         goto try_unhold;
32 +               }
33 +               else if (merry==10 && !debug_630_dumped) {
34 +                       debug_630_dumped = 1;
35 +                       printk(KERN_EMERG "merry==10!\n");
36 +                       if (list_empty(&rq->hold_queue))
37 +                               printk(KERN_EMERG "hold queue is empty\n");
38 +                       else {
39 +                               struct list_head *l, *n;
40 +                               printk(KERN_EMERG "rq->norm_time = %lu, rq->idle_time = %lu, rq->idle_skip = %d\n",
41 +                                       rq->norm_time, rq->idle_time, rq->idle_skip);
42 +                               list_for_each_safe(l, n, &rq->hold_queue) {
43 +                                       struct task_struct *p;
44 +                                       struct _vx_sched_pc *sched_pc;
45 +                                       struct vx_info *vxi;
46 +
47 +                                       p = list_entry(l, struct task_struct, run_list);
48 +                                       vxi = p->vx_info;
49 +                                       sched_pc = &vx_per_cpu(vxi, sched_pc, cpu);
50 +
51 +                                       printk(KERN_EMERG "%u: sched_pc->norm_time = %lu, sched_pc->idle_time = %lu\n", vxi->vx_id,
52 +                                               sched_pc->norm_time, sched_pc->idle_time);
53 +                               }
54 +                       }
55 +               }
56 +
57  
58                 idle_balance(cpu, rq);
59                 if (!rq->nr_running) {