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