• Frederic Weisbecker's avatar
    irq_work: Split raised and lazy lists · b93e0b8f
    Frederic Weisbecker authored
    An irq work can be handled from two places: from the tick if the work
    carries the "lazy" flag and the tick is periodic, or from a self IPI.
    
    We merge all these works in a single list and we use some per cpu latch
    to avoid raising a self-IPI when one is already pending.
    
    Now we could do away with this ugly latch if only the list was only made of
    non-lazy works. Just enqueueing a work on the empty list would be enough
    to know if we need to raise an IPI or not.
    
    Also we are going to implement remote irq work queuing. Then the per CPU
    latch will need to become atomic in the global scope. That's too bad
    because, here as well, just enqueueing a work on an empty list of
    non-lazy works would be enough to know if we need to raise an IPI or not.
    
    So lets take a way out of this: split the works in two distinct lists,
    one for the works that can be handled by the next tick and another
    one for those handled by the IPI. Just checking if the latter is empty
    when we queue a new work is enough to know if we need to raise an IPI.
    Suggested-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Acked-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Kevin Hilman <khilman@linaro.org>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
    b93e0b8f
irq_work.c 4.37 KB