svn commit: r362187 - in stable/12/sys: compat/linux vm
Mark Johnston
markj at FreeBSD.org
Mon Jun 15 03:01:30 UTC 2020
Author: markj
Date: Mon Jun 15 03:01:28 2020
New Revision: 362187
URL: https://svnweb.freebsd.org/changeset/base/362187
Log:
MFC r361945, r362036:
Stop computing a "sharedram" value when emulating Linux sysinfo(2).
Modified:
stable/12/sys/compat/linux/linux_misc.c
stable/12/sys/vm/vm_map.c
stable/12/sys/vm/vm_map.h
stable/12/sys/vm/vm_mmap.c
stable/12/sys/vm/vm_unix.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/compat/linux/linux_misc.c
==============================================================================
--- stable/12/sys/compat/linux/linux_misc.c Sun Jun 14 22:39:34 2020 (r362186)
+++ stable/12/sys/compat/linux/linux_misc.c Mon Jun 15 03:01:28 2020 (r362187)
@@ -78,7 +78,6 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_kern.h>
#include <vm/vm_map.h>
#include <vm/vm_extern.h>
-#include <vm/vm_object.h>
#include <vm/swap_pager.h>
#ifdef COMPAT_LINUX32
@@ -150,7 +149,6 @@ int
linux_sysinfo(struct thread *td, struct linux_sysinfo_args *args)
{
struct l_sysinfo sysinfo;
- vm_object_t object;
int i, j;
struct timespec ts;
@@ -168,14 +166,13 @@ linux_sysinfo(struct thread *td, struct linux_sysinfo_
sysinfo.totalram = physmem * PAGE_SIZE;
sysinfo.freeram = sysinfo.totalram - vm_wire_count() * PAGE_SIZE;
+ /*
+ * sharedram counts pages allocated to named, swap-backed objects such
+ * as shared memory segments and tmpfs files. There is no cheap way to
+ * compute this, so just leave the field unpopulated. Linux itself only
+ * started setting this field in the 3.x timeframe.
+ */
sysinfo.sharedram = 0;
- mtx_lock(&vm_object_list_mtx);
- TAILQ_FOREACH(object, &vm_object_list, object_list)
- if (object->shadow_count > 1)
- sysinfo.sharedram += object->resident_page_count;
- mtx_unlock(&vm_object_list_mtx);
-
- sysinfo.sharedram *= PAGE_SIZE;
sysinfo.bufferram = 0;
swap_pager_status(&i, &j);
Modified: stable/12/sys/vm/vm_map.c
==============================================================================
--- stable/12/sys/vm/vm_map.c Sun Jun 14 22:39:34 2020 (r362186)
+++ stable/12/sys/vm/vm_map.c Mon Jun 15 03:01:28 2020 (r362187)
@@ -3097,7 +3097,7 @@ vm_map_wire_locked(vm_map_t map, vm_offset_t start, vm
u_long npages;
u_int last_timestamp;
int rv;
- boolean_t need_wakeup, result, user_wire;
+ boolean_t need_wakeup, result, user_wire, user_wire_limit;
vm_prot_t prot;
VM_MAP_ASSERT_LOCKED(map);
@@ -3108,6 +3108,7 @@ vm_map_wire_locked(vm_map_t map, vm_offset_t start, vm
if (flags & VM_MAP_WIRE_WRITE)
prot |= VM_PROT_WRITE;
user_wire = (flags & VM_MAP_WIRE_USER) ? TRUE : FALSE;
+ user_wire_limit = (flags & VM_MAP_WIRE_USER_LIMIT) ? TRUE : FALSE;
VM_MAP_RANGE_CHECK(map, start, end);
if (!vm_map_lookup_entry(map, start, &first_entry)) {
if (flags & VM_MAP_WIRE_HOLESOK)
@@ -3188,7 +3189,8 @@ vm_map_wire_locked(vm_map_t map, vm_offset_t start, vm
entry->wired_count++;
npages = atop(entry->end - entry->start);
- if (user_wire && !vm_map_wire_user_count_add(npages)) {
+ if (user_wire_limit &&
+ !vm_map_wire_user_count_add(npages)) {
vm_map_wire_entry_failure(map, entry,
entry->start);
end = entry->end;
@@ -3250,7 +3252,7 @@ vm_map_wire_locked(vm_map_t map, vm_offset_t start, vm
last_timestamp = map->timestamp;
if (rv != KERN_SUCCESS) {
vm_map_wire_entry_failure(map, entry, faddr);
- if (user_wire)
+ if (user_wire_limit)
vm_map_wire_user_count_sub(npages);
end = entry->end;
goto done;
@@ -3319,7 +3321,7 @@ done:
*/
if (entry->wired_count == 1) {
vm_map_entry_unwire(map, entry);
- if (user_wire)
+ if (user_wire_limit)
vm_map_wire_user_count_sub(
atop(entry->end - entry->start));
} else
@@ -4455,7 +4457,8 @@ retry:
if (rv == KERN_SUCCESS && (map->flags & MAP_WIREFUTURE) != 0) {
rv = vm_map_wire_locked(map, grow_start,
grow_start + grow_amount,
- VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
+ VM_MAP_WIRE_USER | VM_MAP_WIRE_USER_LIMIT |
+ VM_MAP_WIRE_NOHOLES);
}
vm_map_lock_downgrade(map);
Modified: stable/12/sys/vm/vm_map.h
==============================================================================
--- stable/12/sys/vm/vm_map.h Sun Jun 14 22:39:34 2020 (r362186)
+++ stable/12/sys/vm/vm_map.h Mon Jun 15 03:01:28 2020 (r362187)
@@ -397,6 +397,8 @@ long vmspace_resident_count(struct vmspace *vmspace);
#define VM_MAP_WIRE_WRITE 4 /* Validate writable. */
+#define VM_MAP_WIRE_USER_LIMIT 8 /* Enfore the user wiring limit */
+
#ifdef _KERNEL
boolean_t vm_map_check_protection (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t);
vm_map_t vm_map_create(pmap_t, vm_offset_t, vm_offset_t);
Modified: stable/12/sys/vm/vm_mmap.c
==============================================================================
--- stable/12/sys/vm/vm_mmap.c Sun Jun 14 22:39:34 2020 (r362186)
+++ stable/12/sys/vm/vm_mmap.c Mon Jun 15 03:01:28 2020 (r362187)
@@ -1046,7 +1046,7 @@ kern_mlock(struct proc *proc, struct ucred *cred, uint
}
#endif
error = vm_map_wire(map, start, end,
- VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
+ VM_MAP_WIRE_USER | VM_MAP_WIRE_USER_LIMIT | VM_MAP_WIRE_NOHOLES);
#ifdef RACCT
if (racct_enable && error != KERN_SUCCESS) {
PROC_LOCK(proc);
@@ -1111,7 +1111,8 @@ sys_mlockall(struct thread *td, struct mlockall_args *
* calling vm_fault_wire() for each page in the region.
*/
error = vm_map_wire(map, vm_map_min(map), vm_map_max(map),
- VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK);
+ VM_MAP_WIRE_USER | VM_MAP_WIRE_USER_LIMIT |
+ VM_MAP_WIRE_HOLESOK);
if (error == KERN_SUCCESS)
error = 0;
else if (error == KERN_RESOURCE_SHORTAGE)
@@ -1589,6 +1590,7 @@ vm_mmap_object(vm_map_t map, vm_offset_t *addr, vm_siz
if ((map->flags & MAP_WIREFUTURE) != 0)
(void)vm_map_wire_locked(map, *addr,
*addr + size, VM_MAP_WIRE_USER |
+ VM_MAP_WIRE_USER_LIMIT |
((flags & MAP_STACK) ? VM_MAP_WIRE_HOLESOK :
VM_MAP_WIRE_NOHOLES));
vm_map_unlock(map);
Modified: stable/12/sys/vm/vm_unix.c
==============================================================================
--- stable/12/sys/vm/vm_unix.c Sun Jun 14 22:39:34 2020 (r362186)
+++ stable/12/sys/vm/vm_unix.c Mon Jun 15 03:01:28 2020 (r362187)
@@ -185,7 +185,8 @@ kern_break(struct thread *td, uintptr_t *addr)
0);
if (rv == KERN_SUCCESS && (map->flags & MAP_WIREFUTURE) != 0) {
rv = vm_map_wire_locked(map, old, new,
- VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
+ VM_MAP_WIRE_USER | VM_MAP_WIRE_USER_LIMIT |
+ VM_MAP_WIRE_NOHOLES);
if (rv != KERN_SUCCESS)
vm_map_delete(map, old, new);
}
More information about the svn-src-stable-12
mailing list