3299 Commits

Author SHA1 Message Date
attilio
b2afca4987 Add read mode operations to VM_OBJECT_LOCK* class of functions.
Sponsored by:	EMC / Isilon storage division
2013-02-20 12:06:33 +00:00
attilio
15bf891afe Rename VM_OBJECT_LOCK(), VM_OBJECT_UNLOCK() and VM_OBJECT_TRYLOCK() to
their "write" versions.

Sponsored by:	EMC / Isilon storage division
2013-02-20 12:03:20 +00:00
attilio
1f1e13ca03 There is no need to use VM_OBJECT_LOCKED() as the assertion won't
make the check available in any case if INVARIANTS is switched off.
Remove VM_OBJECT_LOCKED().
2013-02-20 10:51:34 +00:00
attilio
6a2e2ce522 Remove unused VM_OBJECT_LOCKPTR().
Sponsored by:	EMC / Isilon storage division
2013-02-20 10:40:27 +00:00
attilio
658534ed5a Switch vm_object lock to be a rwlock.
* VM_OBJECT_LOCK and VM_OBJECT_UNLOCK are mapped to write operations
* VM_OBJECT_SLEEP() is introduced as a general purpose primitve to
  get a sleep operation using a VM_OBJECT_LOCK() as protection
* The approach must bear with vm_pager.h namespace pollution so many
  files require including directly rwlock.h
2013-02-20 10:38:34 +00:00
alc
88b6705ed6 On arm, like sparc64, the end of the kernel map varies from one type of
machine to another.  Therefore, VM_MAX_KERNEL_ADDRESS can't be a constant.
Instead, #define it to be a variable, vm_max_kernel_address, just like we
do on sparc64.

Reviewed by:	kib
Tested by:	ian
2013-02-18 01:02:48 +00:00
attilio
47d4527f8f Remove an unuseful check as looking up into an empty trie should be
as fast as checking a NULL ptr.

Sponsored by:	EMC / Isilon storage division
2013-02-15 17:22:57 +00:00
attilio
ea8f6ef283 Remove whitespace. 2013-02-15 17:21:41 +00:00
attilio
ebcaab64ea Merge from vmcontention 2013-02-15 16:11:30 +00:00
attilio
b4e24f9126 MFC 2013-02-15 16:08:08 +00:00
attilio
1cf2f4550b On arches with VM_PHYSSEG_DENSE the vm_page_array is larger than
the actual number of vm_page_t that will be derived, so v_page_count
should be used appropriately.

Besides that, add a panic condition in case UMA fails to properly
restrict the area in a way to keep all the desired objects.

Sponsored by:	EMC / Isilon storage division
Reported by:	alc
2013-02-15 16:05:18 +00:00
attilio
757b950804 Remove unused headers. 2013-02-15 15:34:19 +00:00
attilio
daa1f2caab Fix comment. 2013-02-15 14:54:09 +00:00
attilio
fa12391493 Move the radix node zone destructor definition closer to
vm_radix_init() definition.

Sponsored by:	EMC / Isilon storage division
2013-02-15 14:53:42 +00:00
attilio
be627ca24c - When panicing for "too small boot cache" reason, print the actual
cache size value
- Add a way to specify the size of the boot cache at compile time

Sponsored by:	EMC / Isilon storage division
2013-02-15 14:50:36 +00:00
attilio
47ecbcf556 Improve dynamic branch prediction and i-cache utilization:
- Use predict_false() to tag boot-time cache decisions
- Compact boot-time cache allocation into a separate, non-inline,
  function that won't be called most of the times.

Sponsored by:	EMC / Isilon storage division
2013-02-15 14:48:06 +00:00
attilio
af55a9fb46 - Fix style in vm_page_lookup(): there is no whiteline between
assertions and other code in this file.
- Reinsert some comments that were lost during the work but which are
  actual yet, reducing differences with HEAD.

Sponsoed by:	EMC / Isilon storage division
2013-02-15 12:35:16 +00:00
jhb
ca6ecf3ea5 Make VM_NDOMAIN a kernel option so that it can be enabled from a kernel
config file.

Requested by:	phk (ages ago)
MFC after:	1 month
2013-02-14 19:38:04 +00:00
attilio
642ba82fdf Remove an unuseful check on resident_page_count.
vm_radix_lookup_ge() of an empty trie is as fast as checking a
NULL pointer.
2013-02-14 15:25:31 +00:00
attilio
908e129569 Fix style. 2013-02-14 15:24:13 +00:00
attilio
eafe26c8a6 The radix preallocation pages can overfow the biggestone segment, so
use a different scheme for preallocation: reserve few KB of nodes to be
used to cater page allocations before the memory can be efficiently
pre-allocated by UMA.

This at all effects remove boot_pages further carving and along with
this modifies to the boot_pages allocation system and necessity to
initialize the UMA zone before pmap_init().

Reported by:	pho, jhb
2013-02-14 15:23:00 +00:00
attilio
3db337c2ea Grammar.
Sponsored by:	EMC / Isilon storage division
2013-02-13 02:04:49 +00:00
attilio
53f78d1a7d Implement a new algorithm for managing the radix trie which also
includes path-compression. This greatly helps with sparsely populated
tries, where an uncompressed trie may end up by having a lot of
intermediate nodes for very little leaves.

The new algorithm introduces 2 main concepts: the node level and the
node owner.  Every node represents a branch point where the leaves share
the key up to the level specified in the node-level (current level
excluded, of course).  Such key partly shared is the one contained in
the owner.  Of course, the root branch is exempted to keep a valid
owner, because theoretically all the keys are contained in the space
designed by the root branch node.  The search algorithm seems very
intuitive and that is where one should start reading to understand the
full approach.

In the end, the algorithm ends up by demanding only one node per insert
and this is not necessary in all the cases.  To stay safe, we basically
preallocate as many nodes as the number of physical pages are in the
system, using uma_preallocate().  However, this raises 2 concerns:
* As pmap_init() needs to kmem_alloc(), the nodes must be pre-allocated
  when vm_radix_init() is currently called, which is much before UMA
  is fully initialized.  This means that uma_prealloc() will dig into the
  UMA_BOOT_PAGES pool of pages, which is often not enough to keep track
  of such large allocations.
  In order to fix this, change a bit the concept of UMA_BOOT_PAGES and
  vm.boot_pages. More specifically make the UMA_BOOT_PAGES an initial "value"
  as long as vm.boot_pages and extend the boot_pages physical area by as
  many bytes as needed with the information returned by
  vm_radix_allocphys_size().
* A small amount of pages will be held in per-cpu buckets and won't be
  accessible from curcpu, so the vm_radix_node_get() could really panic
  when the pre-allocation pool is close to be exhausted.
  In theory we could pre-allocate more pages than the number of physical
  frames to satisfy such request, but as many insert would happen without
  a node allocation anyway, I think it is safe to assume that the
  over-allocation is already compensating for such problem.
  On the field testing can stand me correct, of course.  This could be
  further helped by the case where we allow a single-page insert to not
  require a complete root node.

The use of pre-allocation gets rid all the non-direct mapping trickery
and introduced lock recursion allowance for vm_page_free_queue.

The nodes children are reduced in number from 32 -> 16 and from 16 -> 8
(for respectively 64 bits and 32 bits architectures).
This would make the children to fit into cacheline for amd64 case,
for example, and in general spawn less cacheline, which may be
helpful in lookup_ge() case.
Also, path-compression cames to help in cases where there are many levels,
making the fallouts of such change less hurting.

