| 
     
  diff
  -rupN a/xen/common/domctl.c b/xen/common/domctl.c 
  ---
  a/xen/common/domctl.c        2010-04-07
  12:12:06.000000000 -0400 
  +++
  b/xen/common/domctl.c     2010-04-14 10:57:11.262796000
  -0400 
  @@
  -592,22 +592,35 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc 
    
      
  case XEN_DOMCTL_scheduler_op: 
      
  { 
  -       
  struct domain *d; 
  - 
  -       
  ret = -ESRCH; 
  -       
  if ( (d = rcu_lock_domain_by_id(op->domain)) == NULL ) 
  -           
  break; 
  +       
  if ( (op->u.scheduler_op.cmd == XEN_DOMCTL_SCHEDOP_put_global_info) 
  +         
  || (op->u.scheduler_op.cmd == XEN_DOMCTL_SCHEDOP_get_global_info) ) 
  +       
  { 
  +           
  ret = sched_adjust_global(&op->u.scheduler_op); 
  +           
  if (op->u.scheduler_op.cmd == XEN_DOMCTL_SCHEDOP_get_global_info) 
  +           
  { 
  +               
  if ( copy_to_guest(u_domctl, op, 1) ) 
  +                   
  ret = -EFAULT; 
  +           
  } 
  +       
  } 
  +       
  else 
  +       
  { 
  +           
  struct domain *d; 
    
  -       
  ret = xsm_scheduler(d); 
  -       
  if ( ret ) 
  -           
  goto scheduler_op_out; 
  +           
  ret = -ESRCH; 
  +           
  if ( (d = rcu_lock_domain_by_id(op->domain)) == NULL ) 
  +               
  break; 
    
  -       
  ret = sched_adjust(d, &op->u.scheduler_op); 
  -       
  if ( copy_to_guest(u_domctl, op, 1) ) 
  -           
  ret = -EFAULT; 
  +           
  ret = xsm_scheduler(d); 
  +           
  if ( ret ) 
  +               
  goto scheduler_op_out; 
  + 
  +           
  ret = sched_adjust(d, &op->u.scheduler_op); 
  +           
  if ( copy_to_guest(u_domctl, op, 1) ) 
  +               
  ret = -EFAULT; 
    
  -   
  scheduler_op_out: 
  -       
  rcu_unlock_domain(d); 
  +       
  scheduler_op_out: 
  +           
  rcu_unlock_domain(d); 
  +       
  } 
      
  } 
      
  break; 
    
  diff
  -rupN a/xen/common/sched_credit.c b/xen/common/sched_credit.c 
  ---
  a/xen/common/sched_credit.c           2010-04-07
  12:12:06.000000000 -0400 
  +++
  b/xen/common/sched_credit.c        2010-04-13
  17:30:40.710992000 -0400 
  @@
  -1404,6 +1404,7 @@ const struct scheduler sched_credit_def  
      
  .wake           =
  csched_vcpu_wake, 
    
      
  .adjust         = csched_dom_cntl, 
  +   
  .adjust_global  = NULL, 
    
      
  .pick_cpu       = csched_cpu_pick, 
      
  .do_schedule    = csched_schedule, 
  diff
  -rupN a/xen/common/sched_sedf.c b/xen/common/sched_sedf.c 
  ---
  a/xen/common/sched_sedf.c 2010-04-07 12:12:06.000000000 -0400 
  +++
  b/xen/common/sched_sedf.c          2010-04-13
  17:30:40.710992000 -0400 
  @@
  -1473,6 +1473,7 @@ const struct scheduler sched_sedf_def =  
      
  .sleep          = sedf_sleep, 
      
  .wake           =
  sedf_wake, 
      
  .adjust         = sedf_adjust, 
  +   
  .adjust_global  = NULL, 
   }; 
    
   /* 
  diff
  -rupN a/xen/common/schedule.c b/xen/common/schedule.c 
  ---
  a/xen/common/schedule.c     2010-04-07 12:12:06.000000000
  -0400 
  +++
  b/xen/common/schedule.c  2010-04-14 10:57:11.262796000 -0400 
  @@
  -804,6 +804,21 @@ long sched_adjust(struct domain *d, stru 
      
  return ret; 
   } 
    
  +/*
  Adjust scheduling parameters globally */ 
  +long
  sched_adjust_global(struct xen_domctl_scheduler_op *op) 
  +{ 
  +   
  long ret; 
  + 
  +   
  if ( (op->sched_id != ops.sched_id) 
  +     
  || ( (op->cmd != XEN_DOMCTL_SCHEDOP_put_global_info) 
  +       
  && (op->cmd != XEN_DOMCTL_SCHEDOP_get_global_info) ) ) 
  +       
  return -EINVAL; 
  + 
  +   
  ret = SCHED_OP(adjust_global, op); 
  + 
  +   
  return ret; 
  +} 
  + 
   static
  void vcpu_periodic_timer_work(struct vcpu *v) 
   { 
      
  s_time_t now = NOW(); 
  diff
  -rupN a/xen/include/public/domctl.h b/xen/include/public/domctl.h 
  ---
  a/xen/include/public/domctl.h 2010-04-07 12:12:06.000000000 -0400 
  +++
  b/xen/include/public/domctl.h         2010-04-14
  10:57:11.262796000 -0400 
  @@
  -306,6 +306,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_v 
   /*
  Set or get info? */ 
   #define
  XEN_DOMCTL_SCHEDOP_putinfo 0 
   #define
  XEN_DOMCTL_SCHEDOP_getinfo 1 
  +#define
  XEN_DOMCTL_SCHEDOP_put_global_info 2 
  +#define
  XEN_DOMCTL_SCHEDOP_get_global_info 3 
   struct
  xen_domctl_scheduler_op { 
      
  uint32_t sched_id;  /* XEN_SCHEDULER_* */ 
      
  uint32_t cmd;       /* XEN_DOMCTL_SCHEDOP_* */ 
  diff
  -rupN a/xen/include/xen/sched.h b/xen/include/xen/sched.h 
  ---
  a/xen/include/xen/sched.h      2010-04-07
  12:12:06.000000000 -0400 
  +++
  b/xen/include/xen/sched.h  2010-04-13 17:30:40.710992000 -0400 
  @@
  -472,6 +472,7 @@ void sched_destroy_vcpu(struct vcpu *v); 
   int 
  sched_init_domain(struct domain *d); 
   void
  sched_destroy_domain(struct domain *d); 
   long
  sched_adjust(struct domain *, struct xen_domctl_scheduler_op *); 
  +long
  sched_adjust_global(struct xen_domctl_scheduler_op *); 
   int 
  sched_id(void); 
   void
  sched_tick_suspend(void); 
   void
  sched_tick_resume(void); 
  diff
  -rupN a/xen/include/xen/sched-if.h b/xen/include/xen/sched-if.h 
  ---
  a/xen/include/xen/sched-if.h   2010-04-07 12:12:06.000000000 -0400 
  +++
  b/xen/include/xen/sched-if.h           2010-04-13
  17:30:40.710992000 -0400 
  @@
  -76,6 +76,7 @@ struct scheduler { 
      
  int         
  (*pick_cpu)       (struct vcpu *); 
      
  int         
  (*adjust)         (struct domain *, 
                                      
  struct xen_domctl_scheduler_op *); 
  +   
  int         
  (*adjust_global)  (struct xen_domctl_scheduler_op *); 
      
  void         (*dump_settings) 
  (void); 
      
  void         (*dump_cpu_state) (int); 
   |