From: Matthew Brost <matthew.brost@intel.com>
To: Francois Dugast <francois.dugast@intel.com>
Cc: <intel-xe@lists.freedesktop.org>, <thomas.hellstrom@linux.intel.com>
Subject: Re: [RFC v1 6/9] drm/xe/hw_engine_group: Ensure safe transition between execution modes
Date: Wed, 17 Jul 2024 22:54:30 +0000 [thread overview]
Message-ID: <ZphLpjXwjWddLTz0@DUT025-TGLU.fm.intel.com> (raw)
In-Reply-To: <20240717130821.1073379-7-francois.dugast@intel.com>
On Wed, Jul 17, 2024 at 03:07:27PM +0200, Francois Dugast wrote:
> Provide a way to safely transition execution modes of the hw engine
> group ahead of the actual execution. When necessary, either wait for
> running jobs to complete or preempt them, thus ensuring mutual
> exclusion between modes EXEC_MODE_LR and EXEC_MODE_DMA_FENCE.
>
> Unlike a mutex, the rw_semaphore used in this context allows multiple
> submissions in the same mode.
>
> Signed-off-by: Francois Dugast <francois.dugast@intel.com>
> ---
> drivers/gpu/drm/xe/xe_hw_engine.c | 67 +++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_hw_engine.h | 3 ++
> 2 files changed, 70 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
> index dc75dfe6187a..4f539711357a 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> @@ -1278,3 +1278,70 @@ static int xe_hw_engine_group_wait_for_dma_fence_jobs(struct xe_hw_engine_group
>
> return 0;
> }
> +
> +static int switch_mode(struct xe_hw_engine_group *group,
> + enum xe_hw_engine_group_execution_mode new_mode)
> +{
> + int err = 0;
> +
> + lockdep_assert_held(&group->mode_sem);
lockdep_assert_held_write
> +
> + if (group->cur_mode == new_mode)
> + return 0;
This is redunant as the caller checks this.
> + else if (group->cur_mode == EXEC_MODE_LR && new_mode == EXEC_MODE_DMA_FENCE)
> + err = xe_hw_engine_group_suspend_lr_jobs(group);
> + else if (group->cur_mode == EXEC_MODE_DMA_FENCE && new_mode == EXEC_MODE_LR)
> + err = xe_hw_engine_group_wait_for_dma_fence_jobs(group);
These functions lockdep annotation should be lockdep_assert_held_write too.
> + else
> + err = -EINVAL;
> +
> + if (err)
> + return err;
> +
> + group->cur_mode = new_mode;
> +
> + return 0;
> +}
> +
> +/**
> + * xe_hw_engine_group_get_mode() - Get the group to execute in the new mode
> + * @group: The hw engine group
> + * @mode: The new execution mode
> + *
> + * Return: 0 if successful, -EINTR if locking failed.
> + */
> +int xe_hw_engine_group_get_mode(struct xe_hw_engine_group *group,
> + enum xe_hw_engine_group_execution_mode mode)
I think you need this annotaion. Unsure if the lock being interruptible
though if this is needed. I'd double check on that.
__acquires(&group->mode_sem);
> +{
> + int err = down_read_interruptible(&group->mode_sem);
> +
> + if (err)
> + return err;
> +
> + if (mode != group->cur_mode) {
> + up_read(&group->mode_sem);
> + err = down_write_killable(&group->mode_sem);
> + if (err)
> + return err;
> +
> + if (mode != group->cur_mode) {
> + err = switch_mode(group, mode);
> + if (err) {
> + up_write(&group->mode_sem);
> + return err;
> + }
> + }
> + downgrade_write(&group->mode_sem);
> + }
> +
> + return err;
> +}
> +
> +/**
> + * xe_hw_engine_group_put() - Put the group
> + * @group: The hw engine group
> + */
> +void xe_hw_engine_group_put(struct xe_hw_engine_group *group)
__releases(&group->mode_sem);
> +{
> + up_read(&group->mode_sem);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h b/drivers/gpu/drm/xe/xe_hw_engine.h
> index ce59d83a75ad..fce0adf6a7c4 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine.h
> +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
> @@ -73,5 +73,8 @@ u64 xe_hw_engine_read_timestamp(struct xe_hw_engine *hwe);
>
> int xe_hw_engine_group_add_exec_queue(struct xe_hw_engine_group *group, struct xe_exec_queue *q);
> int xe_hw_engine_group_del_exec_queue(struct xe_hw_engine_group *group, struct xe_exec_queue *q);
> +int xe_hw_engine_group_get_mode(struct xe_hw_engine_group *group,
> + enum xe_hw_engine_group_execution_mode mode);
Maybe consider putting these function in there own files:
xe_hw_engine_group.h
xe_hw_engine_group_types.h
xe_hw_engine_group.c
Matt
> +void xe_hw_engine_group_put(struct xe_hw_engine_group *group);
>
> #endif
> --
> 2.43.0
>
next prev parent reply other threads:[~2024-07-17 22:55 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-17 13:07 [RFC v1 0/9] Parallel submission of dma fence jobs and LR jobs with shared hardware resources Francois Dugast
2024-07-17 13:07 ` [RFC v1 1/9] drm/xe/hw_engine_group: Introduce xe_hw_engine_group Francois Dugast
2024-07-17 19:29 ` Matthew Brost
2024-07-22 7:40 ` Francois Dugast
2024-07-17 13:07 ` [RFC v1 2/9] drm/xe/exec_queue: Add list link for the hw engine group Francois Dugast
2024-07-17 19:31 ` Matthew Brost
2024-07-17 13:07 ` [RFC v1 3/9] drm/xe/hw_engine_group: Register hw engine group's exec queues Francois Dugast
2024-07-17 19:38 ` Matthew Brost
2024-07-17 19:42 ` Matthew Brost
2024-07-17 20:09 ` Matthew Brost
2024-07-22 8:17 ` Francois Dugast
2024-07-22 17:50 ` Matthew Brost
2024-08-13 12:24 ` Thomas Hellström
2024-08-15 14:55 ` Matthew Brost
2024-07-17 23:19 ` Matthew Brost
2024-07-22 8:31 ` Francois Dugast
2024-07-22 17:47 ` Matthew Brost
2024-07-17 13:07 ` [RFC v1 4/9] drm/xe/hw_engine_group: Add helper to suspend LR jobs Francois Dugast
2024-07-17 19:49 ` Matthew Brost
2024-07-17 23:09 ` Matthew Brost
2024-07-17 13:07 ` [RFC v1 5/9] drm/xe/hw_engine_group: Add helper to wait for dma fence jobs Francois Dugast
2024-07-17 20:18 ` Matthew Brost
2024-07-17 13:07 ` [RFC v1 6/9] drm/xe/hw_engine_group: Ensure safe transition between execution modes Francois Dugast
2024-07-17 22:54 ` Matthew Brost [this message]
2024-07-17 13:07 ` [RFC v1 7/9] drm/xe/exec: Switch hw engine group execution mode upon job submission Francois Dugast
2024-07-17 22:57 ` Matthew Brost
2024-07-18 2:09 ` Matthew Brost
2024-07-17 13:07 ` [RFC v1 8/9] drm/xe/hw_engine_group: Resume LR exec queues suspended by dma fence jobs Francois Dugast
2024-07-17 23:03 ` Matthew Brost
2024-07-17 13:07 ` [RFC v1 9/9] drm/xe/vm: Remove restriction that all VMs must be faulting if one is Francois Dugast
2024-07-17 23:05 ` Matthew Brost
2024-07-17 13:15 ` ✗ CI.Patch_applied: failure for Parallel submission of dma fence jobs and LR jobs with shared hardware resources Patchwork
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=ZphLpjXwjWddLTz0@DUT025-TGLU.fm.intel.com \
--to=matthew.brost@intel.com \
--cc=francois.dugast@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=thomas.hellstrom@linux.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.