Automatically bind swap device to numa node

https://www.kernel.org/doc/html/latest/vm/swap_numa.html

# Automatically bind swap device to numa node

> If the system has more than one swap device and swap device has the node information, we can make use of this information to decide which swap device to use in get_swap_pages() to get better performance.

1つよりも多いswap deviceやswap deviceを持っているシステムが、node情報を持つ場合、基により効率的にget_swap_page()を扱うためにswap deviceの決定にこの情報を活用します。

# How to use this feature

> Swap device has priority and that decides the order of it to be used. To make use of automatically binding, there is no need to manipulate priority settings for swap devices. e.g. on a 2 node machine, assume 2 swap devices swapA and swapB, with swapA attached to node 0 and swapB attached to node 1, are going to be swapped on. Simply swapping them on by doing::

Swap deviceには優先度があり、どれから利用するべきかが決定されます。automatically bindingを利用すると、手動でswap deviceの優先度設定をすることなく、例えば2 node machineでは、2 swap device swapAとswapBを備えていると仮定するならば、swap Aはnode 0に、swap Bはnode 1に接続され、swapは有効化されます。swapを使うには単純に以下のようです。

```
	# swapon /dev/swapA
	# swapon /dev/swapB
```

> Then node 0 will use the two swap devices in the order of swapA then swapB and node 1 will use the two swap devices in the order of swapB then swapA. Note that the order of them being swapped on doesn't matter.

node 0は2つのswap deviceを、swapA, swap Bの順番で利用することができます、node1 はswap deviceを、swapB, swap Aの順番で利用することができます。swapの順番には関連しないことに注意してください。

A more complex example on a 4 node machine. Assume 6 swap devices are going to be swapped on: swapA and swapB are attached to node 0, swapC is attached to node 1, swapD and swapE are attached to node 2 and swapF is attached to node3. The way to swap them on is the same as above::

4 node machineの更に複雑な例をし増します。 6 swap deviceは、次のように有効化されます。 swap Aとswap Bはnode 0に、swap Cはnode1に、swap Dとswap Eはnode 2に、swap Fはnode3に接続されます。それらをswapする方法は上記した通りです。

```
	# swapon /dev/swapA
	# swapon /dev/swapB
	# swapon /dev/swapC
	# swapon /dev/swapD
	# swapon /dev/swapE
	# swapon /dev/swapF
```

> Then node 0 will use them in the order of::

node 0は以下の順番に利用します。


```
	swapA/swapB -> swapC -> swapD -> swapE -> swapF
```

> swapA and swapB will be used in a round robin mode before any other swap device.

swapAとswapBは、他のswap deviceの前にround robinで利用されます。

> node 1 will use them in the order of::

node1は以下の順番で使います。

```
	swapC -> swapA -> swapB -> swapD -> swapE -> swapF
```

node 2 will use them in the order of::

node2は以下の順番で使います。

```
	swapD/swapE -> swapA -> swapB -> swapC -> swapF
```

> Similaly, swapD and swapE will be used in a round robin mode before any other swap devices.

同様に、swapDとswapEは、他のswap deviceの前にround robinで利用されます。


> node 3 will use them in the order of::

node3は以下の順番で使います。


```
	swapF -> swapA -> swapB -> swapC -> swapD -> swapE
```

# Implementation details

> The current code uses a priority based list, swap_avail_list, to decide which swap device to use and if multiple swap devices share the same priority, they are used round robin. 
This change here replaces the single global swap_avail_list with a per-numa-node list, i.e. for each numa node, it sees its own priority based list of available swap devices. 
Swap device's priority can be promoted on its matching node's swap_avail_list.

現在のコードでは、swap_avail_listのlistに基づく優先度を、市ゆするswap deviceの決定に利用しています。複数のswap deviceが同じ優先度を共有する場合には、round robinで利用されます。ここで、この変更は、唯一のglovalなswap_avail_listを、それぞれのnuma nodeに対する、oer-numa-node kustによって置き換えています。これは、有効なswap deviceのリストに基づいてそれぞれの優先度になっています。Swap deviceの優先度は、nodeのswap_avail_listによってpromote昇格されます。

The current swap device's priority is set as: user can set a >=0 value, or the system will pick one starting from -1 then downwards. 

現在のswap deviceの優先は以下のように設定されます。ユーザーは0以上の値を設定するか、systemは01から始める１つの下の値を選択します。

> The priority value in the swap_avail_list is the negated value of the swap device's due to plist being sorted from low to high. The new policy doesn't change the semantics for priority >=0 cases, the previous starting from -1 then downwards now becomes starting from -2 then downwards and -1 is reserved as the promoted value. 

swap_avail_listの中の優先度の値は、swap deviceの plistの順番に低い値から高い値にそーろされているため、負の値です。新しいpolicyがpriorite >= 0 のsemanticsを変更しません。以前の-1から始めて、下降方向に、-2から順番に処理され、-1が昇格された値として予約されます。

> So if multiple swap devices are attached to the same node, they will all be promoted to priority -1 on that node's plist and will be used round robin before any other swap devices.

したがって、もし複数のswap deviceが同じnodeに接続されている場合、それらは優先度-1で昇格されるので、他のswap deviceの前にround robinで利用されます。

---
もともと、Linux Kernelのソースコードの一部なので、GPLv2扱いになる（はずの認識）。

> https://www.kernel.org/doc/html/latest/index.html
> 
> Licensing documentation
> 
> The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.
> 
> https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing