* [PATCH linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers
@ 2012-12-06 17:42 Tim Gardner
2012-12-07 11:47 ` Jani Nikula
0 siblings, 1 reply; 7+ messages in thread
From: Tim Gardner @ 2012-12-06 17:42 UTC (permalink / raw)
To: linux-kernel; +Cc: Tim Gardner, Daniel Vetter, David Airlie, dri-devel
smatch warning:
drivers/gpu/drm/i915/intel_display.c:7019 intel_set_mode() warn: function puts
500 bytes on stack
Refactor so that saved_mode and saved_hwmode are dynamically allocated as opposed
to being automatic variables. 500 bytes seems like it could run the potential for blowing
the kernel stack, especially if struct drm_display_mode ever grows significantly.
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
---
drivers/gpu/drm/i915/intel_display.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index de51489..f8754d6 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7739,11 +7739,18 @@ bool intel_set_mode(struct drm_crtc *crtc,
{
struct drm_device *dev = crtc->dev;
drm_i915_private_t *dev_priv = dev->dev_private;
- struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
+ struct drm_display_mode *adjusted_mode, *saved_mode, *saved_hwmode;
struct intel_crtc *intel_crtc;
unsigned disable_pipes, prepare_pipes, modeset_pipes;
bool ret = true;
+ saved_mode = kmalloc(2*sizeof(*saved_mode), GFP_KERNEL);
+ if (!saved_mode) {
+ pr_err("i915: Could not allocate saved display mode.\n");
+ return false;
+ }
+ saved_hwmode = saved_mode + 1;
+
intel_modeset_affected_pipes(crtc, &modeset_pipes,
&prepare_pipes, &disable_pipes);
@@ -7753,8 +7760,8 @@ bool intel_set_mode(struct drm_crtc *crtc,
for_each_intel_crtc_masked(dev, disable_pipes, intel_crtc)
intel_crtc_disable(&intel_crtc->base);
- saved_hwmode = crtc->hwmode;
- saved_mode = crtc->mode;
+ *saved_hwmode = crtc->hwmode;
+ *saved_mode = crtc->mode;
/* Hack: Because we don't (yet) support global modeset on multiple
* crtcs, we don't keep track of the new mode for more than one crtc.
@@ -7817,12 +7824,13 @@ bool intel_set_mode(struct drm_crtc *crtc,
done:
drm_mode_destroy(dev, adjusted_mode);
if (!ret && crtc->enabled) {
- crtc->hwmode = saved_hwmode;
- crtc->mode = saved_mode;
+ crtc->hwmode = *saved_hwmode;
+ crtc->mode = *saved_mode;
} else {
intel_modeset_check_state(dev);
}
+ kfree(saved_mode);
return ret;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers
2012-12-06 17:42 [PATCH linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers Tim Gardner
@ 2012-12-07 11:47 ` Jani Nikula
2012-12-07 11:49 ` Chris Wilson
2012-12-07 14:54 ` [PATCH v2 " Tim Gardner
0 siblings, 2 replies; 7+ messages in thread
From: Jani Nikula @ 2012-12-07 11:47 UTC (permalink / raw)
To: Tim Gardner, linux-kernel; +Cc: Daniel Vetter, Tim Gardner, dri-devel
On Thu, 06 Dec 2012, Tim Gardner <tim.gardner@canonical.com> wrote:
> smatch warning:
>
> drivers/gpu/drm/i915/intel_display.c:7019 intel_set_mode() warn: function puts
> 500 bytes on stack
>
> Refactor so that saved_mode and saved_hwmode are dynamically allocated as opposed
> to being automatic variables. 500 bytes seems like it could run the potential for blowing
> the kernel stack, especially if struct drm_display_mode ever grows significantly.
Hi Tim, seems reasonable, but please find a few comments inline.
BR,
Jani.
>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: David Airlie <airlied@linux.ie>
> Cc: dri-devel@lists.freedesktop.org
> Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
> ---
> drivers/gpu/drm/i915/intel_display.c | 18 +++++++++++++-----
> 1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index de51489..f8754d6 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -7739,11 +7739,18 @@ bool intel_set_mode(struct drm_crtc *crtc,
> {
> struct drm_device *dev = crtc->dev;
> drm_i915_private_t *dev_priv = dev->dev_private;
> - struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
> + struct drm_display_mode *adjusted_mode, *saved_mode, *saved_hwmode;
> struct intel_crtc *intel_crtc;
> unsigned disable_pipes, prepare_pipes, modeset_pipes;
> bool ret = true;
>
> + saved_mode = kmalloc(2*sizeof(*saved_mode), GFP_KERNEL);
Style nitpick, missing spaces around the first *.
> + if (!saved_mode) {
> + pr_err("i915: Could not allocate saved display mode.\n");
Please use DRM_ERROR().
> + return false;
> + }
> + saved_hwmode = saved_mode + 1;
> +
> intel_modeset_affected_pipes(crtc, &modeset_pipes,
> &prepare_pipes, &disable_pipes);
>
> @@ -7753,8 +7760,8 @@ bool intel_set_mode(struct drm_crtc *crtc,
> for_each_intel_crtc_masked(dev, disable_pipes, intel_crtc)
> intel_crtc_disable(&intel_crtc->base);
>
> - saved_hwmode = crtc->hwmode;
> - saved_mode = crtc->mode;
> + *saved_hwmode = crtc->hwmode;
> + *saved_mode = crtc->mode;
>
> /* Hack: Because we don't (yet) support global modeset on multiple
> * crtcs, we don't keep track of the new mode for more than one crtc.
You are missing a kfree in the adjusted_mode error path after this hunk.
> @@ -7817,12 +7824,13 @@ bool intel_set_mode(struct drm_crtc *crtc,
> done:
> drm_mode_destroy(dev, adjusted_mode);
> if (!ret && crtc->enabled) {
> - crtc->hwmode = saved_hwmode;
> - crtc->mode = saved_mode;
> + crtc->hwmode = *saved_hwmode;
> + crtc->mode = *saved_mode;
> } else {
> intel_modeset_check_state(dev);
> }
>
> + kfree(saved_mode);
> return ret;
> }
>
> --
> 1.7.9.5
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers
2012-12-07 11:47 ` Jani Nikula
@ 2012-12-07 11:49 ` Chris Wilson
2012-12-07 12:05 ` Jani Nikula
2012-12-07 14:54 ` [PATCH v2 " Tim Gardner
1 sibling, 1 reply; 7+ messages in thread
From: Chris Wilson @ 2012-12-07 11:49 UTC (permalink / raw)
To: Jani Nikula, Tim Gardner, linux-kernel
Cc: Daniel Vetter, Tim Gardner, dri-devel
On Fri, 07 Dec 2012 13:47:46 +0200, Jani Nikula <jani.nikula@linux.intel.com> wrote:
>
> On Thu, 06 Dec 2012, Tim Gardner <tim.gardner@canonical.com> wrote:
> > + if (!saved_mode) {
> > + pr_err("i915: Could not allocate saved display mode.\n");
>
> Please use DRM_ERROR().
Truthfully neither, but join the growing petition to get real errorcodes
back to userspace!
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers
2012-12-07 11:49 ` Chris Wilson
@ 2012-12-07 12:05 ` Jani Nikula
0 siblings, 0 replies; 7+ messages in thread
From: Jani Nikula @ 2012-12-07 12:05 UTC (permalink / raw)
To: Chris Wilson, Tim Gardner, linux-kernel
Cc: Daniel Vetter, Tim Gardner, dri-devel
On Fri, 07 Dec 2012, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> On Fri, 07 Dec 2012 13:47:46 +0200, Jani Nikula <jani.nikula@linux.intel.com> wrote:
>>
>> On Thu, 06 Dec 2012, Tim Gardner <tim.gardner@canonical.com> wrote:
>> > + if (!saved_mode) {
>> > + pr_err("i915: Could not allocate saved display mode.\n");
>>
>> Please use DRM_ERROR().
>
> Truthfully neither, but join the growing petition to get real errorcodes
> back to userspace!
Heh, agreed, but in the mean time (i.e. before hell freezes over) I
think we should prefer DRM_ERROR over pr_err for consistency.
Jani.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers
2012-12-07 11:47 ` Jani Nikula
2012-12-07 11:49 ` Chris Wilson
@ 2012-12-07 14:54 ` Tim Gardner
2012-12-10 7:29 ` Jani Nikula
1 sibling, 1 reply; 7+ messages in thread
From: Tim Gardner @ 2012-12-07 14:54 UTC (permalink / raw)
To: jani.nikula, linux-kernel
Cc: Tim Gardner, Daniel Vetter, David Airlie, dri-devel
smatch warning:
drivers/gpu/drm/i915/intel_display.c:7019 intel_set_mode() warn: function puts
500 bytes on stack
Refactor so that saved_mode and saved_hwmode are dynamically allocated as opposed
to being automatic variables. 500 bytes seems like it could run the potential for blowing
the kernel stack.
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
---
V2 - spaces around '*', use kmalloc instead of kzalloc(). Missed
error return that would have orphaned memory.
drivers/gpu/drm/i915/intel_display.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index de51489..c15b21b 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7739,11 +7739,18 @@ bool intel_set_mode(struct drm_crtc *crtc,
{
struct drm_device *dev = crtc->dev;
drm_i915_private_t *dev_priv = dev->dev_private;
- struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
+ struct drm_display_mode *adjusted_mode, *saved_mode, *saved_hwmode;
struct intel_crtc *intel_crtc;
unsigned disable_pipes, prepare_pipes, modeset_pipes;
bool ret = true;
+ saved_mode = kmalloc(2 * sizeof(*saved_mode), GFP_KERNEL);
+ if (!saved_mode) {
+ DRM_ERROR("i915: Could not allocate saved display mode.\n");
+ return false;
+ }
+ saved_hwmode = saved_mode + 1;
+
intel_modeset_affected_pipes(crtc, &modeset_pipes,
&prepare_pipes, &disable_pipes);
@@ -7753,8 +7760,8 @@ bool intel_set_mode(struct drm_crtc *crtc,
for_each_intel_crtc_masked(dev, disable_pipes, intel_crtc)
intel_crtc_disable(&intel_crtc->base);
- saved_hwmode = crtc->hwmode;
- saved_mode = crtc->mode;
+ *saved_hwmode = crtc->hwmode;
+ *saved_mode = crtc->mode;
/* Hack: Because we don't (yet) support global modeset on multiple
* crtcs, we don't keep track of the new mode for more than one crtc.
@@ -7765,7 +7772,8 @@ bool intel_set_mode(struct drm_crtc *crtc,
if (modeset_pipes) {
adjusted_mode = intel_modeset_adjusted_mode(crtc, mode);
if (IS_ERR(adjusted_mode)) {
- return false;
+ ret = false;
+ goto out;
}
}
@@ -7817,12 +7825,14 @@ bool intel_set_mode(struct drm_crtc *crtc,
done:
drm_mode_destroy(dev, adjusted_mode);
if (!ret && crtc->enabled) {
- crtc->hwmode = saved_hwmode;
- crtc->mode = saved_mode;
+ crtc->hwmode = *saved_hwmode;
+ crtc->mode = *saved_mode;
} else {
intel_modeset_check_state(dev);
}
+out:
+ kfree(saved_mode);
return ret;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers
2012-12-07 14:54 ` [PATCH v2 " Tim Gardner
@ 2012-12-10 7:29 ` Jani Nikula
2012-12-10 9:14 ` Daniel Vetter
0 siblings, 1 reply; 7+ messages in thread
From: Jani Nikula @ 2012-12-10 7:29 UTC (permalink / raw)
To: Tim Gardner, linux-kernel
Cc: Tim Gardner, Daniel Vetter, David Airlie, dri-devel
On Fri, 07 Dec 2012, Tim Gardner <tim.gardner@canonical.com> wrote:
> smatch warning:
>
> drivers/gpu/drm/i915/intel_display.c:7019 intel_set_mode() warn: function puts
> 500 bytes on stack
>
> Refactor so that saved_mode and saved_hwmode are dynamically allocated as opposed
> to being automatic variables. 500 bytes seems like it could run the potential for blowing
> the kernel stack.
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: David Airlie <airlied@linux.ie>
> Cc: dri-devel@lists.freedesktop.org
> Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
> ---
>
> V2 - spaces around '*', use kmalloc instead of kzalloc(). Missed
> error return that would have orphaned memory.
>
> drivers/gpu/drm/i915/intel_display.c | 22 ++++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index de51489..c15b21b 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -7739,11 +7739,18 @@ bool intel_set_mode(struct drm_crtc *crtc,
> {
> struct drm_device *dev = crtc->dev;
> drm_i915_private_t *dev_priv = dev->dev_private;
> - struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
> + struct drm_display_mode *adjusted_mode, *saved_mode, *saved_hwmode;
> struct intel_crtc *intel_crtc;
> unsigned disable_pipes, prepare_pipes, modeset_pipes;
> bool ret = true;
>
> + saved_mode = kmalloc(2 * sizeof(*saved_mode), GFP_KERNEL);
> + if (!saved_mode) {
> + DRM_ERROR("i915: Could not allocate saved display mode.\n");
> + return false;
> + }
> + saved_hwmode = saved_mode + 1;
> +
> intel_modeset_affected_pipes(crtc, &modeset_pipes,
> &prepare_pipes, &disable_pipes);
>
> @@ -7753,8 +7760,8 @@ bool intel_set_mode(struct drm_crtc *crtc,
> for_each_intel_crtc_masked(dev, disable_pipes, intel_crtc)
> intel_crtc_disable(&intel_crtc->base);
>
> - saved_hwmode = crtc->hwmode;
> - saved_mode = crtc->mode;
> + *saved_hwmode = crtc->hwmode;
> + *saved_mode = crtc->mode;
>
> /* Hack: Because we don't (yet) support global modeset on multiple
> * crtcs, we don't keep track of the new mode for more than one crtc.
> @@ -7765,7 +7772,8 @@ bool intel_set_mode(struct drm_crtc *crtc,
> if (modeset_pipes) {
> adjusted_mode = intel_modeset_adjusted_mode(crtc, mode);
> if (IS_ERR(adjusted_mode)) {
> - return false;
> + ret = false;
> + goto out;
> }
> }
>
> @@ -7817,12 +7825,14 @@ bool intel_set_mode(struct drm_crtc *crtc,
> done:
> drm_mode_destroy(dev, adjusted_mode);
> if (!ret && crtc->enabled) {
> - crtc->hwmode = saved_hwmode;
> - crtc->mode = saved_mode;
> + crtc->hwmode = *saved_hwmode;
> + crtc->mode = *saved_mode;
> } else {
> intel_modeset_check_state(dev);
> }
>
> +out:
> + kfree(saved_mode);
> return ret;
> }
>
> --
> 1.7.9.5
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers
2012-12-10 7:29 ` Jani Nikula
@ 2012-12-10 9:14 ` Daniel Vetter
0 siblings, 0 replies; 7+ messages in thread
From: Daniel Vetter @ 2012-12-10 9:14 UTC (permalink / raw)
To: Jani Nikula
Cc: Tim Gardner, linux-kernel, Daniel Vetter, David Airlie, dri-devel
On Mon, Dec 10, 2012 at 09:29:17AM +0200, Jani Nikula wrote:
> On Fri, 07 Dec 2012, Tim Gardner <tim.gardner@canonical.com> wrote:
> > smatch warning:
> >
> > drivers/gpu/drm/i915/intel_display.c:7019 intel_set_mode() warn: function puts
> > 500 bytes on stack
> >
> > Refactor so that saved_mode and saved_hwmode are dynamically allocated as opposed
> > to being automatic variables. 500 bytes seems like it could run the potential for blowing
> > the kernel stack.
>
> Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Queued for -next, thanks for the patch.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-12-10 9:12 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-06 17:42 [PATCH linux-next] i915: intel_set_mode: Reduce stack allocation from 500 bytes to 2 pointers Tim Gardner
2012-12-07 11:47 ` Jani Nikula
2012-12-07 11:49 ` Chris Wilson
2012-12-07 12:05 ` Jani Nikula
2012-12-07 14:54 ` [PATCH v2 " Tim Gardner
2012-12-10 7:29 ` Jani Nikula
2012-12-10 9:14 ` Daniel Vetter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).