diff options
author | Peter Zijlstra <peterz@infradead.org> | 2020-06-15 12:29:31 +0300 |
---|---|---|
committer | Peter Zijlstra <peterz@infradead.org> | 2020-11-24 18:47:49 +0300 |
commit | 545b8c8df41f9ecbaf806332d4095bc4bc7c14e8 (patch) | |
tree | 8ce051dfb3d847b5fa8cddf6aa2ad265e3416a36 /include/linux/smp.h | |
parent | 7a9f50a05843fee8366bd3a65addbebaa7cf7f07 (diff) | |
download | linux-545b8c8df41f9ecbaf806332d4095bc4bc7c14e8.tar.xz |
smp: Cleanup smp_call_function*()
Get rid of the __call_single_node union and cleanup the API a little
to avoid external code relying on the structure layout as much.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Diffstat (limited to 'include/linux/smp.h')
-rw-r--r-- | include/linux/smp.h | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/include/linux/smp.h b/include/linux/smp.h index 9f13966d3d92..70c6f6284dcf 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -21,24 +21,23 @@ typedef bool (*smp_cond_func_t)(int cpu, void *info); * structure shares (partial) layout with struct irq_work */ struct __call_single_data { - union { - struct __call_single_node node; - struct { - struct llist_node llist; - unsigned int flags; -#ifdef CONFIG_64BIT - u16 src, dst; -#endif - }; - }; + struct __call_single_node node; smp_call_func_t func; 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)); +#define INIT_CSD(_csd, _func, _info) \ +do { \ + *(_csd) = CSD_INIT((_func), (_info)); \ +} while (0) + /* * Enqueue a llist_node on the call_single_queue; be very careful, read * flush_smp_call_function_queue() in detail. |