From: Rodrigo Vivi <rodrigo.vivi@intel.com>
To: Ilia Levi <ilia.levi@intel.com>
Cc: <intel-xe@lists.freedesktop.org>, <piotr.piorkowski@intel.com>,
<koby.elbaz@intel.com>, <yaron.avizrat@intel.com>
Subject: Re: [PATCH] drm/xe: Make irq enabled flag atomic
Date: Wed, 11 Dec 2024 13:13:49 -0500 [thread overview]
Message-ID: <Z1nWXdfn_azp1KLK@intel.com> (raw)
In-Reply-To: <20241210173506.202150-1-ilia.levi@intel.com>
On Tue, Dec 10, 2024 at 07:35:06PM +0200, Ilia Levi wrote:
> The irq.enabled flag was protected by a spin lock (irq.lock).
> By making it atomic we no longer need to wait for the spin lock in
> irq handlers. This will become especially useful for MSI-X irq
> handlers to prevent lock contention between different interrupts.
>
> Signed-off-by: Ilia Levi <ilia.levi@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
pushing soon to drm-xe-next. Thanks for the patch
> ---
> drivers/gpu/drm/xe/display/ext/i915_irq.c | 13 +---------
> drivers/gpu/drm/xe/xe_device_types.h | 2 +-
> drivers/gpu/drm/xe/xe_irq.c | 29 ++++++-----------------
> 3 files changed, 9 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/ext/i915_irq.c b/drivers/gpu/drm/xe/display/ext/i915_irq.c
> index a7dbc6554d69..ac4cda2d81c7 100644
> --- a/drivers/gpu/drm/xe/display/ext/i915_irq.c
> +++ b/drivers/gpu/drm/xe/display/ext/i915_irq.c
> @@ -53,18 +53,7 @@ void gen2_irq_init(struct intel_uncore *uncore, struct i915_irq_regs regs,
>
> bool intel_irqs_enabled(struct xe_device *xe)
> {
> - /*
> - * XXX: i915 has a racy handling of the irq.enabled, since it doesn't
> - * lock its transitions. Because of that, the irq.enabled sometimes
> - * is not read with the irq.lock in place.
> - * However, the most critical cases like vblank and page flips are
> - * properly using the locks.
> - * We cannot take the lock in here or run any kind of assert because
> - * of i915 inconsistency.
> - * But at this point the xe irq is better protected against races,
> - * although the full solution would be protecting the i915 side.
> - */
> - return xe->irq.enabled;
> + return atomic_read(&xe->irq.enabled);
> }
>
> void intel_synchronize_irq(struct xe_device *xe)
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> index 1373a222f5a5..ace22e35e769 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -347,7 +347,7 @@ struct xe_device {
> spinlock_t lock;
>
> /** @irq.enabled: interrupts enabled on this device */
> - bool enabled;
> + atomic_t enabled;
> } irq;
>
> /** @ttm: ttm device */
> diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
> index 7bf7201529ac..1c509e66694d 100644
> --- a/drivers/gpu/drm/xe/xe_irq.c
> +++ b/drivers/gpu/drm/xe/xe_irq.c
> @@ -348,12 +348,8 @@ static irqreturn_t xelp_irq_handler(int irq, void *arg)
> unsigned long intr_dw[2];
> u32 identity[32];
>
> - spin_lock(&xe->irq.lock);
> - if (!xe->irq.enabled) {
> - spin_unlock(&xe->irq.lock);
> + if (!atomic_read(&xe->irq.enabled))
> return IRQ_NONE;
> - }
> - spin_unlock(&xe->irq.lock);
>
> master_ctl = xelp_intr_disable(xe);
> if (!master_ctl) {
> @@ -417,12 +413,8 @@ static irqreturn_t dg1_irq_handler(int irq, void *arg)
>
> /* TODO: This really shouldn't be copied+pasted */
>
> - spin_lock(&xe->irq.lock);
> - if (!xe->irq.enabled) {
> - spin_unlock(&xe->irq.lock);
> + if (!atomic_read(&xe->irq.enabled))
> return IRQ_NONE;
> - }
> - spin_unlock(&xe->irq.lock);
>
> master_tile_ctl = dg1_intr_disable(xe);
> if (!master_tile_ctl) {
> @@ -644,12 +636,8 @@ static irqreturn_t vf_mem_irq_handler(int irq, void *arg)
> struct xe_tile *tile;
> unsigned int id;
>
> - spin_lock(&xe->irq.lock);
> - if (!xe->irq.enabled) {
> - spin_unlock(&xe->irq.lock);
> + if (!atomic_read(&xe->irq.enabled))
> return IRQ_NONE;
> - }
> - spin_unlock(&xe->irq.lock);
>
> for_each_tile(tile, xe, id)
> xe_memirq_handler(&tile->memirq);
> @@ -674,10 +662,9 @@ static void irq_uninstall(void *arg)
> struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> int irq;
>
> - if (!xe->irq.enabled)
> + if (!atomic_xchg(&xe->irq.enabled, 0))
> return;
>
> - xe->irq.enabled = false;
> xe_irq_reset(xe);
>
> irq = pci_irq_vector(pdev, 0);
> @@ -724,7 +711,7 @@ int xe_irq_install(struct xe_device *xe)
> return err;
> }
>
> - xe->irq.enabled = true;
> + atomic_set(&xe->irq.enabled, 1);
>
> xe_irq_postinstall(xe);
>
> @@ -744,9 +731,7 @@ void xe_irq_suspend(struct xe_device *xe)
> {
> int irq = to_pci_dev(xe->drm.dev)->irq;
>
> - spin_lock_irq(&xe->irq.lock);
> - xe->irq.enabled = false; /* no new irqs */
> - spin_unlock_irq(&xe->irq.lock);
> + atomic_set(&xe->irq.enabled, 0); /* no new irqs */
>
> synchronize_irq(irq); /* flush irqs */
> xe_irq_reset(xe); /* turn irqs off */
> @@ -762,7 +747,7 @@ void xe_irq_resume(struct xe_device *xe)
> * 1. no irq will arrive before the postinstall
> * 2. display is not yet resumed
> */
> - xe->irq.enabled = true;
> + atomic_set(&xe->irq.enabled, 1);
> xe_irq_reset(xe);
> xe_irq_postinstall(xe); /* turn irqs on */
>
> --
> 2.43.2
>
next prev parent reply other threads:[~2024-12-11 18:14 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-10 17:35 [PATCH] drm/xe: Make irq enabled flag atomic Ilia Levi
2024-12-10 21:28 ` ✓ CI.Patch_applied: success for " Patchwork
2024-12-10 21:29 ` ✓ CI.checkpatch: " Patchwork
2024-12-10 21:30 ` ✓ CI.KUnit: " Patchwork
2024-12-10 21:48 ` ✓ CI.Build: " Patchwork
2024-12-10 21:50 ` ✓ CI.Hooks: " Patchwork
2024-12-10 21:52 ` ✓ CI.checksparse: " Patchwork
2024-12-10 22:28 ` ✓ Xe.CI.BAT: " Patchwork
2024-12-11 1:04 ` ✗ Xe.CI.Full: failure " Patchwork
2024-12-11 18:13 ` Rodrigo Vivi [this message]
2024-12-11 19:58 ` [PATCH] " Lucas De Marchi
2024-12-11 23:29 ` Rodrigo Vivi
2024-12-12 12:45 ` Levi, Ilia
2024-12-12 14:36 ` Lucas De Marchi
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=Z1nWXdfn_azp1KLK@intel.com \
--to=rodrigo.vivi@intel.com \
--cc=ilia.levi@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=koby.elbaz@intel.com \
--cc=piotr.piorkowski@intel.com \
--cc=yaron.avizrat@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.