mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
sched: rtds: use non-atomic bit-ops
Vcpu flags are checked and cleared atomically. Performance can be improved with corresponding non-atomic versions since schedule.c already has spin_locks in place. Signed-off-by: Tianyang Chen <tiche@cis.upenn.edu> Reviewed-by: Dario Faggioli <dario.faggioli@citrix.com>
This commit is contained in:
1 parent
36c6593488
commit
bb4f41b3df
1 file changed
+8
-8
@@ -947,7 +947,7 @@ burn_budget(const struct scheduler *ops, struct rt_vcpu *svc, s_time_t now)
|
||||
if ( svc->cur_budget <= 0 )
|
||||
{
|
||||
svc->cur_budget = 0;
|
||||
set_bit(__RTDS_depleted, &svc->flags);
|
||||
__set_bit(__RTDS_depleted, &svc->flags);
|
||||
}
|
||||
|
||||
/* TRACE */
|
||||
@@ -1061,7 +1061,7 @@ rt_schedule(const struct scheduler *ops, s_time_t now, bool_t tasklet_work_sched
|
||||
if ( snext != scurr &&
|
||||
!is_idle_vcpu(current) &&
|
||||
vcpu_runnable(current) )
|
||||
set_bit(__RTDS_delayed_runq_add, &scurr->flags);
|
||||
__set_bit(__RTDS_delayed_runq_add, &scurr->flags);
|
||||
|
||||
snext->last_start = now;
|
||||
ret.time = -1; /* if an idle vcpu is picked */
|
||||
@@ -1070,7 +1070,7 @@ rt_schedule(const struct scheduler *ops, s_time_t now, bool_t tasklet_work_sched
|
||||
if ( snext != scurr )
|
||||
{
|
||||
q_remove(snext);
|
||||
set_bit(__RTDS_scheduled, &snext->flags);
|
||||
__set_bit(__RTDS_scheduled, &snext->flags);
|
||||
}
|
||||
if ( snext->vcpu->processor != cpu )
|
||||
{
|
||||
@@ -1104,7 +1104,7 @@ rt_vcpu_sleep(const struct scheduler *ops, struct vcpu *vc)
|
||||
replq_remove(ops, svc);
|
||||
}
|
||||
else if ( svc->flags & RTDS_delayed_runq_add )
|
||||
clear_bit(__RTDS_delayed_runq_add, &svc->flags);
|
||||
__clear_bit(__RTDS_delayed_runq_add, &svc->flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1247,7 +1247,7 @@ rt_vcpu_wake(const struct scheduler *ops, struct vcpu *vc)
|
||||
*/
|
||||
if ( unlikely(svc->flags & RTDS_scheduled) )
|
||||
{
|
||||
set_bit(__RTDS_delayed_runq_add, &svc->flags);
|
||||
__set_bit(__RTDS_delayed_runq_add, &svc->flags);
|
||||
/*
|
||||
* The vcpu is waking up already, and we didn't even had the time to
|
||||
* remove its next replenishment event from the replenishment queue
|
||||
@@ -1278,12 +1278,12 @@ rt_context_saved(const struct scheduler *ops, struct vcpu *vc)
|
||||
struct rt_vcpu *svc = rt_vcpu(vc);
|
||||
spinlock_t *lock = vcpu_schedule_lock_irq(vc);
|
||||
|
||||
clear_bit(__RTDS_scheduled, &svc->flags);
|
||||
__clear_bit(__RTDS_scheduled, &svc->flags);
|
||||
/* not insert idle vcpu to runq */
|
||||
if ( is_idle_vcpu(vc) )
|
||||
goto out;
|
||||
|
||||
if ( test_and_clear_bit(__RTDS_delayed_runq_add, &svc->flags) &&
|
||||
if ( __test_and_clear_bit(__RTDS_delayed_runq_add, &svc->flags) &&
|
||||
likely(vcpu_runnable(vc)) )
|
||||
{
|
||||
runq_insert(ops, svc);
|
||||
@@ -1461,7 +1461,7 @@ static void repl_timer_handler(void *data){
|
||||
runq_tickle(ops, next_on_runq);
|
||||
}
|
||||
else if ( vcpu_on_q(svc) &&
|
||||
test_and_clear_bit(__RTDS_depleted, &svc->flags) )
|
||||
__test_and_clear_bit(__RTDS_depleted, &svc->flags) )
|
||||
runq_tickle(ops, svc);
|
||||
|
||||
list_del(&svc->replq_elem);
|
||||
|
||||