Author: mav
Date: Sat Feb 23 23:35:52 2019
New Revision: 344489
URL: https://svnweb.freebsd.org/changeset/base/344489

Log:
  Free some space in struct ctl_io_hdr for better use.
  
   - Collapse original_sc and serializing_sc fields into one, since they
  are never used simultanously, we have only one local I/O and one remote.
  
   - Move remote_sglist and local_sglist fields into CTL_PRIV_BACKEND,
  since they are used only on Originating SC in XFER mode, where requests
  don't ever reach backends, so we can reuse backend's private storage.
  
  MFC after:    2 weeks
  Sponsored by: iXsystems, Inc.

Modified:
  head/sys/cam/ctl/ctl.c
  head/sys/cam/ctl/ctl_io.h

Modified: head/sys/cam/ctl/ctl.c
==============================================================================
--- head/sys/cam/ctl/ctl.c      Sat Feb 23 23:31:13 2019        (r344488)
+++ head/sys/cam/ctl/ctl.c      Sat Feb 23 23:35:52 2019        (r344489)
@@ -651,7 +651,7 @@ ctl_ha_datamove(union ctl_io *io)
 
        memset(&msg.dt, 0, sizeof(msg.dt));
        msg.hdr.msg_type = CTL_MSG_DATAMOVE;
-       msg.hdr.original_sc = io->io_hdr.original_sc;
+       msg.hdr.original_sc = io->io_hdr.remote_io;
        msg.hdr.serializing_sc = io;
        msg.hdr.nexus = io->io_hdr.nexus;
        msg.hdr.status = io->io_hdr.status;
