The diff below cleans up the "fake" uvm locking and the hold/unlock
logic in drm.  I'm pretty sure the hold/unlock logic isn't necessary
anymore, but I'd like to see some people test this before I commit.

Thanks,

Mark


Index: drmP.h
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/drmP.h,v
retrieving revision 1.162
diff -u -p -r1.162 drmP.h
--- drmP.h      22 Jan 2014 22:17:34 -0000      1.162
+++ drmP.h      24 Jan 2014 04:31:24 -0000
@@ -1054,14 +1054,6 @@ int drm_gem_object_init(struct drm_devic
 
 void    drm_unref(struct uvm_object *);
 void    drm_ref(struct uvm_object *);
-void    drm_unref_locked(struct uvm_object *);
-void    drm_ref_locked(struct uvm_object *);
-void   drm_hold_object_locked(struct drm_gem_object *);
-void   drm_hold_object(struct drm_gem_object *);
-void   drm_unhold_object_locked(struct drm_gem_object *);
-void   drm_unhold_object(struct drm_gem_object *);
-int    drm_try_hold_object(struct drm_gem_object *);
-void   drm_unhold_and_unref(struct drm_gem_object *);
 
 int drm_gem_handle_create(struct drm_file *file_priv,
                          struct drm_gem_object *obj,
@@ -1100,37 +1092,11 @@ drm_gem_object_unreference_unlocked(stru
        DRM_UNLOCK();
 }
 
-static __inline void 
-drm_lock_obj(struct drm_gem_object *obj)
-{
-       simple_lock(&obj->uobj);
-}
-
-static __inline void 
-drm_unlock_obj(struct drm_gem_object *obj)
-{
-       simple_unlock(&obj->uobj);
-}
-
 static __inline__ int drm_core_check_feature(struct drm_device *dev,
                                             int feature)
 {
        return ((dev->driver->flags & feature) ? 1 : 0);
 }
-
-#ifdef DRMLOCKDEBUG
-
-#define DRM_ASSERT_HELD(obj)           \
-       KASSERT(obj->do_flags & DRM_BUSY && obj->holding_proc == curproc)
-#define DRM_OBJ_ASSERT_LOCKED(obj) /* XXX mutexes */
-#define DRM_ASSERT_LOCKED(lock) MUTEX_ASSERT_LOCKED(lock)
-#else
-
-#define DRM_ASSERT_HELD(obj)
-#define DRM_OBJ_ASSERT_LOCKED(obj)
-#define DRM_ASSERT_LOCKED(lock) 
-
-#endif
 
 #define DRM_PCIE_SPEED_25 1
 #define DRM_PCIE_SPEED_50 2
Index: drm_drv.c
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/drm_drv.c,v
retrieving revision 1.121
diff -u -p -r1.121 drm_drv.c
--- drm_drv.c   20 Jan 2014 09:20:49 -0000      1.121
+++ drm_drv.c   24 Jan 2014 04:32:05 -0000
@@ -1282,123 +1282,24 @@ struct uvm_pagerops drm_pgops = {
        drm_flush,
 };
 
-
-void
-drm_hold_object_locked(struct drm_gem_object *obj)
-{
-       while (obj->do_flags & DRM_BUSY) {
-               atomic_setbits_int(&obj->do_flags, DRM_WANTED);
-               simple_unlock(&uobj->vmobjlock);
-#ifdef DRMLOCKDEBUG
-               {
-               int ret = 0;
-               ret = tsleep(obj, PVM, "drm_hold", 3 * hz); /* XXX msleep */
-               if (ret)
-                       printf("still waiting for obj %p, owned by %p\n",
-                           obj, obj->holding_proc);
-               }
-#else
-               tsleep(obj, PVM, "drm_hold", 0); /* XXX msleep */
-#endif
-               simple_lock(&uobj->vmobjlock);
-       }
-#ifdef DRMLOCKDEBUG
-       obj->holding_proc = curproc;
-#endif
-       atomic_setbits_int(&obj->do_flags, DRM_BUSY);
-}
-
-void
-drm_hold_object(struct drm_gem_object *obj)
-{
-       simple_lock(&obj->uobj->vmobjlock);
-       drm_hold_object_locked(obj);
-       simple_unlock(&obj->uobj->vmobjlock);
-}
-
-int
-drm_try_hold_object(struct drm_gem_object *obj)
-{
-       simple_lock(&obj->uobj->vmobjlock);
-       /* if the object is free, grab it */
-       if (obj->do_flags & (DRM_BUSY | DRM_WANTED))
-               return (0);
-       atomic_setbits_int(&obj->do_flags, DRM_BUSY);
-#ifdef DRMLOCKDEBUG
-       obj->holding_proc = curproc;
-#endif
-       simple_unlock(&obj->uobj->vmobjlock);
-       return (1);
-}
-
-
-void
-drm_unhold_object_locked(struct drm_gem_object *obj)
-{
-       if (obj->do_flags & DRM_WANTED)
-               wakeup(obj);
-#ifdef DRMLOCKDEBUG
-       obj->holding_proc = NULL;
-#endif
-       atomic_clearbits_int(&obj->do_flags, DRM_WANTED | DRM_BUSY);    
-}
-
-void
-drm_unhold_object(struct drm_gem_object *obj)
-{
-       simple_lock(&obj->uobj->vmobjlock);
-       drm_unhold_object_locked(obj);
-       simple_unlock(&obj->uobj->vmobjlock);
-}
-
-void
-drm_ref_locked(struct uvm_object *uobj)
-{
-       uobj->uo_refs++;
-}
-
 void
 drm_ref(struct uvm_object *uobj)
 {
-       simple_lock(&uobj->vmobjlock);
-       drm_ref_locked(uobj);
-       simple_unlock(&uobj->vmobjlock);
+       uobj->uo_refs++;
 }
 
 void
 drm_unref(struct uvm_object *uobj)
 {
-       simple_lock(&uobj->vmobjlock);
-       drm_unref_locked(uobj);
-}
-
-void
-drm_unref_locked(struct uvm_object *uobj)
-{
-       struct drm_gem_object   *obj = (struct drm_gem_object *)uobj;
-       struct drm_device       *dev = obj->dev;
+       struct drm_gem_object *obj = (struct drm_gem_object *)uobj;
+       struct drm_device *dev = obj->dev;
 
-again:
        if (uobj->uo_refs > 1) {
                uobj->uo_refs--;
-               simple_unlock(&uobj->vmobjlock);
                return;
        }
 
-       /* inlined version of drm_hold because we want to trylock then sleep */
-       if (obj->do_flags & DRM_BUSY) {
-               atomic_setbits_int(&obj->do_flags, DRM_WANTED);
-               simple_unlock(&uobj->vmobjlock);
-               tsleep(obj, PVM, "drm_unref", 0); /* XXX msleep */
-               simple_lock(&uobj->vmobjlock);
-               goto again;
-       }
-#ifdef DRMLOCKDEBUG
-       obj->holding_proc = curproc;
-#endif
-       atomic_setbits_int(&obj->do_flags, DRM_BUSY);
-       simple_unlock(&obj->vmobjlock);
-       /* We own this thing now. it is on no queues, though it may still
+       /* We own this thing now. It is on no queues, though it may still
         * be bound to the aperture (and on the inactive list, in which case
         * idling the buffer is what triggered the free. Since we know no one 
         * else can grab it now, we can nuke with impunity.
@@ -1407,25 +1308,12 @@ again:
                dev->driver->gem_free_object(obj);
 }
 
-/*
- * convenience function to unreference and unhold an object.
- */
-void
-drm_unhold_and_unref(struct drm_gem_object *obj)
-{
-       drm_lock_obj(obj);
-       drm_unhold_object_locked(obj);
-       drm_unref_locked(&obj->uobj);
-}
-
-
 boolean_t      
 drm_flush(struct uvm_object *uobj, voff_t start, voff_t stop, int flags)
 {
        return (TRUE);
 }
 
-
 int
 drm_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps,
     int npages, int centeridx, vm_fault_t fault_type,
@@ -1832,7 +1720,6 @@ udv_attach_drm(void *arg, vm_prot_t acce
        if (dev->driver->mmap)
                return dev->driver->mmap(dev, off, size);
 
-again:
        DRM_LOCK();
        TAILQ_FOREACH(map, &dev->maplist, link) {
                if (off >= map->ext && off + size <= map->ext + map->size)
@@ -1845,21 +1732,7 @@ again:
        }
 
        obj = (struct drm_gem_object *)map->handle;
-       simple_lock(&uobj->vmobjlock);
-       if (obj->do_flags & DRM_BUSY) {
-               atomic_setbits_int(&obj->do_flags, DRM_WANTED);
-               simple_unlock(&uobj->vmobjlock);
-               DRM_UNLOCK();
-               tsleep(obj, PVM, "udv_drm", 0); /* XXX msleep */
-               goto again;
-       }
-#ifdef DRMLOCKDEBUG
-       obj->holding_proc = curproc;
-#endif
-       atomic_setbits_int(&obj->do_flags, DRM_BUSY);
-       simple_unlock(&obj->vmobjlock);
        drm_ref(&obj->uobj);
-       drm_unhold_object(obj);
        DRM_UNLOCK();
        return &obj->uobj;
 }
Index: i915/i915_gem.c
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/i915/i915_gem.c,v
retrieving revision 1.66
diff -u -p -r1.66 i915_gem.c
--- i915/i915_gem.c     21 Jan 2014 08:57:22 -0000      1.66
+++ i915/i915_gem.c     24 Jan 2014 04:15:24 -0000
@@ -1473,21 +1473,12 @@ i915_gem_fault(struct drm_gem_object *ge
                uvmfault_unlockall(ufi, NULL, &obj->base.uobj, NULL);
                DRM_LOCK();
                locked = uvmfault_relock(ufi);
-               if (locked)
-                       drm_lock_obj(&obj->base);
        }
-       if (locked)
-               drm_hold_object_locked(&obj->base);
-       else { /* obj already unlocked */
+       if (!locked) {
                dev_priv->entries--;
                return (VM_PAGER_REFAULT);
        }
 
-       /* we have a hold set on the object now, we can unlock so that we can
-        * sleep in binding and flushing.
-        */
-       drm_unlock_obj(&obj->base);
-
        /* Now bind it into the GTT if needed */
        ret = i915_gem_object_pin(obj, 0, true, false);
        if (ret)
@@ -1526,7 +1517,6 @@ i915_gem_fault(struct drm_gem_object *ge
                if (pmap_enter(ufi->orig_map->pmap, vaddr, paddr,
                    mapprot, PMAP_CANFAIL | mapprot) != 0) {
                        i915_gem_object_unpin(obj);
-                       drm_unhold_object(&obj->base);
                        uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap,
                            NULL, NULL);
                        DRM_UNLOCK();
@@ -1538,7 +1528,6 @@ i915_gem_fault(struct drm_gem_object *ge
 unpin:
        i915_gem_object_unpin(obj);
 unlock:
-       drm_unhold_object(&obj->base);
        uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, NULL, NULL);
        DRM_UNLOCK();
        dev_priv->entries--;
@@ -1785,14 +1774,10 @@ i915_gem_mmap_gtt_ioctl(struct drm_devic
 static void
 i915_gem_object_truncate(struct drm_i915_gem_object *obj)
 {
-       DRM_ASSERT_HELD(&obj->base);
-
        i915_gem_object_free_mmap_offset(obj);
 
-       simple_lock(&obj->base.uao->vmobjlock);
        obj->base.uao->pgops->pgo_flush(obj->base.uao, 0, obj->base.size,
            PGO_ALLPAGES | PGO_FREE);
-       simple_unlock(&obj->base.uao->vmobjlock);
 
        obj->madv = __I915_MADV_PURGED;
 }
@@ -3280,8 +3265,6 @@ i915_gem_object_set_to_gtt_domain(struct
        uint32_t old_write_domain, old_read_domains;
        int ret;
 
-       DRM_ASSERT_HELD(&obj->base);
-
        /* Not valid to be called on unbound objects. */
        if (obj->gtt_space == NULL)
                return -EINVAL;
@@ -3548,8 +3531,6 @@ i915_gem_object_set_to_cpu_domain(struct
        uint32_t old_write_domain, old_read_domains;
        int ret;
 
-       DRM_ASSERT_HELD(obj);
-
        if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
                return 0;
 
@@ -3714,8 +3695,6 @@ i915_gem_pin_ioctl(struct drm_device *de
                goto unlock;
        }
 
-       drm_hold_object(&obj->base);
-
        if (obj->madv != I915_MADV_WILLNEED) {
                DRM_ERROR("Attempting to pin a purgeable buffer\n");
                ret = -EINVAL;
@@ -3744,7 +3723,7 @@ i915_gem_pin_ioctl(struct drm_device *de
        i915_gem_object_flush_cpu_write_domain(obj);
        args->offset = obj->gtt_offset;
 out:
-       drm_unhold_and_unref(&obj->base);
+       drm_gem_object_unreference(&obj->base);
 unlock:
        DRM_UNLOCK();
        return ret;
@@ -3768,8 +3747,6 @@ i915_gem_unpin_ioctl(struct drm_device *
                goto unlock;
        }
 
-       drm_hold_object(&obj->base);
-
        if (obj->pin_filp != file) {
                DRM_ERROR("Not pinned by caller in i915_gem_pin_ioctl(): %d\n",
                          args->handle);
@@ -3783,7 +3760,7 @@ i915_gem_unpin_ioctl(struct drm_device *
        }
 
 out:
-       drm_unhold_and_unref(&obj->base);
+       drm_gem_object_unreference(&obj->base);
 unlock:
        DRM_UNLOCK();
        return ret;
@@ -3861,8 +3838,6 @@ i915_gem_madvise_ioctl(struct drm_device
                goto unlock;
        }
 
-       drm_hold_object(&obj->base);
-
        if (obj->pin_count) {
                ret = -EINVAL;
                goto out;
@@ -3878,7 +3853,7 @@ i915_gem_madvise_ioctl(struct drm_device
        args->retained = obj->madv != __I915_MADV_PURGED;
 
 out:
-       drm_unhold_and_unref(&obj->base);
+       drm_gem_object_unreference(&obj->base);
 unlock:
        DRM_UNLOCK();
        return ret;
@@ -3958,8 +3933,6 @@ void i915_gem_free_object(struct drm_gem
        struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
        struct drm_device *dev = obj->base.dev;
        drm_i915_private_t *dev_priv = dev->dev_private;
-
-       DRM_ASSERT_HELD(&obj->base);
 
        if (obj->phys_obj)
                i915_gem_detach_phys_object(dev, obj);
Index: i915/i915_gem_tiling.c
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/i915/i915_gem_tiling.c,v
retrieving revision 1.13
diff -u -p -r1.13 i915_gem_tiling.c
--- i915/i915_gem_tiling.c      21 Jan 2014 08:57:22 -0000      1.13
+++ i915/i915_gem_tiling.c      24 Jan 2014 04:34:39 -0000
@@ -329,17 +329,16 @@ i915_gem_set_tiling(struct drm_device *d
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
        if (&obj->base == NULL)
                return -ENOENT;
-       drm_hold_object(&obj->base);
 
        if (!i915_tiling_ok(dev,
                            args->stride, obj->base.size, args->tiling_mode)) {
-               ret = -EINVAL;
-               goto out;
+               drm_gem_object_unreference_unlocked(&obj->base);
+               return -EINVAL;
        }
 
        if (obj->pin_count) {
-               ret = -EBUSY;
-               goto out;
+               drm_gem_object_unreference_unlocked(&obj->base);
+               return -EBUSY;
        }
 
        if (args->tiling_mode == I915_TILING_NONE) {
@@ -417,9 +416,8 @@ i915_gem_set_tiling(struct drm_device *d
        /* we have to maintain this existing ABI... */
        args->stride = obj->stride;
        args->tiling_mode = obj->tiling_mode;
+       drm_gem_object_unreference(&obj->base);
        DRM_UNLOCK();
-out:
-       drm_unhold_and_unref(&obj->base);
 
        return ret;
 }
@@ -438,7 +436,6 @@ i915_gem_get_tiling(struct drm_device *d
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
        if (&obj->base == NULL)
                return -ENOENT;
-       drm_hold_object(&obj->base);
 
        DRM_LOCK();
 
@@ -463,8 +460,8 @@ i915_gem_get_tiling(struct drm_device *d
        if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_10_17)
                args->swizzle_mode = I915_BIT_6_SWIZZLE_9_10;
 
+       drm_gem_object_unreference(&obj->base);
        DRM_UNLOCK();
-       drm_unhold_and_unref(&obj->base);
 
        return 0;
 }

Reply via email to