mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-08 06:58:25 +02:00
intel-gem: Fix regression tests.
Main fix is an oops that was triggered by the gtt pwrite path when we don't have the gtt initialized. Also, settle on -EBADF for "bad object handle", and -EINVAL for "reading/writing beyond object boundary".
This commit is contained in:
parent
f85fd1b42d
commit
1bdf35fe19
3 changed files with 24 additions and 14 deletions
|
|
@ -127,7 +127,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
|
|||
|
||||
obj = drm_gem_object_lookup(dev, file_priv, args->handle);
|
||||
if (obj == NULL)
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
obj_priv = obj->driver_private;
|
||||
|
||||
/* Bounds check source.
|
||||
|
|
@ -137,7 +137,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
|
|||
if (args->offset > obj->size || args->size > obj->size ||
|
||||
args->offset + args->size > obj->size) {
|
||||
drm_gem_object_unreference(obj);
|
||||
return -EFAULT;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
|
|
@ -326,7 +326,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
|
|||
|
||||
obj = drm_gem_object_lookup(dev, file_priv, args->handle);
|
||||
if (obj == NULL)
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
obj_priv = obj->driver_private;
|
||||
|
||||
/** Bounds check destination.
|
||||
|
|
@ -336,7 +336,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
|
|||
if (args->offset > obj->size || args->size > obj->size ||
|
||||
args->offset + args->size > obj->size) {
|
||||
drm_gem_object_unreference(obj);
|
||||
return -EFAULT;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* We can only do the GTT pwrite on untiled buffers, as otherwise
|
||||
|
|
@ -345,7 +345,8 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
|
|||
* pread/pwrite currently are reading and writing from the CPU
|
||||
* perspective, requiring manual detiling by the client.
|
||||
*/
|
||||
if (obj_priv->tiling_mode == I915_TILING_NONE)
|
||||
if (obj_priv->tiling_mode == I915_TILING_NONE &&
|
||||
dev->gtt_total != 0)
|
||||
ret = i915_gem_gtt_pwrite(dev, obj, args, file_priv);
|
||||
else
|
||||
ret = i915_gem_shmem_pwrite(dev, obj, args, file_priv);
|
||||
|
|
@ -376,7 +377,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
|
|||
|
||||
obj = drm_gem_object_lookup(dev, file_priv, args->handle);
|
||||
if (obj == NULL)
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
ret = i915_gem_set_domain(obj, file_priv,
|
||||
|
|
@ -405,7 +406,7 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
|
|||
obj = drm_gem_object_lookup(dev, file_priv, args->handle);
|
||||
if (obj == NULL) {
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
#if WATCH_BUF
|
||||
|
|
@ -446,7 +447,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
|
|||
|
||||
obj = drm_gem_object_lookup(dev, file_priv, args->handle);
|
||||
if (obj == NULL)
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
|
||||
offset = args->offset;
|
||||
|
||||
|
|
@ -1517,7 +1518,7 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj,
|
|||
reloc.target_handle);
|
||||
if (target_obj == NULL) {
|
||||
i915_gem_object_unpin(obj);
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
}
|
||||
target_obj_priv = target_obj->driver_private;
|
||||
|
||||
|
|
@ -1818,7 +1819,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
|
|||
if (object_list[i] == NULL) {
|
||||
DRM_ERROR("Invalid object handle %d at index %d\n",
|
||||
exec_list[i].handle, i);
|
||||
ret = -EINVAL;
|
||||
ret = -EBADF;
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
|
@ -2029,7 +2030,7 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data,
|
|||
DRM_ERROR("Bad handle in i915_gem_pin_ioctl(): %d\n",
|
||||
args->handle);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
}
|
||||
obj_priv = obj->driver_private;
|
||||
|
||||
|
|
@ -2069,7 +2070,7 @@ i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
|
|||
DRM_ERROR("Bad handle in i915_gem_unpin_ioctl(): %d\n",
|
||||
args->handle);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
i915_gem_object_unpin(obj);
|
||||
|
|
@ -2093,7 +2094,7 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
|
|||
DRM_ERROR("Bad handle in i915_gem_busy_ioctl(): %d\n",
|
||||
args->handle);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return -EINVAL;
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
obj_priv = obj->driver_private;
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ int main(int argc, char **argv)
|
|||
mmap.size = 4096;
|
||||
printf("Testing mmaping of bad object.\n");
|
||||
ret = ioctl(fd, DRM_IOCTL_I915_GEM_MMAP, &mmap);
|
||||
assert(ret == -1 && errno == EINVAL);
|
||||
assert(ret == -1 && errno == EBADF);
|
||||
|
||||
memset(&create, 0, sizeof(create));
|
||||
create.size = OBJECT_SIZE;
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ int main(int argc, char **argv)
|
|||
|
||||
printf("Testing read beyond end of buffer.\n");
|
||||
ret = do_read(fd, handle, buf, OBJECT_SIZE / 2, OBJECT_SIZE);
|
||||
printf("%d %d\n", ret, errno);
|
||||
assert(ret == -1 && errno == EINVAL);
|
||||
|
||||
printf("Testing full write of buffer\n");
|
||||
|
|
@ -120,6 +121,14 @@ int main(int argc, char **argv)
|
|||
assert(ret == 0);
|
||||
assert(memcmp(buf, expected + 512, 1024) == 0);
|
||||
|
||||
printf("Testing read of bad buffer handle\n");
|
||||
ret = do_read(fd, 1234, buf, 0, 1024);
|
||||
assert(ret == -1 && errno == EBADF);
|
||||
|
||||
printf("Testing write of bad buffer handle\n");
|
||||
ret = do_write(fd, 1234, buf, 0, 1024);
|
||||
assert(ret == -1 && errno == EBADF);
|
||||
|
||||
close(fd);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue