xref: /openbmc/linux/kernel/bpf/percpu_freelist.h (revision a89fac57)
1e19494edSAlexei Starovoitov /* Copyright (c) 2016 Facebook
2e19494edSAlexei Starovoitov  *
3e19494edSAlexei Starovoitov  * This program is free software; you can redistribute it and/or
4e19494edSAlexei Starovoitov  * modify it under the terms of version 2 of the GNU General Public
5e19494edSAlexei Starovoitov  * License as published by the Free Software Foundation.
6e19494edSAlexei Starovoitov  */
7e19494edSAlexei Starovoitov #ifndef __PERCPU_FREELIST_H__
8e19494edSAlexei Starovoitov #define __PERCPU_FREELIST_H__
9e19494edSAlexei Starovoitov #include <linux/spinlock.h>
10e19494edSAlexei Starovoitov #include <linux/percpu.h>
11e19494edSAlexei Starovoitov 
12e19494edSAlexei Starovoitov struct pcpu_freelist_head {
13e19494edSAlexei Starovoitov 	struct pcpu_freelist_node *first;
14e19494edSAlexei Starovoitov 	raw_spinlock_t lock;
15e19494edSAlexei Starovoitov };
16e19494edSAlexei Starovoitov 
17e19494edSAlexei Starovoitov struct pcpu_freelist {
18e19494edSAlexei Starovoitov 	struct pcpu_freelist_head __percpu *freelist;
19e19494edSAlexei Starovoitov };
20e19494edSAlexei Starovoitov 
21e19494edSAlexei Starovoitov struct pcpu_freelist_node {
22e19494edSAlexei Starovoitov 	struct pcpu_freelist_node *next;
23e19494edSAlexei Starovoitov };
24e19494edSAlexei Starovoitov 
25a89fac57SAlexei Starovoitov /* pcpu_freelist_* do spin_lock_irqsave. */
26e19494edSAlexei Starovoitov void pcpu_freelist_push(struct pcpu_freelist *, struct pcpu_freelist_node *);
27e19494edSAlexei Starovoitov struct pcpu_freelist_node *pcpu_freelist_pop(struct pcpu_freelist *);
28a89fac57SAlexei Starovoitov /* __pcpu_freelist_* do spin_lock only. caller must disable irqs. */
29a89fac57SAlexei Starovoitov void __pcpu_freelist_push(struct pcpu_freelist *, struct pcpu_freelist_node *);
30a89fac57SAlexei Starovoitov struct pcpu_freelist_node *__pcpu_freelist_pop(struct pcpu_freelist *);
31e19494edSAlexei Starovoitov void pcpu_freelist_populate(struct pcpu_freelist *s, void *buf, u32 elem_size,
32e19494edSAlexei Starovoitov 			    u32 nr_elems);
33e19494edSAlexei Starovoitov int pcpu_freelist_init(struct pcpu_freelist *);
34e19494edSAlexei Starovoitov void pcpu_freelist_destroy(struct pcpu_freelist *s);
35e19494edSAlexei Starovoitov #endif
36