|
@@ -21,6 +21,11 @@ static inline int encode_cpu(int cpu_nr)
|
|
|
return cpu_nr + 1;
|
|
|
}
|
|
|
|
|
|
+static inline int node_cpu(struct optimistic_spin_node *node)
|
|
|
+{
|
|
|
+ return node->cpu - 1;
|
|
|
+}
|
|
|
+
|
|
|
static inline struct optimistic_spin_node *decode_cpu(int encoded_cpu_val)
|
|
|
{
|
|
|
int cpu_nr = encoded_cpu_val - 1;
|
|
@@ -118,8 +123,10 @@ bool osq_lock(struct optimistic_spin_queue *lock)
|
|
|
while (!READ_ONCE(node->locked)) {
|
|
|
/*
|
|
|
* If we need to reschedule bail... so we can block.
|
|
|
+ * Use vcpu_is_preempted() to avoid waiting for a preempted
|
|
|
+ * lock holder:
|
|
|
*/
|
|
|
- if (need_resched())
|
|
|
+ if (need_resched() || vcpu_is_preempted(node_cpu(node->prev)))
|
|
|
goto unqueue;
|
|
|
|
|
|
cpu_relax();
|