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