padata: remove reorder_objects
[linux-2.6-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
SK
21/**
22 * struct padata_priv - Embedded to the users data structure.
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
SK
44/**
45 * struct padata_list
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.
73 * @serial: List to wait for serialization after reordering.
74 * @pwork: work struct for parallelization.
75 * @swork: work struct for serialization.
e15bacbe
DK
76 * @work: work struct for parallelization.
77 * @num_obj: Number of objects that are processed by this cpu.
0198ffd1 78 */
e15bacbe
DK
79struct padata_parallel_queue {
80 struct padata_list parallel;
81 struct padata_list reorder;
e15bacbe
DK
82 struct work_struct work;
83 atomic_t num_obj;
16295bec
SK
84};
85
c635696c
SK
86/**
87 * struct padata_cpumask - The cpumasks for the parallel/serial workers
88 *
89 * @pcpu: cpumask for the parallel workers.
90 * @cbcpu: cpumask for the serial (callback) workers.
91 */
92struct padata_cpumask {
93 cpumask_var_t pcpu;
94 cpumask_var_t cbcpu;
95};
e15bacbe 96
0198ffd1
SK
97/**
98 * struct parallel_data - Internal control structure, covers everything
99 * that depends on the cpumask in use.
100 *
bbefa1dd 101 * @sh: padata_shell object.
e15bacbe
DK
102 * @pqueue: percpu padata queues used for parallelization.
103 * @squeue: percpu padata queues used for serialuzation.
0198ffd1
SK
104 * @refcnt: Number of objects holding a reference on this parallel_data.
105 * @max_seq_nr: Maximal used sequence number.
bfde23ce 106 * @processed: Number of already processed objects.
6fc4dbcf 107 * @cpu: Next CPU to be processed.
c635696c 108 * @cpumask: The cpumasks in use for parallel and serial workers.
6fc4dbcf 109 * @reorder_work: work struct for reordering.
0198ffd1 110 * @lock: Reorder lock.
0198ffd1 111 */
16295bec 112struct parallel_data {
bbefa1dd 113 struct padata_shell *ps;
57a2ce5f
NK
114 struct padata_parallel_queue __percpu *pqueue;
115 struct padata_serial_queue __percpu *squeue;
c635696c 116 atomic_t refcnt;
0b6b098e 117 atomic_t seq_nr;
bfde23ce 118 unsigned int processed;
6fc4dbcf 119 int cpu;
c635696c 120 struct padata_cpumask cpumask;
6fc4dbcf 121 struct work_struct reorder_work;
c635696c 122 spinlock_t lock ____cacheline_aligned;
16295bec
SK
123};
124
bbefa1dd
HX
125/**
126 * struct padata_shell - Wrapper around struct parallel_data, its
127 * purpose is to allow the underlying control structure to be replaced
128 * on the fly using RCU.
129 *
130 * @pinst: padat instance.
131 * @pd: Actual parallel_data structure which may be substituted on the fly.
132 * @opd: Pointer to old pd to be freed by padata_replace.
133 * @list: List entry in padata_instance list.
134 */
135struct padata_shell {
136 struct padata_instance *pinst;
137 struct parallel_data __rcu *pd;
138 struct parallel_data *opd;
139 struct list_head list;
140};
141
0198ffd1
SK
142/**
143 * struct padata_instance - The overall control structure.
144 *
145 * @cpu_notifier: cpu hotplug notifier.
45d153c0
DJ
146 * @parallel_wq: The workqueue used for parallel work.
147 * @serial_wq: The workqueue used for serial work.
bbefa1dd 148 * @pslist: List of padata_shell objects attached to this instance.
c635696c 149 * @cpumask: User supplied cpumasks for parallel and serial works.
bbefa1dd 150 * @rcpumask: Actual cpumasks based on user cpumask and cpu_online_mask.
5e017dc3 151 * @kobj: padata instance kernel object.
0198ffd1
SK
152 * @lock: padata instance lock.
153 * @flags: padata flags.
154 */
16295bec 155struct padata_instance {
30e92153 156 struct hlist_node node;
45d153c0
DJ
157 struct workqueue_struct *parallel_wq;
158 struct workqueue_struct *serial_wq;
bbefa1dd 159 struct list_head pslist;
c635696c 160 struct padata_cpumask cpumask;
bbefa1dd 161 struct padata_cpumask rcpumask;
5e017dc3 162 struct kobject kobj;
e15bacbe
DK
163 struct mutex lock;
164 u8 flags;
165#define PADATA_INIT 1
166#define PADATA_RESET 2
167#define PADATA_INVALID 4
16295bec
SK
168};
169
b128a304 170extern struct padata_instance *padata_alloc_possible(const char *name);
16295bec 171extern void padata_free(struct padata_instance *pinst);
bbefa1dd
HX
172extern struct padata_shell *padata_alloc_shell(struct padata_instance *pinst);
173extern void padata_free_shell(struct padata_shell *ps);
174extern int padata_do_parallel(struct padata_shell *ps,
e6ce0e08 175 struct padata_priv *padata, int *cb_cpu);
16295bec 176extern void padata_do_serial(struct padata_priv *padata);
e15bacbe 177extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
16295bec 178 cpumask_var_t cpumask);
4c879170 179extern int padata_start(struct padata_instance *pinst);
16295bec
SK
180extern void padata_stop(struct padata_instance *pinst);
181#endif