BTW single core kernel works fine: vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv rr vvvvvvvvvvvvvvvvvvvvvv rr vvvvvvvvvvvvvvvvvvvvvvvv rr rrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrr rrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrr rrrrrrrr vvvvvvvvvvvvvvvvvv rrrrrrrr rrrrrrrrrr vvvvvvvvvvvvvv rrrrrrrrrr rrrrrrrrrrrr vvvvvvvvvv rrrrrrrrrrrr rrrrrrrrrrrrrr vvvvvv rrrrrrrrrrrrrr rrrrrrrrrrrrrrrr vv rrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr
INSTRUCTION SETS WANT TO BE FREE KDB: debugger backends: ddb KDB: current backend: ddb Found 1 CPUs in the device tree Copyright (c) 1992-2016 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 12.0-CURRENT #8 8e49d4e(br-riscv-isa-update)-dirty: Wed Nov 16 14:08:14 UTC 2016 rb...@vica.cl.cam.ac.uk:/home/rb743/obj/riscv.riscv64/home/rb743/dev/freebsd-riscv/sys/SPIKE riscv gcc version 6.1.0 (GCC) Preloaded elf64 kernel "kernel" at 0xffffffc0026be2e0. CPU(0): Unknown Implementer Unknown Processor ULE: setup cpu 0 random: entropy device external interface crypto: <crypto core> mem: <memory> openfirm: <Open Firmware control device> null: <full device, null device, zero device> nfslock: pseudo-device random: harvesting attach, 8 bytes (4 bits) from nexus0 ofwbus0: <Open Firmware Device Tree> simplebus0: <Flattened device tree simple bus> on ofwbus0 random: harvesting attach, 8 bytes (4 bits) from simplebus0 random: harvesting attach, 8 bytes (4 bits) from ofwbus0 timer0: <RISC-V Timer> mem 0x40000000-0x40000007,0x40000008-0x40001007 irq 5 on simplebus0 Timecounter "RISC-V Timecounter" frequency 1000000 Hz quality 1000 Event timer "RISC-V Eventtimer" frequency 1000000 Hz quality 1000 random: harvesting attach, 8 bytes (4 bits) from timer0 cpulist0: <Open Firmware CPU Group> on ofwbus0 cpu0: <Open Firmware CPU> on cpulist0 cpu0: missing 'clock-frequency' property riscv64_cpu0: register <0> random: harvesting attach, 8 bytes (4 bits) from riscv64_cpu0 random: harvesting attach, 8 bytes (4 bits) from cpu0 random: harvesting attach, 8 bytes (4 bits) from cpulist0 simplebus0: <pic@0> compat riscv,pic (no driver attached) rcons0: <RISC-V console> irq 1 on simplebus0 random: harvesting attach, 8 bytes (4 bits) from rcons0 cryptosoft0: <software crypto> crypto: assign cryptosoft0 driver id 0, flags 100663296 crypto: cryptosoft0 registers alg 1 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 2 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 3 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 4 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 5 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 16 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 6 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 7 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 18 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 19 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 20 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 8 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 15 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 9 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 10 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 13 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 14 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 11 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 22 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 23 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 25 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 24 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 26 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 27 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 28 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 21 flags 0 maxoplen 0 crypto: cryptosoft0 registers alg 17 flags 0 maxoplen 0 random: harvesting attach, 8 bytes (4 bits) from cryptosoft0 Device configuration finished. procfs registered Timecounters tick every 1.000 msec lo0: bpf attached vlan: initialized, using hash tables with chaining tcp_init: net.inet.tcp.tcbhashsize auto tuned to 8192 IPsec: Initialized Security Association Processing. Trying to mount root from ufs:/dev/md0 []... md0: Embedded image 33554432 bytes at 0xffffffc0006598c0 warning: no time-of-day clock registered, system time will not be set accurately start_init: trying /sbin/init Nov 16 12:32:13 init: login_getclass: unknown class 'daemon' sh: cannot open /etc/rc: No such file or directory Enter full pathname of shell or RETURN for /bin/sh: Cannot read termcap database; using dumb terminal settings. # uname -a FreeBSD 12.0-CURRENT FreeBSD 12.0-CURRENT #8 8e49d4e(br-riscv-isa-update)-dirty: Wed Nov 16 14:08:14 UTC 2016 rb...@vica.cl.cam.ac.uk:/home/rb743/obj/riscv.riscv64/home/rb743/dev/freebsd-riscv/sys/SPIKE riscv # Ruslan On Wed, Nov 16, 2016 at 02:02:27PM +0000, Ruslan Bukin wrote: > Forgot to mention that we are using 32mb mdroot. > Removing mdroot from kernel config makes it more happy: > > crypto: cryptosoft0 registers alg 26 flags 0 maxoplen 0 > crypto: cryptosoft0 registers alg 27 flags 0 maxoplen 0 > crypto: cryptosoft0 registers alg 28 flags 0 maxoplen 0 > crypto: cryptosoft0 registers alg 21 flags 0 maxoplen 0 > crypto: cryptosoft0 registers alg 17 flags 0 maxoplen 0 > random: harvesting attach, 8 bytes (4 bits) from cryptosoft0 > Device configuration finished. > procfs registered > Timecounters tick every 1.000 msec > lo0: bpf attached > vlan: initialized, using hash tables with chaining > tcp_init: net.inet.tcp.tcbhashsize auto tuned to 8192 > IPsec: Initialized Security Association Processing. > Release APs > CPU(1): Unknown Implementer Unknown Processor > Trying to mount root from ufs:/dev/md0 []... > mountroot: waiting for device /dev/md0... > Mounting from ufs:/dev/md0 failed with error 19. > > Loader variables: > > Manual root filesystem specification: > <fstype>:<device> [options] > Mount <device> using filesystem <fstype> > and with the specified (optional) option list. > > eg. ufs:/dev/da0s1a > zfs:tank > cd9660:/dev/cd0 ro > (which is equivalent to: mount -t cd9660 -o ro /dev/cd0 /) > > ? List valid disk boot devices > . Yield 1 second (for background tasks) > <empty line> Abort manual input > > mountroot> > > Ruslan > > On Wed, Nov 16, 2016 at 01:37:18PM +0000, Ruslan Bukin wrote: > > I have a panic with this on RISC-V. Any ideas ? > > > > vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv > > vvvvvvvvvvvvvvvvvvvvvvvvvvvv > > rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvvvv > > rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv > > rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv > > rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv > > rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv > > rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv > > rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv > > rr vvvvvvvvvvvvvvvvvvvvvv > > rr vvvvvvvvvvvvvvvvvvvvvvvv rr > > rrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrr > > rrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrr > > rrrrrrrr vvvvvvvvvvvvvvvvvv rrrrrrrr > > rrrrrrrrrr vvvvvvvvvvvvvv rrrrrrrrrr > > rrrrrrrrrrrr vvvvvvvvvv rrrrrrrrrrrr > > rrrrrrrrrrrrrr vvvvvv rrrrrrrrrrrrrr > > rrrrrrrrrrrrrrrr vv rrrrrrrrrrrrrrrr > > rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr > > rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr > > rrrrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr > > > > INSTRUCTION SETS WANT TO BE FREE > > KDB: debugger backends: ddb > > KDB: current backend: ddb > > Found 2 CPUs in the device tree > > Copyright (c) 1992-2016 The FreeBSD Project. > > Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 > > The Regents of the University of California. All rights reserved. > > FreeBSD is a registered trademark of The FreeBSD Foundation. > > FreeBSD 12.0-CURRENT #4 0a3288b(br-riscv-isa-update)-dirty: Wed Nov 16 > > 13:28:11 UTC 2016 > > > > rb...@vica.cl.cam.ac.uk:/home/rb743/obj/riscv.riscv64/home/rb743/dev/freebsd-riscv/sys/SPIKE > > riscv > > gcc version 6.1.0 (GCC) > > Preloaded elf64 kernel "kernel" at 0xffffffc0026be360. > > CPU(0): Unknown Implementer Unknown Processor > > Starting CPU 1 (0) > > FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs > > ULE: setup cpu 0 > > ULE: setup cpu 1 > > random: entropy device external interface > > crypto: <crypto core> > > mem: <memory> > > openfirm: <Open Firmware control device> > > null: <full device, null device, zero device> > > nfslock: pseudo-device > > random: harvesting attach, 8 bytes (4 bits) from nexus0 > > ofwbus0: <Open Firmware Device Tree> > > simplebus0: <Flattened device tree simple bus> on ofwbus0 > > random: harvesting attach, 8 bytes (4 bits) from simplebus0 > > random: harvesting attach, 8 bytes (4 bits) from ofwbus0 > > timer0: <RISC-V Timer> mem 0x40000000-0x40000007,0x40000008-0x40001007 irq > > 5 on simplebus0 > > Timecounter "RISC-V Timecounter" frequency 1000000 Hz quality 1000 > > Event timer "RISC-V Eventtimer" frequency 1000000 Hz quality 1000 > > random: harvesting attach, 8 bytes (4 bits) from timer0 > > cpulist0: <Open Firmware CPU Group> on ofwbus0 > > cpu0: <Open Firmware CPU> on cpulist0 > > cpu0: missing 'clock-frequency' property > > riscv64_cpu0: register <0> > > random: harvesting attach, 8 bytes (4 bits) from riscv64_cpu0 > > random: harvesting attach, 8 bytes (4 bits) from cpu0 > > cpu1: <Open Firmware CPU> on cpulist0 > > cpu1: missing 'clock-frequency' property > > riscv64_cpu1: register <0> > > random: harvesting attach, 8 bytes (4 bits) from riscv64_cpu1 > > random: harvesting attach, 8 bytes (4 bits) from cpu1 > > random: harvesting attach, 8 bytes (4 bits) from cpulist0 > > simplebus0: <pic@0> compat riscv,pic (no driver attached) > > rcons0: <RISC-V console> irq 1 on simplebus0 > > random: harvesting attach, 8 bytes (4 bits) from rcons0 > > cryptosoft0: <software crypto> > > crypto: assign cryptosoft0 driver id 0, flags 100663296 > > crypto: cryptosoft0 registers alg 1 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 2 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 3 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 4 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 5 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 16 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 6 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 7 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 18 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 19 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 20 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 8 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 15 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 9 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 10 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 13 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 14 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 11 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 22 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 23 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 25 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 24 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 26 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 27 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 28 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 21 flags 0 maxoplen 0 > > crypto: cryptosoft0 registers alg 17 flags 0 maxoplen 0 > > random: harvesting attach, 8 bytes (4 bits) from cryptosoft0 > > Device configuration finished. > > procfs registered > > Timecounters tick every 1.000 msec > > lo0: bpf attached > > vlan: initialized, using hash tables with chaining > > tcp_init: net.inet.tcp.tcbhashsize auto tuned to 8192 > > IPsec: Initialized Security Association Processing. > > t[0] == 0xffffffc00265bf50 > > t[1] == 0xffffffc00016494c > > t[2] == 0x0000000000000050 > > t[3] == 0x0000000000000000 > > t[4] == 0x0000000000000000 > > t[5] == 0x0000000000000000 > > t[6] == 0x0000000000000000 > > s[0] == 0xffffffc000003db0 > > s[1] == 0x0000000000000000 > > s[2] == 0xffffffc002c4c510 > > s[3] == 0xffffffc002cea9c0 > > s[4] == 0x000000000098967f > > s[5] == 0x00000000039386ff > > s[6] == 0xffffffc000574778 > > s[7] == 0x0000000000000000 > > s[8] == 0xffffffc00267c580 > > s[9] == 0xffffffc000531218 > > s[10] == 0x0000000000000412 > > s[11] == 0x0000000000000000 > > a[0] == 0x0000000000000000 > > a[1] == 0x0000000000000000 > > a[2] == 0xffffffc000531218 > > a[3] == 0x0000000000000412 > > a[4] == 0xffffffc00267c580 > > a[5] == 0x0000000000000002 > > a[6] == 0x0000000000000000 > > a[7] == 0x0000000000000003 > > sepc == 0xffffffc00013deac > > sstatus == 0x8000000000006100 > > panic: vm_fault failed: ffffffc00013deac, va 0x0000000000000018 > > cpuid = 0 > > KDB: stack backtrace: > > db_trace_self() at db_read_token+0x704 > > pc = 0xffffffc000455b44 ra = 0xffffffc0000244f8 > > sp = 0xffffffc000003858 fp = 0xffffffc000003a78 > > > > db_read_token() at kdb_backtrace+0x3c > > pc = 0xffffffc0000244f8 ra = 0xffffffc0001a5588 > > sp = 0xffffffc000003a78 fp = 0xffffffc000003a88 > > > > kdb_backtrace() at vpanic+0x158 > > pc = 0xffffffc0001a5588 ra = 0xffffffc00015bd74 > > sp = 0xffffffc000003a88 fp = 0xffffffc000003ac8 > > > > vpanic() at panic+0x34 > > pc = 0xffffffc00015bd74 ra = 0xffffffc00015c58c > > sp = 0xffffffc000003ac8 fp = 0xffffffc000003ae8 > > > > panic() at sysarch+0x36c > > pc = 0xffffffc00015c58c ra = 0xffffffc0004622b0 > > sp = 0xffffffc000003ae8 fp = 0xffffffc000003bf8 > > > > sysarch() at do_trap_supervisor+0xa0 > > pc = 0xffffffc0004622b0 ra = 0xffffffc000462498 > > sp = 0xffffffc000003bf8 fp = 0xffffffc000003c18 > > > > do_trap_supervisor() at cpu_exception_handler_supervisor+0xb0 > > pc = 0xffffffc000462498 ra = 0xffffffc000456440 > > sp = 0xffffffc000003c18 fp = 0xffffffc000003db0 > > > > cpu_exception_handler_supervisor() at ruxagg+0x34 > > pc = 0xffffffc000456440 ra = 0xffffffc000154458 > > sp = 0xffffffc000003db0 fp = 0xffffffc000003dd0 > > > > ruxagg() at rufetch+0x9c > > pc = 0xffffffc000154458 ra = 0xffffffc000154784 > > sp = 0xffffffc000003dd0 fp = 0xffffffc000003e00 > > > > rufetch() at exec_shell_imgact+0x1204 > > pc = 0xffffffc000154784 ra = 0xffffffc0000f9d4c > > sp = 0xffffffc000003e00 fp = 0xffffffc000003ee0 > > > > exec_shell_imgact() at mi_startup+0x190 > > pc = 0xffffffc0000f9d4c ra = 0xffffffc0000fa768 > > sp = 0xffffffc000003ee0 fp = 0xffffffc000003f20 > > > > mi_startup() at kernbase+0x248 > > pc = 0xffffffc0000fa768 ra = 0xffffffc000000248 > > sp = 0xffffffc000003f20 fp = 0x0000000085002ff8 > > > > KDB: enter: panic > > [ thread pid 0 tid 100000 ] > > Stopped at kdb_enter+0x4c: > > db> > > > > Ruslan > > > > On Tue, Nov 15, 2016 at 06:22:50PM +0000, Alan Cox wrote: > > > Author: alc > > > Date: Tue Nov 15 18:22:50 2016 > > > New Revision: 308691 > > > URL: https://svnweb.freebsd.org/changeset/base/308691 > > > > > > Log: > > > Remove most of the code for implementing PG_CACHED pages. (This change > > > does > > > not remove user-space visible fields from vm_cnt or all of the > > > references to > > > cached pages from comments. Those changes will come later.) > > > > > > Reviewed by: kib, markj > > > Tested by: pho > > > Sponsored by: Dell EMC Isilon > > > Differential Revision: https://reviews.freebsd.org/D8497 > > > > > > Modified: > > > head/sys/cddl/compat/opensolaris/sys/vnode.h > > > head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c > > > head/sys/fs/tmpfs/tmpfs_subr.c > > > head/sys/kern/kern_exec.c > > > head/sys/kern/uipc_shm.c > > > head/sys/vm/swap_pager.c > > > head/sys/vm/vm_fault.c > > > head/sys/vm/vm_mmap.c > > > head/sys/vm/vm_object.c > > > head/sys/vm/vm_object.h > > > head/sys/vm/vm_page.c > > > head/sys/vm/vm_page.h > > > head/sys/vm/vm_reserv.c > > > head/sys/vm/vm_reserv.h > > > head/sys/vm/vnode_pager.c > > > > > > Modified: head/sys/cddl/compat/opensolaris/sys/vnode.h > > > ============================================================================== > > > --- head/sys/cddl/compat/opensolaris/sys/vnode.h Tue Nov 15 17:01:48 > > > 2016 (r308690) > > > +++ head/sys/cddl/compat/opensolaris/sys/vnode.h Tue Nov 15 18:22:50 > > > 2016 (r308691) > > > @@ -75,8 +75,7 @@ vn_is_readonly(vnode_t *vp) > > > #define vn_mountedvfs(vp) ((vp)->v_mountedhere) > > > #define vn_has_cached_data(vp) \ > > > ((vp)->v_object != NULL && \ > > > - ((vp)->v_object->resident_page_count > 0 || \ > > > - !vm_object_cache_is_empty((vp)->v_object))) > > > + (vp)->v_object->resident_page_count > 0) > > > #define vn_exists(vp) do { } while (0) > > > #define vn_invalid(vp) do { } while (0) > > > #define vn_renamepath(tdvp, svp, tnm, lentnm) do { } while (0) > > > > > > Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c > > > ============================================================================== > > > --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c > > > Tue Nov 15 17:01:48 2016 (r308690) > > > +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c > > > Tue Nov 15 18:22:50 2016 (r308691) > > > @@ -426,10 +426,6 @@ page_busy(vnode_t *vp, int64_t start, in > > > continue; > > > } > > > vm_page_sbusy(pp); > > > - } else if (pp == NULL) { > > > - pp = vm_page_alloc(obj, OFF_TO_IDX(start), > > > - VM_ALLOC_SYSTEM | VM_ALLOC_IFCACHED | > > > - VM_ALLOC_SBUSY); > > > } else { > > > ASSERT(pp != NULL && !pp->valid); > > > pp = NULL; > > > > > > Modified: head/sys/fs/tmpfs/tmpfs_subr.c > > > ============================================================================== > > > --- head/sys/fs/tmpfs/tmpfs_subr.c Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/fs/tmpfs/tmpfs_subr.c Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -1372,12 +1372,9 @@ retry: > > > VM_WAIT; > > > VM_OBJECT_WLOCK(uobj); > > > goto retry; > > > - } else if (m->valid != VM_PAGE_BITS_ALL) > > > - rv = vm_pager_get_pages(uobj, &m, 1, > > > - NULL, NULL); > > > - else > > > - /* A cached page was reactivated. */ > > > - rv = VM_PAGER_OK; > > > + } > > > + rv = vm_pager_get_pages(uobj, &m, 1, NULL, > > > + NULL); > > > vm_page_lock(m); > > > if (rv == VM_PAGER_OK) { > > > vm_page_deactivate(m); > > > > > > Modified: head/sys/kern/kern_exec.c > > > ============================================================================== > > > --- head/sys/kern/kern_exec.c Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/kern/kern_exec.c Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -1006,7 +1006,7 @@ exec_map_first_page(imgp) > > > break; > > > } else { > > > ma[i] = vm_page_alloc(object, i, > > > - VM_ALLOC_NORMAL | VM_ALLOC_IFNOTCACHED); > > > + VM_ALLOC_NORMAL); > > > if (ma[i] == NULL) > > > break; > > > } > > > > > > Modified: head/sys/kern/uipc_shm.c > > > ============================================================================== > > > --- head/sys/kern/uipc_shm.c Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/kern/uipc_shm.c Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -455,12 +455,9 @@ retry: > > > VM_WAIT; > > > VM_OBJECT_WLOCK(object); > > > goto retry; > > > - } else if (m->valid != VM_PAGE_BITS_ALL) > > > - rv = vm_pager_get_pages(object, &m, 1, > > > - NULL, NULL); > > > - else > > > - /* A cached page was reactivated. */ > > > - rv = VM_PAGER_OK; > > > + } > > > + rv = vm_pager_get_pages(object, &m, 1, NULL, > > > + NULL); > > > vm_page_lock(m); > > > if (rv == VM_PAGER_OK) { > > > vm_page_deactivate(m); > > > > > > Modified: head/sys/vm/swap_pager.c > > > ============================================================================== > > > --- head/sys/vm/swap_pager.c Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/vm/swap_pager.c Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -1126,7 +1126,7 @@ swap_pager_getpages(vm_object_t object, > > > if (shift != 0) { > > > for (i = 1; i <= shift; i++) { > > > p = vm_page_alloc(object, m[0]->pindex - i, > > > - VM_ALLOC_NORMAL | VM_ALLOC_IFNOTCACHED); > > > + VM_ALLOC_NORMAL); > > > if (p == NULL) { > > > /* Shift allocated pages to the left. */ > > > for (j = 0; j < i - 1; j++) > > > @@ -1144,8 +1144,7 @@ swap_pager_getpages(vm_object_t object, > > > if (rahead != NULL) { > > > for (i = 0; i < *rahead; i++) { > > > p = vm_page_alloc(object, > > > - m[reqcount - 1]->pindex + i + 1, > > > - VM_ALLOC_NORMAL | VM_ALLOC_IFNOTCACHED); > > > + m[reqcount - 1]->pindex + i + 1, VM_ALLOC_NORMAL); > > > if (p == NULL) > > > break; > > > bp->b_pages[shift + reqcount + i] = p; > > > > > > Modified: head/sys/vm/vm_fault.c > > > ============================================================================== > > > --- head/sys/vm/vm_fault.c Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/vm/vm_fault.c Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -559,8 +559,7 @@ fast_failed: > > > unlock_and_deallocate(&fs); > > > VM_WAITPFAULT; > > > goto RetryFault; > > > - } else if (fs.m->valid == VM_PAGE_BITS_ALL) > > > - break; > > > + } > > > } > > > > > > readrest: > > > > > > Modified: head/sys/vm/vm_mmap.c > > > ============================================================================== > > > --- head/sys/vm/vm_mmap.c Tue Nov 15 17:01:48 2016 (r308690) > > > +++ head/sys/vm/vm_mmap.c Tue Nov 15 18:22:50 2016 (r308691) > > > @@ -877,9 +877,6 @@ RestartScan: > > > pindex = OFF_TO_IDX(current->offset + > > > (addr - current->start)); > > > m = vm_page_lookup(object, pindex); > > > - if (m == NULL && > > > - vm_page_is_cached(object, pindex)) > > > - mincoreinfo = MINCORE_INCORE; > > > if (m != NULL && m->valid == 0) > > > m = NULL; > > > if (m != NULL) > > > > > > Modified: head/sys/vm/vm_object.c > > > ============================================================================== > > > --- head/sys/vm/vm_object.c Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/vm/vm_object.c Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -178,9 +178,6 @@ vm_object_zdtor(void *mem, int size, voi > > > ("object %p has reservations", > > > object)); > > > #endif > > > - KASSERT(vm_object_cache_is_empty(object), > > > - ("object %p has cached pages", > > > - object)); > > > KASSERT(object->paging_in_progress == 0, > > > ("object %p paging_in_progress = %d", > > > object, object->paging_in_progress)); > > > @@ -212,8 +209,6 @@ vm_object_zinit(void *mem, int size, int > > > object->paging_in_progress = 0; > > > object->resident_page_count = 0; > > > object->shadow_count = 0; > > > - object->cache.rt_root = 0; > > > - object->cache.rt_flags = 0; > > > > > > mtx_lock(&vm_object_list_mtx); > > > TAILQ_INSERT_TAIL(&vm_object_list, object, object_list); > > > @@ -792,8 +787,6 @@ vm_object_terminate(vm_object_t object) > > > if (__predict_false(!LIST_EMPTY(&object->rvq))) > > > vm_reserv_break_all(object); > > > #endif > > > - if (__predict_false(!vm_object_cache_is_empty(object))) > > > - vm_page_cache_free(object, 0, 0); > > > > > > KASSERT(object->cred == NULL || object->type == OBJT_DEFAULT || > > > object->type == OBJT_SWAP, > > > @@ -1135,13 +1128,6 @@ shadowlookup: > > > } else if ((tobject->flags & OBJ_UNMANAGED) != 0) > > > goto unlock_tobject; > > > m = vm_page_lookup(tobject, tpindex); > > > - if (m == NULL && advise == MADV_WILLNEED) { > > > - /* > > > - * If the page is cached, reactivate it. > > > - */ > > > - m = vm_page_alloc(tobject, tpindex, VM_ALLOC_IFCACHED | > > > - VM_ALLOC_NOBUSY); > > > - } > > > if (m == NULL) { > > > /* > > > * There may be swap even if there is no backing page > > > @@ -1406,19 +1392,6 @@ retry: > > > swap_pager_copy(orig_object, new_object, offidxstart, 0); > > > TAILQ_FOREACH(m, &new_object->memq, listq) > > > vm_page_xunbusy(m); > > > - > > > - /* > > > - * Transfer any cached pages from orig_object to new_object. > > > - * If swap_pager_copy() found swapped out pages within the > > > - * specified range of orig_object, then it changed > > > - * new_object's type to OBJT_SWAP when it transferred those > > > - * pages to new_object. Otherwise, new_object's type > > > - * should still be OBJT_DEFAULT and orig_object should not > > > - * contain any cached pages within the specified range. > > > - */ > > > - if (__predict_false(!vm_object_cache_is_empty(orig_object))) > > > - vm_page_cache_transfer(orig_object, offidxstart, > > > - new_object); > > > } > > > VM_OBJECT_WUNLOCK(orig_object); > > > VM_OBJECT_WUNLOCK(new_object); > > > @@ -1754,13 +1727,6 @@ vm_object_collapse(vm_object_t object) > > > backing_object, > > > object, > > > OFF_TO_IDX(object->backing_object_offset), > > > TRUE); > > > - > > > - /* > > > - * Free any cached pages from backing_object. > > > - */ > > > - if (__predict_false( > > > - !vm_object_cache_is_empty(backing_object))) > > > - vm_page_cache_free(backing_object, 0, > > > 0); > > > } > > > /* > > > * Object now shadows whatever backing_object did. > > > @@ -1889,7 +1855,7 @@ vm_object_page_remove(vm_object_t object > > > (options & (OBJPR_CLEANONLY | OBJPR_NOTMAPPED)) == OBJPR_NOTMAPPED, > > > ("vm_object_page_remove: illegal options for object %p", object)); > > > if (object->resident_page_count == 0) > > > - goto skipmemq; > > > + return; > > > vm_object_pip_add(object, 1); > > > again: > > > p = vm_page_find_least(object, start); > > > @@ -1946,9 +1912,6 @@ next: > > > vm_page_unlock(p); > > > } > > > vm_object_pip_wakeup(object); > > > -skipmemq: > > > - if (__predict_false(!vm_object_cache_is_empty(object))) > > > - vm_page_cache_free(object, start, end); > > > } > > > > > > /* > > > > > > Modified: head/sys/vm/vm_object.h > > > ============================================================================== > > > --- head/sys/vm/vm_object.h Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/vm/vm_object.h Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -118,7 +118,6 @@ struct vm_object { > > > vm_ooffset_t backing_object_offset;/* Offset in backing object */ > > > TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of > > > this pager type */ > > > LIST_HEAD(, vm_reserv) rvq; /* list of reservations */ > > > - struct vm_radix cache; /* (o + f) root of the cache page radix > > > trie */ > > > void *handle; > > > union { > > > /* > > > @@ -290,13 +289,6 @@ void vm_object_pip_wakeup(vm_object_t ob > > > void vm_object_pip_wakeupn(vm_object_t object, short i); > > > void vm_object_pip_wait(vm_object_t object, char *waitid); > > > > > > -static __inline boolean_t > > > -vm_object_cache_is_empty(vm_object_t object) > > > -{ > > > - > > > - return (vm_radix_is_empty(&object->cache)); > > > -} > > > - > > > void umtx_shm_object_init(vm_object_t object); > > > void umtx_shm_object_terminated(vm_object_t object); > > > extern int umtx_shm_vnobj_persistent; > > > > > > Modified: head/sys/vm/vm_page.c > > > ============================================================================== > > > --- head/sys/vm/vm_page.c Tue Nov 15 17:01:48 2016 (r308690) > > > +++ head/sys/vm/vm_page.c Tue Nov 15 18:22:50 2016 (r308691) > > > @@ -154,8 +154,7 @@ static int vm_pageout_pages_needed; > > > > > > static uma_zone_t fakepg_zone; > > > > > > -static struct vnode *vm_page_alloc_init(vm_page_t m); > > > -static void vm_page_cache_turn_free(vm_page_t m); > > > +static void vm_page_alloc_check(vm_page_t m); > > > static void vm_page_clear_dirty_mask(vm_page_t m, vm_page_bits_t > > > pagebits); > > > static void vm_page_enqueue(uint8_t queue, vm_page_t m); > > > static void vm_page_free_wakeup(void); > > > @@ -1118,9 +1117,7 @@ void > > > vm_page_dirty_KBI(vm_page_t m) > > > { > > > > > > - /* These assertions refer to this operation by its public name. */ > > > - KASSERT((m->flags & PG_CACHED) == 0, > > > - ("vm_page_dirty: page in cache!")); > > > + /* Refer to this operation by its public name. */ > > > KASSERT(m->valid == VM_PAGE_BITS_ALL, > > > ("vm_page_dirty: page is invalid!")); > > > m->dirty = VM_PAGE_BITS_ALL; > > > @@ -1459,142 +1456,6 @@ vm_page_rename(vm_page_t m, vm_object_t > > > } > > > > > > /* > > > - * Convert all of the given object's cached pages that have a > > > - * pindex within the given range into free pages. If the value > > > - * zero is given for "end", then the range's upper bound is > > > - * infinity. If the given object is backed by a vnode and it > > > - * transitions from having one or more cached pages to none, the > > > - * vnode's hold count is reduced. > > > - */ > > > -void > > > -vm_page_cache_free(vm_object_t object, vm_pindex_t start, vm_pindex_t > > > end) > > > -{ > > > - vm_page_t m; > > > - boolean_t empty; > > > - > > > - mtx_lock(&vm_page_queue_free_mtx); > > > - if (__predict_false(vm_radix_is_empty(&object->cache))) { > > > - mtx_unlock(&vm_page_queue_free_mtx); > > > - return; > > > - } > > > - while ((m = vm_radix_lookup_ge(&object->cache, start)) != NULL) { > > > - if (end != 0 && m->pindex >= end) > > > - break; > > > - vm_radix_remove(&object->cache, m->pindex); > > > - vm_page_cache_turn_free(m); > > > - } > > > - empty = vm_radix_is_empty(&object->cache); > > > - mtx_unlock(&vm_page_queue_free_mtx); > > > - if (object->type == OBJT_VNODE && empty) > > > - vdrop(object->handle); > > > -} > > > - > > > -/* > > > - * Returns the cached page that is associated with the given > > > - * object and offset. If, however, none exists, returns NULL. > > > - * > > > - * The free page queue must be locked. > > > - */ > > > -static inline vm_page_t > > > -vm_page_cache_lookup(vm_object_t object, vm_pindex_t pindex) > > > -{ > > > - > > > - mtx_assert(&vm_page_queue_free_mtx, MA_OWNED); > > > - return (vm_radix_lookup(&object->cache, pindex)); > > > -} > > > - > > > -/* > > > - * Remove the given cached page from its containing object's > > > - * collection of cached pages. > > > - * > > > - * The free page queue must be locked. > > > - */ > > > -static void > > > -vm_page_cache_remove(vm_page_t m) > > > -{ > > > - > > > - mtx_assert(&vm_page_queue_free_mtx, MA_OWNED); > > > - KASSERT((m->flags & PG_CACHED) != 0, > > > - ("vm_page_cache_remove: page %p is not cached", m)); > > > - vm_radix_remove(&m->object->cache, m->pindex); > > > - m->object = NULL; > > > - vm_cnt.v_cache_count--; > > > -} > > > - > > > -/* > > > - * Transfer all of the cached pages with offset greater than or > > > - * equal to 'offidxstart' from the original object's cache to the > > > - * new object's cache. However, any cached pages with offset > > > - * greater than or equal to the new object's size are kept in the > > > - * original object. Initially, the new object's cache must be > > > - * empty. Offset 'offidxstart' in the original object must > > > - * correspond to offset zero in the new object. > > > - * > > > - * The new object must be locked. > > > - */ > > > -void > > > -vm_page_cache_transfer(vm_object_t orig_object, vm_pindex_t offidxstart, > > > - vm_object_t new_object) > > > -{ > > > - vm_page_t m; > > > - > > > - /* > > > - * Insertion into an object's collection of cached pages > > > - * requires the object to be locked. In contrast, removal does > > > - * not. > > > - */ > > > - VM_OBJECT_ASSERT_WLOCKED(new_object); > > > - KASSERT(vm_radix_is_empty(&new_object->cache), > > > - ("vm_page_cache_transfer: object %p has cached pages", > > > - new_object)); > > > - mtx_lock(&vm_page_queue_free_mtx); > > > - while ((m = vm_radix_lookup_ge(&orig_object->cache, > > > - offidxstart)) != NULL) { > > > - /* > > > - * Transfer all of the pages with offset greater than or > > > - * equal to 'offidxstart' from the original object's > > > - * cache to the new object's cache. > > > - */ > > > - if ((m->pindex - offidxstart) >= new_object->size) > > > - break; > > > - vm_radix_remove(&orig_object->cache, m->pindex); > > > - /* Update the page's object and offset. */ > > > - m->object = new_object; > > > - m->pindex -= offidxstart; > > > - if (vm_radix_insert(&new_object->cache, m)) > > > - vm_page_cache_turn_free(m); > > > - } > > > - mtx_unlock(&vm_page_queue_free_mtx); > > > -} > > > - > > > -/* > > > - * Returns TRUE if a cached page is associated with the given > > > object and > > > - * offset, and FALSE otherwise. > > > - * > > > - * The object must be locked. > > > - */ > > > -boolean_t > > > -vm_page_is_cached(vm_object_t object, vm_pindex_t pindex) > > > -{ > > > - vm_page_t m; > > > - > > > - /* > > > - * Insertion into an object's collection of cached pages requires the > > > - * object to be locked. Therefore, if the object is locked and the > > > - * object's collection is empty, there is no need to acquire the free > > > - * page queues lock in order to prove that the specified page doesn't > > > - * exist. > > > - */ > > > - VM_OBJECT_ASSERT_WLOCKED(object); > > > - if (__predict_true(vm_object_cache_is_empty(object))) > > > - return (FALSE); > > > - mtx_lock(&vm_page_queue_free_mtx); > > > - m = vm_page_cache_lookup(object, pindex); > > > - mtx_unlock(&vm_page_queue_free_mtx); > > > - return (m != NULL); > > > -} > > > - > > > -/* > > > * vm_page_alloc: > > > * > > > * Allocate and return a page that is associated with the specified > > > @@ -1610,9 +1471,6 @@ vm_page_is_cached(vm_object_t object, vm > > > * optional allocation flags: > > > * VM_ALLOC_COUNT(number) the number of additional pages that the > > > caller > > > * intends to allocate > > > - * VM_ALLOC_IFCACHED return page only if it is cached > > > - * VM_ALLOC_IFNOTCACHED return NULL, do not reactivate if the > > > page > > > - * is cached > > > * VM_ALLOC_NOBUSY do not exclusive busy the page > > > * VM_ALLOC_NODUMP do not include the page in a kernel > > > core dump > > > * VM_ALLOC_NOOBJ page is not associated with an object > > > and > > > @@ -1626,8 +1484,6 @@ vm_page_is_cached(vm_object_t object, vm > > > vm_page_t > > > vm_page_alloc(vm_object_t object, vm_pindex_t pindex, int req) > > > { > > > - struct vnode *vp = NULL; > > > - vm_object_t m_object; > > > vm_page_t m, mpred; > > > int flags, req_class; > > > > > > @@ -1670,31 +1526,12 @@ vm_page_alloc(vm_object_t object, vm_pin > > > * Allocate from the free queue if the number of free pages > > > * exceeds the minimum for the request class. > > > */ > > > - if (object != NULL && > > > - (m = vm_page_cache_lookup(object, pindex)) != NULL) { > > > - if ((req & VM_ALLOC_IFNOTCACHED) != 0) { > > > - mtx_unlock(&vm_page_queue_free_mtx); > > > - return (NULL); > > > - } > > > - if (vm_phys_unfree_page(m)) > > > - vm_phys_set_pool(VM_FREEPOOL_DEFAULT, m, 0); > > > -#if VM_NRESERVLEVEL > 0 > > > - else if (!vm_reserv_reactivate_page(m)) > > > -#else > > > - else > > > -#endif > > > - panic("vm_page_alloc: cache page %p is missing" > > > - " from the free queue", m); > > > - } else if ((req & VM_ALLOC_IFCACHED) != 0) { > > > - mtx_unlock(&vm_page_queue_free_mtx); > > > - return (NULL); > > > #if VM_NRESERVLEVEL > 0 > > > - } else if (object == NULL || (object->flags & (OBJ_COLORED | > > > + if (object == NULL || (object->flags & (OBJ_COLORED | > > > OBJ_FICTITIOUS)) != OBJ_COLORED || (m = > > > - vm_reserv_alloc_page(object, pindex, mpred)) == NULL) { > > > -#else > > > - } else { > > > + vm_reserv_alloc_page(object, pindex, mpred)) == NULL) > > > #endif > > > + { > > > m = vm_phys_alloc_pages(object != NULL ? > > > VM_FREEPOOL_DEFAULT : VM_FREEPOOL_DIRECT, 0); > > > #if VM_NRESERVLEVEL > 0 > > > @@ -1720,33 +1557,9 @@ vm_page_alloc(vm_object_t object, vm_pin > > > * At this point we had better have found a good page. > > > */ > > > KASSERT(m != NULL, ("vm_page_alloc: missing page")); > > > - KASSERT(m->queue == PQ_NONE, > > > - ("vm_page_alloc: page %p has unexpected queue %d", m, m->queue)); > > > - KASSERT(m->wire_count == 0, ("vm_page_alloc: page %p is wired", m)); > > > - KASSERT(m->hold_count == 0, ("vm_page_alloc: page %p is held", m)); > > > - KASSERT(!vm_page_busied(m), ("vm_page_alloc: page %p is busy", m)); > > > - KASSERT(m->dirty == 0, ("vm_page_alloc: page %p is dirty", m)); > > > - KASSERT(pmap_page_get_memattr(m) == VM_MEMATTR_DEFAULT, > > > - ("vm_page_alloc: page %p has unexpected memattr %d", m, > > > - pmap_page_get_memattr(m))); > > > - if ((m->flags & PG_CACHED) != 0) { > > > - KASSERT((m->flags & PG_ZERO) == 0, > > > - ("vm_page_alloc: cached page %p is PG_ZERO", m)); > > > - KASSERT(m->valid != 0, > > > - ("vm_page_alloc: cached page %p is invalid", m)); > > > - if (m->object != object || m->pindex != pindex) > > > - m->valid = 0; > > > - m_object = m->object; > > > - vm_page_cache_remove(m); > > > - if (m_object->type == OBJT_VNODE && > > > - vm_object_cache_is_empty(m_object)) > > > - vp = m_object->handle; > > > - } else { > > > - KASSERT(m->valid == 0, > > > - ("vm_page_alloc: free page %p is valid", m)); > > > - vm_phys_freecnt_adj(m, -1); > > > - } > > > + vm_phys_freecnt_adj(m, -1); > > > mtx_unlock(&vm_page_queue_free_mtx); > > > + vm_page_alloc_check(m); > > > > > > /* > > > * Initialize the page. Only the PG_ZERO flag is inherited. > > > @@ -1778,9 +1591,6 @@ vm_page_alloc(vm_object_t object, vm_pin > > > > > > if (object != NULL) { > > > if (vm_page_insert_after(m, object, pindex, mpred)) { > > > - /* See the comment below about hold count. */ > > > - if (vp != NULL) > > > - vdrop(vp); > > > pagedaemon_wakeup(); > > > if (req & VM_ALLOC_WIRED) { > > > atomic_subtract_int(&vm_cnt.v_wire_count, 1); > > > @@ -1801,15 +1611,6 @@ vm_page_alloc(vm_object_t object, vm_pin > > > m->pindex = pindex; > > > > > > /* > > > - * The following call to vdrop() must come after the above call > > > - * to vm_page_insert() in case both affect the same object and > > > - * vnode. Otherwise, the affected vnode's hold count could > > > - * temporarily become zero. > > > - */ > > > - if (vp != NULL) > > > - vdrop(vp); > > > - > > > - /* > > > * Don't wakeup too often - wakeup the pageout daemon when > > > * we would be nearly out of memory. > > > */ > > > @@ -1819,16 +1620,6 @@ vm_page_alloc(vm_object_t object, vm_pin > > > return (m); > > > } > > > > > > -static void > > > -vm_page_alloc_contig_vdrop(struct spglist *lst) > > > -{ > > > - > > > - while (!SLIST_EMPTY(lst)) { > > > - vdrop((struct vnode *)SLIST_FIRST(lst)-> plinks.s.pv); > > > - SLIST_REMOVE_HEAD(lst, plinks.s.ss); > > > - } > > > -} > > > - > > > /* > > > * vm_page_alloc_contig: > > > * > > > @@ -1873,8 +1664,6 @@ vm_page_alloc_contig(vm_object_t object, > > > u_long npages, vm_paddr_t low, vm_paddr_t high, u_long alignment, > > > vm_paddr_t boundary, vm_memattr_t memattr) > > > { > > > - struct vnode *drop; > > > - struct spglist deferred_vdrop_list; > > > vm_page_t m, m_tmp, m_ret; > > > u_int flags; > > > int req_class; > > > @@ -1900,7 +1689,6 @@ vm_page_alloc_contig(vm_object_t object, > > > if (curproc == pageproc && req_class != VM_ALLOC_INTERRUPT) > > > req_class = VM_ALLOC_SYSTEM; > > > > > > - SLIST_INIT(&deferred_vdrop_list); > > > mtx_lock(&vm_page_queue_free_mtx); > > > if (vm_cnt.v_free_count + vm_cnt.v_cache_count >= npages + > > > vm_cnt.v_free_reserved || (req_class == VM_ALLOC_SYSTEM && > > > @@ -1922,17 +1710,7 @@ retry: > > > return (NULL); > > > } > > > if (m_ret != NULL) > > > - for (m = m_ret; m < &m_ret[npages]; m++) { > > > - drop = vm_page_alloc_init(m); > > > - if (drop != NULL) { > > > - /* > > > - * Enqueue the vnode for deferred vdrop(). > > > - */ > > > - m->plinks.s.pv = drop; > > > - SLIST_INSERT_HEAD(&deferred_vdrop_list, m, > > > - plinks.s.ss); > > > - } > > > - } > > > + vm_phys_freecnt_adj(m_ret, -npages); > > > else { > > > #if VM_NRESERVLEVEL > 0 > > > if (vm_reserv_reclaim_contig(npages, low, high, alignment, > > > @@ -1943,6 +1721,8 @@ retry: > > > mtx_unlock(&vm_page_queue_free_mtx); > > > if (m_ret == NULL) > > > return (NULL); > > > + for (m = m_ret; m < &m_ret[npages]; m++) > > > + vm_page_alloc_check(m); > > > > > > /* > > > * Initialize the pages. Only the PG_ZERO flag is inherited. > > > @@ -1975,8 +1755,6 @@ retry: > > > m->oflags = VPO_UNMANAGED; > > > if (object != NULL) { > > > if (vm_page_insert(m, object, pindex)) { > > > - vm_page_alloc_contig_vdrop( > > > - &deferred_vdrop_list); > > > if (vm_paging_needed()) > > > pagedaemon_wakeup(); > > > if ((req & VM_ALLOC_WIRED) != 0) > > > @@ -2001,57 +1779,28 @@ retry: > > > pmap_page_set_memattr(m, memattr); > > > pindex++; > > > } > > > - vm_page_alloc_contig_vdrop(&deferred_vdrop_list); > > > if (vm_paging_needed()) > > > pagedaemon_wakeup(); > > > return (m_ret); > > > } > > > > > > /* > > > - * Initialize a page that has been freshly dequeued from a freelist. > > > - * The caller has to drop the vnode returned, if it is not NULL. > > > - * > > > - * This function may only be used to initialize unmanaged pages. > > > - * > > > - * To be called with vm_page_queue_free_mtx held. > > > + * Check a page that has been freshly dequeued from a freelist. > > > */ > > > -static struct vnode * > > > -vm_page_alloc_init(vm_page_t m) > > > +static void > > > +vm_page_alloc_check(vm_page_t m) > > > { > > > - struct vnode *drop; > > > - vm_object_t m_object; > > > > > > KASSERT(m->queue == PQ_NONE, > > > - ("vm_page_alloc_init: page %p has unexpected queue %d", > > > - m, m->queue)); > > > - KASSERT(m->wire_count == 0, > > > - ("vm_page_alloc_init: page %p is wired", m)); > > > - KASSERT(m->hold_count == 0, > > > - ("vm_page_alloc_init: page %p is held", m)); > > > - KASSERT(!vm_page_busied(m), > > > - ("vm_page_alloc_init: page %p is busy", m)); > > > - KASSERT(m->dirty == 0, > > > - ("vm_page_alloc_init: page %p is dirty", m)); > > > + ("page %p has unexpected queue %d", m, m->queue)); > > > + KASSERT(m->wire_count == 0, ("page %p is wired", m)); > > > + KASSERT(m->hold_count == 0, ("page %p is held", m)); > > > + KASSERT(!vm_page_busied(m), ("page %p is busy", m)); > > > + KASSERT(m->dirty == 0, ("page %p is dirty", m)); > > > KASSERT(pmap_page_get_memattr(m) == VM_MEMATTR_DEFAULT, > > > - ("vm_page_alloc_init: page %p has unexpected memattr %d", > > > + ("page %p has unexpected memattr %d", > > > m, pmap_page_get_memattr(m))); > > > - mtx_assert(&vm_page_queue_free_mtx, MA_OWNED); > > > - drop = NULL; > > > - if ((m->flags & PG_CACHED) != 0) { > > > - KASSERT((m->flags & PG_ZERO) == 0, > > > - ("vm_page_alloc_init: cached page %p is PG_ZERO", m)); > > > - m->valid = 0; > > > - m_object = m->object; > > > - vm_page_cache_remove(m); > > > - if (m_object->type == OBJT_VNODE && > > > - vm_object_cache_is_empty(m_object)) > > > - drop = m_object->handle; > > > - } else { > > > - KASSERT(m->valid == 0, > > > - ("vm_page_alloc_init: free page %p is valid", m)); > > > - vm_phys_freecnt_adj(m, -1); > > > - } > > > - return (drop); > > > + KASSERT(m->valid == 0, ("free page %p is valid", m)); > > > } > > > > > > /* > > > @@ -2077,7 +1826,6 @@ vm_page_alloc_init(vm_page_t m) > > > vm_page_t > > > vm_page_alloc_freelist(int flind, int req) > > > { > > > - struct vnode *drop; > > > vm_page_t m; > > > u_int flags; > > > int req_class; > > > @@ -2111,8 +1859,9 @@ vm_page_alloc_freelist(int flind, int re > > > mtx_unlock(&vm_page_queue_free_mtx); > > > return (NULL); > > > } > > > - drop = vm_page_alloc_init(m); > > > + vm_phys_freecnt_adj(m, -1); > > > mtx_unlock(&vm_page_queue_free_mtx); > > > + vm_page_alloc_check(m); > > > > > > /* > > > * Initialize the page. Only the PG_ZERO flag is inherited. > > > @@ -2132,8 +1881,6 @@ vm_page_alloc_freelist(int flind, int re > > > } > > > /* Unmanaged pages don't use "act_count". */ > > > m->oflags = VPO_UNMANAGED; > > > - if (drop != NULL) > > > - vdrop(drop); > > > if (vm_paging_needed()) > > > pagedaemon_wakeup(); > > > return (m); > > > @@ -2259,38 +2006,8 @@ retry: > > > /* Don't care: PG_NODUMP, PG_ZERO. */ > > > if (object->type != OBJT_DEFAULT && > > > object->type != OBJT_SWAP && > > > - object->type != OBJT_VNODE) > > > + object->type != OBJT_VNODE) { > > > run_ext = 0; > > > - else if ((m->flags & PG_CACHED) != 0 || > > > - m != vm_page_lookup(object, m->pindex)) { > > > - /* > > > - * The page is cached or recently converted > > > - * from cached to free. > > > - */ > > > -#if VM_NRESERVLEVEL > 0 > > > - if (level >= 0) { > > > - /* > > > - * The page is reserved. Extend the > > > - * current run by one page. > > > - */ > > > - run_ext = 1; > > > - } else > > > -#endif > > > - if ((order = m->order) < VM_NFREEORDER) { > > > - /* > > > - * The page is enqueued in the > > > - * physical memory allocator's cache/ > > > - * free page queues. Moreover, it is > > > - * the first page in a power-of-two- > > > - * sized run of contiguous cache/free > > > - * pages. Add these pages to the end > > > - * of the current run, and jump > > > - * ahead. > > > - */ > > > - run_ext = 1 << order; > > > - m_inc = 1 << order; > > > - } else > > > - run_ext = 0; > > > #if VM_NRESERVLEVEL > 0 > > > } else if ((options & VPSC_NOSUPER) != 0 && > > > (level = vm_reserv_level_iffullpop(m)) >= 0) { > > > @@ -2457,15 +2174,7 @@ retry: > > > object->type != OBJT_SWAP && > > > object->type != OBJT_VNODE) > > > error = EINVAL; > > > - else if ((m->flags & PG_CACHED) != 0 || > > > - m != vm_page_lookup(object, m->pindex)) { > > > - /* > > > - * The page is cached or recently converted > > > - * from cached to free. > > > - */ > > > - VM_OBJECT_WUNLOCK(object); > > > - goto cached; > > > - } else if (object->memattr != VM_MEMATTR_DEFAULT) > > > + else if (object->memattr != VM_MEMATTR_DEFAULT) > > > error = EINVAL; > > > else if (m->queue != PQ_NONE && !vm_page_busied(m)) { > > > KASSERT(pmap_page_get_memattr(m) == > > > @@ -2566,7 +2275,6 @@ retry: > > > unlock: > > > VM_OBJECT_WUNLOCK(object); > > > } else { > > > -cached: > > > mtx_lock(&vm_page_queue_free_mtx); > > > order = m->order; > > > if (order < VM_NFREEORDER) { > > > @@ -2964,27 +2672,6 @@ vm_page_free_wakeup(void) > > > } > > > > > > /* > > > - * Turn a cached page into a free page, by changing its attributes. > > > - * Keep the statistics up-to-date. > > > - * > > > - * The free page queue must be locked. > > > - */ > > > -static void > > > -vm_page_cache_turn_free(vm_page_t m) > > > -{ > > > - > > > - mtx_assert(&vm_page_queue_free_mtx, MA_OWNED); > > > - > > > - m->object = NULL; > > > - m->valid = 0; > > > - KASSERT((m->flags & PG_CACHED) != 0, > > > - ("vm_page_cache_turn_free: page %p is not cached", m)); > > > - m->flags &= ~PG_CACHED; > > > - vm_cnt.v_cache_count--; > > > - vm_phys_freecnt_adj(m, 1); > > > -} > > > - > > > -/* > > > * vm_page_free_toq: > > > * > > > * Returns the given page to the free list, > > > @@ -3383,8 +3070,7 @@ retrylookup: > > > VM_WAIT; > > > VM_OBJECT_WLOCK(object); > > > goto retrylookup; > > > - } else if (m->valid != 0) > > > - return (m); > > > + } > > > if (allocflags & VM_ALLOC_ZERO && (m->flags & PG_ZERO) == 0) > > > pmap_zero_page(m); > > > return (m); > > > > > > Modified: head/sys/vm/vm_page.h > > > ============================================================================== > > > --- head/sys/vm/vm_page.h Tue Nov 15 17:01:48 2016 (r308690) > > > +++ head/sys/vm/vm_page.h Tue Nov 15 18:22:50 2016 (r308691) > > > @@ -326,7 +326,6 @@ extern struct mtx_padalign pa_lock[]; > > > * Page flags. If changed at any other time than page allocation or > > > * freeing, the modification must be protected by the vm_page lock. > > > */ > > > -#define PG_CACHED 0x0001 /* page is cached */ > > > #define PG_FICTITIOUS 0x0004 /* physical page doesn't exist > > > */ > > > #define PG_ZERO 0x0008 /* page is zeroed */ > > > #define PG_MARKER 0x0010 /* special queue marker page */ > > > @@ -409,8 +408,6 @@ vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa) > > > #define VM_ALLOC_ZERO 0x0040 /* (acfg) Try to obtain a > > > zeroed page */ > > > #define VM_ALLOC_NOOBJ 0x0100 /* (acg) No associated object */ > > > #define VM_ALLOC_NOBUSY 0x0200 /* (acg) Do not busy the page */ > > > -#define VM_ALLOC_IFCACHED 0x0400 /* (ag) Fail if page is not > > > cached */ > > > -#define VM_ALLOC_IFNOTCACHED 0x0800 /* (ag) Fail if page is cached > > > */ > > > #define VM_ALLOC_IGN_SBUSY 0x1000 /* (g) Ignore shared busy flag > > > */ > > > #define VM_ALLOC_NODUMP 0x2000 /* (ag) don't include in dump */ > > > #define VM_ALLOC_SBUSY 0x4000 /* (acg) Shared busy the page */ > > > @@ -453,8 +450,6 @@ vm_page_t vm_page_alloc_contig(vm_object > > > vm_paddr_t boundary, vm_memattr_t memattr); > > > vm_page_t vm_page_alloc_freelist(int, int); > > > vm_page_t vm_page_grab (vm_object_t, vm_pindex_t, int); > > > -void vm_page_cache_free(vm_object_t, vm_pindex_t, vm_pindex_t); > > > -void vm_page_cache_transfer(vm_object_t, vm_pindex_t, vm_object_t); > > > int vm_page_try_to_free (vm_page_t); > > > void vm_page_deactivate (vm_page_t); > > > void vm_page_deactivate_noreuse(vm_page_t); > > > @@ -464,7 +459,6 @@ vm_page_t vm_page_find_least(vm_object_t > > > vm_page_t vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr); > > > void vm_page_initfake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t > > > memattr); > > > int vm_page_insert (vm_page_t, vm_object_t, vm_pindex_t); > > > -boolean_t vm_page_is_cached(vm_object_t object, vm_pindex_t pindex); > > > void vm_page_launder(vm_page_t m); > > > vm_page_t vm_page_lookup (vm_object_t, vm_pindex_t); > > > vm_page_t vm_page_next(vm_page_t m); > > > > > > Modified: head/sys/vm/vm_reserv.c > > > ============================================================================== > > > --- head/sys/vm/vm_reserv.c Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/vm/vm_reserv.c Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -908,45 +908,6 @@ vm_reserv_level_iffullpop(vm_page_t m) > > > } > > > > > > /* > > > - * Prepare for the reactivation of a cached page. > > > - * > > > - * First, suppose that the given page "m" was allocated individually, > > > i.e., not > > > - * as part of a reservation, and cached. Then, suppose a reservation > > > - * containing "m" is allocated by the same object. Although "m" and the > > > - * reservation belong to the same object, "m"'s pindex may not match the > > > - * reservation's. > > > - * > > > - * The free page queue must be locked. > > > - */ > > > -boolean_t > > > -vm_reserv_reactivate_page(vm_page_t m) > > > -{ > > > - vm_reserv_t rv; > > > - int index; > > > - > > > - mtx_assert(&vm_page_queue_free_mtx, MA_OWNED); > > > - rv = vm_reserv_from_page(m); > > > - if (rv->object == NULL) > > > - return (FALSE); > > > - KASSERT((m->flags & PG_CACHED) != 0, > > > - ("vm_reserv_reactivate_page: page %p is not cached", m)); > > > - if (m->object == rv->object && > > > - m->pindex - rv->pindex == (index = VM_RESERV_INDEX(m->object, > > > - m->pindex))) > > > - vm_reserv_populate(rv, index); > > > - else { > > > - KASSERT(rv->inpartpopq, > > > - ("vm_reserv_reactivate_page: reserv %p's inpartpopq is FALSE", > > > - rv)); > > > - TAILQ_REMOVE(&vm_rvq_partpop, rv, partpopq); > > > - rv->inpartpopq = FALSE; > > > - /* Don't release "m" to the physical memory allocator. */ > > > - vm_reserv_break(rv, m); > > > - } > > > - return (TRUE); > > > -} > > > - > > > -/* > > > * Breaks the given partially-populated reservation, releasing its > > > cached and > > > * free pages to the physical memory allocator. > > > * > > > > > > Modified: head/sys/vm/vm_reserv.h > > > ============================================================================== > > > --- head/sys/vm/vm_reserv.h Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/vm/vm_reserv.h Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -56,7 +56,6 @@ void vm_reserv_init(void); > > > bool vm_reserv_is_page_free(vm_page_t m); > > > int vm_reserv_level(vm_page_t m); > > > int vm_reserv_level_iffullpop(vm_page_t m); > > > -boolean_t vm_reserv_reactivate_page(vm_page_t m); > > > boolean_t vm_reserv_reclaim_contig(u_long npages, vm_paddr_t low, > > > vm_paddr_t high, u_long alignment, vm_paddr_t boundary); > > > boolean_t vm_reserv_reclaim_inactive(void); > > > > > > Modified: head/sys/vm/vnode_pager.c > > > ============================================================================== > > > --- head/sys/vm/vnode_pager.c Tue Nov 15 17:01:48 2016 > > > (r308690) > > > +++ head/sys/vm/vnode_pager.c Tue Nov 15 18:22:50 2016 > > > (r308691) > > > @@ -466,10 +466,6 @@ vnode_pager_setsize(struct vnode *vp, vm > > > * replacement from working properly. > > > */ > > > vm_page_clear_dirty(m, base, PAGE_SIZE - base); > > > - } else if ((nsize & PAGE_MASK) && > > > - vm_page_is_cached(object, OFF_TO_IDX(nsize))) { > > > - vm_page_cache_free(object, OFF_TO_IDX(nsize), > > > - nobjsize); > > > } > > > } > > > object->un_pager.vnp.vnp_size = nsize; > > > @@ -894,8 +890,7 @@ vnode_pager_generic_getpages(struct vnod > > > for (tpindex = m[0]->pindex - 1; > > > tpindex >= startpindex && tpindex < m[0]->pindex; > > > tpindex--, i++) { > > > - p = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL | > > > - VM_ALLOC_IFNOTCACHED); > > > + p = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL); > > > if (p == NULL) { > > > /* Shift the array. */ > > > for (int j = 0; j < i; j++) > > > @@ -932,8 +927,7 @@ vnode_pager_generic_getpages(struct vnod > > > > > > for (tpindex = m[count - 1]->pindex + 1; > > > tpindex < endpindex; i++, tpindex++) { > > > - p = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL | > > > - VM_ALLOC_IFNOTCACHED); > > > + p = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL); > > > if (p == NULL) > > > break; > > > bp->b_pages[i] = p; > > > > > > _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"