1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * include/linux/kmemleak.h
4 *
5 * Copyright (C) 2008 ARM Limited
6 * Written by Catalin Marinas <catalin.marinas@arm.com>
7 */
8
9#ifndef __KMEMLEAK_H
10#define __KMEMLEAK_H
11
12#include <linux/slab.h>
13#include <linux/vmalloc.h>
14
15#ifdef CONFIG_DEBUG_KMEMLEAK
16
17extern void kmemleak_init(void) __init;
18extern void kmemleak_alloc(const void *ptr, size_t size, int min_count,
19 gfp_t gfp) __ref;
20extern void kmemleak_alloc_percpu(const void __percpu *ptr, size_t size,
21 gfp_t gfp) __ref;
22extern void kmemleak_vmalloc(const struct vm_struct *area, size_t size,
23 gfp_t gfp) __ref;
24extern void kmemleak_free(const void *ptr) __ref;
25extern void kmemleak_free_part(const void *ptr, size_t size) __ref;
26extern void kmemleak_free_percpu(const void __percpu *ptr) __ref;
27extern void kmemleak_update_trace(const void *ptr) __ref;
28extern void kmemleak_not_leak(const void *ptr) __ref;
29extern void kmemleak_ignore(const void *ptr) __ref;
30extern void kmemleak_scan_area(const void *ptr, size_t size, gfp_t gfp) __ref;
31extern void kmemleak_no_scan(const void *ptr) __ref;
32extern void kmemleak_alloc_phys(phys_addr_t phys, size_t size,
33 gfp_t gfp) __ref;
34extern void kmemleak_free_part_phys(phys_addr_t phys, size_t size) __ref;
35extern void kmemleak_ignore_phys(phys_addr_t phys) __ref;
36
37static inline void kmemleak_alloc_recursive(const void *ptr, size_t size,
38 int min_count, slab_flags_t flags,
39 gfp_t gfp)
40{
41 if (!(flags & SLAB_NOLEAKTRACE))
42 kmemleak_alloc(ptr, size, min_count, gfp);
43}
44
45static inline void kmemleak_free_recursive(const void *ptr, slab_flags_t flags)
46{
47 if (!(flags & SLAB_NOLEAKTRACE))
48 kmemleak_free(ptr);
49}
50
51static inline void kmemleak_erase(void **ptr)
52{
53 *ptr = NULL;
54}
55
56#else
57
58static inline void kmemleak_init(void)
59{
60}
61static inline void kmemleak_alloc(const void *ptr, size_t size, int min_count,
62 gfp_t gfp)
63{
64}
65static inline void kmemleak_alloc_recursive(const void *ptr, size_t size,
66 int min_count, slab_flags_t flags,
67 gfp_t gfp)
68{
69}
70static inline void kmemleak_alloc_percpu(const void __percpu *ptr, size_t size,
71 gfp_t gfp)
72{
73}
74static inline void kmemleak_vmalloc(const struct vm_struct *area, size_t size,
75 gfp_t gfp)
76{
77}
78static inline void kmemleak_free(const void *ptr)
79{
80}
81static inline void kmemleak_free_part(const void *ptr, size_t size)
82{
83}
84static inline void kmemleak_free_recursive(const void *ptr, slab_flags_t flags)
85{
86}
87static inline void kmemleak_free_percpu(const void __percpu *ptr)
88{
89}
90static inline void kmemleak_update_trace(const void *ptr)
91{
92}
93static inline void kmemleak_not_leak(const void *ptr)
94{
95}
96static inline void kmemleak_ignore(const void *ptr)
97{
98}
99static inline void kmemleak_scan_area(const void *ptr, size_t size, gfp_t gfp)
100{
101}
102static inline void kmemleak_erase(void **ptr)
103{
104}
105static inline void kmemleak_no_scan(const void *ptr)
106{
107}
108static inline void kmemleak_alloc_phys(phys_addr_t phys, size_t size,
109 gfp_t gfp)
110{
111}
112static inline void kmemleak_free_part_phys(phys_addr_t phys, size_t size)
113{
114}
115static inline void kmemleak_ignore_phys(phys_addr_t phys)
116{
117}
118
119#endif /* CONFIG_DEBUG_KMEMLEAK */
120
121#endif /* __KMEMLEAK_H */
122

source code of linux/include/linux/kmemleak.h