Il 07/07/2014 16:35, Peter Zijlstra ha scritto:> On Wed, Jun 18, 2014 at 01:39:52PM +0200, Paolo Bonzini wrote: >> Il 15/06/2014 14:47, Peter Zijlstra ha scritto: >>> >>> - for (;;) { >>> - new = (val & ~_Q_PENDING_MASK) | _Q_LOCKED_VAL; >>> - >>> - old = atomic_cmpxchg(&lock->val, val, new); >>> - if (old == val) >>> - break; >>> - >>> - val = old; >>> - } >>> + clear_pending_set_locked(lock, val); >>> return; >> >> >> Might as well add clear_pending_set_locked already in patch 3. > > Patch 4, if anywhere. >This code is added in patch 3: + /* + * take ownership and clear the pending bit. + * + * *,1,0 -> *,0,1 + */ + for (;;) { + new = (val & ~_Q_PENDING_MASK) | _Q_LOCKED_VAL; + + old = atomic_cmpxchg(&lock->val, val, new); + if (old == val) + break; + + val = old; + } + return; Unlike the change in patch 4, clear_pending_set_locked doesn't change how qspinlock moves from a state to the next. Paolo
Peter Zijlstra
2014-Jul-07 15:35 UTC
[PATCH 05/11] qspinlock: Optimize for smaller NR_CPUS
On Mon, Jul 07, 2014 at 05:08:17PM +0200, Paolo Bonzini wrote:> Il 07/07/2014 16:35, Peter Zijlstra ha scritto: > >On Wed, Jun 18, 2014 at 01:39:52PM +0200, Paolo Bonzini wrote: > >>Il 15/06/2014 14:47, Peter Zijlstra ha scritto: > >>> > >>>- for (;;) { > >>>- new = (val & ~_Q_PENDING_MASK) | _Q_LOCKED_VAL; > >>>- > >>>- old = atomic_cmpxchg(&lock->val, val, new); > >>>- if (old == val) > >>>- break; > >>>- > >>>- val = old; > >>>- } > >>>+ clear_pending_set_locked(lock, val); > >>> return; > >> > >> > >>Might as well add clear_pending_set_locked already in patch 3. > > > >Patch 4, if anywhere. > > > > This code is added in patch 3: > > + /* > + * take ownership and clear the pending bit. > + * > + * *,1,0 -> *,0,1 > + */ > + for (;;) { > + new = (val & ~_Q_PENDING_MASK) | _Q_LOCKED_VAL; > + > + old = atomic_cmpxchg(&lock->val, val, new); > + if (old == val) > + break; > + > + val = old; > + } > + return; > > Unlike the change in patch 4, clear_pending_set_locked doesn't change how > qspinlock moves from a state to the next.True, but its where we start to break up into smaller functions. And the only reason we break them out is because we'll get different implementations depending on NR_CPUS. So we can view the breakout of xchg_tail and clear_and_set_pending as preparatory work for introducing the NR_CPUS thing. -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 836 bytes Desc: not available URL: <http://lists.linuxfoundation.org/pipermail/virtualization/attachments/20140707/3fc64b14/attachment.sig>
Il 07/07/2014 17:35, Peter Zijlstra ha scritto:>> > Unlike the change in patch 4, clear_pending_set_locked doesn't change how >> > qspinlock moves from a state to the next. > True, but its where we start to break up into smaller functions. And the > only reason we break them out is because we'll get different > implementations depending on NR_CPUS. > > So we can view the breakout of xchg_tail and clear_and_set_pending as > preparatory work for introducing the NR_CPUS thing.That's a different reasoning, but it's fine by me too. Paolo
Apparently Analagous Threads
- [PATCH 05/11] qspinlock: Optimize for smaller NR_CPUS
- [PATCH 05/11] qspinlock: Optimize for smaller NR_CPUS
- [PATCH 05/11] qspinlock: Optimize for smaller NR_CPUS
- [PATCH 05/11] qspinlock: Optimize for smaller NR_CPUS
- [PATCH 05/11] qspinlock: Optimize for smaller NR_CPUS