mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
sched_rt: sanity check input and serialization
Sanity check input params in rt_dom_cntl(); Serialize rt_dom_cntl() against the global lock. Reported-by: Jan Beulich <jbeulich@suse.com> Signed-off-by: Meng Xu <mengxu@cis.upenn.edu> Reviewed-by: Dario Faggioli <dario.faggioli@citrix.com> Reviewed-by: George Dunlap <george.dunlap@eu.citrix.com> Release-Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
1 parent
608aae36bb
commit
9f9ccbbacc
1 file changed
+11
@@ -1042,25 +1042,36 @@ rt_dom_cntl(
|
||||
struct domain *d,
|
||||
struct xen_domctl_scheduler_op *op)
|
||||
{
|
||||
struct rt_private *prv = rt_priv(ops);
|
||||
struct rt_dom * const sdom = rt_dom(d);
|
||||
struct rt_vcpu *svc;
|
||||
struct list_head *iter;
|
||||
unsigned long flags;
|
||||
int rc = 0;
|
||||
|
||||
switch ( op->cmd )
|
||||
{
|
||||
case XEN_DOMCTL_SCHEDOP_getinfo:
|
||||
spin_lock_irqsave(&prv->lock, flags);
|
||||
svc = list_entry(sdom->vcpu.next, struct rt_vcpu, sdom_elem);
|
||||
op->u.rtds.period = svc->period / MICROSECS(1); /* transfer to us */
|
||||
op->u.rtds.budget = svc->budget / MICROSECS(1);
|
||||
spin_unlock_irqrestore(&prv->lock, flags);
|
||||
break;
|
||||
case XEN_DOMCTL_SCHEDOP_putinfo:
|
||||
if ( op->u.rtds.period == 0 || op->u.rtds.budget == 0 )
|
||||
{
|
||||
rc = -EINVAL;
|
||||
break;
|
||||
}
|
||||
spin_lock_irqsave(&prv->lock, flags);
|
||||
list_for_each( iter, &sdom->vcpu )
|
||||
{
|
||||
struct rt_vcpu * svc = list_entry(iter, struct rt_vcpu, sdom_elem);
|
||||
svc->period = MICROSECS(op->u.rtds.period); /* transfer to nanosec */
|
||||
svc->budget = MICROSECS(op->u.rtds.budget);
|
||||
}
|
||||
spin_unlock_irqrestore(&prv->lock, flags);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||