[PATCH 2/3] drm/amdgpu: Allow P2P access through XGMI
Christian König
ckoenig.leichtzumerken at gmail.com
Wed Apr 16 12:42:10 UTC 2025
Am 16.04.25 um 06:45 schrieb Felix Kuehling:
> If peer memory is accessible through XGMI, allow leaving it in VRAM
> rather than forcing its migration to GTT on DMABuf attachment.
>
> Signed-off-by: Felix Kuehling <felix.kuehling at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 31 ++++++++++++++++++++-
> 1 file changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> index 9abe592968ab3..a72c17230fd37 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> @@ -43,6 +43,30 @@
> #include <linux/dma-fence-array.h>
> #include <linux/pci-p2pdma.h>
>
> +static const struct dma_buf_attach_ops amdgpu_dma_buf_attach_ops;
> +
> +/**
> + * dma_buf_attach_adev - Helper to get adev of an attachment
> + *
> + * @attach: attachment
> + *
> + * Returns:
> + * A struct amdgpu_device * if the attaching device is an amdgpu device or
> + * partition, NULL otherwise.
> + */
> +static struct amdgpu_device *dma_buf_attach_adev(struct dma_buf_attachment *attach)
> +{
> + if (attach->importer_ops == &amdgpu_dma_buf_attach_ops) {
Oh, that is rather clever. Going to keep that in mind.
> + struct drm_gem_object *obj = attach->importer_priv;
> + struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
> + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> +
> + return adev;
That can be simplified to just "return amdgpu_ttm_adev(bo->tbo.bdev);".
With that nit pick addressed feel free to add my rb.
Regards,
Christian.
> + }
> +
> + return NULL;
> +}
> +
> /**
> * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation
> *
> @@ -54,11 +78,13 @@
> static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf,
> struct dma_buf_attachment *attach)
> {
> + struct amdgpu_device *attach_adev = dma_buf_attach_adev(attach);
> struct drm_gem_object *obj = dmabuf->priv;
> struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
> struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
>
> - if (pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0)
> + if (!amdgpu_dmabuf_is_xgmi_accessible(attach_adev, bo) &&
> + pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0)
> attach->peer2peer = false;
>
> amdgpu_vm_bo_update_shared(bo);
> @@ -477,6 +503,9 @@ bool amdgpu_dmabuf_is_xgmi_accessible(struct amdgpu_device *adev,
> struct drm_gem_object *obj = &bo->tbo.base;
> struct drm_gem_object *gobj;
>
> + if (!adev)
> + return false;
> +
> if (obj->import_attach) {
> struct dma_buf *dma_buf = obj->import_attach->dmabuf;
>
More information about the amd-gfx
mailing list