Message ID | 20190418084254.549410214@linutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | stacktrace: Consolidate stack trace usage | expand |
On Thu, Apr 18, 2019 at 10:41:35AM +0200, Thomas Gleixner wrote: > Replace the indirection through struct stack_trace by using the storage > array based interfaces. > > The original code in all printing functions is really wrong. It allocates a > storage array on stack which is unused because depot_fetch_stack() does not > store anything in it. It overwrites the entries pointer in the stack_trace > struct so it points to the depot storage. Thanks for cleaning this up for us! > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > Cc: intel-gfx@lists.freedesktop.org > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > Cc: dri-devel@lists.freedesktop.org > Cc: David Airlie <airlied@linux.ie> > Cc: Jani Nikula <jani.nikula@linux.intel.com> > Cc: Daniel Vetter <daniel@ffwll.ch> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> for merging through whatever tree is convenient for you (or tell me I should pick it up into drm-next when the prep work landed). Cheers, Daniel > --- > drivers/gpu/drm/drm_mm.c | 22 +++++++--------------- > drivers/gpu/drm/i915/i915_vma.c | 11 ++++------- > drivers/gpu/drm/i915/intel_runtime_pm.c | 21 +++++++-------------- > 3 files changed, 18 insertions(+), 36 deletions(-) > > --- a/drivers/gpu/drm/drm_mm.c > +++ b/drivers/gpu/drm/drm_mm.c > @@ -106,22 +106,19 @@ > static noinline void save_stack(struct drm_mm_node *node) > { > unsigned long entries[STACKDEPTH]; > - struct stack_trace trace = { > - .entries = entries, > - .max_entries = STACKDEPTH, > - .skip = 1 > - }; > + unsigned int n; > > - save_stack_trace(&trace); > + n = stack_trace_save(entries, ARRAY_SIZE(entries), 1); > > /* May be called under spinlock, so avoid sleeping */ > - node->stack = depot_save_stack(&trace, GFP_NOWAIT); > + node->stack = stack_depot_save(entries, n, GFP_NOWAIT); > } > > static void show_leaks(struct drm_mm *mm) > { > struct drm_mm_node *node; > - unsigned long entries[STACKDEPTH]; > + unsigned long *entries; > + unsigned int nr_entries; > char *buf; > > buf = kmalloc(BUFSZ, GFP_KERNEL); > @@ -129,19 +126,14 @@ static void show_leaks(struct drm_mm *mm > return; > > list_for_each_entry(node, drm_mm_nodes(mm), node_list) { > - struct stack_trace trace = { > - .entries = entries, > - .max_entries = STACKDEPTH > - }; > - > if (!node->stack) { > DRM_ERROR("node [%08llx + %08llx]: unknown owner\n", > node->start, node->size); > continue; > } > > - depot_fetch_stack(node->stack, &trace); > - snprint_stack_trace(buf, BUFSZ, &trace, 0); > + nr_entries = stack_depot_fetch(node->stack, &entries); > + stack_trace_snprint(buf, BUFSZ, entries, nr_entries, 0); > DRM_ERROR("node [%08llx + %08llx]: inserted at\n%s", > node->start, node->size, buf); > } > --- a/drivers/gpu/drm/i915/i915_vma.c > +++ b/drivers/gpu/drm/i915/i915_vma.c > @@ -36,11 +36,8 @@ > > static void vma_print_allocator(struct i915_vma *vma, const char *reason) > { > - unsigned long entries[12]; > - struct stack_trace trace = { > - .entries = entries, > - .max_entries = ARRAY_SIZE(entries), > - }; > + unsigned long *entries; > + unsigned int nr_entries; > char buf[512]; > > if (!vma->node.stack) { > @@ -49,8 +46,8 @@ static void vma_print_allocator(struct i > return; > } > > - depot_fetch_stack(vma->node.stack, &trace); > - snprint_stack_trace(buf, sizeof(buf), &trace, 0); > + nr_entries = stack_depot_fetch(vma->node.stack, &entries); > + stack_trace_snprint(buf, sizeof(buf), entries, nr_entries, 0); > DRM_DEBUG_DRIVER("vma.node [%08llx + %08llx] %s: inserted at %s\n", > vma->node.start, vma->node.size, reason, buf); > } > --- a/drivers/gpu/drm/i915/intel_runtime_pm.c > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c > @@ -60,27 +60,20 @@ > static noinline depot_stack_handle_t __save_depot_stack(void) > { > unsigned long entries[STACKDEPTH]; > - struct stack_trace trace = { > - .entries = entries, > - .max_entries = ARRAY_SIZE(entries), > - .skip = 1, > - }; > + unsigned int n; > > - save_stack_trace(&trace); > - return depot_save_stack(&trace, GFP_NOWAIT | __GFP_NOWARN); > + n = stack_trace_save(entries, ARRAY_SIZE(entries), 1); > + return stack_depot_save(entries, n, GFP_NOWAIT | __GFP_NOWARN); > } > > static void __print_depot_stack(depot_stack_handle_t stack, > char *buf, int sz, int indent) > { > - unsigned long entries[STACKDEPTH]; > - struct stack_trace trace = { > - .entries = entries, > - .max_entries = ARRAY_SIZE(entries), > - }; > + unsigned long *entries; > + unsigned int nr_entries; > > - depot_fetch_stack(stack, &trace); > - snprint_stack_trace(buf, sz, &trace, indent); > + nr_entries = stack_depot_fetch(stack, &entries); > + stack_trace_snprint(buf, sz, entries, nr_entries, indent); > } > > static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) > >
--- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c @@ -106,22 +106,19 @@ static noinline void save_stack(struct drm_mm_node *node) { unsigned long entries[STACKDEPTH]; - struct stack_trace trace = { - .entries = entries, - .max_entries = STACKDEPTH, - .skip = 1 - }; + unsigned int n; - save_stack_trace(&trace); + n = stack_trace_save(entries, ARRAY_SIZE(entries), 1); /* May be called under spinlock, so avoid sleeping */ - node->stack = depot_save_stack(&trace, GFP_NOWAIT); + node->stack = stack_depot_save(entries, n, GFP_NOWAIT); } static void show_leaks(struct drm_mm *mm) { struct drm_mm_node *node; - unsigned long entries[STACKDEPTH]; + unsigned long *entries; + unsigned int nr_entries; char *buf; buf = kmalloc(BUFSZ, GFP_KERNEL); @@ -129,19 +126,14 @@ static void show_leaks(struct drm_mm *mm return; list_for_each_entry(node, drm_mm_nodes(mm), node_list) { - struct stack_trace trace = { - .entries = entries, - .max_entries = STACKDEPTH - }; - if (!node->stack) { DRM_ERROR("node [%08llx + %08llx]: unknown owner\n", node->start, node->size); continue; } - depot_fetch_stack(node->stack, &trace); - snprint_stack_trace(buf, BUFSZ, &trace, 0); + nr_entries = stack_depot_fetch(node->stack, &entries); + stack_trace_snprint(buf, BUFSZ, entries, nr_entries, 0); DRM_ERROR("node [%08llx + %08llx]: inserted at\n%s", node->start, node->size, buf); } --- a/drivers/gpu/drm/i915/i915_vma.c +++ b/drivers/gpu/drm/i915/i915_vma.c @@ -36,11 +36,8 @@ static void vma_print_allocator(struct i915_vma *vma, const char *reason) { - unsigned long entries[12]; - struct stack_trace trace = { - .entries = entries, - .max_entries = ARRAY_SIZE(entries), - }; + unsigned long *entries; + unsigned int nr_entries; char buf[512]; if (!vma->node.stack) { @@ -49,8 +46,8 @@ static void vma_print_allocator(struct i return; } - depot_fetch_stack(vma->node.stack, &trace); - snprint_stack_trace(buf, sizeof(buf), &trace, 0); + nr_entries = stack_depot_fetch(vma->node.stack, &entries); + stack_trace_snprint(buf, sizeof(buf), entries, nr_entries, 0); DRM_DEBUG_DRIVER("vma.node [%08llx + %08llx] %s: inserted at %s\n", vma->node.start, vma->node.size, reason, buf); } --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c @@ -60,27 +60,20 @@ static noinline depot_stack_handle_t __save_depot_stack(void) { unsigned long entries[STACKDEPTH]; - struct stack_trace trace = { - .entries = entries, - .max_entries = ARRAY_SIZE(entries), - .skip = 1, - }; + unsigned int n; - save_stack_trace(&trace); - return depot_save_stack(&trace, GFP_NOWAIT | __GFP_NOWARN); + n = stack_trace_save(entries, ARRAY_SIZE(entries), 1); + return stack_depot_save(entries, n, GFP_NOWAIT | __GFP_NOWARN); } static void __print_depot_stack(depot_stack_handle_t stack, char *buf, int sz, int indent) { - unsigned long entries[STACKDEPTH]; - struct stack_trace trace = { - .entries = entries, - .max_entries = ARRAY_SIZE(entries), - }; + unsigned long *entries; + unsigned int nr_entries; - depot_fetch_stack(stack, &trace); - snprint_stack_trace(buf, sz, &trace, indent); + nr_entries = stack_depot_fetch(stack, &entries); + stack_trace_snprint(buf, sz, entries, nr_entries, indent); } static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
Replace the indirection through struct stack_trace by using the storage array based interfaces. The original code in all printing functions is really wrong. It allocates a storage array on stack which is unused because depot_fetch_stack() does not store anything in it. It overwrites the entries pointer in the stack_trace struct so it points to the depot storage. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: intel-gfx@lists.freedesktop.org Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: dri-devel@lists.freedesktop.org Cc: David Airlie <airlied@linux.ie> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Daniel Vetter <daniel@ffwll.ch> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> --- drivers/gpu/drm/drm_mm.c | 22 +++++++--------------- drivers/gpu/drm/i915/i915_vma.c | 11 ++++------- drivers/gpu/drm/i915/intel_runtime_pm.c | 21 +++++++-------------- 3 files changed, 18 insertions(+), 36 deletions(-)