mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 00:28:52 +02:00 
			
		
		
		
	tasklets API update for v5.9-rc1
- Prepare for tasklet API modernization (Romain Perier, Allen Pais, Kees Cook)
 -----BEGIN PGP SIGNATURE-----
 
 iQJKBAABCgA0FiEEpcP2jyKd1g9yPm4TiXL039xtwCYFAl8oXpMWHGtlZXNjb29r
 QGNocm9taXVtLm9yZwAKCRCJcvTf3G3AJtJgEACVb88nzYwu5mC5ZcfvwSyXeQsR
 eDpCkX5HT6CsxlOn0/YJvxUtkkerQftbRuAXrzoUpQkpyBh82PviVZFKDS7NE9Lc
 6xPqloi2gbZ8EfgMraVynL+9lpLh0+qNCM7LPg4xT+JxMDLut/nWRdrp8d7uBYfQ
 AXV6CV4Tc4ijOMROV6AEVVdSTzkRCbiqUnRDBLETBfiJOdDn5MgJgxicWvN5FTpu
 PiUVF3CtWaKCRfQO/GEAXTG65hOtmql5IbX9n7uooNu/wCCnEFfVUus1uTcsrqxN
 ByrZ56NVPoO7z2jYLt8Lft3myo2e/mn88PKqrzS2p9GPn0VBv7rcO3ePmbbHL/RA
 mp+pg8wdpmKrHv4YGfsF+obT1v8f6VJoTLUt5S/WqZAzl1sVJgEJdAkjmDKythGG
 yYKKCemMceMMzLXxnFAYMzdXzdXZ3YEpiW4UkBb77EhUisDrLxCHSL5t4UzyWnuO
 Gtzw7N69iHPHLsxAk1hESAD8sdlk2EdN6vzJVelOsiW955x1hpR+msvNpwZwBqdq
 A2h8VnnrxLK2APl93T5VW9T6kvhzaTwLhoCH+oKklE+U0XJTAYZ4D/AcRVghBvMg
 bC1+1vDx+t/S+8P308evPQnEygLtL2I+zpPnBA1DZzHRAoY8inCLc5HQOfr6pi/f
 koNTtKkmSSKaFSYITw==
 =hb+e
 -----END PGP SIGNATURE-----
Merge tag 'tasklets-v5.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull tasklets API update from Kees Cook:
 "These are the infrastructure updates needed to support converting the
  tasklet API to something more modern (and hopefully for removal
  further down the road).
  There is a 300-patch series waiting in the wings to get set out to
  subsystem maintainers, but these changes need to be present in the
  kernel first. Since this has some treewide changes, I carried this
  series for -next instead of paining Thomas with it in -tip, but it's
  got his Ack.
  This is similar to the timer_struct modernization from a while back,
  but not nearly as messy (I hope). :)
   - Prepare for tasklet API modernization (Romain Perier, Allen Pais,
     Kees Cook)"
* tag 'tasklets-v5.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  tasklet: Introduce new initialization API
  treewide: Replace DECLARE_TASKLET() with DECLARE_TASKLET_OLD()
  usb: gadget: udc: Avoid tasklet passing a global
			
			
This commit is contained in:
		
						commit
						427714f258
					
				
					 17 changed files with 70 additions and 25 deletions
				
			
		|  | @ -46,7 +46,7 @@ struct omap_kp { | |||
| 	unsigned short keymap[]; | ||||
| }; | ||||
| 
 | ||||
| static DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0); | ||||
| static DECLARE_TASKLET_DISABLED_OLD(kp_tasklet, omap_kp_tasklet); | ||||
| 
 | ||||
| static unsigned int *row_gpios; | ||||
| static unsigned int *col_gpios; | ||||
|  |  | |||
|  | @ -77,7 +77,7 @@ static struct timer_list	hil_mlcs_kicker; | |||
| static int			hil_mlcs_probe; | ||||
| 
 | ||||
| static void hil_mlcs_process(unsigned long unused); | ||||
| static DECLARE_TASKLET_DISABLED(hil_mlcs_tasklet, hil_mlcs_process, 0); | ||||
| static DECLARE_TASKLET_DISABLED_OLD(hil_mlcs_tasklet, hil_mlcs_process); | ||||
| 
 | ||||
| 
 | ||||
| /* #define HIL_MLC_DEBUG */ | ||||
|  |  | |||
|  | @ -569,8 +569,8 @@ static void do_bottom_half_rx(struct fst_card_info *card); | |||
| static void fst_process_tx_work_q(unsigned long work_q); | ||||
| static void fst_process_int_work_q(unsigned long work_q); | ||||
| 
 | ||||
