lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <84a4a4c8-0a9f-9b3a-d413-e0bd2ace3f42@linux.intel.com> Date: Fri, 6 Jan 2023 15:15:20 +0100 From: "Das, Nirmoy" <nirmoy.das@...ux.intel.com> To: Andrzej Hajda <andrzej.hajda@...el.com>, linux-kernel@...r.kernel.org, intel-gfx@...ts.freedesktop.org, dri-devel@...ts.freedesktop.org, netdev <netdev@...r.kernel.org> Cc: Lucas De Marchi <lucas.demarchi@...el.com>, Chris Wilson <chris.p.wilson@...el.com>, Eric Dumazet <edumazet@...gle.com>, Jakub Kicinski <kuba@...nel.org>, Dmitry Vyukov <dvyukov@...gle.com> Subject: Re: [Intel-gfx] [PATCH v3 11/11] drm/i915: replace Intel internal tracker with kernel core ref_tracker Hi Andrzej, On 2/22/2022 12:25 AM, Andrzej Hajda wrote: > Beside reusing existing code, the main advantage of ref_tracker is > tracking per instance of wakeref. It allows also to catch double > put. > On the other side we lose information about the first acquire and > the last release, but the advantages outweigh it. > > Signed-off-by: Andrzej Hajda <andrzej.hajda@...el.com> > Reviewed-by: Chris Wilson <chris.p.wilson@...el.com> > --- > drivers/gpu/drm/i915/Kconfig.debug | 11 +- > drivers/gpu/drm/i915/Makefile | 3 - > .../drm/i915/display/intel_display_power.c | 2 +- > drivers/gpu/drm/i915/gt/intel_engine_pm.c | 2 +- > drivers/gpu/drm/i915/gt/intel_gt_pm.c | 2 +- > drivers/gpu/drm/i915/intel_runtime_pm.c | 25 +- > drivers/gpu/drm/i915/intel_runtime_pm.h | 2 +- > drivers/gpu/drm/i915/intel_wakeref.c | 8 +- > drivers/gpu/drm/i915/intel_wakeref.h | 72 +++++- > drivers/gpu/drm/i915/intel_wakeref_tracker.c | 234 ------------------ > drivers/gpu/drm/i915/intel_wakeref_tracker.h | 76 ------ > 11 files changed, 87 insertions(+), 350 deletions(-) > delete mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.c > delete mode 100644 drivers/gpu/drm/i915/intel_wakeref_tracker.h > > diff --git a/drivers/gpu/drm/i915/Kconfig.debug b/drivers/gpu/drm/i915/Kconfig.debug > index 3bdc73f30a9e1..6c57f3e265f20 100644 > --- a/drivers/gpu/drm/i915/Kconfig.debug > +++ b/drivers/gpu/drm/i915/Kconfig.debug > @@ -32,6 +32,7 @@ config DRM_I915_DEBUG > select DEBUG_FS > select PREEMPT_COUNT > select I2C_CHARDEV > + select REF_TRACKER > select STACKDEPOT > select STACKTRACE > select DRM_DP_AUX_CHARDEV > @@ -46,7 +47,6 @@ config DRM_I915_DEBUG > select DRM_I915_DEBUG_GEM > select DRM_I915_DEBUG_GEM_ONCE > select DRM_I915_DEBUG_MMIO > - select DRM_I915_TRACK_WAKEREF > select DRM_I915_DEBUG_RUNTIME_PM > select DRM_I915_DEBUG_WAKEREF > select DRM_I915_SW_FENCE_DEBUG_OBJECTS > @@ -238,18 +238,13 @@ config DRM_I915_DEBUG_VBLANK_EVADE > > If in doubt, say "N". > > -config DRM_I915_TRACK_WAKEREF > - depends on STACKDEPOT > - depends on STACKTRACE > - bool > - > config DRM_I915_DEBUG_RUNTIME_PM > bool "Enable extra state checking for runtime PM" > depends on DRM_I915 > default n > + select REF_TRACKER > select STACKDEPOT > select STACKTRACE > - select DRM_I915_TRACK_WAKEREF > help > Choose this option to turn on extra state checking for the > runtime PM functionality. This may introduce overhead during > @@ -263,9 +258,9 @@ config DRM_I915_DEBUG_WAKEREF > bool "Enable extra tracking for wakerefs" > depends on DRM_I915 > default n > + select REF_TRACKER > select STACKDEPOT > select STACKTRACE > - select DRM_I915_TRACK_WAKEREF > help > Choose this option to turn on extra state checking and usage > tracking for the wakerefPM functionality. This may introduce > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index 88a403d3294cb..1f8d71430e2e6 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -76,9 +76,6 @@ i915-$(CONFIG_DEBUG_FS) += \ > display/intel_display_debugfs.o \ > display/intel_pipe_crc.o > > -i915-$(CONFIG_DRM_I915_TRACK_WAKEREF) += \ > - intel_wakeref_tracker.o > - > i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o > > # "Graphics Technology" (aka we talk to the gpu) > diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c > index 9ebae7ac32356..0e1bf724f89b5 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_power.c > +++ b/drivers/gpu/drm/i915/display/intel_display_power.c > @@ -2107,7 +2107,7 @@ print_async_put_domains_state(struct i915_power_domains *power_domains) > struct drm_i915_private, > power_domains); > > - drm_dbg(&i915->drm, "async_put_wakeref %u\n", > + drm_dbg(&i915->drm, "async_put_wakeref %lu\n", > power_domains->async_put_wakeref); > > print_power_domains(power_domains, "async_put_domains[0]", > diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c b/drivers/gpu/drm/i915/gt/intel_engine_pm.c > index 52e46e7830ff5..cf8cc348942cb 100644 > --- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c > +++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c > @@ -273,7 +273,7 @@ void intel_engine_init__pm(struct intel_engine_cs *engine) > { > struct intel_runtime_pm *rpm = engine->uncore->rpm; > > - intel_wakeref_init(&engine->wakeref, rpm, &wf_ops); > + intel_wakeref_init(&engine->wakeref, rpm, &wf_ops, engine->name); > intel_engine_init_heartbeat(engine); > } > > diff --git a/drivers/gpu/drm/i915/gt/intel_gt_pm.c b/drivers/gpu/drm/i915/gt/intel_gt_pm.c > index 7ee65a93f926f..01a055d0d0989 100644 > --- a/drivers/gpu/drm/i915/gt/intel_gt_pm.c > +++ b/drivers/gpu/drm/i915/gt/intel_gt_pm.c > @@ -129,7 +129,7 @@ static const struct intel_wakeref_ops wf_ops = { > > void intel_gt_pm_init_early(struct intel_gt *gt) > { > - intel_wakeref_init(>->wakeref, gt->uncore->rpm, &wf_ops); > + intel_wakeref_init(>->wakeref, gt->uncore->rpm, &wf_ops, "GT"); > seqcount_mutex_init(>->stats.lock, >->wakeref.mutex); > } > > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c > index 7bd10efa56bf3..18e4b2f169e75 100644 > --- a/drivers/gpu/drm/i915/intel_runtime_pm.c > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c > @@ -54,35 +54,35 @@ > > static void init_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm) > { > - intel_wakeref_tracker_init(&rpm->debug); > + ref_tracker_dir_init(&rpm->debug, INTEL_REFTRACK_DEAD_COUNT, dev_name(rpm->kdev)); > } > > static intel_wakeref_t > track_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm) > { > - if (!rpm->available) > + if (!rpm->available || rpm->no_wakeref_tracking) > return -1; > > - return intel_wakeref_tracker_add(&rpm->debug); > + return intel_ref_tracker_alloc(&rpm->debug); > } > > static void untrack_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm, > intel_wakeref_t wakeref) > { > - intel_wakeref_tracker_remove(&rpm->debug, wakeref); > + if (!rpm->available || rpm->no_wakeref_tracking) > + return; > + > + intel_ref_tracker_free(&rpm->debug, wakeref); > } > > static void untrack_all_intel_runtime_pm_wakerefs(struct intel_runtime_pm *rpm) > { > - struct drm_printer p = drm_debug_printer("i915"); > - > - intel_wakeref_tracker_reset(&rpm->debug, &p); > + ref_tracker_dir_exit(&rpm->debug); > } > > static noinline void > __intel_wakeref_dec_and_check_tracking(struct intel_runtime_pm *rpm) > { > - struct intel_wakeref_tracker saved; > unsigned long flags; > > if (!atomic_dec_and_lock_irqsave(&rpm->wakeref_count, > @@ -90,15 +90,8 @@ __intel_wakeref_dec_and_check_tracking(struct intel_runtime_pm *rpm) > flags)) > return; > > - saved = __intel_wakeref_tracker_reset(&rpm->debug); > + __ref_tracker_dir_print(&rpm->debug, INTEL_REFTRACK_PRINT_LIMIT); > spin_unlock_irqrestore(&rpm->debug.lock, flags); > - > - if (saved.count) { > - struct drm_printer p = drm_debug_printer("i915"); > - > - __intel_wakeref_tracker_show(&saved, &p); > - intel_wakeref_tracker_fini(&saved); > - } > } > > void print_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm, > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.h b/drivers/gpu/drm/i915/intel_runtime_pm.h > index 0871fa2176474..db5692f1eb67e 100644 > --- a/drivers/gpu/drm/i915/intel_runtime_pm.h > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.h > @@ -61,7 +61,7 @@ struct intel_runtime_pm { > * paired rpm_put) we can remove corresponding pairs of and keep > * the array trimmed to active wakerefs. > */ > - struct intel_wakeref_tracker debug; > + struct ref_tracker_dir debug; > #endif > }; > > diff --git a/drivers/gpu/drm/i915/intel_wakeref.c b/drivers/gpu/drm/i915/intel_wakeref.c > index db4887e33ea60..97fe9a0f0adbd 100644 > --- a/drivers/gpu/drm/i915/intel_wakeref.c > +++ b/drivers/gpu/drm/i915/intel_wakeref.c > @@ -62,6 +62,9 @@ static void ____intel_wakeref_put_last(struct intel_wakeref *wf) > if (likely(!wf->ops->put(wf))) { > rpm_put(wf); > wake_up_var(&wf->wakeref); > +#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_WAKEREF) > + ref_tracker_dir_exit(&wf->debug); > +#endif This seems is bit too early, we only need this at the end as you have done with untrack_all_intel_runtime_pm_wakerefs() otherwise the WARN_ON_ONE(dir->debug) from " ref_tracker: implement use-after-free detection" will get triggered. Regards, Nirmoy > > } > > unlock: > @@ -96,7 +99,8 @@ static void __intel_wakeref_put_work(struct work_struct *wrk) > void __intel_wakeref_init(struct intel_wakeref *wf, > struct intel_runtime_pm *rpm, > const struct intel_wakeref_ops *ops, > - struct intel_wakeref_lockclass *key) > + struct intel_wakeref_lockclass *key, > + const char *name) > { > wf->rpm = rpm; > wf->ops = ops; > @@ -110,7 +114,7 @@ void __intel_wakeref_init(struct intel_wakeref *wf, > "wakeref.work", &key->work, 0); > > #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_WAKEREF) > - intel_wakeref_tracker_init(&wf->debug); > + ref_tracker_dir_init(&wf->debug, INTEL_REFTRACK_DEAD_COUNT, name); > #endif > } > > diff --git a/drivers/gpu/drm/i915/intel_wakeref.h b/drivers/gpu/drm/i915/intel_wakeref.h > index 38439deefc5cc..e0cd78fb60761 100644 > --- a/drivers/gpu/drm/i915/intel_wakeref.h > +++ b/drivers/gpu/drm/i915/intel_wakeref.h > @@ -7,17 +7,24 @@ > #ifndef INTEL_WAKEREF_H > #define INTEL_WAKEREF_H > > +#include <drm/drm_print.h> > + > #include <linux/atomic.h> > #include <linux/bitfield.h> > #include <linux/bits.h> > #include <linux/lockdep.h> > #include <linux/mutex.h> > #include <linux/refcount.h> > +#include <linux/ref_tracker.h> > +#include <linux/slab.h> > #include <linux/stackdepot.h> > #include <linux/timer.h> > #include <linux/workqueue.h> > > -#include "intel_wakeref_tracker.h" > +typedef unsigned long intel_wakeref_t; > + > +#define INTEL_REFTRACK_DEAD_COUNT 16 > +#define INTEL_REFTRACK_PRINT_LIMIT 16 > > #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_WAKEREF) > #define INTEL_WAKEREF_BUG_ON(expr) BUG_ON(expr) > @@ -45,7 +52,7 @@ struct intel_wakeref { > struct delayed_work work; > > #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_WAKEREF) > - struct intel_wakeref_tracker debug; > + struct ref_tracker_dir debug; > #endif > }; > > @@ -57,11 +64,12 @@ struct intel_wakeref_lockclass { > void __intel_wakeref_init(struct intel_wakeref *wf, > struct intel_runtime_pm *rpm, > const struct intel_wakeref_ops *ops, > - struct intel_wakeref_lockclass *key); > -#define intel_wakeref_init(wf, rpm, ops) do { \ > + struct intel_wakeref_lockclass *key, > + const char *name); > +#define intel_wakeref_init(wf, rpm, ops, name) do { \ > static struct intel_wakeref_lockclass __key; \ > \ > - __intel_wakeref_init((wf), (rpm), (ops), &__key); \ > + __intel_wakeref_init((wf), (rpm), (ops), &__key, name); \ > } while (0) > > int __intel_wakeref_get_first(struct intel_wakeref *wf); > @@ -266,17 +274,67 @@ __intel_wakeref_defer_park(struct intel_wakeref *wf) > */ > int intel_wakeref_wait_for_idle(struct intel_wakeref *wf); > > +#define INTEL_WAKEREF_DEF ((intel_wakeref_t)(-1)) > + > +static inline intel_wakeref_t intel_ref_tracker_alloc(struct ref_tracker_dir *dir) > +{ > + struct ref_tracker *user = NULL; > + > + ref_tracker_alloc(dir, &user, GFP_NOWAIT); > + > + return (intel_wakeref_t)user ?: INTEL_WAKEREF_DEF; > +} > + > +static inline void intel_ref_tracker_free(struct ref_tracker_dir *dir, > + intel_wakeref_t handle) > +{ > + struct ref_tracker *user; > + > + user = (handle == INTEL_WAKEREF_DEF) ? NULL : (void *)handle; > + > + ref_tracker_free(dir, &user); > +} > + > +static inline void > +intel_wakeref_tracker_show(struct ref_tracker_dir *dir, > + struct drm_printer *p) > +{ > + const size_t buf_size = PAGE_SIZE; > + char *buf, *sb, *se; > + size_t count; > + > + buf = kmalloc(buf_size, GFP_NOWAIT); > + if (!buf) > + return; > + > + count = ref_tracker_dir_snprint(dir, buf, buf_size); > + if (!count) > + goto free; > + /* printk does not like big buffers, so we split it */ > + for (sb = buf; *sb; sb = se + 1) { > + se = strchrnul(sb, '\n'); > + drm_printf(p, "%.*s", (int)(se - sb + 1), sb); > + if (!*se) > + break; > + } > + if (count >= buf_size) > + drm_printf(p, "\n...dropped %zd extra bytes of leak report.\n", > + count + 1 - buf_size); > +free: > + kfree(buf); > +} > + > #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_WAKEREF) > > static inline intel_wakeref_t intel_wakeref_track(struct intel_wakeref *wf) > { > - return intel_wakeref_tracker_add(&wf->debug); > + return intel_ref_tracker_alloc(&wf->debug); > } > > static inline void intel_wakeref_untrack(struct intel_wakeref *wf, > intel_wakeref_t handle) > { > - intel_wakeref_tracker_remove(&wf->debug, handle); > + intel_ref_tracker_free(&wf->debug, handle); > } > > static inline void intel_wakeref_show(struct intel_wakeref *wf, > diff --git a/drivers/gpu/drm/i915/intel_wakeref_tracker.c b/drivers/gpu/drm/i915/intel_wakeref_tracker.c > deleted file mode 100644 > index a0bcef13a1085..0000000000000 > --- a/drivers/gpu/drm/i915/intel_wakeref_tracker.c > +++ /dev/null > @@ -1,234 +0,0 @@ > -// SPDX-License-Identifier: MIT > -/* > - * Copyright © 2021 Intel Corporation > - */ > - > -#include <linux/slab.h> > -#include <linux/stackdepot.h> > -#include <linux/stacktrace.h> > -#include <linux/sort.h> > - > -#include <drm/drm_print.h> > - > -#include "intel_wakeref.h" > - > -#define STACKDEPTH 8 > - > -static noinline depot_stack_handle_t __save_depot_stack(void) > -{ > - unsigned long entries[STACKDEPTH]; > - unsigned int n; > - > - 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; > - unsigned int nr_entries; > - > - nr_entries = stack_depot_fetch(stack, &entries); > - stack_trace_snprint(buf, sz, entries, nr_entries, indent); > -} > - > -static int cmphandle(const void *_a, const void *_b) > -{ > - const depot_stack_handle_t * const a = _a, * const b = _b; > - > - if (*a < *b) > - return -1; > - else if (*a > *b) > - return 1; > - else > - return 0; > -} > - > -void > -__intel_wakeref_tracker_show(const struct intel_wakeref_tracker *w, > - struct drm_printer *p) > -{ > - unsigned long i; > - char *buf; > - > - buf = kmalloc(PAGE_SIZE, GFP_NOWAIT | __GFP_NOWARN); > - if (!buf) > - return; > - > - if (w->last_acquire) { > - __print_depot_stack(w->last_acquire, buf, PAGE_SIZE, 2); > - drm_printf(p, "Wakeref last acquired:\n%s", buf); > - } > - > - if (w->last_release) { > - __print_depot_stack(w->last_release, buf, PAGE_SIZE, 2); > - drm_printf(p, "Wakeref last released:\n%s", buf); > - } > - > - drm_printf(p, "Wakeref count: %lu\n", w->count); > - > - sort(w->owners, w->count, sizeof(*w->owners), cmphandle, NULL); > - > - for (i = 0; i < w->count; i++) { > - depot_stack_handle_t stack = w->owners[i]; > - unsigned long rep; > - > - rep = 1; > - while (i + 1 < w->count && w->owners[i + 1] == stack) > - rep++, i++; > - __print_depot_stack(stack, buf, PAGE_SIZE, 2); > - drm_printf(p, "Wakeref x%lu taken at:\n%s", rep, buf); > - } > - > - kfree(buf); > -} > - > -void intel_wakeref_tracker_show(struct intel_wakeref_tracker *w, > - struct drm_printer *p) > -{ > - struct intel_wakeref_tracker tmp = {}; > - > - do { > - unsigned long alloc = tmp.count; > - depot_stack_handle_t *s; > - > - spin_lock_irq(&w->lock); > - tmp.count = w->count; > - if (tmp.count <= alloc) > - memcpy(tmp.owners, w->owners, tmp.count * sizeof(*s)); > - tmp.last_acquire = w->last_acquire; > - tmp.last_release = w->last_release; > - spin_unlock_irq(&w->lock); > - if (tmp.count <= alloc) > - break; > - > - s = krealloc(tmp.owners, > - tmp.count * sizeof(*s), > - GFP_NOWAIT | __GFP_NOWARN); > - if (!s) > - goto out; > - > - tmp.owners = s; > - } while (1); > - > - __intel_wakeref_tracker_show(&tmp, p); > - > -out: > - intel_wakeref_tracker_fini(&tmp); > -} > - > -intel_wakeref_t intel_wakeref_tracker_add(struct intel_wakeref_tracker *w) > -{ > - depot_stack_handle_t stack, *stacks; > - unsigned long flags; > - > - stack = __save_depot_stack(); > - if (!stack) > - return -1; > - > - spin_lock_irqsave(&w->lock, flags); > - > - if (!w->count) > - w->last_acquire = stack; > - > - stacks = krealloc(w->owners, > - (w->count + 1) * sizeof(*stacks), > - GFP_NOWAIT | __GFP_NOWARN); > - if (stacks) { > - stacks[w->count++] = stack; > - w->owners = stacks; > - } else { > - stack = -1; > - } > - > - spin_unlock_irqrestore(&w->lock, flags); > - > - return stack; > -} > - > -void intel_wakeref_tracker_remove(struct intel_wakeref_tracker *w, > - intel_wakeref_t stack) > -{ > - unsigned long flags, n; > - bool found = false; > - > - if (unlikely(stack == -1)) > - return; > - > - spin_lock_irqsave(&w->lock, flags); > - for (n = w->count; n--; ) { > - if (w->owners[n] == stack) { > - memmove(w->owners + n, > - w->owners + n + 1, > - (--w->count - n) * sizeof(stack)); > - found = true; > - break; > - } > - } > - spin_unlock_irqrestore(&w->lock, flags); > - > - if (WARN(!found, > - "Unmatched wakeref %x, tracking %lu\n", > - stack, w->count)) { > - char *buf; > - > - buf = kmalloc(PAGE_SIZE, GFP_NOWAIT | __GFP_NOWARN); > - if (!buf) > - return; > - > - __print_depot_stack(stack, buf, PAGE_SIZE, 2); > - pr_err("wakeref %x from\n%s", stack, buf); > - > - stack = READ_ONCE(w->last_release); > - if (stack && !w->count) { > - __print_depot_stack(stack, buf, PAGE_SIZE, 2); > - pr_err("wakeref last released at\n%s", buf); > - } > - > - kfree(buf); > - } > -} > - > -struct intel_wakeref_tracker > -__intel_wakeref_tracker_reset(struct intel_wakeref_tracker *w) > -{ > - struct intel_wakeref_tracker saved; > - > - lockdep_assert_held(&w->lock); > - > - saved = *w; > - > - w->owners = NULL; > - w->count = 0; > - w->last_release = __save_depot_stack(); > - > - return saved; > -} > - > -void intel_wakeref_tracker_reset(struct intel_wakeref_tracker *w, > - struct drm_printer *p) > -{ > - struct intel_wakeref_tracker tmp; > - > - spin_lock_irq(&w->lock); > - tmp = __intel_wakeref_tracker_reset(w); > - spin_unlock_irq(&w->lock); > - > - if (tmp.count) > - __intel_wakeref_tracker_show(&tmp, p); > - > - intel_wakeref_tracker_fini(&tmp); > -} > - > -void intel_wakeref_tracker_init(struct intel_wakeref_tracker *w) > -{ > - memset(w, 0, sizeof(*w)); > - spin_lock_init(&w->lock); > - stack_depot_init(); > -} > - > -void intel_wakeref_tracker_fini(struct intel_wakeref_tracker *w) > -{ > - kfree(w->owners); > -} > diff --git a/drivers/gpu/drm/i915/intel_wakeref_tracker.h b/drivers/gpu/drm/i915/intel_wakeref_tracker.h > deleted file mode 100644 > index 61df68e28c0fb..0000000000000 > --- a/drivers/gpu/drm/i915/intel_wakeref_tracker.h > +++ /dev/null > @@ -1,76 +0,0 @@ > -/* SPDX-License-Identifier: MIT */ > -/* > - * Copyright © 2019 Intel Corporation > - */ > - > -#ifndef INTEL_WAKEREF_TRACKER_H > -#define INTEL_WAKEREF_TRACKER_H > - > -#include <linux/kconfig.h> > -#include <linux/spinlock.h> > -#include <linux/stackdepot.h> > - > -typedef depot_stack_handle_t intel_wakeref_t; > - > -struct drm_printer; > - > -struct intel_wakeref_tracker { > - spinlock_t lock; > - > - depot_stack_handle_t last_acquire; > - depot_stack_handle_t last_release; > - > - depot_stack_handle_t *owners; > - unsigned long count; > -}; > - > -#if IS_ENABLED(CONFIG_DRM_I915_TRACK_WAKEREF) > - > -void intel_wakeref_tracker_init(struct intel_wakeref_tracker *w); > -void intel_wakeref_tracker_fini(struct intel_wakeref_tracker *w); > - > -intel_wakeref_t intel_wakeref_tracker_add(struct intel_wakeref_tracker *w); > -void intel_wakeref_tracker_remove(struct intel_wakeref_tracker *w, > - intel_wakeref_t handle); > - > -struct intel_wakeref_tracker > -__intel_wakeref_tracker_reset(struct intel_wakeref_tracker *w); > -void intel_wakeref_tracker_reset(struct intel_wakeref_tracker *w, > - struct drm_printer *p); > - > -void __intel_wakeref_tracker_show(const struct intel_wakeref_tracker *w, > - struct drm_printer *p); > -void intel_wakeref_tracker_show(struct intel_wakeref_tracker *w, > - struct drm_printer *p); > - > -#else > - > -static inline void intel_wakeref_tracker_init(struct intel_wakeref_tracker *w) {} > -static inline void intel_wakeref_tracker_fini(struct intel_wakeref_tracker *w) {} > - > -static inline intel_wakeref_t > -intel_wakeref_tracker_add(struct intel_wakeref_tracker *w) > -{ > - return -1; > -} > - > -static inline void > -intel_wakeref_untrack_remove(struct intel_wakeref_tracker *w, intel_wakeref_t handle) {} > - > -static inline struct intel_wakeref_tracker > -__intel_wakeref_tracker_reset(struct intel_wakeref_tracker *w) > -{ > - return (struct intel_wakeref_tracker){}; > -} > - > -static inline void intel_wakeref_tracker_reset(struct intel_wakeref_tracker *w, > - struct drm_printer *p) > -{ > -} > - > -static inline void __intel_wakeref_tracker_show(const struct intel_wakeref_tracker *w, struct drm_printer *p) {} > -static inline void intel_wakeref_tracker_show(struct intel_wakeref_tracker *w, struct drm_printer *p) {} > - > -#endif > - > -#endif /* INTEL_WAKEREF_TRACKER_H */
Powered by blists - more mailing lists