Page MenuHomeFreeBSD

reserv_reclaim_test.patch

Authored By
dougm
Jun 2 2019, 8:58 AM
Size
2 KB
Referenced Files
None
Subscribers
None

reserv_reclaim_test.patch

Index: vm_reserv.c
===================================================================
--- vm_reserv.c (revision 348484)
+++ vm_reserv.c (working copy)
@@ -1458,24 +1458,108 @@
new_end = end - round_page(size);
vm_reserv_array = (void *)(uintptr_t)pmap_map(vaddr, new_end, end,
VM_PROT_READ | VM_PROT_WRITE);
bzero(vm_reserv_array, size);
/*
* Return the next available physical address.
*/
return (new_end);
}
/*
+ * XXX
+ */
+static vm_object_t
+debug_vm_reserv_reclaim_contig_pre(void)
+{
+ vm_object_t object;
+ int i;
+
+ object = vm_object_allocate(OBJT_DEFAULT, 512);
+ object->flags |= OBJ_COLORED;
+ object->pg_color = 0;
+
+ /*
+ * Change the set of vm_page_alloc() calls to vary the allocated versus
+ * free pattern that vm_reserv_reclaim_contig() has to handle.
+ */
+ VM_OBJECT_WLOCK(object);
+ for (i = 0; i < 512; i += 17)
+ (void)vm_page_alloc(object, i, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY);
+ VM_OBJECT_WUNLOCK(object);
+
+ return (object);
+}
+
+/*
+ * XXX
+ */
+static uint64_t
+debug_vm_reserv_reclaim_contig_test(vm_object_t object)
+{
+ vm_reserv_t rv;
+
+ rv = LIST_FIRST(&object->rvq);
+ vm_reserv_lock(rv);
+ if (rv->object != object) {
+ vm_reserv_unlock(rv);
+ return (~(uint64_t)0);
+ }
+ vm_reserv_domain_lock(rv->domain);
+ if (rv->inpartpopq) {
+ TAILQ_REMOVE(&vm_rvq_partpop[rv->domain], rv, partpopq);
+ rv->inpartpopq = FALSE;
+ }
+ vm_reserv_domain_unlock(rv->domain);
+ uint64_t tsc = rdtscp();
+ vm_reserv_reclaim_contig(rv->domain, 16, 0, 0x80000000, 16, 1);
+ tsc = rdtscp() - tsc;
+ vm_reserv_unlock(rv);
+ return (tsc);
+}
+
+#define NOBJECTS 997
+
+/*
+ * To run a test, use the command: sysctl debug.vm_reserv_reclaim_contig=1
+ */
+static int
+debug_vm_reserv_reclaim_contig(SYSCTL_HANDLER_ARGS)
+{
+ vm_object_t object[NOBJECTS];
+ uint64_t total_tsc;
+ int error, i, j;
+
+ i = 0;
+ error = sysctl_handle_int(oidp, &i, 0, req);
+ if (error != 0)
+ return (error);
+ if (i != 0) {
+ for (j = 0; j < NOBJECTS; j++)
+ object[j] = debug_vm_reserv_reclaim_contig_pre();
+ total_tsc = 0;
+ for (j = 0; j < NOBJECTS; j++)
+ total_tsc += debug_vm_reserv_reclaim_contig_test(object[j]);
+ uprintf("\ncycles/break: %lu\n", total_tsc / NOBJECTS);
+ for (j = 0; j < NOBJECTS; j++)
+ vm_object_deallocate(object[j]);
+ }
+ return (0);
+}
+
+SYSCTL_PROC(_debug, OID_AUTO, vm_reserv_reclaim_contig, CTLTYPE_INT | CTLFLAG_RW, 0, 0,
+ debug_vm_reserv_reclaim_contig, "I", "set to trigger vm_reserv_reclaim_contig event");
+
+/*
* Initializes the reservation management system. Specifically, initializes
* the reservation counters.
*/
static void
vm_reserv_counter_init(void *unused)
{
vm_reserv_freed = counter_u64_alloc(M_WAITOK);
vm_reserv_broken = counter_u64_alloc(M_WAITOK);
vm_reserv_reclaimed = counter_u64_alloc(M_WAITOK);
}
SYSINIT(vm_reserv_counter_init, SI_SUB_CPU, SI_ORDER_ANY,

File Metadata

Mime Type
text/x-diff
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1938167
Default Alt Text
reserv_reclaim_test.patch (2 KB)

Event Timeline