parlib: Add cpu_relax_any()
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 14 Apr 2017 15:40:44 +0000 (11:40 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 3 May 2017 16:13:02 +0000 (12:13 -0400)
A lot of uses of cpu_relax_vc() don't know the other vcore we are waiting
on.  Use this helper in those situations.

As a reminder, you can use the regular cpu_relax() if:
- you're waiting on something other than another vcore, such as the
kernel or a udelay loop
- you have notifs enabled.
- you have a call to ensure_vcore_runs() in the loop with cpu_relax()

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/ceq.c
user/parlib/include/parlib/parlib.h
user/parlib/include/parlib/vcore.h
user/parlib/ucq.c

index ae5aedf..610ac76 100644 (file)
@@ -83,7 +83,7 @@ static int32_t get_ring_idx(struct ceq *ceq)
         *
         * We're waiting on other vcores, but we don't know which one(s). */
        while (atomic_read(&ceq->cons_pub_idx) != pvt_idx)
-               cpu_relax_vc(vcore_id());       /* wait on all of them */
+               cpu_relax_any();
        /* This is the only time we update cons_pub.  We also know no one else is
         * updating it at this moment; the while loop acts as a lock, such that
         * no one gets to this point until pub == their pvt_idx, all of which are
index 7649b97..32e7402 100644 (file)
@@ -97,7 +97,7 @@ static inline void parlib_run_once(parlib_once_t *once_ctl,
                } else {
                        /* someone else won, wait til they are done to break out */
                        while (!once_ctl->ran_once)
-                               cpu_relax_vc(vcore_id());
+                               cpu_relax_any();
                }
        }
 }
index 8cbf213..9998692 100644 (file)
@@ -52,6 +52,7 @@ static inline void *get_vcpd_tls_desc(uint32_t vcoreid);
 static inline void set_vcpd_tls_desc(uint32_t vcoreid, void *tls_desc);
 static inline uint64_t vcore_account_resume_nsec(uint32_t vcoreid);
 static inline uint64_t vcore_account_total_nsec(uint32_t vcoreid);
+static inline void cpu_relax_any(void);
 void vcore_lib_init(void);
 bool __in_fake_parlib(void);
 void vcore_change_to_m(void);
@@ -204,6 +205,11 @@ static inline uint64_t vcore_account_uptime_nsec(uint32_t vcoreid)
        return tsc2nsec(vcore_account_uptime_ticks(vcoreid));
 }
 
+static inline void cpu_relax_any(void)
+{
+       return cpu_relax_vc(vcore_id());
+}
+
 #ifndef __PIC__
 
 #define begin_safe_access_tls_vars()
index 8d0551f..46834b7 100644 (file)
@@ -116,7 +116,7 @@ loop_top:
                        /* spinning on userspace here, specifically, another vcore and we
                         * don't know who it is.  This will spin a bit, then make sure they
                         * aren't preeempted */
-                       cpu_relax_vc(vcore_id());       /* pass in self to check everyone else*/
+                       cpu_relax_any();
                }
                /* Now the page is done.  0 its metadata and give it up. */
                old_page->header.cons_next_pg = 0;