Date: Sun, 15 Sep 2013 14:30:24 GMT From: zcore@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r257376 - soc2013/zcore/head/usr.sbin/bhyve Message-ID: <201309151430.r8FEUOi3001436@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: zcore Date: Sun Sep 15 14:30:23 2013 New Revision: 257376 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257376 Log: simplify queue handling The max tag number is 32 and the blockif queue size is also 32, so the queue won't be full. Modified: soc2013/zcore/head/usr.sbin/bhyve/block_if.c soc2013/zcore/head/usr.sbin/bhyve/block_if.h soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c Modified: soc2013/zcore/head/usr.sbin/bhyve/block_if.c ============================================================================== --- soc2013/zcore/head/usr.sbin/bhyve/block_if.c Sun Sep 15 14:07:16 2013 (r257375) +++ soc2013/zcore/head/usr.sbin/bhyve/block_if.c Sun Sep 15 14:30:23 2013 (r257376) @@ -54,6 +54,7 @@ enum blockop { BOP_READ, BOP_WRITE, + BOP_FLUSH, BOP_CANCEL }; @@ -132,6 +133,10 @@ br->br_offset) < 0) err = errno; break; + case BOP_FLUSH: + if (fsync(bc->bc_fd) < 0) + err = errno; + break; case BOP_CANCEL: err = EINTR; break; @@ -299,6 +304,14 @@ } int +blockif_flush(struct blockif_ctxt *bc) +{ + + assert(bc->bc_magic == BLOCKIF_SIG); + return (blockif_request(bc, NULL, BOP_FLUSH)); +} + +int blockif_cancel(struct blockif_ctxt *bc, struct blockif_req *breq) { @@ -335,14 +348,6 @@ return (0); } -int -blockif_fsync(struct blockif_ctxt *bc) -{ - - assert(bc->bc_magic == BLOCKIF_SIG); - return fsync(bc->bc_fd); -} - /* * Accessors */ Modified: soc2013/zcore/head/usr.sbin/bhyve/block_if.h ============================================================================== --- soc2013/zcore/head/usr.sbin/bhyve/block_if.h Sun Sep 15 14:07:16 2013 (r257375) +++ soc2013/zcore/head/usr.sbin/bhyve/block_if.h Sun Sep 15 14:30:23 2013 (r257376) @@ -52,8 +52,8 @@ int blockif_is_ro(struct blockif_ctxt *bc); int blockif_read(struct blockif_ctxt *bc, struct blockif_req *breq); int blockif_write(struct blockif_ctxt *bc, struct blockif_req *breq); +int blockif_flush(struct blockif_ctxt *bc); int blockif_cancel(struct blockif_ctxt *bc, struct blockif_req *breq); int blockif_close(struct blockif_ctxt *bc); -int blockif_fsync(struct blockif_ctxt *bc); #endif /* _BLOCK_IF_H_ */ Modified: soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c ============================================================================== --- soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c Sun Sep 15 14:07:16 2013 (r257375) +++ soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c Sun Sep 15 14:30:23 2013 (r257376) @@ -115,10 +115,6 @@ int atapi; int reset; int mult_sectors; - int flush_pending; - uint32_t unhandled_read; - uint32_t unhandled_write; - pthread_cond_t flush_cond; uint8_t xfermode; uint8_t sense_key; uint8_t asc; @@ -146,7 +142,6 @@ */ struct ahci_ioreq *ioreq; int ioqsz; - int iofree; STAILQ_HEAD(ahci_fhead, ahci_ioreq) iofhd; }; @@ -392,14 +387,6 @@ cfis[2] == ATA_WRITE_FPDMA_QUEUED) readop = 0; - if (!p->iofree) { - if (readop) - p->unhandled_read |= (1 << slot); - else - p->unhandled_write |= (1 << slot); - return; - } - if (cfis[2] == ATA_WRITE_FPDMA_QUEUED || cfis[2] == ATA_READ_FPDMA_QUEUED) { lba = ((uint64_t)cfis[10] << 40) | @@ -437,7 +424,6 @@ aior = STAILQ_FIRST(&p->iofhd); assert(aior != NULL); STAILQ_REMOVE_HEAD(&p->iofhd, io_list); - p->iofree--; aior->cfis = cfis; aior->slot = slot; aior->len = len; @@ -464,15 +450,21 @@ static void handle_flush(struct ahci_port *p, int slot, uint8_t *cfis) { - struct pci_ahci_softc *sc = p->pr_sc; + int err; + struct ahci_ioreq *aior; - if (p->unhandled_write) { - p->flush_pending = 1; - pthread_cond_wait(&p->flush_cond, &sc->mtx); - p->flush_pending = 0; - } - blockif_fsync(p->bctx); - ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC); + /* + * Pull request off free list + */ + aior = STAILQ_FIRST(&p->iofhd); + assert(aior != NULL); + STAILQ_REMOVE_HEAD(&p->iofhd, io_list); + aior->cfis = cfis; + aior->slot = slot; + aior->len = 0; + + err = blockif_flush(p->bctx); + assert(err == 0); } static inline void @@ -836,10 +828,6 @@ struct ahci_prdt_entry *prdt = (struct ahci_prdt_entry *)(cfis + 0x80); struct ahci_cmd_hdr *hdr = p->cmd_lst + slot * AHCI_CL_SIZE; - if (!p->iofree) { - p->unhandled_read |= (1 << slot); - return; - } lba = be32dec(acmd + 2); if (acmd[0] == READ_10) len = be16dec(acmd + 7); @@ -858,7 +846,6 @@ aior = STAILQ_FIRST(&p->iofhd); assert(aior != NULL); STAILQ_REMOVE_HEAD(&p->iofhd, io_list); - p->iofree--; aior->cfis = cfis; aior->slot = slot; aior->len = len; @@ -1175,28 +1162,6 @@ * Move the blockif request back to the free list */ STAILQ_INSERT_TAIL(&p->iofhd, aior, io_list); - p->iofree++; - - /* - * If the number of oustanding commands has dropped below the - * threshold, see if more can be queued up - */ - if (p->ioqsz - p->iofree <= 2 && (p->cmd & AHCI_P_CMD_ST)) { - int i; - uint32_t unhandled = p->unhandled_read | p->unhandled_write; - for (i = 0; (i < 32) && unhandled; i++) { - if (!p->iofree) - break; - if (unhandled & (1 << i)) { - handle_slot(p, i); - unhandled &= ~(1 << i); - } - } - p->unhandled_read &= unhandled; - p->unhandled_write &= unhandled; - if (!p->unhandled_write && p->flush_pending) - pthread_cond_signal(&p->flush_cond); - } pthread_mutex_unlock(&sc->mtx); dprintf("%s exit\n", __func__); @@ -1239,25 +1204,6 @@ * Move the blockif request back to the free list */ STAILQ_INSERT_TAIL(&p->iofhd, aior, io_list); - p->iofree++; - - /* - * If the number of oustanding commands has dropped below the - * threshold, see if more can be queued up - */ - if (p->ioqsz - p->iofree <= 2 && (p->cmd & AHCI_P_CMD_ST)) { - int i; - uint32_t unhandled = p->unhandled_read; - for (i = 0; (i < 32) && unhandled; i++) { - if (!p->iofree) - break; - if (unhandled & (1 << i)) { - handle_slot(p, i); - unhandled &= ~(1 << i); - } - } - p->unhandled_read &= unhandled; - } pthread_mutex_unlock(&sc->mtx); dprintf("%s exit\n", __func__); @@ -1286,7 +1232,6 @@ vr->io_req.br_callback = atapi_ioreq_cb; vr->io_req.br_param = vr; STAILQ_INSERT_TAIL(&pr->iofhd, vr, io_list); - pr->iofree++; } } @@ -1345,7 +1290,6 @@ sc->port[i].bctx = bctxt; sc->port[i].pr_sc = sc; - pthread_cond_init(&sc->port[i].flush_cond, NULL); /* * Allocate blockif request structures and add them * to the free list
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309151430.r8FEUOi3001436>