svn commit: r252839 - in vendor-sys/illumos/dist/uts/common/fs/zfs: . sys

Martin Matuska mm at FreeBSD.org
Fri Jul 5 20:37:10 UTC 2013


Author: mm
Date: Fri Jul  5 20:37:09 2013
New Revision: 252839
URL: http://svnweb.freebsd.org/changeset/base/252839

Log:
  Update vendor-sys/illumos/dist to illumos-gate 14070:d4c9f8eba8fa
  
  Illumos ZFS issues:
    3836 zio_free() can be processed immediately in the common case

Modified:
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zio_impl.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/zio.c

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zio_impl.h
==============================================================================
--- vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zio_impl.h	Fri Jul  5 20:24:50 2013	(r252838)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zio_impl.h	Fri Jul  5 20:37:09 2013	(r252839)
@@ -24,7 +24,7 @@
  */
 
 /*
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
  */
 
 #ifndef _ZIO_IMPL_H
@@ -38,7 +38,7 @@ extern "C" {
 #endif
 
 /*
- * XXX -- Describe ZFS I/O pipleine here. Fill in as needed.
+ * XXX -- Describe ZFS I/O pipeline here. Fill in as needed.
  *
  * The ZFS I/O pipeline is comprised of various stages which are defined
  * in the zio_stage enum below. The individual stages are used to construct
@@ -213,7 +213,6 @@ enum zio_stage {
 #define	ZIO_FREE_PIPELINE			\
 	(ZIO_INTERLOCK_STAGES |			\
 	ZIO_STAGE_FREE_BP_INIT |		\
-	ZIO_STAGE_ISSUE_ASYNC |			\
 	ZIO_STAGE_DVA_FREE)
 
 #define	ZIO_DDT_FREE_PIPELINE			\

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/zio.c
==============================================================================
--- vendor-sys/illumos/dist/uts/common/fs/zfs/zio.c	Fri Jul  5 20:24:50 2013	(r252838)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/zio.c	Fri Jul  5 20:37:09 2013	(r252839)
@@ -698,7 +698,20 @@ void
 zio_free(spa_t *spa, uint64_t txg, const blkptr_t *bp)
 {
 	metaslab_check_free(spa, bp);
-	bplist_append(&spa->spa_free_bplist[txg & TXG_MASK], bp);
+
+	/*
+	 * Frees that are for the currently-syncing txg, are not going to be
+	 * deferred, and which will not need to do a read (i.e. not GANG or
+	 * DEDUP), can be processed immediately.  Otherwise, put them on the
+	 * in-memory list for later processing.
+	 */
+	if (BP_IS_GANG(bp) || BP_GET_DEDUP(bp) ||
+	    txg != spa->spa_syncing_txg ||
+	    spa_sync_pass(spa) >= zfs_sync_pass_deferred_free) {
+		bplist_append(&spa->spa_free_bplist[txg & TXG_MASK], bp);
+	} else {
+		VERIFY0(zio_wait(zio_free_sync(NULL, spa, txg, bp, 0)));
+	}
 }
 
 zio_t *
@@ -706,6 +719,7 @@ zio_free_sync(zio_t *pio, spa_t *spa, ui
     enum zio_flag flags)
 {
 	zio_t *zio;
+	enum zio_stage stage = ZIO_FREE_PIPELINE;
 
 	dprintf_bp(bp, "freeing in txg %llu, pass %u",
 	    (longlong_t)txg, spa->spa_sync_pass);
@@ -717,9 +731,18 @@ zio_free_sync(zio_t *pio, spa_t *spa, ui
 	metaslab_check_free(spa, bp);
 	arc_freed(spa, bp);
 
+	/*
+	 * GANG and DEDUP blocks can induce a read (for the gang block header,
+	 * or the DDT), so issue them asynchronously so that this thread is
+	 * not tied up.
+	 */
+	if (BP_IS_GANG(bp) || BP_GET_DEDUP(bp))
+		stage |= ZIO_STAGE_ISSUE_ASYNC;
+
 	zio = zio_create(pio, spa, txg, bp, NULL, BP_GET_PSIZE(bp),
 	    NULL, NULL, ZIO_TYPE_FREE, ZIO_PRIORITY_FREE, flags,
-	    NULL, 0, NULL, ZIO_STAGE_OPEN, ZIO_FREE_PIPELINE);
+	    NULL, 0, NULL, ZIO_STAGE_OPEN, stage);
+
 
 	return (zio);
 }


More information about the svn-src-all mailing list