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.
This commit is contained in:
parent
bd6060a1c6
commit
7278725be5
@ -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];
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user