1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
3 #ifndef _BPF_MEM_ALLOC_H
4 #define _BPF_MEM_ALLOC_H
5 #include <linux/compiler_types.h>
6 #include <linux/workqueue.h>
11 struct bpf_mem_alloc
{
12 struct bpf_mem_caches __percpu
*caches
;
13 struct bpf_mem_cache __percpu
*cache
;
14 struct obj_cgroup
*objcg
;
16 struct work_struct work
;
19 /* 'size != 0' is for bpf_mem_alloc which manages fixed-size objects.
20 * Alloc and free are done with bpf_mem_cache_{alloc,free}().
22 * 'size = 0' is for bpf_mem_alloc which manages many fixed-size objects.
23 * Alloc and free are done with bpf_mem_{alloc,free}() and the size of
24 * the returned object is given by the size argument of bpf_mem_alloc().
25 * If percpu equals true, error will be returned in order to avoid
26 * large memory consumption and the below bpf_mem_alloc_percpu_unit_init()
27 * should be used to do on-demand per-cpu allocation for each size.
29 int bpf_mem_alloc_init(struct bpf_mem_alloc
*ma
, int size
, bool percpu
);
30 /* Initialize a non-fix-size percpu memory allocator */
31 int bpf_mem_alloc_percpu_init(struct bpf_mem_alloc
*ma
, struct obj_cgroup
*objcg
);
32 /* The percpu allocation with a specific unit size. */
33 int bpf_mem_alloc_percpu_unit_init(struct bpf_mem_alloc
*ma
, int size
);
34 void bpf_mem_alloc_destroy(struct bpf_mem_alloc
*ma
);
36 /* Check the allocation size for kmalloc equivalent allocator */
37 int bpf_mem_alloc_check_size(bool percpu
, size_t size
);
39 /* kmalloc/kfree equivalent: */
40 void *bpf_mem_alloc(struct bpf_mem_alloc
*ma
, size_t size
);
41 void bpf_mem_free(struct bpf_mem_alloc
*ma
, void *ptr
);
42 void bpf_mem_free_rcu(struct bpf_mem_alloc
*ma
, void *ptr
);
44 /* kmem_cache_alloc/free equivalent: */
45 void *bpf_mem_cache_alloc(struct bpf_mem_alloc
*ma
);
46 void bpf_mem_cache_free(struct bpf_mem_alloc
*ma
, void *ptr
);
47 void bpf_mem_cache_free_rcu(struct bpf_mem_alloc
*ma
, void *ptr
);
48 void bpf_mem_cache_raw_free(void *ptr
);
49 void *bpf_mem_cache_alloc_flags(struct bpf_mem_alloc
*ma
, gfp_t flags
);
51 #endif /* _BPF_MEM_ALLOC_H */