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
This commit is contained in:
parent
44e9e34793
commit
7a060636b0
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue