xref: /linux-6.15/include/linux/padata.h (revision a115bc07)
1 /*
2  * padata.h - header for the padata parallelization interface
3  *
4  * Copyright (C) 2008, 2009 secunet Security Networks AG
5  * Copyright (C) 2008, 2009 Steffen Klassert <[email protected]>
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms and conditions of the GNU General Public License,
9  * version 2, as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 #ifndef PADATA_H
22 #define PADATA_H
23 
24 #include <linux/workqueue.h>
25 #include <linux/spinlock.h>
26 #include <linux/list.h>
27 
28 struct padata_priv {
29 	struct list_head	list;
30 	struct parallel_data	*pd;
31 	int			cb_cpu;
32 	int			seq_nr;
33 	int			info;
34 	void                    (*parallel)(struct padata_priv *padata);
35 	void                    (*serial)(struct padata_priv *padata);
36 };
37 
38 struct padata_list {
39 	struct list_head        list;
40 	spinlock_t              lock;
41 };
42 
43 struct padata_queue {
44 	struct padata_list	parallel;
45 	struct padata_list	reorder;
46 	struct padata_list	serial;
47 	struct work_struct	pwork;
48 	struct work_struct	swork;
49 	struct parallel_data    *pd;
50 	atomic_t		num_obj;
51 	int			cpu_index;
52 };
53 
54 struct parallel_data {
55 	struct padata_instance	*pinst;
56 	struct padata_queue	*queue;
57 	atomic_t		seq_nr;
58 	atomic_t		reorder_objects;
59 	atomic_t                refcnt;
60 	unsigned int		max_seq_nr;
61 	cpumask_var_t		cpumask;
62 	spinlock_t              lock;
63 };
64 
65 struct padata_instance {
66 	struct notifier_block   cpu_notifier;
67 	struct workqueue_struct *wq;
68 	struct parallel_data	*pd;
69 	cpumask_var_t           cpumask;
70 	struct mutex		lock;
71 	u8			flags;
72 #define	PADATA_INIT		1
73 #define	PADATA_RESET		2
74 };
75 
76 extern struct padata_instance *padata_alloc(const struct cpumask *cpumask,
77 					    struct workqueue_struct *wq);
78 extern void padata_free(struct padata_instance *pinst);
79 extern int padata_do_parallel(struct padata_instance *pinst,
80 			      struct padata_priv *padata, int cb_cpu);
81 extern void padata_do_serial(struct padata_priv *padata);
82 extern int padata_set_cpumask(struct padata_instance *pinst,
83 			      cpumask_var_t cpumask);
84 extern int padata_add_cpu(struct padata_instance *pinst, int cpu);
85 extern int padata_remove_cpu(struct padata_instance *pinst, int cpu);
86 extern void padata_start(struct padata_instance *pinst);
87 extern void padata_stop(struct padata_instance *pinst);
88 #endif
89