Re: [PATCH 2/3] drm/xe/pf: Add _locked variant of the contexts bulk config function
Piotr Piórkowski <[email protected]>
| Newsgroups | org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <[email protected]> |
Michal Wajdeczko <[email protected]> wrote on śro [2026-sie-05 17:47:32 +0200]: > We will soon want to provision all VFs, including their GuC context > IDs config, in one step. Split existing GuC IDs bulk configuration > function into two functions, one of which will expect the master > lock to be already taken. Use this new function in the fair GuC IDs > provisioning. > > Signed-off-by: Michal Wajdeczko <[email protected]> > --- > drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 37 ++++++++++++++++------ > drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h | 2 ++ > 2 files changed, 29 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c > index 47623315d615..4976d8c018ce 100644 > --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c > +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c > @@ -1116,7 +1116,7 @@ static int pf_config_bulk_set_u32_done(struct xe_gt *gt, unsigned int first, uns > } > > /** > - * xe_gt_sriov_pf_config_bulk_set_ctxs - Provision many VFs with GuC context IDs. > + * xe_gt_sriov_pf_config_bulk_set_ctxs_locked() - Provision many VFs with GuC context IDs. > * @gt: the &xe_gt > * @vfid: starting VF identifier > * @num_vfs: number of VFs to provision > @@ -1126,30 +1126,48 @@ static int pf_config_bulk_set_u32_done(struct xe_gt *gt, unsigned int first, uns > * > * Return: 0 on success or a negative error code on failure. > */ > -int xe_gt_sriov_pf_config_bulk_set_ctxs(struct xe_gt *gt, unsigned int vfid, > - unsigned int num_vfs, u32 num_ctxs) > +int xe_gt_sriov_pf_config_bulk_set_ctxs_locked(struct xe_gt *gt, unsigned int vfid, > + unsigned int num_vfs, u32 num_ctxs) > { > unsigned int n; > int err = 0; > > xe_gt_assert(gt, vfid); > + lockdep_assert_held(xe_gt_sriov_pf_master_mutex(gt)); > > if (!num_vfs) > return 0; > > - mutex_lock(xe_gt_sriov_pf_master_mutex(gt)); > for (n = vfid; n < vfid + num_vfs; n++) { > err = pf_provision_vf_ctxs(gt, n, num_ctxs); > if (err) > break; > } > - mutex_unlock(xe_gt_sriov_pf_master_mutex(gt)); > > return pf_config_bulk_set_u32_done(gt, vfid, num_vfs, num_ctxs, > - xe_gt_sriov_pf_config_get_ctxs, > + pf_get_vf_config_ctxs, > "GuC context IDs", no_unit, n, err); > } > > +/** > + * xe_gt_sriov_pf_config_bulk_set_ctxs() - Provision many VFs with GuC context IDs. > + * @gt: the &xe_gt > + * @vfid: starting VF identifier > + * @num_vfs: number of VFs to provision > + * @num_ctxs: requested number of GuC contexts IDs (0 to release) > + * > + * This function can only be called on PF. > + * > + * Return: 0 on success or a negative error code on failure. > + */ > +int xe_gt_sriov_pf_config_bulk_set_ctxs(struct xe_gt *gt, unsigned int vfid, > + unsigned int num_vfs, u32 num_ctxs) > +{ > + guard(mutex)(xe_gt_sriov_pf_master_mutex(gt)); > + > + return xe_gt_sriov_pf_config_bulk_set_ctxs_locked(gt, vfid, num_vfs, num_ctxs); > +} > + > static u32 pf_profile_fair_ctxs(struct xe_gt *gt, unsigned int num_vfs) > { > bool admin_only_pf = xe_sriov_pf_admin_only(gt_to_xe(gt)); > @@ -1198,10 +1216,9 @@ int xe_gt_sriov_pf_config_set_fair_ctxs(struct xe_gt *gt, unsigned int vfid, > xe_gt_assert(gt, vfid); > xe_gt_assert(gt, num_vfs); > > - mutex_lock(xe_gt_sriov_pf_master_mutex(gt)); > + guard(mutex)(xe_gt_sriov_pf_master_mutex(gt)); > + > fair = pf_estimate_fair_ctxs(gt, num_vfs); > - mutex_unlock(xe_gt_sriov_pf_master_mutex(gt)); > - > if (!fair) > return -ENOSPC; > > @@ -1210,7 +1227,7 @@ int xe_gt_sriov_pf_config_set_fair_ctxs(struct xe_gt *gt, unsigned int vfid, > xe_gt_sriov_info(gt, "Using non-profile provisioning (%s %u vs %u)\n", > "GuC context IDs", fair, profile); > > - return xe_gt_sriov_pf_config_bulk_set_ctxs(gt, vfid, num_vfs, fair); > + return xe_gt_sriov_pf_config_bulk_set_ctxs_locked(gt, vfid, num_vfs, fair); > } > > static u32 pf_get_min_spare_dbs(struct xe_gt *gt) > diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h > index 3741202908ee..a14ca7bf7e4d 100644 > --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h > +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h > @@ -26,6 +26,8 @@ int xe_gt_sriov_pf_config_set_ctxs(struct xe_gt *gt, unsigned int vfid, u32 num_ > int xe_gt_sriov_pf_config_set_fair_ctxs(struct xe_gt *gt, unsigned int vfid, unsigned int num_vfs); > int xe_gt_sriov_pf_config_bulk_set_ctxs(struct xe_gt *gt, unsigned int vfid, unsigned int num_vfs, > u32 num_ctxs); > +int xe_gt_sriov_pf_config_bulk_set_ctxs_locked(struct xe_gt *gt, unsigned int vfid, > + unsigned int num_vfs, u32 num_ctxs); > > u32 xe_gt_sriov_pf_config_get_dbs(struct xe_gt *gt, unsigned int vfid); > int xe_gt_sriov_pf_config_set_dbs(struct xe_gt *gt, unsigned int vfid, u32 num_dbs); > -- > 2.47.1 > Reviewed-by: Piotr Piórkowski <[email protected]> --