Author: mav
Date: Sat Oct  3 07:25:05 2015
New Revision: 288544
URL: https://svnweb.freebsd.org/changeset/base/288544

Log:
  MFC r286551: 5694 traverse_prefetcher does not prefetch enough
  
  Reviewed by: Matthew Ahrens <mahr...@delphix.com>
  Reviewed by: Alex Reece <a...@delphix.com>
  Reviewed by: Christopher Siden <christopher.si...@delphix.com>
  Reviewed by: Josef 'Jeff' Sipek <josef.si...@nexenta.com>
  Reviewed by: Bayard Bell <buffer.g.overf...@gmail.com>
  Approved by: Garrett D'Amore <garr...@damore.org>
  Author: George Wilson <george.wil...@delphix.com>
  
  illumos/illumos-gate@34d7ce052c4565b078f73b95ccbd49274e98edaa

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

Modified: 
stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c     
Sat Oct  3 07:24:12 2015        (r288543)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c     
Sat Oct  3 07:25:05 2015        (r288544)
@@ -39,13 +39,12 @@
 #include <sys/callb.h>
 #include <sys/zfeature.h>
 
-int zfs_pd_blks_max = 100;
+int32_t zfs_pd_bytes_max = 50 * 1024 * 1024;   /* 50MB */
 
 typedef struct prefetch_data {
        kmutex_t pd_mtx;
        kcondvar_t pd_cv;
-       int pd_blks_max;
-       int pd_blks_fetched;
+       int32_t pd_bytes_fetched;
        int pd_flags;
        boolean_t pd_cancel;
        boolean_t pd_exited;
@@ -250,11 +249,12 @@ traverse_visitbp(traverse_data_t *td, co
        }
 
        if (pd != NULL && !pd->pd_exited && prefetch_needed(pd, bp)) {
+               uint64_t size = BP_GET_LSIZE(bp);
                mutex_enter(&pd->pd_mtx);
-               ASSERT(pd->pd_blks_fetched >= 0);
-               while (pd->pd_blks_fetched == 0 && !pd->pd_exited)
+               ASSERT(pd->pd_bytes_fetched >= 0);
+               while (pd->pd_bytes_fetched < size && !pd->pd_exited)
                        cv_wait(&pd->pd_cv, &pd->pd_mtx);
-               pd->pd_blks_fetched--;
+               pd->pd_bytes_fetched -= size;
                cv_broadcast(&pd->pd_cv);
                mutex_exit(&pd->pd_mtx);
        }
@@ -447,7 +447,7 @@ traverse_prefetcher(spa_t *spa, zilog_t 
        prefetch_data_t *pfd = arg;
        arc_flags_t aflags = ARC_FLAG_NOWAIT | ARC_FLAG_PREFETCH;
 
-       ASSERT(pfd->pd_blks_fetched >= 0);
+       ASSERT(pfd->pd_bytes_fetched >= 0);
        if (pfd->pd_cancel)
                return (SET_ERROR(EINTR));
 
@@ -455,9 +455,9 @@ traverse_prefetcher(spa_t *spa, zilog_t 
                return (0);
 
        mutex_enter(&pfd->pd_mtx);
-       while (!pfd->pd_cancel && pfd->pd_blks_fetched >= pfd->pd_blks_max)
+       while (!pfd->pd_cancel && pfd->pd_bytes_fetched >= zfs_pd_bytes_max)
                cv_wait(&pfd->pd_cv, &pfd->pd_mtx);
-       pfd->pd_blks_fetched++;
+       pfd->pd_bytes_fetched += BP_GET_LSIZE(bp);
        cv_broadcast(&pfd->pd_cv);
        mutex_exit(&pfd->pd_mtx);
 
@@ -529,7 +529,6 @@ traverse_impl(spa_t *spa, dsl_dataset_t 
                td.td_hole_birth_enabled_txg = 0;
        }
 
-       pd.pd_blks_max = zfs_pd_blks_max;
        pd.pd_flags = flags;
        mutex_init(&pd.pd_mtx, NULL, MUTEX_DEFAULT, NULL);
        cv_init(&pd.pd_cv, NULL, CV_DEFAULT, NULL);
_______________________________________________
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