File 5aeaeae4-introduce-vcpu_sleep_nosync_locked.patch of Package xen.openSUSE_Leap_42.3_Update
# Commit da0a5e00de8aa93f2a7482d138dbee9dec2aa5c2
# Date 2018-05-03 11:56:36 +0100
# Author George Dunlap <george.dunlap@citrix.com>
# Committer George Dunlap <george.dunlap@citrix.com>
xen: Introduce vcpu_sleep_nosync_locked()
There are a lot of places which release a lock before calling
vcpu_sleep_nosync(), which then just grabs the lock again. This is
not only a waste of time, but leads to more code duplication (since
you have to copy-and-paste recipes rather than calling a unified
function), which in turn leads to an increased chance of bugs.
Introduce vcpu_sleep_nosync_locked(), which can be called if you
already hold the schedule lock.
Signed-off-by: George Dunlap <george.dunlap@citrix.com>
Reviewed-by: Dario Faggioli <dfaggioli@suse.com>
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -436,14 +436,9 @@ void sched_destroy_domain(struct domain
cpupool_rm_domain(d);
}
-void vcpu_sleep_nosync(struct vcpu *v)
+void vcpu_sleep_nosync_locked(struct vcpu *v)
{
- unsigned long flags;
- spinlock_t *lock;
-
- TRACE_2D(TRC_SCHED_SLEEP, v->domain->domain_id, v->vcpu_id);
-
- lock = vcpu_schedule_lock_irqsave(v, &flags);
+ ASSERT(spin_is_locked(per_cpu(schedule_data,v->processor).schedule_lock));
if ( likely(!vcpu_runnable(v)) )
{
@@ -452,6 +447,18 @@ void vcpu_sleep_nosync(struct vcpu *v)
SCHED_OP(vcpu_scheduler(v), sleep, v);
}
+}
+
+void vcpu_sleep_nosync(struct vcpu *v)
+{
+ unsigned long flags;
+ spinlock_t *lock;
+
+ TRACE_2D(TRC_SCHED_SLEEP, v->domain->domain_id, v->vcpu_id);
+
+ lock = vcpu_schedule_lock_irqsave(v, &flags);
+
+ vcpu_sleep_nosync_locked(v);
vcpu_schedule_unlock_irqrestore(lock, flags, v);
}