Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce6c414e authored by Mike Marshall's avatar Mike Marshall
Browse files

Orangefs: Don't wait the old-fashioned way.



Get rid of add_wait_queue, set_current_state, etc, and use the
wait_event() model.

Signed-off-by: default avatarMike Marshall <hubcap@omnibond.com>
parent 97f10027
Loading
Loading
Loading
Loading
+8 −9
Original line number Diff line number Diff line
@@ -432,7 +432,6 @@ static ssize_t orangefs_devreq_writev(struct file *file,
				return -EIO;
			}
		} else {
			/* Change downcall status */
			gossip_err("writev: could not vmalloc for trailer!\n");
			dev_req_release(buffer);
			put_op(op);
@@ -453,7 +452,7 @@ static ssize_t orangefs_devreq_writev(struct file *file,
		 */
		if (op->upcall.type == ORANGEFS_VFS_OP_FILE_IO) {
			int timed_out = 0;
			DECLARE_WAITQUEUE(wait_entry, current);
			DEFINE_WAIT(wait_entry);

			/*
			 * tell the vfs op waiting on a waitqueue
@@ -463,14 +462,14 @@ static ssize_t orangefs_devreq_writev(struct file *file,
			set_op_state_serviced(op);
			spin_unlock(&op->lock);

			add_wait_queue_exclusive(&op->io_completion_waitq,
						 &wait_entry);
			wake_up_interruptible(&op->waitq);

			while (1) {
				set_current_state(TASK_INTERRUPTIBLE);

				spin_lock(&op->lock);
				prepare_to_wait_exclusive(
					&op->io_completion_waitq,
					&wait_entry,
					TASK_INTERRUPTIBLE);
				if (op->io_completed) {
					spin_unlock(&op->lock);
					break;
@@ -497,9 +496,9 @@ static ssize_t orangefs_devreq_writev(struct file *file,
				break;
			}

			set_current_state(TASK_RUNNING);
			remove_wait_queue(&op->io_completion_waitq,
					  &wait_entry);
			spin_lock(&op->lock);
			finish_wait(&op->io_completion_waitq, &wait_entry);
			spin_unlock(&op->lock);

			/* NOTE: for I/O operations we handle releasing the op
			 * object except in the case of timeout.  the reason we
+7 −8
Original line number Diff line number Diff line
@@ -333,19 +333,17 @@ static int wait_for_a_slot(struct slot_args *slargs, int *buffer_index)
{
	int ret = -1;
	int i = 0;
	DECLARE_WAITQUEUE(my_wait, current);


	add_wait_queue_exclusive(slargs->slot_wq, &my_wait);
	DEFINE_WAIT(wait_entry);

	while (1) {
		set_current_state(TASK_INTERRUPTIBLE);

		/*
		 * check for available desc, slot_lock is the appropriate
		 * index_lock
		 */
		spin_lock(slargs->slot_lock);
		prepare_to_wait_exclusive(slargs->slot_wq,
					  &wait_entry,
					  TASK_INTERRUPTIBLE);
		for (i = 0; i < slargs->slot_count; i++)
			if (slargs->slot_array[i] == 0) {
				slargs->slot_array[i] = 1;
@@ -383,8 +381,9 @@ static int wait_for_a_slot(struct slot_args *slargs, int *buffer_index)
		break;
	}

	set_current_state(TASK_RUNNING);
	remove_wait_queue(slargs->slot_wq, &my_wait);
	spin_lock(slargs->slot_lock);
	finish_wait(slargs->slot_wq, &wait_entry);
	spin_unlock(slargs->slot_lock);
	return ret;
}

+11 −26
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ int service_operation(struct orangefs_kernel_op_s *op,
	/* irqflags and wait_entry are only used IF the client-core aborts */
	unsigned long irqflags;

	DECLARE_WAITQUEUE(wait_entry, current);
	DEFINE_WAIT(wait_entry);

	op->upcall.tgid = current->tgid;
	op->upcall.pid = current->pid;
@@ -204,11 +204,11 @@ int service_operation(struct orangefs_kernel_op_s *op,
			 * memory system can be initialized.
			 */
			spin_lock_irqsave(&op->lock, irqflags);
			add_wait_queue(&orangefs_bufmap_init_waitq, &wait_entry);
			prepare_to_wait(&orangefs_bufmap_init_waitq,
					&wait_entry,
					TASK_INTERRUPTIBLE);
			spin_unlock_irqrestore(&op->lock, irqflags);

			set_current_state(TASK_INTERRUPTIBLE);

			/*
			 * Wait for orangefs_bufmap_initialize() to wake me up
			 * within the allotted time.
@@ -225,8 +225,7 @@ int service_operation(struct orangefs_kernel_op_s *op,
				     get_bufmap_init());

			spin_lock_irqsave(&op->lock, irqflags);
			remove_wait_queue(&orangefs_bufmap_init_waitq,
					  &wait_entry);
			finish_wait(&orangefs_bufmap_init_waitq, &wait_entry);
			spin_unlock_irqrestore(&op->lock, irqflags);

			if (get_bufmap_init() == 0) {
@@ -342,16 +341,11 @@ void orangefs_clean_up_interrupted_operation(struct orangefs_kernel_op_s *op)
int wait_for_matching_downcall(struct orangefs_kernel_op_s *op)
{
	int ret = -EINVAL;
	DECLARE_WAITQUEUE(wait_entry, current);

	spin_lock(&op->lock);
	add_wait_queue(&op->waitq, &wait_entry);
	spin_unlock(&op->lock);
	DEFINE_WAIT(wait_entry);

	while (1) {
		set_current_state(TASK_INTERRUPTIBLE);

		spin_lock(&op->lock);
		prepare_to_wait(&op->waitq, &wait_entry, TASK_INTERRUPTIBLE);
		if (op_state_serviced(op)) {
			spin_unlock(&op->lock);
			ret = 0;
@@ -434,10 +428,8 @@ int wait_for_matching_downcall(struct orangefs_kernel_op_s *op)
		break;
	}

	set_current_state(TASK_RUNNING);

	spin_lock(&op->lock);
	remove_wait_queue(&op->waitq, &wait_entry);
	finish_wait(&op->waitq, &wait_entry);
	spin_unlock(&op->lock);

	return ret;
@@ -455,16 +447,11 @@ int wait_for_matching_downcall(struct orangefs_kernel_op_s *op)
int wait_for_cancellation_downcall(struct orangefs_kernel_op_s *op)
{
	int ret = -EINVAL;
	DECLARE_WAITQUEUE(wait_entry, current);

	spin_lock(&op->lock);
	add_wait_queue(&op->waitq, &wait_entry);
	spin_unlock(&op->lock);
	DEFINE_WAIT(wait_entry);

	while (1) {
		set_current_state(TASK_INTERRUPTIBLE);

		spin_lock(&op->lock);
		prepare_to_wait(&op->waitq, &wait_entry, TASK_INTERRUPTIBLE);
		if (op_state_serviced(op)) {
			gossip_debug(GOSSIP_WAIT_DEBUG,
				     "%s:op-state is SERVICED.\n",
@@ -514,10 +501,8 @@ int wait_for_cancellation_downcall(struct orangefs_kernel_op_s *op)
		break;
	}

	set_current_state(TASK_RUNNING);

	spin_lock(&op->lock);
	remove_wait_queue(&op->waitq, &wait_entry);
	finish_wait(&op->waitq, &wait_entry);
	spin_unlock(&op->lock);

	gossip_debug(GOSSIP_WAIT_DEBUG,