#
6aede562 |
| 05-Sep-2024 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys: hide alloc_freelist_pages
Make vm_phys_alloc_freelist_pages static. There are no longer any callers outside of vm_phys.c.
Reviewed by: alc, markj Differential Revision: https://reviews.fr
vm_phys: hide alloc_freelist_pages
Make vm_phys_alloc_freelist_pages static. There are no longer any callers outside of vm_phys.c.
Reviewed by: alc, markj Differential Revision: https://reviews.freebsd.org/D46539
show more ...
|
#
517c5854 |
| 14-Jun-2024 |
Mark Johnston <markj@FreeBSD.org> |
vm_phys: Make sure that vm_phys_enq_chunk() stays in bounds
vm_phys_enq_chunk() inserts a run of pages into the buddy queues. When lazy initialization is enabled, only the first page of each run is
vm_phys: Make sure that vm_phys_enq_chunk() stays in bounds
vm_phys_enq_chunk() inserts a run of pages into the buddy queues. When lazy initialization is enabled, only the first page of each run is initialized; vm_phys_enq_chunk() thus initializes the page following the just-inserted run.
This fails to account for the possibility that the page following the run doesn't belong to the segment. Handle that in vm_phys_enq_chunk().
Reported by: KASAN Reported by: syzbot+1097ef4cee8dfb240e31@syzkaller.appspotmail.com Fixes: b16b4c22d2d1 ("vm_page: Implement lazy page initialization")
show more ...
|
#
fbff6d54 |
| 14-Jun-2024 |
Mark Johnston <markj@FreeBSD.org> |
vm_phys: Fix vm_phys_find_range() after commit 69cbb18746b6
vm_phys_seg_paddr_to_vm_page() expects a PA that's in bounds, but vm_phys_find_range() purposefully returns a pointer to the end of the la
vm_phys: Fix vm_phys_find_range() after commit 69cbb18746b6
vm_phys_seg_paddr_to_vm_page() expects a PA that's in bounds, but vm_phys_find_range() purposefully returns a pointer to the end of the last page in a segment.
Fixes: 69cbb18746b6 ("vm_phys: Add a vm_phys_seg_paddr_to_vm_page() helper")
show more ...
|
#
b16b4c22 |
| 14-Jun-2024 |
Mark Johnston <markj@FreeBSD.org> |
vm_page: Implement lazy page initialization
FreeBSD's boot times have decreased to the point where vm_page array initialization represents a significant fraction of the total boot time. For example,
vm_page: Implement lazy page initialization
FreeBSD's boot times have decreased to the point where vm_page array initialization represents a significant fraction of the total boot time. For example, when booting FreeBSD in Firecracker (a VMM designed to support lightweight VMs) with 128MB and 1GB of RAM, vm_page initialization consumes 9% (3ms) and 37% (21.5ms) of the kernel boot time, respectively. This is generally relevant in cloud environments, where one wants to be able to spin up VMs as quickly as possible.
This patch implements lazy initialization of (most) page structures, following a suggestion from cperciva@. The idea is to introduce a new free pool, VM_FREEPOOL_LAZYINIT, into which all vm_page structures are initially placed. For this to work, we need only initialize the first free page of each chunk placed into the buddy allocator. Then, early page allocations draw from the lazy init pool and initialize vm_page chunks (up to 16MB, 4096 pages) on demand. Once APs are started, an idle-priority thread drains the lazy init pool in the background to avoid introducing extra latency in the allocator. With this scheme, almost all of the initialization work is moved out of the critical path.
A couple of vm_phys operations require the pool to be drained before they can run: vm_phys_find_range() and vm_phys_unfree_page(). However, these are rare operations. I believe that vm_phys_find_freelist_contig() does not require any special treatment, as it only ever accesses the first page in a power-of-2-sized free page chunk, which is always initialized.
For now the new pool is only used on amd64 and arm64, since that's where I can easily test and those platforms would get the most benefit.
Reviewed by: alc, kib Differential Revision: https://reviews.freebsd.org/D40403
show more ...
|
#
69cbb187 |
| 14-Jun-2024 |
Mark Johnston <markj@FreeBSD.org> |
vm_phys: Add a vm_phys_seg_paddr_to_vm_page() helper
No functional change intended.
Suggested by: alc Reviewed by: dougm, alc, kib MFC after: 2 weeks Differential Revision: https://reviews.freebsd.
vm_phys: Add a vm_phys_seg_paddr_to_vm_page() helper
No functional change intended.
Suggested by: alc Reviewed by: dougm, alc, kib MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D43636
show more ...
|
#
d7ec4a88 |
| 14-Jun-2024 |
Mark Johnston <markj@FreeBSD.org> |
vm_phys: Factor out some calls to vm_freelist_add()
A subsequent patch will make this factoring more worthwhile.
No functional change intended.
Reviewed by: dougm, alc, kib, emaste MFC after: 2 we
vm_phys: Factor out some calls to vm_freelist_add()
A subsequent patch will make this factoring more worthwhile.
No functional change intended.
Reviewed by: dougm, alc, kib, emaste MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D40400
show more ...
|
#
543d55d7 |
| 04-Jun-2024 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys: use ilog2(x) instead of fls(x)-1
One of these changes saves two instructions on an amd64 GENERIC-NODEBUG build. The rest are entirely cosmetic, because the compiler can deduce that x is non
vm_phys: use ilog2(x) instead of fls(x)-1
One of these changes saves two instructions on an amd64 GENERIC-NODEBUG build. The rest are entirely cosmetic, because the compiler can deduce that x is nonzero, and avoid the needless test.
Reviewed by: alc Differential Revision: https://reviews.freebsd.org/D45331
show more ...
|
#
e3537f92 |
| 03-Jun-2024 |
Doug Moore <dougm@FreeBSD.org> |
Revert "subr_pctrie: use ilog2(x) instead of fls(x)-1"
This reverts commit 574ef650695088d56ea12df7da76155370286f9f.
|
#
574ef650 |
| 03-Jun-2024 |
Doug Moore <dougm@FreeBSD.org> |
subr_pctrie: use ilog2(x) instead of fls(x)-1
In three instances where fls(x)-1 is used, the compiler does not know that x is nonzero and so adds needless zero checks. Using ilog(x) instead saves,
subr_pctrie: use ilog2(x) instead of fls(x)-1
In three instances where fls(x)-1 is used, the compiler does not know that x is nonzero and so adds needless zero checks. Using ilog(x) instead saves, in each instance, about 4 instructions, including a conditional, and 16 or so bytes, on an amd64 build.
Reviewed by: alc Differential Revision: https://reviews.freebsd.org/D45330
show more ...
|
Revision tags: release/14.1.0 |
|
#
cb20a74c |
| 03-Apr-2024 |
Stephen J. Kiernan <stevek@FreeBSD.org> |
vm: add macro to mark arguments used when NUMA is defined
This fixes compiler warnings when -Wunused-arguments is enabled and not quieted.
Reviewed by: kib, markj Obtained from: Juniper Networks, I
vm: add macro to mark arguments used when NUMA is defined
This fixes compiler warnings when -Wunused-arguments is enabled and not quieted.
Reviewed by: kib, markj Obtained from: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D44623
show more ...
|
Revision tags: release/13.3.0 |
|
#
6dd15b7a |
| 21-Dec-2023 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys; fix uncalled free_contig
Function vm_phys_free_contig does not always free memory properly when the npages parameter is less than max block size. Change it so that it does.
Note that this
vm_phys; fix uncalled free_contig
Function vm_phys_free_contig does not always free memory properly when the npages parameter is less than max block size. Change it so that it does.
Note that this function is not currently invoked, and this error was not triggered in earlier versions of the code.
Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D42891
show more ...
|
#
2a4897bd |
| 15-Nov-2023 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys: fix freelist_contig
vm_phys_find_freelist_contig is called to search a list of max-sized free page blocks and find one that, when joined with adjacent blocks in memory, can satisfy a reques
vm_phys: fix freelist_contig
vm_phys_find_freelist_contig is called to search a list of max-sized free page blocks and find one that, when joined with adjacent blocks in memory, can satisfy a request for a memory allocation bigger than any single max-sized free page block. In commit fa8a6585c7522b7de6d29802967bd5eba2f2dcf1, I defined this function in order to offer two improvements: 1) reduce the worst-case search time, and 2) allow solutions that include less-than max-sized free page blocks at the front or back of the giant allocation. However, it turns out that this change introduced an error, reported in In Bug 274592. That error concerns failing to check segment boundaries. This change fixes an error in vm_phys_find_freelist_config that resolves that bug. It also abandons improvement 2), because the value of that improvement is small and because preserving it would require more testing than I am able to do.
PR: 274592 Reported by: shafaisal.us@gmail.com Reviewed by: alc, markj Tested by: shafaisal.us@gmail.com Fixes: fa8a6585c752 vm_phys: avoid waste in multipage allocation MFC after: 10 days Differential Revision: https://reviews.freebsd.org/D42509
show more ...
|
Revision tags: release/14.0.0 |
|
#
c415cfc8 |
| 12-Oct-2023 |
Zhenlei Huang <zlei@FreeBSD.org> |
vm_phys: Add corresponding sysctl knob for loader tunable
The loader tunable 'vm.numa.disabled' does not have corresponding sysctl MIB entry. Add it so that it can be retrieved, and `sysctl -T` will
vm_phys: Add corresponding sysctl knob for loader tunable
The loader tunable 'vm.numa.disabled' does not have corresponding sysctl MIB entry. Add it so that it can be retrieved, and `sysctl -T` will also report it correctly.
Reviewed by: markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D42138
show more ...
|
#
685dc743 |
| 16-Aug-2023 |
Warner Losh <imp@FreeBSD.org> |
sys: Remove $FreeBSD$: one-line .c pattern
Remove /^[\s*]*__FBSDID\("\$FreeBSD\$"\);?\s*\n/
|
#
e77f4e7f |
| 05-Aug-2023 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys: tune vm_phys_enqueue_contig loop
Rewrite the final loop in vm_phys_enqueue_contig as a new function, vm_phys_enq_beg, to reduce amd64 code size.
Reviewed by: kib Differential Revision: htt
vm_phys: tune vm_phys_enqueue_contig loop
Rewrite the final loop in vm_phys_enqueue_contig as a new function, vm_phys_enq_beg, to reduce amd64 code size.
Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D41289
show more ...
|
#
ccdb2827 |
| 04-Aug-2023 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys_enq_range: no alignment assert for npages==0
Do not assume that when vm_phys_enq_range is passed npages==0 that the vm_page argument is valid in any way, much less that it has a page-aligned
vm_phys_enq_range: no alignment assert for npages==0
Do not assume that when vm_phys_enq_range is passed npages==0 that the vm_page argument is valid in any way, much less that it has a page-aligned address. Just don't look at it. Assert nothing about it.
Reported by: karels Differential Revision: https://reviews.freebsd.org/D41317
show more ...
|
#
c9b06fa5 |
| 03-Aug-2023 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys_enqueue_contig: handle npages==0
By letting vm_phys_enqueue_contig handle the case when npages == 0, the callers can stop checking it, and the compiler can stop zero-checking with every call
vm_phys_enqueue_contig: handle npages==0
By letting vm_phys_enqueue_contig handle the case when npages == 0, the callers can stop checking it, and the compiler can stop zero-checking with every call to ffs(). Letting vm_phys_enqueue_contig call vm_phys_enqueue_contig for part of its work also saves a few bytes.
The amd64 object code shrinks by 128 bytes.
Reviewed by: kib (previous version) Tested by: pho Differential Revision: https://reviews.freebsd.org/D41154
show more ...
|
#
b7370efa |
| 02-Aug-2023 |
Doug Moore <dougm@FreeBSD.org> |
Revert "vm_phys_enqueue_contig: handle npages==0"
This reverts commit 1a7fcf6d51eb67ee3e05fdbb806f7e68f9f53c9c.
Peter Holm reported a problem, so I'm reverting now and looking for the problem later.
|
#
1a7fcf6d |
| 02-Aug-2023 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys_enqueue_contig: handle npages==0
By letting vm_phys_enqueue_contig handle the case when npages == 0, the callers can stop checking it, and the compiler can stop zero-checking with every call
vm_phys_enqueue_contig: handle npages==0
By letting vm_phys_enqueue_contig handle the case when npages == 0, the callers can stop checking it, and the compiler can stop zero-checking with every call to ffs(). Letting vm_phys_enqueue_contig call vm_phys_enqueue_contig for part of its work also saves a few bytes.
The amd64 object code shrinks by 80 bytes.
Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D41154
show more ...
|
#
58d42717 |
| 16-Jun-2023 |
Alan Cox <alc@FreeBSD.org> |
vm_phys: Fix typo in 9e8174289236
|
#
9e817428 |
| 16-Jun-2023 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys: add binary segment search
Replace several sequential searches for a segment that contains a phyiscal address with a call to a function that does it by binary search. In vm_page_reclaim_con
vm_phys: add binary segment search
Replace several sequential searches for a segment that contains a phyiscal address with a call to a function that does it by binary search. In vm_page_reclaim_contig_domain_ext, find the first segment to reclaim from, and reclaim from each subsequent appropriate segment. Eliminate vm_phys_scan_contig.
Reviewed by: alc, markj Differential Revision: https://reviews.freebsd.org/D40058
show more ...
|
#
6062d9fa |
| 05-Jun-2023 |
Mark Johnston <markj@FreeBSD.org> |
vm_phys: Change the return type of vm_phys_unfree_page() to bool
This is in keeping with the trend of removing uses of boolean_t, and the sole caller was implicitly converting it to a "bool".
No fu
vm_phys: Change the return type of vm_phys_unfree_page() to bool
This is in keeping with the trend of removing uses of boolean_t, and the sole caller was implicitly converting it to a "bool".
No functional change intended.
Reviewed by: dougm, alc, imp, kib MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D40401
show more ...
|
#
4d846d26 |
| 10-May-2023 |
Warner Losh <imp@FreeBSD.org> |
spdx: The BSD-2-Clause-FreeBSD identifier is obsolete, drop -FreeBSD
The SPDX folks have obsoleted the BSD-2-Clause-FreeBSD identifier. Catch up to that fact and revert to their recommended match of
spdx: The BSD-2-Clause-FreeBSD identifier is obsolete, drop -FreeBSD
The SPDX folks have obsoleted the BSD-2-Clause-FreeBSD identifier. Catch up to that fact and revert to their recommended match of BSD-2-Clause.
Discussed with: pfg MFC After: 3 days Sponsored by: Netflix
show more ...
|
Revision tags: release/13.2.0, release/12.4.0 |
|
#
c84c5e00 |
| 18-Jul-2022 |
Mitchell Horne <mhorne@FreeBSD.org> |
ddb: annotate some commands with DB_CMD_MEMSAFE
This is not completely exhaustive, but covers a large majority of commands in the tree.
Reviewed by: markj Sponsored by: Juniper Networks, Inc. Spons
ddb: annotate some commands with DB_CMD_MEMSAFE
This is not completely exhaustive, but covers a large majority of commands in the tree.
Reviewed by: markj Sponsored by: Juniper Networks, Inc. Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D35583
show more ...
|
Revision tags: release/13.1.0 |
|
#
fa8a6585 |
| 26-Apr-2022 |
Doug Moore <dougm@FreeBSD.org> |
vm_phys: avoid waste in multipage allocation
In vm_phys_alloc_contig, for an allocation bigger than the size of any buddy queue free block, avoid examining any maximum-size free block more than twic
vm_phys: avoid waste in multipage allocation
In vm_phys_alloc_contig, for an allocation bigger than the size of any buddy queue free block, avoid examining any maximum-size free block more than twice, by only starting to consider a sequence of adjacent max-blocks starting at a max-block that does not follow another max-block. If that first max-block follows adjacent blocks of smaller size, and if together they provide enough memory to reduce by one the number of max-blocks required for this allocation, use them as part of this allocation.
Reviewed by: markj Tested by: pho Discussed with: alc Differential Revision: https://reviews.freebsd.org/D34815
show more ...
|