freebsd-dev/module/zfs
Brian Behlendorf a168788053 Reduce stack for traverse_visitbp() recursion
During pool import stack overflows may still occur due to the
potentially deep recursion of traverse_visitbp().  This is most
likely to occur when additional layers are added to the block
device stack such as DM multipath.  To minimize the stack usage
for this call path the following changes were made:

1) Added the keywork 'noinline' to the vdev_*_map_alloc() functions
   to prevent them from being inlined by gcc.  This reduced the
   stack usage of vdev_raidz_io_start() from 208 to 128 bytes, and
   vdev_mirror_io_start() from 144 to 128 bytes.

2) The 'saved_poolname' charater array in zfsdev_ioctl() was moved
   from the stack to the heap.  This reduced the stack usage of
   zfsdev_ioctl() from 368 to 112 bytes.

3) The major saving came from slimming down traverse_visitbp() from
   from 224 to 144 bytes.  Since this function is called recursively
   the 80 bytes saved per invokation adds up.  The following changes
   were made:

  a) The 'hard' local variable was replaced by a TD_HARD() macro.

  b) The 'pd' local variable was replaced by 'td->td_pfd' references.

  c) The zbookmark_t was moved to the heap.  This does cost us an
     additional memory allocation per recursion by that cost should
     still be minimal.  The cost could be further reduced by adding
     a dedicated zbookmark_t slab cache.

  d) The variable declarations in 'if (BP_GET_LEVEL()) { }' were
     restructured to use the minimum amount of stack.  This includes
     removing the 'cbp' local variable.

