aboutsummaryrefslogtreecommitdiff
path: root/sys/vm
diff options
context:
space:
mode:
authorD Scott Phillips <scottph@FreeBSD.org>2020-09-21 22:21:59 +0000
committerD Scott Phillips <scottph@FreeBSD.org>2020-09-21 22:21:59 +0000
commit00e6614750deca2457373aecd5bfa7aebbde3865 (patch)
tree73c950caf7bef81919555e2270ded794535c1b37 /sys/vm
parentab041f713aeccdf23b4805ffb71815c8d4aa9c88 (diff)
Notes
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_page.c7
-rw-r--r--sys/vm/vm_page.h49
-rw-r--r--sys/vm/vm_phys.h4
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 {