lkml.org 
[lkml]   [2022]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 01/11] smp: consolidate the structure definitions to smp.h
    Date
    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
    \
     
     \ /
      Last update: 2022-04-23 00:01    [W:2.457 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site