* [PATCH v5 2/3] drm/amdgpu: Reset the clear flag in buddy during resume [not found] <20250716075125.240637-1-Arunpravin.PaneerSelvam@amd.com> @ 2025-07-16 7:51 ` Arunpravin Paneer Selvam 2025-07-16 10:28 ` Arunpravin Paneer Selvam 0 siblings, 1 reply; 6+ messages in thread From: Arunpravin Paneer Selvam @ 2025-07-16 7:51 UTC (permalink / raw) To: dri-devel, amd-gfx, christian.koenig, matthew.auld, matthew.brost Cc: alexander.deucher, Arunpravin Paneer Selvam, stable - Added a handler in DRM buddy manager to reset the cleared flag for the blocks in the freelist. - This is necessary because, upon resuming, the VRAM becomes cluttered with BIOS data, yet the VRAM backend manager believes that everything has been cleared. v2: - Add lock before accessing drm_buddy_clear_reset_blocks()(Matthew Auld) - Force merge the two dirty blocks.(Matthew Auld) - Add a new unit test case for this issue.(Matthew Auld) - Having this function being able to flip the state either way would be good. (Matthew Brost) v3(Matthew Auld): - Do merge step first to avoid the use of extra reset flag. Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> Suggested-by: Christian König <christian.koenig@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Cc: stable@vger.kernel.org Fixes: a68c7eaa7a8f ("drm/amdgpu: Enable clear page functionality") Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3812 --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 17 ++++++++ drivers/gpu/drm/drm_buddy.c | 43 ++++++++++++++++++++ include/drm/drm_buddy.h | 2 + 5 files changed, 65 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 723ab95d8c48..ac92220f9fc3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -5327,6 +5327,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients) dev->dev->power.disable_depth--; #endif } + + amdgpu_vram_mgr_clear_reset_blocks(adev); adev->in_suspend = false; if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0)) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 215c198e4aff..2309df3f68a9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -155,6 +155,7 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, uint64_t start, uint64_t size); int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, uint64_t start); +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev); bool amdgpu_res_cpu_visible(struct amdgpu_device *adev, struct ttm_resource *res); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index abdc52b0895a..07c936e90d8e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -782,6 +782,23 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr) return atomic64_read(&mgr->vis_usage); } +/** + * amdgpu_vram_mgr_clear_reset_blocks - reset clear blocks + * + * @adev: amdgpu device pointer + * + * Reset the cleared drm buddy blocks. + */ +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev) +{ + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; + struct drm_buddy *mm = &mgr->mm; + + mutex_lock(&mgr->lock); + drm_buddy_reset_clear(mm, false); + mutex_unlock(&mgr->lock); +} + /** * amdgpu_vram_mgr_intersects - test each drm buddy block for intersection * diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c index a1e652b7631d..a94061f373de 100644 --- a/drivers/gpu/drm/drm_buddy.c +++ b/drivers/gpu/drm/drm_buddy.c @@ -405,6 +405,49 @@ drm_get_buddy(struct drm_buddy_block *block) } EXPORT_SYMBOL(drm_get_buddy); +/** + * drm_buddy_reset_clear - reset blocks clear state + * + * @mm: DRM buddy manager + * @is_clear: blocks clear state + * + * Reset the clear state based on @is_clear value for each block + * in the freelist. + */ +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear) +{ + u64 root_size, size, start; + unsigned int order; + int i; + + size = mm->size; + for (i = 0; i < mm->n_roots; ++i) { + order = ilog2(size) - ilog2(mm->chunk_size); + start = drm_buddy_block_offset(mm->roots[i]); + __force_merge(mm, start, start + size, order); + + root_size = mm->chunk_size << order; + size -= root_size; + } + + for (i = 0; i <= mm->max_order; ++i) { + struct drm_buddy_block *block; + + list_for_each_entry_reverse(block, &mm->free_list[i], link) { + if (is_clear != drm_buddy_block_is_clear(block)) { + if (is_clear) { + mark_cleared(block); + mm->clear_avail += drm_buddy_block_size(mm, block); + } else { + clear_reset(block); + mm->clear_avail -= drm_buddy_block_size(mm, block); + } + } + } + } +} +EXPORT_SYMBOL(drm_buddy_reset_clear); + /** * drm_buddy_free_block - free a block * diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h index 9689a7c5dd36..513837632b7d 100644 --- a/include/drm/drm_buddy.h +++ b/include/drm/drm_buddy.h @@ -160,6 +160,8 @@ int drm_buddy_block_trim(struct drm_buddy *mm, u64 new_size, struct list_head *blocks); +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear); + void drm_buddy_free_block(struct drm_buddy *mm, struct drm_buddy_block *block); void drm_buddy_free_list(struct drm_buddy *mm, -- 2.43.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v5 2/3] drm/amdgpu: Reset the clear flag in buddy during resume 2025-07-16 7:51 ` [PATCH v5 2/3] drm/amdgpu: Reset the clear flag in buddy during resume Arunpravin Paneer Selvam @ 2025-07-16 10:28 ` Arunpravin Paneer Selvam 2025-07-16 10:47 ` Christian König 0 siblings, 1 reply; 6+ messages in thread From: Arunpravin Paneer Selvam @ 2025-07-16 10:28 UTC (permalink / raw) To: dri-devel, amd-gfx, christian.koenig, matthew.auld, matthew.brost, airlied Cc: alexander.deucher, stable Hi Dave, I am trying to push this series into drm-misc-fixes, but I get the below error when dim push-branch drm-misc-fixes. dim:ERROR:e24c180b4300("drm/amdgpu:Reset the clear flag in buddy during resume"): Mandatory Maintainer Acked-by missing., aborting Looks like maintainers Acked-by is required to push the patches into drm-misc-fixes ? Regards, Arun. On 7/16/2025 1:21 PM, Arunpravin Paneer Selvam wrote: > - Added a handler in DRM buddy manager to reset the cleared > flag for the blocks in the freelist. > > - This is necessary because, upon resuming, the VRAM becomes > cluttered with BIOS data, yet the VRAM backend manager > believes that everything has been cleared. > > v2: > - Add lock before accessing drm_buddy_clear_reset_blocks()(Matthew Auld) > - Force merge the two dirty blocks.(Matthew Auld) > - Add a new unit test case for this issue.(Matthew Auld) > - Having this function being able to flip the state either way would be > good. (Matthew Brost) > > v3(Matthew Auld): > - Do merge step first to avoid the use of extra reset flag. > > Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> > Suggested-by: Christian König <christian.koenig@amd.com> > Acked-by: Christian König <christian.koenig@amd.com> > Reviewed-by: Matthew Auld <matthew.auld@intel.com> > Cc: stable@vger.kernel.org > Fixes: a68c7eaa7a8f ("drm/amdgpu: Enable clear page functionality") > Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3812 > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 + > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 + > drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 17 ++++++++ > drivers/gpu/drm/drm_buddy.c | 43 ++++++++++++++++++++ > include/drm/drm_buddy.h | 2 + > 5 files changed, 65 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index 723ab95d8c48..ac92220f9fc3 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -5327,6 +5327,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients) > dev->dev->power.disable_depth--; > #endif > } > + > + amdgpu_vram_mgr_clear_reset_blocks(adev); > adev->in_suspend = false; > > if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0)) > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > index 215c198e4aff..2309df3f68a9 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > @@ -155,6 +155,7 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, > uint64_t start, uint64_t size); > int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, > uint64_t start); > +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev); > > bool amdgpu_res_cpu_visible(struct amdgpu_device *adev, > struct ttm_resource *res); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > index abdc52b0895a..07c936e90d8e 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > @@ -782,6 +782,23 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr) > return atomic64_read(&mgr->vis_usage); > } > > +/** > + * amdgpu_vram_mgr_clear_reset_blocks - reset clear blocks > + * > + * @adev: amdgpu device pointer > + * > + * Reset the cleared drm buddy blocks. > + */ > +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev) > +{ > + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; > + struct drm_buddy *mm = &mgr->mm; > + > + mutex_lock(&mgr->lock); > + drm_buddy_reset_clear(mm, false); > + mutex_unlock(&mgr->lock); > +} > + > /** > * amdgpu_vram_mgr_intersects - test each drm buddy block for intersection > * > diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c > index a1e652b7631d..a94061f373de 100644 > --- a/drivers/gpu/drm/drm_buddy.c > +++ b/drivers/gpu/drm/drm_buddy.c > @@ -405,6 +405,49 @@ drm_get_buddy(struct drm_buddy_block *block) > } > EXPORT_SYMBOL(drm_get_buddy); > > +/** > + * drm_buddy_reset_clear - reset blocks clear state > + * > + * @mm: DRM buddy manager > + * @is_clear: blocks clear state > + * > + * Reset the clear state based on @is_clear value for each block > + * in the freelist. > + */ > +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear) > +{ > + u64 root_size, size, start; > + unsigned int order; > + int i; > + > + size = mm->size; > + for (i = 0; i < mm->n_roots; ++i) { > + order = ilog2(size) - ilog2(mm->chunk_size); > + start = drm_buddy_block_offset(mm->roots[i]); > + __force_merge(mm, start, start + size, order); > + > + root_size = mm->chunk_size << order; > + size -= root_size; > + } > + > + for (i = 0; i <= mm->max_order; ++i) { > + struct drm_buddy_block *block; > + > + list_for_each_entry_reverse(block, &mm->free_list[i], link) { > + if (is_clear != drm_buddy_block_is_clear(block)) { > + if (is_clear) { > + mark_cleared(block); > + mm->clear_avail += drm_buddy_block_size(mm, block); > + } else { > + clear_reset(block); > + mm->clear_avail -= drm_buddy_block_size(mm, block); > + } > + } > + } > + } > +} > +EXPORT_SYMBOL(drm_buddy_reset_clear); > + > /** > * drm_buddy_free_block - free a block > * > diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h > index 9689a7c5dd36..513837632b7d 100644 > --- a/include/drm/drm_buddy.h > +++ b/include/drm/drm_buddy.h > @@ -160,6 +160,8 @@ int drm_buddy_block_trim(struct drm_buddy *mm, > u64 new_size, > struct list_head *blocks); > > +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear); > + > void drm_buddy_free_block(struct drm_buddy *mm, struct drm_buddy_block *block); > > void drm_buddy_free_list(struct drm_buddy *mm, ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v5 2/3] drm/amdgpu: Reset the clear flag in buddy during resume 2025-07-16 10:28 ` Arunpravin Paneer Selvam @ 2025-07-16 10:47 ` Christian König 2025-07-16 11:00 ` Arunpravin Paneer Selvam 2025-07-16 11:01 ` Christian König 0 siblings, 2 replies; 6+ messages in thread From: Christian König @ 2025-07-16 10:47 UTC (permalink / raw) To: Arunpravin Paneer Selvam, dri-devel, amd-gfx, matthew.auld, matthew.brost, airlied Cc: alexander.deucher, stable On 16.07.25 12:28, Arunpravin Paneer Selvam wrote: > Hi Dave, > > I am trying to push this series into drm-misc-fixes, but I get the below error when dim push-branch drm-misc-fixes. > > dim:ERROR:e24c180b4300("drm/amdgpu:Reset the clear flag in buddy during resume"): Mandatory Maintainer Acked-by missing., aborting > > Looks like maintainers Acked-by is required to push the patches into drm-misc-fixes ? Strange, it should work with my Acked-by. Let me give it a try. Regards, Christian. > > Regards, > > Arun. > > On 7/16/2025 1:21 PM, Arunpravin Paneer Selvam wrote: >> - Added a handler in DRM buddy manager to reset the cleared >> flag for the blocks in the freelist. >> >> - This is necessary because, upon resuming, the VRAM becomes >> cluttered with BIOS data, yet the VRAM backend manager >> believes that everything has been cleared. >> >> v2: >> - Add lock before accessing drm_buddy_clear_reset_blocks()(Matthew Auld) >> - Force merge the two dirty blocks.(Matthew Auld) >> - Add a new unit test case for this issue.(Matthew Auld) >> - Having this function being able to flip the state either way would be >> good. (Matthew Brost) >> >> v3(Matthew Auld): >> - Do merge step first to avoid the use of extra reset flag. >> >> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> >> Suggested-by: Christian König <christian.koenig@amd.com> >> Acked-by: Christian König <christian.koenig@amd.com> >> Reviewed-by: Matthew Auld <matthew.auld@intel.com> >> Cc: stable@vger.kernel.org >> Fixes: a68c7eaa7a8f ("drm/amdgpu: Enable clear page functionality") >> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3812 >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 + >> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 + >> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 17 ++++++++ >> drivers/gpu/drm/drm_buddy.c | 43 ++++++++++++++++++++ >> include/drm/drm_buddy.h | 2 + >> 5 files changed, 65 insertions(+) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> index 723ab95d8c48..ac92220f9fc3 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> @@ -5327,6 +5327,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients) >> dev->dev->power.disable_depth--; >> #endif >> } >> + >> + amdgpu_vram_mgr_clear_reset_blocks(adev); >> adev->in_suspend = false; >> if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0)) >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >> index 215c198e4aff..2309df3f68a9 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >> @@ -155,6 +155,7 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, >> uint64_t start, uint64_t size); >> int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, >> uint64_t start); >> +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev); >> bool amdgpu_res_cpu_visible(struct amdgpu_device *adev, >> struct ttm_resource *res); >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >> index abdc52b0895a..07c936e90d8e 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >> @@ -782,6 +782,23 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr) >> return atomic64_read(&mgr->vis_usage); >> } >> +/** >> + * amdgpu_vram_mgr_clear_reset_blocks - reset clear blocks >> + * >> + * @adev: amdgpu device pointer >> + * >> + * Reset the cleared drm buddy blocks. >> + */ >> +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev) >> +{ >> + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; >> + struct drm_buddy *mm = &mgr->mm; >> + >> + mutex_lock(&mgr->lock); >> + drm_buddy_reset_clear(mm, false); >> + mutex_unlock(&mgr->lock); >> +} >> + >> /** >> * amdgpu_vram_mgr_intersects - test each drm buddy block for intersection >> * >> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c >> index a1e652b7631d..a94061f373de 100644 >> --- a/drivers/gpu/drm/drm_buddy.c >> +++ b/drivers/gpu/drm/drm_buddy.c >> @@ -405,6 +405,49 @@ drm_get_buddy(struct drm_buddy_block *block) >> } >> EXPORT_SYMBOL(drm_get_buddy); >> +/** >> + * drm_buddy_reset_clear - reset blocks clear state >> + * >> + * @mm: DRM buddy manager >> + * @is_clear: blocks clear state >> + * >> + * Reset the clear state based on @is_clear value for each block >> + * in the freelist. >> + */ >> +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear) >> +{ >> + u64 root_size, size, start; >> + unsigned int order; >> + int i; >> + >> + size = mm->size; >> + for (i = 0; i < mm->n_roots; ++i) { >> + order = ilog2(size) - ilog2(mm->chunk_size); >> + start = drm_buddy_block_offset(mm->roots[i]); >> + __force_merge(mm, start, start + size, order); >> + >> + root_size = mm->chunk_size << order; >> + size -= root_size; >> + } >> + >> + for (i = 0; i <= mm->max_order; ++i) { >> + struct drm_buddy_block *block; >> + >> + list_for_each_entry_reverse(block, &mm->free_list[i], link) { >> + if (is_clear != drm_buddy_block_is_clear(block)) { >> + if (is_clear) { >> + mark_cleared(block); >> + mm->clear_avail += drm_buddy_block_size(mm, block); >> + } else { >> + clear_reset(block); >> + mm->clear_avail -= drm_buddy_block_size(mm, block); >> + } >> + } >> + } >> + } >> +} >> +EXPORT_SYMBOL(drm_buddy_reset_clear); >> + >> /** >> * drm_buddy_free_block - free a block >> * >> diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h >> index 9689a7c5dd36..513837632b7d 100644 >> --- a/include/drm/drm_buddy.h >> +++ b/include/drm/drm_buddy.h >> @@ -160,6 +160,8 @@ int drm_buddy_block_trim(struct drm_buddy *mm, >> u64 new_size, >> struct list_head *blocks); >> +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear); >> + >> void drm_buddy_free_block(struct drm_buddy *mm, struct drm_buddy_block *block); >> void drm_buddy_free_list(struct drm_buddy *mm, ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v5 2/3] drm/amdgpu: Reset the clear flag in buddy during resume 2025-07-16 10:47 ` Christian König @ 2025-07-16 11:00 ` Arunpravin Paneer Selvam 2025-07-16 11:01 ` Christian König 1 sibling, 0 replies; 6+ messages in thread From: Arunpravin Paneer Selvam @ 2025-07-16 11:00 UTC (permalink / raw) To: Christian König, dri-devel, amd-gfx, matthew.auld, matthew.brost, airlied Cc: alexander.deucher, stable Hi Christian, On 7/16/2025 4:17 PM, Christian König wrote: > On 16.07.25 12:28, Arunpravin Paneer Selvam wrote: >> Hi Dave, >> >> I am trying to push this series into drm-misc-fixes, but I get the below error when dim push-branch drm-misc-fixes. >> >> dim:ERROR:e24c180b4300("drm/amdgpu:Reset the clear flag in buddy during resume"): Mandatory Maintainer Acked-by missing., aborting >> >> Looks like maintainers Acked-by is required to push the patches into drm-misc-fixes ? > Strange, it should work with my Acked-by. Let me give it a try. Sure, thanks! Regards, Arun. > > Regards, > Christian. > >> Regards, >> >> Arun. >> >> On 7/16/2025 1:21 PM, Arunpravin Paneer Selvam wrote: >>> - Added a handler in DRM buddy manager to reset the cleared >>> flag for the blocks in the freelist. >>> >>> - This is necessary because, upon resuming, the VRAM becomes >>> cluttered with BIOS data, yet the VRAM backend manager >>> believes that everything has been cleared. >>> >>> v2: >>> - Add lock before accessing drm_buddy_clear_reset_blocks()(Matthew Auld) >>> - Force merge the two dirty blocks.(Matthew Auld) >>> - Add a new unit test case for this issue.(Matthew Auld) >>> - Having this function being able to flip the state either way would be >>> good. (Matthew Brost) >>> >>> v3(Matthew Auld): >>> - Do merge step first to avoid the use of extra reset flag. >>> >>> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> >>> Suggested-by: Christian König <christian.koenig@amd.com> >>> Acked-by: Christian König <christian.koenig@amd.com> >>> Reviewed-by: Matthew Auld <matthew.auld@intel.com> >>> Cc: stable@vger.kernel.org >>> Fixes: a68c7eaa7a8f ("drm/amdgpu: Enable clear page functionality") >>> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3812 >>> --- >>> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 + >>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 + >>> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 17 ++++++++ >>> drivers/gpu/drm/drm_buddy.c | 43 ++++++++++++++++++++ >>> include/drm/drm_buddy.h | 2 + >>> 5 files changed, 65 insertions(+) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> index 723ab95d8c48..ac92220f9fc3 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> @@ -5327,6 +5327,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients) >>> dev->dev->power.disable_depth--; >>> #endif >>> } >>> + >>> + amdgpu_vram_mgr_clear_reset_blocks(adev); >>> adev->in_suspend = false; >>> if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0)) >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> index 215c198e4aff..2309df3f68a9 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> @@ -155,6 +155,7 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, >>> uint64_t start, uint64_t size); >>> int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, >>> uint64_t start); >>> +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev); >>> bool amdgpu_res_cpu_visible(struct amdgpu_device *adev, >>> struct ttm_resource *res); >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>> index abdc52b0895a..07c936e90d8e 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>> @@ -782,6 +782,23 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr) >>> return atomic64_read(&mgr->vis_usage); >>> } >>> +/** >>> + * amdgpu_vram_mgr_clear_reset_blocks - reset clear blocks >>> + * >>> + * @adev: amdgpu device pointer >>> + * >>> + * Reset the cleared drm buddy blocks. >>> + */ >>> +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev) >>> +{ >>> + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; >>> + struct drm_buddy *mm = &mgr->mm; >>> + >>> + mutex_lock(&mgr->lock); >>> + drm_buddy_reset_clear(mm, false); >>> + mutex_unlock(&mgr->lock); >>> +} >>> + >>> /** >>> * amdgpu_vram_mgr_intersects - test each drm buddy block for intersection >>> * >>> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c >>> index a1e652b7631d..a94061f373de 100644 >>> --- a/drivers/gpu/drm/drm_buddy.c >>> +++ b/drivers/gpu/drm/drm_buddy.c >>> @@ -405,6 +405,49 @@ drm_get_buddy(struct drm_buddy_block *block) >>> } >>> EXPORT_SYMBOL(drm_get_buddy); >>> +/** >>> + * drm_buddy_reset_clear - reset blocks clear state >>> + * >>> + * @mm: DRM buddy manager >>> + * @is_clear: blocks clear state >>> + * >>> + * Reset the clear state based on @is_clear value for each block >>> + * in the freelist. >>> + */ >>> +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear) >>> +{ >>> + u64 root_size, size, start; >>> + unsigned int order; >>> + int i; >>> + >>> + size = mm->size; >>> + for (i = 0; i < mm->n_roots; ++i) { >>> + order = ilog2(size) - ilog2(mm->chunk_size); >>> + start = drm_buddy_block_offset(mm->roots[i]); >>> + __force_merge(mm, start, start + size, order); >>> + >>> + root_size = mm->chunk_size << order; >>> + size -= root_size; >>> + } >>> + >>> + for (i = 0; i <= mm->max_order; ++i) { >>> + struct drm_buddy_block *block; >>> + >>> + list_for_each_entry_reverse(block, &mm->free_list[i], link) { >>> + if (is_clear != drm_buddy_block_is_clear(block)) { >>> + if (is_clear) { >>> + mark_cleared(block); >>> + mm->clear_avail += drm_buddy_block_size(mm, block); >>> + } else { >>> + clear_reset(block); >>> + mm->clear_avail -= drm_buddy_block_size(mm, block); >>> + } >>> + } >>> + } >>> + } >>> +} >>> +EXPORT_SYMBOL(drm_buddy_reset_clear); >>> + >>> /** >>> * drm_buddy_free_block - free a block >>> * >>> diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h >>> index 9689a7c5dd36..513837632b7d 100644 >>> --- a/include/drm/drm_buddy.h >>> +++ b/include/drm/drm_buddy.h >>> @@ -160,6 +160,8 @@ int drm_buddy_block_trim(struct drm_buddy *mm, >>> u64 new_size, >>> struct list_head *blocks); >>> +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear); >>> + >>> void drm_buddy_free_block(struct drm_buddy *mm, struct drm_buddy_block *block); >>> void drm_buddy_free_list(struct drm_buddy *mm, ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v5 2/3] drm/amdgpu: Reset the clear flag in buddy during resume 2025-07-16 10:47 ` Christian König 2025-07-16 11:00 ` Arunpravin Paneer Selvam @ 2025-07-16 11:01 ` Christian König 2025-07-16 11:37 ` Arunpravin Paneer Selvam 1 sibling, 1 reply; 6+ messages in thread From: Christian König @ 2025-07-16 11:01 UTC (permalink / raw) To: Arunpravin Paneer Selvam, dri-devel, amd-gfx, matthew.auld, matthew.brost, airlied Cc: alexander.deucher, stable On 16.07.25 12:47, Christian König wrote: > On 16.07.25 12:28, Arunpravin Paneer Selvam wrote: >> Hi Dave, >> >> I am trying to push this series into drm-misc-fixes, but I get the below error when dim push-branch drm-misc-fixes. >> >> dim:ERROR:e24c180b4300("drm/amdgpu:Reset the clear flag in buddy during resume"): Mandatory Maintainer Acked-by missing., aborting >> >> Looks like maintainers Acked-by is required to push the patches into drm-misc-fixes ? > > Strange, it should work with my Acked-by. Let me give it a try. I successfully pushed the patch to drm-misc-fixes. No idea why that didn't worked for you. Maybe update your dim script Arun. Regards, Christian. > > Regards, > Christian. > >> >> Regards, >> >> Arun. >> >> On 7/16/2025 1:21 PM, Arunpravin Paneer Selvam wrote: >>> - Added a handler in DRM buddy manager to reset the cleared >>> flag for the blocks in the freelist. >>> >>> - This is necessary because, upon resuming, the VRAM becomes >>> cluttered with BIOS data, yet the VRAM backend manager >>> believes that everything has been cleared. >>> >>> v2: >>> - Add lock before accessing drm_buddy_clear_reset_blocks()(Matthew Auld) >>> - Force merge the two dirty blocks.(Matthew Auld) >>> - Add a new unit test case for this issue.(Matthew Auld) >>> - Having this function being able to flip the state either way would be >>> good. (Matthew Brost) >>> >>> v3(Matthew Auld): >>> - Do merge step first to avoid the use of extra reset flag. >>> >>> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> >>> Suggested-by: Christian König <christian.koenig@amd.com> >>> Acked-by: Christian König <christian.koenig@amd.com> >>> Reviewed-by: Matthew Auld <matthew.auld@intel.com> >>> Cc: stable@vger.kernel.org >>> Fixes: a68c7eaa7a8f ("drm/amdgpu: Enable clear page functionality") >>> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3812 >>> --- >>> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 + >>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 + >>> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 17 ++++++++ >>> drivers/gpu/drm/drm_buddy.c | 43 ++++++++++++++++++++ >>> include/drm/drm_buddy.h | 2 + >>> 5 files changed, 65 insertions(+) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> index 723ab95d8c48..ac92220f9fc3 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> @@ -5327,6 +5327,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients) >>> dev->dev->power.disable_depth--; >>> #endif >>> } >>> + >>> + amdgpu_vram_mgr_clear_reset_blocks(adev); >>> adev->in_suspend = false; >>> if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0)) >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> index 215c198e4aff..2309df3f68a9 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> @@ -155,6 +155,7 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, >>> uint64_t start, uint64_t size); >>> int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, >>> uint64_t start); >>> +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev); >>> bool amdgpu_res_cpu_visible(struct amdgpu_device *adev, >>> struct ttm_resource *res); >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>> index abdc52b0895a..07c936e90d8e 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>> @@ -782,6 +782,23 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr) >>> return atomic64_read(&mgr->vis_usage); >>> } >>> +/** >>> + * amdgpu_vram_mgr_clear_reset_blocks - reset clear blocks >>> + * >>> + * @adev: amdgpu device pointer >>> + * >>> + * Reset the cleared drm buddy blocks. >>> + */ >>> +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev) >>> +{ >>> + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; >>> + struct drm_buddy *mm = &mgr->mm; >>> + >>> + mutex_lock(&mgr->lock); >>> + drm_buddy_reset_clear(mm, false); >>> + mutex_unlock(&mgr->lock); >>> +} >>> + >>> /** >>> * amdgpu_vram_mgr_intersects - test each drm buddy block for intersection >>> * >>> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c >>> index a1e652b7631d..a94061f373de 100644 >>> --- a/drivers/gpu/drm/drm_buddy.c >>> +++ b/drivers/gpu/drm/drm_buddy.c >>> @@ -405,6 +405,49 @@ drm_get_buddy(struct drm_buddy_block *block) >>> } >>> EXPORT_SYMBOL(drm_get_buddy); >>> +/** >>> + * drm_buddy_reset_clear - reset blocks clear state >>> + * >>> + * @mm: DRM buddy manager >>> + * @is_clear: blocks clear state >>> + * >>> + * Reset the clear state based on @is_clear value for each block >>> + * in the freelist. >>> + */ >>> +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear) >>> +{ >>> + u64 root_size, size, start; >>> + unsigned int order; >>> + int i; >>> + >>> + size = mm->size; >>> + for (i = 0; i < mm->n_roots; ++i) { >>> + order = ilog2(size) - ilog2(mm->chunk_size); >>> + start = drm_buddy_block_offset(mm->roots[i]); >>> + __force_merge(mm, start, start + size, order); >>> + >>> + root_size = mm->chunk_size << order; >>> + size -= root_size; >>> + } >>> + >>> + for (i = 0; i <= mm->max_order; ++i) { >>> + struct drm_buddy_block *block; >>> + >>> + list_for_each_entry_reverse(block, &mm->free_list[i], link) { >>> + if (is_clear != drm_buddy_block_is_clear(block)) { >>> + if (is_clear) { >>> + mark_cleared(block); >>> + mm->clear_avail += drm_buddy_block_size(mm, block); >>> + } else { >>> + clear_reset(block); >>> + mm->clear_avail -= drm_buddy_block_size(mm, block); >>> + } >>> + } >>> + } >>> + } >>> +} >>> +EXPORT_SYMBOL(drm_buddy_reset_clear); >>> + >>> /** >>> * drm_buddy_free_block - free a block >>> * >>> diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h >>> index 9689a7c5dd36..513837632b7d 100644 >>> --- a/include/drm/drm_buddy.h >>> +++ b/include/drm/drm_buddy.h >>> @@ -160,6 +160,8 @@ int drm_buddy_block_trim(struct drm_buddy *mm, >>> u64 new_size, >>> struct list_head *blocks); >>> +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear); >>> + >>> void drm_buddy_free_block(struct drm_buddy *mm, struct drm_buddy_block *block); >>> void drm_buddy_free_list(struct drm_buddy *mm, > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v5 2/3] drm/amdgpu: Reset the clear flag in buddy during resume 2025-07-16 11:01 ` Christian König @ 2025-07-16 11:37 ` Arunpravin Paneer Selvam 0 siblings, 0 replies; 6+ messages in thread From: Arunpravin Paneer Selvam @ 2025-07-16 11:37 UTC (permalink / raw) To: Christian König, dri-devel, amd-gfx, matthew.auld, matthew.brost, airlied Cc: alexander.deucher, stable On 7/16/2025 4:31 PM, Christian König wrote: > On 16.07.25 12:47, Christian König wrote: >> On 16.07.25 12:28, Arunpravin Paneer Selvam wrote: >>> Hi Dave, >>> >>> I am trying to push this series into drm-misc-fixes, but I get the below error when dim push-branch drm-misc-fixes. >>> >>> dim:ERROR:e24c180b4300("drm/amdgpu:Reset the clear flag in buddy during resume"): Mandatory Maintainer Acked-by missing., aborting >>> >>> Looks like maintainers Acked-by is required to push the patches into drm-misc-fixes ? >> Strange, it should work with my Acked-by. Let me give it a try. > I successfully pushed the patch to drm-misc-fixes. > > No idea why that didn't worked for you. Maybe update your dim script Arun. Thanks Christian, I will check the dim script. Regards, Arun. > > Regards, > Christian. > >> Regards, >> Christian. >> >>> Regards, >>> >>> Arun. >>> >>> On 7/16/2025 1:21 PM, Arunpravin Paneer Selvam wrote: >>>> - Added a handler in DRM buddy manager to reset the cleared >>>> flag for the blocks in the freelist. >>>> >>>> - This is necessary because, upon resuming, the VRAM becomes >>>> cluttered with BIOS data, yet the VRAM backend manager >>>> believes that everything has been cleared. >>>> >>>> v2: >>>> - Add lock before accessing drm_buddy_clear_reset_blocks()(Matthew Auld) >>>> - Force merge the two dirty blocks.(Matthew Auld) >>>> - Add a new unit test case for this issue.(Matthew Auld) >>>> - Having this function being able to flip the state either way would be >>>> good. (Matthew Brost) >>>> >>>> v3(Matthew Auld): >>>> - Do merge step first to avoid the use of extra reset flag. >>>> >>>> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> >>>> Suggested-by: Christian König <christian.koenig@amd.com> >>>> Acked-by: Christian König <christian.koenig@amd.com> >>>> Reviewed-by: Matthew Auld <matthew.auld@intel.com> >>>> Cc: stable@vger.kernel.org >>>> Fixes: a68c7eaa7a8f ("drm/amdgpu: Enable clear page functionality") >>>> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3812 >>>> --- >>>> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 + >>>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 + >>>> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 17 ++++++++ >>>> drivers/gpu/drm/drm_buddy.c | 43 ++++++++++++++++++++ >>>> include/drm/drm_buddy.h | 2 + >>>> 5 files changed, 65 insertions(+) >>>> >>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>>> index 723ab95d8c48..ac92220f9fc3 100644 >>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>>> @@ -5327,6 +5327,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients) >>>> dev->dev->power.disable_depth--; >>>> #endif >>>> } >>>> + >>>> + amdgpu_vram_mgr_clear_reset_blocks(adev); >>>> adev->in_suspend = false; >>>> if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0)) >>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>>> index 215c198e4aff..2309df3f68a9 100644 >>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>>> @@ -155,6 +155,7 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr, >>>> uint64_t start, uint64_t size); >>>> int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr, >>>> uint64_t start); >>>> +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev); >>>> bool amdgpu_res_cpu_visible(struct amdgpu_device *adev, >>>> struct ttm_resource *res); >>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>>> index abdc52b0895a..07c936e90d8e 100644 >>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c >>>> @@ -782,6 +782,23 @@ uint64_t amdgpu_vram_mgr_vis_usage(struct amdgpu_vram_mgr *mgr) >>>> return atomic64_read(&mgr->vis_usage); >>>> } >>>> +/** >>>> + * amdgpu_vram_mgr_clear_reset_blocks - reset clear blocks >>>> + * >>>> + * @adev: amdgpu device pointer >>>> + * >>>> + * Reset the cleared drm buddy blocks. >>>> + */ >>>> +void amdgpu_vram_mgr_clear_reset_blocks(struct amdgpu_device *adev) >>>> +{ >>>> + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; >>>> + struct drm_buddy *mm = &mgr->mm; >>>> + >>>> + mutex_lock(&mgr->lock); >>>> + drm_buddy_reset_clear(mm, false); >>>> + mutex_unlock(&mgr->lock); >>>> +} >>>> + >>>> /** >>>> * amdgpu_vram_mgr_intersects - test each drm buddy block for intersection >>>> * >>>> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c >>>> index a1e652b7631d..a94061f373de 100644 >>>> --- a/drivers/gpu/drm/drm_buddy.c >>>> +++ b/drivers/gpu/drm/drm_buddy.c >>>> @@ -405,6 +405,49 @@ drm_get_buddy(struct drm_buddy_block *block) >>>> } >>>> EXPORT_SYMBOL(drm_get_buddy); >>>> +/** >>>> + * drm_buddy_reset_clear - reset blocks clear state >>>> + * >>>> + * @mm: DRM buddy manager >>>> + * @is_clear: blocks clear state >>>> + * >>>> + * Reset the clear state based on @is_clear value for each block >>>> + * in the freelist. >>>> + */ >>>> +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear) >>>> +{ >>>> + u64 root_size, size, start; >>>> + unsigned int order; >>>> + int i; >>>> + >>>> + size = mm->size; >>>> + for (i = 0; i < mm->n_roots; ++i) { >>>> + order = ilog2(size) - ilog2(mm->chunk_size); >>>> + start = drm_buddy_block_offset(mm->roots[i]); >>>> + __force_merge(mm, start, start + size, order); >>>> + >>>> + root_size = mm->chunk_size << order; >>>> + size -= root_size; >>>> + } >>>> + >>>> + for (i = 0; i <= mm->max_order; ++i) { >>>> + struct drm_buddy_block *block; >>>> + >>>> + list_for_each_entry_reverse(block, &mm->free_list[i], link) { >>>> + if (is_clear != drm_buddy_block_is_clear(block)) { >>>> + if (is_clear) { >>>> + mark_cleared(block); >>>> + mm->clear_avail += drm_buddy_block_size(mm, block); >>>> + } else { >>>> + clear_reset(block); >>>> + mm->clear_avail -= drm_buddy_block_size(mm, block); >>>> + } >>>> + } >>>> + } >>>> + } >>>> +} >>>> +EXPORT_SYMBOL(drm_buddy_reset_clear); >>>> + >>>> /** >>>> * drm_buddy_free_block - free a block >>>> * >>>> diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h >>>> index 9689a7c5dd36..513837632b7d 100644 >>>> --- a/include/drm/drm_buddy.h >>>> +++ b/include/drm/drm_buddy.h >>>> @@ -160,6 +160,8 @@ int drm_buddy_block_trim(struct drm_buddy *mm, >>>> u64 new_size, >>>> struct list_head *blocks); >>>> +void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear); >>>> + >>>> void drm_buddy_free_block(struct drm_buddy *mm, struct drm_buddy_block *block); >>>> void drm_buddy_free_list(struct drm_buddy *mm, ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-07-16 11:37 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20250716075125.240637-1-Arunpravin.PaneerSelvam@amd.com>
2025-07-16 7:51 ` [PATCH v5 2/3] drm/amdgpu: Reset the clear flag in buddy during resume Arunpravin Paneer Selvam
2025-07-16 10:28 ` Arunpravin Paneer Selvam
2025-07-16 10:47 ` Christian König
2025-07-16 11:00 ` Arunpravin Paneer Selvam
2025-07-16 11:01 ` Christian König
2025-07-16 11:37 ` Arunpravin Paneer Selvam
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox