On Tue, Apr 29, 2025 at 7:58 PM Sasha Levin <sas...@kernel.org> wrote: > > From: Felix Kuehling <felix.kuehl...@amd.com> > > [ Upstream commit a92741e72f91b904c1d8c3d409ed8dbe9c1f2b26 ] > > 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.kuehl...@amd.com> > Tested-by: Hao (Claire) Zhou <hao.z...@amd.com> > Reviewed-by: Christian König <christian.koe...@amd.com> > Signed-off-by: Alex Deucher <alexander.deuc...@amd.com> > (cherry picked from commit 372c8d72c3680fdea3fbb2d6b089f76b4a6d596a) > Signed-off-by: Sasha Levin <sas...@kernel.org>
This patch is only applicable to 6.15 and newer. Please drop for stable. Alex > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 30 ++++++++++++++++++++- > 1 file changed, 29 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 2f90fff1b9ddc..e63a32c214475 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c > @@ -42,6 +42,29 @@ > #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) { > + struct drm_gem_object *obj = attach->importer_priv; > + struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); > + > + return amdgpu_ttm_adev(bo->tbo.bdev); > + } > + > + return NULL; > +} > + > /** > * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation > * > @@ -53,11 +76,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; > > return 0; > @@ -456,6 +481,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; > > -- > 2.39.5 >