linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3
@ 2009-05-14 14:15 MinChan Kim
  2009-05-14 14:27 ` KOSAKI Motohiro
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: MinChan Kim @ 2009-05-14 14:15 UTC (permalink / raw)
  To: Andrew Morton, LKML, linux-mm
  Cc: KOSAKI Motohiro, Johannes Weiner, Rik van Riel

Changelog since V3
 o Remove can_reclaim_anon. 
 o Add nr_swap_page > 0 in only shrink_zone - By Rik's advise.
 o Change patch description.

Changelog since V2
 o Add new function - can_reclaim_anon : it tests anon_list can be reclaim.

Changelog since V1
 o Use nr_swap_pages <= 0 in shrink_active_list to prevent scanning  of active anon list.

Now shrink_zone can deactivate active anon pages even if we don't have a swap device. 
Many embedded products don't have a swap device. So the deactivation of anon pages is unnecessary. 

This patch prevents unnecessary deactivation of anon lru pages.
But, it don't prevent aging of anon pages to swap out.

Thanks for good review. Rik and Kosaki.  

Signed-off-by: Minchan Kim <minchan.kim@gmail.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Rik van Riel <riel@redhat.com>

---
 mm/vmscan.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 2f9d555..621708f 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
 	 * Even if we did not try to evict anon pages at all, we want to
 	 * rebalance the anon lru active/inactive ratio.
 	 */
-	if (inactive_anon_is_low(zone, sc))
+	if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
 		shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);
 
 	throttle_vm_writeout(sc->gfp_mask);
-- 
1.5.4.3


-- 
Kinds Regards,
Minchan Kim 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case  of no swap space V3
  2009-05-14 14:15 [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3 MinChan Kim
@ 2009-05-14 14:27 ` KOSAKI Motohiro
  2009-05-14 14:39   ` Minchan Kim
  2009-05-14 15:25 ` Rik van Riel
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: KOSAKI Motohiro @ 2009-05-14 14:27 UTC (permalink / raw)
  To: MinChan Kim; +Cc: Andrew Morton, LKML, linux-mm, Johannes Weiner, Rik van Riel

>  mm/vmscan.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 2f9d555..621708f 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
>         * Even if we did not try to evict anon pages at all, we want to
>         * rebalance the anon lru active/inactive ratio.
>         */
> -       if (inactive_anon_is_low(zone, sc))
> +       if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
>                shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);


       if (nr_swap_pages > 0 && inactive_anon_is_low(zone, sc))

is better?
compiler can't swap evaluate order around &&.

then,

    if ( 0 && inactive_anon_is_low(zone, sc))

and

    if (inactive_anon_is_low(zone, sc) && 0)

are different.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case  of no swap space V3
  2009-05-14 14:27 ` KOSAKI Motohiro
@ 2009-05-14 14:39   ` Minchan Kim
  2009-05-14 14:54     ` KOSAKI Motohiro
  2009-05-14 16:22     ` Johannes Weiner
  0 siblings, 2 replies; 11+ messages in thread
From: Minchan Kim @ 2009-05-14 14:39 UTC (permalink / raw)
  To: KOSAKI Motohiro
  Cc: MinChan Kim, Andrew Morton, LKML, linux-mm, Johannes Weiner,
	Rik van Riel

On Thu, May 14, 2009 at 11:27 PM, KOSAKI Motohiro
<kosaki.motohiro@jp.fujitsu.com> wrote:
>>  mm/vmscan.c |    2 +-
>>  1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/mm/vmscan.c b/mm/vmscan.c
>> index 2f9d555..621708f 100644
>> --- a/mm/vmscan.c
>> +++ b/mm/vmscan.c
>> @@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
>>         * Even if we did not try to evict anon pages at all, we want to
>>         * rebalance the anon lru active/inactive ratio.
>>         */
>> -       if (inactive_anon_is_low(zone, sc))
>> +       if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
>>                shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);
>
>
>       if (nr_swap_pages > 0 && inactive_anon_is_low(zone, sc))
>
> is better?
> compiler can't swap evaluate order around &&.

If GCC optimizes away that branch with CONFIG_SWAP=n as Rik mentioned,
we don't have a concern.

-- 
Thanks,
Minchan Kim

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case  of no swap space V3
  2009-05-14 14:39   ` Minchan Kim
@ 2009-05-14 14:54     ` KOSAKI Motohiro
  2009-05-14 16:22     ` Johannes Weiner
  1 sibling, 0 replies; 11+ messages in thread
From: KOSAKI Motohiro @ 2009-05-14 14:54 UTC (permalink / raw)
  To: Minchan Kim
  Cc: MinChan Kim, Andrew Morton, LKML, linux-mm, Johannes Weiner,
	Rik van Riel

2009/5/14 Minchan Kim <barrioskmc@gmail.com>:
> On Thu, May 14, 2009 at 11:27 PM, KOSAKI Motohiro
> <kosaki.motohiro@jp.fujitsu.com> wrote:
>>>  mm/vmscan.c |    2 +-
>>>  1 files changed, 1 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/mm/vmscan.c b/mm/vmscan.c
>>> index 2f9d555..621708f 100644
>>> --- a/mm/vmscan.c
>>> +++ b/mm/vmscan.c
>>> @@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
>>>         * Even if we did not try to evict anon pages at all, we want to
>>>         * rebalance the anon lru active/inactive ratio.
>>>         */
>>> -       if (inactive_anon_is_low(zone, sc))
>>> +       if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
>>>                shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);
>>
>>
>>       if (nr_swap_pages > 0 && inactive_anon_is_low(zone, sc))
>>
>> is better?
>> compiler can't swap evaluate order around &&.
>
> If GCC optimizes away that branch with CONFIG_SWAP=n as Rik mentioned,
> we don't have a concern.

ok. I ack this.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3
  2009-05-14 14:15 [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3 MinChan Kim
  2009-05-14 14:27 ` KOSAKI Motohiro
@ 2009-05-14 15:25 ` Rik van Riel
  2009-05-14 16:30 ` Andrew Morton
  2009-05-18  2:34 ` Wu Fengguang
  3 siblings, 0 replies; 11+ messages in thread
From: Rik van Riel @ 2009-05-14 15:25 UTC (permalink / raw)
  To: MinChan Kim
  Cc: Andrew Morton, LKML, linux-mm, KOSAKI Motohiro, Johannes Weiner

MinChan Kim wrote:

> This patch prevents unnecessary deactivation of anon lru pages.
> But, it don't prevent aging of anon pages to swap out.

> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
>  	 * Even if we did not try to evict anon pages at all, we want to
>  	 * rebalance the anon lru active/inactive ratio.
>  	 */
> -	if (inactive_anon_is_low(zone, sc))
> +	if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
>  		shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);
>  
>  	throttle_vm_writeout(sc->gfp_mask);

Acked-by: Rik van Riel <riel@redhat.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3
  2009-05-14 14:39   ` Minchan Kim
  2009-05-14 14:54     ` KOSAKI Motohiro
@ 2009-05-14 16:22     ` Johannes Weiner
  2009-05-15  1:28       ` Minchan Kim
  1 sibling, 1 reply; 11+ messages in thread
From: Johannes Weiner @ 2009-05-14 16:22 UTC (permalink / raw)
  To: Minchan Kim
  Cc: KOSAKI Motohiro, MinChan Kim, Andrew Morton, LKML, linux-mm,
	Rik van Riel

On Thu, May 14, 2009 at 11:39:49PM +0900, Minchan Kim wrote:
> On Thu, May 14, 2009 at 11:27 PM, KOSAKI Motohiro
> <kosaki.motohiro@jp.fujitsu.com> wrote:
> >>  mm/vmscan.c |    2 +-
> >>  1 files changed, 1 insertions(+), 1 deletions(-)
> >>
> >> diff --git a/mm/vmscan.c b/mm/vmscan.c
> >> index 2f9d555..621708f 100644
> >> --- a/mm/vmscan.c
> >> +++ b/mm/vmscan.c
> >> @@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
> >>         * Even if we did not try to evict anon pages at all, we want to
> >>         * rebalance the anon lru active/inactive ratio.
> >>         */
> >> -       if (inactive_anon_is_low(zone, sc))
> >> +       if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
> >>                shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);
> >
> >
> >       if (nr_swap_pages > 0 && inactive_anon_is_low(zone, sc))
> >
> > is better?
> > compiler can't swap evaluate order around &&.
> 
> If GCC optimizes away that branch with CONFIG_SWAP=n as Rik mentioned,
> we don't have a concern.

It can only optimize it away when the condition is a compile time
constant.

But inactive_anon_is_low() contains atomic operations which the
compiler is not allowed to drop and so the && semantics lead to

	atomic_read() && 0

emitting the read while still knowing the whole expression is 0 at
compile-time, optimizing away only the branch itself but leaving the
read in place!

Compared to

	0 && atomic_read()

where the && short-circuitry leads to atomic_read() not being
executed.  And since the 0 is a compile time constant, no code has to
be emitted for the read.

So KOSAKI-san's is right.  Your version results in bigger object code.

	Hannes

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3
  2009-05-14 14:15 [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3 MinChan Kim
  2009-05-14 14:27 ` KOSAKI Motohiro
  2009-05-14 15:25 ` Rik van Riel
@ 2009-05-14 16:30 ` Andrew Morton
  2009-05-14 17:26   ` Rik van Riel
  2009-05-18  2:34 ` Wu Fengguang
  3 siblings, 1 reply; 11+ messages in thread
From: Andrew Morton @ 2009-05-14 16:30 UTC (permalink / raw)
  To: MinChan Kim; +Cc: linux-kernel, linux-mm, kosaki.motohiro, hannes, riel

On Thu, 14 May 2009 23:15:55 +0900
MinChan Kim <minchan.kim@gmail.com> wrote:

> Now shrink_zone can deactivate active anon pages even if we don't have a swap device. 
> Many embedded products don't have a swap device. So the deactivation of anon pages is unnecessary. 

Does shrink_list() need to scan the anon LRUs at all if there's no swap
online?


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3
  2009-05-14 16:30 ` Andrew Morton
@ 2009-05-14 17:26   ` Rik van Riel
  0 siblings, 0 replies; 11+ messages in thread
From: Rik van Riel @ 2009-05-14 17:26 UTC (permalink / raw)
  To: Andrew Morton
  Cc: MinChan Kim, linux-kernel, linux-mm, kosaki.motohiro, hannes

Andrew Morton wrote:
> On Thu, 14 May 2009 23:15:55 +0900
> MinChan Kim <minchan.kim@gmail.com> wrote:
> 
>> Now shrink_zone can deactivate active anon pages even if we don't have a swap device. 
>> Many embedded products don't have a swap device. So the deactivation of anon pages is unnecessary. 
> 
> Does shrink_list() need to scan the anon LRUs at all if there's no swap
> online?

It doesn't.  Get_scan_ratio() will return 0 as the
anon percentage if no swap is online.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case  of no swap space V3
  2009-05-14 16:22     ` Johannes Weiner
@ 2009-05-15  1:28       ` Minchan Kim
  0 siblings, 0 replies; 11+ messages in thread
From: Minchan Kim @ 2009-05-15  1:28 UTC (permalink / raw)
  To: Johannes Weiner
  Cc: Minchan Kim, KOSAKI Motohiro, Andrew Morton, LKML, linux-mm,
	Rik van Riel

On Fri, May 15, 2009 at 1:22 AM, Johannes Weiner <hannes@cmpxchg.org> wrote:
> On Thu, May 14, 2009 at 11:39:49PM +0900, Minchan Kim wrote:
>> On Thu, May 14, 2009 at 11:27 PM, KOSAKI Motohiro
>> <kosaki.motohiro@jp.fujitsu.com> wrote:
>> >>  mm/vmscan.c |    2 +-
>> >>  1 files changed, 1 insertions(+), 1 deletions(-)
>> >>
>> >> diff --git a/mm/vmscan.c b/mm/vmscan.c
>> >> index 2f9d555..621708f 100644
>> >> --- a/mm/vmscan.c
>> >> +++ b/mm/vmscan.c
>> >> @@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
>> >>         * Even if we did not try to evict anon pages at all, we want to
>> >>         * rebalance the anon lru active/inactive ratio.
>> >>         */
>> >> -       if (inactive_anon_is_low(zone, sc))
>> >> +       if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
>> >>                shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);
>> >
>> >
>> >       if (nr_swap_pages > 0 && inactive_anon_is_low(zone, sc))
>> >
>> > is better?
>> > compiler can't swap evaluate order around &&.
>>
>> If GCC optimizes away that branch with CONFIG_SWAP=n as Rik mentioned,
>> we don't have a concern.
>
> It can only optimize it away when the condition is a compile time
> constant.
>
> But inactive_anon_is_low() contains atomic operations which the
> compiler is not allowed to drop and so the && semantics lead to
>
>        atomic_read() && 0
>
> emitting the read while still knowing the whole expression is 0 at
> compile-time, optimizing away only the branch itself but leaving the
> read in place!
>
> Compared to
>
>        0 && atomic_read()
>
> where the && short-circuitry leads to atomic_read() not being
> executed.  And since the 0 is a compile time constant, no code has to
> be emitted for the read.
>
> So KOSAKI-san's is right.  Your version results in bigger object code.