Overall for the offending use case roughly 1584 of total stack space
has been saved.  This is enough to avoid overflowing the stack on
stock kernels with 8k stacks.  See #1778 for additional details.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ned Bass <bass6@llnl.gov>
Closes #1778
2013-11-14 14:28:12 -08:00
..
arc.c Illumos #3995 2013-11-05 12:26:00 -08:00
bplist.c Illumos #3464 2013-09-04 16:01:24 -07:00
bpobj.c Illumos #3603, #3604: bobj improvements 2013-10-31 14:57:51 -07:00
bptree.c 26126 panic system rather than corrupting pool if we hit bug 26100 2013-11-05 13:18:26 -08:00
dbuf_stats.c Add visibility in to cached dbufs 2013-10-25 13:59:40 -07:00
dbuf.c Illumos #4047 2013-11-05 12:23:35 -08:00
ddt_zap.c Add ddt_object_count() error handling 2012-10-29 08:57:45 -07:00
ddt.c Illumos #3598 2013-10-31 14:58:04 -07:00
dmu_diff.c Illumos #3598 2013-10-31 14:58:04 -07:00
dmu_object.c Illumos #3598 2013-10-31 14:58:04 -07:00
dmu_objset.c Illumos #3875 2013-11-04 11:27:41 -08:00
dmu_send.c Illumos #4047 2013-11-05 12:23:35 -08:00
dmu_traverse.c Reduce stack for traverse_visitbp() recursion 2013-11-14 14:28:12 -08:00
dmu_tx.c Illumos #4082 2013-11-05 12:25:26 -08:00
dmu_zfetch.c Illumos #3741 2013-11-04 10:55:25 -08:00
dmu.c Illumos #4082 2013-11-05 12:25:26 -08:00
dnode_sync.c Illumos #3742 2013-11-04 10:55:25 -08:00
dnode.c Illumos #4047 2013-11-05 12:23:35 -08:00
dsl_dataset.c Switch allocations from KM_SLEEP to KM_PUSHPAGE 2013-11-05 12:26:14 -08:00
dsl_deadlist.c Illumos #3104: eliminate empty bpobjs 2013-01-08 10:35:43 -08:00
dsl_deleg.c Illumos #3598 2013-10-31 14:58:04 -07:00
dsl_destroy.c Illumos #4047 2013-11-05 12:23:35 -08:00
dsl_dir.c Illumos #4046 2013-11-05 12:24:24 -08:00
dsl_pool.c Illumos #3236 2013-11-05 12:14:21 -08:00
dsl_prop.c Illumos #3742 2013-11-04 10:55:25 -08:00
dsl_scan.c 26126 panic system rather than corrupting pool if we hit bug 26100 2013-11-05 13:18:26 -08:00
dsl_synctask.c Illumos #3598 2013-10-31 14:58:04 -07:00
dsl_userhold.c Some nvlist allocations in hold processing need to use KM_PUSHPAGE. 2013-11-14 11:11:37 -08:00
fm.c Condition variable usage, zevent_cv 2012-10-15 16:01:54 -07:00
gzip.c Fix zmod.h usage in userspace 2010-08-31 08:38:46 -07:00
lz4.c Linux 3.11 compat: Rename LZ4 symbols 2013-10-22 10:12:39 -07:00
lzjb.c Illumos #3522 2013-10-30 14:51:27 -07:00
Makefile.in Add visibility in to cached dbufs 2013-10-25 13:59:40 -07:00
metaslab.c Illumos #4168, #4169, #4170 2013-11-05 12:25:44 -08:00
refcount.c Illumos #3464 2013-09-04 16:01:24 -07:00
rrwlock.c Fix several new KM_SLEEP warnings 2013-09-25 15:44:22 -07:00
sa.c Illumos #3742 2013-11-04 10:55:25 -08:00
sha256.c Add linux sha2 support 2010-08-31 13:41:59 -07:00
spa_boot.c Add linux kernel module support 2010-08-31 13:41:58 -07:00
spa_config.c Illumos #3956, #3957, #3958, #3959, #3960, #3961, #3962 2013-11-05 12:23:05 -08:00
spa_errlog.c Illumos #3743 2013-11-04 10:55:25 -08:00
spa_history.c Illumos #3598 2013-10-31 14:58:04 -07:00
spa_misc.c Illumos #3112, #3113, #3114 2013-11-05 12:14:48 -08:00
spa_stats.c Illumos #3537 2013-10-31 09:16:03 -07:00
spa.c Illumos #3956, #3957, #3958, #3959, #3960, #3961, #3962 2013-11-05 12:23:05 -08:00
space_map.c Illumos #3464 2013-09-04 16:01:24 -07:00
txg.c Illumos #3742 2013-11-04 10:55:25 -08:00
uberblock.c Illumos #3598 2013-10-31 14:58:04 -07:00
unique.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
vdev_cache.c Illumos #3598 2013-10-31 14:58:04 -07:00
vdev_disk.c Illumos #3598 2013-10-31 14:58:04 -07:00
vdev_file.c Illumos #3949, #3950, #3952, #3953 2013-11-05 12:17:07 -08:00
vdev_label.c Illumos #3956, #3957, #3958, #3959, #3960, #3961, #3962 2013-11-05 12:23:05 -08:00
vdev_mirror.c Reduce stack for traverse_visitbp() recursion 2013-11-14 14:28:12 -08:00
vdev_missing.c Illumos #3598 2013-10-31 14:58:04 -07:00
vdev_queue.c Illumos #3742 2013-11-04 10:55:25 -08:00
vdev_raidz.c Reduce stack for traverse_visitbp() recursion 2013-11-14 14:28:12 -08:00
vdev_root.c Illumos #3598 2013-10-31 14:58:04 -07:00
vdev.c Illumos #3956, #3957, #3958, #3959, #3960, #3961, #3962 2013-11-05 12:23:05 -08:00
zap_leaf.c Illumos #3598 2013-10-31 14:58:04 -07:00
zap_micro.c Illumos #3598 2013-10-31 14:58:04 -07:00
zap.c Illumos #3743 2013-11-04 10:55:25 -08:00
zfeature_common.c Illumos #3035 LZ4 compression support in ZFS and GRUB 2013-01-29 09:28:20 -08:00
zfeature.c Illumos #3598 2013-10-31 14:58:04 -07:00
zfs_acl.c Illumos #3742 2013-11-04 10:55:25 -08:00
zfs_byteswap.c Add linux kernel module support 2010-08-31 13:41:58 -07:00
zfs_ctldir.c Handle concurrent snapshot automounts failing due to EBUSY. 2013-11-08 10:45:14 -08:00
zfs_debug.c 26126 panic system rather than corrupting pool if we hit bug 26100 2013-11-05 13:18:26 -08:00
zfs_dir.c Illumos #3598 2013-10-31 14:58:04 -07:00
zfs_fm.c 3246 ZFS I/O deadman thread 2013-05-01 17:05:52 -07:00
zfs_fuid.c Illumos #3522 2013-10-30 14:51:27 -07:00
zfs_ioctl.c Reduce stack for traverse_visitbp() recursion 2013-11-14 14:28:12 -08:00
zfs_log.c Illumos #3742 2013-11-04 10:55:25 -08:00
zfs_onexit.c Illumos #3598 2013-10-31 14:58:04 -07:00
zfs_replay.c Illumos #3598 2013-10-31 14:58:04 -07:00
zfs_rlock.c Illumos #3742 2013-11-04 10:55:25 -08:00
zfs_sa.c Illumos #3742 2013-11-04 10:55:25 -08:00
zfs_vfsops.c Fix rollback of mounted filesystem regression 2013-11-14 10:44:03 -08:00
zfs_vnops.c Illumos #3236 2013-11-05 12:14:21 -08:00
zfs_znode.c Illumos #3742 2013-11-04 10:55:25 -08:00
zil.c Illumos #3742 2013-11-04 10:55:25 -08:00
zio_checksum.c Illumos #3598 2013-10-31 14:58:04 -07:00
zio_compress.c Illumos #3598 2013-10-31 14:58:04 -07:00
zio_inject.c Illumos #3598 2013-10-31 14:58:04 -07:00
zio.c Illumos #3954, #4080, #4081 2013-11-05 12:25:01 -08:00
zle.c Update core ZFS code from build 121 to build 141. 2010-05-28 13:45:14 -07:00
zpl_ctldir.c Add missing dsl pool configuration lock 2013-10-22 08:31:20 -07:00
zpl_export.c Implement .commit_metadata hook for NFS export 2012-10-03 10:49:45 -07:00
zpl_file.c Linux 3.11 compat: fops->iterate() 2013-08-15 16:19:07 -07:00
zpl_inode.c Honor CONFIG_FS_POSIX_ACL kernel option 2013-11-05 16:22:05 -08:00
zpl_super.c Honor CONFIG_FS_POSIX_ACL kernel option 2013-11-05 16:22:05 -08:00
zpl_xattr.c Honor CONFIG_FS_POSIX_ACL kernel option 2013-11-05 16:22:05 -08:00
zrlock.c Export ZFS symbols needed by Lustre. 2010-09-17 16:24:15 -07:00
zvol.c Illumos #3236 2013-11-05 12:14:21 -08:00