Messages in this thread Patch in this message | | | From | Donghai Qiao <> | Subject | [PATCH v2 01/11] smp: consolidate the structure definitions to smp.h | Date | Fri, 22 Apr 2022 16:00:30 -0400 |
| |
Move the structure definitions from kernel/smp.c to include/linux/smp.h
Move the structure definitions from include/linux/smp_types.h to include/linux/smp.h and delete smp_types.h
Signed-off-by: Donghai Qiao <dqiao@redhat.com> --- include/linux/irq_work.h | 2 +- include/linux/smp.h | 131 ++++++++++++++++++++++++++++++++++++-- include/linux/smp_types.h | 69 -------------------- kernel/smp.c | 65 ------------------- 4 files changed, 128 insertions(+), 139 deletions(-) delete mode 100644 include/linux/smp_types.h
diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h index 8cd11a223260..145af67b1cd3 100644 --- a/include/linux/irq_work.h +++ b/include/linux/irq_work.h @@ -2,7 +2,7 @@ #ifndef _LINUX_IRQ_WORK_H #define _LINUX_IRQ_WORK_H -#include <linux/smp_types.h> +#include <linux/smp.h> #include <linux/rcuwait.h> /* diff --git a/include/linux/smp.h b/include/linux/smp.h index a80ab58ae3f1..31811da856a3 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -10,13 +10,74 @@ #include <linux/errno.h> #include <linux/types.h> #include <linux/list.h> +#include <linux/llist.h> #include <linux/cpumask.h> #include <linux/init.h> -#include <linux/smp_types.h> typedef void (*smp_call_func_t)(void *info); typedef bool (*smp_cond_func_t)(int cpu, void *info); +enum { + CSD_FLAG_LOCK = 0x01, + + IRQ_WORK_PENDING = 0x01, + IRQ_WORK_BUSY = 0x02, + IRQ_WORK_LAZY = 0x04, /* No IPI, wait for tick */ + IRQ_WORK_HARD_IRQ = 0x08, /* IRQ context on PREEMPT_RT */ + + IRQ_WORK_CLAIMED = (IRQ_WORK_PENDING | IRQ_WORK_BUSY), + + CSD_TYPE_ASYNC = 0x00, + CSD_TYPE_SYNC = 0x10, + CSD_TYPE_IRQ_WORK = 0x20, + CSD_TYPE_TTWU = 0x30, + + CSD_FLAG_TYPE_MASK = 0xF0, +}; + +/* + * struct __call_single_node is the primary type on + * smp.c:call_single_queue. + * + * flush_smp_call_function_queue() only reads the type from + * __call_single_node::u_flags as a regular load, the above + * (anonymous) enum defines all the bits of this word. + * + * Other bits are not modified until the type is known. + * + * CSD_TYPE_SYNC/ASYNC: + * struct { + * struct llist_node node; + * unsigned int flags; + * smp_call_func_t func; + * void *info; + * }; + * + * CSD_TYPE_IRQ_WORK: + * struct { + * struct llist_node node; + * atomic_t flags; + * void (*func)(struct irq_work *); + * }; + * + * CSD_TYPE_TTWU: + * struct { + * struct llist_node node; + * unsigned int flags; + * }; + * + */ +struct __call_single_node { + struct llist_node llist; + union { + unsigned int u_flags; + atomic_t a_flags; + }; +#ifdef CONFIG_64BIT + u16 src, dst; +#endif +}; + /* * structure shares (partial) layout with struct irq_work */ @@ -26,13 +87,75 @@ struct __call_single_data { void *info; }; -#define CSD_INIT(_func, _info) \ - (struct __call_single_data){ .func = (_func), .info = (_info), } - /* Use __aligned() to avoid to use 2 cache lines for 1 csd */ typedef struct __call_single_data call_single_data_t __aligned(sizeof(struct __call_single_data)); +struct cfd_percpu { + call_single_data_t csd; +#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG + u64 seq_queue; + u64 seq_ipi; + u64 seq_noipi; +#endif +}; + +struct call_function_data { + struct cfd_percpu __percpu *pcpu; + cpumask_var_t cpumask; + cpumask_var_t cpumask_ipi; +}; + +#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG +union cfd_seq_cnt { + u64 val; + struct { + u64 src:16; + u64 dst:16; +#define CFD_SEQ_NOCPU 0xffff + u64 type:4; +#define CFD_SEQ_QUEUE 0 +#define CFD_SEQ_IPI 1 +#define CFD_SEQ_NOIPI 2 +#define CFD_SEQ_PING 3 +#define CFD_SEQ_PINGED 4 +#define CFD_SEQ_HANDLE 5 +#define CFD_SEQ_DEQUEUE 6 +#define CFD_SEQ_IDLE 7 +#define CFD_SEQ_GOTIPI 8 +#define CFD_SEQ_HDLEND 9 + u64 cnt:28; + } u; +}; + +static char *seq_type[] = { + [CFD_SEQ_QUEUE] = "queue", + [CFD_SEQ_IPI] = "ipi", + [CFD_SEQ_NOIPI] = "noipi", + [CFD_SEQ_PING] = "ping", + [CFD_SEQ_PINGED] = "pinged", + [CFD_SEQ_HANDLE] = "handle", + [CFD_SEQ_DEQUEUE] = "dequeue (src CPU 0 == empty)", + [CFD_SEQ_IDLE] = "idle", + [CFD_SEQ_GOTIPI] = "gotipi", + [CFD_SEQ_HDLEND] = "hdlend (src CPU 0 == early)", +}; + +struct cfd_seq_local { + u64 ping; + u64 pinged; + u64 handle; + u64 dequeue; + u64 idle; + u64 gotipi; + u64 hdlend; +}; +#endif + +#define CSD_TYPE(_csd) ((_csd)->node.u_flags & CSD_FLAG_TYPE_MASK) +#define CSD_INIT(_func, _info) \ + ((struct __call_single_data){ .func = (_func), .info = (_info), }) + #define INIT_CSD(_csd, _func, _info) \ do { \ *(_csd) = CSD_INIT((_func), (_info)); \ diff --git a/include/linux/smp_types.h b/include/linux/smp_types.h deleted file mode 100644 index 2e8461af8df6..000000000000 --- a/include/linux/smp_types.h +++ /dev/null @@ -1,69 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __LINUX_SMP_TYPES_H -#define __LINUX_SMP_TYPES_H - -#include <linux/llist.h> - -enum { - CSD_FLAG_LOCK = 0x01, - - IRQ_WORK_PENDING = 0x01, - IRQ_WORK_BUSY = 0x02, - IRQ_WORK_LAZY = 0x04, /* No IPI, wait for tick */ - IRQ_WORK_HARD_IRQ = 0x08, /* IRQ context on PREEMPT_RT */ - - IRQ_WORK_CLAIMED = (IRQ_WORK_PENDING | IRQ_WORK_BUSY), - - CSD_TYPE_ASYNC = 0x00, - CSD_TYPE_SYNC = 0x10, - CSD_TYPE_IRQ_WORK = 0x20, - CSD_TYPE_TTWU = 0x30, - - CSD_FLAG_TYPE_MASK = 0xF0, -}; - -/* - * struct __call_single_node is the primary type on - * smp.c:call_single_queue. - * - * flush_smp_call_function_queue() only reads the type from - * __call_single_node::u_flags as a regular load, the above - * (anonymous) enum defines all the bits of this word. - * - * Other bits are not modified until the type is known. - * - * CSD_TYPE_SYNC/ASYNC: - * struct { - * struct llist_node node; - * unsigned int flags; - * smp_call_func_t func; - * void *info; - * }; - * - * CSD_TYPE_IRQ_WORK: - * struct { - * struct llist_node node; - * atomic_t flags; - * void (*func)(struct irq_work *); - * }; - * - * CSD_TYPE_TTWU: - * struct { - * struct llist_node node; - * unsigned int flags; - * }; - * - */ - -struct __call_single_node { - struct llist_node llist; - union { - unsigned int u_flags; - atomic_t a_flags; - }; -#ifdef CONFIG_64BIT - u16 src, dst; -#endif -}; - -#endif /* __LINUX_SMP_TYPES_H */ diff --git a/kernel/smp.c b/kernel/smp.c index 01a7c1706a58..b2b3878f0330 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -29,73 +29,8 @@ #include "smpboot.h" #include "sched/smp.h" -#define CSD_TYPE(_csd) ((_csd)->node.u_flags & CSD_FLAG_TYPE_MASK) - -#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG -union cfd_seq_cnt { - u64 val; - struct { - u64 src:16; - u64 dst:16; -#define CFD_SEQ_NOCPU 0xffff - u64 type:4; -#define CFD_SEQ_QUEUE 0 -#define CFD_SEQ_IPI 1 -#define CFD_SEQ_NOIPI 2 -#define CFD_SEQ_PING 3 -#define CFD_SEQ_PINGED 4 -#define CFD_SEQ_HANDLE 5 -#define CFD_SEQ_DEQUEUE 6 -#define CFD_SEQ_IDLE 7 -#define CFD_SEQ_GOTIPI 8 -#define CFD_SEQ_HDLEND 9 - u64 cnt:28; - } u; -}; - -static char *seq_type[] = { - [CFD_SEQ_QUEUE] = "queue", - [CFD_SEQ_IPI] = "ipi", - [CFD_SEQ_NOIPI] = "noipi", - [CFD_SEQ_PING] = "ping", - [CFD_SEQ_PINGED] = "pinged", - [CFD_SEQ_HANDLE] = "handle", - [CFD_SEQ_DEQUEUE] = "dequeue (src CPU 0 == empty)", - [CFD_SEQ_IDLE] = "idle", - [CFD_SEQ_GOTIPI] = "gotipi", - [CFD_SEQ_HDLEND] = "hdlend (src CPU 0 == early)", -}; - -struct cfd_seq_local { - u64 ping; - u64 pinged; - u64 handle; - u64 dequeue; - u64 idle; - u64 gotipi; - u64 hdlend; -}; -#endif - -struct cfd_percpu { - call_single_data_t csd; -#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG - u64 seq_queue; - u64 seq_ipi; - u64 seq_noipi; -#endif -}; - -struct call_function_data { - struct cfd_percpu __percpu *pcpu; - cpumask_var_t cpumask; - cpumask_var_t cpumask_ipi; -}; - static DEFINE_PER_CPU_ALIGNED(struct call_function_data, cfd_data); - static DEFINE_PER_CPU_SHARED_ALIGNED(struct llist_head, call_single_queue); - static void flush_smp_call_function_queue(bool warn_cpu_offline); int smpcfd_prepare_cpu(unsigned int cpu) -- 2.27.0
| |