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