Skip to content

Commit f4d8890

Browse files
trueptolemytursulin
authored andcommitted
drm/i915: Use memcpy_[from/to]_page() in gem/i915_gem_pyhs.c
The use of kmap_atomic() is being deprecated in favor of kmap_local_page()[1], and this patch converts the call from kmap_atomic() + memcpy() to memcpy_[from/to]_page(), which use kmap_local_page() to build local mapping and then do memcpy(). The main difference between atomic and local mappings is that local mappings doesn't disable page faults or preemption (the preemption is disabled for !PREEMPT_RT case, otherwise it only disables migration). With kmap_local_page(), we can avoid the often unwanted side effect of unnecessary page faults and preemption disables. In drm/i915/gem/i915_gem_phys.c, the functions i915_gem_object_get_pages_phys() and i915_gem_object_put_pages_phys() don't need to disable pagefaults and preemption for mapping because of 2 reasons: 1. The flush operation is safe. In drm/i915/gem/i915_gem_object.c, i915_gem_object_get_pages_phys() and i915_gem_object_put_pages_phys() calls drm_clflush_virt_range() to use CLFLUSHOPT or WBINVD to flush. Since CLFLUSHOPT is global on x86 and WBINVD is called on each cpu in drm_clflush_virt_range(), the flush operation is global. 2. Any context switch caused by preemption or page faults (page fault may cause sleep) doesn't affect the validity of local mapping. Therefore, i915_gem_object_get_pages_phys() and i915_gem_object_put_pages_phys() are two functions where the uses of local mappings in place of atomic mappings are correctly suited. Convert the calls of kmap_atomic() / kunmap_atomic() + memcpy() to memcpy_from_page() and memcpy_to_page(). [1]: https://lore.kernel.org/all/20220813220034.806698-1-ira.weiny@intel.com Suggested-by: Dave Hansen <dave.hansen@intel.com> Suggested-by: Ira Weiny <ira.weiny@intel.com> Suggested-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> Signed-off-by: Zhao Liu <zhao1.liu@intel.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20231203132947.2328805-3-zhao1.liu@linux.intel.com
1 parent e6174e8 commit f4d8890

File tree

1 file changed

+2
-8
lines changed

1 file changed

+2
-8
lines changed

drivers/gpu/drm/i915/gem/i915_gem_phys.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,13 @@ static int i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
6565
dst = vaddr;
6666
for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
6767
struct page *page;
68-
void *src;
6968

7069
page = shmem_read_mapping_page(mapping, i);
7170
if (IS_ERR(page))
7271
goto err_st;
7372

74-
src = kmap_atomic(page);
75-
memcpy(dst, src, PAGE_SIZE);
73+
memcpy_from_page(dst, page, 0, PAGE_SIZE);
7674
drm_clflush_virt_range(dst, PAGE_SIZE);
77-
kunmap_atomic(src);
7875

7976
put_page(page);
8077
dst += PAGE_SIZE;
@@ -113,16 +110,13 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
113110

114111
for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
115112
struct page *page;
116-
char *dst;
117113

118114
page = shmem_read_mapping_page(mapping, i);
119115
if (IS_ERR(page))
120116
continue;
121117

122-
dst = kmap_atomic(page);
123118
drm_clflush_virt_range(src, PAGE_SIZE);
124-
memcpy(dst, src, PAGE_SIZE);
125-
kunmap_atomic(dst);
119+
memcpy_to_page(page, 0, src, PAGE_SIZE);
126120

127121
set_page_dirty(page);
128122
if (obj->mm.madv == I915_MADV_WILLNEED)

0 commit comments

Comments
 (0)