xref: /openbmc/linux/kernel/bpf/percpu_freelist.h (revision e19494ed)
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 
25e19494edSAlexei Starovoitov void pcpu_freelist_push(struct pcpu_freelist *, struct pcpu_freelist_node *);
26e19494edSAlexei Starovoitov struct pcpu_freelist_node *pcpu_freelist_pop(struct pcpu_freelist *);
27e19494edSAlexei Starovoitov void pcpu_freelist_populate(struct pcpu_freelist *s, void *buf, u32 elem_size,
28e19494edSAlexei Starovoitov 			    u32 nr_elems);
29e19494edSAlexei Starovoitov int pcpu_freelist_init(struct pcpu_freelist *);
30e19494edSAlexei Starovoitov void pcpu_freelist_destroy(struct pcpu_freelist *s);
31e19494edSAlexei Starovoitov #endif
32