Fixes bug in cpu_relax_vc()
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 3 Oct 2014 01:09:38 +0000 (18:09 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 8 Oct 2014 05:55:13 +0000 (22:55 -0700)
It would never ensure the other vcores run, since spun would be reset on
every invocation.

Note that since it is a TLS variable, it gets reused each time and never
get reset.  So if a spinner calls cpu_relax_vc() 100 times before
grabbing its lock (or whatever), then the next time that vcore relaxes,
it'll start at 100.  Only 900 to go!

I'm okay with this - it's a little easier to deal with than having the
caller pass in the spin variable.

user/parlib/vcore.c

index 45e9ee5..8932ac7 100644 (file)
@@ -417,12 +417,12 @@ void ensure_vcore_runs(uint32_t vcoreid)
  * context.  sys_change_vcore will probably mess you up. */
 void cpu_relax_vc(uint32_t vcoreid)
 {
-       unsigned int spun = 0;
+       static __thread unsigned int __vc_relax_spun = 0;
        assert(in_vcore_context());
-       if (spun++ >= NR_RELAX_SPINS) {
+       if (__vc_relax_spun++ >= NR_RELAX_SPINS) {
                /* if vcoreid == vcore_id(), this might be expensive */
                ensure_vcore_runs(vcoreid);
-               spun = 0;
+               __vc_relax_spun = 0;
        }
        cpu_relax();
 }