Author: mav
Date: Wed Jul 26 17:12:53 2017
New Revision: 321565
URL: https://svnweb.freebsd.org/changeset/base/321565

Log:
  MFC r318928: MFV r318927: 8025 dbuf_read() creates unnecessary zio_root() for 
bonus buf
  
  illumos/illumos-gate@def4fac5882b4ca67bd0f4a53509b6d1fa8ae14e
  
https://github.com/illumos/illumos-gate/commit/def4fac5882b4ca67bd0f4a53509b6d1fa8ae14e
  
  https://www.illumos.org/issues/8025
    dbuf_read() creates a zio_root() to track and wait for all the zio's
    that may happen as part of this call. However, if the blkptr_t for
    this buffer is NULL or a hole, we will not create any more zio's, so
    this zio_root() is unnecessary. This is always the case when calling
    dbuf_read() on a bonus buffer, because it has no blkptr (it's part of
    the containing dnode). For workloads that read a lot of bonus buffers
    (e.g. file creation and removal), creating and destroying these
    unnecessary zio's can decrease performance by around 3%.
  
  Reviewed by: Dan Kimmel <dan.kim...@delphix.com>
  Reviewed by: Pavel Zakharov <pavel.zakha...@delphix.com>
  Reviewed by: Prashanth Sreenivasa <p...@delphix.com>
  Approved by: Robert Mustacchi <r...@joyent.com>
  Author: Matthew Ahrens <mahr...@delphix.com>

Modified:
  stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c     Wed Jul 
26 16:58:01 2017        (r321564)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c     Wed Jul 
26 17:12:53 2017        (r321565)
@@ -1088,7 +1088,6 @@ int
 dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags)
 {
        int err = 0;
-       boolean_t havepzio = (zio != NULL);
        boolean_t prefetch;
        dnode_t *dn;
 
@@ -1132,9 +1131,13 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t fla
                DB_DNODE_EXIT(db);
        } else if (db->db_state == DB_UNCACHED) {
                spa_t *spa = dn->dn_objset->os_spa;
+               boolean_t need_wait = B_FALSE;
 
-               if (zio == NULL)
+               if (zio == NULL &&
+                   db->db_blkptr != NULL && !BP_IS_HOLE(db->db_blkptr)) {
                        zio = zio_root(spa, NULL, NULL, ZIO_FLAG_CANFAIL);
+                       need_wait = B_TRUE;
+               }
                dbuf_read_impl(db, zio, flags);
 
                /* dbuf_read_impl has dropped db_mtx for us */
@@ -1146,7 +1149,7 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t fla
                        rw_exit(&dn->dn_struct_rwlock);
                DB_DNODE_EXIT(db);
 
-               if (!havepzio)
+               if (need_wait)
                        err = zio_wait(zio);
        } else {
                /*
@@ -1181,7 +1184,6 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t fla
                mutex_exit(&db->db_mtx);
        }
 
-       ASSERT(err || havepzio || db->db_state == DB_CACHED);
        return (err);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to