|
@@ -4565,6 +4565,15 @@ __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(__wake_up_sync); /* For internal use only */
|
|
EXPORT_SYMBOL_GPL(__wake_up_sync); /* For internal use only */
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * complete: - signals a single thread waiting on this completion
|
|
|
|
+ * @x: holds the state of this particular completion
|
|
|
|
+ *
|
|
|
|
+ * This will wake up a single thread waiting on this completion. Threads will be
|
|
|
|
+ * awakened in the same order in which they were queued.
|
|
|
|
+ *
|
|
|
|
+ * See also complete_all(), wait_for_completion() and related routines.
|
|
|
|
+ */
|
|
void complete(struct completion *x)
|
|
void complete(struct completion *x)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
@@ -4576,6 +4585,12 @@ void complete(struct completion *x)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(complete);
|
|
EXPORT_SYMBOL(complete);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * complete_all: - signals all threads waiting on this completion
|
|
|
|
+ * @x: holds the state of this particular completion
|
|
|
|
+ *
|
|
|
|
+ * This will wake up all threads waiting on this particular completion event.
|
|
|
|
+ */
|
|
void complete_all(struct completion *x)
|
|
void complete_all(struct completion *x)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
@@ -4624,12 +4639,31 @@ wait_for_common(struct completion *x, long timeout, int state)
|
|
return timeout;
|
|
return timeout;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * wait_for_completion: - waits for completion of a task
|
|
|
|
+ * @x: holds the state of this particular completion
|
|
|
|
+ *
|
|
|
|
+ * This waits to be signaled for completion of a specific task. It is NOT
|
|
|
|
+ * interruptible and there is no timeout.
|
|
|
|
+ *
|
|
|
|
+ * See also similar routines (i.e. wait_for_completion_timeout()) with timeout
|
|
|
|
+ * and interrupt capability. Also see complete().
|
|
|
|
+ */
|
|
void __sched wait_for_completion(struct completion *x)
|
|
void __sched wait_for_completion(struct completion *x)
|
|
{
|
|
{
|
|
wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_UNINTERRUPTIBLE);
|
|
wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_UNINTERRUPTIBLE);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(wait_for_completion);
|
|
EXPORT_SYMBOL(wait_for_completion);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * wait_for_completion_timeout: - waits for completion of a task (w/timeout)
|
|
|
|
+ * @x: holds the state of this particular completion
|
|
|
|
+ * @timeout: timeout value in jiffies
|
|
|
|
+ *
|
|
|
|
+ * This waits for either a completion of a specific task to be signaled or for a
|
|
|
|
+ * specified timeout to expire. The timeout is in jiffies. It is not
|
|
|
|
+ * interruptible.
|
|
|
|
+ */
|
|
unsigned long __sched
|
|
unsigned long __sched
|
|
wait_for_completion_timeout(struct completion *x, unsigned long timeout)
|
|
wait_for_completion_timeout(struct completion *x, unsigned long timeout)
|
|
{
|
|
{
|
|
@@ -4637,6 +4671,13 @@ wait_for_completion_timeout(struct completion *x, unsigned long timeout)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(wait_for_completion_timeout);
|
|
EXPORT_SYMBOL(wait_for_completion_timeout);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * wait_for_completion_interruptible: - waits for completion of a task (w/intr)
|
|
|
|
+ * @x: holds the state of this particular completion
|
|
|
|
+ *
|
|
|
|
+ * This waits for completion of a specific task to be signaled. It is
|
|
|
|
+ * interruptible.
|
|
|
|
+ */
|
|
int __sched wait_for_completion_interruptible(struct completion *x)
|
|
int __sched wait_for_completion_interruptible(struct completion *x)
|
|
{
|
|
{
|
|
long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_INTERRUPTIBLE);
|
|
long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_INTERRUPTIBLE);
|
|
@@ -4646,6 +4687,14 @@ int __sched wait_for_completion_interruptible(struct completion *x)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(wait_for_completion_interruptible);
|
|
EXPORT_SYMBOL(wait_for_completion_interruptible);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * wait_for_completion_interruptible_timeout: - waits for completion (w/(to,intr))
|
|
|
|
+ * @x: holds the state of this particular completion
|
|
|
|
+ * @timeout: timeout value in jiffies
|
|
|
|
+ *
|
|
|
|
+ * This waits for either a completion of a specific task to be signaled or for a
|
|
|
|
+ * specified timeout to expire. It is interruptible. The timeout is in jiffies.
|
|
|
|
+ */
|
|
unsigned long __sched
|
|
unsigned long __sched
|
|
wait_for_completion_interruptible_timeout(struct completion *x,
|
|
wait_for_completion_interruptible_timeout(struct completion *x,
|
|
unsigned long timeout)
|
|
unsigned long timeout)
|
|
@@ -4654,6 +4703,13 @@ wait_for_completion_interruptible_timeout(struct completion *x,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(wait_for_completion_interruptible_timeout);
|
|
EXPORT_SYMBOL(wait_for_completion_interruptible_timeout);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * wait_for_completion_killable: - waits for completion of a task (killable)
|
|
|
|
+ * @x: holds the state of this particular completion
|
|
|
|
+ *
|
|
|
|
+ * This waits to be signaled for completion of a specific task. It can be
|
|
|
|
+ * interrupted by a kill signal.
|
|
|
|
+ */
|
|
int __sched wait_for_completion_killable(struct completion *x)
|
|
int __sched wait_for_completion_killable(struct completion *x)
|
|
{
|
|
{
|
|
long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_KILLABLE);
|
|
long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_KILLABLE);
|