Re: [PATCH] lib/test_free_pages: Add basic progress indicators

From: Mike Rapoport
Date: Sun Oct 18 2020 - 13:13:00 EST


On Sun, Oct 18, 2020 at 04:01:46PM +0100, Matthew Wilcox wrote:
> On Sun, Oct 18, 2020 at 04:39:27PM +0200, Geert Uytterhoeven wrote:
> > Hi Matthew,
> >
> > On Sun, Oct 18, 2020 at 4:25 PM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote:
> > > On Sun, Oct 18, 2020 at 04:04:45PM +0200, Geert Uytterhoeven wrote:
> > > > The test module to check that free_pages() does not leak memory does not
> > > > provide any feedback whatsoever its state or progress, but may take some
> > > > time on slow machines. Add the printing of messages upon starting each
> > > > phase of the test, and upon completion.
> > >
> > > It's not supposed to take a long time. Can you crank down that 1000 *
> >
> > It took 1m11s on ARAnyM, running on an i7-8700K.
> > Real hardware may even take longer.
>
> 71 seconds is clearly too long. 0.7 seconds would be fine, so 10 * 1000
> would be appropriate, but then that's only 320MB which might not be
> enough to notice on a modern machine.
>
> > > 1000 to something more appropriate?
> >
> > What would be a suitable value? You do want to see it "leak gigabytes
> > of memory and probably OOM your system" if something's wrong,
> > so decreasing the value a lot may not be a good idea?
> >
> > Regardless, if it OOMs, I think you do want to see this happens
> > while running this test.
>
> How about scaling with the amount of memory on the machine?
>
> This might cause problems on machines with terabytes of memory.
> Maybe we should cap it at a terabyte?

On ARAnyM wih 782 MBytes of RAM running on i7-8650U it takes ~1.75
seconds.
Still, I think adding some verbosity to the test wouldn't hurt ;-)

> diff --git a/lib/test_free_pages.c b/lib/test_free_pages.c
> index 074e76bd76b2..aa18fa52290a 100644
> --- a/lib/test_free_pages.c
> +++ b/lib/test_free_pages.c
> @@ -9,11 +9,11 @@
> #include <linux/mm.h>
> #include <linux/module.h>
>
> -static void test_free_pages(gfp_t gfp)
> +static void test_free_pages(gfp_t gfp, unsigned long totalram)
> {
> - unsigned int i;
> + unsigned long i, max = totalram / 8;
>
> - for (i = 0; i < 1000 * 1000; i++) {
> + for (i = 0; i < max; i++) {
> unsigned long addr = __get_free_pages(gfp, 3);
> struct page *page = virt_to_page(addr);
>
> @@ -26,8 +26,11 @@ static void test_free_pages(gfp_t gfp)
>
> static int m_in(void)
> {
> - test_free_pages(GFP_KERNEL);
> - test_free_pages(GFP_KERNEL | __GFP_COMP);
> + struct sysinfo si;
> +
> + si_meminfo(&si);
> + test_free_pages(GFP_KERNEL, si.totalram);
> + test_free_pages(GFP_KERNEL | __GFP_COMP, si.totalram);
>
> return 0;
> }

--
Sincerely yours,
Mike.