Преглед изворни кода

drm/amdgpu: fix amdgpu_bo_unreserve order in GEM_OP IOCTL v2

No copy_(to|from)_user while BO is reserved.

v2: handle default path as well

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Christian König пре 10 година
родитељ
комит
4c28fb0b27
1 измењених фајлова са 4 додато и 1 уклоњено
  1. 4 1
      drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c

+ 4 - 1
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c

@@ -615,6 +615,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
 		info.alignment = robj->tbo.mem.page_alignment << PAGE_SHIFT;
 		info.alignment = robj->tbo.mem.page_alignment << PAGE_SHIFT;
 		info.domains = robj->initial_domain;
 		info.domains = robj->initial_domain;
 		info.domain_flags = robj->flags;
 		info.domain_flags = robj->flags;
+		amdgpu_bo_unreserve(robj);
 		if (copy_to_user(out, &info, sizeof(info)))
 		if (copy_to_user(out, &info, sizeof(info)))
 			r = -EFAULT;
 			r = -EFAULT;
 		break;
 		break;
@@ -622,17 +623,19 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
 	case AMDGPU_GEM_OP_SET_PLACEMENT:
 	case AMDGPU_GEM_OP_SET_PLACEMENT:
 		if (amdgpu_ttm_tt_has_userptr(robj->tbo.ttm)) {
 		if (amdgpu_ttm_tt_has_userptr(robj->tbo.ttm)) {
 			r = -EPERM;
 			r = -EPERM;
+			amdgpu_bo_unreserve(robj);
 			break;
 			break;
 		}
 		}
 		robj->initial_domain = args->value & (AMDGPU_GEM_DOMAIN_VRAM |
 		robj->initial_domain = args->value & (AMDGPU_GEM_DOMAIN_VRAM |
 						      AMDGPU_GEM_DOMAIN_GTT |
 						      AMDGPU_GEM_DOMAIN_GTT |
 						      AMDGPU_GEM_DOMAIN_CPU);
 						      AMDGPU_GEM_DOMAIN_CPU);
+		amdgpu_bo_unreserve(robj);
 		break;
 		break;
 	default:
 	default:
+		amdgpu_bo_unreserve(robj);
 		r = -EINVAL;
 		r = -EINVAL;
 	}
 	}
 
 
-	amdgpu_bo_unreserve(robj);
 out:
 out:
 	drm_gem_object_unreference_unlocked(gobj);
 	drm_gem_object_unreference_unlocked(gobj);
 	return r;
 	return r;