Move vmmeter atomic counters into dedicated cache lines
Prior to the change they were subject to extreme false sharing. In particular this change shaves about 3 seconds real time of -j 80 buildkernel. Reviewed by: alc, markj Differential Revision: https://reviews.freebsd.org/D12281
This commit is contained in:
parent
e1275c6805
commit
1c0b34417b
@ -60,6 +60,12 @@ struct vmtotal {
|
|||||||
#if defined(_KERNEL) || defined(_WANT_VMMETER)
|
#if defined(_KERNEL) || defined(_WANT_VMMETER)
|
||||||
#include <sys/counter.h>
|
#include <sys/counter.h>
|
||||||
|
|
||||||
|
#ifdef _KERNEL
|
||||||
|
#define VMMETER_ALIGNED __aligned(CACHE_LINE_SIZE)
|
||||||
|
#else
|
||||||
|
#define VMMETER_ALIGNED
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* System wide statistics counters.
|
* System wide statistics counters.
|
||||||
* Locking:
|
* Locking:
|
||||||
@ -126,14 +132,15 @@ struct vmmeter {
|
|||||||
u_int v_free_target; /* (c) pages desired free */
|
u_int v_free_target; /* (c) pages desired free */
|
||||||
u_int v_free_min; /* (c) pages desired free */
|
u_int v_free_min; /* (c) pages desired free */
|
||||||
u_int v_free_count; /* (f) pages free */
|
u_int v_free_count; /* (f) pages free */
|
||||||
u_int v_wire_count; /* (a) pages wired down */
|
|
||||||
u_int v_active_count; /* (q) pages active */
|
|
||||||
u_int v_inactive_target; /* (c) pages desired inactive */
|
u_int v_inactive_target; /* (c) pages desired inactive */
|
||||||
u_int v_inactive_count; /* (q) pages inactive */
|
|
||||||
u_int v_laundry_count; /* (q) pages eligible for laundering */
|
|
||||||
u_int v_pageout_free_min; /* (c) min pages reserved for kernel */
|
u_int v_pageout_free_min; /* (c) min pages reserved for kernel */
|
||||||
u_int v_interrupt_free_min; /* (c) reserved pages for int code */
|
u_int v_interrupt_free_min; /* (c) reserved pages for int code */
|
||||||
u_int v_free_severe; /* (c) severe page depletion point */
|
u_int v_free_severe; /* (c) severe page depletion point */
|
||||||
|
u_int v_wire_count VMMETER_ALIGNED; /* (a) pages wired down */
|
||||||
|
u_int v_active_count VMMETER_ALIGNED; /* (a) pages active */
|
||||||
|
u_int v_inactive_count VMMETER_ALIGNED; /* (a) pages inactive */
|
||||||
|
u_int v_laundry_count VMMETER_ALIGNED; /* (a) pages eligible for
|
||||||
|
laundering */
|
||||||
};
|
};
|
||||||
#endif /* _KERNEL || _WANT_VMMETER */
|
#endif /* _KERNEL || _WANT_VMMETER */
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <vm/vm_object.h>
|
#include <vm/vm_object.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
struct vmmeter vm_cnt = {
|
struct vmmeter __exclusive_cache_line vm_cnt = {
|
||||||
.v_swtch = EARLY_COUNTER,
|
.v_swtch = EARLY_COUNTER,
|
||||||
.v_trap = EARLY_COUNTER,
|
.v_trap = EARLY_COUNTER,
|
||||||
.v_syscall = EARLY_COUNTER,
|
.v_syscall = EARLY_COUNTER,
|
||||||
|
Loading…
Reference in New Issue
Block a user