Index: sys/cam/cam_xpt.c =================================================================== --- sys/cam/cam_xpt.c +++ sys/cam/cam_xpt.c @@ -54,6 +54,8 @@ #include #include +#include + #include #include #include @@ -95,7 +97,6 @@ /* Datastructures internal to the xpt layer */ MALLOC_DEFINE(M_CAMXPT, "CAM XPT", "CAM XPT buffers"); MALLOC_DEFINE(M_CAMDEV, "CAM DEV", "CAM devices"); -MALLOC_DEFINE(M_CAMCCB, "CAM CCB", "CAM CCBs"); MALLOC_DEFINE(M_CAMPATH, "CAM path", "CAM paths"); struct xpt_softc { @@ -128,6 +129,7 @@ struct mtx xpt_topo_lock; struct taskqueue *xpt_taskq; + uma_zone_t ccb_zone; }; typedef enum { @@ -899,6 +901,8 @@ mtx_init(&xsoftc.xpt_highpower_lock, "XPT highpower lock", NULL, MTX_DEF); xsoftc.xpt_taskq = taskqueue_create("CAM XPT task", M_WAITOK, taskqueue_thread_enqueue, /*context*/&xsoftc.xpt_taskq); + xsoftc.ccb_zone = uma_zcreate("ccb", sizeof(union ccb), NULL, NULL, NULL, NULL, + UMA_ALIGN_PTR, 0); #ifdef CAM_BOOT_DELAY /* @@ -4651,7 +4655,7 @@ { union ccb *new_ccb; - new_ccb = malloc(sizeof(*new_ccb), M_CAMCCB, M_ZERO|M_WAITOK); + new_ccb = uma_zalloc(xsoftc.ccb_zone, M_WAITOK | M_ZERO); return (new_ccb); } @@ -4660,14 +4664,15 @@ { union ccb *new_ccb; - new_ccb = malloc(sizeof(*new_ccb), M_CAMCCB, M_ZERO|M_NOWAIT); + new_ccb = uma_zalloc(xsoftc.ccb_zone, M_NOWAIT | M_ZERO); return (new_ccb); } void xpt_free_ccb(union ccb *free_ccb) { - free(free_ccb, M_CAMCCB); + + uma_zfree(xsoftc.ccb_zone, free_ccb); } /* Private XPT functions */ @@ -4682,7 +4687,7 @@ { union ccb *new_ccb; - new_ccb = malloc(sizeof(*new_ccb), M_CAMCCB, M_ZERO|M_NOWAIT); + new_ccb = xpt_alloc_ccb_nowait(); if (new_ccb == NULL) return (NULL); periph->periph_allocated++; @@ -4696,7 +4701,7 @@ union ccb *new_ccb; cam_periph_unlock(periph); - new_ccb = malloc(sizeof(*new_ccb), M_CAMCCB, M_ZERO|M_WAITOK); + new_ccb = xpt_alloc_ccb(); cam_periph_lock(periph); periph->periph_allocated++; cam_ccbq_take_opening(&periph->path->device->ccbq); Index: sys/cam/ctl/scsi_ctl.c =================================================================== --- sys/cam/ctl/scsi_ctl.c +++ sys/cam/ctl/scsi_ctl.c @@ -499,15 +499,14 @@ 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); + new_ccb = xpt_alloc_ccb_nowait(); if (new_ccb == NULL) { status = CAM_RESRC_UNAVAIL; break; } new_io = ctl_alloc_io_nowait(bus_softc->port.ctl_pool_ref); if (new_io == NULL) { - free(new_ccb, M_CTLFE); + xpt_free_ccb(new_ccb); status = CAM_RESRC_UNAVAIL; break; } @@ -515,7 +514,7 @@ M_ZERO | M_NOWAIT); if (cmd_info == NULL) { ctl_free_io(new_io); - free(new_ccb, M_CTLFE); + xpt_free_ccb(new_ccb); status = CAM_RESRC_UNAVAIL; break; } @@ -533,7 +532,7 @@ if ((status & CAM_STATUS_MASK) != CAM_REQ_INPROG) { free(cmd_info, M_CTLFE); ctl_free_io(new_io); - free(new_ccb, M_CTLFE); + xpt_free_ccb(new_ccb); break; } } @@ -555,15 +554,14 @@ union ccb *new_ccb; union ctl_io *new_io; - new_ccb = (union ccb *)malloc(sizeof(*new_ccb), M_CTLFE, - M_ZERO|M_NOWAIT); + new_ccb = xpt_alloc_ccb_nowait(); if (new_ccb == NULL) { status = CAM_RESRC_UNAVAIL; break; } new_io = ctl_alloc_io_nowait(bus_softc->port.ctl_pool_ref); if (new_io == NULL) { - free(new_ccb, M_CTLFE); + xpt_free_ccb(new_ccb); status = CAM_RESRC_UNAVAIL; break; } @@ -952,7 +950,7 @@ } ctl_free_io(io); - free(ccb, M_CTLFE); + xpt_free_ccb(ccb); KASSERT(softc->atios_alloced >= 0, ("%s: atios_alloced %d < 0", __func__, softc->atios_alloced)); Index: sys/cam/scsi/scsi_targ_bh.c =================================================================== --- sys/cam/scsi/scsi_targ_bh.c +++ sys/cam/scsi/scsi_targ_bh.c @@ -266,8 +266,7 @@ for (i = 0; i < MAX_ACCEPT; i++) { struct ccb_accept_tio *atio; - atio = (struct ccb_accept_tio*)malloc(sizeof(*atio), M_SCSIBH, - M_NOWAIT); + atio = (struct ccb_accept_tio*)xpt_alloc_ccb_nowait(); if (atio == NULL) { status = CAM_RESRC_UNAVAIL; break; @@ -276,7 +275,7 @@ atio->ccb_h.ccb_descr = targbhallocdescr(); if (atio->ccb_h.ccb_descr == NULL) { - free(atio, M_SCSIBH); + xpt_free_ccb((union ccb *)atio); status = CAM_RESRC_UNAVAIL; break; } @@ -308,8 +307,7 @@ for (i = 0; i < MAX_ACCEPT; i++) { struct ccb_immediate_notify *inot; - inot = (struct ccb_immediate_notify*)malloc(sizeof(*inot), - M_SCSIBH, M_NOWAIT); + inot = (struct ccb_immediate_notify*)xpt_alloc_ccb_nowait(); if (inot == NULL) { status = CAM_RESRC_UNAVAIL; @@ -695,7 +693,7 @@ break; } else { targbhfreedescr(desc); - free(atio, M_SCSIBH); + xpt_free_ccb((union ccb *)atio); } break; } Index: sys/cam/scsi/scsi_target.c =================================================================== --- sys/cam/scsi/scsi_target.c +++ sys/cam/scsi/scsi_target.c @@ -936,7 +936,7 @@ int ccb_len; ccb_len = targccblen(type); - ccb = malloc(ccb_len, M_TARG, M_NOWAIT); + ccb = xpt_alloc_ccb_nowait(); CAM_DEBUG(softc->path, CAM_DEBUG_PERIPH, ("getccb %p\n", ccb)); if (ccb == NULL) { return (ccb); @@ -964,7 +964,7 @@ case XPT_IMMED_NOTIFY: case XPT_IMMEDIATE_NOTIFY: CAM_DEBUG_PRINT(CAM_DEBUG_PERIPH, ("freeing ccb %p\n", ccb)); - free(ccb, M_TARG); + xpt_free_ccb(ccb); break; default: /* Send back CCB if we got it from the periph */ @@ -975,7 +975,7 @@ } else { CAM_DEBUG_PRINT(CAM_DEBUG_PERIPH, ("freeing ccb %p\n", ccb)); - free(ccb, M_TARG); + xpt_free_ccb(ccb); } break; }