Commit 2e1483c995bbd0fa6cbd055ad76088a520799ba4

Authored by Catalin Marinas
1 parent 4f2294b6dc

kmemleak: Remove some of the kmemleak false positives

There are allocations for which the main pointer cannot be found but
they are not memory leaks. This patch fixes some of them. For more
information on false positives, see Documentation/kmemleak.txt.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>

Showing 3 changed files with 18 additions and 0 deletions Side-by-side Diff

... ... @@ -104,6 +104,7 @@
104 104 #include <linux/io.h>
105 105 #include <asm/system.h>
106 106 #include <linux/uaccess.h>
  107 +#include <linux/kmemleak.h>
107 108  
108 109 #define MAX_NR_CON_DRIVER 16
109 110  
... ... @@ -2880,6 +2881,12 @@
2880 2881 */
2881 2882 for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {
2882 2883 vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data));
  2884 + /*
  2885 + * Kmemleak does not track the memory allocated via
  2886 + * alloc_bootmem() but this block contains pointers to
  2887 + * other blocks allocated via kmalloc.
  2888 + */
  2889 + kmemleak_alloc(vc, sizeof(struct vc_data), 1, GFP_ATOMIC);
2883 2890 INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
2884 2891 visual_init(vc, currcons, 1);
2885 2892 vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);
... ... @@ -25,6 +25,7 @@
25 25 #include <linux/uio.h>
26 26 #include <linux/namei.h>
27 27 #include <linux/log2.h>
  28 +#include <linux/kmemleak.h>
28 29 #include <asm/uaccess.h>
29 30 #include "internal.h"
30 31  
... ... @@ -492,6 +493,11 @@
492 493 bd_mnt = kern_mount(&bd_type);
493 494 if (IS_ERR(bd_mnt))
494 495 panic("Cannot create bdev pseudo-fs");
  496 + /*
  497 + * This vfsmount structure is only used to obtain the
  498 + * blockdev_superblock, so tell kmemleak not to report it.
  499 + */
  500 + kmemleak_not_leak(bd_mnt);
495 501 blockdev_superblock = bd_mnt->mnt_sb; /* For writeback */
496 502 }
497 503  
include/linux/percpu.h
... ... @@ -86,7 +86,12 @@
86 86 void *ptrs[1];
87 87 };
88 88  
  89 +/* pointer disguising messes up the kmemleak objects tracking */
  90 +#ifndef CONFIG_DEBUG_KMEMLEAK
89 91 #define __percpu_disguise(pdata) (struct percpu_data *)~(unsigned long)(pdata)
  92 +#else
  93 +#define __percpu_disguise(pdata) (struct percpu_data *)(pdata)
  94 +#endif
90 95  
91 96 #define per_cpu_ptr(ptr, cpu) \
92 97 ({ \