summaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2011-04-22 10:12:49 -0700
committerBrian Behlendorf <[email protected]>2011-04-26 13:37:35 -0700
commit7a060636b05655cccd87ce74d70e5957bb234e5e (patch)
treed2ddc53f9ae1c9b3763de90f9933bc6645971053 /module
parent44e9e3479388ee16f39253e8c3f8f6625324dfc6 (diff)
Conserve stack in dsl_scan_visitbp()
The recursive call chain dsl_scan_visitbp() -> dsl_scan_recurse() -> dsl_scan_visitdnode() -> dsl_scan_visitbp has been observed to consume considerable stack resulting in a stack overflow (>8k). The cleanest way I see to fix this with minimal impact to the existing flow of code, and with the fewest performance concerns, is to always inline dsl_scan_recurse() and dsl_scan_visitdnode(). While this will increase the function size of dsl_scan_visitbp(), by 4660 bytes, it also reduces the stack requirements by removing the function call overhead. Issue #174
Diffstat (limited to 'module')
-rw-r--r--module/zfs/dsl_scan.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/module/zfs/dsl_scan.c b/module/zfs/dsl_scan.c
index 107c81b96..421ddd041 100644
--- a/module/zfs/dsl_scan.c
+++ b/module/zfs/dsl_scan.c
@@ -648,7 +648,7 @@ dsl_scan_check_resume(dsl_scan_t *scn, const dnode_phys_t *dnp,
* Return nonzero on i/o error.
* Return new buf to write out in *bufp.
*/
-static int
+__attribute__((always_inline)) static int
dsl_scan_recurse(dsl_scan_t *scn, dsl_dataset_t *ds, dmu_objset_type_t ostype,
dnode_phys_t *dnp, const blkptr_t *bp,
const zbookmark_t *zb, dmu_tx_t *tx, arc_buf_t **bufp)
@@ -754,7 +754,7 @@ dsl_scan_recurse(dsl_scan_t *scn, dsl_dataset_t *ds, dmu_objset_type_t ostype,
return (0);
}
-static void
+__attribute__((always_inline)) static void
dsl_scan_visitdnode(dsl_scan_t *scn, dsl_dataset_t *ds,
dmu_objset_type_t ostype, dnode_phys_t *dnp, arc_buf_t *buf,
uint64_t object, dmu_tx_t *tx)