2019-05-30 02:57:47 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2009-06-11 16:24:14 +04:00
/*
2020-10-14 02:48:53 +03:00
* samples / kmemleak / kmemleak - test . c
2009-06-11 16:24:14 +04:00
*
* Copyright ( C ) 2008 ARM Limited
* Written by Catalin Marinas < catalin . marinas @ arm . com >
*/
2014-06-07 01:38:26 +04:00
# define pr_fmt(fmt) "kmemleak: " fmt
2009-06-11 16:24:14 +04:00
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/slab.h>
# include <linux/vmalloc.h>
# include <linux/list.h>
# include <linux/percpu.h>
# include <linux/fdtable.h>
# include <linux/kmemleak.h>
struct test_node {
long header [ 25 ] ;
struct list_head list ;
long footer [ 25 ] ;
} ;
static LIST_HEAD ( test_list ) ;
2009-06-24 10:13:48 +04:00
static DEFINE_PER_CPU ( void * , kmemleak_test_pointer ) ;
2009-06-11 16:24:14 +04:00
/*
* Some very simple testing . This function needs to be extended for
* proper testing .
*/
static int __init kmemleak_test_init ( void )
{
struct test_node * elem ;
int i ;
2016-03-18 00:19:50 +03:00
pr_info ( " Kmemleak testing \n " ) ;
2009-06-11 16:24:14 +04:00
/* make some orphan objects */
2014-06-07 01:38:26 +04:00
pr_info ( " kmalloc(32) = %p \n " , kmalloc ( 32 , GFP_KERNEL ) ) ;
pr_info ( " kmalloc(32) = %p \n " , kmalloc ( 32 , GFP_KERNEL ) ) ;
pr_info ( " kmalloc(1024) = %p \n " , kmalloc ( 1024 , GFP_KERNEL ) ) ;
pr_info ( " kmalloc(1024) = %p \n " , kmalloc ( 1024 , GFP_KERNEL ) ) ;
pr_info ( " kmalloc(2048) = %p \n " , kmalloc ( 2048 , GFP_KERNEL ) ) ;
pr_info ( " kmalloc(2048) = %p \n " , kmalloc ( 2048 , GFP_KERNEL ) ) ;
pr_info ( " kmalloc(4096) = %p \n " , kmalloc ( 4096 , GFP_KERNEL ) ) ;
pr_info ( " kmalloc(4096) = %p \n " , kmalloc ( 4096 , GFP_KERNEL ) ) ;
2009-06-11 16:24:14 +04:00
# ifndef CONFIG_MODULES
2014-06-07 01:38:26 +04:00
pr_info ( " kmem_cache_alloc(files_cachep) = %p \n " ,
2009-06-11 16:24:14 +04:00
kmem_cache_alloc ( files_cachep , GFP_KERNEL ) ) ;
2014-06-07 01:38:26 +04:00
pr_info ( " kmem_cache_alloc(files_cachep) = %p \n " ,
2009-06-11 16:24:14 +04:00
kmem_cache_alloc ( files_cachep , GFP_KERNEL ) ) ;
# endif
2014-06-07 01:38:26 +04:00
pr_info ( " vmalloc(64) = %p \n " , vmalloc ( 64 ) ) ;
pr_info ( " vmalloc(64) = %p \n " , vmalloc ( 64 ) ) ;
pr_info ( " vmalloc(64) = %p \n " , vmalloc ( 64 ) ) ;
pr_info ( " vmalloc(64) = %p \n " , vmalloc ( 64 ) ) ;
pr_info ( " vmalloc(64) = %p \n " , vmalloc ( 64 ) ) ;
2009-06-11 16:24:14 +04:00
/*
* Add elements to a list . They should only appear as orphan
* after the module is removed .
*/
for ( i = 0 ; i < 10 ; i + + ) {
2010-10-31 01:43:05 +04:00
elem = kzalloc ( sizeof ( * elem ) , GFP_KERNEL ) ;
2014-06-07 01:38:26 +04:00
pr_info ( " kzalloc(sizeof(*elem)) = %p \n " , elem ) ;
2009-06-11 16:24:14 +04:00
if ( ! elem )
return - ENOMEM ;
INIT_LIST_HEAD ( & elem - > list ) ;
list_add_tail ( & elem - > list , & test_list ) ;
}
for_each_possible_cpu ( i ) {
2009-06-24 10:13:48 +04:00
per_cpu ( kmemleak_test_pointer , i ) = kmalloc ( 129 , GFP_KERNEL ) ;
2014-06-07 01:38:26 +04:00
pr_info ( " kmalloc(129) = %p \n " ,
2009-06-24 10:13:48 +04:00
per_cpu ( kmemleak_test_pointer , i ) ) ;
2009-06-11 16:24:14 +04:00
}
return 0 ;
}
module_init ( kmemleak_test_init ) ;
static void __exit kmemleak_test_exit ( void )
{
struct test_node * elem , * tmp ;
/*
* Remove the list elements without actually freeing the
* memory .
*/
list_for_each_entry_safe ( elem , tmp , & test_list , list )
list_del ( & elem - > list ) ;
}
module_exit ( kmemleak_test_exit ) ;
MODULE_LICENSE ( " GPL " ) ;