| static DECLARE_TASKLET(fst_tx_task, fst_process_tx_work_q, 0); | ||||
| static DECLARE_TASKLET(fst_int_task, fst_process_int_work_q, 0); | ||||
| static DECLARE_TASKLET_OLD(fst_tx_task, fst_process_tx_work_q); | ||||
| static DECLARE_TASKLET_OLD(fst_int_task, fst_process_int_work_q); | ||||
| 
 | ||||
| static struct fst_card_info *fst_card_array[FST_MAX_CARDS]; | ||||
| static spinlock_t fst_work_q_lock; | ||||
|  |  | |||
|  | @ -92,7 +92,7 @@ static DECLARE_WORK(ap_scan_work, ap_scan_bus); | |||
|  * Tasklet & timer for AP request polling and interrupts | ||||
|  */ | ||||
| static void ap_tasklet_fn(unsigned long); | ||||
| static DECLARE_TASKLET(ap_tasklet, ap_tasklet_fn, 0); | ||||
| static DECLARE_TASKLET_OLD(ap_tasklet, ap_tasklet_fn); | ||||
| static DECLARE_WAIT_QUEUE_HEAD(ap_poll_wait); | ||||
| static struct task_struct *ap_poll_kthread; | ||||
| static DEFINE_MUTEX(ap_poll_thread_mutex); | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ MODULE_PARM_DESC(fcnt, "Num of frames per sub-buffer for sync channels as a powe | |||
| static DEFINE_SPINLOCK(dim_lock); | ||||
| 
 | ||||
| static void dim2_tasklet_fn(unsigned long data); | ||||
| static DECLARE_TASKLET(dim2_tasklet, dim2_tasklet_fn, 0); | ||||
| static DECLARE_TASKLET_OLD(dim2_tasklet, dim2_tasklet_fn); | ||||
| 
 | ||||
| /**
 | ||||
|  * struct hdm_channel - private structure to keep channel specific data | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ | |||
| #endif | ||||
| 
 | ||||
| static void cvm_oct_tx_do_cleanup(unsigned long arg); | ||||
| static DECLARE_TASKLET(cvm_oct_tx_cleanup_tasklet, cvm_oct_tx_do_cleanup, 0); | ||||
| static DECLARE_TASKLET_OLD(cvm_oct_tx_cleanup_tasklet, cvm_oct_tx_do_cleanup); | ||||
| 
 | ||||
| /* Maximum number of SKBs to try to free per xmit packet. */ | ||||
| #define MAX_SKB_TO_FREE (MAX_OUT_QUEUE_DEPTH * 2) | ||||
|  |  | |||
|  | @ -1236,7 +1236,7 @@ static void kbd_bh(unsigned long dummy) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0); | ||||
| DECLARE_TASKLET_DISABLED_OLD(keyboard_tasklet, kbd_bh); | ||||
| 
 | ||||
| #if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\ | ||||
|     defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\ | ||||
|  |  | |||
|  | @ -96,9 +96,7 @@ static int stop_pollstall_timer; | |||
| static DECLARE_COMPLETION(on_pollstall_exit); | ||||
| 
 | ||||
| /* tasklet for usb disconnect */ | ||||
| static DECLARE_TASKLET(disconnect_tasklet, udc_tasklet_disconnect, | ||||
| 		(unsigned long) &udc); | ||||
| 
 | ||||
| static DECLARE_TASKLET_OLD(disconnect_tasklet, udc_tasklet_disconnect); | ||||
| 
 | ||||
| /* endpoint names used for print */ | ||||
| static const char ep0_string[] = "ep0in"; | ||||
|  | @ -1661,7 +1659,7 @@ static void usb_disconnect(struct udc *dev) | |||
| /* Tasklet for disconnect to be outside of interrupt context */ | ||||
| static void udc_tasklet_disconnect(unsigned long par) | ||||
| { | ||||
| 	struct udc *dev = (struct udc *)(*((struct udc **) par)); | ||||
| 	struct udc *dev = udc; | ||||
| 	u32 tmp; | ||||
| 
 | ||||
| 	DBG(dev, "Tasklet disconnect\n"); | ||||
|  |  | |||
|  | @ -677,7 +677,7 @@ static void process_done_list(unsigned long data) | |||
| 	enable_irq(fhci_to_hcd(fhci)->irq); | ||||
| } | ||||
| 
 | ||||
