]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
greybus: operation: allow atomic request submissions
authorJohan Hovold <johan@hovoldconsulting.com>
Wed, 1 Jul 2015 10:37:23 +0000 (12:37 +0200)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 1 Jul 2015 23:50:59 +0000 (16:50 -0700)
Add gfp mask argument to gb_operation_request_send in order to allow
submissions from atomic context.

Note that responses are currently always sent from non-atomic context as
incoming requests are processed in a work queue.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/operation.c
drivers/staging/greybus/operation.h

index 4019b030e31caaa85aa713757f0591d61c34c0ef..eee315c5861dafe11a7e53273d88832527121cf9 100644 (file)
@@ -129,7 +129,7 @@ gb_operation_find(struct gb_connection *connection, u16 operation_id)
        return found ? operation : NULL;
 }
 
-static int gb_message_send(struct gb_message *message)
+static int gb_message_send(struct gb_message *message, gfp_t gfp)
 {
        struct gb_connection *connection = message->operation->connection;
 
@@ -563,7 +563,8 @@ static void gb_operation_sync_callback(struct gb_operation *operation)
  * dropping the initial reference to the operation.
  */
 int gb_operation_request_send(struct gb_operation *operation,
-                               gb_operation_callback callback)
+                               gb_operation_callback callback,
+                               gfp_t gfp)
 {
        struct gb_connection *connection = operation->connection;
        struct gb_operation_msg_hdr *header;
@@ -601,7 +602,7 @@ int gb_operation_request_send(struct gb_operation *operation,
        /* All set, send the request */
        gb_operation_result_set(operation, -EINPROGRESS);
 
-       ret = gb_message_send(operation->request);
+       ret = gb_message_send(operation->request, gfp);
        if (ret)
                gb_operation_put(operation);
 
@@ -620,7 +621,8 @@ int gb_operation_request_send_sync(struct gb_operation *operation)
        int ret;
        unsigned long timeout;
 
-       ret = gb_operation_request_send(operation, gb_operation_sync_callback);
+       ret = gb_operation_request_send(operation, gb_operation_sync_callback,
+                                       GFP_KERNEL);
        if (ret)
                return ret;
 
@@ -677,7 +679,7 @@ int gb_operation_response_send(struct gb_operation *operation, int errno)
        /* Fill in the response header and send it */
        operation->response->header->result = gb_operation_errno_map(errno);
 
-       ret = gb_message_send(operation->response);
+       ret = gb_message_send(operation->response, GFP_KERNEL);
        if (ret)
                gb_operation_put(operation);
 
index 395664835eac0c8539b73671f5708fa6a9ce2e68..40632238845e21e034f2c9ec5ffdbe6ca98644ba 100644 (file)
@@ -147,7 +147,8 @@ bool gb_operation_response_alloc(struct gb_operation *operation,
                                        size_t response_size);
 
 int gb_operation_request_send(struct gb_operation *operation,
-                               gb_operation_callback callback);
+                               gb_operation_callback callback,
+                               gfp_t gfp);
 int gb_operation_request_send_sync(struct gb_operation *operation);
 int gb_operation_response_send(struct gb_operation *operation, int errno);