[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 48/49] xen/sched: make vcpu_wake() core scheduling aware
With core scheduling active a vcpu being woken up via vcpu_wake() might be on a physical cpu in guest idle already. In this case it just needs to be set to "running" and pinged via cpu_raise_softirq(). Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- xen/common/schedule.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 7b30a153df..ba03b588c8 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -705,16 +705,19 @@ void vcpu_wake(struct vcpu *v) { unsigned long flags; spinlock_t *lock; + struct sched_item *item = v->sched_item; TRACE_2D(TRC_SCHED_WAKE, v->domain->domain_id, v->vcpu_id); - lock = item_schedule_lock_irqsave(v->sched_item, &flags); + lock = item_schedule_lock_irqsave(item, &flags); if ( likely(vcpu_runnable(v)) ) { if ( v->runstate.state >= RUNSTATE_blocked ) vcpu_runstate_change(v, RUNSTATE_runnable, NOW()); - SCHED_OP(vcpu_scheduler(v), wake, v->sched_item); + SCHED_OP(vcpu_scheduler(v), wake, item); + if ( item->is_running && v->runstate.state != RUNSTATE_running ) + cpu_raise_softirq(v->processor, SCHEDULE_SOFTIRQ); } else if ( !(v->pause_flags & VPF_blocked) ) { @@ -722,7 +725,7 @@ void vcpu_wake(struct vcpu *v) vcpu_runstate_change(v, RUNSTATE_offline, NOW()); } - item_schedule_unlock_irqrestore(lock, flags, v->sched_item); + item_schedule_unlock_irqrestore(lock, flags, item); } void vcpu_unblock(struct vcpu *v) -- 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |