| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- .. SPDX-License-Identifier: GPL-2.0
- :Author: Chris Li <chrisl@kernel.org>, Kairui Song <kasong@tencent.com>
- ==========
- Swap Table
- ==========
- Swap table implements swap cache as a per-cluster swap cache value array.
- Swap Entry
- ----------
- A swap entry contains the information required to serve the anonymous page
- fault.
- Swap entry is encoded as two parts: swap type and swap offset.
- The swap type indicates which swap device to use.
- The swap offset is the offset of the swap file to read the page data from.
- Swap Cache
- ----------
- Swap cache is a map to look up folios using swap entry as the key. The result
- value can have three possible types depending on which stage of this swap entry
- was in.
- 1. NULL: This swap entry is not used.
- 2. folio: A folio has been allocated and bound to this swap entry. This is
- the transient state of swap out or swap in. The folio data can be in
- the folio or swap file, or both.
- 3. shadow: The shadow contains the working set information of the swapped
- out folio. This is the normal state for a swapped out page.
- Swap Table Internals
- --------------------
- The previous swap cache is implemented by XArray. The XArray is a tree
- structure. Each lookup will go through multiple nodes. Can we do better?
- Notice that most of the time when we look up the swap cache, we are either
- in a swap in or swap out path. We should already have the swap cluster,
- which contains the swap entry.
- If we have a per-cluster array to store swap cache value in the cluster.
- Swap cache lookup within the cluster can be a very simple array lookup.
- We give such a per-cluster swap cache value array a name: the swap table.
- A swap table is an array of pointers. Each pointer is the same size as a
- PTE. The size of a swap table for one swap cluster typically matches a PTE
- page table, which is one page on modern 64-bit systems.
- With swap table, swap cache lookup can achieve great locality, simpler,
- and faster.
- Locking
- -------
- Swap table modification requires taking the cluster lock. If a folio
- is being added to or removed from the swap table, the folio must be
- locked prior to the cluster lock. After adding or removing is done, the
- folio shall be unlocked.
- Swap table lookup is protected by RCU and atomic read. If the lookup
- returns a folio, the user must lock the folio before use.
|