[PATCH v2 1/5] staging: greybus: operation: add asynchronous gb_operation_cancel
Bryan O'Donoghue
pure.logic at nexus-software.ie
Tue Dec 27 13:01:35 UTC 2016
Later patches don't want or need to serialize the cancellation of an
operation. This patch adds gb_operation_cancel_async() as a simple subset
of the existing gb_operation_cancel() sans the synchronous wait on the
cancellation queue.
Signed-off-by: Bryan O'Donoghue <pure.logic at nexus-software.ie>
---
drivers/staging/greybus/operation.c | 19 ++++++++++++++++---
drivers/staging/greybus/operation.h | 1 +
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c
index 0123109..e69f329 100644
--- a/drivers/staging/greybus/operation.c
+++ b/drivers/staging/greybus/operation.c
@@ -1043,13 +1043,13 @@ void gb_connection_recv(struct gb_connection *connection,
}
/*
- * Cancel an outgoing operation synchronously, and record the given error to
+ * Cancel an outgoing operation asynchronously, and record the given error to
* indicate why.
*/
-void gb_operation_cancel(struct gb_operation *operation, int errno)
+int gb_operation_cancel_async(struct gb_operation *operation, int errno)
{
if (WARN_ON(gb_operation_is_incoming(operation)))
- return;
+ return -EINVAL;
if (gb_operation_result_set(operation, errno)) {
gb_message_cancel(operation->request);
@@ -1057,6 +1057,19 @@ void gb_operation_cancel(struct gb_operation *operation, int errno)
}
trace_gb_message_cancel_outgoing(operation->request);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(gb_operation_cancel_async);
+
+/*
+ * Cancel an outgoing operation synchronously, and record the given error to
+ * indicate why.
+ */
+void gb_operation_cancel(struct gb_operation *operation, int errno)
+{
+ if (gb_operation_cancel_async(operation, errno))
+ return;
+
atomic_inc(&operation->waiters);
wait_event(gb_operation_cancellation_queue,
!gb_operation_is_active(operation));
diff --git a/drivers/staging/greybus/operation.h b/drivers/staging/greybus/operation.h
index de09a2c..467a0dc 100644
--- a/drivers/staging/greybus/operation.h
+++ b/drivers/staging/greybus/operation.h
@@ -174,6 +174,7 @@ gb_operation_request_send_sync(struct gb_operation *operation)
GB_OPERATION_TIMEOUT_DEFAULT);
}
+int gb_operation_cancel_async(struct gb_operation *operation, int errno);
void gb_operation_cancel(struct gb_operation *operation, int errno);
void gb_operation_cancel_incoming(struct gb_operation *operation, int errno);
--
2.7.4
More information about the devel
mailing list