mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	softirq: Consolidate common code in __tasklet_[hi]_schedule()
__tasklet_schedule() and __tasklet_hi_schedule() are almost identical. Move the common code from both function into __tasklet_schedule_common() and let both functions invoke it with different arguments. [ bigeasy: Splitted out from RT's "tasklet: Prevent tasklets from going into infinite spin in RT" and added commit message. Use this_cpu_ptr(headp) in __tasklet_schedule_common() as suggested by Julia Cartwright ] Signed-off-by: Ingo Molnar <mingo@kernel.org> Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Cc: Julia Cartwright <juliac@eso.teric.us> Link: https://lkml.kernel.org/r/20180227164808.10093-2-bigeasy@linutronix.de
This commit is contained in:
		
							parent
							
								
									f09777fa89
								
							
						
					
					
						commit
						6498ddad30
					
				
					 1 changed files with 16 additions and 12 deletions
				
			
		|  | @ -460,29 +460,33 @@ struct tasklet_head { | |||
| static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec); | ||||
| static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec); | ||||
| 
 | ||||
| void __tasklet_schedule(struct tasklet_struct *t) | ||||
| static void __tasklet_schedule_common(struct tasklet_struct *t, | ||||
| 				      struct tasklet_head __percpu *headp, | ||||
| 				      unsigned int softirq_nr) | ||||
| { | ||||
| 	struct tasklet_head *head; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	local_irq_save(flags); | ||||
| 	head = this_cpu_ptr(headp); | ||||
| 	t->next = NULL; | ||||
| 	*__this_cpu_read(tasklet_vec.tail) = t; | ||||
| 	__this_cpu_write(tasklet_vec.tail, &(t->next)); | ||||
| 	raise_softirq_irqoff(TASKLET_SOFTIRQ); | ||||
| 	*head->tail = t; | ||||
| 	head->tail = &(t->next); | ||||
| 	raise_softirq_irqoff(softirq_nr); | ||||
| 	local_irq_restore(flags); | ||||
| } | ||||
| 
 | ||||
| void __tasklet_schedule(struct tasklet_struct *t) | ||||
| { | ||||
| 	__tasklet_schedule_common(t, &tasklet_vec, | ||||
| 				  TASKLET_SOFTIRQ); | ||||
| } | ||||
| EXPORT_SYMBOL(__tasklet_schedule); | ||||
| 
 | ||||
| void __tasklet_hi_schedule(struct tasklet_struct *t) | ||||
| { | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	local_irq_save(flags); | ||||
| 	t->next = NULL; | ||||
| 	*__this_cpu_read(tasklet_hi_vec.tail) = t; | ||||
| 	__this_cpu_write(tasklet_hi_vec.tail,  &(t->next)); | ||||
| 	raise_softirq_irqoff(HI_SOFTIRQ); | ||||
| 	local_irq_restore(flags); | ||||
| 	__tasklet_schedule_common(t, &tasklet_hi_vec, | ||||
| 				  HI_SOFTIRQ); | ||||
| } | ||||
| EXPORT_SYMBOL(__tasklet_hi_schedule); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Ingo Molnar
						Ingo Molnar