aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4972-drm-amdgpu-pm-Remove-VLA-usage.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4972-drm-amdgpu-pm-Remove-VLA-usage.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4972-drm-amdgpu-pm-Remove-VLA-usage.patch174
1 files changed, 174 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4972-drm-amdgpu-pm-Remove-VLA-usage.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4972-drm-amdgpu-pm-Remove-VLA-usage.patch
new file mode 100644
index 00000000..c74ec7c3
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4972-drm-amdgpu-pm-Remove-VLA-usage.patch
@@ -0,0 +1,174 @@
+From 394cda92a7180bcee0d9ac775d14b653b0e2d01d Mon Sep 17 00:00:00 2001
+From: Kees Cook <keescook@chromium.org>
+Date: Wed, 20 Jun 2018 11:26:47 -0700
+Subject: [PATCH 4972/5725] drm/amdgpu/pm: Remove VLA usage
+
+In the quest to remove all stack VLA usage from the kernel[1], this
+uses the maximum sane buffer size and removes copy/paste code.
+
+[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
+
+Reviewed-by: Rex Zhu <rezhu@amd.com>
+Signed-off-by: Kees Cook <keescook@chromium.org>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 100 ++++++++++++++-------------------
+ 1 file changed, 42 insertions(+), 58 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+index f30e03f..a3ab2a2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+@@ -606,40 +606,59 @@ static ssize_t amdgpu_get_pp_dpm_sclk(struct device *dev,
+ return snprintf(buf, PAGE_SIZE, "\n");
+ }
+
+-static ssize_t amdgpu_set_pp_dpm_sclk(struct device *dev,
+- struct device_attribute *attr,
+- const char *buf,
+- size_t count)
++/*
++ * Worst case: 32 bits individually specified, in octal at 12 characters
++ * per line (+1 for \n).
++ */
++#define AMDGPU_MASK_BUF_MAX (32 * 13)
++
++static ssize_t amdgpu_read_mask(const char *buf, size_t count, uint32_t *mask)
+ {
+- struct drm_device *ddev = dev_get_drvdata(dev);
+- struct amdgpu_device *adev = ddev->dev_private;
+ int ret;
+ long level;
+- uint32_t mask = 0;
+ char *sub_str = NULL;
+ char *tmp;
+- char buf_cpy[count];
++ char buf_cpy[AMDGPU_MASK_BUF_MAX + 1];
+ const char delimiter[3] = {' ', '\n', '\0'};
++ size_t bytes;
+
+- memcpy(buf_cpy, buf, count+1);
++ *mask = 0;
++
++ bytes = min(count, sizeof(buf_cpy) - 1);
++ memcpy(buf_cpy, buf, bytes);
++ buf_cpy[bytes] = '\0';
+ tmp = buf_cpy;
+ while (tmp[0]) {
+- sub_str = strsep(&tmp, delimiter);
++ sub_str = strsep(&tmp, delimiter);
+ if (strlen(sub_str)) {
+ ret = kstrtol(sub_str, 0, &level);
+-
+- if (ret) {
+- count = -EINVAL;
+- goto fail;
+- }
+- mask |= 1 << level;
++ if (ret)
++ return -EINVAL;
++ *mask |= 1 << level;
+ } else
+ break;
+ }
++
++ return 0;
++}
++
++static ssize_t amdgpu_set_pp_dpm_sclk(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf,
++ size_t count)
++{
++ struct drm_device *ddev = dev_get_drvdata(dev);
++ struct amdgpu_device *adev = ddev->dev_private;
++ int ret;
++ uint32_t mask = 0;
++
++ ret = amdgpu_read_mask(buf, count, &mask);
++ if (ret)
++ return ret;
++
+ if (adev->powerplay.pp_funcs->force_clock_level)
+ amdgpu_dpm_force_clock_level(adev, PP_SCLK, mask);
+
+-fail:
+ return count;
+ }
+
+@@ -664,32 +683,15 @@ static ssize_t amdgpu_set_pp_dpm_mclk(struct device *dev,
+ struct drm_device *ddev = dev_get_drvdata(dev);
+ struct amdgpu_device *adev = ddev->dev_private;
+ int ret;
+- long level;
+ uint32_t mask = 0;
+- char *sub_str = NULL;
+- char *tmp;
+- char buf_cpy[count];
+- const char delimiter[3] = {' ', '\n', '\0'};
+
+- memcpy(buf_cpy, buf, count+1);
+- tmp = buf_cpy;
+- while (tmp[0]) {
+- sub_str = strsep(&tmp, delimiter);
+- if (strlen(sub_str)) {
+- ret = kstrtol(sub_str, 0, &level);
++ ret = amdgpu_read_mask(buf, count, &mask);
++ if (ret)
++ return ret;
+
+- if (ret) {
+- count = -EINVAL;
+- goto fail;
+- }
+- mask |= 1 << level;
+- } else
+- break;
+- }
+ if (adev->powerplay.pp_funcs->force_clock_level)
+ amdgpu_dpm_force_clock_level(adev, PP_MCLK, mask);
+
+-fail:
+ return count;
+ }
+
+@@ -714,33 +716,15 @@ static ssize_t amdgpu_set_pp_dpm_pcie(struct device *dev,
+ struct drm_device *ddev = dev_get_drvdata(dev);
+ struct amdgpu_device *adev = ddev->dev_private;
+ int ret;
+- long level;
+ uint32_t mask = 0;
+- char *sub_str = NULL;
+- char *tmp;
+- char buf_cpy[count];
+- const char delimiter[3] = {' ', '\n', '\0'};
+-
+- memcpy(buf_cpy, buf, count+1);
+- tmp = buf_cpy;
+
+- while (tmp[0]) {
+- sub_str = strsep(&tmp, delimiter);
+- if (strlen(sub_str)) {
+- ret = kstrtol(sub_str, 0, &level);
++ ret = amdgpu_read_mask(buf, count, &mask);
++ if (ret)
++ return ret;
+
+- if (ret) {
+- count = -EINVAL;
+- goto fail;
+- }
+- mask |= 1 << level;
+- } else
+- break;
+- }
+ if (adev->powerplay.pp_funcs->force_clock_level)
+ amdgpu_dpm_force_clock_level(adev, PP_PCIE, mask);
+
+-fail:
+ return count;
+ }
+
+--
+2.7.4
+