padata: remove exit routine
[linux-block.git] / include / linux / padata.h
CommitLineData
a61127c2 1/* SPDX-License-Identifier: GPL-2.0-only */
16295bec
SK
2/*
3 * padata.h - header for the padata parallelization interface
4 *
5 * Copyright (C) 2008, 2009 secunet Security Networks AG
6 * Copyright (C) 2008, 2009 Steffen Klassert <steffen.klassert@secunet.com>
16295bec
SK
7 */
8
9#ifndef PADATA_H
10#define PADATA_H
11
bbefa1dd 12#include <linux/compiler_types.h>
16295bec
SK
13#include <linux/workqueue.h>
14#include <linux/spinlock.h>
15#include <linux/list.h>
5e017dc3 16#include <linux/kobject.h>
e15bacbe
DK
17
18#define PADATA_CPU_SERIAL 0x01
19#define PADATA_CPU_PARALLEL 0x02
16295bec 20
0198ffd1 21/**
bfcdcef8 22 * struct padata_priv - Represents one job
0198ffd1
SK
23 *
24 * @list: List entry, to attach to the padata lists.
25 * @pd: Pointer to the internal control structure.
26 * @cb_cpu: Callback cpu for serializatioon.
350ef88e 27 * @cpu: Cpu for parallelization.
0198ffd1
SK
28 * @seq_nr: Sequence number of the parallelized data object.
29 * @info: Used to pass information from the parallel to the serial function.
30 * @parallel: Parallel execution function.
31 * @serial: Serial complete function.
32 */
16295bec
SK
33struct padata_priv {
34 struct list_head list;
35 struct parallel_data *pd;
36 int cb_cpu;
350ef88e 37 int cpu;
bfde23ce 38 unsigned int seq_nr;
16295bec
SK
39 int info;
40 void (*parallel)(struct padata_priv *padata);
41 void (*serial)(struct padata_priv *padata);
42};
43
0198ffd1 44/**
bfcdcef8 45 * struct padata_list - one per work type per CPU
0198ffd1
SK
46 *
47 * @list: List head.
48 * @lock: List lock.
49 */
16295bec
SK
50struct padata_list {
51 struct list_head list;
52 spinlock_t lock;
53};
54
0198ffd1 55/**
e15bacbe
DK
56* struct padata_serial_queue - The percpu padata serial queue
57*
58* @serial: List to wait for serialization after reordering.
59* @work: work struct for serialization.
60* @pd: Backpointer to the internal control structure.
61*/
62struct padata_serial_queue {
63 struct padata_list serial;
64 struct work_struct work;
65 struct parallel_data *pd;
66};
67
68/**
69 * struct padata_parallel_queue - The percpu padata parallel queue
0198ffd1
SK
70 *
71 * @parallel: List to wait for parallelization.
72 * @reorder: List to wait for reordering after parallel processing.
e15bacbe
DK
73 * @work: work struct for parallelization.
74 * @num_obj: Number of objects that are processed by this cpu.
0198ffd1 75 */
e15bacbe
DK
76struct padata_parallel_queue {
77 struct padata_list parallel;
78 struct padata_list reorder;
e15bacbe
DK
79 struct work_struct work;
80 atomic_t num_obj;
16295bec
SK
81};
82
c635696c
SK
83/**
84 * struct padata_cpumask - The cpumasks for the parallel/serial workers
85 *
86 * @pcpu: cpumask for the parallel workers.
87 * @cbcpu: cpumask for the serial (callback) workers.
88 */
89struct padata_cpumask {
90 cpumask_var_t pcpu;
91 cpumask_var_t cbcpu;
92};
e15bacbe 93
0198ffd1
SK
94/**
95 * struct parallel_data - Internal control structure, covers everything
96 * that depends on the cpumask in use.
97 *
bfcdcef8 98 * @ps: padata_shell object.
e15bacbe
DK
99 * @pqueue: percpu padata queues used for parallelization.
100 * @squeue: percpu padata queues used for serialuzation.
0198ffd1 101 * @refcnt: Number of objects holding a reference on this parallel_data.
bfcdcef8 102 * @seq_nr: Sequence number of the parallelized data object.
bfde23ce 103 * @processed: Number of already processed objects.
6fc4dbcf 104 * @cpu: Next CPU to be processed.
c635696c 105 * @cpumask: The cpumasks in use for parallel and serial workers.
6fc4dbcf 106 * @reorder_work: work struct for reordering.
0198ffd1 107 * @lock: Reorder lock.
0198ffd1 108 */
16295bec 109struct parallel_data {
bbefa1dd 110 struct padata_shell *ps;
57a2ce5f
NK
111 struct padata_parallel_queue __percpu *pqueue;
112 struct padata_serial_queue __percpu *squeue;
c635696c 113 atomic_t refcnt;
0b6b098e 114 atomic_t seq_nr;
bfde23ce 115 unsigned int processed;
6fc4dbcf 116 int cpu;
c635696c 117 struct padata_cpumask cpumask;
6fc4dbcf 118 struct work_struct reorder_work;
bfcdcef8 119 spinlock_t ____cacheline_aligned lock;
16295bec
SK
120};
121
bbefa1dd
HX
122/**
123 * struct padata_shell - Wrapper around struct parallel_data, its
124 * purpose is to allow the underlying control structure to be replaced
125 * on the fly using RCU.
126 *
127 * @pinst: padat instance.
128 * @pd: Actual parallel_data structure which may be substituted on the fly.
129 * @opd: Pointer to old pd to be freed by padata_replace.
130 * @list: List entry in padata_instance list.
131 */
132struct padata_shell {
133 struct padata_instance *pinst;
134 struct parallel_data __rcu *pd;
135 struct parallel_data *opd;
136 struct list_head list;
137};
138
0198ffd1
SK
139/**
140 * struct padata_instance - The overall control structure.
141 *
3c2214b6
DJ
142 * @cpu_online_node: Linkage for CPU online callback.
143 * @cpu_dead_node: Linkage for CPU offline callback.
45d153c0
DJ
144 * @parallel_wq: The workqueue used for parallel work.
145 * @serial_wq: The workqueue used for serial work.
bbefa1dd 146 * @pslist: List of padata_shell objects attached to this instance.
c635696c 147 * @cpumask: User supplied cpumasks for parallel and serial works.
bbefa1dd 148 * @rcpumask: Actual cpumasks based on user cpumask and cpu_online_mask.
5e017dc3 149 * @kobj: padata instance kernel object.
0198ffd1
SK
150 * @lock: padata instance lock.
151 * @flags: padata flags.
152 */
16295bec 153struct padata_instance {
3c2214b6
DJ
154 struct hlist_node cpu_online_node;
155 struct hlist_node cpu_dead_node;
45d153c0
DJ
156 struct workqueue_struct *parallel_wq;
157 struct workqueue_struct *serial_wq;
bbefa1dd 158 struct list_head pslist;
c635696c 159 struct padata_cpumask cpumask;
bbefa1dd 160 struct padata_cpumask rcpumask;
5e017dc3 161 struct kobject kobj;
e15bacbe
DK
162 struct mutex lock;
163 u8 flags;
164#define PADATA_INIT 1
165#define PADATA_RESET 2
166#define PADATA_INVALID 4
16295bec
SK
167};
168
b128a304 169extern struct padata_instance *padata_alloc_possible(const char *name);
16295bec 170extern void padata_free(struct padata_instance *pinst);
bbefa1dd
HX
171extern struct padata_shell *padata_alloc_shell(struct padata_instance *pinst);
172extern void padata_free_shell(struct padata_shell *ps);
173extern int padata_do_parallel(struct padata_shell *ps,
e6ce0e08 174 struct padata_priv *padata, int *cb_cpu);
16295bec 175extern void padata_do_serial(struct padata_priv *padata);
e15bacbe 176extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
16295bec 177 cpumask_var_t cpumask);
4c879170 178extern int padata_start(struct padata_instance *pinst);
16295bec
SK
179extern void padata_stop(struct padata_instance *pinst);
180#endif