[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190423073625.GZ13337@phenom.ffwll.local>
Date: Tue, 23 Apr 2019 09:36:25 +0200
From: Daniel Vetter <daniel@...ll.ch>
To: Thomas Gleixner <tglx@...utronix.de>
Cc: LKML <linux-kernel@...r.kernel.org>,
Josh Poimboeuf <jpoimboe@...hat.com>, x86@...nel.org,
Andy Lutomirski <luto@...nel.org>,
Steven Rostedt <rostedt@...dmis.org>,
Alexander Potapenko <glider@...gle.com>,
intel-gfx@...ts.freedesktop.org,
Joonas Lahtinen <joonas.lahtinen@...ux.intel.com>,
Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>,
dri-devel@...ts.freedesktop.org, David Airlie <airlied@...ux.ie>,
Jani Nikula <jani.nikula@...ux.intel.com>,
Daniel Vetter <daniel@...ll.ch>,
Rodrigo Vivi <rodrigo.vivi@...el.com>,
Alexey Dobriyan <adobriyan@...il.com>,
Andrew Morton <akpm@...ux-foundation.org>,
Pekka Enberg <penberg@...nel.org>, linux-mm@...ck.org,
David Rientjes <rientjes@...gle.com>,
Christoph Lameter <cl@...ux.com>,
Catalin Marinas <catalin.marinas@....com>,
Dmitry Vyukov <dvyukov@...gle.com>,
Andrey Ryabinin <aryabinin@...tuozzo.com>,
kasan-dev@...glegroups.com,
Mike Rapoport <rppt@...ux.vnet.ibm.com>,
Akinobu Mita <akinobu.mita@...il.com>,
iommu@...ts.linux-foundation.org,
Robin Murphy <robin.murphy@....com>,
Christoph Hellwig <hch@....de>,
Marek Szyprowski <m.szyprowski@...sung.com>,
Johannes Thumshirn <jthumshirn@...e.de>,
David Sterba <dsterba@...e.com>, Chris Mason <clm@...com>,
Josef Bacik <josef@...icpanda.com>,
linux-btrfs@...r.kernel.org, dm-devel@...hat.com,
Mike Snitzer <snitzer@...hat.com>,
Alasdair Kergon <agk@...hat.com>, linux-arch@...r.kernel.org
Subject: Re: [patch V2 16/29] drm: Simplify stacktrace handling
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@...utronix.de>
> Cc: intel-gfx@...ts.freedesktop.org
> Cc: Joonas Lahtinen <joonas.lahtinen@...ux.intel.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>
> Cc: dri-devel@...ts.freedesktop.org
> Cc: David Airlie <airlied@...ux.ie>
> Cc: Jani Nikula <jani.nikula@...ux.intel.com>
> Cc: Daniel Vetter <daniel@...ll.ch>
> Cc: Rodrigo Vivi <rodrigo.vivi@...el.com>
Acked-by: Daniel Vetter <daniel.vetter@...ll.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)
>
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
Powered by blists - more mailing lists