Sponsored by:	EMC / Isilon storage division
Reviewed by:	jeff (partially)
Tested by:	flo
2013-02-13 01:19:31 +00:00
attilio
87d8d2eec7 Fix style. 2013-02-10 16:00:14 +00:00
attilio
8743c2878e Fix wrong object reference.
Sponsored by:	EMC / Isilon Storage Division
2013-02-10 01:30:13 +00:00
attilio
25a17068be Remove implementation specific comments from a public interface. 2013-02-07 15:13:35 +00:00
attilio
702feea4c3 Correctly complete r246474. 2013-02-07 15:08:35 +00:00
attilio
5ab232ef16 Strengten checks. 2013-02-07 15:06:45 +00:00
attilio
59f669fb82 Style. 2013-02-07 15:06:04 +00:00
attilio
12b7890c27 Reduce differences with HEAD. 2013-02-07 11:36:34 +00:00
attilio
950536d7a4 Reformat comments to follow original version and re-add correct
locking flags.
2013-02-06 23:48:04 +00:00
attilio
86cff934d5 Do not assume the lock to be held so that this can be used also in
safe cases as a short-cut.
2013-02-06 19:03:48 +00:00
attilio
9066f231e3 Tweak comment to remove splay tree references. 2013-02-06 19:02:46 +00:00
attilio
1bab15985e Make vm_object_cache_is_empty() inline. 2013-02-06 18:59:34 +00:00
attilio
4c22b4bafe Cleanup vm_radix KPI:
- Avoid the return value for vm_radix_insert()
- Name the functions argument per-style(9)
- Avoid to get and return opaque objects but use vm_page_t as vm_radix is
  thought to not really be general code but to cater specifically page
  cache and resident cache.
2013-02-06 18:37:46 +00:00
attilio
3bbca3bce2 Fixup r246423 by adding vm_radix.h includes where it is not present
currently.
2013-02-06 18:33:32 +00:00
attilio
c02c27a33d Avoid a namespace pollution in vm_object.h by defining separately the
structure for vm_radix implementation.
2013-02-06 18:04:28 +00:00
attilio
d3fb98bfb4 Enrich comments on newly added assertions. 2013-02-06 17:47:24 +00:00
attilio
abbe2a9b91 - Move the vm_object_cache_is_empty() prototype to be sorted
alphabetically.
- Change the return type to be boolean_t in order to match what
  vm_page_is_cached() does.
2013-02-06 17:27:41 +00:00
attilio
cde4f0caa2 Fix mismerge. 2013-02-06 17:22:16 +00:00
attilio
22b0de04b3 Reduce diffs against HEAD. 2013-02-06 17:17:11 +00:00
attilio
9d88c5279c Now that vm_page_cache_free() and vm_page_cache_transfer() are
reimplemented as ranged operations, sync vm_page_is_cached() semantic
with HEAD.
2013-02-06 14:50:34 +00:00
attilio
44f85cd1a5 Reduce diffs against HEAD:
Reimplement vm_page_cache_free() as a range operation.
2013-02-06 14:29:05 +00:00
attilio
439c0b8cf1 Reduce diffs against HEAD:
- Reimplement vm_page_cache_transfer() properly
- Remove vm_page_cache_rename() as a subsequent change
2013-02-05 00:09:33 +00:00
attilio
62f53da2e7 Merge from vmcontention 2013-02-04 22:15:36 +00:00
attilio
d3b7ec3a08 MFC 2013-02-04 22:10:01 +00:00
attilio
d61cd60feb Reduce differences with HEAD. 2013-02-04 22:05:22 +00:00
attilio
b972b67ed7 Merge from vmcontention 2013-02-04 15:44:42 +00:00
marius
790d2fce4f Try to improve r242655 take III: move these SYSCTLs describing the kernel
map, which is defined and initialized in vm/vm_kern.c, to the latter.

Submitted by:	alc
2013-02-04 09:35:48 +00:00
attilio
b134f527dc Detect address wrapup without defining the right boundary. 2013-02-04 08:53:51 +00:00