summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/operation.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2015-07-01 12:37:22 +0200
committerGreg Kroah-Hartman <gregkh@google.com>2015-07-01 16:45:39 -0700
commite420721b47ef5b0d521584d4efc89ff64bd0cd74 (patch)
tree7ae9e850adda27abb38b3d5e0c9400749b2c5950 /drivers/staging/greybus/operation.c
parent3e136cc9e05e1a34d8602a4d4e31c9d93ccbbdf7 (diff)
downloadop-kernel-dev-e420721b47ef5b0d521584d4efc89ff64bd0cd74.zip
op-kernel-dev-e420721b47ef5b0d521584d4efc89ff64bd0cd74.tar.gz
greybus: operation: allow atomic operation allocations
Add gfp mask argument to gb_operation_create to allow operations to be allocated in atomic context. Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/operation.c')
-rw-r--r--drivers/staging/greybus/operation.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c
index b125bde..4019b03 100644
--- a/drivers/staging/greybus/operation.c
+++ b/drivers/staging/greybus/operation.c
@@ -409,22 +409,13 @@ EXPORT_SYMBOL_GPL(gb_operation_response_alloc);
*/
static struct gb_operation *
gb_operation_create_common(struct gb_connection *connection, u8 type,
- size_t request_size, size_t response_size)
+ size_t request_size, size_t response_size,
+ gfp_t gfp_flags)
{
struct greybus_host_device *hd = connection->hd;
struct gb_operation *operation;
unsigned long flags;
- gfp_t gfp_flags;
- /*
- * An incoming request will pass an invalid operation type,
- * because the header will get overwritten anyway. These
- * occur in interrupt context, so we must use GFP_ATOMIC.
- */
- if (type == GB_OPERATION_TYPE_INVALID)
- gfp_flags = GFP_ATOMIC;
- else
- gfp_flags = GFP_KERNEL;
operation = kmem_cache_zalloc(gb_operation_cache, gfp_flags);
if (!operation)
return NULL;
@@ -472,7 +463,8 @@ err_cache:
*/
struct gb_operation *gb_operation_create(struct gb_connection *connection,
u8 type, size_t request_size,
- size_t response_size)
+ size_t response_size,
+ gfp_t gfp)
{
if (WARN_ON_ONCE(type == GB_OPERATION_TYPE_INVALID))
return NULL;
@@ -480,7 +472,7 @@ struct gb_operation *gb_operation_create(struct gb_connection *connection,
type &= ~GB_MESSAGE_TYPE_RESPONSE;
return gb_operation_create_common(connection, type,
- request_size, response_size);
+ request_size, response_size, gfp);
}
EXPORT_SYMBOL_GPL(gb_operation_create);
@@ -504,7 +496,7 @@ gb_operation_create_incoming(struct gb_connection *connection, u16 id,
operation = gb_operation_create_common(connection,
GB_OPERATION_TYPE_INVALID,
- request_size, 0);
+ request_size, 0, GFP_ATOMIC);
if (operation) {
operation->id = id;
operation->type = type;
@@ -888,7 +880,8 @@ int gb_operation_sync(struct gb_connection *connection, int type,
return -EINVAL;
operation = gb_operation_create(connection, type,
- request_size, response_size);
+ request_size, response_size,
+ GFP_KERNEL);
if (!operation)
return -ENOMEM;
OpenPOWER on IntegriCloud