#
554491ff |
| 20-Apr-2017 |
Dimitry Andric <dim@FreeBSD.org> |
Merge ^/head r316992 through r317215.
|
#
83c9dea1 |
| 17-Apr-2017 |
Gleb Smirnoff <glebius@FreeBSD.org> |
- Remove 'struct vmmeter' from 'struct pcpu', leaving only global vmmeter in place. To do per-cpu stats, convert all fields that previously were maintained in the vmmeters that sit in pcpus to c
- Remove 'struct vmmeter' from 'struct pcpu', leaving only global vmmeter in place. To do per-cpu stats, convert all fields that previously were maintained in the vmmeters that sit in pcpus to counter(9). - Since some vmmeter stats may be touched at very early stages of boot, before we have set up UMA and we can do counter_u64_alloc(), provide an early counter mechanism: o Leave one spare uint64_t in struct pcpu, named pc_early_dummy_counter. o Point counter(9) fields of vmmeter to pcpu[0].pc_early_dummy_counter, so that at early stages of boot, before counters are allocated we already point to a counter that can be safely written to. o For sparc64 that required a whole dummy pcpu[MAXCPU] array.
Further related changes: - Don't include vmmeter.h into pcpu.h. - vm.stats.vm.v_swappgsout and vm.stats.vm.v_swappgsin changed to 64-bit, to match kernel representation. - struct vmmeter hidden under _KERNEL, and only vmstat(1) is an exclusion.
This is based on benno@'s 4-year old patch: https://lists.freebsd.org/pipermail/freebsd-arch/2013-July/014471.html
Reviewed by: kib, gallatin, marius, lidl Differential Revision: https://reviews.freebsd.org/D10156
show more ...
|
#
89564188 |
| 19-Mar-2017 |
Alan Cox <alc@FreeBSD.org> |
Two changes to vm_fault_populate():
Simplify the logic for clipping the range returned by the pager to fit within the map entry.
Use atop() rather than OFF_TO_IDX() on addresses.
Reviewed by: kib
Two changes to vm_fault_populate():
Simplify the logic for clipping the range returned by the pager to fit within the map entry.
Use atop() rather than OFF_TO_IDX() on addresses.
Reviewed by: kib MFC after: 1 week
show more ...
|
#
bc278106 |
| 19-Mar-2017 |
Konstantin Belousov <kib@FreeBSD.org> |
Fix off-by-one in the vm_fault_populate() code.
When re-calculating the last inclusive page index after the pager call, -1 was erronously ommitted. If the pager extended the run (unlikely), the res
Fix off-by-one in the vm_fault_populate() code.
When re-calculating the last inclusive page index after the pager call, -1 was erronously ommitted. If the pager extended the run (unlikely), the result would be insertion of the valid page mapping outside the current map entry range.
Found by: alc Sponsored by: The FreeBSD Foundation MFC after: 1 week
show more ...
|
#
d1780e8d |
| 14-Mar-2017 |
Konstantin Belousov <kib@FreeBSD.org> |
Use atop() instead of OFF_TO_IDX() for convertion of addresses or addresses offsets, as intended.
Suggested and reviewed by: alc Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
|
#
d630701f |
| 25-Feb-2017 |
Dimitry Andric <dim@FreeBSD.org> |
Merge ^/head r314178 through r314269.
|
#
63cdcaae |
| 24-Feb-2017 |
Konstantin Belousov <kib@FreeBSD.org> |
Properly handle possible underflow in vm_fault_prefault().
In vm_fault_prefault(), if backward count causes underflow in calculation of starta = addra - backward * PAGE_SIZE; then starta must be cl
Properly handle possible underflow in vm_fault_prefault().
In vm_fault_prefault(), if backward count causes underflow in calculation of starta = addra - backward * PAGE_SIZE; then starta must be clipped to entry->start, instead of zero. Clipping to zero allowed mapping outside of the map entries address ranges, in particular, map at zero.
Submitted by: Yanko Yankulov <yanko.yankulov@gmail.com> Reviewed by: alc MFC after: 1 week
show more ...
|
#
a3906ca5 |
| 17-Feb-2017 |
Dimitry Andric <dim@FreeBSD.org> |
Merge ^/head r313644 through r313895.
|
#
05d58177 |
| 14-Feb-2017 |
Bjoern A. Zeeb <bz@FreeBSD.org> |
Use %s __func__ to print the actual function name (been looking at the wrong one for too often lately at first), and also use %#lx to get the 0x prefix for the address.
MFC after: 1 week
|
#
7a432b84 |
| 30-Dec-2016 |
Konstantin Belousov <kib@FreeBSD.org> |
Fix two similar bugs in the populate vm_fault() code.
If pager' populate method succeeded, but other thread raced with us and modified vm_map, we must unbusy all pages busied by the pager, before we
Fix two similar bugs in the populate vm_fault() code.
If pager' populate method succeeded, but other thread raced with us and modified vm_map, we must unbusy all pages busied by the pager, before we retry the whole fault handling. If pager instantiated more pages than fit into the current map entry, we must unbusy the pages which are clipped.
Also do some refactoring, clarify comments and use more clear local variable names.
Reported and tested by: kargl, subbsd@gmail.com (previous version) Reviewed by: alc Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
show more ...
|
#
1bde3b70 |
| 09-Dec-2016 |
Dimitry Andric <dim@FreeBSD.org> |
Merge ^/head r309519 through r309757.
|
#
c42b43a0 |
| 08-Dec-2016 |
Konstantin Belousov <kib@FreeBSD.org> |
Add a new populate() pager method and extend device pager ops vector with cdev_pg_populate() to provide device drivers access to it. It gives drivers fine control of the pages ownership and allows d
Add a new populate() pager method and extend device pager ops vector with cdev_pg_populate() to provide device drivers access to it. It gives drivers fine control of the pages ownership and allows drivers to implement arbitrary prefault policies.
The populate method is called on a page fault and is supposed to populate the vm object with the page at the fault location and some amount of pages around it, at pager's discretion. VM provides the pager with the hints about current range of the object mapping, to avoid instantiation of immediately unused pages, if pager decides so. Also, VM passes the fault type and map entry protection to the pager, allowing it to force the optimal required ownership of the mapped pages.
Installed pages must contiguously fill the returned region, be fully valid and exclusively busied. Of course, the pages must be compatible with the object' type.
After populate() successfully returned, VM fault handler installs as many instantiated pages into the process page tables as it sees reasonable, while still obeying the correct semantic for COW and vm map locking.
The method is opt-in, pager sets OBJ_POPULATE flag to indicate that the method can be called. If pager' vm objects can be shadowed, pager must implement the traditional getpages() method in addition to the populate(). Populate() might fall back to the getpages() on per-call basis as well, by returning VM_PAGER_BAD error code.
For now for device pagers, the populate() method is only allowed to be used by the managed device pagers, but the limitation is only made because there is no unmanaged fault handlers which could use it right now.
KPI designed together with, and reviewed by: alc Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 3 weeks
show more ...
|
#
dc5401d2 |
| 08-Dec-2016 |
Konstantin Belousov <kib@FreeBSD.org> |
Move map_generation snapshot value into struct faultstate.
Reviewed by: alc Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week
|
#
67bc8c8b |
| 19-Nov-2016 |
Dimitry Andric <dim@FreeBSD.org> |
Merge ^/head r308491 through r308841.
|
#
41ddec83 |
| 16-Nov-2016 |
Konstantin Belousov <kib@FreeBSD.org> |
Move the fast fault path into the separate function.
Reviewed by: alc Sponsored by: The FreeBSD Foundation MFC after: 1 week
|
#
7667839a |
| 15-Nov-2016 |
Alan Cox <alc@FreeBSD.org> |
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 wi
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
show more ...
|
#
2828dafc |
| 10-Nov-2016 |
Dimitry Andric <dim@FreeBSD.org> |
Merge ^/head r308227 through r308490.
|
#
ebcddc72 |
| 09-Nov-2016 |
Alan Cox <alc@FreeBSD.org> |
Introduce a new page queue, PQ_LAUNDRY, for storing unreferenced, dirty pages, specificially, dirty pages that have passed once through the inactive queue. A new, dedicated thread is responsible for
Introduce a new page queue, PQ_LAUNDRY, for storing unreferenced, dirty pages, specificially, dirty pages that have passed once through the inactive queue. A new, dedicated thread is responsible for both deciding when to launder pages and actually laundering them. The new policy uses the relative sizes of the inactive and laundry queues to determine whether to launder pages at a given point in time. In general, this leads to more intelligent swapping behavior, since the laundry thread will avoid pageouts when the marginal benefit of doing so is low. Previously, without a dedicated queue for dirty pages, the page daemon didn't have the information to determine whether pageout provides any benefit to the system. Thus, the previous policy often resulted in small but steadily increasing amounts of swap usage when the system is under memory pressure, even when the inactive queue consisted mostly of clean pages. This change addresses that issue, and also paves the way for some future virtual memory system improvements by removing the last source of object-cached clean pages, i.e., PG_CACHE pages.
The new laundry thread sleeps while waiting for a request from the page daemon thread(s). A request is raised by setting the variable vm_laundry_request and waking the laundry thread. We request launderings for two reasons: to try and balance the inactive and laundry queue sizes ("background laundering"), and to quickly make up for a shortage of free pages and clean inactive pages ("shortfall laundering"). When background laundering is requested, the laundry thread computes the number of page daemon wakeups that have taken place since the last laundering. If this number is large enough relative to the ratio of the laundry and (global) inactive queue sizes, we will launder vm_background_launder_target pages at vm_background_launder_rate KB/s. Otherwise, the laundry thread goes back to sleep without doing any work. When scanning the laundry queue during background laundering, reactivated pages are counted towards the laundry thread's target.
In contrast, shortfall laundering is requested when an inactive queue scan fails to meet its target. In this case, the laundry thread attempts to launder enough pages to meet v_free_target within 0.5s, which is the inactive queue scan period.
A laundry request can be latched while another is currently being serviced. In particular, a shortfall request will immediately preempt a background laundering.
This change also redefines the meaning of vm_cnt.v_reactivated and removes the functions vm_page_cache() and vm_page_try_to_cache(). The new meaning of vm_cnt.v_reactivated now better reflects its name. It represents the number of inactive or laundry pages that are returned to the active queue on account of a reference.
In collaboration with: markj Reviewed by: kib Tested by: pho Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D8302
show more ...
|
#
85702505 |
| 03-Nov-2016 |
Alan Cox <alc@FreeBSD.org> |
In vm_fault()'s loop over the shadow chain, move a comment describing our invariants to a better place. Also, add two comments concerning the relationship between the map and vnode locks.
Reviewed
In vm_fault()'s loop over the shadow chain, move a comment describing our invariants to a better place. Also, add two comments concerning the relationship between the map and vnode locks.
Reviewed by: kib MFC after: 3 days
show more ...
|
#
a2b802ce |
| 02-Nov-2016 |
Dimitry Andric <dim@FreeBSD.org> |
Merge ^/head r303250 through r308226.
|
#
dda4d369 |
| 01-Nov-2016 |
Alan Cox <alc@FreeBSD.org> |
Move and revise a comment about the relation between the object's paging- in-progress count and the vnode. Prior to r188331, we always acquired the vnode lock before incrementing the object's paging
Move and revise a comment about the relation between the object's paging- in-progress count and the vnode. Prior to r188331, we always acquired the vnode lock before incrementing the object's paging-in-progress count. Now, we increment it before attempting to acquire the vnode lock with LK_NOWAIT, but we never sleep acquiring the vnode lock while we have the count incremented.
Reviewed by: kib MFC after: 3 days
show more ...
|
#
02ebdc78 |
| 31-Oct-2016 |
Dimitry Andric <dim@FreeBSD.org> |
Merge ^/head r307736 through r308146.
|
#
e26236e9 |
| 30-Oct-2016 |
Konstantin Belousov <kib@FreeBSD.org> |
Change remained internal uses of boolean_t to bool in vm/vm_fault.c.
Reviewed by: alc Sponsored by: The FreeBSD Foundation MFC after: 1 week
|
#
f994b207 |
| 30-Oct-2016 |
Alan Cox <alc@FreeBSD.org> |
Merge and sort vm_fault_hold()'s "int" variable definitions.
Reviewed by: kib MFC after: 7 days
|
#
022dfd69 |
| 30-Oct-2016 |
Konstantin Belousov <kib@FreeBSD.org> |
Remove vnode_locked label and goto, by collapsing vp calculation into the conditional.
Suggested and reviewed by: alc Sponsored by: The FreeBSD Foundation MFC after: 1 week
|