|
38 | 38 | #include <sys/callb.h>
|
39 | 39 | #include <sys/zfeature.h>
|
40 | 40 |
|
41 |
| -int zfs_pd_blks_max = 100; |
| 41 | +int32_t zfs_pd_bytes_max = 50 * 1024 * 1024; /* 50MB */ |
42 | 42 |
|
43 | 43 | typedef struct prefetch_data {
|
44 | 44 | kmutex_t pd_mtx;
|
45 | 45 | kcondvar_t pd_cv;
|
46 |
| - int pd_blks_max; |
47 |
| - int pd_blks_fetched; |
| 46 | + int32_t pd_bytes_fetched; |
48 | 47 | int pd_flags;
|
49 | 48 | boolean_t pd_cancel;
|
50 | 49 | boolean_t pd_exited;
|
@@ -251,11 +250,12 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
|
251 | 250 | }
|
252 | 251 |
|
253 | 252 | if (pd != NULL && !pd->pd_exited && prefetch_needed(pd, bp)) {
|
| 253 | + uint64_t size = BP_GET_LSIZE(bp); |
254 | 254 | mutex_enter(&pd->pd_mtx);
|
255 |
| - ASSERT(pd->pd_blks_fetched >= 0); |
256 |
| - while (pd->pd_blks_fetched == 0 && !pd->pd_exited) |
| 255 | + ASSERT(pd->pd_bytes_fetched >= 0); |
| 256 | + while (pd->pd_bytes_fetched < size && !pd->pd_exited) |
257 | 257 | cv_wait(&pd->pd_cv, &pd->pd_mtx);
|
258 |
| - pd->pd_blks_fetched--; |
| 258 | + pd->pd_bytes_fetched -= size; |
259 | 259 | cv_broadcast(&pd->pd_cv);
|
260 | 260 | mutex_exit(&pd->pd_mtx);
|
261 | 261 | }
|
@@ -452,17 +452,17 @@ traverse_prefetcher(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
|
452 | 452 | prefetch_data_t *pfd = arg;
|
453 | 453 | uint32_t aflags = ARC_NOWAIT | ARC_PREFETCH;
|
454 | 454 |
|
455 |
| - ASSERT(pfd->pd_blks_fetched >= 0); |
| 455 | + ASSERT(pfd->pd_bytes_fetched >= 0); |
456 | 456 | if (pfd->pd_cancel)
|
457 | 457 | return (SET_ERROR(EINTR));
|
458 | 458 |
|
459 | 459 | if (!prefetch_needed(pfd, bp))
|
460 | 460 | return (0);
|
461 | 461 |
|
462 | 462 | mutex_enter(&pfd->pd_mtx);
|
463 |
| - while (!pfd->pd_cancel && pfd->pd_blks_fetched >= pfd->pd_blks_max) |
| 463 | + while (!pfd->pd_cancel && pfd->pd_bytes_fetched >= zfs_pd_bytes_max) |
464 | 464 | cv_wait(&pfd->pd_cv, &pfd->pd_mtx);
|
465 |
| - pfd->pd_blks_fetched++; |
| 465 | + pfd->pd_bytes_fetched += BP_GET_LSIZE(bp); |
466 | 466 | cv_broadcast(&pfd->pd_cv);
|
467 | 467 | mutex_exit(&pfd->pd_mtx);
|
468 | 468 |
|
@@ -531,7 +531,6 @@ traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp,
|
531 | 531 | td->td_flags = flags;
|
532 | 532 | td->td_paused = B_FALSE;
|
533 | 533 |
|
534 |
| - pd->pd_blks_max = zfs_pd_blks_max; |
535 | 534 | pd->pd_flags = flags;
|
536 | 535 | mutex_init(&pd->pd_mtx, NULL, MUTEX_DEFAULT, NULL);
|
537 | 536 | cv_init(&pd->pd_cv, NULL, CV_DEFAULT, NULL);
|
@@ -661,6 +660,6 @@ traverse_pool(spa_t *spa, uint64_t txg_start, int flags,
|
661 | 660 | EXPORT_SYMBOL(traverse_dataset);
|
662 | 661 | EXPORT_SYMBOL(traverse_pool);
|
663 | 662 |
|
664 |
| -module_param(zfs_pd_blks_max, int, 0644); |
665 |
| -MODULE_PARM_DESC(zfs_pd_blks_max, "Max number of blocks to prefetch"); |
| 663 | +module_param(zfs_pd_bytes_max, int, 0644); |
| 664 | +MODULE_PARM_DESC(zfs_pd_bytes_max, "Max number of bytes to prefetch"); |
666 | 665 | #endif
|
0 commit comments