diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/irq_work.c | 18 | 
1 files changed, 9 insertions, 9 deletions
diff --git a/kernel/irq_work.c b/kernel/irq_work.c index 90f881904bb..c58fa7da8ae 100644 --- a/kernel/irq_work.c +++ b/kernel/irq_work.c @@ -77,21 +77,21 @@ void __weak arch_irq_work_raise(void)   */  static void __irq_work_queue(struct irq_work *entry)  { -	struct irq_work **head, *next; +	struct irq_work *next; -	head = &get_cpu_var(irq_work_list); +	preempt_disable();  	do { -		next = *head; +		next = __this_cpu_read(irq_work_list);  		/* Can assign non-atomic because we keep the flags set. */  		entry->next = next_flags(next, IRQ_WORK_FLAGS); -	} while (cmpxchg(head, next, entry) != next); +	} while (this_cpu_cmpxchg(irq_work_list, next, entry) != next);  	/* The list was empty, raise self-interrupt to start processing. */  	if (!irq_work_next(entry))  		arch_irq_work_raise(); -	put_cpu_var(irq_work_list); +	preempt_enable();  }  /* @@ -120,16 +120,16 @@ EXPORT_SYMBOL_GPL(irq_work_queue);   */  void irq_work_run(void)  { -	struct irq_work *list, **head; +	struct irq_work *list; -	head = &__get_cpu_var(irq_work_list); -	if (*head == NULL) +	if (this_cpu_read(irq_work_list) == NULL)  		return;  	BUG_ON(!in_irq());  	BUG_ON(!irqs_disabled()); -	list = xchg(head, NULL); +	list = this_cpu_xchg(irq_work_list, NULL); +  	while (list != NULL) {  		struct irq_work *entry = list;  |