@@ -766,7 +766,7 @@ ctl_ha_done(union ctl_io *io)
        if (io->io_hdr.io_type == CTL_IO_SCSI) {
                memset(&msg, 0, sizeof(msg));
                msg.hdr.msg_type = CTL_MSG_FINISH_IO;
-               msg.hdr.original_sc = io->io_hdr.original_sc;
+               msg.hdr.original_sc = io->io_hdr.remote_io;
                msg.hdr.nexus = io->io_hdr.nexus;
                msg.hdr.status = io->io_hdr.status;
                msg.scsi.scsi_status = io->scsiio.scsi_status;
@@ -1439,7 +1439,7 @@ ctl_isc_event_handler(ctl_ha_channel channel, ctl_ha_e
                        // populate ctsio from msg
                        io->io_hdr.io_type = CTL_IO_SCSI;
                        io->io_hdr.msg_type = CTL_MSG_SERIALIZE;
-                       io->io_hdr.original_sc = msg->hdr.original_sc;
+                       io->io_hdr.remote_io = msg->hdr.original_sc;
                        io->io_hdr.flags |= CTL_FLAG_FROM_OTHER_SC |
                                            CTL_FLAG_IO_ACTIVE;
                        /*
@@ -1495,7 +1495,7 @@ ctl_isc_event_handler(ctl_ha_channel channel, ctl_ha_e
                         * Keep track of this, we need to send it back over
                         * when the datamove is complete.
                         */
-                       io->io_hdr.serializing_sc = msg->hdr.serializing_sc;
+                       io->io_hdr.remote_io = msg->hdr.serializing_sc;
                        if (msg->hdr.status == CTL_SUCCESS)
                                io->io_hdr.status = msg->hdr.status;
 
@@ -1508,9 +1508,8 @@ ctl_isc_event_handler(ctl_ha_channel channel, ctl_ha_e
                                    CTL_HA_DATAMOVE_SEGMENT + 1;
                                sgl = malloc(sizeof(*sgl) * i, M_CTL,
                                    M_WAITOK | M_ZERO);
-                               io->io_hdr.remote_sglist = sgl;
-                               io->io_hdr.local_sglist =
-                                   &sgl[msg->dt.kern_sg_entries];
+                               CTL_RSGL(io) = sgl;
+                               CTL_LSGL(io) = &sgl[msg->dt.kern_sg_entries];
 
                                io->scsiio.kern_data_ptr = (uint8_t *)sgl;
 
@@ -1597,7 +1596,7 @@ ctl_isc_event_handler(ctl_ha_channel channel, ctl_ha_e
                        }
                        io->io_hdr.flags |= CTL_FLAG_IO_ACTIVE;
                        io->io_hdr.msg_type = CTL_MSG_R2R;
-                       io->io_hdr.serializing_sc = msg->hdr.serializing_sc;
+                       io->io_hdr.remote_io = msg->hdr.serializing_sc;
                        ctl_enqueue_isc(io);
                        break;
 
@@ -2369,7 +2368,7 @@ ctl_serialize_other_sc_cmd(struct ctl_scsiio *ctsio)
                        mtx_unlock(&lun->lun_lock);
 
                        /* send msg back to other side */
-                       msg_info.hdr.original_sc = ctsio->io_hdr.original_sc;
+                       msg_info.hdr.original_sc = ctsio->io_hdr.remote_io;
                        msg_info.hdr.serializing_sc = (union ctl_io *)ctsio;
                        msg_info.hdr.msg_type = CTL_MSG_R2R;
                        ctl_ha_msg_send(CTL_HA_CHAN_CTL, &msg_info,
@@ -2395,7 +2394,7 @@ ctl_serialize_other_sc_cmd(struct ctl_scsiio *ctsio)
                                         /*retry_count*/ 0);
 badjuju:
                ctl_copy_sense_data_back((union ctl_io *)ctsio, &msg_info);
-               msg_info.hdr.original_sc = ctsio->io_hdr.original_sc;
+               msg_info.hdr.original_sc = ctsio->io_hdr.remote_io;
                msg_info.hdr.serializing_sc = NULL;
                msg_info.hdr.msg_type = CTL_MSG_BAD_JUJU;
                ctl_ha_msg_send(CTL_HA_CHAN_CTL, &msg_info,
@@ -11043,7 +11042,7 @@ ctl_check_blocked(struct ctl_lun *lun)
 
                                cur_blocked->io_hdr.flags &= 
~CTL_FLAG_IO_ACTIVE;
                                msg_info.hdr.original_sc =
-                                       cur_blocked->io_hdr.original_sc;
+                                       cur_blocked->io_hdr.remote_io;
                                msg_info.hdr.serializing_sc = cur_blocked;
                                msg_info.hdr.msg_type = CTL_MSG_R2R;
                                ctl_ha_msg_send(CTL_HA_CHAN_CTL, &msg_info,
@@ -12480,7 +12479,7 @@ ctl_send_datamove_done(union ctl_io *io, int have_lock
        memset(&msg, 0, sizeof(msg));
        msg.hdr.msg_type = CTL_MSG_DATAMOVE_DONE;
        msg.hdr.original_sc = io;
-       msg.hdr.serializing_sc = io->io_hdr.serializing_sc;
+       msg.hdr.serializing_sc = io->io_hdr.remote_io;
        msg.hdr.nexus = io->io_hdr.nexus;
        msg.hdr.status = io->io_hdr.status;
        msg.scsi.kern_data_resid = io->scsiio.kern_data_resid;
@@ -12531,10 +12530,10 @@ ctl_datamove_remote_write_cb(struct ctl_ha_dt_req *rq)
        ctl_dt_req_free(rq);
 
        for (i = 0; i < io->scsiio.kern_sg_entries; i++)
-               free(io->io_hdr.local_sglist[i].addr, M_CTL);
-       free(io->io_hdr.remote_sglist, M_CTL);
-       io->io_hdr.remote_sglist = NULL;
-       io->io_hdr.local_sglist = NULL;
+               free(CTL_LSGLT(io)[i].addr, M_CTL);
+       free(CTL_RSGL(io), M_CTL);
+       CTL_RSGL(io) = NULL;
+       CTL_LSGL(io) = NULL;
 
        /*
         * The data is in local and remote memory, so now we need to send
@@ -12574,7 +12573,7 @@ ctl_datamove_remote_write(union ctl_io *io)
                return;
 
        /* Switch the pointer over so the FETD knows what to do */
-       io->scsiio.kern_data_ptr = (uint8_t *)io->io_hdr.local_sglist;
+       io->scsiio.kern_data_ptr = (uint8_t *)CTL_LSGL(io);
 
        /*
         * Use a custom move done callback, since we need to send completion
@@ -12597,10 +12596,10 @@ ctl_datamove_remote_dm_read_cb(union ctl_io *io)
        uint32_t i;
 
        for (i = 0; i < io->scsiio.kern_sg_entries; i++)
-               free(io->io_hdr.local_sglist[i].addr, M_CTL);
-       free(io->io_hdr.remote_sglist, M_CTL);
-       io->io_hdr.remote_sglist = NULL;
-       io->io_hdr.local_sglist = NULL;
+               free(CTL_LSGLT(io)[i].addr, M_CTL);
+       free(CTL_RSGL(io), M_CTL);
+       CTL_RSGL(io) = NULL;
+       CTL_LSGL(io) = NULL;
 
 #if 0
        scsi_path_string(io, path_str, sizeof(path_str));
@@ -12647,7 +12646,7 @@ ctl_datamove_remote_read_cb(struct ctl_ha_dt_req *rq)
        ctl_dt_req_free(rq);
 
        /* Switch the pointer over so the FETD knows what to do */
-       io->scsiio.kern_data_ptr = (uint8_t *)io->io_hdr.local_sglist;
+       io->scsiio.kern_data_ptr = (uint8_t *)CTL_LSGL(io);
 
        /*
         * Use a custom move done callback, since we need to send completion
@@ -12670,7 +12669,7 @@ ctl_datamove_remote_sgl_setup(union ctl_io *io)
        int i;
 
        retval = 0;
-       local_sglist = io->io_hdr.local_sglist;
+       local_sglist = CTL_LSGL(io);
        len_to_go = io->scsiio.kern_data_len;
 
        /*
@@ -12741,8 +12740,8 @@ ctl_datamove_remote_xfer(union ctl_io *io, unsigned co
                return (1);
        }
 
-       local_sglist = io->io_hdr.local_sglist;
-       remote_sglist = io->io_hdr.remote_sglist;
+       local_sglist = CTL_LSGL(io);
+       remote_sglist = CTL_RSGL(io);
        local_used = 0;
        remote_used = 0;
        total_used = 0;
@@ -12855,10 +12854,10 @@ ctl_datamove_remote_read(union ctl_io *io)
                 * error if there is a problem.
                 */
                for (i = 0; i < io->scsiio.kern_sg_entries; i++)
-                       free(io->io_hdr.local_sglist[i].addr, M_CTL);
-               free(io->io_hdr.remote_sglist, M_CTL);
-               io->io_hdr.remote_sglist = NULL;
-               io->io_hdr.local_sglist = NULL;
+                       free(CTL_LSGLT(io)[i].addr, M_CTL);
+               free(CTL_RSGL(io), M_CTL);
+               CTL_RSGL(io) = NULL;
+               CTL_LSGL(io) = NULL;
        }
 }
 
@@ -13106,7 +13105,7 @@ bailout:
            (io->io_hdr.flags & CTL_FLAG_SENT_2OTHER_SC)) {
                memset(&msg, 0, sizeof(msg));
                msg.hdr.msg_type = CTL_MSG_FINISH_IO;
-               msg.hdr.serializing_sc = io->io_hdr.serializing_sc;
+               msg.hdr.serializing_sc = io->io_hdr.remote_io;
                msg.hdr.nexus = io->io_hdr.nexus;
                ctl_ha_msg_send(CTL_HA_CHAN_CTL, &msg,
                    sizeof(msg.scsi) - sizeof(msg.scsi.sense_data),

Modified: head/sys/cam/ctl/ctl_io.h
==============================================================================
--- head/sys/cam/ctl/ctl_io.h   Sat Feb 23 23:31:13 2019        (r344488)
+++ head/sys/cam/ctl/ctl_io.h   Sat Feb 23 23:35:52 2019        (r344489)
@@ -167,6 +167,15 @@ union ctl_priv {
 #define CTL_PORT(io)   (((struct ctl_softc *)CTL_SOFTC(io))->  \
     ctl_ports[(io)->io_hdr.nexus.targ_port])
 
+/*
+ * These are used only on Originating SC in XFER mode, where requests don't
+ * ever reach backends, so we can reuse backend's private storage.
+ */
+#define CTL_RSGL(io)   ((io)->io_hdr.ctl_private[CTL_PRIV_BACKEND].ptrs[0])
+#define CTL_LSGL(io)   ((io)->io_hdr.ctl_private[CTL_PRIV_BACKEND].ptrs[1])
+#define CTL_RSGLT(io)  ((struct ctl_sg_entry *)CTL_RSGL(io))
+#define CTL_LSGLT(io)  ((struct ctl_sg_entry *)CTL_LSGL(io))
+
 #define CTL_INVALID_PORTNAME 0xFF
 #define CTL_UNMAPPED_IID     0xFF
 
@@ -229,12 +238,12 @@ struct ctl_io_hdr {
        struct bintime    dma_bt;       /* DMA total ticks */
 #endif /* CTL_TIME_IO */
        uint32_t          num_dmas;     /* Number of DMAs */
-       union ctl_io      *original_sc;
-       union ctl_io      *serializing_sc;
+       union ctl_io      *remote_io;   /* I/O counterpart on remote HA side */
+       void              *pad1;
        void              *pool;        /* I/O pool */
        union ctl_priv    ctl_private[CTL_NUM_PRIV];/* CTL private area */
-       struct ctl_sg_entry *remote_sglist;
-       struct ctl_sg_entry *local_sglist;
+       void              *pad2;
+       void              *pad3;
        STAILQ_ENTRY(ctl_io_hdr) links; /* linked list pointer */
        TAILQ_ENTRY(ctl_io_hdr) ooa_links;
        TAILQ_ENTRY(ctl_io_hdr) blocked_links;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to