int ttm_write_lock(struct ttm_lock *lock, bool interruptible) { const char *wmsg; int flags, ret; ret = 0; if (interruptible) { flags = PCATCH; wmsg = "ttmwi"; } else { flags = 0; wmsg = "ttmw"; } mtx_lock(&lock->lock); /* XXXKIB: linux uses __ttm_read_lock for uninterruptible sleeps */ while (!__ttm_write_lock(lock)) { ret = msleep(lock, &lock->lock, flags, wmsg, 0); if (ret == EINTR) ret = ERESTARTSYS; if (interruptible && ret != 0) { lock->flags &= ~TTM_WRITE_LOCK_PENDING; wakeup(lock); break; } } mtx_unlock(&lock->lock); return (-ret); }
int ttm_write_lock(struct ttm_lock *lock, bool interruptible) { int ret = 0; if (interruptible) { ret = wait_event_interruptible(lock->queue, __ttm_write_lock(lock)); if (unlikely(ret != 0)) { spin_lock(&lock->lock); lock->flags &= ~TTM_WRITE_LOCK_PENDING; wake_up_all(&lock->queue); spin_unlock(&lock->lock); } } else wait_event(lock->queue, __ttm_read_lock(lock)); return ret; }
int ttm_write_lock(struct ttm_lock *lock, bool interruptible) { printf("%s stub\n", __func__); return -ENOSYS; #ifdef notyet int ret = 0; if (interruptible) { ret = wait_event_interruptible(lock->queue, __ttm_write_lock(lock)); if (unlikely(ret != 0)) { spin_lock(&lock->lock); lock->flags &= ~TTM_WRITE_LOCK_PENDING; wake_up_all(&lock->queue); spin_unlock(&lock->lock); } } else wait_event(lock->queue, __ttm_read_lock(lock)); return ret; #endif }