[PATCH v2 1/5] staging: greybus: operation: add asynchronous gb_operation_cancel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxxxx>
---
 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

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux