* [PATCH 0/6] make gem_object embedable and convert i915 driver
@ 2010-04-09 19:05 Daniel Vetter
2010-04-09 19:05 ` [PATCH 1/6] drm: extract drm_gem_object_init Daniel Vetter
` (6 more replies)
0 siblings, 7 replies; 11+ messages in thread
From: Daniel Vetter @ 2010-04-09 19:05 UTC (permalink / raw)
To: intel-gfx; +Cc: dri-devel, Daniel Vetter
Hi all,
As promised here's my patch series to make struct drm_gem_object embedable.
Also converts drm/i915 as a proof of concept.
I've already looked at the radeon and nouveau modules and a straightforward
replament of the gem_object pointer looks simple. But I think embedding it
into the ttm_bo is better long-term. Stuff like duplicated ref-counting
between the ttm object and the gem one just doesn't make too much sense.
Tested on my i945GM. The changes to radeon and nouveau in patch 2 are only
compile-tested, but the identical change to the i915 survived testing.
Comments on the patches and my future plans highly welcome.
Yours, Daniel
Daniel Vetter (6):
drm: extract drm_gem_object_init
drm: free core gem object from driver callbacks
drm/i915: introduce i915_gem_alloc_object
drm/i915: embed the gem object into drm_i915_gem_object
drm/i915: don't use ->driver_private anymore
drm/i915: drop pointer to drm_gem_object
drivers/gpu/drm/drm_gem.c | 49 +++++++++++++-------
drivers/gpu/drm/i915/i915_debugfs.c | 15 +++---
drivers/gpu/drm/i915/i915_drv.h | 6 ++-
drivers/gpu/drm/i915/i915_gem.c | 80 ++++++++++++++++++---------------
drivers/gpu/drm/i915/i915_gem_debug.c | 2 +-
drivers/gpu/drm/i915/i915_irq.c | 4 +-
drivers/gpu/drm/i915/intel_display.c | 2 +-
drivers/gpu/drm/i915/intel_fb.c | 2 +-
drivers/gpu/drm/i915/intel_overlay.c | 8 ++--
drivers/gpu/drm/nouveau/nouveau_gem.c | 3 +
drivers/gpu/drm/radeon/radeon_gem.c | 3 +
include/drm/drmP.h | 3 +
12 files changed, 105 insertions(+), 72 deletions(-)
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/6] drm: extract drm_gem_object_init
2010-04-09 19:05 [PATCH 0/6] make gem_object embedable and convert i915 driver Daniel Vetter
@ 2010-04-09 19:05 ` Daniel Vetter
2010-04-09 19:05 ` [PATCH 2/6] drm: free core gem object from driver callbacks Daniel Vetter
` (5 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Daniel Vetter @ 2010-04-09 19:05 UTC (permalink / raw)
To: intel-gfx; +Cc: dri-devel, Daniel Vetter
This function can be used by drivers who allocate the drm gem object
on their own. No functional change in here, just preparation.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/drm_gem.c | 39 +++++++++++++++++++++++++++++----------
include/drm/drmP.h | 2 ++
2 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index aa89d4b..3b64d0e 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -124,6 +124,31 @@ drm_gem_destroy(struct drm_device *dev)
}
/**
+ * Initialize an already allocate GEM object of the specified size with
+ * shmfs backing store.
+ */
+int drm_gem_object_init(struct drm_device *dev,
+ struct drm_gem_object *obj, size_t size)
+{
+ BUG_ON((size & (PAGE_SIZE - 1)) != 0);
+
+ obj->dev = dev;
+ obj->filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
+ if (IS_ERR(obj->filp))
+ return -ENOMEM;
+
+ kref_init(&obj->refcount);
+ kref_init(&obj->handlecount);
+ obj->size = size;
+
+ atomic_inc(&dev->object_count);
+ atomic_add(obj->size, &dev->object_memory);
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_gem_object_init);
+
+/**
* Allocate a GEM object of the specified size with shmfs backing store
*/
struct drm_gem_object *
@@ -131,28 +156,22 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size)
{
struct drm_gem_object *obj;
- BUG_ON((size & (PAGE_SIZE - 1)) != 0);
-
obj = kzalloc(sizeof(*obj), GFP_KERNEL);
if (!obj)
goto free;
- obj->dev = dev;
- obj->filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
- if (IS_ERR(obj->filp))
+ if (drm_gem_object_init(dev, obj, size) != 0)
goto free;
- kref_init(&obj->refcount);
- kref_init(&obj->handlecount);
- obj->size = size;
if (dev->driver->gem_init_object != NULL &&
dev->driver->gem_init_object(obj) != 0) {
goto fput;
}
- atomic_inc(&dev->object_count);
- atomic_add(obj->size, &dev->object_memory);
return obj;
fput:
+ /* Object_init mangles the global counters - readjust them. */
+ atomic_dec(&dev->object_count);
+ atomic_sub(obj->size, &dev->object_memory);
fput(obj->filp);
free:
kfree(obj);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 2f3b3a0..b3b57b5 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1432,6 +1432,8 @@ void drm_gem_object_free(struct kref *kref);
void drm_gem_object_free_unlocked(struct kref *kref);
struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
size_t size);
+int drm_gem_object_init(struct drm_device *dev,
+ struct drm_gem_object *obj, size_t size);
void drm_gem_object_handle_free(struct kref *kref);
void drm_gem_vm_open(struct vm_area_struct *vma);
void drm_gem_vm_close(struct vm_area_struct *vma);
--
1.6.6.1
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/6] drm: free core gem object from driver callbacks
2010-04-09 19:05 [PATCH 0/6] make gem_object embedable and convert i915 driver Daniel Vetter
2010-04-09 19:05 ` [PATCH 1/6] drm: extract drm_gem_object_init Daniel Vetter
@ 2010-04-09 19:05 ` Daniel Vetter
2010-04-09 19:05 ` [PATCH 3/6] drm/i915: introduce i915_gem_alloc_object Daniel Vetter
` (4 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Daniel Vetter @ 2010-04-09 19:05 UTC (permalink / raw)
To: intel-gfx; +Cc: dri-devel, Daniel Vetter
When drivers embed the core gem object into their own structures,
they'll have to do this. Temporarily this results in an ugly
kfree(gem_obj);
in every gem driver.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/drm_gem.c | 10 +++-------
drivers/gpu/drm/i915/i915_gem.c | 3 +++
drivers/gpu/drm/nouveau/nouveau_gem.c | 3 +++
drivers/gpu/drm/radeon/radeon_gem.c | 3 +++
include/drm/drmP.h | 1 +
5 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 3b64d0e..33dad3f 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -422,15 +422,15 @@ drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
idr_destroy(&file_private->object_idr);
}
-static void
-drm_gem_object_free_common(struct drm_gem_object *obj)
+void
+drm_gem_object_release(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
fput(obj->filp);
atomic_dec(&dev->object_count);
atomic_sub(obj->size, &dev->object_memory);
- kfree(obj);
}
+EXPORT_SYMBOL(drm_gem_object_release);
/**
* Called after the last reference to the object has been lost.
@@ -448,8 +448,6 @@ drm_gem_object_free(struct kref *kref)
if (dev->driver->gem_free_object != NULL)
dev->driver->gem_free_object(obj);
-
- drm_gem_object_free_common(obj);
}
EXPORT_SYMBOL(drm_gem_object_free);
@@ -472,8 +470,6 @@ drm_gem_object_free_unlocked(struct kref *kref)
dev->driver->gem_free_object(obj);
mutex_unlock(&dev->struct_mutex);
}
-
- drm_gem_object_free_common(obj);
}
EXPORT_SYMBOL(drm_gem_object_free_unlocked);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 80871c6..d4ea909 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4474,6 +4474,9 @@ void i915_gem_free_object(struct drm_gem_object *obj)
kfree(obj_priv->page_cpu_valid);
kfree(obj_priv->bit_17);
kfree(obj->driver_private);
+
+ drm_gem_object_release(obj);
+ kfree(obj);
}
/** Unbinds all inactive objects. */
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 0d22f66..cc6b191 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -57,6 +57,9 @@ nouveau_gem_object_del(struct drm_gem_object *gem)
}
ttm_bo_unref(&bo);
+
+ drm_gem_object_release(gem);
+ kfree(gem);
}
int
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index ef92d14..833454a 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -44,6 +44,9 @@ void radeon_gem_object_free(struct drm_gem_object *gobj)
if (robj) {
radeon_bo_unref(&robj);
}
+
+ drm_gem_object_release(gobj);
+ kfree(gobj);
}
int radeon_gem_object_create(struct radeon_device *rdev, int size,
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index b3b57b5..c1b9871 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1428,6 +1428,7 @@ extern void drm_sysfs_connector_remove(struct drm_connector *connector);
/* Graphics Execution Manager library functions (drm_gem.c) */
int drm_gem_init(struct drm_device *dev);
void drm_gem_destroy(struct drm_device *dev);
+void drm_gem_object_release(struct drm_gem_object *obj);
void drm_gem_object_free(struct kref *kref);
void drm_gem_object_free_unlocked(struct kref *kref);
struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
--
1.6.6.1
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/6] drm/i915: introduce i915_gem_alloc_object
2010-04-09 19:05 [PATCH 0/6] make gem_object embedable and convert i915 driver Daniel Vetter
2010-04-09 19:05 ` [PATCH 1/6] drm: extract drm_gem_object_init Daniel Vetter
2010-04-09 19:05 ` [PATCH 2/6] drm: free core gem object from driver callbacks Daniel Vetter
@ 2010-04-09 19:05 ` Daniel Vetter
2010-04-09 19:05 ` [PATCH 4/6] drm/i915: embed the gem object into drm_i915_gem_object Daniel Vetter
` (3 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Daniel Vetter @ 2010-04-09 19:05 UTC (permalink / raw)
To: intel-gfx; +Cc: dri-devel, Daniel Vetter
Just preparation, no functional change.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/i915/i915_drv.h | 2 ++
drivers/gpu/drm/i915/i915_gem.c | 12 +++++++++---
drivers/gpu/drm/i915/intel_display.c | 2 +-
drivers/gpu/drm/i915/intel_fb.c | 2 +-
drivers/gpu/drm/i915/intel_overlay.c | 2 +-
5 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index b7cb4aa..3d4e135 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -893,6 +893,8 @@ int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
void i915_gem_load(struct drm_device *dev);
int i915_gem_init_object(struct drm_gem_object *obj);
+struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev,
+ size_t size);
void i915_gem_free_object(struct drm_gem_object *obj);
int i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment);
void i915_gem_object_unpin(struct drm_gem_object *obj);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index d4ea909..92dd522 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -124,7 +124,7 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data,
args->size = roundup(args->size, PAGE_SIZE);
/* Allocate the new object */
- obj = drm_gem_object_alloc(dev, args->size);
+ obj = i915_gem_alloc_object(dev, args->size);
if (obj == NULL)
return -ENOMEM;
@@ -4421,6 +4421,12 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
return 0;
}
+struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev,
+ size_t size)
+{
+ return drm_gem_object_alloc(dev, size);
+}
+
int i915_gem_init_object(struct drm_gem_object *obj)
{
struct drm_i915_gem_object *obj_priv;
@@ -4563,7 +4569,7 @@ i915_gem_init_hws(struct drm_device *dev)
if (!I915_NEED_GFX_HWS(dev))
return 0;
- obj = drm_gem_object_alloc(dev, 4096);
+ obj = i915_gem_alloc_object(dev, 4096);
if (obj == NULL) {
DRM_ERROR("Failed to allocate status page\n");
return -ENOMEM;
@@ -4640,7 +4646,7 @@ i915_gem_init_ringbuffer(struct drm_device *dev)
if (ret != 0)
return ret;
- obj = drm_gem_object_alloc(dev, 128 * 1024);
+ obj = i915_gem_alloc_object(dev, 128 * 1024);
if (obj == NULL) {
DRM_ERROR("Failed to allocate ringbuffer\n");
i915_gem_cleanup_hws(dev);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index eb9d825..bc775b6 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4598,7 +4598,7 @@ intel_alloc_power_context(struct drm_device *dev)
struct drm_gem_object *pwrctx;
int ret;
- pwrctx = drm_gem_object_alloc(dev, 4096);
+ pwrctx = i915_gem_alloc_object(dev, 4096);
if (!pwrctx) {
DRM_DEBUG("failed to alloc power context, RC6 disabled\n");
return NULL;
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
index 8a0b3bc..c7af7e1 100644
--- a/drivers/gpu/drm/i915/intel_fb.c
+++ b/drivers/gpu/drm/i915/intel_fb.c
@@ -138,7 +138,7 @@ static int intelfb_create(struct drm_device *dev, uint32_t fb_width,
size = mode_cmd.pitch * mode_cmd.height;
size = ALIGN(size, PAGE_SIZE);
- fbo = drm_gem_object_alloc(dev, size);
+ fbo = i915_gem_alloc_object(dev, size);
if (!fbo) {
DRM_ERROR("failed to allocate framebuffer\n");
ret = -ENOMEM;
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index 6d524a1..bc3721a 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -1341,7 +1341,7 @@ void intel_setup_overlay(struct drm_device *dev)
return;
overlay->dev = dev;
- reg_bo = drm_gem_object_alloc(dev, PAGE_SIZE);
+ reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE);
if (!reg_bo)
goto out_free;
overlay->reg_bo = to_intel_bo(reg_bo);
--
1.6.6.1
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/6] drm/i915: embed the gem object into drm_i915_gem_object
2010-04-09 19:05 [PATCH 0/6] make gem_object embedable and convert i915 driver Daniel Vetter
` (2 preceding siblings ...)
2010-04-09 19:05 ` [PATCH 3/6] drm/i915: introduce i915_gem_alloc_object Daniel Vetter
@ 2010-04-09 19:05 ` Daniel Vetter
2010-04-09 19:05 ` [PATCH 5/6] drm/i915: don't use ->driver_private anymore Daniel Vetter
` (2 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Daniel Vetter @ 2010-04-09 19:05 UTC (permalink / raw)
To: intel-gfx; +Cc: dri-devel, Daniel Vetter
Just embed it and adjust the pointers, No other changes (that's
for later patches).
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/i915/i915_drv.h | 1 +
drivers/gpu/drm/i915/i915_gem.c | 58 +++++++++++++++++++-------------------
2 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3d4e135..3d59e21 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -632,6 +632,7 @@ typedef struct drm_i915_private {
/** driver private structure attached to each drm_gem_object */
struct drm_i915_gem_object {
+ struct drm_gem_object base;
struct drm_gem_object *obj;
/** Current space allocated to this object in the GTT, if any. */
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 92dd522..23c67e0 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4424,37 +4424,38 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev,
size_t size)
{
- return drm_gem_object_alloc(dev, size);
-}
+ struct drm_i915_gem_object *obj;
-int i915_gem_init_object(struct drm_gem_object *obj)
-{
- struct drm_i915_gem_object *obj_priv;
+ obj = kzalloc(sizeof(*obj), GFP_KERNEL);
+ if (obj == NULL)
+ return NULL;
- obj_priv = kzalloc(sizeof(*obj_priv), GFP_KERNEL);
- if (obj_priv == NULL)
- return -ENOMEM;
+ if (drm_gem_object_init(dev, &obj->base, size) != 0) {
+ kfree(obj);
+ return NULL;
+ }
- /*
- * We've just allocated pages from the kernel,
- * so they've just been written by the CPU with
- * zeros. They'll need to be clflushed before we
- * use them with the GPU.
- */
- obj->write_domain = I915_GEM_DOMAIN_CPU;
- obj->read_domains = I915_GEM_DOMAIN_CPU;
+ obj->base.write_domain = I915_GEM_DOMAIN_CPU;
+ obj->base.read_domains = I915_GEM_DOMAIN_CPU;
- obj_priv->agp_type = AGP_USER_MEMORY;
+ obj->agp_type = AGP_USER_MEMORY;
- obj->driver_private = obj_priv;
- obj_priv->obj = obj;
- obj_priv->fence_reg = I915_FENCE_REG_NONE;
- INIT_LIST_HEAD(&obj_priv->list);
- INIT_LIST_HEAD(&obj_priv->gpu_write_list);
- INIT_LIST_HEAD(&obj_priv->fence_list);
- obj_priv->madv = I915_MADV_WILLNEED;
+ obj->base.driver_private = obj;
+ obj->obj = &obj->base;
+ obj->fence_reg = I915_FENCE_REG_NONE;
+ INIT_LIST_HEAD(&obj->list);
+ INIT_LIST_HEAD(&obj->gpu_write_list);
+ INIT_LIST_HEAD(&obj->fence_list);
+ obj->madv = I915_MADV_WILLNEED;
- trace_i915_gem_object_create(obj);
+ trace_i915_gem_object_create(&obj->base);
+
+ return &obj->base;
+}
+
+int i915_gem_init_object(struct drm_gem_object *obj)
+{
+ BUG();
return 0;
}
@@ -4477,12 +4478,11 @@ void i915_gem_free_object(struct drm_gem_object *obj)
if (obj_priv->mmap_offset)
i915_gem_free_mmap_offset(obj);
+ drm_gem_object_release(obj);
+
kfree(obj_priv->page_cpu_valid);
kfree(obj_priv->bit_17);
- kfree(obj->driver_private);
-
- drm_gem_object_release(obj);
- kfree(obj);
+ kfree(obj_priv);
}
/** Unbinds all inactive objects. */
--
1.6.6.1
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 5/6] drm/i915: don't use ->driver_private anymore
2010-04-09 19:05 [PATCH 0/6] make gem_object embedable and convert i915 driver Daniel Vetter
` (3 preceding siblings ...)
2010-04-09 19:05 ` [PATCH 4/6] drm/i915: embed the gem object into drm_i915_gem_object Daniel Vetter
@ 2010-04-09 19:05 ` Daniel Vetter
2010-04-09 19:05 ` [PATCH 6/6] drm/i915: drop pointer to drm_gem_object Daniel Vetter
2010-04-12 17:51 ` [PATCH 0/6] make gem_object embedable and convert i915 driver Eric Anholt
6 siblings, 0 replies; 11+ messages in thread
From: Daniel Vetter @ 2010-04-09 19:05 UTC (permalink / raw)
To: intel-gfx; +Cc: dri-devel, Daniel Vetter
Thanks to the to_intel_bo helper, this change is rather trivial.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/i915/i915_drv.h | 2 +-
drivers/gpu/drm/i915/i915_gem.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3d59e21..c5c7ce0 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -732,7 +732,7 @@ struct drm_i915_gem_object {
atomic_t pending_flip;
};
-#define to_intel_bo(x) ((struct drm_i915_gem_object *) (x)->driver_private)
+#define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base)
/**
* Request queue structure.
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 23c67e0..7c8c01b 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4440,7 +4440,7 @@ struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev,
obj->agp_type = AGP_USER_MEMORY;
- obj->base.driver_private = obj;
+ obj->base.driver_private = NULL;
obj->obj = &obj->base;
obj->fence_reg = I915_FENCE_REG_NONE;
INIT_LIST_HEAD(&obj->list);
--
1.6.6.1
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 6/6] drm/i915: drop pointer to drm_gem_object
2010-04-09 19:05 [PATCH 0/6] make gem_object embedable and convert i915 driver Daniel Vetter
` (4 preceding siblings ...)
2010-04-09 19:05 ` [PATCH 5/6] drm/i915: don't use ->driver_private anymore Daniel Vetter
@ 2010-04-09 19:05 ` Daniel Vetter
2010-04-12 17:51 ` [PATCH 0/6] make gem_object embedable and convert i915 driver Eric Anholt
6 siblings, 0 replies; 11+ messages in thread
From: Daniel Vetter @ 2010-04-09 19:05 UTC (permalink / raw)
To: intel-gfx; +Cc: dri-devel, Daniel Vetter
Luckily the change is quite a little bit less invasive than I've
feared.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/i915/i915_debugfs.c | 15 +++++++--------
drivers/gpu/drm/i915/i915_drv.h | 1 -
drivers/gpu/drm/i915/i915_gem.c | 21 ++++++++++-----------
drivers/gpu/drm/i915/i915_gem_debug.c | 2 +-
drivers/gpu/drm/i915/i915_irq.c | 4 ++--
drivers/gpu/drm/i915/intel_overlay.c | 6 +++---
6 files changed, 23 insertions(+), 26 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index a0b8447..213aa3f 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -96,19 +96,18 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
spin_lock(lock);
list_for_each_entry(obj_priv, head, list)
{
- struct drm_gem_object *obj = obj_priv->obj;
-
seq_printf(m, " %p: %s %8zd %08x %08x %d%s%s",
- obj,
+ &obj_priv->base,
get_pin_flag(obj_priv),
- obj->size,
- obj->read_domains, obj->write_domain,
+ obj_priv->base.size,
+ obj_priv->base.read_domains,
+ obj_priv->base.write_domain,
obj_priv->last_rendering_seqno,
obj_priv->dirty ? " dirty" : "",
obj_priv->madv == I915_MADV_DONTNEED ? " purgeable" : "");
- if (obj->name)
- seq_printf(m, " (name: %d)", obj->name);
+ if (obj_priv->base.name)
+ seq_printf(m, " (name: %d)", obj_priv->base.name);
if (obj_priv->fence_reg != I915_FENCE_REG_NONE)
seq_printf(m, " (fence: %d)", obj_priv->fence_reg);
if (obj_priv->gtt_space != NULL)
@@ -289,7 +288,7 @@ static int i915_batchbuffer_info(struct seq_file *m, void *data)
spin_lock(&dev_priv->mm.active_list_lock);
list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) {
- obj = obj_priv->obj;
+ obj = &obj_priv->base;
if (obj->read_domains & I915_GEM_DOMAIN_COMMAND) {
ret = i915_gem_object_get_pages(obj, 0);
if (ret) {
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index c5c7ce0..1b44ca7 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -633,7 +633,6 @@ typedef struct drm_i915_private {
/** driver private structure attached to each drm_gem_object */
struct drm_i915_gem_object {
struct drm_gem_object base;
- struct drm_gem_object *obj;
/** Current space allocated to this object in the GTT, if any. */
struct drm_mm_node *gtt_space;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 7c8c01b..47c46ed 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1566,7 +1566,7 @@ i915_gem_process_flushing_list(struct drm_device *dev,
list_for_each_entry_safe(obj_priv, next,
&dev_priv->mm.gpu_write_list,
gpu_write_list) {
- struct drm_gem_object *obj = obj_priv->obj;
+ struct drm_gem_object *obj = &obj_priv->base;
if ((obj->write_domain & flush_domains) ==
obj->write_domain) {
@@ -1704,7 +1704,7 @@ i915_gem_retire_request(struct drm_device *dev,
obj_priv = list_first_entry(&dev_priv->mm.active_list,
struct drm_i915_gem_object,
list);
- obj = obj_priv->obj;
+ obj = &obj_priv->base;
/* If the seqno being retired doesn't match the oldest in the
* list, then the oldest in the list must still be newer than
@@ -2075,7 +2075,7 @@ i915_gem_find_inactive_object(struct drm_device *dev, int min_size)
/* Try to find the smallest clean object */
list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, list) {
- struct drm_gem_object *obj = obj_priv->obj;
+ struct drm_gem_object *obj = &obj_priv->base;
if (obj->size >= min_size) {
if ((!obj_priv->dirty ||
i915_gem_object_is_purgeable(obj_priv)) &&
@@ -2209,7 +2209,7 @@ i915_gem_evict_something(struct drm_device *dev, int min_size)
/* Find an object that we can immediately reuse */
list_for_each_entry(obj_priv, &dev_priv->mm.flushing_list, list) {
- obj = obj_priv->obj;
+ obj = &obj_priv->base;
if (obj->size >= min_size)
break;
@@ -2437,7 +2437,7 @@ static int i915_find_fence_reg(struct drm_device *dev)
i = I915_FENCE_REG_NONE;
list_for_each_entry(obj_priv, &dev_priv->mm.fence_list,
fence_list) {
- obj = obj_priv->obj;
+ obj = &obj_priv->base;
if (obj_priv->pin_count)
continue;
@@ -4441,7 +4441,6 @@ struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev,
obj->agp_type = AGP_USER_MEMORY;
obj->base.driver_private = NULL;
- obj->obj = &obj->base;
obj->fence_reg = I915_FENCE_REG_NONE;
INIT_LIST_HEAD(&obj->list);
INIT_LIST_HEAD(&obj->gpu_write_list);
@@ -4495,9 +4494,9 @@ i915_gem_evict_from_inactive_list(struct drm_device *dev)
struct drm_gem_object *obj;
int ret;
- obj = list_first_entry(&dev_priv->mm.inactive_list,
- struct drm_i915_gem_object,
- list)->obj;
+ obj = &list_first_entry(&dev_priv->mm.inactive_list,
+ struct drm_i915_gem_object,
+ list)->base;
ret = i915_gem_object_unbind(obj);
if (ret != 0) {
@@ -5111,7 +5110,7 @@ i915_gem_shrink(int nr_to_scan, gfp_t gfp_mask)
&dev_priv->mm.inactive_list,
list) {
if (i915_gem_object_is_purgeable(obj_priv)) {
- i915_gem_object_unbind(obj_priv->obj);
+ i915_gem_object_unbind(&obj_priv->base);
if (--nr_to_scan <= 0)
break;
}
@@ -5140,7 +5139,7 @@ i915_gem_shrink(int nr_to_scan, gfp_t gfp_mask)
&dev_priv->mm.inactive_list,
list) {
if (nr_to_scan > 0) {
- i915_gem_object_unbind(obj_priv->obj);
+ i915_gem_object_unbind(&obj_priv->base);
nr_to_scan--;
} else
cnt++;
diff --git a/drivers/gpu/drm/i915/i915_gem_debug.c b/drivers/gpu/drm/i915/i915_gem_debug.c
index 35507cf..80f380b 100644
--- a/drivers/gpu/drm/i915/i915_gem_debug.c
+++ b/drivers/gpu/drm/i915/i915_gem_debug.c
@@ -39,7 +39,7 @@ i915_verify_inactive(struct drm_device *dev, char *file, int line)
struct drm_i915_gem_object *obj_priv;
list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, list) {
- obj = obj_priv->obj;
+ obj = &obj_priv->base;
if (obj_priv->pin_count || obj_priv->active ||
(obj->write_domain & ~(I915_GEM_DOMAIN_CPU |
I915_GEM_DOMAIN_GTT)))
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index a21c5d4..02b2d6d 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -608,7 +608,7 @@ static void i915_capture_error_state(struct drm_device *dev)
batchbuffer[1] = NULL;
count = 0;
list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) {
- struct drm_gem_object *obj = obj_priv->obj;
+ struct drm_gem_object *obj = &obj_priv->base;
if (batchbuffer[0] == NULL &&
bbaddr >= obj_priv->gtt_offset &&
@@ -644,7 +644,7 @@ static void i915_capture_error_state(struct drm_device *dev)
if (error->active_bo) {
int i = 0;
list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) {
- struct drm_gem_object *obj = obj_priv->obj;
+ struct drm_gem_object *obj = &obj_priv->base;
error->active_bo[i].size = obj->size;
error->active_bo[i].name = obj->name;
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index bc3721a..b0e17b0 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -373,7 +373,7 @@ static void intel_overlay_off_tail(struct intel_overlay *overlay)
/* never have the overlay hw on without showing a frame */
BUG_ON(!overlay->vid_bo);
- obj = overlay->vid_bo->obj;
+ obj = &overlay->vid_bo->base;
i915_gem_object_unpin(obj);
drm_gem_object_unreference(obj);
@@ -411,7 +411,7 @@ int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay,
switch (overlay->hw_wedged) {
case RELEASE_OLD_VID:
- obj = overlay->old_vid_bo->obj;
+ obj = &overlay->old_vid_bo->base;
i915_gem_object_unpin(obj);
drm_gem_object_unreference(obj);
overlay->old_vid_bo = NULL;
@@ -467,7 +467,7 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
if (ret != 0)
return ret;
- obj = overlay->old_vid_bo->obj;
+ obj = &overlay->old_vid_bo->base;
i915_gem_object_unpin(obj);
drm_gem_object_unreference(obj);
overlay->old_vid_bo = NULL;
--
1.6.6.1
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 0/6] make gem_object embedable and convert i915 driver
2010-04-09 19:05 [PATCH 0/6] make gem_object embedable and convert i915 driver Daniel Vetter
` (5 preceding siblings ...)
2010-04-09 19:05 ` [PATCH 6/6] drm/i915: drop pointer to drm_gem_object Daniel Vetter
@ 2010-04-12 17:51 ` Eric Anholt
2010-04-12 19:19 ` Daniel Vetter
6 siblings, 1 reply; 11+ messages in thread
From: Eric Anholt @ 2010-04-12 17:51 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, dri-devel
[-- Attachment #1.1: Type: text/plain, Size: 1157 bytes --]
On Fri, 9 Apr 2010 21:05:03 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> Hi all,
>
> As promised here's my patch series to make struct drm_gem_object embedable.
> Also converts drm/i915 as a proof of concept.
>
> I've already looked at the radeon and nouveau modules and a straightforward
> replament of the gem_object pointer looks simple. But I think embedding it
> into the ttm_bo is better long-term. Stuff like duplicated ref-counting
> between the ttm object and the gem one just doesn't make too much sense.
>
> Tested on my i945GM. The changes to radeon and nouveau in patch 2 are only
> compile-tested, but the identical change to the i915 survived testing.
>
> Comments on the patches and my future plans highly welcome.
>
> Yours, Daniel
>
> Daniel Vetter (6):
> drm: extract drm_gem_object_init
> drm: free core gem object from driver callbacks
> drm/i915: introduce i915_gem_alloc_object
> drm/i915: embed the gem object into drm_i915_gem_object
> drm/i915: don't use ->driver_private anymore
> drm/i915: drop pointer to drm_gem_object
I like this series. Dave, should I pull this one?
[-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 0/6] make gem_object embedable and convert i915 driver
2010-04-12 17:51 ` [PATCH 0/6] make gem_object embedable and convert i915 driver Eric Anholt
@ 2010-04-12 19:19 ` Daniel Vetter
2010-04-13 5:33 ` Dave Airlie
0 siblings, 1 reply; 11+ messages in thread
From: Daniel Vetter @ 2010-04-12 19:19 UTC (permalink / raw)
To: Eric Anholt; +Cc: Daniel Vetter, intel-gfx, dri-devel
On Mon, Apr 12, 2010 at 10:51:20AM -0700, Eric Anholt wrote:
> On Fri, 9 Apr 2010 21:05:03 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > Daniel Vetter (6):
> > drm: extract drm_gem_object_init
> > drm: free core gem object from driver callbacks
> > drm/i915: introduce i915_gem_alloc_object
> > drm/i915: embed the gem object into drm_i915_gem_object
> > drm/i915: don't use ->driver_private anymore
> > drm/i915: drop pointer to drm_gem_object
>
> I like this series. Dave, should I pull this one?
Cool. wrt merging I'd prefer if Dave could take the first two via drm-core.
That way round I could start working on the radeon/nouveau stuff
independently of the i915 stuff. That'd stall i915 slightly but i915 is the
easiest conversion (that's why I did it first) so I can quickly rebase in
case of conflicts.
-Daniel
--
Daniel Vetter
Mail: daniel@ffwll.ch
Mobile: +41 (0)79 365 57 48
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 0/6] make gem_object embedable and convert i915 driver
2010-04-12 19:19 ` Daniel Vetter
@ 2010-04-13 5:33 ` Dave Airlie
2010-04-13 23:59 ` Eric Anholt
0 siblings, 1 reply; 11+ messages in thread
From: Dave Airlie @ 2010-04-13 5:33 UTC (permalink / raw)
To: Daniel Vetter; +Cc: intel-gfx, dri-devel, Daniel Vetter
On Tue, Apr 13, 2010 at 5:19 AM, Daniel Vetter <daniel@ffwll.ch> wrote:
> On Mon, Apr 12, 2010 at 10:51:20AM -0700, Eric Anholt wrote:
>> On Fri, 9 Apr 2010 21:05:03 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
>> > Daniel Vetter (6):
>> > drm: extract drm_gem_object_init
>> > drm: free core gem object from driver callbacks
>> > drm/i915: introduce i915_gem_alloc_object
>> > drm/i915: embed the gem object into drm_i915_gem_object
>> > drm/i915: don't use ->driver_private anymore
>> > drm/i915: drop pointer to drm_gem_object
>>
>> I like this series. Dave, should I pull this one?
>
> Cool. wrt merging I'd prefer if Dave could take the first two via drm-core.
> That way round I could start working on the radeon/nouveau stuff
> independently of the i915 stuff. That'd stall i915 slightly but i915 is the
> easiest conversion (that's why I did it first) so I can quickly rebase in
> case of conflicts
I'll take these via my tree, Eric just let me know if I can assume your ack
on the i915 ones and even the main one. I'll try and review them over the next
couple of days.
Dave.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 0/6] make gem_object embedable and convert i915 driver
2010-04-13 5:33 ` Dave Airlie
@ 2010-04-13 23:59 ` Eric Anholt
0 siblings, 0 replies; 11+ messages in thread
From: Eric Anholt @ 2010-04-13 23:59 UTC (permalink / raw)
To: Dave Airlie, Daniel Vetter; +Cc: Daniel Vetter, intel-gfx, dri-devel
[-- Attachment #1.1: Type: text/plain, Size: 1402 bytes --]
On Tue, 13 Apr 2010 15:33:05 +1000, Dave Airlie <airlied@gmail.com> wrote:
> On Tue, Apr 13, 2010 at 5:19 AM, Daniel Vetter <daniel@ffwll.ch> wrote:
> > On Mon, Apr 12, 2010 at 10:51:20AM -0700, Eric Anholt wrote:
> >> On Fri, 9 Apr 2010 21:05:03 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> >> > Daniel Vetter (6):
> >> > drm: extract drm_gem_object_init
> >> > drm: free core gem object from driver callbacks
> >> > drm/i915: introduce i915_gem_alloc_object
> >> > drm/i915: embed the gem object into drm_i915_gem_object
> >> > drm/i915: don't use ->driver_private anymore
> >> > drm/i915: drop pointer to drm_gem_object
> >>
> >> I like this series. Dave, should I pull this one?
> >
> > Cool. wrt merging I'd prefer if Dave could take the first two via drm-core.
> > That way round I could start working on the radeon/nouveau stuff
> > independently of the i915 stuff. That'd stall i915 slightly but i915 is the
> > easiest conversion (that's why I did it first) so I can quickly rebase in
> > case of conflicts
>
> I'll take these via my tree, Eric just let me know if I can assume your ack
> on the i915 ones and even the main one. I'll try and review them over the next
> couple of days.
OK. And if you felt like pulling my -next at the same time, that would
be awesome as then I can continue merging there based off of this
series.
[-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2010-04-13 23:59 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-04-09 19:05 [PATCH 0/6] make gem_object embedable and convert i915 driver Daniel Vetter
2010-04-09 19:05 ` [PATCH 1/6] drm: extract drm_gem_object_init Daniel Vetter
2010-04-09 19:05 ` [PATCH 2/6] drm: free core gem object from driver callbacks Daniel Vetter
2010-04-09 19:05 ` [PATCH 3/6] drm/i915: introduce i915_gem_alloc_object Daniel Vetter
2010-04-09 19:05 ` [PATCH 4/6] drm/i915: embed the gem object into drm_i915_gem_object Daniel Vetter
2010-04-09 19:05 ` [PATCH 5/6] drm/i915: don't use ->driver_private anymore Daniel Vetter
2010-04-09 19:05 ` [PATCH 6/6] drm/i915: drop pointer to drm_gem_object Daniel Vetter
2010-04-12 17:51 ` [PATCH 0/6] make gem_object embedable and convert i915 driver Eric Anholt
2010-04-12 19:19 ` Daniel Vetter
2010-04-13 5:33 ` Dave Airlie
2010-04-13 23:59 ` Eric Anholt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).