Author: avg
Date: Fri May 26 11:30:55 2017
New Revision: 318928
URL: https://svnweb.freebsd.org/changeset/base/318928

Log:
  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 <[email protected]>
  Reviewed by: Pavel Zakharov <[email protected]>
  Reviewed by: Prashanth Sreenivasa <[email protected]>
  Approved by: Robert Mustacchi <[email protected]>
  Author: Matthew Ahrens <[email protected]>

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

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c  Fri May 26 
11:29:31 2017        (r318927)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c  Fri May 26 
11:30:55 2017        (r318928)
@@ -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
                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
                        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
                mutex_exit(&db->db_mtx);
        }
 
-       ASSERT(err || havepzio || db->db_state == DB_CACHED);
        return (err);
 }
 
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to