[ 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,