summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-08-29 15:33:31 +0000
committermav <mav@FreeBSD.org>2015-08-29 15:33:31 +0000
commit8bd4abbe51bc66a6c7067202c60c7ce251631e52 (patch)
treed46f92be770d40e6070bdc6972cc905b080abb4e
parent146b187d13b83615f02a68c038af82670588495f (diff)
downloadFreeBSD-src-8bd4abbe51bc66a6c7067202c60c7ce251631e52.zip
FreeBSD-src-8bd4abbe51bc66a6c7067202c60c7ce251631e52.tar.gz
Remove 600 bytes of port_priv from struct ctl_io_hdr.
This field used only for camtgt frontend, and once it any way preallocates all requests, let it preallocate this memory too, not bothering core code.
-rw-r--r--sys/cam/ctl/ctl_io.h29
-rw-r--r--sys/cam/ctl/scsi_ctl.c41
2 files changed, 29 insertions, 41 deletions
diff --git a/sys/cam/ctl/ctl_io.h b/sys/cam/ctl/ctl_io.h
index 2c24591..fc4ddfb 100644
--- a/sys/cam/ctl/ctl_io.h
+++ b/sys/cam/ctl/ctl_io.h
@@ -173,35 +173,11 @@ union ctl_priv {
#define CTL_PRIV_MODEPAGE 1 /* Modepage info for config write */
#define CTL_PRIV_BACKEND 2 /* Reserved for block, RAIDCore */
#define CTL_PRIV_BACKEND_LUN 3 /* Backend LUN pointer */
-#define CTL_PRIV_FRONTEND 4 /* LSI driver, ioctl front end */
-#define CTL_PRIV_USER 5 /* Userland use */
+#define CTL_PRIV_FRONTEND 4 /* Frontend storage */
+#define CTL_PRIV_FRONTEND2 5 /* Another frontend storage */
#define CTL_INVALID_PORTNAME 0xFF
#define CTL_UNMAPPED_IID 0xFF
-/*
- * XXX KDM this size is for the port_priv variable in struct ctl_io_hdr
- * below. This should be defined in terms of the size of struct
- * ctlfe_lun_cmd_info at the moment:
- * struct ctlfe_lun_cmd_info {
- * int cur_transfer_index;
- * ctlfe_cmd_flags flags;
- * bus_dma_segment_t cam_sglist[32];
- * };
- *
- * This isn't really the way I'd prefer to do it, but it does make some
- * sense, AS LONG AS we can guarantee that there will always only be one
- * outstanding DMA request per ctl_io. If that assumption isn't valid,
- * then we've got problems.
- *
- * At some point it may be nice switch CTL over to using CCBs for
- * everything. At that point we can probably use the ATIO/CTIO model, so
- * that multiple simultaneous DMAs per command will just work.
- *
- * Also note that the current size, 600, is appropriate for 64-bit
- * architectures, but is overkill for 32-bit architectures. Need a way to
- * figure out the size at compile time, or just get rid of this altogether.
- */
-#define CTL_PORT_PRIV_SIZE 600
struct ctl_sg_entry {
void *addr;
@@ -268,7 +244,6 @@ struct ctl_io_hdr {
union ctl_io *serializing_sc;
void *pool; /* I/O pool */
union ctl_priv ctl_private[CTL_NUM_PRIV];/* CTL private area */
- uint8_t port_priv[CTL_PORT_PRIV_SIZE];/* PORT private area*/
struct ctl_sg_entry remote_sglist[CTL_NUM_SG_ENTRIES];
struct ctl_sg_entry remote_dma_sglist[CTL_NUM_SG_ENTRIES];
struct ctl_sg_entry local_sglist[CTL_NUM_SG_ENTRIES];
diff --git a/sys/cam/ctl/scsi_ctl.c b/sys/cam/ctl/scsi_ctl.c
index 367d8c9..15912e2 100644
--- a/sys/cam/ctl/scsi_ctl.c
+++ b/sys/cam/ctl/scsi_ctl.c
@@ -119,11 +119,7 @@ typedef enum {
CTLFE_CMD_PIECEWISE = 0x01
} ctlfe_cmd_flags;
-/*
- * The size limit of this structure is CTL_PORT_PRIV_SIZE, from ctl_io.h.
- * Currently that is 600 bytes.
- */
-struct ctlfe_lun_cmd_info {
+struct ctlfe_cmd_info {
int cur_transfer_index;
size_t cur_transfer_off;
ctlfe_cmd_flags flags;
@@ -135,7 +131,6 @@ struct ctlfe_lun_cmd_info {
#define CTLFE_MAX_SEGS 32
bus_dma_segment_t cam_sglist[CTLFE_MAX_SEGS];
};
-CTASSERT(sizeof(struct ctlfe_lun_cmd_info) <= CTL_PORT_PRIV_SIZE);
/*
* When we register the adapter/bus, request that this many ctl_ios be
@@ -533,6 +528,7 @@ ctlferegister(struct cam_periph *periph, void *arg)
for (i = 0; i < CTLFE_ATIO_PER_LUN; i++) {
union ccb *new_ccb;
union ctl_io *new_io;
+ struct ctlfe_cmd_info *cmd_info;
new_ccb = (union ccb *)malloc(sizeof(*new_ccb), M_CTLFE,
M_ZERO|M_NOWAIT);
@@ -546,6 +542,15 @@ ctlferegister(struct cam_periph *periph, void *arg)
status = CAM_RESRC_UNAVAIL;
break;
}
+ cmd_info = malloc(sizeof(*cmd_info), M_CTLFE,
+ M_ZERO | M_NOWAIT);
+ if (cmd_info == NULL) {
+ ctl_free_io(new_io);
+ free(new_ccb, M_CTLFE);
+ status = CAM_RESRC_UNAVAIL;
+ break;
+ }
+ new_io->io_hdr.ctl_private[CTL_PRIV_FRONTEND2].ptr = cmd_info;
softc->atios_alloced++;
new_ccb->ccb_h.io_ptr = new_io;
@@ -556,6 +561,7 @@ ctlferegister(struct cam_periph *periph, void *arg)
xpt_action(new_ccb);
status = new_ccb->ccb_h.status;
if ((status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {
+ free(cmd_info, M_CTLFE);
ctl_free_io(new_io);
free(new_ccb, M_CTLFE);
break;
@@ -686,13 +692,13 @@ ctlfedata(struct ctlfe_lun_softc *softc, union ctl_io *io,
u_int16_t *sglist_cnt)
{
struct ctlfe_softc *bus_softc;
- struct ctlfe_lun_cmd_info *cmd_info;
+ struct ctlfe_cmd_info *cmd_info;
struct ctl_sg_entry *ctl_sglist;
bus_dma_segment_t *cam_sglist;
size_t off;
int i, idx;
- cmd_info = (struct ctlfe_lun_cmd_info *)io->io_hdr.port_priv;
+ cmd_info = io->io_hdr.ctl_private[CTL_PRIV_FRONTEND2].ptr;
bus_softc = softc->parent_softc;
/*
@@ -768,7 +774,7 @@ static void
ctlfestart(struct cam_periph *periph, union ccb *start_ccb)
{
struct ctlfe_lun_softc *softc;
- struct ctlfe_lun_cmd_info *cmd_info;
+ struct ctlfe_cmd_info *cmd_info;
struct ccb_hdr *ccb_h;
struct ccb_accept_tio *atio;
struct ccb_scsiio *csio;
@@ -796,7 +802,7 @@ ctlfestart(struct cam_periph *periph, union ccb *start_ccb)
flags = atio->ccb_h.flags &
(CAM_DIS_DISCONNECT|CAM_TAG_ACTION_VALID|CAM_DIR_MASK);
- cmd_info = (struct ctlfe_lun_cmd_info *)io->io_hdr.port_priv;
+ cmd_info = io->io_hdr.ctl_private[CTL_PRIV_FRONTEND2].ptr;
cmd_info->cur_transfer_index = 0;
cmd_info->cur_transfer_off = 0;
cmd_info->flags = 0;
@@ -968,12 +974,17 @@ static void
ctlfe_free_ccb(struct cam_periph *periph, union ccb *ccb)
{
struct ctlfe_lun_softc *softc;
+ union ctl_io *io;
+ struct ctlfe_cmd_info *cmd_info;
softc = (struct ctlfe_lun_softc *)periph->softc;
+ io = ccb->ccb_h.io_ptr;
switch (ccb->ccb_h.func_code) {
case XPT_ACCEPT_TARGET_IO:
softc->atios_freed++;
+ cmd_info = io->io_hdr.ctl_private[CTL_PRIV_FRONTEND2].ptr;
+ free(cmd_info, M_CTLFE);
break;
case XPT_IMMEDIATE_NOTIFY:
case XPT_NOTIFY_ACKNOWLEDGE:
@@ -983,7 +994,7 @@ ctlfe_free_ccb(struct cam_periph *periph, union ccb *ccb)
break;
}
- ctl_free_io(ccb->ccb_h.io_ptr);
+ ctl_free_io(io);
free(ccb, M_CTLFE);
KASSERT(softc->atios_freed <= softc->atios_alloced, ("%s: "
@@ -1078,6 +1089,7 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
{
struct ctlfe_lun_softc *softc;
struct ctlfe_softc *bus_softc;
+ struct ctlfe_cmd_info *cmd_info;
struct ccb_accept_tio *atio = NULL;
union ctl_io *io = NULL;
struct mtx *mtx;
@@ -1139,10 +1151,12 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
*/
mtx_unlock(mtx);
io = done_ccb->ccb_h.io_ptr;
+ cmd_info = io->io_hdr.ctl_private[CTL_PRIV_FRONTEND2].ptr;
ctl_zero_io(io);
/* Save pointers on both sides */
io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = done_ccb;
+ io->io_hdr.ctl_private[CTL_PRIV_FRONTEND2].ptr = cmd_info;
done_ccb->ccb_h.io_ptr = io;
/*
@@ -1291,12 +1305,11 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
return;
}
} else {
- struct ctlfe_lun_cmd_info *cmd_info;
+ struct ctlfe_cmd_info *cmd_info;
struct ccb_scsiio *csio;
csio = &done_ccb->csio;
- cmd_info = (struct ctlfe_lun_cmd_info *)
- io->io_hdr.port_priv;
+ cmd_info = io->io_hdr.ctl_private[CTL_PRIV_FRONTEND2].ptr;
io->io_hdr.flags &= ~CTL_FLAG_DMA_INPROG;
OpenPOWER on IntegriCloud