From: Rodrigo Vivi <rodrigo.vivi@intel.com>
To: Matthew Auld <matthew.auld@intel.com>
Cc: intel-xe@lists.freedesktop.org
Subject: Re: [Intel-xe] [PATCH] drm/xe: add lockdep annotation for xe_device_mem_access_put()
Date: Fri, 21 Jul 2023 14:59:22 -0400 [thread overview]
Message-ID: <ZLrVihPCV44UyP5g@intel.com> (raw)
In-Reply-To: <20230721123424.473210-2-matthew.auld@intel.com>
On Fri, Jul 21, 2023 at 01:34:25PM +0100, Matthew Auld wrote:
> The main motivation is with d3cold which will make the suspend and
> resume callbacks even more scary, but is useful regardless. We already
> have the needed annotation on the acquire side with
> xe_device_mem_access_get(), and by adding the annotation on the release
> side we should have a lot more confidence that our locking hierarchy is
> correct.
good idea!
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
>
> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Anshuman Gupta <anshuman.gupta@intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
> drivers/gpu/drm/xe/xe_device.c | 2 +-
> drivers/gpu/drm/xe/xe_device.h | 4 ++++
> drivers/gpu/drm/xe/xe_pm.c | 24 ++++++++++++++++++++++++
> 3 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index 1c57944014e0..fed3015e2d96 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -36,7 +36,7 @@
> #include "xe_wait_user_fence.h"
>
> #ifdef CONFIG_LOCKDEP
> -static struct lockdep_map xe_device_mem_access_lockdep_map = {
> +struct lockdep_map xe_device_mem_access_lockdep_map = {
> .name = "xe_device_mem_access_lockdep_map"
> };
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_device.h b/drivers/gpu/drm/xe/xe_device.h
> index 8b085ffdc5f8..593accb68281 100644
> --- a/drivers/gpu/drm/xe/xe_device.h
> +++ b/drivers/gpu/drm/xe/xe_device.h
> @@ -16,6 +16,10 @@ struct xe_file;
> #include "xe_force_wake.h"
> #include "xe_macros.h"
>
> +#ifdef CONFIG_LOCKDEP
> +extern struct lockdep_map xe_device_mem_access_lockdep_map;
> +#endif
> +
> static inline struct xe_device *to_xe_device(const struct drm_device *dev)
> {
> return container_of(dev, struct xe_device, drm);
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index 17a69b7af155..d1b2aa52ea03 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -199,6 +199,29 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
> /* Disable access_ongoing asserts and prevent recursive pm calls */
> xe_pm_write_callback_task(xe, current);
>
> + /*
> + * The actual xe_device_mem_access_put() is always async underneath, so
> + * exactly where that is called should makes no difference to us. However
> + * we still need to be very careful with the locks that this callback
> + * acquires and the locks that are acquired and held by any callers of
> + * xe_device_mem_access_get(). We already have the matching annotation
> + * on that side, but we also need it here. For example lockdep should be
> + * able to tell us if the following scenario is in theory possible:
> + *
> + * CPU0 | CPU1 (kworker)
> + * lock(A) |
> + * | xe_pm_runtime_suspend()
> + * | lock(A)
> + * xe_device_mem_access_get() |
> + *
> + * This will clearly deadlock since rpm core needs to wait for
> + * xe_pm_runtime_suspend() to complete, but here we are holding lock(A)
> + * on CPU0 which prevents CPU1 making forward progress. With the
> + * annotation here and in xe_device_mem_access_get() lockdep will see
> + * the potential lock inversion and give us a nice splat.
> + */
> + lock_map_acquire(&xe_device_mem_access_lockdep_map);
> +
> if (xe->d3cold.allowed) {
> err = xe_bo_evict_all(xe);
> if (err)
> @@ -213,6 +236,7 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
>
> xe_irq_suspend(xe);
> out:
> + lock_map_release(&xe_device_mem_access_lockdep_map);
> xe_pm_write_callback_task(xe, NULL);
> return err;
> }
> --
> 2.41.0
>
next prev parent reply other threads:[~2023-07-21 18:59 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-21 12:34 [Intel-xe] [PATCH] drm/xe: add lockdep annotation for xe_device_mem_access_put() Matthew Auld
2023-07-21 12:37 ` [Intel-xe] ✓ CI.Patch_applied: success for " Patchwork
2023-07-21 12:37 ` [Intel-xe] ✓ CI.checkpatch: " Patchwork
2023-07-21 12:39 ` [Intel-xe] ✓ CI.KUnit: " Patchwork
2023-07-21 12:42 ` [Intel-xe] ✓ CI.Build: " Patchwork
2023-07-21 12:43 ` [Intel-xe] ✓ CI.Hooks: " Patchwork
2023-07-21 12:44 ` [Intel-xe] ✓ CI.checksparse: " Patchwork
2023-07-21 13:32 ` [Intel-xe] ○ CI.BAT: info " Patchwork
2023-07-21 18:59 ` Rodrigo Vivi [this message]
2023-07-24 9:30 ` [Intel-xe] [PATCH] " Matthew Auld
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZLrVihPCV44UyP5g@intel.com \
--to=rodrigo.vivi@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=matthew.auld@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.