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
This commit is contained in:
Родитель
be9c52ed84
Коммит
487f3c7fb1
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 i915_vma *vma, const char *reason)
|
|||
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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче