Fix missing member settings in obj/obj_priv, and some error paths.
authorEric Anholt <eric@anholt.net>
Thu, 1 May 2008 23:48:25 +0000 (16:48 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 1 May 2008 23:48:25 +0000 (16:48 -0700)
linux-core/drm_gem.c
linux-core/i915_gem.c

index f6038d5..ee3dbe4 100644 (file)
@@ -80,6 +80,7 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size)
        }
 
        obj->refcount = 1;
+       obj->size = size;
 
        if (dev->driver->gem_init_object != NULL &&
            dev->driver->gem_init_object(dev, obj) != 0) {
index 09c94c3..5ba4851 100644 (file)
@@ -106,6 +106,9 @@ i915_gem_object_bind_to_gtt(struct drm_device *dev, struct drm_gem_object *obj)
        obj_priv->gtt_space = drm_memrange_get_block(free_space,
                                                     obj->size,
                                                     PAGE_SIZE);
+       obj_priv->gtt_offset = obj_priv->gtt_space->start;
+
+       DRM_INFO("Binding object of size %d at 0x%08x\n", obj->size, obj_priv->gtt_offset);
 
        /* Get the list of pages out of our struct file.  They'll be pinned
         * at this point until we release them.
@@ -120,6 +123,8 @@ i915_gem_object_bind_to_gtt(struct drm_device *dev, struct drm_gem_object *obj)
 
                if (obj_priv->page_list[i] == NULL) {
                        i915_gem_object_free_page_list(dev, obj);
+                       drm_memrange_put_block(obj_priv->gtt_space);
+                       obj_priv->gtt_space = NULL;
                        return -ENOMEM;
                }
        }
@@ -133,6 +138,8 @@ i915_gem_object_bind_to_gtt(struct drm_device *dev, struct drm_gem_object *obj)
                                               obj_priv->gtt_offset);
        if (obj_priv->agp_mem == NULL) {
                i915_gem_object_free_page_list(dev, obj);
+               drm_memrange_put_block(obj_priv->gtt_space);
+               obj_priv->gtt_space = NULL;
                return -ENOMEM;
        }