Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: Simplify stacktrace handling

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>
Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
Acked-by: Daniel Vetter <daniel@ffwll.ch>
Cc: Andy Lutomirski <luto@kernel.org>
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: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Alexander Potapenko <glider@google.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: linux-mm@kvack.org
Cc: David Rientjes <rientjes@google.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: kasan-dev@googlegroups.com
Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
Cc: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: iommu@lists.linux-foundation.org
Cc: Robin Murphy <robin.murphy@arm.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
Cc: David Sterba <dsterba@suse.com>
Cc: Chris Mason <clm@fb.com>
Cc: Josef Bacik <josef@toxicpanda.com>
Cc: linux-btrfs@vger.kernel.org
Cc: dm-devel@redhat.com
Cc: Mike Snitzer <snitzer@redhat.com>
Cc: Alasdair Kergon <agk@redhat.com>
Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
Cc: Miroslav Benes <mbenes@suse.cz>
Cc: linux-arch@vger.kernel.org
Link: https://lkml.kernel.org/r/20190425094802.622094226@linutronix.de

+18 -36
+7 -15
drivers/gpu/drm/drm_mm.c
··· 106 106 static noinline void save_stack(struct drm_mm_node *node) 107 107 { 108 108 unsigned long entries[STACKDEPTH]; 109 - struct stack_trace trace = { 110 - .entries = entries, 111 - .max_entries = STACKDEPTH, 112 - .skip = 1 113 - }; 109 + unsigned int n; 114 110 115 - save_stack_trace(&trace); 111 + n = stack_trace_save(entries, ARRAY_SIZE(entries), 1); 116 112 117 113 /* May be called under spinlock, so avoid sleeping */ 118 - node->stack = depot_save_stack(&trace, GFP_NOWAIT); 114 + node->stack = stack_depot_save(entries, n, GFP_NOWAIT); 119 115 } 120 116 121 117 static void show_leaks(struct drm_mm *mm) 122 118 { 123 119 struct drm_mm_node *node; 124 - unsigned long entries[STACKDEPTH]; 120 + unsigned long *entries; 121 + unsigned int nr_entries; 125 122 char *buf; 126 123 127 124 buf = kmalloc(BUFSZ, GFP_KERNEL); ··· 126 129 return; 127 130 128 131 list_for_each_entry(node, drm_mm_nodes(mm), node_list) { 129 - struct stack_trace trace = { 130 - .entries = entries, 131 - .max_entries = STACKDEPTH 132 - }; 133 - 134 132 if (!node->stack) { 135 133 DRM_ERROR("node [%08llx + %08llx]: unknown owner\n", 136 134 node->start, node->size); 137 135 continue; 138 136 } 139 137 140 - depot_fetch_stack(node->stack, &trace); 141 - snprint_stack_trace(buf, BUFSZ, &trace, 0); 138 + nr_entries = stack_depot_fetch(node->stack, &entries); 139 + stack_trace_snprint(buf, BUFSZ, entries, nr_entries, 0); 142 140 DRM_ERROR("node [%08llx + %08llx]: inserted at\n%s", 143 141 node->start, node->size, buf); 144 142 }
+4 -7
drivers/gpu/drm/i915/i915_vma.c
··· 36 36 37 37 static void vma_print_allocator(struct i915_vma *vma, const char *reason) 38 38 { 39 - unsigned long entries[12]; 40 - struct stack_trace trace = { 41 - .entries = entries, 42 - .max_entries = ARRAY_SIZE(entries), 43 - }; 39 + unsigned long *entries; 40 + unsigned int nr_entries; 44 41 char buf[512]; 45 42 46 43 if (!vma->node.stack) { ··· 46 49 return; 47 50 } 48 51 49 - depot_fetch_stack(vma->node.stack, &trace); 50 - snprint_stack_trace(buf, sizeof(buf), &trace, 0); 52 + nr_entries = stack_depot_fetch(vma->node.stack, &entries); 53 + stack_trace_snprint(buf, sizeof(buf), entries, nr_entries, 0); 51 54 DRM_DEBUG_DRIVER("vma.node [%08llx + %08llx] %s: inserted at %s\n", 52 55 vma->node.start, vma->node.size, reason, buf); 53 56 }
+7 -14
drivers/gpu/drm/i915/intel_runtime_pm.c
··· 60 60 static noinline depot_stack_handle_t __save_depot_stack(void) 61 61 { 62 62 unsigned long entries[STACKDEPTH]; 63 - struct stack_trace trace = { 64 - .entries = entries, 65 - .max_entries = ARRAY_SIZE(entries), 66 - .skip = 1, 67 - }; 63 + unsigned int n; 68 64 69 - save_stack_trace(&trace); 70 - return depot_save_stack(&trace, GFP_NOWAIT | __GFP_NOWARN); 65 + n = stack_trace_save(entries, ARRAY_SIZE(entries), 1); 66 + return stack_depot_save(entries, n, GFP_NOWAIT | __GFP_NOWARN); 71 67 } 72 68 73 69 static void __print_depot_stack(depot_stack_handle_t stack, 74 70 char *buf, int sz, int indent) 75 71 { 76 - unsigned long entries[STACKDEPTH]; 77 - struct stack_trace trace = { 78 - .entries = entries, 79 - .max_entries = ARRAY_SIZE(entries), 80 - }; 72 + unsigned long *entries; 73 + unsigned int nr_entries; 81 74 82 - depot_fetch_stack(stack, &trace); 83 - snprint_stack_trace(buf, sz, &trace, indent); 75 + nr_entries = stack_depot_fetch(stack, &entries); 76 + stack_trace_snprint(buf, sz, entries, nr_entries, indent); 84 77 } 85 78 86 79 static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915)