dxgkrnlを有効にしてkernelビルド(5.10.y)

# カーネルビルド
任意のkernelでlinux-msft-wsl-5.10.16.3のdxgkrnlを有効にする。
linux-msft-wsl-5.4.yのやり方は[ここ](https://qiita.com/qawsed477/items/c1f073f881442d726b26)。

## stableカーネルリポジトリをcloneする
```shell-session
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
$ cd linux
$ git checkout origin/linux-5.11.y
```
## WSL2のカーネルリポジトリをリモートに追加し、fetchする
```shell-session
$ git remote add wsl-origin https://github.com/microsoft/WSL2-Linux-Kernel.git
$ git fetch wsl-origin linux-msft-wsl-5.10.y
```

## 履歴を調査

```shell-session
$ git log linux-msft-wsl-5.10.16.3 --oneline
a571dc8cedc8 (tag: linux-msft-wsl-5.10.16.3, wsl-origin/linux-msft-wsl-5.10.y) Merge tag 'rolling-lts/wsl/5.10.16.3' into linux-msft-wsl-5.10.y
a73aec090501 Linux rolling-lts/wsl/5.10.16.3
cb68ddad0cfb Merge feature/mm_discard (e0e7ed2671bc8a7cc0cb1c51ac27c6b7fa93f874)
69d65f53e433 Merge feature/hyperv-arm64 (65dbae1a07c4c08c0499cbd4dec79ef3988e504e)
7b22472e8077 Merge feature/dxgkrnl (ec49cf3e069105f57c17ca70d9da70559931ea2a)
...
```
## 変更点を取り込む

```shell-session
$ git checkout v5.11.15
$ git merge ec49cf3e069105f57c17ca70d9da70559931ea2a
$ git merge 65dbae1a07c4c08c0499cbd4dec79ef3988e504e
$ git merge e0e7ed2671bc8a7cc0cb1c51ac27c6b7fa93f874
$ git cherry-pick a73aec090501
$ vi Makefile #修正点: EXTRAVERSION =.3
$ git add Makefile
$ git cherry-pick --continue
$ git tag linux-msft-wsl-5.11.15.3-local
```
### v5.12.*に取り込む場合
v5.12.*に取り込む場合、e0e7ed2671bcのマージでコンフリクトを起こすので、下記のような編集を行う

```diff:arch/arm64/hyperv/hv_core.c
diff --git a/arch/arm64/hyperv/hv_core.c b/arch/arm64/hyperv/hv_core.c
index 4517a19d0c12..65dd646eab0a 100644
--- a/arch/arm64/hyperv/hv_core.c
+++ b/arch/arm64/hyperv/hv_core.c
@@ -159,14 +159,14 @@ static int __init hyperv_init(struct acpi_table_header *table)
        /* Get the features and hints from Hyper-V */
        hv_get_vpreg_128(HV_REGISTER_FEATURES, &result);
        ms_hyperv.features = result.as32.a;
-       ms_hyperv.priv_high = result.as32.b;
+       ms_hyperv.features_b = result.as32.b;
        ms_hyperv.misc_features = result.as32.c;

        hv_get_vpreg_128(HV_REGISTER_ENLIGHTENMENTS, &result);
        ms_hyperv.hints = result.as32.a;

        pr_info("Hyper-V: Features 0x%x, privilege high: 0x%x, hints 0x%x, misc 0x%x\n",
-               ms_hyperv.features, ms_hyperv.priv_high, ms_hyperv.hints,
+               ms_hyperv.features, ms_hyperv.features_b, ms_hyperv.hints,
                ms_hyperv.misc_features);

        /*
```
```diff:arch/x86/kernel/cpu/mshyperv.c
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index 973bbb48dba6..da82a9f45020 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -274,16 +274,12 @@ static void __init ms_hyperv_init_platform(void)
         * Extract the features and hints
         */
        ms_hyperv.features = cpuid_eax(HYPERV_CPUID_FEATURES);
-<<<<<<< HEAD
        ms_hyperv.features_b = cpuid_ebx(HYPERV_CPUID_FEATURES);
-=======
-       ms_hyperv.priv_high = cpuid_ebx(HYPERV_CPUID_FEATURES);
->>>>>>> cb68ddad0cfb... Merge feature/mm_discard (e0e7ed2671bc8a7cc0cb1c51ac27c6b7fa93f874)
        ms_hyperv.misc_features = cpuid_edx(HYPERV_CPUID_FEATURES);
        ms_hyperv.hints    = cpuid_eax(HYPERV_CPUID_ENLIGHTMENT_INFO);

        pr_info("Hyper-V: features 0x%x, privilege high: 0x%x, hints 0x%x, misc 0x%x\n",
-               ms_hyperv.features, ms_hyperv.priv_high, ms_hyperv.hints,
+               ms_hyperv.features, ms_hyperv.features_b, ms_hyperv.hints,
                ms_hyperv.misc_features);

        ms_hyperv.max_vp_index = cpuid_eax(HYPERV_CPUID_IMPLEMENT_LIMITS);
```
```diff:include/asm-generic/hyperv-tlfs.h
diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h
index 1b3e2ef25d1d..674388182bbf 100644
--- a/include/asm-generic/hyperv-tlfs.h
+++ b/include/asm-generic/hyperv-tlfs.h
@@ -88,13 +88,9 @@
 #define HV_CONNECT_PORT                                BIT(7)
 #define HV_ACCESS_STATS                                BIT(8)
 #define HV_DEBUGGING                           BIT(11)
-<<<<<<< HEAD
 #define HV_CPU_MANAGEMENT                      BIT(12)
-#define HV_ISOLATION                           BIT(22)
-=======
-#define HV_CPU_POWER_MANAGEMENT                        BIT(12)
 #define HV_ENABLE_EXTENDED_HYPERCALLS           BIT(20)
->>>>>>> cb68ddad0cfb... Merge feature/mm_discard (e0e7ed2671bc8a7cc0cb1c51ac27c6b7fa93f874)
+#define HV_ISOLATION                           BIT(22)


 /*
@@ -639,7 +635,6 @@ struct hv_set_vp_registers_input {
        } element[];
 } __packed;

-<<<<<<< HEAD
 enum hv_device_type {
        HV_DEVICE_TYPE_LOGICAL = 0,
        HV_DEVICE_TYPE_PCI = 1,
@@ -753,7 +748,6 @@ struct hv_input_unmap_device_interrupt {
 #define HV_SOURCE_SHADOW_NONE               0x0
 #define HV_SOURCE_SHADOW_BRIDGE_BUS_RANGE   0x1

-=======
 #ifdef CONFIG_PAGE_REPORTING
 #define HV_CAPABILITY_MEMORY_COLD_DISCARD_HINT BIT(8)

@@ -770,5 +764,4 @@ struct hv_memory_hint {
 };

 #endif //CONFIG_PAGE_REPORTING
->>>>>>> cb68ddad0cfb... Merge feature/mm_discard (e0e7ed2671bc8a7cc0cb1c51ac27c6b7fa93f874)
 #endif
```
```diff:include/asm-generic/mshyperv.h
diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h
index 0f205a481289..7fe9a42b91dd 100644
--- a/include/asm-generic/mshyperv.h
+++ b/include/asm-generic/mshyperv.h
@@ -28,11 +28,7 @@

 struct ms_hyperv_info {
        u32 features;
-<<<<<<< HEAD
        u32 features_b;
-=======
-       u32 priv_high;
->>>>>>> cb68ddad0cfb... Merge feature/mm_discard (e0e7ed2671bc8a7cc0cb1c51ac27c6b7fa93f874)
        u32 misc_features;
        u32 hints;
        u32 nested_features;
@@ -237,7 +233,7 @@ static inline bool hyperv_query_ext_cap(u64 cap_to_query)
         * Querying extended capabilities is done via an extended hypercall.
         * Check if the partition supports extended hypercall, first.
         */
-       if (!(ms_hyperv.priv_high & HV_ENABLE_EXTENDED_HYPERCALLS)) {
+       if (!(ms_hyperv.features_b & HV_ENABLE_EXTENDED_HYPERCALLS)) {
                pr_info("Hyper-V doesn't support extended hypercalls\n");
                return 0;
        }
```
## カーネルビルド&インストール
make oldconfigの設定は適宜行う。

```shell-session
$ make mrproper
$ git show wsl-origin/linux-msft-wsl-5.10.y:Microsoft/config-wsl > .config
$ make oldconfig
$ make
$ cp arch/x86/boot/bzImage /mnt/d/kernel-5.11.15.3-microsoft-standard-WSL2+
```
## .wslconfigの設定

```shell-session
$ vi /mnt/c/Users/[USERNAME]/.wslconfig
$ cat /mnt/c/Users/[USERNAME]/.wslconfig
[wsl2]
kernel=d:\\kernel-5.11.15.3-microsoft-standard-WSL2+
```

## 動作確認

```shell-session
$ uname -r
5.11.15.3-microsoft-standard-WSL2+
$ dmesg|grep dxg
[    0.189402] hv_vmbus: registering driver dxgkrnl
[    0.189419] (NULL device *): dxgk: dxg_drv_init  Version: 2103
[    0.190341] (NULL device *): dxgk: mmio allocated c00000000  200000000 c00000000 dffffffff
$ ls /dev/dxg
/dev/dxg
$ /usr/local/cuda-11.2/samples/bin/x86_64/linux/release/deviceQuery
/usr/local/cuda-11.2/samples/bin/x86_64/linux/release/deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "NVIDIA GeForce GTX 1070"
  CUDA Driver Version / Runtime Version          11.3 / 11.2
  CUDA Capability Major/Minor version number:    6.1
  Total amount of global memory:                 8192 MBytes (8589934592 bytes)
  (15) Multiprocessors, (128) CUDA Cores/MP:     1920 CUDA Cores
  GPU Max Clock rate:                            1709 MHz (1.71 GHz)
  Memory Clock rate:                             4004 Mhz
  Memory Bus Width:                              256-bit
  L2 Cache Size:                                 2097152 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total shared memory per multiprocessor:        98304 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Managed Memory:                Yes
  Device supports Compute Preemption:            Yes
  Supports Cooperative Kernel Launch:            Yes
  Supports MultiDevice Co-op Kernel Launch:      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.3, CUDA Runtime Version = 11.2, NumDevs = 1
Result = PASS
```