[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