From: Sasha Levin Date: Tue, 14 Mar 2023 02:17:11 +0000 (-0400) Subject: Fixes for 6.1 X-Git-Tag: v4.14.310~73 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=26b320602d13cbecf6f49e3204c085dcea158398;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 6.1 Signed-off-by: Sasha Levin --- diff --git a/queue-6.1/adreno-shutdown-the-gpu-properly.patch b/queue-6.1/adreno-shutdown-the-gpu-properly.patch new file mode 100644 index 00000000000..c25ea6b9ee6 --- /dev/null +++ b/queue-6.1/adreno-shutdown-the-gpu-properly.patch @@ -0,0 +1,104 @@ +From 9537468e1fc0b61ba7a0fd9bdd889322d1e7e3e1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 9 Jan 2023 22:25:47 +0000 +Subject: adreno: Shutdown the GPU properly + +From: Joel Fernandes (Google) + +[ Upstream commit e752e5454e6417da3f40ec1306a041ea96c56423 ] + +During kexec on ARM device, we notice that device_shutdown() only calls +pm_runtime_force_suspend() while shutting down the GPU. This means the GPU +kthread is still running and further, there maybe active submits. + +This causes all kinds of issues during a kexec reboot: + +Warning from shutdown path: + +[ 292.509662] WARNING: CPU: 0 PID: 6304 at [...] adreno_runtime_suspend+0x3c/0x44 +[ 292.509863] Hardware name: Google Lazor (rev3 - 8) with LTE (DT) +[ 292.509872] pstate: 80400009 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) +[ 292.509881] pc : adreno_runtime_suspend+0x3c/0x44 +[ 292.509891] lr : pm_generic_runtime_suspend+0x30/0x44 +[ 292.509905] sp : ffffffc014473bf0 +[...] +[ 292.510043] Call trace: +[ 292.510051] adreno_runtime_suspend+0x3c/0x44 +[ 292.510061] pm_generic_runtime_suspend+0x30/0x44 +[ 292.510071] pm_runtime_force_suspend+0x54/0xc8 +[ 292.510081] adreno_shutdown+0x1c/0x28 +[ 292.510090] platform_shutdown+0x2c/0x38 +[ 292.510104] device_shutdown+0x158/0x210 +[ 292.510119] kernel_restart_prepare+0x40/0x4c + +And here from GPU kthread, an SError OOPs: + +[ 192.648789] el1h_64_error+0x7c/0x80 +[ 192.648812] el1_interrupt+0x20/0x58 +[ 192.648833] el1h_64_irq_handler+0x18/0x24 +[ 192.648854] el1h_64_irq+0x7c/0x80 +[ 192.648873] local_daif_inherit+0x10/0x18 +[ 192.648900] el1h_64_sync_handler+0x48/0xb4 +[ 192.648921] el1h_64_sync+0x7c/0x80 +[ 192.648941] a6xx_gmu_set_oob+0xbc/0x1fc +[ 192.648968] a6xx_hw_init+0x44/0xe38 +[ 192.648991] msm_gpu_hw_init+0x48/0x80 +[ 192.649013] msm_gpu_submit+0x5c/0x1a8 +[ 192.649034] msm_job_run+0xb0/0x11c +[ 192.649058] drm_sched_main+0x170/0x434 +[ 192.649086] kthread+0x134/0x300 +[ 192.649114] ret_from_fork+0x10/0x20 + +Fix by calling adreno_system_suspend() in the device_shutdown() path. + +[ Applied Rob Clark feedback on fixing adreno_unbind() similarly, also + tested as above. ] + +Cc: Rob Clark +Cc: Steven Rostedt +Cc: Ricardo Ribalda +Cc: Ross Zwisler +Signed-off-by: Joel Fernandes (Google) +Reviewed-by: Ricardo Ribalda +Reviewed-by: Rob Clark +Patchwork: https://patchwork.freedesktop.org/patch/517633/ +Link: https://lore.kernel.org/r/20230109222547.1368644-1-joel@joelfernandes.org +Signed-off-by: Rob Clark +Stable-dep-of: 6153c44392b0 ("drm/msm/adreno: fix runtime PM imbalance at unbind") +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/adreno/adreno_device.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/msm/adreno/adreno_device.c +index 628806423f7d2..36f062c7582f9 100644 +--- a/drivers/gpu/drm/msm/adreno/adreno_device.c ++++ b/drivers/gpu/drm/msm/adreno/adreno_device.c +@@ -551,13 +551,14 @@ static int adreno_bind(struct device *dev, struct device *master, void *data) + return 0; + } + ++static int adreno_system_suspend(struct device *dev); + static void adreno_unbind(struct device *dev, struct device *master, + void *data) + { + struct msm_drm_private *priv = dev_get_drvdata(master); + struct msm_gpu *gpu = dev_to_gpu(dev); + +- pm_runtime_force_suspend(dev); ++ WARN_ON_ONCE(adreno_system_suspend(dev)); + gpu->funcs->destroy(gpu); + + priv->gpu_pdev = NULL; +@@ -609,7 +610,7 @@ static int adreno_remove(struct platform_device *pdev) + + static void adreno_shutdown(struct platform_device *pdev) + { +- pm_runtime_force_suspend(&pdev->dev); ++ WARN_ON_ONCE(adreno_system_suspend(&pdev->dev)); + } + + static const struct of_device_id dt_match[] = { +-- +2.39.2 + diff --git a/queue-6.1/drm-amdgpu-soc21-add-video-cap-query-support-for-vcn.patch b/queue-6.1/drm-amdgpu-soc21-add-video-cap-query-support-for-vcn.patch new file mode 100644 index 00000000000..95a584103e7 --- /dev/null +++ b/queue-6.1/drm-amdgpu-soc21-add-video-cap-query-support-for-vcn.patch @@ -0,0 +1,35 @@ +From 6246dc2fe71a080e6ea6f7db2e1bdb4c115087b9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Mar 2023 19:33:53 +0530 +Subject: drm/amdgpu/soc21: Add video cap query support for VCN_4_0_4 + +From: Veerabadhran Gopalakrishnan + +[ Upstream commit 6ce2ea07c5ff0a8188eab0e5cd1f0e4899b36835 ] + +Added the video capability query support for VCN version 4_0_4 + +Signed-off-by: Veerabadhran Gopalakrishnan +Reviewed-by: Leo Liu +Signed-off-by: Alex Deucher +Cc: stable@vger.kernel.org # 6.1.x +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/soc21.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/soc21.c b/drivers/gpu/drm/amd/amdgpu/soc21.c +index 61ee41aa8abb7..9c52af5005253 100644 +--- a/drivers/gpu/drm/amd/amdgpu/soc21.c ++++ b/drivers/gpu/drm/amd/amdgpu/soc21.c +@@ -109,6 +109,7 @@ static int soc21_query_video_codecs(struct amdgpu_device *adev, bool encode, + switch (adev->ip_versions[UVD_HWIP][0]) { + case IP_VERSION(4, 0, 0): + case IP_VERSION(4, 0, 2): ++ case IP_VERSION(4, 0, 4): + if (adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) { + if (encode) + *codecs = &vcn_4_0_0_video_codecs_encode_vcn1; +-- +2.39.2 + diff --git a/queue-6.1/drm-amdgpu-soc21-don-t-expose-av1-if-vcn0-is-harvest.patch b/queue-6.1/drm-amdgpu-soc21-don-t-expose-av1-if-vcn0-is-harvest.patch new file mode 100644 index 00000000000..bfd969b9e93 --- /dev/null +++ b/queue-6.1/drm-amdgpu-soc21-don-t-expose-av1-if-vcn0-is-harvest.patch @@ -0,0 +1,118 @@ +From f93f852a2db701dd337ed6b7ce471bd7601497fb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Jan 2023 10:45:59 -0500 +Subject: drm/amdgpu/soc21: don't expose AV1 if VCN0 is harvested + +From: Alex Deucher + +[ Upstream commit a6de636eb04f146d23644dbbb7173e142452a9b7 ] + +Only VCN0 supports AV1. + +Reviewed-by: Leo Liu +Signed-off-by: Alex Deucher +Stable-dep-of: 6ce2ea07c5ff ("drm/amdgpu/soc21: Add video cap query support for VCN_4_0_4") +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/soc21.c | 61 +++++++++++++++++++++++------- + 1 file changed, 48 insertions(+), 13 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/soc21.c b/drivers/gpu/drm/amd/amdgpu/soc21.c +index 00df439ed493d..61ee41aa8abb7 100644 +--- a/drivers/gpu/drm/amd/amdgpu/soc21.c ++++ b/drivers/gpu/drm/amd/amdgpu/soc21.c +@@ -47,19 +47,31 @@ + static const struct amd_ip_funcs soc21_common_ip_funcs; + + /* SOC21 */ +-static const struct amdgpu_video_codec_info vcn_4_0_0_video_codecs_encode_array[] = ++static const struct amdgpu_video_codec_info vcn_4_0_0_video_codecs_encode_array_vcn0[] = + { + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)}, + }; + +-static const struct amdgpu_video_codecs vcn_4_0_0_video_codecs_encode = ++static const struct amdgpu_video_codec_info vcn_4_0_0_video_codecs_encode_array_vcn1[] = + { +- .codec_count = ARRAY_SIZE(vcn_4_0_0_video_codecs_encode_array), +- .codec_array = vcn_4_0_0_video_codecs_encode_array, ++ {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)}, ++ {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)}, ++}; ++ ++static const struct amdgpu_video_codecs vcn_4_0_0_video_codecs_encode_vcn0 = ++{ ++ .codec_count = ARRAY_SIZE(vcn_4_0_0_video_codecs_encode_array_vcn0), ++ .codec_array = vcn_4_0_0_video_codecs_encode_array_vcn0, ++}; ++ ++static const struct amdgpu_video_codecs vcn_4_0_0_video_codecs_encode_vcn1 = ++{ ++ .codec_count = ARRAY_SIZE(vcn_4_0_0_video_codecs_encode_array_vcn1), ++ .codec_array = vcn_4_0_0_video_codecs_encode_array_vcn1, + }; + +-static const struct amdgpu_video_codec_info vcn_4_0_0_video_codecs_decode_array[] = ++static const struct amdgpu_video_codec_info vcn_4_0_0_video_codecs_decode_array_vcn0[] = + { + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, +@@ -68,23 +80,46 @@ static const struct amdgpu_video_codec_info vcn_4_0_0_video_codecs_decode_array[ + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)}, + }; + +-static const struct amdgpu_video_codecs vcn_4_0_0_video_codecs_decode = ++static const struct amdgpu_video_codec_info vcn_4_0_0_video_codecs_decode_array_vcn1[] = + { +- .codec_count = ARRAY_SIZE(vcn_4_0_0_video_codecs_decode_array), +- .codec_array = vcn_4_0_0_video_codecs_decode_array, ++ {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, ++ {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, ++ {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, ++ {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, ++}; ++ ++static const struct amdgpu_video_codecs vcn_4_0_0_video_codecs_decode_vcn0 = ++{ ++ .codec_count = ARRAY_SIZE(vcn_4_0_0_video_codecs_decode_array_vcn0), ++ .codec_array = vcn_4_0_0_video_codecs_decode_array_vcn0, ++}; ++ ++static const struct amdgpu_video_codecs vcn_4_0_0_video_codecs_decode_vcn1 = ++{ ++ .codec_count = ARRAY_SIZE(vcn_4_0_0_video_codecs_decode_array_vcn1), ++ .codec_array = vcn_4_0_0_video_codecs_decode_array_vcn1, + }; + + static int soc21_query_video_codecs(struct amdgpu_device *adev, bool encode, + const struct amdgpu_video_codecs **codecs) + { +- switch (adev->ip_versions[UVD_HWIP][0]) { ++ if (adev->vcn.num_vcn_inst == hweight8(adev->vcn.harvest_config)) ++ return -EINVAL; + ++ switch (adev->ip_versions[UVD_HWIP][0]) { + case IP_VERSION(4, 0, 0): + case IP_VERSION(4, 0, 2): +- if (encode) +- *codecs = &vcn_4_0_0_video_codecs_encode; +- else +- *codecs = &vcn_4_0_0_video_codecs_decode; ++ if (adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) { ++ if (encode) ++ *codecs = &vcn_4_0_0_video_codecs_encode_vcn1; ++ else ++ *codecs = &vcn_4_0_0_video_codecs_decode_vcn1; ++ } else { ++ if (encode) ++ *codecs = &vcn_4_0_0_video_codecs_encode_vcn0; ++ else ++ *codecs = &vcn_4_0_0_video_codecs_decode_vcn0; ++ } + return 0; + default: + return -EINVAL; +-- +2.39.2 + diff --git a/queue-6.1/drm-msm-adreno-fix-runtime-pm-imbalance-at-unbind.patch b/queue-6.1/drm-msm-adreno-fix-runtime-pm-imbalance-at-unbind.patch new file mode 100644 index 00000000000..ffd7e94dc33 --- /dev/null +++ b/queue-6.1/drm-msm-adreno-fix-runtime-pm-imbalance-at-unbind.patch @@ -0,0 +1,52 @@ +From 7ad70c02c9a608a45827d7bbb6a0c969f3b1d4f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 21 Feb 2023 11:14:27 +0100 +Subject: drm/msm/adreno: fix runtime PM imbalance at unbind + +From: Johan Hovold + +[ Upstream commit 6153c44392b04ff2da1e9aa82ba87da9ab9a0fc1 ] + +A recent commit moved enabling of runtime PM from adreno_gpu_init() to +adreno_load_gpu() (called on first open()), which means that unbind() +may now be called with runtime PM disabled in case the device was never +opened in between. + +Make sure to only forcibly suspend and disable runtime PM at unbind() in +case runtime PM has been enabled to prevent a disable count imbalance. + +This specifically avoids leaving runtime PM disabled when the device +is later opened after a successful bind: + + msm_dpu ae01000.display-controller: [drm:adreno_load_gpu [msm]] *ERROR* Couldn't power up the GPU: -13 + +Fixes: 4b18299b3365 ("drm/msm/adreno: Defer enabling runpm until hw_init()") +Reported-by: Bjorn Andersson +Link: https://lore.kernel.org/lkml/20230203181245.3523937-1-quic_bjorande@quicinc.com +Cc: stable@vger.kernel.org # 6.0 +Signed-off-by: Johan Hovold +Patchwork: https://patchwork.freedesktop.org/patch/523549/ +Link: https://lore.kernel.org/r/20230221101430.14546-2-johan+linaro@kernel.org +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/adreno/adreno_device.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/msm/adreno/adreno_device.c +index 36f062c7582f9..c5c4c93b3689c 100644 +--- a/drivers/gpu/drm/msm/adreno/adreno_device.c ++++ b/drivers/gpu/drm/msm/adreno/adreno_device.c +@@ -558,7 +558,8 @@ static void adreno_unbind(struct device *dev, struct device *master, + struct msm_drm_private *priv = dev_get_drvdata(master); + struct msm_gpu *gpu = dev_to_gpu(dev); + +- WARN_ON_ONCE(adreno_system_suspend(dev)); ++ if (pm_runtime_enabled(dev)) ++ WARN_ON_ONCE(adreno_system_suspend(dev)); + gpu->funcs->destroy(gpu); + + priv->gpu_pdev = NULL; +-- +2.39.2 + diff --git a/queue-6.1/series b/queue-6.1/series index bb22bfb3629..ca5f29d9d62 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -113,3 +113,9 @@ riscv-use-read_once_nocheck-in-imprecise-unwinding-s.patch risc-v-don-t-check-text_mutex-during-stop_machine.patch drm-amdgpu-fix-return-value-check-in-kfd.patch ext4-fix-deadlock-during-directory-rename.patch +drm-amdgpu-soc21-don-t-expose-av1-if-vcn0-is-harvest.patch +drm-amdgpu-soc21-add-video-cap-query-support-for-vcn.patch +adreno-shutdown-the-gpu-properly.patch +drm-msm-adreno-fix-runtime-pm-imbalance-at-unbind.patch +watch_queue-fix-ioc_watch_queue_set_size-alloc-error.patch +tpm-eventlog-don-t-abort-tpm_read_log-on-faulty-acpi.patch diff --git a/queue-6.1/tpm-eventlog-don-t-abort-tpm_read_log-on-faulty-acpi.patch b/queue-6.1/tpm-eventlog-don-t-abort-tpm_read_log-on-faulty-acpi.patch new file mode 100644 index 00000000000..18333f6bd6a --- /dev/null +++ b/queue-6.1/tpm-eventlog-don-t-abort-tpm_read_log-on-faulty-acpi.patch @@ -0,0 +1,73 @@ +From 00f59c85cc216f1b5141febb74eee41cd9c57f3b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Feb 2023 10:25:52 +0100 +Subject: tpm/eventlog: Don't abort tpm_read_log on faulty ACPI address + +From: Morten Linderud + +[ Upstream commit 80a6c216b16d7f5c584d2148c2e4345ea4eb06ce ] + +tpm_read_log_acpi() should return -ENODEV when no eventlog from the ACPI +table is found. If the firmware vendor includes an invalid log address +we are unable to map from the ACPI memory and tpm_read_log() returns -EIO +which would abort discovery of the eventlog. + +Change the return value from -EIO to -ENODEV when acpi_os_map_iomem() +fails to map the event log. + +The following hardware was used to test this issue: + Framework Laptop (Pre-production) + BIOS: INSYDE Corp, Revision: 3.2 + TPM Device: NTC, Firmware Revision: 7.2 + +Dump of the faulty ACPI TPM2 table: + [000h 0000 4] Signature : "TPM2" [Trusted Platform Module hardware interface Table] + [004h 0004 4] Table Length : 0000004C + [008h 0008 1] Revision : 04 + [009h 0009 1] Checksum : 2B + [00Ah 0010 6] Oem ID : "INSYDE" + [010h 0016 8] Oem Table ID : "TGL-ULT" + [018h 0024 4] Oem Revision : 00000002 + [01Ch 0028 4] Asl Compiler ID : "ACPI" + [020h 0032 4] Asl Compiler Revision : 00040000 + + [024h 0036 2] Platform Class : 0000 + [026h 0038 2] Reserved : 0000 + [028h 0040 8] Control Address : 0000000000000000 + [030h 0048 4] Start Method : 06 [Memory Mapped I/O] + + [034h 0052 12] Method Parameters : 00 00 00 00 00 00 00 00 00 00 00 00 + [040h 0064 4] Minimum Log Length : 00010000 + [044h 0068 8] Log Address : 000000004053D000 + +Fixes: 0cf577a03f21 ("tpm: Fix handling of missing event log") +Tested-by: Erkki Eilonen +Signed-off-by: Morten Linderud +Reviewed-by: Jarkko Sakkinen +Signed-off-by: Jarkko Sakkinen +Signed-off-by: Sasha Levin +--- + drivers/char/tpm/eventlog/acpi.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/char/tpm/eventlog/acpi.c b/drivers/char/tpm/eventlog/acpi.c +index 0913d3eb8d518..cd266021d0103 100644 +--- a/drivers/char/tpm/eventlog/acpi.c ++++ b/drivers/char/tpm/eventlog/acpi.c +@@ -143,8 +143,12 @@ int tpm_read_log_acpi(struct tpm_chip *chip) + + ret = -EIO; + virt = acpi_os_map_iomem(start, len); +- if (!virt) ++ if (!virt) { ++ dev_warn(&chip->dev, "%s: Failed to map ACPI memory\n", __func__); ++ /* try EFI log next */ ++ ret = -ENODEV; + goto err; ++ } + + memcpy_fromio(log->bios_event_log, virt, len); + +-- +2.39.2 + diff --git a/queue-6.1/watch_queue-fix-ioc_watch_queue_set_size-alloc-error.patch b/queue-6.1/watch_queue-fix-ioc_watch_queue_set_size-alloc-error.patch new file mode 100644 index 00000000000..979119c301f --- /dev/null +++ b/queue-6.1/watch_queue-fix-ioc_watch_queue_set_size-alloc-error.patch @@ -0,0 +1,39 @@ +From 2e463090efdcab0b490541161574c1075a42950a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Mar 2023 16:21:06 +0100 +Subject: watch_queue: fix IOC_WATCH_QUEUE_SET_SIZE alloc error paths + +From: David Disseldorp + +[ Upstream commit 03e1d60e177eedbd302b77af4ea5e21b5a7ade31 ] + +The watch_queue_set_size() allocation error paths return the ret value +set via the prior pipe_resize_ring() call, which will always be zero. + +As a result, IOC_WATCH_QUEUE_SET_SIZE callers such as "keyctl watch" +fail to detect kernel wqueue->notes allocation failures and proceed to +KEYCTL_WATCH_KEY, with any notifications subsequently lost. + +Fixes: c73be61cede58 ("pipe: Add general notification queue support") +Signed-off-by: David Disseldorp +Signed-off-by: Christian Brauner (Microsoft) +Signed-off-by: Sasha Levin +--- + kernel/watch_queue.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/kernel/watch_queue.c b/kernel/watch_queue.c +index a6f9bdd956c39..f10f403104e7d 100644 +--- a/kernel/watch_queue.c ++++ b/kernel/watch_queue.c +@@ -273,6 +273,7 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes) + if (ret < 0) + goto error; + ++ ret = -ENOMEM; + pages = kcalloc(sizeof(struct page *), nr_pages, GFP_KERNEL); + if (!pages) + goto error; +-- +2.39.2 +