All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthew Brost <matthew.brost@intel.com>
To: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: intel-xe@lists.freedesktop.org,
	"Paulo Zanoni" <paulo.r.zanoni@intel.com>,
	"Francois Dugast" <francois.dugast@intel.com>,
	"Thomas Hellström" <thomas.hellstrom@linux.intel.com>
Subject: Re: [PATCH] drm/xe: Fix missing runtime outer protection for ggtt_remove_node
Date: Mon, 3 Jun 2024 18:15:35 +0000	[thread overview]
Message-ID: <Zl4IR7xPQFNvPMyJ@DUT025-TGLU.fm.intel.com> (raw)
In-Reply-To: <20240531200851.223236-1-rodrigo.vivi@intel.com>

On Fri, May 31, 2024 at 04:08:51PM -0400, Rodrigo Vivi wrote:
> Defer the ggtt node removal to a thread if runtime_pm is not active.
> 
> The ggtt node removal can be called from multiple places, including
> places where we cannot protect with outer callers and places we are
> within other locks. So, try to grab the runtime reference if the
> device is already active, otherwise defer the removal to a separate
> thread from where we are sure we can wake the device up.
> 
> v2: - use xe wq instead of system wq (Matt and CI)
>     - Avoid GFP_KERNEL to be future proof since this removal can
>     be called from outside our drivers and we don't want to block
>     if atomic is needed. (Matt)
> v3: amend forgot chunk declaring xe_device.
> 
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Cc: Francois Dugast <francois.dugast@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_ggtt.c | 57 ++++++++++++++++++++++++++++++++----
>  1 file changed, 52 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index b01a670fecb8..ab086737f910 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
> @@ -443,16 +443,14 @@ int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
>  	return __xe_ggtt_insert_bo_at(ggtt, bo, 0, U64_MAX);
>  }
>  
> -void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node,
> -			 bool invalidate)
> +static void ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node,
> +			     bool invalidate)
>  {
>  	struct xe_device *xe = tile_to_xe(ggtt->tile);
>  	bool bound;
>  	int idx;
>  
>  	bound = drm_dev_enter(&xe->drm, &idx);
> -	if (bound)
> -		xe_pm_runtime_get_noresume(xe);
>  
>  	mutex_lock(&ggtt->lock);
>  	if (bound)
> @@ -467,10 +465,59 @@ void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node,
>  	if (invalidate)
>  		xe_ggtt_invalidate(ggtt);
>  
> -	xe_pm_runtime_put(xe);
>  	drm_dev_exit(idx);
>  }
>  
> +struct remove_node_work {
> +	struct work_struct work;
> +	struct xe_ggtt *ggtt;
> +	struct drm_mm_node *node;
> +	bool invalidate;
> +};
> +
> +static void ggtt_remove_node_work_func(struct work_struct *work)
> +{
> +	struct remove_node_work *remove_node = container_of(work, struct remove_node_work, work);
> +	struct xe_device *xe = tile_to_xe(remove_node->ggtt->tile);
> +
> +	xe_pm_runtime_get(xe);
> +	ggtt_remove_node(remove_node->ggtt, remove_node->node, remove_node->invalidate);
> +	xe_pm_runtime_put(xe);
> +
> +	kfree(remove_node);
> +}
> +
> +static void ggtt_queue_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node,
> +				   bool invalidate)
> +{
> +	struct xe_device *xe = tile_to_xe(ggtt->tile);
> +	struct remove_node_work *remove_node;
> +
> +	remove_node = kmalloc(sizeof(*remove_node), GFP_ATOMIC);
> +	if (!remove_node)

I think a DRM error message here would be helpful too. 

Matt

> +		return;
> +
> +	INIT_WORK(&remove_node->work, ggtt_remove_node_work_func);
> +	remove_node->ggtt = ggtt;
> +	remove_node->node = node;
> +	remove_node->invalidate = invalidate;
> +
> +	queue_work(xe->unordered_wq, &remove_node->work);
> +}
> +
> +void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node,
> +			 bool invalidate)
> +{
> +	struct xe_device *xe = tile_to_xe(ggtt->tile);
> +
> +	if (xe_pm_runtime_get_if_active(xe)) {
> +		ggtt_remove_node(ggtt, node, invalidate);
> +		xe_pm_runtime_put(xe);
> +	} else {
> +		ggtt_queue_remove_node(ggtt, node, invalidate);
> +	}
> +}
> +
>  void xe_ggtt_remove_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
>  {
>  	if (XE_WARN_ON(!bo->ggtt_node.size))
> -- 
> 2.45.1
> 

  parent reply	other threads:[~2024-06-03 18:16 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-31 20:08 [PATCH] drm/xe: Fix missing runtime outer protection for ggtt_remove_node Rodrigo Vivi
2024-05-31 20:15 ` ✓ CI.Patch_applied: success for drm/xe: Fix missing runtime outer protection for ggtt_remove_node (rev3) Patchwork
2024-05-31 20:15 ` ✓ CI.checkpatch: " Patchwork
2024-05-31 20:16 ` ✓ CI.KUnit: " Patchwork
2024-05-31 20:31 ` ✓ CI.Build: " Patchwork
2024-05-31 20:31 ` ✗ CI.Hooks: failure " Patchwork
2024-05-31 20:33 ` ✓ CI.checksparse: success " Patchwork
2024-05-31 20:56 ` ✓ CI.BAT: " Patchwork
2024-05-31 21:46 ` ✗ CI.FULL: failure " Patchwork
2024-06-03 13:25 ` [PATCH] drm/xe: Fix missing runtime outer protection for ggtt_remove_node Thomas Hellström
2024-06-03 18:15 ` Matthew Brost [this message]
2024-06-03 21:03   ` Thomas Hellström
  -- strict thread matches above, loose matches on Subject: below --
2024-06-14 21:42 Rodrigo Vivi
2024-06-14 18:37 Rodrigo Vivi
2024-06-13 21:53 Rodrigo Vivi
2024-06-13 22:39 ` Matthew Brost
2024-06-14 14:29 ` Matthew Auld
2024-06-12 18:20 Rodrigo Vivi
2024-06-13  9:06 ` Matthew Auld
2024-06-12 17:27 Rodrigo Vivi
2024-06-12 18:05 ` Matthew Brost
2024-05-31 19:53 Rodrigo Vivi
2024-05-31 16:02 Rodrigo Vivi
2024-05-31 16:15 ` Matthew Brost
2024-05-31 16:31   ` Rodrigo Vivi
2024-05-31 16:36     ` Matthew Brost

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=Zl4IR7xPQFNvPMyJ@DUT025-TGLU.fm.intel.com \
    --to=matthew.brost@intel.com \
    --cc=francois.dugast@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=paulo.r.zanoni@intel.com \
    --cc=rodrigo.vivi@intel.com \
    --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.