Page MenuHomeFreeBSD

D13018.id35277.diff
No OneTemporary

D13018.id35277.diff

Index: head/sys/sys/param.h
===================================================================
--- head/sys/sys/param.h
+++ head/sys/sys/param.h
@@ -58,7 +58,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1200053 /* Master, propagated to newvers */
+#define __FreeBSD_version 1200054 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
@@ -84,6 +84,7 @@
#define P_OSREL_SHUTDOWN_ENOTCONN 1100077
#define P_OSREL_MAP_GUARD 1200035
#define P_OSREL_WRFSBASE 1200041
+#define P_OSREL_VMTOTAL64 1200054
#define P_OSREL_MAJOR(x) ((x) / 100000)
#endif
Index: head/sys/sys/vmmeter.h
===================================================================
--- head/sys/sys/vmmeter.h
+++ head/sys/sys/vmmeter.h
@@ -41,20 +41,23 @@
/* Systemwide totals computed every five seconds. */
struct vmtotal {
- int16_t t_rq; /* length of the run queue */
- int16_t t_dw; /* jobs in ``disk wait'' (neg priority) */
- int16_t t_pw; /* jobs in page wait */
- int16_t t_sl; /* jobs sleeping in core */
- int16_t t_sw; /* swapped out runnable/short block jobs */
- int32_t t_vm; /* total virtual memory */
- int32_t t_avm; /* active virtual memory */
- int32_t t_rm; /* total real memory in use */
- int32_t t_arm; /* active real memory */
- int32_t t_vmshr; /* shared virtual memory */
- int32_t t_avmshr; /* active shared virtual memory */
- int32_t t_rmshr; /* shared real memory */
- int32_t t_armshr; /* active shared real memory */
- int32_t t_free; /* free memory pages */
+ uint64_t t_vm; /* total virtual memory */
+ uint64_t t_avm; /* active virtual memory */
+ uint64_t t_rm; /* total real memory in use */
+ uint64_t t_arm; /* active real memory */
+ uint64_t t_vmshr; /* shared virtual memory */
+ uint64_t t_avmshr; /* active shared virtual memory */
+ uint64_t t_rmshr; /* shared real memory */
+ uint64_t t_armshr; /* active shared real memory */
+ uint64_t t_free; /* free memory pages */
+ int16_t t_rq; /* length of the run queue */
+ int16_t t_dw; /* jobs in ``disk wait'' (neg
+ priority) */
+ int16_t t_pw; /* jobs in page wait */
+ int16_t t_sl; /* jobs sleeping in core */
+ int16_t t_sw; /* swapped out runnable/short
+ block jobs */
+ uint16_t t_pad[3];
};
#if defined(_KERNEL) || defined(_WANT_VMMETER)
Index: head/sys/vm/vm_meter.c
===================================================================
--- head/sys/vm/vm_meter.c
+++ head/sys/vm/vm_meter.c
@@ -152,14 +152,43 @@
return (obj->ref_count > obj->shadow_count);
}
+#if defined(COMPAT_FREEBSD11)
+struct vmtotal11 {
+ int16_t t_rq;
+ int16_t t_dw;
+ int16_t t_pw;
+ int16_t t_sl;
+ int16_t t_sw;
+ int32_t t_vm;
+ int32_t t_avm;
+ int32_t t_rm;
+ int32_t t_arm;
+ int32_t t_vmshr;
+ int32_t t_avmshr;
+ int32_t t_rmshr;
+ int32_t t_armshr;
+ int32_t t_free;
+};
+#endif
+
static int
vmtotal(SYSCTL_HANDLER_ARGS)
{
struct vmtotal total;
+#if defined(COMPAT_FREEBSD11)
+ struct vmtotal11 total11;
+#endif
vm_object_t object;
struct proc *p;
struct thread *td;
+ if (req->oldptr == NULL) {
+#if defined(COMPAT_FREEBSD11)
+ if (curproc->p_osrel < P_OSREL_VMTOTAL64)
+ return (SYSCTL_OUT(req, NULL, sizeof(total11)));
+#endif
+ return (SYSCTL_OUT(req, NULL, sizeof(total)));
+ }
bzero(&total, sizeof(total));
/*
@@ -253,11 +282,33 @@
}
mtx_unlock(&vm_object_list_mtx);
total.t_free = vm_cnt.v_free_count;
- return (sysctl_handle_opaque(oidp, &total, sizeof(total), req));
+#if defined(COMPAT_FREEBSD11)
+ /* sysctl(8) allocates twice as much memory as reported by sysctl(3) */
+ if (curproc->p_osrel < P_OSREL_VMTOTAL64 && (req->oldlen ==
+ sizeof(total11) || req->oldlen == 2 * sizeof(total11))) {
+ bzero(&total11, sizeof(total11));
+ total11.t_rq = total.t_rq;
+ total11.t_dw = total.t_dw;
+ total11.t_pw = total.t_pw;
+ total11.t_sl = total.t_sl;
+ total11.t_sw = total.t_sw;
+ total11.t_vm = total.t_vm; /* truncate */
+ total11.t_avm = total.t_avm; /* truncate */
+ total11.t_rm = total.t_rm; /* truncate */
+ total11.t_arm = total.t_arm; /* truncate */
+ total11.t_vmshr = total.t_vmshr; /* truncate */
+ total11.t_avmshr = total.t_avmshr; /* truncate */
+ total11.t_rmshr = total.t_rmshr; /* truncate */
+ total11.t_armshr = total.t_armshr; /* truncate */
+ total11.t_free = total.t_free; /* truncate */
+ return (SYSCTL_OUT(req, &total11, sizeof(total11)));
+ }
+#endif
+ return (SYSCTL_OUT(req, &total, sizeof(total)));
}
-SYSCTL_PROC(_vm, VM_TOTAL, vmtotal, CTLTYPE_OPAQUE|CTLFLAG_RD|CTLFLAG_MPSAFE,
- 0, sizeof(struct vmtotal), vmtotal, "S,vmtotal",
+SYSCTL_PROC(_vm, VM_TOTAL, vmtotal, CTLTYPE_OPAQUE | CTLFLAG_RD |
+ CTLFLAG_MPSAFE, NULL, 0, vmtotal, "S,vmtotal",
"System virtual memory statistics");
SYSCTL_NODE(_vm, OID_AUTO, stats, CTLFLAG_RW, 0, "VM meter stats");
static SYSCTL_NODE(_vm_stats, OID_AUTO, sys, CTLFLAG_RW, 0,

File Metadata

Mime Type
text/plain
Expires
Fri, Oct 10, 9:23 PM (9 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23547818
Default Alt Text
D13018.id35277.diff (4 KB)

Event Timeline