From 1c7658cf5165586acff901b7e6ef27d8d5f2818d Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 17 Jul 2015 18:50:25 +0200 Subject: [PATCH] greybus: operation: fix atomic response allocation Response allocation also needs a GFP-flags argument as a response is allocated as part of an outgoing operation. Fixes: 9aa174d202e5 ("operation: allow atomic operation allocations") Signed-off-by: Johan Hovold Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/control.c | 3 ++- drivers/staging/greybus/loopback.c | 3 ++- drivers/staging/greybus/operation.c | 11 ++++++----- drivers/staging/greybus/operation.h | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/staging/greybus/control.c b/drivers/staging/greybus/control.c index d7870fc83ed2..a69a703a1848 100644 --- a/drivers/staging/greybus/control.c +++ b/drivers/staging/greybus/control.c @@ -75,7 +75,8 @@ static int gb_control_request_recv(u8 type, struct gb_operation *op) // an AP. break; case GB_CONTROL_TYPE_PROTOCOL_VERSION: - if (!gb_operation_response_alloc(op, sizeof(*version))) { + if (!gb_operation_response_alloc(op, sizeof(*version), + GFP_KERNEL)) { dev_err(&connection->dev, "%s: error allocating response\n", __func__); return -ENOMEM; diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c index f07fc0a837d5..fe3a57bff99c 100644 --- a/drivers/staging/greybus/loopback.c +++ b/drivers/staging/greybus/loopback.c @@ -283,7 +283,8 @@ static int gb_loopback_request_recv(u8 type, struct gb_operation *operation) } if (len) { - if (!gb_operation_response_alloc(operation, len)) { + if (!gb_operation_response_alloc(operation, len, + GFP_KERNEL)) { dev_err(&connection->dev, "error allocating response\n"); return -ENOMEM; diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c index a99505cc21fa..0fe50d80b2db 100644 --- a/drivers/staging/greybus/operation.c +++ b/drivers/staging/greybus/operation.c @@ -426,7 +426,7 @@ static u8 gb_operation_errno_map(int errno) } bool gb_operation_response_alloc(struct gb_operation *operation, - size_t response_size) + size_t response_size, gfp_t gfp) { struct greybus_host_device *hd = operation->connection->hd; struct gb_operation_msg_hdr *request_header; @@ -434,8 +434,7 @@ bool gb_operation_response_alloc(struct gb_operation *operation, u8 type; type = operation->type | GB_MESSAGE_TYPE_RESPONSE; - response = gb_operation_message_alloc(hd, type, response_size, - GFP_KERNEL); + response = gb_operation_message_alloc(hd, type, response_size, gfp); if (!response) return false; response->operation = operation; @@ -497,8 +496,10 @@ gb_operation_create_common(struct gb_connection *connection, u8 type, /* Allocate the response buffer for outgoing operations */ if (!(op_flags & GB_OPERATION_FLAG_INCOMING)) { - if (!gb_operation_response_alloc(operation, response_size)) + if (!gb_operation_response_alloc(operation, response_size, + gfp_flags)) { goto err_request; + } } operation->flags = op_flags; @@ -734,7 +735,7 @@ static int gb_operation_response_send(struct gb_operation *operation, if (!operation->response && !gb_operation_is_unidirectional(operation)) { - if (!gb_operation_response_alloc(operation, 0)) + if (!gb_operation_response_alloc(operation, 0, GFP_KERNEL)) return -ENOMEM; } diff --git a/drivers/staging/greybus/operation.h b/drivers/staging/greybus/operation.h index 685470349460..00189e963a01 100644 --- a/drivers/staging/greybus/operation.h +++ b/drivers/staging/greybus/operation.h @@ -166,7 +166,7 @@ static inline void gb_operation_destroy(struct gb_operation *operation) } bool gb_operation_response_alloc(struct gb_operation *operation, - size_t response_size); + size_t response_size, gfp_t gfp); int gb_operation_request_send(struct gb_operation *operation, gb_operation_callback callback, -- 2.39.2