diff options
author | Ariane van der Steldt <ariane@cvs.openbsd.org> | 2009-06-01 17:42:34 +0000 |
---|---|---|
committer | Ariane van der Steldt <ariane@cvs.openbsd.org> | 2009-06-01 17:42:34 +0000 |
commit | d30afc0ec38415711bc30130e9412a6026468e8b (patch) | |
tree | ee3b3b40a267f69f54dca2c401c95db8de083c91 /sys/arch/i386 | |
parent | f5deafb272a62d5cf541c0d5ded06c603823ad2f (diff) |
physmem allocator: change the view of free memory from single free pages
to free ranges.
Classify memory based on region with associated use-counter (which is used
to construct a priority list of where to allocate memory).
Based on code from tedu@, help from many.
Ok art@
Diffstat (limited to 'sys/arch/i386')
-rw-r--r-- | sys/arch/i386/i386/pmap.c | 11 | ||||
-rw-r--r-- | sys/arch/i386/i386/pmapae.c | 15 | ||||
-rw-r--r-- | sys/arch/i386/include/vmparam.h | 9 |
3 files changed, 22 insertions, 13 deletions
diff --git a/sys/arch/i386/i386/pmap.c b/sys/arch/i386/i386/pmap.c index 753298eb42a..91fd6edb555 100644 --- a/sys/arch/i386/i386/pmap.c +++ b/sys/arch/i386/i386/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.136 2009/02/05 01:13:21 oga Exp $ */ +/* $OpenBSD: pmap.c,v 1.137 2009/06/01 17:42:33 ariane Exp $ */ /* $NetBSD: pmap.c,v 1.91 2000/06/02 17:46:37 thorpej Exp $ */ /* @@ -2074,7 +2074,7 @@ pmap_do_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva, int flags) /* If PTP is no longer being used, free it. */ if (ptp && ptp->wire_count <= 1) { pmap_drop_ptp(pmap, va, ptp, ptes); - TAILQ_INSERT_TAIL(&empty_ptps, ptp, listq); + TAILQ_INSERT_TAIL(&empty_ptps, ptp, fq.queues.listq); } if (!shootall) @@ -2088,7 +2088,7 @@ pmap_do_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva, int flags) pmap_unmap_ptes(pmap); PMAP_MAP_TO_HEAD_UNLOCK(); while ((ptp = TAILQ_FIRST(&empty_ptps)) != NULL) { - TAILQ_REMOVE(&empty_ptps, ptp, listq); + TAILQ_REMOVE(&empty_ptps, ptp, fq.queues.listq); uvm_pagefree(ptp); } } @@ -2145,7 +2145,8 @@ pmap_page_remove(struct vm_page *pg) if (pve->pv_ptp && --pve->pv_ptp->wire_count <= 1) { pmap_drop_ptp(pve->pv_pmap, pve->pv_va, pve->pv_ptp, ptes); - TAILQ_INSERT_TAIL(&empty_ptps, pve->pv_ptp, listq); + TAILQ_INSERT_TAIL(&empty_ptps, pve->pv_ptp, + fq.queues.listq); } pmap_tlb_shootpage(pve->pv_pmap, pve->pv_va); @@ -2158,7 +2159,7 @@ pmap_page_remove(struct vm_page *pg) pmap_tlb_shootwait(); while ((ptp = TAILQ_FIRST(&empty_ptps)) != NULL) { - TAILQ_REMOVE(&empty_ptps, ptp, listq); + TAILQ_REMOVE(&empty_ptps, ptp, fq.queues.listq); uvm_pagefree(ptp); } } diff --git a/sys/arch/i386/i386/pmapae.c b/sys/arch/i386/i386/pmapae.c index 683d282379a..b13ff7c9463 100644 --- a/sys/arch/i386/i386/pmapae.c +++ b/sys/arch/i386/i386/pmapae.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmapae.c,v 1.15 2009/01/27 22:14:13 miod Exp $ */ +/* $OpenBSD: pmapae.c,v 1.16 2009/06/01 17:42:33 ariane Exp $ */ /* * Copyright (c) 2006 Michael Shalayeff @@ -1453,14 +1453,15 @@ pmap_remove_pae(struct pmap *pmap, vaddr_t sva, vaddr_t eva) ptp->wire_count = 0; /* Postpone free to after shootdown. */ uvm_pagerealloc(ptp, NULL, 0); - TAILQ_INSERT_TAIL(&empty_ptps, ptp, listq); + TAILQ_INSERT_TAIL(&empty_ptps, ptp, + fq.queues.listq); } } pmap_tlb_shootnow(cpumask); pmap_unmap_ptes_pae(pmap); /* unlock pmap */ PMAP_MAP_TO_HEAD_UNLOCK(); while ((ptp = TAILQ_FIRST(&empty_ptps)) != NULL) { - TAILQ_REMOVE(&empty_ptps, ptp, listq); + TAILQ_REMOVE(&empty_ptps, ptp, fq.queues.listq); uvm_pagefree(ptp); } return; @@ -1546,7 +1547,7 @@ pmap_remove_pae(struct pmap *pmap, vaddr_t sva, vaddr_t eva) ptp->wire_count = 0; /* Postpone free to after shootdown. */ uvm_pagerealloc(ptp, NULL, 0); - TAILQ_INSERT_TAIL(&empty_ptps, ptp, listq); + TAILQ_INSERT_TAIL(&empty_ptps, ptp, fq.queues.listq); } } @@ -1554,7 +1555,7 @@ pmap_remove_pae(struct pmap *pmap, vaddr_t sva, vaddr_t eva) pmap_unmap_ptes_pae(pmap); PMAP_MAP_TO_HEAD_UNLOCK(); while ((ptp = TAILQ_FIRST(&empty_ptps)) != NULL) { - TAILQ_REMOVE(&empty_ptps, ptp, listq); + TAILQ_REMOVE(&empty_ptps, ptp, fq.queues.listq); uvm_pagefree(ptp); } } @@ -1665,7 +1666,7 @@ pmap_page_remove_pae(struct vm_page *pg) /* Postpone free to after shootdown. */ uvm_pagerealloc(pve->pv_ptp, NULL, 0); TAILQ_INSERT_TAIL(&empty_ptps, pve->pv_ptp, - listq); + fq.queues.listq); } } pmap_unmap_ptes_pae(pve->pv_pmap); /* unlocks pmap */ @@ -1676,7 +1677,7 @@ pmap_page_remove_pae(struct vm_page *pg) PMAP_HEAD_TO_MAP_UNLOCK(); pmap_tlb_shootnow(cpumask); while ((ptp = TAILQ_FIRST(&empty_ptps)) != NULL) { - TAILQ_REMOVE(&empty_ptps, ptp, listq); + TAILQ_REMOVE(&empty_ptps, ptp, fq.queues.listq); uvm_pagefree(ptp); } } diff --git a/sys/arch/i386/include/vmparam.h b/sys/arch/i386/include/vmparam.h index 9c2163e6c2d..41e95b3f418 100644 --- a/sys/arch/i386/include/vmparam.h +++ b/sys/arch/i386/include/vmparam.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vmparam.h,v 1.41 2008/07/18 16:40:17 kurt Exp $ */ +/* $OpenBSD: vmparam.h,v 1.42 2009/06/01 17:42:33 ariane Exp $ */ /* $NetBSD: vmparam.h,v 1.15 1994/10/27 04:16:34 cgd Exp $ */ /*- @@ -118,6 +118,13 @@ #define VM_FREELIST_DEFAULT 0 #define VM_FREELIST_FIRST16 1 +/* reserve ISA-DMA and 32-bit DMA memory */ +#define UVM_IO_RANGES \ + { \ + { 0, 0x00ffffffUL }, \ + { 0, 0xffffffffUL }, \ + } + #define __HAVE_VM_PAGE_MD struct pv_entry; struct vm_page_md { |