mirror_zfs/module/zfs
Richard Yao b8d06fca08 Switch KM_SLEEP to KM_PUSHPAGE
Differences between how paging is done on Solaris and Linux can cause
deadlocks if KM_SLEEP is used in any the following contexts.

  * The txg_sync thread
  * The zvol write/discard threads
  * The zpl_putpage() VFS callback

This is because KM_SLEEP will allow for direct reclaim which may result
in the VM calling back in to the filesystem or block layer to write out
pages.  If a lock is held over this operation the potential exists to
deadlock the system.  To ensure forward progress all memory allocations
in these contexts must us KM_PUSHPAGE which disables performing any I/O
to accomplish the memory allocation.

Previously, this behavior was acheived by setting PF_MEMALLOC on the
thread.  However, that resulted in unexpected side effects such as the
exhaustion of pages in ZONE_DMA.  This approach touchs more of the zfs
code, but it is more consistent with the right way to handle these cases
under Linux.

This is patch lays the ground work for being able to safely revert the
following commits which used PF_MEMALLOC:

  21ade34 Disable direct reclaim for z_wr_* threads
  cfc9a5c Fix zpl_writepage() deadlock
  eec8164 Fix ASSERTION(!dsl_pool_sync_context(tx->tx_pool))

Signed-off-by: Richard Yao <ryao@cs.stonybrook.edu>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #726
2012-08-27 12:01:37 -07:00
..
arc.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
bplist.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
bpobj.c Illumos #1644, #1645, #1646, #1647, #1708 2012-07-31 09:25:30 -07:00
dbuf.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
ddt_zap.c Update incorrect ddt_zap_lookup() assertion 2012-07-03 15:14:34 -07:00
ddt.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dmu_diff.c Update to onnv_147 2010-08-26 14:24:34 -07:00
dmu_object.c Add linux kernel module support 2010-08-31 13:41:58 -07:00
dmu_objset.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dmu_send.c Illumos #2901: zfs receive fails for exabyte sparse files 2012-08-25 12:28:29 -07:00
dmu_traverse.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dmu_tx.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dmu_zfetch.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dmu.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dnode_sync.c Fix dbuf eviction assertion 2010-08-31 08:38:45 -07:00
dnode.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dsl_dataset.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dsl_deadlist.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dsl_deleg.c Illumos #1644, #1645, #1646, #1647, #1708 2012-07-31 09:25:30 -07:00
dsl_dir.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dsl_pool.c Illumos #1644, #1645, #1646, #1647, #1708 2012-07-31 09:25:30 -07:00
dsl_prop.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
dsl_scan.c Add 'inline' keyword 2012-07-19 13:41:00 -07:00
dsl_synctask.c Add linux kernel module support 2010-08-31 13:41:58 -07:00
fm.c Wrap smp_processor_id in kpreempt_[dis|en]able 2012-08-24 13:19:06 -07:00
gzip.c Fix zmod.h usage in userspace 2010-08-31 08:38:46 -07:00
lzjb.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
Makefile.in Add script for builtin module building. 2012-07-26 13:45:09 -07:00
metaslab.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
refcount.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
rrwlock.c Enable rrwlock.c compilation 2010-12-07 16:05:25 -08:00
sa.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07: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 Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
spa_errlog.c Add linux kernel module support 2010-08-31 13:41:58 -07:00
spa_history.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
spa_misc.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
spa.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
space_map.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
txg.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
uberblock.c Update core ZFS code from build 121 to build 141. 2010-05-28 13:45:14 -07:00
unique.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
vdev_cache.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
vdev_disk.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
vdev_file.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
vdev_label.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
vdev_mirror.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
vdev_missing.c Update core ZFS code from build 121 to build 141. 2010-05-28 13:45:14 -07:00
vdev_queue.c Pre-allocate vdev I/O buffers 2012-08-27 12:01:37 -07:00
vdev_raidz.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
vdev_root.c Fix gcc c90 compliance warnings 2010-08-27 15:28:32 -07:00
vdev.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
zap_leaf.c Fix gcc uninitialized variable warnings 2010-08-31 08:38:43 -07:00
zap_micro.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
zap.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
zfs_acl.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
zfs_byteswap.c Add linux kernel module support 2010-08-31 13:41:58 -07:00
zfs_ctldir.c Disable .zfs directory on 32-bit systems 2012-07-20 12:20:57 -07:00
zfs_debug.c Use spl_debug_* helpers 2012-02-09 16:37:48 -08:00
zfs_dir.c rmdir(2) should return ENOTEMPTY 2012-08-26 13:55:45 -07:00
zfs_fm.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
zfs_fuid.c Drop HAVE_XVATTR macros 2011-03-02 11:44:34 -08:00
zfs_ioctl.c Illumos #1644, #1645, #1646, #1647, #1708 2012-07-31 09:25:30 -07:00
zfs_log.c Drop HAVE_XVATTR macros 2011-03-02 11:44:34 -08:00
zfs_onexit.c Add linux kernel device support 2010-08-31 13:41:50 -07:00
zfs_replay.c Use Linux ATTR_ versions 2011-03-03 11:29:15 -08:00
zfs_rlock.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
zfs_sa.c Revert "Use SA_HDL_PRIVATE for SA xattrs" 2012-08-25 09:25:56 -07:00
zfs_vfsops.c Suppress 'zfs_sb_create' memory warning 2012-08-10 16:43:32 -07:00
zfs_vnops.c Add .zfs control directory 2012-03-22 13:03:47 -07:00
zfs_znode.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
zil.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00
zio_checksum.c Update core ZFS code from build 121 to build 141. 2010-05-28 13:45:14 -07:00
zio_compress.c Update core ZFS code from build 121 to build 141. 2010-05-28 13:45:14 -07:00
zio_inject.c Add missing ZFS tunables 2011-05-04 10:02:37 -07:00
zio.c Pre-allocate vdev I/O buffers 2012-08-27 12:01:37 -07:00
zle.c Update core ZFS code from build 121 to build 141. 2010-05-28 13:45:14 -07:00
zpl_ctldir.c Linux 3.3 compat, iops->create()/mkdir()/mknod() 2012-04-30 12:52:38 -07:00
zpl_export.c Linux 3.5 compat, eops->encode_fh() takes inodes 2012-07-23 12:29:23 -07:00
zpl_file.c Annotate KM_PUSHPAGE call paths with PF_NOFS 2012-08-27 12:01:37 -07:00
zpl_inode.c Linux 3.5 compat, iops->truncate_range() removed 2012-07-23 12:29:32 -07:00
zpl_super.c Linux 3.5 compat, end_writeback() changed to clear_inode() 2012-07-23 12:29:36 -07:00
zpl_xattr.c Add missing NULL in zpl_xattr_handlers 2012-03-15 15:18:29 -07:00
zrlock.c Export ZFS symbols needed by Lustre. 2010-09-17 16:24:15 -07:00
zvol.c Switch KM_SLEEP to KM_PUSHPAGE 2012-08-27 12:01:37 -07:00