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:
Tianyang Chen authored and Jan Beulich committed 2016-06-30 14:01:02 +02:00
1 parent 36c6593488
commit bb4f41b3df
1 file changed
+8 -8
+8 -8
View File
@@ -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);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.