changeset 3689:75b45bbf8f18 onnv_59

6460622 zio_nowait() doesn't live up to its name
author ek110237
date Tue, 20 Feb 2007 22:55:55 -0800
parents bd23485682e4
children 2804232c1017
files usr/src/uts/common/fs/zfs/dbuf.c usr/src/uts/common/fs/zfs/dmu.c usr/src/uts/common/fs/zfs/dmu_objset.c usr/src/uts/common/fs/zfs/sys/zio.h usr/src/uts/common/fs/zfs/zio.c
diffstat 5 files changed, 29 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/dbuf.c	Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/dbuf.c	Tue Feb 20 22:55:55 2007 -0800
@@ -2061,6 +2061,7 @@
 	uint64_t txg = tx->tx_txg;
 	zbookmark_t zb;
 	zio_t *zio;
+	int zio_flags;
 
 	if (parent != dn->dn_dbuf) {
 		ASSERT(parent && parent->db_data_pending);
@@ -2083,6 +2084,9 @@
 	zb.zb_level = db->db_level;
 	zb.zb_blkid = db->db_blkid;
 
+	zio_flags = ZIO_FLAG_MUSTSUCCEED;
+	if (dmu_ot[dn->dn_type].ot_metadata || zb.zb_level != 0)
+		zio_flags |= ZIO_FLAG_METADATA;
 	if (BP_IS_OLDER(db->db_blkptr, txg))
 		dsl_dataset_block_kill(
 		    os->os_dsl_dataset, db->db_blkptr, zio, tx);
@@ -2090,7 +2094,7 @@
 	dr->dr_zio = arc_write(zio, os->os_spa, checksum, compress,
 	    dmu_get_replication_level(os->os_spa, &zb, dn->dn_type), txg,
 	    db->db_blkptr, data, dbuf_write_ready, dbuf_write_done, db,
-	    ZIO_PRIORITY_ASYNC_WRITE, ZIO_FLAG_MUSTSUCCEED, &zb);
+	    ZIO_PRIORITY_ASYNC_WRITE, zio_flags, &zb);
 }
 
 /* ARGSUSED */
--- a/usr/src/uts/common/fs/zfs/dmu.c	Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/dmu.c	Tue Feb 20 22:55:55 2007 -0800
@@ -672,6 +672,7 @@
 	dmu_sync_arg_t *in;
 	zbookmark_t zb;
 	zio_t *zio;
+	int zio_flags;
 	int err;
 
 	ASSERT(BP_IS_HOLE(bp));
@@ -782,12 +783,15 @@
 	zb.zb_object = db->db.db_object;
 	zb.zb_level = db->db_level;
 	zb.zb_blkid = db->db_blkid;
+	zio_flags = ZIO_FLAG_MUSTSUCCEED;
+	if (dmu_ot[db->db_dnode->dn_type].ot_metadata || zb.zb_level != 0)
+		zio_flags |= ZIO_FLAG_METADATA;
 	zio = arc_write(pio, os->os_spa,
 	    zio_checksum_select(db->db_dnode->dn_checksum, os->os_checksum),
 	    zio_compress_select(db->db_dnode->dn_compress, os->os_compress),
 	    dmu_get_replication_level(os->os_spa, &zb, db->db_dnode->dn_type),
 	    txg, bp, dr->dt.dl.dr_data, NULL, dmu_sync_done, in,
-	    ZIO_PRIORITY_SYNC_WRITE, ZIO_FLAG_MUSTSUCCEED, &zb);
+	    ZIO_PRIORITY_SYNC_WRITE, zio_flags, &zb);
 
 	if (pio) {
 		zio_nowait(zio);
--- a/usr/src/uts/common/fs/zfs/dmu_objset.c	Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/dmu_objset.c	Tue Feb 20 22:55:55 2007 -0800
@@ -744,6 +744,7 @@
 	zio_t *zio;
 	list_t *list;
 	dbuf_dirty_record_t *dr;
+	int zio_flags;
 
 	dprintf_ds(os->os_dsl_dataset, "txg=%llu\n", tx->tx_txg);
 
@@ -758,6 +759,9 @@
 	zb.zb_object = 0;
 	zb.zb_level = -1;
 	zb.zb_blkid = 0;
+	zio_flags = ZIO_FLAG_MUSTSUCCEED;
+	if (dmu_ot[DMU_OT_OBJSET].ot_metadata || zb.zb_level != 0)
+		zio_flags |= ZIO_FLAG_METADATA;
 	if (BP_IS_OLDER(os->os_rootbp, tx->tx_txg))
 		dsl_dataset_block_kill(os->os_dsl_dataset,
 		    os->os_rootbp, pio, tx);
@@ -765,7 +769,7 @@
 	    os->os_md_compress,
 	    dmu_get_replication_level(os->os_spa, &zb, DMU_OT_OBJSET),
 	    tx->tx_txg, os->os_rootbp, os->os_phys_buf, ready, killer, os,
-	    ZIO_PRIORITY_ASYNC_WRITE, ZIO_FLAG_MUSTSUCCEED, &zb);
+	    ZIO_PRIORITY_ASYNC_WRITE, zio_flags, &zb);
 
 	/*
 	 * Sync meta-dnode - the parent IO for the sync is the root block
--- a/usr/src/uts/common/fs/zfs/sys/zio.h	Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/sys/zio.h	Tue Feb 20 22:55:55 2007 -0800
@@ -133,6 +133,8 @@
 #define	ZIO_FLAG_NOBOOKMARK		0x10000
 #define	ZIO_FLAG_USER			0x20000
 
+#define	ZIO_FLAG_METADATA		0x40000
+
 #define	ZIO_FLAG_GANG_INHERIT		\
 	(ZIO_FLAG_CANFAIL |		\
 	ZIO_FLAG_FAILFAST |		\
--- a/usr/src/uts/common/fs/zfs/zio.c	Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/zio.c	Tue Feb 20 22:55:55 2007 -0800
@@ -1702,7 +1702,18 @@
 	ASSERT(zio->io_stage <= ZIO_STAGE_DONE);
 	ASSERT(zio->io_stalled == 0);
 
-	zio_pipeline[zio->io_stage](zio);
+	/*
+	 * See the comment in zio_next_stage_async() about per-CPU taskqs.
+	 */
+	if (((1U << zio->io_stage) & zio->io_async_stages) &&
+	    (zio->io_stage == ZIO_STAGE_WRITE_COMPRESS) &&
+	    !(zio->io_flags & ZIO_FLAG_METADATA)) {
+		taskq_t *tq = zio->io_spa->spa_zio_issue_taskq[zio->io_type];
+		(void) taskq_dispatch(tq,
+		    (task_func_t *)zio_pipeline[zio->io_stage], zio, TQ_SLEEP);
+	} else {
+		zio_pipeline[zio->io_stage](zio);
+	}
 }
 
 void