]> xenbits.xensource.com Git - xen.git/commit
sched: avoid races on time values read from NOW()
authorDario Faggioli <dario.faggioli@citrix.com>
Mon, 23 May 2016 12:39:51 +0000 (14:39 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 23 May 2016 12:39:51 +0000 (14:39 +0200)
commit779511f4bf5ae34820a85e4eb20d50c60f69e977
tree54e2809da277837c789da4b92fb48706174574b5
parent082096f91a71a28fec0a397cefe598f56ace6a1f
sched: avoid races on time values read from NOW()

or (even in cases where there is no race, e.g., outside
of Credit2) avoid using a time sample which may be rather
old, and hence stale.

In fact, we should only sample NOW() from _inside_
the critical region within which the value we read is
used. If we don't, in case we have to spin for a while
before entering the region, when actually using it:

 1) we will use something that, at the veryy least, is
    not really "now", because of the spinning,

 2) if someone else sampled NOW() during a critical
    region protected by the lock we are spinning on,
    and if we compare the two samples when we get
    inside our region, our one will be 'earlier',
    even if we actually arrived later, which is a
    race.

In Credit2, we see an instance of 2), in runq_tickle(),
when it is called by csched2_context_saved() as it samples
NOW() before acquiring the runq lock. This makes things
look like the time went backwards, and it confuses the
algorithm (there's even a d2printk() about it, which would
trigger all the time, if enabled).

In RTDS, something similar happens in repl_timer_handler(),
and there's another instance in schedule() (in generic code),
so fix these cases too.

While there, improve csched2_vcpu_wake() and and rt_vcpu_wake()
a little as well (removing a pointless initialization, and
moving the sampling a bit closer to its use). These two hunks
entail no further functional changes.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
Reviewed-by: Meng Xu <mengxu@cis.upenn.edu>
Release-acked-by: Wei Liu <wei.liu2@citrix.com>
xen/common/sched_credit2.c
xen/common/sched_rt.c
xen/common/schedule.c