svn commit: r361733 - stable/12/sys/cam/ctl
Alexander Motin
mav at FreeBSD.org
Tue Jun 2 20:39:35 UTC 2020
Author: mav
Date: Tue Jun 2 20:39:34 2020
New Revision: 361733
URL: https://svnweb.freebsd.org/changeset/base/361733
Log:
MFC r361590: Remove ctl_free_beio() LUN and ctl_io dependencies.
This slightly simplifies the code, plus may be a ground for asynchronous
buffer free.
Modified:
stable/12/sys/cam/ctl/ctl_backend_block.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/cam/ctl/ctl_backend_block.c
==============================================================================
--- stable/12/sys/cam/ctl/ctl_backend_block.c Tue Jun 2 20:38:53 2020 (r361732)
+++ stable/12/sys/cam/ctl/ctl_backend_block.c Tue Jun 2 20:39:34 2020 (r361733)
@@ -162,7 +162,6 @@ struct ctl_be_block_lun {
cbb_dispatch_t unmap;
cbb_dispatch_t get_lba_status;
cbb_getattr_t getattr;
- uma_zone_t lun_zone;
uint64_t size_blocks;
uint64_t size_bytes;
struct ctl_be_block_softc *softc;
@@ -187,9 +186,10 @@ struct ctl_be_block_lun {
struct ctl_be_block_softc {
struct sx modify_lock;
struct mtx lock;
- uma_zone_t beio_zone;
int num_luns;
SLIST_HEAD(, ctl_be_block_lun) lun_list;
+ uma_zone_t beio_zone;
+ uma_zone_t buf_zone;
};
static struct ctl_be_block_softc backend_block_softc;
@@ -202,6 +202,7 @@ struct ctl_be_block_io {
struct ctl_sg_entry sg_segs[CTLBLK_MAX_SEGS];
struct iovec xiovecs[CTLBLK_MAX_SEGS];
int bio_cmd;
+ int two_sglists;
int num_segs;
int num_bios_sent;
int num_bios_done;
@@ -310,32 +311,20 @@ ctl_alloc_beio(struct ctl_be_block_softc *softc)
static void
ctl_free_beio(struct ctl_be_block_io *beio)
{
- int duplicate_free;
+ struct ctl_be_block_softc *softc = beio->softc;
int i;
- duplicate_free = 0;
-
for (i = 0; i < beio->num_segs; i++) {
- if (beio->sg_segs[i].addr == NULL)
- duplicate_free++;
+ uma_zfree(softc->buf_zone, beio->sg_segs[i].addr);
- uma_zfree(beio->lun->lun_zone, beio->sg_segs[i].addr);
- beio->sg_segs[i].addr = NULL;
-
/* For compare we had two equal S/G lists. */
- if (ARGS(beio->io)->flags & CTL_LLF_COMPARE) {
- uma_zfree(beio->lun->lun_zone,
+ if (beio->two_sglists) {
+ uma_zfree(softc->buf_zone,
beio->sg_segs[i + CTLBLK_HALF_SEGS].addr);
- beio->sg_segs[i + CTLBLK_HALF_SEGS].addr = NULL;
}
}
- if (duplicate_free > 0) {
- printf("%s: %d duplicate frees out of %d segments\n", __func__,
- duplicate_free, beio->num_segs);
- }
-
- uma_zfree(beio->softc->beio_zone, beio);
+ uma_zfree(softc->beio_zone, beio);
}
static void
@@ -1272,6 +1261,7 @@ static void
ctl_be_block_cw_dispatch_ws(struct ctl_be_block_lun *be_lun,
union ctl_io *io)
{
+ struct ctl_be_block_softc *softc = be_lun->softc;
struct ctl_be_lun *cbe_lun = &be_lun->cbe_lun;
struct ctl_be_block_io *beio;
struct ctl_lba_len_flags *lbalen;
@@ -1336,7 +1326,7 @@ ctl_be_block_cw_dispatch_ws(struct ctl_be_block_lun *b
} else
seglen -= seglen % cbe_lun->blocksize;
beio->sg_segs[i].len = seglen;
- beio->sg_segs[i].addr = uma_zalloc(be_lun->lun_zone, M_WAITOK);
+ beio->sg_segs[i].addr = uma_zalloc(softc->buf_zone, M_WAITOK);
DPRINTF("segment %d addr %p len %zd\n", i,
beio->sg_segs[i].addr, beio->sg_segs[i].len);
@@ -1590,10 +1580,12 @@ ctl_be_block_dispatch(struct ctl_be_block_lun *be_lun,
DPRINTF("%s at LBA %jx len %u @%ju\n",
(beio->bio_cmd == BIO_READ) ? "READ" : "WRITE",
(uintmax_t)lbalen->lba, lbalen->len, bptrlen->len);
- if (lbalen->flags & CTL_LLF_COMPARE)
+ if (lbalen->flags & CTL_LLF_COMPARE) {
+ beio->two_sglists = 1;
lbas = CTLBLK_HALF_IO_SIZE;
- else
+ } else {
lbas = CTLBLK_MAX_IO_SIZE;
+ }
lbas = MIN(lbalen->len - bptrlen->len, lbas / cbe_lun->blocksize);
beio->io_offset = (lbalen->lba + bptrlen->len) * cbe_lun->blocksize;
beio->io_len = lbas * cbe_lun->blocksize;
@@ -1607,17 +1599,17 @@ ctl_be_block_dispatch(struct ctl_be_block_lun *be_lun,
* Setup the S/G entry for this chunk.
*/
beio->sg_segs[i].len = min(CTLBLK_MAX_SEG, len_left);
- beio->sg_segs[i].addr = uma_zalloc(be_lun->lun_zone, M_WAITOK);
+ beio->sg_segs[i].addr = uma_zalloc(softc->buf_zone, M_WAITOK);
DPRINTF("segment %d addr %p len %zd\n", i,
beio->sg_segs[i].addr, beio->sg_segs[i].len);
/* Set up second segment for compare operation. */
- if (lbalen->flags & CTL_LLF_COMPARE) {
+ if (beio->two_sglists) {
beio->sg_segs[i + CTLBLK_HALF_SEGS].len =
beio->sg_segs[i].len;
beio->sg_segs[i + CTLBLK_HALF_SEGS].addr =
- uma_zalloc(be_lun->lun_zone, M_WAITOK);
+ uma_zalloc(softc->buf_zone, M_WAITOK);
}
beio->num_segs++;
@@ -1627,7 +1619,7 @@ ctl_be_block_dispatch(struct ctl_be_block_lun *be_lun,
beio->beio_cont = ctl_be_block_next;
io->scsiio.be_move_done = ctl_be_block_move_done;
/* For compare we have separate S/G lists for read and datamove. */
- if (lbalen->flags & CTL_LLF_COMPARE)
+ if (beio->two_sglists)
io->scsiio.kern_data_ptr = (uint8_t *)&beio->sg_segs[CTLBLK_HALF_SEGS];
else
io->scsiio.kern_data_ptr = (uint8_t *)beio->sg_segs;
@@ -2240,13 +2232,6 @@ ctl_be_block_create(struct ctl_be_block_softc *softc,
mtx_init(&be_lun->io_lock, "ctlblock io", NULL, MTX_DEF);
mtx_init(&be_lun->queue_lock, "ctlblock queue", NULL, MTX_DEF);
cbe_lun->options = nvlist_clone(req->args_nvl);
- be_lun->lun_zone = uma_zcreate("ctlblock", CTLBLK_MAX_SEG,
- NULL, NULL, NULL, NULL, /*align*/ 0, /*flags*/0);
- if (be_lun->lun_zone == NULL) {
- snprintf(req->error_str, sizeof(req->error_str),
- "error allocating UMA zone");
- goto bailout_error;
- }
if (params->flags & CTL_LUN_FLAG_DEV_TYPE)
cbe_lun->lun_type = params->device_type;
@@ -2416,8 +2401,6 @@ bailout_error:
ctl_be_block_close(be_lun);
if (be_lun->dev_path != NULL)
free(be_lun->dev_path, M_CTLBLK);
- if (be_lun->lun_zone != NULL)
- uma_zdestroy(be_lun->lun_zone);
nvlist_destroy(cbe_lun->options);
mtx_destroy(&be_lun->queue_lock);
mtx_destroy(&be_lun->io_lock);
@@ -2612,7 +2595,6 @@ ctl_be_block_lun_shutdown(void *lun)
taskqueue_free(be_lun->io_taskqueue);
if (be_lun->disk_stats != NULL)
devstat_remove_entry(be_lun->disk_stats);
- uma_zdestroy(be_lun->lun_zone);
nvlist_destroy(be_lun->cbe_lun.options);
free(be_lun->dev_path, M_CTLBLK);
mtx_destroy(&be_lun->queue_lock);
@@ -2794,6 +2776,8 @@ ctl_be_block_init(void)
mtx_init(&softc->lock, "ctlblock", NULL, MTX_DEF);
softc->beio_zone = uma_zcreate("beio", sizeof(struct ctl_be_block_io),
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
+ softc->buf_zone = uma_zcreate("ctlblock", CTLBLK_MAX_SEG,
+ NULL, NULL, NULL, NULL, /*align*/ 0, /*flags*/0);
SLIST_INIT(&softc->lun_list);
return (0);
}
@@ -2819,6 +2803,7 @@ ctl_be_block_shutdown(void)
mtx_lock(&softc->lock);
}
mtx_unlock(&softc->lock);
+ uma_zdestroy(softc->buf_zone);
uma_zdestroy(softc->beio_zone);
mtx_destroy(&softc->lock);
sx_destroy(&softc->modify_lock);
More information about the svn-src-stable-12
mailing list