| DECLARE_TASKLET(fhci_tasklet, process_done_list, 0); | ||||
| DECLARE_TASKLET_OLD(fhci_tasklet, process_done_list); | ||||
| 
 | ||||
| /* transfer complted callback */ | ||||
| u32 fhci_transfer_confirm_callback(struct fhci_hcd *fhci) | ||||
|  |  | |||
|  | @ -585,6 +585,9 @@ static inline struct task_struct *this_cpu_ksoftirqd(void) | |||
| 
 | ||||
| /* Tasklets --- multithreaded analogue of BHs.
 | ||||
| 
 | ||||
|    This API is deprecated. Please consider using threaded IRQs instead: | ||||
|    https://lore.kernel.org/lkml/20200716081538.2sivhkj4hcyrusem@linutronix.de
 | ||||
| 
 | ||||
|    Main feature differing them of generic softirqs: tasklet | ||||
|    is running only on one CPU simultaneously. | ||||
| 
 | ||||
|  | @ -608,16 +611,42 @@ struct tasklet_struct | |||
| 	struct tasklet_struct *next; | ||||
| 	unsigned long state; | ||||
| 	atomic_t count; | ||||
| 	void (*func)(unsigned long); | ||||
| 	bool use_callback; | ||||
| 	union { | ||||
| 		void (*func)(unsigned long data); | ||||
| 		void (*callback)(struct tasklet_struct *t); | ||||
| 	}; | ||||
| 	unsigned long data; | ||||
| }; | ||||
| 
 | ||||
| #define DECLARE_TASKLET(name, func, data) \ | ||||
| struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data } | ||||
| #define DECLARE_TASKLET(name, _callback)		\ | ||||
| struct tasklet_struct name = {				\ | ||||
| 	.count = ATOMIC_INIT(0),			\ | ||||
| 	.callback = _callback,				\ | ||||
| 	.use_callback = true,				\ | ||||
| } | ||||
| 
 | ||||
| #define DECLARE_TASKLET_DISABLED(name, func, data) \ | ||||
| struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data } | ||||
| #define DECLARE_TASKLET_DISABLED(name, _callback)	\ | ||||
| struct tasklet_struct name = {				\ | ||||
| 	.count = ATOMIC_INIT(1),			\ | ||||
| 	.callback = _callback,				\ | ||||
| 	.use_callback = true,				\ | ||||
| } | ||||
| 
 | ||||
| #define from_tasklet(var, callback_tasklet, tasklet_fieldname)	\ | ||||
| 	container_of(callback_tasklet, typeof(*var), tasklet_fieldname) | ||||
| 
 | ||||
| #define DECLARE_TASKLET_OLD(name, _func)		\ | ||||
| struct tasklet_struct name = {				\ | ||||
| 	.count = ATOMIC_INIT(0),			\ | ||||
| 	.func = _func,					\ | ||||
| } | ||||
| 
 | ||||
| #define DECLARE_TASKLET_DISABLED_OLD(name, _func)	\ | ||||
| struct tasklet_struct name = {				\ | ||||
| 	.count = ATOMIC_INIT(1),			\ | ||||
| 	.func = _func,					\ | ||||
| } | ||||
| 
 | ||||
| enum | ||||
| { | ||||
|  | @ -686,6 +715,8 @@ extern void tasklet_kill(struct tasklet_struct *t); | |||
| extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu); | ||||
| extern void tasklet_init(struct tasklet_struct *t, | ||||
| 			 void (*func)(unsigned long), unsigned long data); | ||||
| extern void tasklet_setup(struct tasklet_struct *t, | ||||
| 			  void (*callback)(struct tasklet_struct *)); | ||||
| 
 | ||||
| /*
 | ||||
|  * Autoprobing for irqs: | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ static void backtrace_test_irq_callback(unsigned long data) | |||
| 	complete(&backtrace_work); | ||||
| } | ||||
| 
 | ||||
| static DECLARE_TASKLET(backtrace_tasklet, &backtrace_test_irq_callback, 0); | ||||
| static DECLARE_TASKLET_OLD(backtrace_tasklet, &backtrace_test_irq_callback); | ||||
| 
 | ||||
| static void backtrace_test_irq(void) | ||||
| { | ||||
|  |  | |||
|  | @ -1068,7 +1068,7 @@ static void kgdb_tasklet_bpt(unsigned long ing) | |||
| 	atomic_set(&kgdb_break_tasklet_var, 0); | ||||
| } | ||||
| 
 | ||||
| static DECLARE_TASKLET(kgdb_tasklet_breakpoint, kgdb_tasklet_bpt, 0); | ||||
| static DECLARE_TASKLET_OLD(kgdb_tasklet_breakpoint, kgdb_tasklet_bpt); | ||||
| 
 | ||||
| void kgdb_schedule_breakpoint(void) | ||||
| { | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ static void resend_irqs(unsigned long arg) | |||
| } | ||||
| 
 | ||||
| /* Tasklet to handle resend: */ | ||||
| static DECLARE_TASKLET(resend_tasklet, resend_irqs, 0); | ||||
| static DECLARE_TASKLET_OLD(resend_tasklet, resend_irqs); | ||||
| 
 | ||||
