1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
---|---|
2 | /* Copyright (c) 2016 Facebook |
3 | */ |
4 | #ifndef __PERCPU_FREELIST_H__ |
5 | #define __PERCPU_FREELIST_H__ |
6 | #include <linux/spinlock.h> |
7 | #include <linux/percpu.h> |
8 | |
9 | struct pcpu_freelist_head { |
10 | struct pcpu_freelist_node *first; |
11 | raw_spinlock_t lock; |
12 | }; |
13 | |
14 | struct pcpu_freelist { |
15 | struct pcpu_freelist_head __percpu *freelist; |
16 | struct pcpu_freelist_head extralist; |
17 | }; |
18 | |
19 | struct pcpu_freelist_node { |
20 | struct pcpu_freelist_node *next; |
21 | }; |
22 | |
23 | /* pcpu_freelist_* do spin_lock_irqsave. */ |
24 | void pcpu_freelist_push(struct pcpu_freelist *, struct pcpu_freelist_node *); |
25 | struct pcpu_freelist_node *pcpu_freelist_pop(struct pcpu_freelist *); |
26 | /* __pcpu_freelist_* do spin_lock only. caller must disable irqs. */ |
27 | void __pcpu_freelist_push(struct pcpu_freelist *, struct pcpu_freelist_node *); |
28 | struct pcpu_freelist_node *__pcpu_freelist_pop(struct pcpu_freelist *); |
29 | void pcpu_freelist_populate(struct pcpu_freelist *s, void *buf, u32 elem_size, |
30 | u32 nr_elems); |
31 | int pcpu_freelist_init(struct pcpu_freelist *); |
32 | void pcpu_freelist_destroy(struct pcpu_freelist *s); |
33 | #endif |
34 |