From: Boris Brezillon <boris.brezillon@collabora.com>
To: Alyssa Rosenzweig <alyssa@collabora.com>
Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>,
dri-devel@lists.freedesktop.org,
Steven Price <steven.price@arm.com>,
Rob Herring <robh+dt@kernel.org>,
Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>,
Robin Murphy <robin.murphy@arm.com>
Subject: Re: [PATCH v3 08/15] drm/panfrost: Use a threaded IRQ for job interrupts
Date: Fri, 25 Jun 2021 16:37:53 +0200 [thread overview]
Message-ID: <20210625163722.3d44a7c7@collabora.com> (raw)
In-Reply-To: <YNXej8u9yFOEcwdQ@maud>
On Fri, 25 Jun 2021 09:47:59 -0400
Alyssa Rosenzweig <alyssa@collabora.com> wrote:
> A-b, but could you explain the context? Thanks
The rational behind this change is the complexity added to the
interrupt handler in patch 15. That means we might spend more time in
interrupt context after that patch and block other things on the system
while we dequeue job irqs. Moving things to a thread also helps
performances when the GPU gets faster as executing jobs than the CPU at
queueing them. In that case we keep switching back-and-forth between
interrupt and non-interrupt context which has a cost.
One drawback is increased latency when receiving job events and the
thread is idle, since you need to wake up the thread in that case.
>
> On Fri, Jun 25, 2021 at 03:33:20PM +0200, Boris Brezillon wrote:
> > This should avoid switching to interrupt context when the GPU is under
> > heavy use.
> >
> > v3:
> > * Don't take the job_lock in panfrost_job_handle_irq()
> >
> > Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
> > ---
> > drivers/gpu/drm/panfrost/panfrost_job.c | 53 ++++++++++++++++++-------
> > 1 file changed, 38 insertions(+), 15 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
> > index be8f68f63974..e0c479e67304 100644
> > --- a/drivers/gpu/drm/panfrost/panfrost_job.c
> > +++ b/drivers/gpu/drm/panfrost/panfrost_job.c
> > @@ -470,19 +470,12 @@ static const struct drm_sched_backend_ops panfrost_sched_ops = {
> > .free_job = panfrost_job_free
> > };
> >
> > -static irqreturn_t panfrost_job_irq_handler(int irq, void *data)
> > +static void panfrost_job_handle_irq(struct panfrost_device *pfdev, u32 status)
> > {
> > - struct panfrost_device *pfdev = data;
> > - u32 status = job_read(pfdev, JOB_INT_STAT);
> > int j;
> >
> > dev_dbg(pfdev->dev, "jobslot irq status=%x\n", status);
> >
> > - if (!status)
> > - return IRQ_NONE;
> > -
> > - pm_runtime_mark_last_busy(pfdev->dev);
> > -
> > for (j = 0; status; j++) {
> > u32 mask = MK_JS_MASK(j);
> >
> > @@ -519,7 +512,6 @@ static irqreturn_t panfrost_job_irq_handler(int irq, void *data)
> > if (status & JOB_INT_MASK_DONE(j)) {
> > struct panfrost_job *job;
> >
> > - spin_lock(&pfdev->js->job_lock);
> > job = pfdev->jobs[j];
> > /* Only NULL if job timeout occurred */
> > if (job) {
> > @@ -531,21 +523,49 @@ static irqreturn_t panfrost_job_irq_handler(int irq, void *data)
> > dma_fence_signal_locked(job->done_fence);
> > pm_runtime_put_autosuspend(pfdev->dev);
> > }
> > - spin_unlock(&pfdev->js->job_lock);
> > }
> >
> > status &= ~mask;
> > }
> > +}
> >
> > +static irqreturn_t panfrost_job_irq_handler_thread(int irq, void *data)
> > +{
> > + struct panfrost_device *pfdev = data;
> > + u32 status = job_read(pfdev, JOB_INT_RAWSTAT);
> > +
> > + while (status) {
> > + pm_runtime_mark_last_busy(pfdev->dev);
> > +
> > + spin_lock(&pfdev->js->job_lock);
> > + panfrost_job_handle_irq(pfdev, status);
> > + spin_unlock(&pfdev->js->job_lock);
> > + status = job_read(pfdev, JOB_INT_RAWSTAT);
> > + }
> > +
> > + job_write(pfdev, JOB_INT_MASK,
> > + GENMASK(16 + NUM_JOB_SLOTS - 1, 16) |
> > + GENMASK(NUM_JOB_SLOTS - 1, 0));
> > return IRQ_HANDLED;
> > }
> >
> > +static irqreturn_t panfrost_job_irq_handler(int irq, void *data)
> > +{
> > + struct panfrost_device *pfdev = data;
> > + u32 status = job_read(pfdev, JOB_INT_STAT);
> > +
> > + if (!status)
> > + return IRQ_NONE;
> > +
> > + job_write(pfdev, JOB_INT_MASK, 0);
> > + return IRQ_WAKE_THREAD;
> > +}
> > +
> > static void panfrost_reset(struct work_struct *work)
> > {
> > struct panfrost_device *pfdev = container_of(work,
> > struct panfrost_device,
> > reset.work);
> > - unsigned long flags;
> > unsigned int i;
> > bool cookie;
> >
> > @@ -575,7 +595,7 @@ static void panfrost_reset(struct work_struct *work)
> > /* All timers have been stopped, we can safely reset the pending state. */
> > atomic_set(&pfdev->reset.pending, 0);
> >
> > - spin_lock_irqsave(&pfdev->js->job_lock, flags);
> > + spin_lock(&pfdev->js->job_lock);
> > for (i = 0; i < NUM_JOB_SLOTS; i++) {
> > if (pfdev->jobs[i]) {
> > pm_runtime_put_noidle(pfdev->dev);
> > @@ -583,7 +603,7 @@ static void panfrost_reset(struct work_struct *work)
> > pfdev->jobs[i] = NULL;
> > }
> > }
> > - spin_unlock_irqrestore(&pfdev->js->job_lock, flags);
> > + spin_unlock(&pfdev->js->job_lock);
> >
> > panfrost_device_reset(pfdev);
> >
> > @@ -610,8 +630,11 @@ int panfrost_job_init(struct panfrost_device *pfdev)
> > if (irq <= 0)
> > return -ENODEV;
> >
> > - ret = devm_request_irq(pfdev->dev, irq, panfrost_job_irq_handler,
> > - IRQF_SHARED, KBUILD_MODNAME "-job", pfdev);
> > + ret = devm_request_threaded_irq(pfdev->dev, irq,
> > + panfrost_job_irq_handler,
> > + panfrost_job_irq_handler_thread,
> > + IRQF_SHARED, KBUILD_MODNAME "-job",
> > + pfdev);
> > if (ret) {
> > dev_err(pfdev->dev, "failed to request job irq");
> > return ret;
> > --
> > 2.31.1
> >
next prev parent reply other threads:[~2021-06-25 14:37 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-25 13:33 [PATCH v3 00/15] drm/panfrost: Misc improvements Boris Brezillon
2021-06-25 13:33 ` [PATCH v3 01/15] drm/sched: Allow using a dedicated workqueue for the timeout/fault tdr Boris Brezillon
2021-06-25 15:07 ` Steven Price
2021-06-25 15:18 ` Boris Brezillon
2021-06-25 13:33 ` [PATCH v3 02/15] drm/panfrost: Make ->run_job() return an ERR_PTR() when appropriate Boris Brezillon
2021-06-25 13:45 ` Alyssa Rosenzweig
2021-06-25 13:33 ` [PATCH v3 03/15] drm/panfrost: Get rid of the unused JS_STATUS_EVENT_ACTIVE definition Boris Brezillon
2021-06-25 13:39 ` Alyssa Rosenzweig
2021-06-25 13:33 ` [PATCH v3 04/15] drm/panfrost: Drop the pfdev argument passed to panfrost_exception_name() Boris Brezillon
2021-06-25 13:45 ` Alyssa Rosenzweig
2021-06-25 13:33 ` [PATCH v3 05/15] drm/panfrost: Expose exception types to userspace Boris Brezillon
2021-06-25 13:42 ` Alyssa Rosenzweig
2021-06-25 14:21 ` Boris Brezillon
2021-06-25 15:32 ` Steven Price
2021-06-25 15:40 ` Boris Brezillon
2021-06-25 13:33 ` [PATCH v3 06/15] drm/panfrost: Do the exception -> string translation using a table Boris Brezillon
2021-06-25 13:41 ` Alyssa Rosenzweig
2021-06-25 15:35 ` Steven Price
2021-06-25 13:33 ` [PATCH v3 07/15] drm/panfrost: Expose a helper to trigger a GPU reset Boris Brezillon
2021-06-25 13:46 ` Alyssa Rosenzweig
2021-06-25 13:33 ` [PATCH v3 08/15] drm/panfrost: Use a threaded IRQ for job interrupts Boris Brezillon
2021-06-25 13:47 ` Alyssa Rosenzweig
2021-06-25 14:37 ` Boris Brezillon [this message]
2021-06-25 15:40 ` Steven Price
2021-06-25 13:33 ` [PATCH v3 09/15] drm/panfrost: Simplify the reset serialization logic Boris Brezillon
2021-06-25 15:42 ` Steven Price
2021-06-25 16:22 ` Boris Brezillon
2021-06-25 13:33 ` [PATCH v3 10/15] drm/panfrost: Make sure job interrupts are masked before resetting Boris Brezillon
2021-06-25 15:55 ` Steven Price
2021-06-25 16:02 ` Boris Brezillon
2021-06-25 16:11 ` Steven Price
2021-06-25 13:33 ` [PATCH v3 11/15] drm/panfrost: Disable the AS on unhandled page faults Boris Brezillon
2021-06-25 16:10 ` Steven Price
2021-06-25 13:33 ` [PATCH v3 12/15] drm/panfrost: Reset the GPU when the AS_ACTIVE bit is stuck Boris Brezillon
2021-06-25 13:33 ` [PATCH v3 13/15] drm/panfrost: Don't reset the GPU on job faults unless we really have to Boris Brezillon
2021-06-25 13:33 ` [PATCH v3 14/15] drm/panfrost: Kill in-flight jobs on FD close Boris Brezillon
2021-06-25 13:43 ` Lucas Stach
2021-06-25 14:46 ` Boris Brezillon
2021-06-25 13:33 ` [PATCH v3 15/15] drm/panfrost: Queue jobs on the hardware Boris Brezillon
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=20210625163722.3d44a7c7@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=alyssa.rosenzweig@collabora.com \
--cc=alyssa@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=robh+dt@kernel.org \
--cc=robin.murphy@arm.com \
--cc=steven.price@arm.com \
--cc=tomeu.vizoso@collabora.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.