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