From owner-p4-projects Tue Jun 18 23:54:41 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1D55937B40B; Tue, 18 Jun 2002 23:54:16 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 3664C37B40C for ; Tue, 18 Jun 2002 23:54:15 -0700 (PDT) Received: (from perforce@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g5J6sE308271 for perforce@freebsd.org; Tue, 18 Jun 2002 23:54:14 -0700 (PDT) (envelope-from peter@freebsd.org) Date: Tue, 18 Jun 2002 23:54:14 -0700 (PDT) Message-Id: <200206190654.g5J6sE308271@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm Subject: PERFORCE change 13138 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG 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