[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH RFC] higher order allocs 2.4.10-pre9-recycle-R1



On Sun, 16 Sep 2001, Roger Larsson wrote:

> I have made some test runs - results are close to proper 2.4.10-pre9
> actually slightly better for all but two of mine testcases.
> diff of two files bigger than RAM got half throughput, why???
> mmap002 (use all memory attempt) took more than three times as long -
> less memory to use at once, OK. And not necessarily a bad thing.

These "test runs" are completely unrelated to memory fragmentation.
I don't know what you're thinking, but you could at least test the
thing you're trying to fix ...

regards,

Rik
-- 
IA64: a worthy successor to i860.

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)
*******************************************
Patch prepared by: roger.larsson@norran.net
Name of file: /home/roger/patches/patch-2.4.10-pre9-recycle-R1

--- linux/mm/page_alloc.c.orig	Sat Sep 15 17:30:32 2001
+++ linux/mm/page_alloc.c	Sun Sep 16 00:01:24 2001
@@ -104,7 +104,12 @@
 
 	spin_lock_irqsave(&zone->lock, flags);
 
-	zone->free_pages -= mask;
+	area->recycled++;
+	if (area->recycled <= 0)
+		area->recycled=1;
+
+	if (!order || area->recycled < 0)
+		zone->free_pages -= mask;
 
 	while (mask + (1 << (MAX_ORDER-1))) {
 		struct page *buddy1, *buddy2;
@@ -193,9 +198,14 @@
 			index = page - zone->zone_mem_map;
 			if (curr_order != MAX_ORDER-1)
 				MARK_USED(index, curr_order, area);
-			zone->free_pages -= 1 << order;
 
 			page = expand(zone, page, index, order, curr_order, area);
+			/* use initial area, requested order */
+			area=zone->free_area + order;
+			area->recycled--; /* might go neg, fixed in free */
+			if (!order || area->recycled < 0)
+				zone->free_pages -= 1 << order;
+
 			spin_unlock_irqrestore(&zone->lock, flags);
 
 			set_page_count(page, 1);
@@ -653,7 +663,8 @@
 		if (zone->size) {
 			spin_lock_irqsave(&zone->lock, flags);
 		 	for (order = 0; order < MAX_ORDER; order++) {
-				head = &(zone->free_area + order)->free_list;
+				free_area_t *area = zone->free_area + order;
+				head = &area->free_list;
 				curr = head;
 				nr = 0;
 				for (;;) {
@@ -663,8 +674,9 @@
 					nr++;
 				}
 				total += nr * (1 << order);
-				printk("%lu*%lukB ", nr,
-						(PAGE_SIZE>>10) << order);
+				printk("%lu/%ld*%lukB ", nr,
+				       area->recycled,
+				       (PAGE_SIZE>>10) << order);
 			}
 			spin_unlock_irqrestore(&zone->lock, flags);
 		}
@@ -891,6 +903,7 @@
 			bitmap_size = LONG_ALIGN(bitmap_size+1);
 			zone->free_area[i].map = 
 			  (unsigned long *) alloc_bootmem_node(pgdat, bitmap_size);
+			zone->free_area[i].recycled = 0;
 		}
 	}
 	build_zonelists(pgdat);
--- linux/include/linux/mmzone.h.orig	Sat Sep 15 21:58:47 2001
+++ linux/include/linux/mmzone.h	Sat Sep 15 22:01:29 2001
@@ -21,6 +21,7 @@
 typedef struct free_area_struct {
 	struct list_head	free_list;
 	unsigned long		*map;
+	long                    recycled;
 } free_area_t;
 
 struct pglist_data;