|   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); |