Glibc syscalls now block properly (XCC)
[akaros.git] / user / parlib / mcs.c
index 8c303ec..c230a35 100644 (file)
@@ -184,16 +184,16 @@ void mcs_pdr_fini(struct mcs_pdr_lock *lock)
 
 /* Helper, will make sure the vcore owning qnode is running.  If we change to
  * that vcore, we'll continue when our vcore gets restarted.  If the change
- * fails, it is because the vcore is running, and we'll continue. */
-void __ensure_qnode_runs(struct mcs_pdr_qnode *qnode)
+ * fails, it is because the vcore is running, and we'll continue.
+ *
+ * It's worth noting that changing to another vcore won't hurt correctness.
+ * Even if they are no longer the lockholder, they will be checking preemption
+ * messages and will help break out of the deadlock.  So long as we don't
+ * wastefully spin, we're okay. */
+static void __ensure_qnode_runs(struct mcs_pdr_qnode *qnode)
 {
-       if (!vcore_is_mapped(qnode->vcoreid)) {
-               /* We want to recover them from preemption.  Since we know they have
-                * notifs disabled, they will need to be directly restarted, so we can
-                * skip the other logic and cut straight to the sys_change_vcore() */
-               sys_change_vcore(qnode->vcoreid, FALSE);
-               cmb();
-       }
+       assert(qnode);
+       ensure_vcore_runs(qnode->vcoreid);
 }
 
 /* Internal version of the locking function, doesn't care about storage of qnode