rt_alloc_vdata(const struct scheduler *ops, struct vcpu *vc, void *dd)
{
struct rt_vcpu *svc;
- s_time_t now = NOW();
/* Allocate per-VCPU info */
svc = xzalloc(struct rt_vcpu);
if ( !is_idle_vcpu(vc) )
svc->budget = RTDS_DEFAULT_BUDGET;
- ASSERT( now >= svc->cur_deadline );
-
- rt_update_deadline(now, svc);
-
return svc;
}
rt_vcpu_insert(const struct scheduler *ops, struct vcpu *vc)
{
struct rt_vcpu *svc = rt_vcpu(vc);
+ s_time_t now = NOW();
/* not addlocate idle vcpu to dom vcpu list */
if ( is_idle_vcpu(vc) )
return;
+ if ( now >= svc->cur_deadline )
+ rt_update_deadline(now, svc);
+
if ( !__vcpu_on_q(svc) && vcpu_runnable(vc) && !vc->is_running )
__runq_insert(ops, svc);
{
struct rt_vcpu * const svc = rt_vcpu(vc);
struct rt_dom * const sdom = svc->sdom;
+ spinlock_t *lock;
BUG_ON( sdom == NULL );
+ lock = vcpu_schedule_lock_irq(vc);
if ( __vcpu_on_q(svc) )
__q_remove(svc);
+ vcpu_schedule_unlock_irq(lock, vc);
if ( !is_idle_vcpu(vc) )
list_del_init(&svc->sdom_elem);