Messages in this thread |  | | | From | Linus Torvalds <> | | Date | Fri, 2 Sep 2011 08:38:22 -0700 | | Subject | Re: [PATCH 00/13] [PATCH RFC] Paravirtualized ticketlocks |
| |
On Thu, Sep 1, 2011 at 5:54 PM, Jeremy Fitzhardinge <jeremy@goop.org> wrote: > > The inner part of ticket lock code becomes: > inc = xadd(&lock->tickets, inc); > inc.tail &= ~TICKET_SLOWPATH_FLAG; > > for (;;) { > unsigned count = SPIN_THRESHOLD; > > do { > if (inc.head == inc.tail) > goto out; > cpu_relax(); > inc.head = ACCESS_ONCE(lock->tickets.head); > } while (--count); > __ticket_lock_spinning(lock, inc.tail); > }
Hmm. It strikes me that I don't think you should touch the TICKET_SLOWPATH_FLAG in the fastpath at all.
Can't you just do this:
inc = xadd(&lock->tickets, inc); if (likely(inc.head == inc.tail)) goto out; ### SLOWPATH ### inc.tail &= ~TICKET_SLOWPATH_FLAG; for (;;) { .. as before .. which might alleviate the problem with the fastpath being polluted by all those silly slowpath things. Hmm?
(This assumes that TICKET_SLOWPATH_FLAG is never set in inc.head, so if it's set that equality check will fail. I didn't actually check if that assumption was correct)
Linus -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |