Messages in this thread | ![/](/images/icornerl.gif) | | From | KOSAKI Motohiro <> | Subject | Re: Free memory never fully used, swapping | Date | Fri, 26 Nov 2010 20:03:04 +0900 (JST) |
| |
Two points.
> @@ -2310,10 +2324,12 @@ loop_again: > * spectulatively avoid congestion waits > */ > zone_clear_flag(zone, ZONE_CONGESTED); > + if (i <= pgdat->high_zoneidx) > + any_zone_ok = 1; > } > > } > - if (all_zones_ok) > + if (all_zones_ok || (order && any_zone_ok)) > break; /* kswapd: all done */ > /* > * OK, kswapd is getting into trouble. Take a nap, then take > @@ -2336,7 +2352,7 @@ loop_again: > break; > } > out: > - if (!all_zones_ok) { > + if (!(all_zones_ok || (order && any_zone_ok))) {
This doesn't work ;) kswapd have to clear ZONE_CONGESTED flag before enter sleeping. otherwise nobody can clear it.
Say, we have to fill below condition. - All zone are successing zone_watermark_ok(order-0) - At least one zone are successing zone_watermark_ok(high-order)
> @@ -2417,6 +2439,7 @@ static int kswapd(void *p) > prepare_to_wait(&pgdat->kswapd_wait, &wait, TASK_INTERRUPTIBLE); > new_order = pgdat->kswapd_max_order; > pgdat->kswapd_max_order = 0; > + pgdat->high_zoneidx = MAX_ORDER;
I don't think MAX_ORDER is correct ;)
high_zoneidx = pgdat->high_zoneidx; pgdat->high_zoneidx = pgdat->nr_zones - 1;
?
And, we have another kswapd_max_order reading place. (after kswapd_try_to_sleep) We need it too.
| ![\](/images/icornerr.gif) |