[PATCH 2/2] drm/xe/guc: Don't allocate managed BO for each policy change
Matthew Brost
matthew.brost at intel.com
Mon May 12 22:12:30 UTC 2025
On Tue, May 13, 2025 at 12:00:18AM +0200, Michal Wajdeczko wrote:
> We shouldn't use xe_managed_bo_create_from_data() to allocate
> temporary BO, as it will be released only on unload and every
> change in wedge_mode policy will consume resources (including
> precious GGTT). Instead just switchover to GuC buffer cache.
>
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
> Cc: John Harrison <John.C.Harrison at Intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
Same as previous patch - do you want fixes here for backporting?
Reviewed-by: Matthew Brost <matthew.brost at intel.com>
> ---
> drivers/gpu/drm/xe/xe_guc_ads.c | 27 +++++++++++++--------------
> 1 file changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_ads.c b/drivers/gpu/drm/xe/xe_guc_ads.c
> index 44c1fa2fe7c8..07a027755627 100644
> --- a/drivers/gpu/drm/xe/xe_guc_ads.c
> +++ b/drivers/gpu/drm/xe/xe_guc_ads.c
> @@ -20,6 +20,7 @@
> #include "xe_gt_ccs_mode.h"
> #include "xe_gt_printk.h"
> #include "xe_guc.h"
> +#include "xe_guc_buf.h"
> #include "xe_guc_capture.h"
> #include "xe_guc_ct.h"
> #include "xe_hw_engine.h"
> @@ -994,6 +995,16 @@ static int guc_ads_action_update_policies(struct xe_guc_ads *ads, u32 policy_off
> return xe_guc_ct_send(ct, action, ARRAY_SIZE(action), 0, 0);
> }
>
> +static int guc_ads_update_policies(struct xe_guc_ads *ads, const struct guc_policies *policies)
> +{
> + CLASS(xe_guc_buf_from_data, buf)(&ads_to_guc(ads)->buf, policies, sizeof(*policies));
> +
> + if (!xe_guc_buf_is_valid(buf))
> + return -ENOBUFS;
> +
> + return guc_ads_action_update_policies(ads, xe_guc_buf_flush(buf));
> +}
> +
> /**
> * xe_guc_ads_scheduler_policy_toggle_reset - Toggle reset policy
> * @ads: Additional data structures object
> @@ -1005,11 +1016,8 @@ static int guc_ads_action_update_policies(struct xe_guc_ads *ads, u32 policy_off
> int xe_guc_ads_scheduler_policy_toggle_reset(struct xe_guc_ads *ads)
> {
> struct xe_device *xe = ads_to_xe(ads);
> - struct xe_gt *gt = ads_to_gt(ads);
> - struct xe_tile *tile = gt_to_tile(gt);
> struct guc_policies *policies;
> - struct xe_bo *bo;
> - int ret = 0;
> + int ret;
>
> policies = kmalloc(sizeof(*policies), GFP_KERNEL);
> if (!policies)
> @@ -1023,16 +1031,7 @@ int xe_guc_ads_scheduler_policy_toggle_reset(struct xe_guc_ads *ads)
> else
> policies->global_flags &= ~GLOBAL_POLICY_DISABLE_ENGINE_RESET;
>
> - bo = xe_managed_bo_create_from_data(xe, tile, policies, sizeof(struct guc_policies),
> - XE_BO_FLAG_VRAM_IF_DGFX(tile) |
> - XE_BO_FLAG_GGTT);
> - if (IS_ERR(bo)) {
> - ret = PTR_ERR(bo);
> - goto out;
> - }
> -
> - ret = guc_ads_action_update_policies(ads, xe_bo_ggtt_addr(bo));
> -out:
> + ret = guc_ads_update_policies(ads, policies);
> kfree(policies);
> return ret;
> }
> --
> 2.47.1
>
More information about the Intel-xe
mailing list