hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/qxl/qxl_ioctl.c
....@@ -89,11 +89,11 @@
8989 {
9090 void *reloc_page;
9191
92
- reloc_page = qxl_bo_kmap_local_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK);
92
+ reloc_page = qxl_bo_kmap_atomic_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK);
9393 *(uint64_t *)(reloc_page + (info->dst_offset & ~PAGE_MASK)) = qxl_bo_physical_address(qdev,
9494 info->src_bo,
9595 info->src_offset);
96
- qxl_bo_kunmap_local_page(qdev, info->dst_bo, reloc_page);
96
+ qxl_bo_kunmap_atomic_page(qdev, info->dst_bo, reloc_page);
9797 }
9898
9999 static void
....@@ -105,9 +105,9 @@
105105 if (info->src_bo && !info->src_bo->is_primary)
106106 id = info->src_bo->surface_id;
107107
108
- reloc_page = qxl_bo_kmap_local_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK);
108
+ reloc_page = qxl_bo_kmap_atomic_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK);
109109 *(uint32_t *)(reloc_page + (info->dst_offset & ~PAGE_MASK)) = id;
110
- qxl_bo_kunmap_local_page(qdev, info->dst_bo, reloc_page);
110
+ qxl_bo_kunmap_atomic_page(qdev, info->dst_bo, reloc_page);
111111 }
112112
113113 /* return holding the reference to this object */
....@@ -149,6 +149,7 @@
149149 struct qxl_bo *cmd_bo;
150150 void *fb_cmd;
151151 int i, ret, num_relocs;
152
+ int unwritten;
152153
153154 switch (cmd->type) {
154155 case QXL_CMD_DRAW:
....@@ -184,21 +185,21 @@
184185 goto out_free_reloc;
185186
186187 /* TODO copy slow path code from i915 */
187
- fb_cmd = qxl_bo_kmap_local_page(qdev, cmd_bo, (release->release_offset & PAGE_MASK));
188
+ fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_MASK));
189
+ unwritten = __copy_from_user_inatomic_nocache
190
+ (fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_MASK),
191
+ u64_to_user_ptr(cmd->command), cmd->command_size);
188192
189
- if (copy_from_user(fb_cmd + sizeof(union qxl_release_info) +
190
- (release->release_offset & ~PAGE_MASK),
191
- u64_to_user_ptr(cmd->command), cmd->command_size)) {
192
- ret = -EFAULT;
193
- } else {
193
+ {
194194 struct qxl_drawable *draw = fb_cmd;
195195
196196 draw->mm_time = qdev->rom->mm_clock;
197197 }
198198
199
- qxl_bo_kunmap_local_page(qdev, cmd_bo, fb_cmd);
200
- if (ret) {
201
- DRM_ERROR("copy from user failed %d\n", ret);
199
+ qxl_bo_kunmap_atomic_page(qdev, cmd_bo, fb_cmd);
200
+ if (unwritten) {
201
+ DRM_ERROR("got unwritten %d\n", unwritten);
202
+ ret = -EFAULT;
202203 goto out_free_release;
203204 }
204205