[PATCH] drm/gem: add hooks to notify driver when object handle is created/destroyed

2011-06-09 Thread Ben Skeggs
On Thu, 2011-06-09 at 10:24 +1000, skeggsb at gmail.com wrote:
> From: Ben Skeggs 
> 
> Nouveau is going to use these hooks to map/unmap objects from a client's
> private GPU address space.
Forgot the v2 notes.. inlined below..

> 
> Signed-off-by: Ben Skeggs 
> ---
>  drivers/gpu/drm/drm_gem.c |   21 +++--
>  include/drm/drmP.h|2 ++
>  2 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index 74e4ff5..bad3359 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -210,6 +210,8 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
>   idr_remove(>object_idr, handle);
>   spin_unlock(>table_lock);
>  
> + if (dev->driver->gem_close_object)
> + dev->driver->gem_close_object(obj, filp);
>   drm_gem_object_handle_unreference_unlocked(obj);
This is the only change, moved the call to the driver hook outside of
the spinlock.

Ben.

>  
>   return 0;
> @@ -226,7 +228,8 @@ drm_gem_handle_create(struct drm_file *file_priv,
>  struct drm_gem_object *obj,
>  u32 *handlep)
>  {
> - int ret;
> + struct drm_device *dev = obj->dev;
> + int ret;
>  
>   /*
>* Get the user-visible handle using idr.
> @@ -247,6 +250,15 @@ again:
>   return ret;
>  
>   drm_gem_object_handle_reference(obj);
> +
> + if (dev->driver->gem_open_object) {
> + ret = dev->driver->gem_open_object(obj, file_priv);
> + if (ret) {
> + drm_gem_handle_delete(file_priv, *handlep);
> + return ret;
> + }
> + }
> +
>   return 0;
>  }
>  EXPORT_SYMBOL(drm_gem_handle_create);
> @@ -401,7 +413,12 @@ drm_gem_open(struct drm_device *dev, struct drm_file 
> *file_private)
>  static int
>  drm_gem_object_release_handle(int id, void *ptr, void *data)
>  {
> + struct drm_file *file_priv = data;
>   struct drm_gem_object *obj = ptr;
> + struct drm_device *dev = obj->dev;
> +
> + if (dev->driver->gem_close_object)
> + dev->driver->gem_close_object(obj, file_priv);
>  
>   drm_gem_object_handle_unreference_unlocked(obj);
>  
> @@ -417,7 +434,7 @@ void
>  drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
>  {
>   idr_for_each(_private->object_idr,
> -  _gem_object_release_handle, NULL);
> +  _gem_object_release_handle, file_private);
>  
>   idr_remove_all(_private->object_idr);
>   idr_destroy(_private->object_idr);
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 738b3a5..4912cb7 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -886,6 +886,8 @@ struct drm_driver {
>*/
>   int (*gem_init_object) (struct drm_gem_object *obj);
>   void (*gem_free_object) (struct drm_gem_object *obj);
> + int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
> + void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
>  
>   /* vga arb irq handler */
>   void (*vgaarb_irq)(struct drm_device *dev, bool state);




[PATCH] drm/gem: add hooks to notify driver when object handle is created/destroyed

2011-06-09 Thread skeg...@gmail.com
From: Ben Skeggs 

Nouveau is going to use these hooks to map/unmap objects from a client's
private GPU address space.

Signed-off-by: Ben Skeggs 
---
 drivers/gpu/drm/drm_gem.c |   21 +++--
 include/drm/drmP.h|2 ++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 74e4ff5..bad3359 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -210,6 +210,8 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
idr_remove(>object_idr, handle);
spin_unlock(>table_lock);

+   if (dev->driver->gem_close_object)
+   dev->driver->gem_close_object(obj, filp);
drm_gem_object_handle_unreference_unlocked(obj);

return 0;
@@ -226,7 +228,8 @@ drm_gem_handle_create(struct drm_file *file_priv,
   struct drm_gem_object *obj,
   u32 *handlep)
 {
-   int ret;
+   struct drm_device *dev = obj->dev;
+   int ret;

/*
 * Get the user-visible handle using idr.
@@ -247,6 +250,15 @@ again:
return ret;

drm_gem_object_handle_reference(obj);
+
+   if (dev->driver->gem_open_object) {
+   ret = dev->driver->gem_open_object(obj, file_priv);
+   if (ret) {
+   drm_gem_handle_delete(file_priv, *handlep);
+   return ret;
+   }
+   }
+
return 0;
 }
 EXPORT_SYMBOL(drm_gem_handle_create);
@@ -401,7 +413,12 @@ drm_gem_open(struct drm_device *dev, struct drm_file 
*file_private)
 static int
 drm_gem_object_release_handle(int id, void *ptr, void *data)
 {
+   struct drm_file *file_priv = data;
struct drm_gem_object *obj = ptr;
+   struct drm_device *dev = obj->dev;
+
+   if (dev->driver->gem_close_object)
+   dev->driver->gem_close_object(obj, file_priv);

drm_gem_object_handle_unreference_unlocked(obj);

@@ -417,7 +434,7 @@ void
 drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
 {
idr_for_each(_private->object_idr,
-_gem_object_release_handle, NULL);
+_gem_object_release_handle, file_private);

idr_remove_all(_private->object_idr);
idr_destroy(_private->object_idr);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 738b3a5..4912cb7 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -886,6 +886,8 @@ struct drm_driver {
 */
int (*gem_init_object) (struct drm_gem_object *obj);
void (*gem_free_object) (struct drm_gem_object *obj);
+   int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
+   void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);

/* vga arb irq handler */
void (*vgaarb_irq)(struct drm_device *dev, bool state);
-- 
1.7.5.2



[PATCH] drm/gem: add hooks to notify driver when object handle is created/destroyed

2011-06-08 Thread skeg...@gmail.com
From: Ben Skeggs 

Nouveau is going to use these hooks to map/unmap objects from a client's
private GPU address space.

Signed-off-by: Ben Skeggs 
---
 drivers/gpu/drm/drm_gem.c |   21 +++--
 include/drm/drmP.h|2 ++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 74e4ff5..59d2417 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -207,6 +207,8 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
dev = obj->dev;

/* Release reference and decrement refcount. */
+   if (dev->driver->gem_close_object)
+   dev->driver->gem_close_object(obj, filp);
idr_remove(>object_idr, handle);
spin_unlock(>table_lock);

@@ -226,7 +228,8 @@ drm_gem_handle_create(struct drm_file *file_priv,
   struct drm_gem_object *obj,
   u32 *handlep)
 {
-   int ret;
+   struct drm_device *dev = obj->dev;
+   int ret;

/*
 * Get the user-visible handle using idr.
@@ -247,6 +250,15 @@ again:
return ret;

drm_gem_object_handle_reference(obj);
+
+   if (dev->driver->gem_open_object) {
+   ret = dev->driver->gem_open_object(obj, file_priv);
+   if (ret) {
+   drm_gem_handle_delete(file_priv, *handlep);
+   return ret;
+   }
+   }
+
return 0;
 }
 EXPORT_SYMBOL(drm_gem_handle_create);
@@ -401,7 +413,12 @@ drm_gem_open(struct drm_device *dev, struct drm_file 
*file_private)
 static int
 drm_gem_object_release_handle(int id, void *ptr, void *data)
 {
+   struct drm_file *file_priv = data;
struct drm_gem_object *obj = ptr;
+   struct drm_device *dev = obj->dev;
+
+   if (dev->driver->gem_close_object)
+   dev->driver->gem_close_object(obj, file_priv);

drm_gem_object_handle_unreference_unlocked(obj);

@@ -417,7 +434,7 @@ void
 drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
 {
idr_for_each(_private->object_idr,
-_gem_object_release_handle, NULL);
+_gem_object_release_handle, file_private);

idr_remove_all(_private->object_idr);
idr_destroy(_private->object_idr);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 738b3a5..4912cb7 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -886,6 +886,8 @@ struct drm_driver {
 */
int (*gem_init_object) (struct drm_gem_object *obj);
void (*gem_free_object) (struct drm_gem_object *obj);
+   int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
+   void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);

/* vga arb irq handler */
void (*vgaarb_irq)(struct drm_device *dev, bool state);
-- 
1.7.5.2



Re: [PATCH] drm/gem: add hooks to notify driver when object handle is created/destroyed

2011-06-08 Thread Ben Skeggs
On Thu, 2011-06-09 at 10:24 +1000, skeg...@gmail.com wrote:
 From: Ben Skeggs bske...@redhat.com
 
 Nouveau is going to use these hooks to map/unmap objects from a client's
 private GPU address space.
Forgot the v2 notes.. inlined below..

 
 Signed-off-by: Ben Skeggs bske...@redhat.com
 ---
  drivers/gpu/drm/drm_gem.c |   21 +++--
  include/drm/drmP.h|2 ++
  2 files changed, 21 insertions(+), 2 deletions(-)
 
 diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
 index 74e4ff5..bad3359 100644
 --- a/drivers/gpu/drm/drm_gem.c
 +++ b/drivers/gpu/drm/drm_gem.c
 @@ -210,6 +210,8 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
   idr_remove(filp-object_idr, handle);
   spin_unlock(filp-table_lock);
  
 + if (dev-driver-gem_close_object)
 + dev-driver-gem_close_object(obj, filp);
   drm_gem_object_handle_unreference_unlocked(obj);
This is the only change, moved the call to the driver hook outside of
the spinlock.

Ben.

  
   return 0;
 @@ -226,7 +228,8 @@ drm_gem_handle_create(struct drm_file *file_priv,
  struct drm_gem_object *obj,
  u32 *handlep)
  {
 - int ret;
 + struct drm_device *dev = obj-dev;
 + int ret;
  
   /*
* Get the user-visible handle using idr.
 @@ -247,6 +250,15 @@ again:
   return ret;
  
   drm_gem_object_handle_reference(obj);
 +
 + if (dev-driver-gem_open_object) {
 + ret = dev-driver-gem_open_object(obj, file_priv);
 + if (ret) {
 + drm_gem_handle_delete(file_priv, *handlep);
 + return ret;
 + }
 + }
 +
   return 0;
  }
  EXPORT_SYMBOL(drm_gem_handle_create);
 @@ -401,7 +413,12 @@ drm_gem_open(struct drm_device *dev, struct drm_file 
 *file_private)
  static int
  drm_gem_object_release_handle(int id, void *ptr, void *data)
  {
 + struct drm_file *file_priv = data;
   struct drm_gem_object *obj = ptr;
 + struct drm_device *dev = obj-dev;
 +
 + if (dev-driver-gem_close_object)
 + dev-driver-gem_close_object(obj, file_priv);
  
   drm_gem_object_handle_unreference_unlocked(obj);
  
 @@ -417,7 +434,7 @@ void
  drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
  {
   idr_for_each(file_private-object_idr,
 -  drm_gem_object_release_handle, NULL);
 +  drm_gem_object_release_handle, file_private);
  
   idr_remove_all(file_private-object_idr);
   idr_destroy(file_private-object_idr);
 diff --git a/include/drm/drmP.h b/include/drm/drmP.h
 index 738b3a5..4912cb7 100644
 --- a/include/drm/drmP.h
 +++ b/include/drm/drmP.h
 @@ -886,6 +886,8 @@ struct drm_driver {
*/
   int (*gem_init_object) (struct drm_gem_object *obj);
   void (*gem_free_object) (struct drm_gem_object *obj);
 + int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
 + void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
  
   /* vga arb irq handler */
   void (*vgaarb_irq)(struct drm_device *dev, bool state);


___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel