[LTP] [PATCH] perf_event_open: improve the memory leak detection

Martin Doucha mdoucha@suse.cz
Thu Jul 18 17:07:52 CEST 2024


Hi,
I've tested the patch on an affected kernel and it still reproduces the 
leak. Small nit below, but otherwise:

Reviewed-by: Martin Doucha <mdoucha@suse.cz>

On 05. 07. 24 5:15, Li Wang wrote:
> The goal is to add more robust memory leak detection by periodically
> sampling memory availability during the test run and checking for
> significant decreases in available memory.
> 
> To avoid false postive:
>    perf_event_open03.c:95: TFAIL: Likely kernel memory leak detected
> 
> Signed-off-by: Li Wang <liwang@redhat.com>
> ---
>   .../perf_event_open/perf_event_open03.c       | 32 +++++++++++++++----
>   1 file changed, 26 insertions(+), 6 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/perf_event_open/perf_event_open03.c b/testcases/kernel/syscalls/perf_event_open/perf_event_open03.c
> index 7dd31d3d2..1aab43e82 100644
> --- a/testcases/kernel/syscalls/perf_event_open/perf_event_open03.c
> +++ b/testcases/kernel/syscalls/perf_event_open/perf_event_open03.c
> @@ -26,6 +26,7 @@
>   const int iterations = 12000000;
>   static int fd = -1;
>   static int runtime;
> +static int sample;

Does this variable need to be global? It's used only in run() and it 
gets reset to zero between test iterations.

>   
>   static void setup(void)
>   {
> @@ -77,22 +78,41 @@ static void check_progress(int i)
>   
>   static void run(void)
>   {
> -	long diff;
> +	long diff, diff_total, mem_avail, mem_avail_prev;
>   	int i;
>   
> -	diff = SAFE_READ_MEMINFO("MemAvailable:");
> +	sample = 0;
> +	diff_total = 0;
> +
> +	mem_avail_prev = SAFE_READ_MEMINFO("MemAvailable:");
>   	tst_timer_start(CLOCK_MONOTONIC);
>   
>   	/* leak about 100MB of RAM */
>   	for (i = 0; i < iterations; i++) {
>   		ioctl(fd, PERF_EVENT_IOC_SET_FILTER, "filter,0/0@abcd");
>   		check_progress(i);
> -	}
>   
> -	diff -= SAFE_READ_MEMINFO("MemAvailable:");
> +		/*
> +		 * Every 1200000 iterations, calculate the difference in memory
> +		 * availability. If the difference is greater than 10 * 1024 (10MB),
> +		 * increment the sample counter and log the event.
> +		 */
> +		if ((i % 1200000) == 0) {
> +			mem_avail = SAFE_READ_MEMINFO("MemAvailable:");
> +			diff = mem_avail_prev - mem_avail;
> +			diff_total += diff;
> +
> +			if (diff > 20 * 1024) {
> +				sample++;
> +				tst_res(TINFO, "MemAvailable decreased by %ld kB at iteration %d", diff, i);
> +			}
> +
> +			mem_avail_prev = mem_avail;
> +		}
> +	}
>   
> -	if (diff > 50 * 1024)
> -		tst_res(TFAIL, "Likely kernel memory leak detected");
> +	if ((sample > 5) || (diff_total > 100 * 1024))
> +		tst_res(TFAIL, "Likely kernel memory leak detected, total decrease: %ld kB", diff_total);
>   	else
>   		tst_res(TPASS, "No memory leak found");
>   }

-- 
Martin Doucha   mdoucha@suse.cz
SW Quality Engineer
SUSE LINUX, s.r.o.
CORSO IIa
Krizikova 148/34
186 00 Prague 8
Czech Republic



More information about the ltp mailing list