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

Reply via email to