Re: kswapd @ 60-80% CPU during heavy HD i/o.

From: David S. Miller (davem@redhat.com)
Date: Mon May 01 2000 - 20:13:26 EST


   Date: Mon, 1 May 2000 22:03:35 -0300 (BRST)
   From: Rik van Riel <riel@conectiva.com.br>

   On Mon, 1 May 2000, David S. Miller wrote:

> BTW, what loop are you trying to "continue;" out of here?
>
> + do {
> if (tsk->need_resched)
> schedule();
> if ((!zone->size) || (!zone->zone_wake_kswapd))
> continue;
> do_try_to_free_pages(GFP_KSWAPD, zone);
> + } while (zone->free_pages < zone->pages_low &&
> + --count);
>
> :-) Just add a "next_zone:" label at the end of that code and
> change the continue; to a goto next_zone;

   I want kswapd to continue with freeing pages from this zone if
   there aren't enough free pages in this zone. This is needed
   because kswapd used to stop freeing pages even if we were below
   pages_min...

Rik, zone_wake_kswapd implies this information, via what
__free_pages_ok does to that flag.

I see it like this:

        if "!zone->size || !zone->zone_wake_kswapd"

                then zone->free_pages >= zone->pages_high by
                implication

Therefore when the continue happens, the loop will currently just
execute:

        if (!zone->size || !zone->zone_wake_kswapd)
                continue;
    ...
        } while (zone->free_pages < zone->pages_low &&

and the while condition is false and therefore will branch out of the
loop. __free_pages_ok _always_ clears the zone_wake_kswapd flag when
zone->free_pages goes beyond zone->pages_high.

Later,
David S. Miller
davem@redhat.com

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun May 07 2000 - 21:00:09 EST