patch-2.1.91 linux/mm/page_alloc.c
Next file: linux/mm/swap.c
Previous file: linux/mm/mprotect.c
Back to the patch index
Back to the overall index
- Lines: 49
- Date:
Thu Mar 26 09:37:46 1998
- Orig file:
v2.1.90/linux/mm/page_alloc.c
- Orig date:
Tue Mar 17 22:18:15 1998
diff -u --recursive --new-file v2.1.90/linux/mm/page_alloc.c linux/mm/page_alloc.c
@@ -118,26 +118,33 @@
*
* [previously, there had to be two entries of the highest memory
* order, but this lead to problems on large-memory machines.]
+ *
+ * This will return zero if no list was found, non-zero
+ * if there was memory (the bigger, the better).
*/
-int free_memory_available(void)
+int free_memory_available(int nr)
{
- int i, retval = 0;
+ int retval = 0;
unsigned long flags;
struct free_area_struct * list = NULL;
+ list = free_area + NR_MEM_LISTS;
spin_lock_irqsave(&page_alloc_lock, flags);
/* We fall through the loop if the list contains one
* item. -- thanks to Colin Plumb <colin@nyx.net>
*/
- for (i = 1; i < 4; ++i) {
- list = free_area + NR_MEM_LISTS - i;
+ do {
+ list--;
+ /* Empty list? Bad - we need more memory */
if (list->next == memory_head(list))
break;
+ /* One item on the list? Look further */
if (list->next->next == memory_head(list))
continue;
- retval = 1;
+ /* More than one item? We're ok */
+ retval = nr + 1;
break;
- }
+ } while (--nr >= 0);
spin_unlock_irqrestore(&page_alloc_lock, flags);
return retval;
}
@@ -275,7 +282,7 @@
spin_lock_irqsave(&page_alloc_lock, flags);
RMQUEUE(order, maxorder, (gfp_mask & GFP_DMA));
spin_unlock_irqrestore(&page_alloc_lock, flags);
- if ((gfp_mask & __GFP_WAIT) && try_to_free_page(gfp_mask))
+ if ((gfp_mask & __GFP_WAIT) && try_to_free_pages(gfp_mask,SWAP_CLUSTER_MAX))
goto repeat;
nopage:
return 0;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov