DragonFly BSD
DragonFly kernel List (threaded) for 2003-09
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: Tentitive (untested) ISA DMA space allocation fix.


From: Matthew Dillon <dillon@xxxxxxxxxxxxxxxxxxxx>
Date: Sun, 14 Sep 2003 10:50:12 -0700 (PDT)

    Scrap the old patch, it was still allocating low memory first
    in some cases and I improperly reversed the loop.  Here is a new,
    better one.

    I don't know if this will solve David's issue with twe.  If not
    then hopefully I will be able to track it down when I get my TWE
    card in about two weeks.  I'll also take a quick look at the TWE
    code to see if there is something obvious.

					-Matt

Index: vm/vm_page.c
===================================================================
RCS file: /cvs/src/sys/vm/vm_page.c,v
retrieving revision 1.9
diff -u -r1.9 vm_page.c
--- vm/vm_page.c	27 Aug 2003 01:43:08 -0000	1.9
+++ vm/vm_page.c	14 Sep 2003 17:44:50 -0000
@@ -150,13 +150,18 @@
 /*
  *	vm_add_new_page:
  *
- *	Add a new page to the freelist for use by the system.
+ *	Add a new page to the freelist for use by the system.  New pages
+ *	are added to both the head and tail of the associated free page
+ *	queue in a bottom-up fashion, so both zero'd and non-zero'd page
+ *	requests pull 'recent' adds (higher physical addresses) first.
+ *
  *	Must be called at splhigh().
  */
 vm_page_t
 vm_add_new_page(vm_offset_t pa)
 {
 	vm_page_t m;
+	struct vpgqueues *vpq;
 
 	++vmstats.v_page_count;
 	++vmstats.v_free_count;
@@ -165,7 +170,12 @@
 	m->flags = 0;
 	m->pc = (pa >> PAGE_SHIFT) & PQ_L2_MASK;
 	m->queue = m->pc + PQ_FREE;
-	TAILQ_INSERT_HEAD(&vm_page_queues[m->queue].pl, m, pageq);
+	vpq = &vm_page_queues[m->queue];
+	if (vpq->flipflop)
+		TAILQ_INSERT_TAIL(&vpq->pl, m, pageq);
+	else
+		TAILQ_INSERT_HEAD(&vpq->pl, m, pageq);
+	vpq->flipflop = 1 - vpq->flipflop;
 	vm_page_queues[m->queue].lcnt++;
 	return (m);
 }
@@ -304,7 +314,7 @@
 	vm_page_array_size = page_range;
 
 	/*
-	 * Construct the free queue(s) in descending order (by physical
+	 * Construct the free queue(s) in ascending order (by physical
 	 * address) so that the first 16MB of physical memory is allocated
 	 * last rather than first.  On large-memory machines, this avoids
 	 * the exhaustion of low physical memory before isa_dmainit has run.
Index: vm/vm_page.h
===================================================================
RCS file: /cvs/src/sys/vm/vm_page.h,v
retrieving revision 1.5
diff -u -r1.5 vm_page.h
--- vm/vm_page.h	26 Jul 2003 22:10:02 -0000	1.5
+++ vm/vm_page.h	14 Sep 2003 17:39:04 -0000
@@ -215,6 +215,7 @@
 	struct pglist pl;
 	int	*cnt;
 	int	lcnt;
+	int	flipflop;	/* probably not the best place */
 };
 
 extern struct vpgqueues vm_page_queues[PQ_COUNT];



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