lkml.org 
[lkml]   [2010]   [Jun]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC][PATCH] irq_work -v2
    On Fri, Jun 25, 2010 at 08:30:25PM +0200, Peter Zijlstra wrote:

    I'm not sure what all the logic for entry enqueued by someone
    else is good for? Is that for the case you don't have enough
    entries preallocated and you share them with someone else?

    Normally if the sharing is per cpu that would be difficult
    to recover from because if it's due to a nest situation (for example)
    you would deadlock.

    For me it would seem simpler to simply not share.

    > + struct irq_work *list;
    > +
    > + BUG_ON(!in_irq());
    > + BUG_ON(!irqs_disabled());
    > +
    > + list = xchg(&__get_cpu_var(irq_work_list), NULL);
    > + while (list != NULL) {
    > + struct irq_work *entry = list;
    > +
    > + list = irq_work_next(list);
    > +
    > + /*
    > + * Clear the PENDING bit, after this point the @entry
    > + * can be re-used.
    > + */
    > + entry->next = next_flags(NULL, IRQ_WORK_BUSY);
    > + entry->func(entry);

    Needs compiler memory barrier here I think.

    > + /*
    > + * Clear the BUSY bit and return to the free state if
    > + * no-one else claimed it meanwhile.
    > + */
    > + cmpxchg(&entry->next, next_flags(NULL, IRQ_WORK_BUSY), NULL);
    > + }
    > +}

    -Andi


    \
     
     \ /
      Last update: 2010-06-25 21:33    [W:0.033 / U:0.792 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site