linux/include/linux/kmemleak.h
<<
>>
Prefs
   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, int min_count,
  33                                gfp_t gfp) __ref;
  34extern void kmemleak_free_part_phys(phys_addr_t phys, size_t size) __ref;
  35extern void kmemleak_not_leak_phys(phys_addr_t phys) __ref;
  36extern void kmemleak_ignore_phys(phys_addr_t phys) __ref;
  37
  38static inline void kmemleak_alloc_recursive(const void *ptr, size_t size,
  39                                            int min_count, slab_flags_t flags,
  40                                            gfp_t gfp)
  41{
  42        if (!(flags & SLAB_NOLEAKTRACE))
  43                kmemleak_alloc(ptr, size, min_count, gfp);
  44}
  45
  46static inline void kmemleak_free_recursive(const void *ptr, slab_flags_t flags)
  47{
  48        if (!(flags & SLAB_NOLEAKTRACE))
  49                kmemleak_free(ptr);
  50}
  51
  52static inline void kmemleak_erase(void **ptr)
  53{
  54        *ptr = NULL;
  55}
  56
  57#else
  58
  59static inline void kmemleak_init(void)
  60{
  61}
  62static inline void kmemleak_alloc(const void *ptr, size_t size, int min_count,
  63                                  gfp_t gfp)
  64{
  65}
  66static inline void kmemleak_alloc_recursive(const void *ptr, size_t size,
  67                                            int min_count, slab_flags_t flags,
  68                                            gfp_t gfp)
  69{
  70}
  71static inline void kmemleak_alloc_percpu(const void __percpu *ptr, size_t size,
  72                                         gfp_t gfp)
  73{
  74}
  75static inline void kmemleak_vmalloc(const struct vm_struct *area, size_t size,
  76                                    gfp_t gfp)
  77{
  78}
  79static inline void kmemleak_free(const void *ptr)
  80{
  81}
  82static inline void kmemleak_free_part(const void *ptr, size_t size)
  83{
  84}
  85static inline void kmemleak_free_recursive(const void *ptr, slab_flags_t flags)
  86{
  87}
  88static inline void kmemleak_free_percpu(const void __percpu *ptr)
  89{
  90}
  91static inline void kmemleak_update_trace(const void *ptr)
  92{
  93}
  94static inline void kmemleak_not_leak(const void *ptr)
  95{
  96}
  97static inline void kmemleak_ignore(const void *ptr)
  98{
  99}
 100static inline void kmemleak_scan_area(const void *ptr, size_t size, gfp_t gfp)
 101{
 102}
 103static inline void kmemleak_erase(void **ptr)
 104{
 105}
 106static inline void kmemleak_no_scan(const void *ptr)
 107{
 108}
 109static inline void kmemleak_alloc_phys(phys_addr_t phys, size_t size,
 110                                       int min_count, gfp_t gfp)
 111{
 112}
 113static inline void kmemleak_free_part_phys(phys_addr_t phys, size_t size)
 114{
 115}
 116static inline void kmemleak_not_leak_phys(phys_addr_t phys)
 117{
 118}
 119static inline void kmemleak_ignore_phys(phys_addr_t phys)
 120{
 121}
 122
 123#endif  /* CONFIG_DEBUG_KMEMLEAK */
 124
 125#endif  /* __KMEMLEAK_H */
 126