| static int irq_sw_resend(struct irq_desc *desc) | ||||
| { | ||||
|  |  | |||
|  | @ -553,7 +553,10 @@ static void tasklet_action_common(struct softirq_action *a, | |||
| 				if (!test_and_clear_bit(TASKLET_STATE_SCHED, | ||||
| 							&t->state)) | ||||
| 					BUG(); | ||||
| 				t->func(t->data); | ||||
| 				if (t->use_callback) | ||||
| 					t->callback(t); | ||||
| 				else | ||||
| 					t->func(t->data); | ||||
| 				tasklet_unlock(t); | ||||
| 				continue; | ||||
| 			} | ||||
|  | @ -579,6 +582,18 @@ static __latent_entropy void tasklet_hi_action(struct softirq_action *a) | |||
| 	tasklet_action_common(a, this_cpu_ptr(&tasklet_hi_vec), HI_SOFTIRQ); | ||||
| } | ||||
| 
 | ||||
| void tasklet_setup(struct tasklet_struct *t, | ||||
| 		   void (*callback)(struct tasklet_struct *)) | ||||
| { | ||||
| 	t->next = NULL; | ||||
| 	t->state = 0; | ||||
| 	atomic_set(&t->count, 0); | ||||
| 	t->callback = callback; | ||||
| 	t->use_callback = true; | ||||
| 	t->data = 0; | ||||
| } | ||||
| EXPORT_SYMBOL(tasklet_setup); | ||||
| 
 | ||||
| void tasklet_init(struct tasklet_struct *t, | ||||
| 		  void (*func)(unsigned long), unsigned long data) | ||||
| { | ||||
|  | @ -586,6 +601,7 @@ void tasklet_init(struct tasklet_struct *t, | |||
| 	t->state = 0; | ||||
| 	atomic_set(&t->count, 0); | ||||
| 	t->func = func; | ||||
| 	t->use_callback = false; | ||||
| 	t->data = data; | ||||
| } | ||||
| EXPORT_SYMBOL(tasklet_init); | ||||
|  |  | |||
|  | @ -393,7 +393,7 @@ static int pppoatm_assign_vcc(struct atm_vcc *atmvcc, void __user *arg) | |||
| 	 * Each PPPoATM instance has its own tasklet - this is just a | ||||
| 	 * prototypical one used to initialize them | ||||
| 	 */ | ||||
| 	static const DECLARE_TASKLET(tasklet_proto, pppoatm_wakeup_sender, 0); | ||||
| 	static const DECLARE_TASKLET_OLD(tasklet_proto, pppoatm_wakeup_sender); | ||||
| 	if (copy_from_user(&be, arg, sizeof be)) | ||||
| 		return -EFAULT; | ||||
| 	if (be.encaps != PPPOATM_ENCAPS_AUTODETECT && | ||||
|  |  | |||
|  | @ -105,7 +105,7 @@ static LIST_HEAD(iucv_task_queue); | |||
|  * The tasklet for fast delivery of iucv interrupts. | ||||
|  */ | ||||
| static void iucv_tasklet_fn(unsigned long); | ||||
| static DECLARE_TASKLET(iucv_tasklet, iucv_tasklet_fn,0); | ||||
| static DECLARE_TASKLET_OLD(iucv_tasklet, iucv_tasklet_fn); | ||||
| 
 | ||||
| /*
 | ||||
|  * Queue of interrupt buffers for delivery via a work queue | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ static void pcsp_call_pcm_elapsed(unsigned long priv) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| static DECLARE_TASKLET(pcsp_pcm_tasklet, pcsp_call_pcm_elapsed, 0); | ||||
| static DECLARE_TASKLET_OLD(pcsp_pcm_tasklet, pcsp_call_pcm_elapsed); | ||||
| 
 | ||||
| /* write the port and returns the next expire time in ns;
 | ||||
|  * called at the trigger-start and in hrtimer callback | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Linus Torvalds
						Linus Torvalds