[ A kernel panic is *always* a bug and should therefore be reported to
  bugs@; many developers only read misc@ for its amusement value ]

> uvm_fault(0xfffffe823cb0c468, 0x278, 0, 1) -> e 
> kernel: page fault trap, code=0
> Stopped at radeon_vm_bo_add+0xaa: movq 0x278(%r15), %rax

Does the diff below help?

> On a related note I know that fan control has been enabled on linux
> 3.13 for this and other radeon cards, would it be possible to
> eventually port it?

Yes.  If the graphics stack has stabilized a bit further we'll look
into synching to a more recent Linux codebase.


Index: drmP.h
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/drmP.h,v
retrieving revision 1.153
diff -u -p -r1.153 drmP.h
--- drmP.h      19 Nov 2013 19:14:09 -0000      1.153
+++ drmP.h      22 Nov 2013 20:42:49 -0000
@@ -638,12 +638,17 @@ struct drm_driver_info {
        int     (*get_vblank_timestamp)(struct drm_device *, int, int *,
                    struct timeval *, unsigned);;
 
-       /*
-        * driver-specific constructor for gem objects to set up private data.
-        * returns 0 on success.
+       /**
+        * Driver-specific constructor for drm_gem_objects, to set up
+        * obj->driver_private.
+        *
+        * Returns 0 on success.
         */
-       int     (*gem_init_object)(struct drm_obj *);
-       void    (*gem_free_object)(struct drm_obj *);
+       int (*gem_init_object) (struct drm_obj *obj);
+       void (*gem_free_object) (struct drm_obj *obj);
+       int (*gem_open_object) (struct drm_obj *, struct drm_file *);
+       void (*gem_close_object) (struct drm_obj *, struct drm_file *);
+
        int     (*gem_fault)(struct drm_obj *, struct uvm_faultinfo *, off_t,
                    vaddr_t, vm_page_t *, int, int, vm_prot_t, int);
 
Index: drm_drv.c
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/drm_drv.c,v
retrieving revision 1.116
diff -u -p -r1.116 drm_drv.c
--- drm_drv.c   2 Nov 2013 22:58:10 -0000       1.116
+++ drm_drv.c   22 Nov 2013 20:35:49 -0000
@@ -1536,7 +1536,9 @@ drm_gem_handle_create(struct drm_file *f
                       struct drm_obj *obj,
                       u32 *handlep)
 {
-       struct drm_handle       *han;
+       struct drm_device *dev = obj->dev;
+       struct drm_handle *han;
+       int ret;
 
        if ((han = drm_calloc(1, sizeof(*han))) == NULL)
                return -ENOMEM;
@@ -1556,6 +1558,14 @@ again:
 
        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;
 }
 
@@ -1565,6 +1575,7 @@ again:
 int
 drm_gem_handle_delete(struct drm_file *filp, u32 handle)
 {
+       struct drm_device *dev;
        struct drm_obj *obj;
        struct drm_handle *han, find;
 
@@ -1575,13 +1586,16 @@ drm_gem_handle_delete(struct drm_file *f
                mtx_leave(&filp->table_lock);
                return -EINVAL;
        }
-
        obj = han->obj;
+       dev = obj->dev;
+
        SPLAY_REMOVE(drm_obj_tree, &filp->obj_tree, han);
        mtx_leave(&filp->table_lock);
 
        drm_free(han);
 
+       if (dev->driver->gem_close_object)
+               dev->driver->gem_close_object(obj, filp);
        drm_gem_object_handle_unreference_unlocked(obj);
 
        return 0;
Index: radeon/radeon_kms.c
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/radeon/radeon_kms.c,v
retrieving revision 1.11
diff -u -p -r1.11 radeon_kms.c
--- radeon/radeon_kms.c 17 Nov 2013 13:41:26 -0000      1.11
+++ radeon/radeon_kms.c 22 Nov 2013 20:39:57 -0000
@@ -217,10 +217,8 @@ static struct drm_driver_info kms_driver
        .irq_handler = radeon_driver_irq_handler_kms,
        .gem_init_object = radeon_gem_object_init,
        .gem_free_object = radeon_gem_object_free,
-#ifdef notyet
        .gem_open_object = radeon_gem_object_open,
        .gem_close_object = radeon_gem_object_close,
-#endif
        .gem_size = sizeof(struct radeon_bo),
        .dma_ioctl = radeon_dma_ioctl_kms,
        .dumb_create = radeon_mode_dumb_create,

Reply via email to