On Thu, Apr 09, 2015 at 05:41:44PM -0400, Waiman Long wrote:
Well the function is 'generic' and belong here I think. Its just theThat is why I originally put my version of the qspinlock_paravirt.h header+__visible void __pv_queue_spin_unlock(struct qspinlock *lock)Ah yes, clever that.
+{
+ struct __qspinlock *l = (void *)lock;
+ struct pv_node *node;
+
+ if (likely(cmpxchg(&l->locked, _Q_LOCKED_VAL, 0) == _Q_LOCKED_VAL))
+ return;
+
+ /*
+ * The queue head has been halted. Need to locate it and wake it up.
+ */
+ node = pv_hash_find(lock);
+ smp_store_release(&l->locked, 0);
+ /*However I feel the PV_CALLEE_SAVE_REGS_THUNK thing belongs in the x86
+ * At this point the memory pointed at by lock can be freed/reused,
+ * however we can still use the PV node to kick the CPU.
+ */
+ if (READ_ONCE(node->state) == vcpu_halted)
+ pv_kick(node->cpu);
+}
+PV_CALLEE_SAVE_REGS_THUNK(__pv_queue_spin_unlock);
code.
file under arch/x86/include/asm. Maybe we should move it back there. Putting
the thunk in arch/x86/kernel/kvm.c didn't work when you consider that the
Xen code also need that.
PV_CALLEE_SAVE_REGS_THUNK thing that arch specific. Should have live in
arch/x86/kernel/paravirt-spinlocks.c instead?