int ttm_vt_lock(struct ttm_lock *lock, bool interruptible, struct ttm_object_file *tfile) { int ret = 0; if (interruptible) { ret = wait_event_interruptible(lock->queue, __ttm_vt_lock(lock)); if (unlikely(ret != 0)) { spin_lock(&lock->lock); lock->flags &= ~TTM_VT_LOCK_PENDING; wake_up_all(&lock->queue); spin_unlock(&lock->lock); return ret; } } else wait_event(lock->queue, __ttm_vt_lock(lock)); /* */ ret = ttm_base_object_init(tfile, &lock->base, false, ttm_lock_type, &ttm_vt_lock_remove, NULL); if (ret) (void)__ttm_vt_unlock(lock); else lock->vt_holder = tfile; return ret; }
int ttm_vt_lock(struct ttm_lock *lock, bool interruptible, struct ttm_object_file *tfile) { int ret = 0; if (interruptible) { ret = wait_event_interruptible(lock->queue, __ttm_vt_lock(lock)); if (unlikely(ret != 0)) { spin_lock(&lock->lock); lock->flags &= ~TTM_VT_LOCK_PENDING; wake_up_all(&lock->queue); spin_unlock(&lock->lock); return ret; } } else wait_event(lock->queue, __ttm_vt_lock(lock)); /* * Add a base-object, the destructor of which will * make sure the lock is released if the client dies * while holding it. */ ret = ttm_base_object_init(tfile, &lock->base, false, ttm_lock_type, &ttm_vt_lock_remove, NULL); if (ret) (void)__ttm_vt_unlock(lock); else lock->vt_holder = tfile; return ret; }
static void ttm_vt_lock_remove(struct ttm_base_object **p_base) { struct ttm_base_object *base = *p_base; struct ttm_lock *lock = container_of(base, struct ttm_lock, base); int ret; *p_base = NULL; ret = __ttm_vt_unlock(lock); BUG_ON(ret != 0); }
int ttm_vt_lock(struct ttm_lock *lock, bool interruptible, struct ttm_object_file *tfile) { const char *wmsg; int flags, ret; ret = 0; if (interruptible) { flags = PCATCH; wmsg = "ttmwi"; } else { flags = 0; wmsg = "ttmw"; } mtx_lock(&lock->lock); while (!__ttm_vt_lock(lock)) { ret = msleep(lock, &lock->lock, flags, wmsg, 0); if (ret == EINTR) ret = ERESTARTSYS; if (interruptible && ret != 0) { lock->flags &= ~TTM_VT_LOCK_PENDING; wakeup(lock); break; } } /* * Add a base-object, the destructor of which will * make sure the lock is released if the client dies * while holding it. */ ret = ttm_base_object_init(tfile, &lock->base, false, ttm_lock_type, &ttm_vt_lock_remove, NULL); if (ret) (void)__ttm_vt_unlock(lock); else lock->vt_holder = tfile; return (-ret); }