You're right.  I realized it from you.
I will repost this.
Thanks for great review, Hannes :)

>        Hannes
>



-- 
Kinds regards,
Minchan Kim

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3
  2009-05-14 14:15 [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3 MinChan Kim
                   ` (2 preceding siblings ...)
  2009-05-14 16:30 ` Andrew Morton
@ 2009-05-18  2:34 ` Wu Fengguang
  2009-05-18  2:40   ` Minchan Kim
  3 siblings, 1 reply; 11+ messages in thread
From: Wu Fengguang @ 2009-05-18  2:34 UTC (permalink / raw)
  To: MinChan Kim
  Cc: Andrew Morton, LKML, linux-mm, KOSAKI Motohiro, Johannes Weiner,
	Rik van Riel

On Thu, May 14, 2009 at 11:15:55PM +0900, MinChan Kim wrote:
 
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 2f9d555..621708f 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
>  	 * Even if we did not try to evict anon pages at all, we want to
>  	 * rebalance the anon lru active/inactive ratio.
>  	 */
> -	if (inactive_anon_is_low(zone, sc))
> +	if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
>  		shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);

There's another "if (inactive_anon_is_low) shrink_active_list;"
occurrence to be fixed in balance_pgdat()? Otherwise:

Acked-by: Wu Fengguang <fengguang.wu@intel.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3
  2009-05-18  2:34 ` Wu Fengguang
@ 2009-05-18  2:40   ` Minchan Kim
  0 siblings, 0 replies; 11+ messages in thread
From: Minchan Kim @ 2009-05-18  2:40 UTC (permalink / raw)
  To: Wu Fengguang
  Cc: MinChan Kim, Andrew Morton, LKML, linux-mm, KOSAKI Motohiro,
	Johannes Weiner, Rik van Riel

On Mon, 18 May 2009 10:34:04 +0800
Wu Fengguang <fengguang.wu@intel.com> wrote:

> On Thu, May 14, 2009 at 11:15:55PM +0900, MinChan Kim wrote:
>  
> > diff --git a/mm/vmscan.c b/mm/vmscan.c
> > index 2f9d555..621708f 100644
> > --- a/mm/vmscan.c
> > +++ b/mm/vmscan.c
> > @@ -1577,7 +1577,7 @@ static void shrink_zone(int priority, struct zone *zone,
> >  	 * Even if we did not try to evict anon pages at all, we want to
> >  	 * rebalance the anon lru active/inactive ratio.
> >  	 */
> > -	if (inactive_anon_is_low(zone, sc))
> > +	if (inactive_anon_is_low(zone, sc) && nr_swap_pages > 0)
> >  		shrink_active_list(SWAP_CLUSTER_MAX, zone, sc, priority, 0);
> 
> There's another "if (inactive_anon_is_low) shrink_active_list;"
> occurrence to be fixed in balance_pgdat()? Otherwise:

I add Rik's comment. Of course, I agree his opinion. 

"If we are close to running out of swap space, with
swapins freeing up swap space on a regular basis,
I believe we do want to do aging on the active
pages, just so we can pick a decent page to swap
out next time swap space becomes available."

> Acked-by: Wu Fengguang <fengguang.wu@intel.com>

Thanks for spending your time for my patch. Wu Fengguang :)

-- 
Kinds Regards
Minchan Kim

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2009-05-18  2:41 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-14 14:15 [PATCH] mmtom: Prevent shrinking of active anon lru list in case of no swap space V3 MinChan Kim
2009-05-14 14:27 ` KOSAKI Motohiro
2009-05-14 14:39   ` Minchan Kim
2009-05-14 14:54     ` KOSAKI Motohiro
2009-05-14 16:22     ` Johannes Weiner
2009-05-15  1:28       ` Minchan Kim
2009-05-14 15:25 ` Rik van Riel
2009-05-14 16:30 ` Andrew Morton
2009-05-14 17:26   ` Rik van Riel
2009-05-18  2:34 ` Wu Fengguang
2009-05-18  2:40   ` Minchan Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).