staging: unisys: memregion: Embed memregion in struct channel
authorJes Sorensen <Jes.Sorensen@redhat.com>
Tue, 5 May 2015 22:36:32 +0000 (18:36 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 May 2015 13:26:04 +0000 (15:26 +0200)
This changes the API for visor_memregion_create() to require a
pre-allocated struct memregion. Embedding this in struct channel
avoids a layer of additional kmalloc()'s and error checks.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/unisys/visorbus/visorchannel.c
drivers/staging/unisys/visorutil/memregion.h
drivers/staging/unisys/visorutil/memregion_direct.c

index 1a1e7be6369cc5259ca9f99dbfaf09329b2823b2..d2e4fe051ed1912d3caa25288e61bc7b7c88b22c 100644 (file)
@@ -30,7 +30,7 @@
 #define MYDRVNAME "visorchannel"
 
 struct visorchannel {
-       struct memregion *memregion;    /* from visor_memregion_create() */
+       struct memregion memregion;     /* from visor_memregion_create() */
        struct channel_header chan_hdr;
        uuid_le guid;
        ulong size;
@@ -63,19 +63,17 @@ visorchannel_create_guts(HOSTADDRESS physaddr, ulong channel_bytes,
        if (!channel)
                goto cleanup;
 
-       channel->memregion = NULL;
        channel->needs_lock = needs_lock;
        spin_lock_init(&channel->insert_lock);
        spin_lock_init(&channel->remove_lock);
 
        /* prepare chan_hdr (abstraction to read/write channel memory) */
-       memregion = visor_memregion_create(physaddr, size);
+       memregion = visor_memregion_create(&channel->memregion, physaddr, size);
 
        if (!memregion)
                goto cleanup;
-       channel->memregion = memregion;
 
-       err = visor_memregion_read(channel->memregion, 0, &channel->chan_hdr,
+       err = visor_memregion_read(&channel->memregion, 0, &channel->chan_hdr,
                                   sizeof(struct channel_header));
        if (err)
                goto cleanup;
@@ -86,7 +84,7 @@ visorchannel_create_guts(HOSTADDRESS physaddr, ulong channel_bytes,
        if (uuid_le_cmp(guid, NULL_UUID_LE) == 0)
                guid = channel->chan_hdr.chtype;
 
-       err = visor_memregion_resize(channel->memregion, channel_bytes);
+       err = visor_memregion_resize(&channel->memregion, channel_bytes);
        if (err)
                goto cleanup;
 
@@ -121,7 +119,7 @@ visorchannel_destroy(struct visorchannel *channel)
 {
        if (!channel)
                return;
-       visor_memregion_destroy(channel->memregion);
+       visor_memregion_destroy(&channel->memregion);
        kfree(channel);
 }
 EXPORT_SYMBOL_GPL(visorchannel_destroy);
@@ -129,7 +127,7 @@ EXPORT_SYMBOL_GPL(visorchannel_destroy);
 HOSTADDRESS
 visorchannel_get_physaddr(struct visorchannel *channel)
 {
-       return visor_memregion_get_physaddr(channel->memregion);
+       return visor_memregion_get_physaddr(&channel->memregion);
 }
 EXPORT_SYMBOL_GPL(visorchannel_get_physaddr);
 
@@ -179,7 +177,7 @@ EXPORT_SYMBOL_GPL(visorchannel_get_uuid);
 struct memregion *
 visorchannel_get_memregion(struct visorchannel *channel)
 {
-       return channel->memregion;
+       return &channel->memregion;
 }
 EXPORT_SYMBOL_GPL(visorchannel_get_memregion);
 
@@ -190,7 +188,7 @@ visorchannel_read(struct visorchannel *channel, ulong offset,
        int rc;
        size_t size = sizeof(struct channel_header);
 
-       rc = visor_memregion_read(channel->memregion, offset, local, nbytes);
+       rc = visor_memregion_read(&channel->memregion, offset, local, nbytes);
        if (rc && !offset && (nbytes >= size))
                memcpy(&channel->chan_hdr, local, size);
        return rc;
@@ -205,7 +203,8 @@ visorchannel_write(struct visorchannel *channel, ulong offset,
 
        if (!offset && nbytes >= size)
                memcpy(&channel->chan_hdr, local, size);
-       return visor_memregion_write(channel->memregion, offset, local, nbytes);
+       return visor_memregion_write(&channel->memregion,
+                                    offset, local, nbytes);
 }
 EXPORT_SYMBOL_GPL(visorchannel_write);
 
@@ -229,7 +228,7 @@ visorchannel_clear(struct visorchannel *channel, ulong offset, u8 ch,
 
                if (nbytes < thisbytes)
                        thisbytes = nbytes;
-               err = visor_memregion_write(channel->memregion,
+               err = visor_memregion_write(&channel->memregion,
                                            offset + written, buf, thisbytes);
                if (err)
                        goto cleanup;
@@ -270,7 +269,7 @@ EXPORT_SYMBOL_GPL(visorchannel_get_header);
  *  into host memory
  */
 #define SIG_WRITE_FIELD(channel, queue, sig_hdr, FIELD)                        \
-       (visor_memregion_write(channel->memregion,                      \
+       (visor_memregion_write(&channel->memregion,                     \
                               SIG_QUEUE_OFFSET(&channel->chan_hdr, queue)+ \
                               offsetof(struct signal_queue_header, FIELD),\
                               &((sig_hdr)->FIELD),                     \
@@ -286,7 +285,7 @@ sig_read_header(struct visorchannel *channel, u32 queue,
                return FALSE;
 
        /* Read the appropriate SIGNAL_QUEUE_HEADER into local memory. */
-       err = visor_memregion_read(channel->memregion,
+       err = visor_memregion_read(&channel->memregion,
                                   SIG_QUEUE_OFFSET(&channel->chan_hdr, queue),
                                   sig_hdr, sizeof(struct signal_queue_header));
        if (err)
@@ -303,7 +302,7 @@ sig_read_data(struct visorchannel *channel, u32 queue,
        int signal_data_offset = SIG_DATA_OFFSET(&channel->chan_hdr, queue,
                                                 sig_hdr, slot);
 
-       err = visor_memregion_read(channel->memregion,
+       err = visor_memregion_read(&channel->memregion,
                                   signal_data_offset,
                                   data, sig_hdr->signal_size);
        if (err)
@@ -320,7 +319,7 @@ sig_write_data(struct visorchannel *channel, u32 queue,
        int signal_data_offset = SIG_DATA_OFFSET(&channel->chan_hdr, queue,
                                                 sig_hdr, slot);
 
-       err = visor_memregion_write(channel->memregion,
+       err = visor_memregion_write(&channel->memregion,
                                    signal_data_offset,
                                    data, sig_hdr->signal_size);
        if (err)
@@ -383,7 +382,7 @@ signalinsert_inner(struct visorchannel *channel, u32 queue, void *msg)
        sig_hdr.head = ((sig_hdr.head + 1) % sig_hdr.max_slots);
        if (sig_hdr.head == sig_hdr.tail) {
                sig_hdr.num_overflows++;
-               visor_memregion_write(channel->memregion,
+               visor_memregion_write(&channel->memregion,
                                      SIG_QUEUE_OFFSET(&channel->chan_hdr,
                                                       queue) +
                                      offsetof(struct signal_queue_header,
@@ -495,9 +494,6 @@ visorchannel_debug(struct visorchannel *channel, int num_queues,
 
        if (!channel)
                return;
-       memregion = channel->memregion;
-       if (!memregion)
-               return;
 
        addr = visor_memregion_get_physaddr(memregion);
        nbytes_region = visor_memregion_get_nbytes(memregion);
index 8f006fca73b2e147217d23f6d1bfab1b00e86044..3826fe6c24461124999e9a14b4dbdf091720c748 100644 (file)
@@ -29,7 +29,8 @@ struct memregion {
        void __iomem *mapped;
 };
 
-struct memregion *visor_memregion_create(HOSTADDRESS physaddr, ulong nbytes);
+struct memregion *visor_memregion_create(struct memregion *memregion,
+                                        HOSTADDRESS physaddr, ulong nbytes);
 int visor_memregion_resize(struct memregion *memregion, ulong newsize);
 int visor_memregion_read(struct memregion *memregion,
                         ulong offset, void *dest, ulong nbytes);
index 4ad25df767cd9cc39c7b391e9251e003e7c3d399..a575ecc5c3d76d8838c3f4c41bf48f5474dff51b 100644 (file)
@@ -29,14 +29,10 @@ static int mapit(struct memregion *memregion);
 static void unmapit(struct memregion *memregion);
 
 struct memregion *
-visor_memregion_create(HOSTADDRESS physaddr, ulong nbytes)
+visor_memregion_create(struct memregion *memregion,
+                      HOSTADDRESS physaddr, ulong nbytes)
 {
        struct memregion *rc = NULL;
-       struct memregion *memregion;
-
-       memregion = kzalloc(sizeof(*memregion), GFP_KERNEL | __GFP_NORETRY);
-       if (memregion == NULL)
-               return NULL;
 
        memregion->physaddr = physaddr;
        memregion->nbytes = nbytes;
@@ -148,6 +144,5 @@ visor_memregion_destroy(struct memregion *memregion)
        if (!memregion)
                return;
        unmapit(memregion);
-       kfree(memregion);
 }
 EXPORT_SYMBOL_GPL(visor_memregion_destroy);