xref: /linux-6.15/include/linux/smp_types.h (revision e48c15b7)
18c4890d1SPeter Zijlstra /* SPDX-License-Identifier: GPL-2.0 */
28c4890d1SPeter Zijlstra #ifndef __LINUX_SMP_TYPES_H
38c4890d1SPeter Zijlstra #define __LINUX_SMP_TYPES_H
48c4890d1SPeter Zijlstra 
58c4890d1SPeter Zijlstra #include <linux/llist.h>
68c4890d1SPeter Zijlstra 
78c4890d1SPeter Zijlstra enum {
88c4890d1SPeter Zijlstra 	CSD_FLAG_LOCK		= 0x01,
98c4890d1SPeter Zijlstra 
108c4890d1SPeter Zijlstra 	IRQ_WORK_PENDING	= 0x01,
118c4890d1SPeter Zijlstra 	IRQ_WORK_BUSY		= 0x02,
128c4890d1SPeter Zijlstra 	IRQ_WORK_LAZY		= 0x04, /* No IPI, wait for tick */
138c4890d1SPeter Zijlstra 	IRQ_WORK_HARD_IRQ	= 0x08, /* IRQ context on PREEMPT_RT */
148c4890d1SPeter Zijlstra 
158c4890d1SPeter Zijlstra 	IRQ_WORK_CLAIMED	= (IRQ_WORK_PENDING | IRQ_WORK_BUSY),
168c4890d1SPeter Zijlstra 
178c4890d1SPeter Zijlstra 	CSD_TYPE_ASYNC		= 0x00,
188c4890d1SPeter Zijlstra 	CSD_TYPE_SYNC		= 0x10,
198c4890d1SPeter Zijlstra 	CSD_TYPE_IRQ_WORK	= 0x20,
208c4890d1SPeter Zijlstra 	CSD_TYPE_TTWU		= 0x30,
218c4890d1SPeter Zijlstra 
228c4890d1SPeter Zijlstra 	CSD_FLAG_TYPE_MASK	= 0xF0,
238c4890d1SPeter Zijlstra };
248c4890d1SPeter Zijlstra 
258c4890d1SPeter Zijlstra /*
268c4890d1SPeter Zijlstra  * struct __call_single_node is the primary type on
278c4890d1SPeter Zijlstra  * smp.c:call_single_queue.
288c4890d1SPeter Zijlstra  *
298c4890d1SPeter Zijlstra  * flush_smp_call_function_queue() only reads the type from
308c4890d1SPeter Zijlstra  * __call_single_node::u_flags as a regular load, the above
318c4890d1SPeter Zijlstra  * (anonymous) enum defines all the bits of this word.
328c4890d1SPeter Zijlstra  *
338c4890d1SPeter Zijlstra  * Other bits are not modified until the type is known.
348c4890d1SPeter Zijlstra  *
358c4890d1SPeter Zijlstra  * CSD_TYPE_SYNC/ASYNC:
368c4890d1SPeter Zijlstra  *	struct {
378c4890d1SPeter Zijlstra  *		struct llist_node node;
388c4890d1SPeter Zijlstra  *		unsigned int flags;
398c4890d1SPeter Zijlstra  *		smp_call_func_t func;
408c4890d1SPeter Zijlstra  *		void *info;
418c4890d1SPeter Zijlstra  *	};
428c4890d1SPeter Zijlstra  *
438c4890d1SPeter Zijlstra  * CSD_TYPE_IRQ_WORK:
448c4890d1SPeter Zijlstra  *	struct {
458c4890d1SPeter Zijlstra  *		struct llist_node node;
468c4890d1SPeter Zijlstra  *		atomic_t flags;
478c4890d1SPeter Zijlstra  *		void (*func)(struct irq_work *);
488c4890d1SPeter Zijlstra  *	};
498c4890d1SPeter Zijlstra  *
508c4890d1SPeter Zijlstra  * CSD_TYPE_TTWU:
518c4890d1SPeter Zijlstra  *	struct {
528c4890d1SPeter Zijlstra  *		struct llist_node node;
538c4890d1SPeter Zijlstra  *		unsigned int flags;
548c4890d1SPeter Zijlstra  *	};
558c4890d1SPeter Zijlstra  *
568c4890d1SPeter Zijlstra  */
578c4890d1SPeter Zijlstra 
588c4890d1SPeter Zijlstra struct __call_single_node {
598c4890d1SPeter Zijlstra 	struct llist_node	llist;
608c4890d1SPeter Zijlstra 	union {
618c4890d1SPeter Zijlstra 		unsigned int	u_flags;
628c4890d1SPeter Zijlstra 		atomic_t	a_flags;
638c4890d1SPeter Zijlstra 	};
64*e48c15b7SPaul E. McKenney #ifdef CONFIG_64BIT
65*e48c15b7SPaul E. McKenney 	u16 src, dst;
66*e48c15b7SPaul E. McKenney #endif
678c4890d1SPeter Zijlstra };
688c4890d1SPeter Zijlstra 
698c4890d1SPeter Zijlstra #endif /* __LINUX_SMP_TYPES_H */
70