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