Lines Matching refs:work
29 static bool irq_work_claim(struct irq_work *work) in irq_work_claim() argument
37 flags = work->flags & ~IRQ_WORK_PENDING; in irq_work_claim()
40 oflags = cmpxchg(&work->flags, flags, nflags); in irq_work_claim()
65 bool irq_work_queue_on(struct irq_work *work, int cpu) in irq_work_queue_on() argument
76 if (!irq_work_claim(work)) in irq_work_queue_on()
79 if (llist_add(&work->llnode, &per_cpu(raised_list, cpu))) in irq_work_queue_on()
83 irq_work_queue(work); in irq_work_queue_on()
90 bool irq_work_queue(struct irq_work *work) in irq_work_queue() argument
93 if (!irq_work_claim(work)) in irq_work_queue()
100 if (work->flags & IRQ_WORK_LAZY) { in irq_work_queue()
101 if (llist_add(&work->llnode, this_cpu_ptr(&lazy_list)) && in irq_work_queue()
105 if (llist_add(&work->llnode, this_cpu_ptr(&raised_list))) in irq_work_queue()
134 struct irq_work *work, *tmp; in irq_work_run_list() local
144 llist_for_each_entry_safe(work, tmp, llnode, llnode) { in irq_work_run_list()
152 flags = work->flags & ~IRQ_WORK_PENDING; in irq_work_run_list()
153 xchg(&work->flags, flags); in irq_work_run_list()
155 work->func(work); in irq_work_run_list()
160 (void)cmpxchg(&work->flags, flags, flags & ~IRQ_WORK_BUSY); in irq_work_run_list()
188 void irq_work_sync(struct irq_work *work) in irq_work_sync() argument
192 while (work->flags & IRQ_WORK_BUSY) in irq_work_sync()