amdgpu_ttm_tt_mark_user_pages() dirties pages obtained from get_user_pages() while holding only a page reference - no page lock, no page table lock. set_page_dirty() requires the caller to keep the folio from being truncated, otherwise the address_space can be freed between the folio_mapping() load and the ->dirty_folio() call.
Use set_page_dirty_lock(), which takes the folio lock around the update. The upstream gup helper unpin_user_pages_dirty_lock() does the same for this reason. Signed-off-by: Perry Yuan <[email protected]> Reviewed-by: Christian König <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 07f8854bc80c..4bc6ba074c23 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -971,8 +971,9 @@ void amdgpu_ttm_tt_mark_user_pages(struct ttm_tt *ttm) if (!page) continue; + /* The caller does not hold the page lock. */ if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY)) - set_page_dirty(page); + set_page_dirty_lock(page); mark_page_accessed(page); } -- 2.34.1
