Messages in this thread |  | | | Date | Sat, 02 Aug 1997 14:56:48 -0400 | | From | Bill Hawes <> | | Subject | Re: Simple fix for swap_out (the 1st August patch) |
| |
Dr. Werner Fink wrote: > Hmmm ... in my current patch I'm use the follwing statement: > > if (nr_free_pages > 5) { > /* and repeat until we find something good */ > if (grow_buffers(GFP_ATOMIC, size)) { > needed -= PAGE_SIZE; > goto repeat; > }; > } > > wakeup_bdflush(1); > > that means if really low on mem or grow_buffers() fails wakeup_bdflush() > is called before refill_freelist() returns to the caller.
A wakeup_bdflush(1) will block for a while, so even if this task managed to free any buffers, the buffers will probably be used up by other tasks during the call to bdflush. So returning after wakeup probably won't help -- the task will just fall back into refill_freelist, and have to try for a full quota again. So it's probably better to keep the goto repeat after the wakeup.
The best place to test the free_list for early return is just before the call to wakeup_bdflush -- this is where you're most likely to have some buffers on the free list. And at this point you've only made one pass through the allocations, in order to minimize the amount of free page reserve converted into buffers.
I want to argue consistently that refill_freelist needs to return early, even with just one buffer, when the system is having memory problems. I went back and reviewed a patch Bernd Schmidt posted a while ago, and even though his approach to the problem was very different, he also returned early when memory problems were present.
Regards, Bill
|  |