hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/* 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 */