intel-gem: Fix regression tests.
authorEric Anholt <eric@anholt.net>
Mon, 28 Jul 2008 18:24:00 +0000 (11:24 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 28 Jul 2008 18:29:16 +0000 (11:29 -0700)
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".

linux-core/i915_gem.c
tests/gem_mmap.c
tests/gem_readwrite.c

index eea2d48..4f207d6 100644 (file)
@@ -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;
index c3a5188..b5c1546 100644 (file)
@@ -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;
index 54b25ea..bd1d232 100644 (file)
@@ -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;