diff options
| author | D Scott Phillips <scottph@FreeBSD.org> | 2020-09-21 22:21:59 +0000 |
|---|---|---|
| committer | D Scott Phillips <scottph@FreeBSD.org> | 2020-09-21 22:21:59 +0000 |
| commit | 00e6614750deca2457373aecd5bfa7aebbde3865 (patch) | |
| tree | 73c950caf7bef81919555e2270ded794535c1b37 /sys/vm | |
| parent | ab041f713aeccdf23b4805ffb71815c8d4aa9c88 (diff) | |
Notes
Diffstat (limited to 'sys/vm')
| -rw-r--r-- | sys/vm/vm_page.c | 7 | ||||
| -rw-r--r-- | sys/vm/vm_page.h | 49 | ||||
| -rw-r--r-- | sys/vm/vm_phys.h | 4 |
3 files changed, 53 insertions, 7 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 140711a00227e..9e135d50d70ea 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -607,10 +607,13 @@ vm_page_startup(vm_offset_t vaddr) * included should the sf_buf code decide to use them. */ last_pa = 0; - for (i = 0; dump_avail[i + 1] != 0; i += 2) + vm_page_dump_pages = 0; + for (i = 0; dump_avail[i + 1] != 0; i += 2) { + vm_page_dump_pages += howmany(dump_avail[i + 1], PAGE_SIZE) - + dump_avail[i] / PAGE_SIZE; if (dump_avail[i + 1] > last_pa) last_pa = dump_avail[i + 1]; - vm_page_dump_pages = last_pa / PAGE_SIZE; + } vm_page_dump_size = round_page(BITSET_SIZE(vm_page_dump_pages)); new_end -= vm_page_dump_size; vm_page_dump = (void *)(uintptr_t)pmap_map(&vaddr, new_end, diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h index ec9a539b8f05a..915be66169963 100644 --- a/sys/vm/vm_page.h +++ b/sys/vm/vm_page.h @@ -589,22 +589,65 @@ malloc2vm_flags(int malloc_flags) extern struct bitset *vm_page_dump; extern long vm_page_dump_pages; +extern vm_paddr_t dump_avail[]; static inline void dump_add_page(vm_paddr_t pa) { - BIT_SET_ATOMIC(vm_page_dump_pages, pa >> PAGE_SHIFT, vm_page_dump); + vm_pindex_t adj; + int i; + + adj = 0; + for (i = 0; dump_avail[i + 1] != 0; i += 2) { + if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) { + BIT_SET_ATOMIC(vm_page_dump_pages, + (pa >> PAGE_SHIFT) - (dump_avail[i] >> PAGE_SHIFT) + + adj, vm_page_dump); + return; + } + adj += howmany(dump_avail[i + 1], PAGE_SIZE) - + dump_avail[i] / PAGE_SIZE; + } } static inline void dump_drop_page(vm_paddr_t pa) { - BIT_CLR_ATOMIC(vm_page_dump_pages, pa >> PAGE_SHIFT, vm_page_dump); + vm_pindex_t adj; + int i; + + adj = 0; + for (i = 0; dump_avail[i + 1] != 0; i += 2) { + if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) { + BIT_CLR_ATOMIC(vm_page_dump_pages, + (pa >> PAGE_SHIFT) - (dump_avail[i] >> PAGE_SHIFT) + + adj, vm_page_dump); + return; + } + adj += howmany(dump_avail[i + 1], PAGE_SIZE) - + dump_avail[i] / PAGE_SIZE; + } +} + +static inline vm_paddr_t +vm_page_dump_index_to_pa(int bit) +{ + int i, tot; + + for (i = 0; dump_avail[i + 1] != 0; i += 2) { + tot = howmany(dump_avail[i + 1], PAGE_SIZE) - + dump_avail[i] / PAGE_SIZE; + if (bit < tot) + return ((vm_paddr_t)bit * PAGE_SIZE + + dump_avail[i] & ~PAGE_MASK); + bit -= tot; + } + return ((vm_paddr_t)NULL); } #define VM_PAGE_DUMP_FOREACH(pa) \ for (vm_pindex_t __b = BIT_FFS(vm_page_dump_pages, vm_page_dump); \ - (pa) = (__b - 1) * PAGE_SIZE, __b != 0; \ + (pa) = vm_page_dump_index_to_pa(__b - 1), __b != 0; \ __b = BIT_FFS_AT(vm_page_dump_pages, vm_page_dump, __b)) bool vm_page_busy_acquire(vm_page_t m, int allocflags); diff --git a/sys/vm/vm_phys.h b/sys/vm/vm_phys.h index a99e274bc57e2..5ad2ce11445bd 100644 --- a/sys/vm/vm_phys.h +++ b/sys/vm/vm_phys.h @@ -46,8 +46,8 @@ #define VM_NFREEORDER_MAX VM_NFREEORDER #endif -extern vm_paddr_t phys_avail[]; -extern vm_paddr_t dump_avail[]; +extern vm_paddr_t phys_avail[PHYS_AVAIL_COUNT]; +extern vm_paddr_t dump_avail[PHYS_AVAIL_COUNT]; /* Domains must be dense (non-sparse) and zero-based. */ struct mem_affinity { |
