]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
greybus: move gbuf initialization to caller
authorAlex Elder <elder@linaro.org>
Tue, 18 Nov 2014 00:08:33 +0000 (18:08 -0600)
committerGreg Kroah-Hartman <greg@kroah.com>
Tue, 18 Nov 2014 01:19:20 +0000 (17:19 -0800)
Change greybus_alloc_gbuf() so all it does is allocate the gbuf data
structure.  Move all of the initialization of the gbuf structure in
the caller.  Do the inverse in the caller prior to freeing the gbuf
structure via greybus_free_gbuf().  Use a null gbuf->transfer_buffer
pointer rather than a null gbuf pointer to indicate an unused gbuf.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/gbuf.c
drivers/staging/greybus/greybus.h
drivers/staging/greybus/operation.c

index 1d0dd4acfa2ad48c4016b3cdf33a212b19bf8f09..5ffd257de68facfbdec4b7734676dc4323d71089 100644 (file)
@@ -38,32 +38,12 @@ struct gbuf *greybus_alloc_gbuf(struct greybus_host_device *hd,
                                unsigned int size,
                                gfp_t gfp_mask)
 {
-       struct gbuf *gbuf;
-       int retval;
-
-       gbuf = kmem_cache_zalloc(gbuf_head_cache, gfp_mask);
-       if (!gbuf)
-               return NULL;
-
-       gbuf->hd = hd;
-       gbuf->dest_cport_id = dest_cport_id;
-       gbuf->status = -EBADR;  /* Initial value--means "never set" */
-
-       /* Host controller specific allocation for the actual buffer */
-       retval = hd->driver->alloc_gbuf_data(gbuf, size, gfp_mask);
-       if (retval) {
-               kmem_cache_free(gbuf_head_cache, gbuf);
-               return NULL;
-       }
-
-       return gbuf;
+       return kmem_cache_zalloc(gbuf_head_cache, gfp_mask);
 }
 EXPORT_SYMBOL_GPL(greybus_alloc_gbuf);
 
 void greybus_free_gbuf(struct gbuf *gbuf)
 {
-       gbuf->hd->driver->free_gbuf_data(gbuf);
-
        kmem_cache_free(gbuf_head_cache, gbuf);
 }
 EXPORT_SYMBOL_GPL(greybus_free_gbuf);
index d6bfe6b2f70f30b41b2092e418b2c3c54d0925c9..e1f918d50df2e8035c68aa6c95569134a3aef75d 100644 (file)
@@ -106,7 +106,8 @@ void greybus_cport_in(struct greybus_host_device *hd, u16 cport_id,
                        u8 *data, size_t length);
 
 struct gbuf *greybus_alloc_gbuf(struct greybus_host_device *hd,
-                               u16 dest_cport_id, unsigned int size,
+                               u16 dest_cport_id,
+                               unsigned int size,
                                gfp_t gfp_mask);
 void greybus_free_gbuf(struct gbuf *gbuf);
 
index 18186fd2db8cf0234e8e1ae41878f9b3cefb1598..ab03e3edc8072db2bb1afba43219f380256111f0 100644 (file)
@@ -202,10 +202,13 @@ static int gb_operation_message_init(struct gb_operation *operation,
                                        bool request, bool data_out)
 {
        struct gb_connection *connection = operation->connection;
+       struct greybus_host_device *hd = connection->hd;
        struct gb_message *message;
        struct gb_operation_msg_hdr *header;
+       struct gbuf *gbuf;
        gfp_t gfp_flags = data_out ? GFP_KERNEL : GFP_ATOMIC;
        u16 dest_cport_id;
+       int ret;
 
        if (size > GB_OPERATION_MESSAGE_SIZE_MAX)
                return -E2BIG;
@@ -224,19 +227,27 @@ static int gb_operation_message_init(struct gb_operation *operation,
        if (message->gbuf)
                return -EALREADY;       /* Sanity check */
        size += sizeof(*header);
-       message->gbuf = greybus_alloc_gbuf(connection->hd, dest_cport_id,
-                                       size, gfp_flags);
-       if (!message->gbuf)
+       gbuf = greybus_alloc_gbuf(hd, dest_cport_id, size, gfp_flags);
+       if (!gbuf)
                return -ENOMEM;
+       gbuf->hd = hd;
+       gbuf->dest_cport_id = dest_cport_id;
+       gbuf->status = -EBADR;  /* Initial value--means "never set" */
+       ret = hd->driver->alloc_gbuf_data(gbuf, size, gfp_flags);
+       if (ret) {
+               greybus_free_gbuf(gbuf);
+               return ret;
+       }
 
        /* Fill in the header structure */
-       header = (struct gb_operation_msg_hdr *)message->gbuf->transfer_buffer;
+       header = (struct gb_operation_msg_hdr *)gbuf->transfer_buffer;
        header->size = cpu_to_le16(size);
        header->id = 0;         /* Filled in when submitted */
        header->type = type;
 
        message->payload = header + 1;
        message->operation = operation;
+       message->gbuf = gbuf;
 
        return 0;
 }
@@ -245,6 +256,7 @@ static void gb_operation_message_exit(struct gb_message *message)
 {
        message->operation = NULL;
        message->payload = NULL;
+       message->gbuf->hd->driver->free_gbuf_data(message->gbuf);
        greybus_free_gbuf(message->gbuf);
        message->gbuf = NULL;
 }