Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Jun 2002 23:54:14 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 13138 for review
Message-ID:  <200206190654.g5J6sE308271@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=13138

Change 13138 by peter@peter_ia64 on 2002/06/18 23:53:23

	Use the canonical uarea management. (cut/pasted from sparc64)
	We dont need the contigmalloc slowdown for this - that was needed
	for the kernel stack only.

Affected files ...

... //depot/projects/ia64/sys/ia64/ia64/pmap.c#22 edit

Differences ...

==== //depot/projects/ia64/sys/ia64/ia64/pmap.c#22 (text+ko) ====

@@ -713,26 +713,55 @@
 void
 pmap_new_proc(struct proc *p)
 {
-	struct user *up;
+	vm_page_t ma[UAREA_PAGES];
+	vm_object_t upobj;
+	vm_offset_t up;
+	vm_page_t m;
+	u_int i;
+
+	/*
+	 * Allocate object for the upages.
+	 */
+	upobj = p->p_upages_obj;
+	if (upobj == NULL) {
+		upobj = vm_object_allocate(OBJT_DEFAULT, UAREA_PAGES);
+		p->p_upages_obj = upobj;
+	}
 
 	/*
-	 * Use contigmalloc for user area so that we can use a region
-	 * 7 address for it which makes it impossible to accidentally
-	 * lose when recording a trapframe.
+	 * Get a kernel virtual address for the U area for this process.
 	 */
-	up = contigmalloc(UAREA_PAGES * PAGE_SIZE, M_PMAP,
-			  M_WAITOK,
-			  0ul,
-			  256*1024*1024 - 1,
-			  PAGE_SIZE,
-			  256*1024*1024);
+	up = (vm_offset_t)p->p_uarea;
+	if (up == 0) {
+		up = kmem_alloc_nofault(kernel_map, UAREA_PAGES * PAGE_SIZE);
+		if (up == 0)
+			panic("pmap_new_proc: upage allocation failed");
+		p->p_uarea = (struct user *)up;
+	}
+
+	for (i = 0; i < UAREA_PAGES; i++) {
+		/*
+		 * Get a uarea page.
+		 */
+		m = vm_page_grab(upobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
+		ma[i] = m;
+
+		/*
+		 * Wire the page.
+		 */
+		m->wire_count++;
+		cnt.v_wire_count++;
+
+		vm_page_wakeup(m);
+		vm_page_flag_clear(m, PG_ZERO);
+		vm_page_flag_set(m, PG_MAPPED | PG_WRITEABLE);
+		m->valid = VM_PAGE_BITS_ALL;
+	}
 
-	if (up == NULL)
-		panic("pmap_new_proc: could not contigmalloc %d pages\n",
-		    UAREA_PAGES);
-	p->p_md.md_uservirt = up;
-	p->p_uarea = (struct user *)
-		IA64_PHYS_TO_RR7(ia64_tpa((u_int64_t) up));
+	/*
+	 * Enter the pages into the kernel address space.
+	 */
+	pmap_qenter(up, ma, UAREA_PAGES);
 }
 
 /*
@@ -742,9 +771,32 @@
 void
 pmap_dispose_proc(struct proc *p)
 {
-	contigfree(p->p_md.md_uservirt, UAREA_PAGES * PAGE_SIZE, M_PMAP);
-	p->p_md.md_uservirt = 0;
-	p->p_uarea = 0;
+	vm_object_t upobj;
+	vm_offset_t up;
+	vm_page_t m;
+	int i;
+
+	upobj = p->p_upages_obj;
+	up = (vm_offset_t)p->p_uarea;
+	for (i = 0; i < UAREA_PAGES; i++) {
+		m = vm_page_lookup(upobj, i);
+		if (m == NULL)
+			panic("pmap_dispose_proc: upage already missing?");
+		vm_page_busy(m);
+		vm_page_unwire(m, 0);
+		vm_page_free(m);
+	}
+	pmap_qremove(up, UAREA_PAGES);
+
+	/*
+	 * If the process got swapped out some of its UPAGES might have gotten
+	 * swapped.  Just get rid of the object to clean up the swap use
+	 * proactively.  NOTE! might block waiting for paging I/O to complete.
+	 */
+	if (upobj->type == OBJT_SWAP) {
+		p->p_upages_obj = NULL;
+		vm_object_deallocate(upobj);
+	}
 }
 
 /*
@@ -753,6 +805,21 @@
 void
 pmap_swapout_proc(struct proc *p)
 {
+	vm_object_t upobj;
+	vm_offset_t up;
+	vm_page_t m;
+	int i;
+
+	upobj = p->p_upages_obj;
+	up = (vm_offset_t)p->p_uarea;
+	for (i = 0; i < UAREA_PAGES; i++) {
+		m = vm_page_lookup(upobj, i);
+		if (m == NULL)
+			panic("pmap_swapout_proc: upage already missing?");
+		vm_page_dirty(m);
+		vm_page_unwire(m, 0);
+	}
+	pmap_qremove(up, UAREA_PAGES);
 }
 
 /*
@@ -761,6 +828,30 @@
 void
 pmap_swapin_proc(struct proc *p)
 {
+	vm_page_t ma[UAREA_PAGES];
+	vm_object_t upobj;
+	vm_offset_t up;
+	vm_page_t m;
+	int rv;
+	int i;
+
+	upobj = p->p_upages_obj;
+	up = (vm_offset_t)p->p_uarea;
+	for (i = 0; i < UAREA_PAGES; i++) {
+		m = vm_page_grab(upobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
+		if (m->valid != VM_PAGE_BITS_ALL) {
+			rv = vm_pager_get_pages(upobj, &m, 1, 0);
+			if (rv != VM_PAGER_OK)
+				panic("pmap_swapin_proc: cannot get upage");
+			m = vm_page_lookup(upobj, i);
+			m->valid = VM_PAGE_BITS_ALL;
+		}
+		ma[i] = m;
+		vm_page_wire(m);
+		vm_page_wakeup(m);
+		vm_page_flag_set(m, PG_MAPPED | PG_WRITEABLE);
+	}
+	pmap_qenter(up, ma, UAREA_PAGES);
 }
 
 /*

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe p4-projects" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200206190654.g5J6sE308271>