[Public] > -----Original Message----- > From: Meng, Li (Jassmine) <li.m...@amd.com> > Sent: Monday, June 23, 2025 9:53 PM > To: amd-gfx <amd-gfx@lists.freedesktop.org> > Cc: Yuan, Perry <perry.y...@amd.com>; Huang, Shimmer > <shimmer.hu...@amd.com>; Koenig Christian <koenig.christ...@amd.com>; > Lazar, Lijo <lijo.la...@amd.com>; Deucher, Alexander > <alexander.deuc...@amd.com>; Meng, Li (Jassmine) <li.m...@amd.com>; > Jiang Liu <ge...@linux.alibaba.com> > Subject: [PATCH V3 1/1] drm/amd/amdgpu: Release xcp drm memory after unplug > > Add a new API amdgpu_xcp_drm_dev_free(). > After unplug xcp device, need to release xcp drm memory etc. > > Co-developed-by: Jiang Liu <ge...@linux.alibaba.com> > Signed-off-by: Jiang Liu <ge...@linux.alibaba.com> > Signed-off-by: Meng Li <li.m...@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c | 1 + > drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c | 60 +++++++++++++++++---- > drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h | 1 + > 3 files changed, 53 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c > index 322816805bfb..70c44961af95 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c > @@ -394,6 +394,7 @@ void amdgpu_xcp_dev_unplug(struct amdgpu_device > *adev) > p_ddev->primary->dev = adev->xcp_mgr->xcp[i].pdev; > p_ddev->driver = adev->xcp_mgr->xcp[i].driver; > p_ddev->vma_offset_manager = adev->xcp_mgr- > >xcp[i].vma_offset_manager; > + amdgpu_xcp_drm_dev_free(p_ddev); > } > } > > diff --git a/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c > b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c > index faed84172dd4..3a8f3dd19a12 100644 > --- a/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c > +++ b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c > @@ -45,18 +45,29 @@ static const struct drm_driver amdgpu_xcp_driver = { > > static int8_t pdev_num; > static struct xcp_device *xcp_dev[MAX_XCP_PLATFORM_DEVICE]; > +static DEFINE_MUTEX(xcp_mutex); > > int amdgpu_xcp_drm_dev_alloc(struct drm_device **ddev) { > struct platform_device *pdev; > struct xcp_device *pxcp_dev; > char dev_name[20]; > - int ret; > + int ret, i; > + > + guard(mutex)(&xcp_mutex); > > if (pdev_num >= MAX_XCP_PLATFORM_DEVICE) > return -ENODEV; > > - snprintf(dev_name, sizeof(dev_name), "amdgpu_xcp_%d", pdev_num); > + for (i = 0; i < MAX_XCP_PLATFORM_DEVICE; i++) { > + if (!xcp_dev[i]) > + break; > + } > + > + if (i >= MAX_XCP_PLATFORM_DEVICE) > + return -ENODEV; > + > + snprintf(dev_name, sizeof(dev_name), "amdgpu_xcp_%d", i); > pdev = platform_device_register_simple(dev_name, -1, NULL, 0); > if (IS_ERR(pdev)) > return PTR_ERR(pdev); > @@ -72,8 +83,8 @@ int amdgpu_xcp_drm_dev_alloc(struct drm_device **ddev) > goto out_devres; > } > > - xcp_dev[pdev_num] = pxcp_dev; > - xcp_dev[pdev_num]->pdev = pdev; > + xcp_dev[i] = pxcp_dev; > + xcp_dev[i]->pdev = pdev; > *ddev = &pxcp_dev->drm; > pdev_num++; > > @@ -88,16 +99,47 @@ int amdgpu_xcp_drm_dev_alloc(struct drm_device **ddev) > } EXPORT_SYMBOL(amdgpu_xcp_drm_dev_alloc); > > -void amdgpu_xcp_drv_release(void) > +static void free_xcp_dev(int8_t index) > { > - for (--pdev_num; pdev_num >= 0; --pdev_num) { > - struct platform_device *pdev = xcp_dev[pdev_num]->pdev; > + if ((index < MAX_XCP_PLATFORM_DEVICE) && (xcp_dev[index])) { > + struct platform_device *pdev = xcp_dev[index]->pdev; > > devres_release_group(&pdev->dev, NULL); > platform_device_unregister(pdev); > - xcp_dev[pdev_num] = NULL; > + > + xcp_dev[index] = NULL; > + pdev_num--; > + } > +} > + > +void amdgpu_xcp_drm_dev_free(struct drm_device *ddev) { > + int8_t i = MAX_XCP_PLATFORM_DEVICE;
No need to init i here. You aren't using the assigned value. With that fixed: Acked-by: Alex Deucher <alexander.deuc...@amd.com> > + > + guard(mutex)(&xcp_mutex); > + > + for (i = 0; i < MAX_XCP_PLATFORM_DEVICE; i++) { > + if ((xcp_dev[i]) && (&xcp_dev[i]->drm == ddev)) { > + free_xcp_dev(i); > + break; > + } > + } > +} > +EXPORT_SYMBOL(amdgpu_xcp_drm_dev_free); > + > +void amdgpu_xcp_drv_release(void) > +{ > + int8_t i = 0; > + > + guard(mutex)(&xcp_mutex); > + > + if (pdev_num > 0) { > + for (i = 0; i < MAX_XCP_PLATFORM_DEVICE; i++) { > + free_xcp_dev(i); > + if (pdev_num == 0) > + break; > + } > } > - pdev_num = 0; > } > EXPORT_SYMBOL(amdgpu_xcp_drv_release); > > diff --git a/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h > b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h > index c1c4b679bf95..580a1602c8e3 100644 > --- a/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h > +++ b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h > @@ -25,5 +25,6 @@ > #define _AMDGPU_XCP_DRV_H_ > > int amdgpu_xcp_drm_dev_alloc(struct drm_device **ddev); > +void amdgpu_xcp_drm_dev_free(struct drm_device *ddev); > void amdgpu_xcp_drv_release(void); > #endif /* _AMDGPU_XCP_DRV_H_ */ > -- > 2.43.0