1. 28 May, 2019 1 commit
  2. 18 Jan, 2019 1 commit
    • Konstantin Belousov's avatar
      MI VM: Make it possible to set size of superpage at boot instead of compile time. · f2a496d6
      Konstantin Belousov authored
      In order to allow single kernel to use PAE pagetables on i386 if
      hardware supports it, and fall back to classic two-level paging
      structures if not, superpage code should be able to adopt to either 2M
      or 4M superpages size.  There I make MI VM structures large enough to
      track the biggest possible superpage, by allowing architecture to
      define VM_NFREEORDER_MAX and VM_LEVEL_0_ORDER_MAX constants.
      Corresponding VM_NFREEORDER and VM_LEVEL_0_ORDER symbols can be
      defined as runtime values and must be less than the _MAX constants.
      If architecture does not define _MAXs, it is assumed that _MAX ==
      normal constant.
      
      Reviewed by:	markj
      Tested by:	pho (as part of the larger patch)
      Sponsored by:	The FreeBSD Foundation
      MFC after:	1 week
      Differential revision:	https://reviews.freebsd.org/D18853
      f2a496d6
  3. 07 Jul, 2018 1 commit
  4. 23 Mar, 2018 2 commits
  5. 22 Mar, 2018 1 commit
  6. 15 Mar, 2018 1 commit
    • Jeff Roberson's avatar
      Eliminate pageout wakeup races. Take another step towards lockless · 30fbfdda
      Jeff Roberson authored
      vmd_free_count manipulation.  Reduce the scope of the free lock by
      using a pageout lock to synchronize sleep and wakeup.  Only trigger
      the pageout daemon on transitions between states.  Drive all wakeup
      operations directly as side-effects from freeing memory rather than
      requiring an additional function call.
      
      Reviewed by:	markj, kib
      Tested by:	pho
      Sponsored by:	Netflix, Dell/EMC Isilon
      Differential Revision:	https://reviews.freebsd.org/D14612
      30fbfdda
  7. 07 Mar, 2018 1 commit
  8. 23 Feb, 2018 1 commit
  9. 14 Feb, 2018 1 commit
  10. 13 Feb, 2018 1 commit
    • Konstantin Belousov's avatar
      Do not leak rv->psind in some specific situations. · c4be9169
      Konstantin Belousov authored
      Suppose that we have an object with a mapped superpage, and that all
      pages in the superpages are held (by some driver).  Additionally,
      suppose that the object is terminated, e.g. because the only process
      mapping it is exiting.  Then the reservation is broken, but the pages
      cannot be freed until later, when they are unheld.  In this situation,
      the reservation code cannot clean psind, since no pages are freed, and
      the page is freed and then reused with invalid psind.
      
      Clean psind on vm_reserv_break() to avoid the situation.
      
      Reported and tested by:	Slava Shwartsman
      Reviewed by:	markj
      Sponsored by:	Mellanox Technologies
      MFC after:	1 week
      Differential revision:	https://reviews.freebsd.org/D14335
      c4be9169
  11. 06 Feb, 2018 1 commit
  12. 12 Jan, 2018 1 commit
  13. 28 Nov, 2017 1 commit
  14. 27 Nov, 2017 1 commit
    • Pedro F. Giffuni's avatar
      sys: general adoption of SPDX licensing ID tags. · fe267a55
      Pedro F. Giffuni authored
      Mainly focus on files that use BSD 2-Clause license, however the tool I
      was using misidentified many licenses so this was mostly a manual - error
      prone - task.
      
      The Software Package Data Exchange (SPDX) group provides a specification
      to make it easier for automated tools to detect and summarize well known
      opensource licenses. We are gradually adopting the specification, noting
      that the tags are considered only advisory and do not, in any way,
      superceed or replace the license texts.
      
      No functional change intended.
      fe267a55
  15. 23 Jul, 2017 1 commit
  16. 17 Apr, 2017 1 commit
  17. 28 Dec, 2016 1 commit
    • Alan Cox's avatar
      Relax the object type restrictions on vm_page_alloc_contig(). Specifically, · 920da7e4
      Alan Cox authored
      add support for object types that were previously prohibited because they
      could contain PG_CACHED pages.
      
      Roughly halve the number of radix trie operations performed by
      vm_page_alloc_contig() using the same approach that is employed by
      vm_page_alloc().  Also, eliminate the radix trie lookup performed with the
      free page queues lock held.
      
      Tidy up the handling of radix trie insert failures in vm_page_alloc() and
      vm_page_alloc_contig().
      
      Reviewed by:	kib, markj
      Tested by:	pho
      Sponsored by:	Dell EMC Isilon
      Differential Revision:	https://reviews.freebsd.org/D8878
      920da7e4
  18. 12 Dec, 2016 1 commit
    • Alan Cox's avatar
      Eliminate every mention of PG_CACHED pages from the comments in the machine- · 3453bca8
      Alan Cox authored
      independent layer of the virtual memory system.  Update some of the nearby
      comments to eliminate redundancy and improve clarity.
      
      In vm/vm_reserv.c, do not use hyphens after adverbs ending in -ly per
      The Chicago Manual of Style.
      
      Update the comment in vm/vm_page.h defining the four types of page queues to
      reflect the elimination of PG_CACHED pages and the introduction of the
      laundry queue.
      
      Reviewed by:	kib, markj
      Sponsored by:	Dell EMC Isilon
      Differential Revision:	https://reviews.freebsd.org/D8752
      3453bca8
  19. 15 Nov, 2016 1 commit
  20. 19 Dec, 2015 1 commit
    • Alan Cox's avatar
      Introduce a new mechanism for relocating virtual pages to a new physical · c869e672
      Alan Cox authored
      address and use this mechanism when:
      
      1. kmem_alloc_{attr,contig}() can't find suitable free pages in the physical
         memory allocator's free page lists.  This replaces the long-standing
         approach of scanning the inactive and inactive queues, converting clean
         pages into PG_CACHED pages and laundering dirty pages.  In contrast, the
         new mechanism does not use PG_CACHED pages nor does it trigger a large
         number of I/O operations.
      
      2. on 32-bit MIPS processors, uma_small_alloc() and the pmap can't find
         free pages in the physical memory allocator's free page lists that are
         covered by the direct map.  Tested by: adrian
      
      3. ttm_bo_global_init() and ttm_vm_page_alloc_dma32() can't find suitable
         free pages in the physical memory allocator's free page lists.
      
      In the coming months, I expect that this new mechanism will be applied in
      other places.  For example, balloon drivers should use relocation to
      minimize fragmentation of the guest physical address space.
      
      Make vm_phys_alloc_contig() a little smarter (and more efficient in some
      cases).  Specifically, use vm_phys_segs[] earlier to avoid scanning free
      page lists that can't possibly contain suitable pages.
      
      Reviewed by:	kib, markj
      Glanced at:	jhb
      Discussed with:	jeff
      Sponsored by:	EMC / Isilon Storage Division
      Differential Revision:	https://reviews.freebsd.org/D4444
      c869e672
  21. 26 Nov, 2015 1 commit
  22. 06 Aug, 2015 1 commit
  23. 08 Jun, 2015 1 commit
  24. 11 Apr, 2015 1 commit
  25. 14 Mar, 2015 1 commit
  26. 12 Mar, 2015 1 commit
  27. 08 Mar, 2015 1 commit
  28. 22 Nov, 2014 1 commit
  29. 10 Sep, 2014 1 commit
    • Alan Cox's avatar
      Fix a boundary case error in vm_reserv_alloc_contig(): If a reservation · 64f096ee
      Alan Cox authored
      isn't being allocated for the last of the requested pages, because a
      reservation won't fit in the gap between allocated pages, then the
      reservation structure shouldn't be initialized.
      
      While I'm here, improve the nearby comments.
      
      Reported by:	jeff, pho
      MFC after:	1 week
      Sponsored by:	EMC / Isilon Storage Division
      64f096ee
  30. 11 Jun, 2014 1 commit
    • Alan Cox's avatar
      Correct a bug in the management of the population map on big-endian · 3180f757
      Alan Cox authored
      machines.  Specifically, there was a mismatch between how the routine
      allocation and deallocation operations accessed the population map
      and how the aggressively optimized reservation-breaking operation
      accessed it.  So, problems only occurred when reservations were broken.
      This change makes the routine operations access the population map in
      the same way as the reservation breaking operation.
      
      This bug was introduced in r259999.
      
      PR:		187080
      Tested by:	jmg (on an "armeb" machine)
      Sponsored by:	EMC / Isilon Storage Division
      3180f757
  31. 07 Jun, 2014 1 commit
    • Alan Cox's avatar
      Add a page size field to struct vm_page. Increase the page size field when · dd05fa19
      Alan Cox authored
      a partially populated reservation becomes fully populated, and decrease this
      field when a fully populated reservation becomes partially populated.
      
      Use this field to simplify the implementation of pmap_enter_object() on
      amd64, arm, and i386.
      
      On all architectures where we support superpages, the cost of creating a
      superpage mapping is roughly the same as creating a base page mapping.  For
      example, both kinds of mappings entail the creation of a single PTE and PV
      entry.  With this in mind, use the page size field to make the
      implementation of vm_map_pmap_enter(..., MAP_PREFAULT_PARTIAL) a little
      smarter.  Previously, if MAP_PREFAULT_PARTIAL was specified to
      vm_map_pmap_enter(), that function would only map base pages.  Now, it will
      create up to 96 base page or superpage mappings.
      
      Reviewed by:	kib
      Sponsored by:	EMC / Isilon Storage Division
      dd05fa19
  32. 29 Dec, 2013 1 commit
  33. 28 Dec, 2013 1 commit
    • Alan Cox's avatar
      MFp4 alc_popmap · ec179322
      Alan Cox authored
        Change the way that reservations keep track of which pages are in use.
        Instead of using the page's PG_CACHED and PG_FREE flags, maintain a bit
        vector within the reservation.  This approach has a couple benefits.
        First, it makes breaking reservations much cheaper because there are
        fewer cache misses to identify the unused pages.  Second, it is a pre-
        requisite for supporting two or more reservation sizes.
      ec179322
  34. 17 Sep, 2013 1 commit
  35. 12 May, 2013 1 commit
    • Alan Cox's avatar
      Refactor vm_page_alloc()'s interactions with vm_reserv_alloc_page() and · 404eb1b3
      Alan Cox authored
      vm_page_insert() so that (1) vm_radix_lookup_le() is never called while the
      free page queues lock is held and (2) vm_radix_lookup_le() is called at most
      once.  This change reduces the average time that the free page queues lock
      is held by vm_page_alloc() as well as vm_page_alloc()'s average overall
      running time.
      
      Sponsored by:	EMC / Isilon Storage Division
      404eb1b3
  36. 18 Mar, 2013 1 commit
    • Attilio Rao's avatar
      Sync back vmcontention branch into HEAD: · 774d251d
      Attilio Rao authored
      Replace the per-object resident and cached pages splay tree with a
      path-compressed multi-digit radix trie.
      Along with this, switch also the x86-specific handling of idle page
      tables to using the radix trie.
      
      This change is supposed to do the following:
      - Allowing the acquisition of read locking for lookup operations of the
        resident/cached pages collections as the per-vm_page_t splay iterators
        are now removed.
      - Increase the scalability of the operations on the page collections.
      
      The radix trie does rely on the consumers locking to ensure atomicity of
      its operations.  In order to avoid deadlocks the bisection nodes are
      pre-allocated in the UMA zone.  This can be done safely because the
      algorithm needs at maximum one new node per insert which means the
      maximum number of the desired nodes is the number of available physical
      frames themselves.  However, not all the times a new bisection node is
      really needed.
      
      The radix trie implements path-compression because UFS indirect blocks
      can lead to several objects with a very sparse trie, increasing the number
      of levels to usually scan.  It also helps in the nodes pre-fetching by
      introducing the single node per-insert property.
      
      This code is not generalized (yet) because of the possible loss of
      performance by having much of the sizes in play configurable.
      However, efforts to make this code more general and then reusable in
      further different consumers might be really done.
      
      The only KPI change is the removal of the function vm_page_splay() which
      is now reaped.
      The only KBI change, instead, is the removal of the left/right iterators
      from struct vm_page, which are now reaped.
      
      Further technical notes broken into mealpieces can be retrieved from the
      svn branch:
      http://svn.freebsd.org/base/user/attilio/vmcontention/
      
      Sponsored by:	EMC / Isilon storage division
      In collaboration with:	alc, jeff
      Tested by:	flo, pho, jhb, davide
      Tested by:	ian (arm)
      Tested by:	andreast (powerpc)
      774d251d
  37. 09 Mar, 2013 1 commit
    • Attilio Rao's avatar
      Switch the vm_object mutex to be a rwlock. This will enable in the · 89f6b863
      Attilio Rao authored
      future further optimizations where the vm_object lock will be held
      in read mode most of the time the page cache resident pool of pages
      are accessed for reading purposes.
      
      The change is mostly mechanical but few notes are reported:
      * The KPI changes as follow:
        - VM_OBJECT_LOCK() -> VM_OBJECT_WLOCK()
        - VM_OBJECT_TRYLOCK() -> VM_OBJECT_TRYWLOCK()
        - VM_OBJECT_UNLOCK() -> VM_OBJECT_WUNLOCK()
        - VM_OBJECT_LOCK_ASSERT(MA_OWNED) -> VM_OBJECT_ASSERT_WLOCKED()
          (in order to avoid visibility of implementation details)
        - The read-mode operations are added:
          VM_OBJECT_RLOCK(), VM_OBJECT_TRYRLOCK(), VM_OBJECT_RUNLOCK(),
          VM_OBJECT_ASSERT_RLOCKED(), VM_OBJECT_ASSERT_LOCKED()
      * The vm/vm_pager.h namespace pollution avoidance (forcing requiring
        sys/mutex.h in consumers directly to cater its inlining functions
        using VM_OBJECT_LOCK()) imposes that all the vm/vm_pager.h
        consumers now must include also sys/rwlock.h.
      * zfs requires a quite convoluted fix to include FreeBSD rwlocks into
        the compat layer because the name clash between FreeBSD and solaris
        versions must be avoided.
        At this purpose zfs redefines the vm_object locking functions
        directly, isolating the FreeBSD components in specific compat stubs.
      
      The KPI results heavilly broken by this commit.  Thirdy part ports must
      be updated accordingly (I can think off-hand of VirtualBox, for example).
      
      Sponsored by:	EMC / Isilon storage division
      Reviewed by:	jeff
      Reviewed by:	pjd (ZFS specific review)
      Discussed with:	alc
      Tested by:	pho
      89f6b863
  38. 15 Jul, 2012 1 commit
  39. 08 Apr, 2012 1 commit