On 9/4/2025 12:30 AM, Vivek Kasireddy wrote:
> To properly import a dmabuf that is associated with a VF (or that
> originates in a Guest VM that includes a VF), we need to know where
> in LMEM the VF's allocated regions exist. Therefore, introduce a
> new helper to return the object that backs the VF's regions in LMEM.
>
> v2:
> - Make the helper return the LMEM object instead of the start address.
>
> Signed-off-by: Vivek Kasireddy <[email protected]>
> ---
> drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 23 ++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h | 1 +
> 2 files changed, 24 insertions(+)
>
> 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 c8f0320d032f..e01f5b340999 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
> @@ -1542,6 +1542,29 @@ u64 xe_gt_sriov_pf_config_get_lmem(struct xe_gt *gt,
> unsigned int vfid)
> return size;
> }
>
> +/**
> + * xe_gt_sriov_pf_config_get_lmem_obj - Get VF's LMEM BO.
> + * @gt: the &xe_gt
> + * @vfid: the VF identifier
> + *
> + * This function can only be called on PF.
> + *
> + * Return: BO that is backing VF's quota in LMEM.
> + */
> +struct xe_bo *xe_gt_sriov_pf_config_get_lmem_obj(struct xe_gt *gt,
> + unsigned int vfid)
> +{
> + struct xe_gt_sriov_config *config;
> + struct xe_bo *lmem_obj;
> +
> + mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
> + config = pf_pick_vf_config(gt, vfid);
> + lmem_obj = config->lmem_obj;
> + mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
> +
> + return lmem_obj;
note that this bo pointer might be stale outside master-mutex
as now nothing prevents other code or user to unprovision VF
I guess you at least need to use xe_bo_get()/put()
and/or introduce some logic that would mark this BO as used
> +}
> +
> /**
> * xe_gt_sriov_pf_config_set_lmem - Provision VF with LMEM.
> * @gt: the &xe_gt (can't be media)
> 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 513e6512a575..bef459003de1 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
> @@ -31,6 +31,7 @@ int xe_gt_sriov_pf_config_set_fair_dbs(struct xe_gt *gt,
> unsigned int vfid, unsi
> int xe_gt_sriov_pf_config_bulk_set_dbs(struct xe_gt *gt, unsigned int vfid,
> unsigned int num_vfs,
> u32 num_dbs);
>
> +struct xe_bo *xe_gt_sriov_pf_config_get_lmem_obj(struct xe_gt *gt, unsigned
> int vfid);
and please place this declaration as last one in "lmem" group
> u64 xe_gt_sriov_pf_config_get_lmem(struct xe_gt *gt, unsigned int vfid);
> int xe_gt_sriov_pf_config_set_lmem(struct xe_gt *gt, unsigned int vfid, u64
> size);
> int xe_gt_sriov_pf_config_set_fair_lmem(struct xe_gt *gt, unsigned int vfid,
> unsigned int num_vfs);