lkml.org 
[lkml]   [2011]   [Sep]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 00/13] [PATCH RFC] Paravirtualized ticketlocks
    On 09/02/2011 08:38 AM, Linus Torvalds wrote:
    > 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)

    Yes, nice idea. That ends up making the overall code slightly longer,
    but the fastpath becomes identical to the non-pv case:

    mov $512,%ecx
    lock xadd %cx,(%rdi)
    movzbl %ch,%edx
    cmp %cl,%dl
    je 2f

    ### SLOWPATH START
    and $-2,%edx
    mov $8192,%eax
    movzbl %dl,%esi
    1: cmp %dl,%cl
    je 2f
    pause
    dec %eax
    mov (%rdi),%cl
    jne 1b
    callq __ticket_lock_spinning
    mov $8192,%eax
    jmp 1b
    ### SLOWPATH ENDS

    2:


    It's especially nice that it also moves the spin counter and arg setup
    into the slowpath code.

    And that entire piece of slowpath code can be moved out into its own
    function, so the fastpath becomes:

    mov $512,%eax
    lock xadd %ax,(%rdi)
    movzbl %ah,%esi
    cmp %al,%sil
    je 1f

    movzbl %sil,%esi
    callq __ticket_lock_slow
    1:

    I don't know whether that fastpath code is small enough to consider
    inlining everywhere?

    J


    \
     
     \ /
      Last update: 2011-09-02 22:09    [W:0.023 / U:34.200 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site