Brian Behlendorf 6fe53787f3 Fix vdev_queue_aggregate() deadlock
This deadlock may manifest itself in slightly different ways but
at the core it is caused by a memory allocation blocking on file-
system reclaim in the zio pipeline.  This is normally impossible
because zio_execute() disables filesystem reclaim by setting
PF_FSTRANS on the thread.  However, kmem cache allocations may
still indirectly block on file system reclaim while holding the
critical vq->vq_lock as shown below.

To resolve this issue zio_buf_alloc_flags() is introduced which
allocation flags to be passed.  This can then be used in
vdev_queue_aggregate() with KM_NOSLEEP when allocating the
aggregate IO buffer.  Since aggregating the IO is purely a
performance optimization we want this to either succeed or fail
quickly.  Trying too hard to allocate this memory under the
vq->vq_lock can negatively impact performance and result in
this deadlock.

* z_wr_iss
zio_vdev_io_start
  vdev_queue_io -> Takes vq->vq_lock
    vdev_queue_io_to_issue
      vdev_queue_aggregate
        zio_buf_alloc -> Waiting on spl_kmem_cache process

* z_wr_int
zio_vdev_io_done
  vdev_queue_io_done
    mutex_lock -> Waiting on vq->vq_lock held by z_wr_iss

* txg_sync
spa_sync
  dsl_pool_sync
    zio_wait -> Waiting on zio being handled by z_wr_int

* spl_kmem_cache
spl_cache_grow_work
  kv_alloc
    spl_vmalloc
      ...
      evict
        zpl_evict_inode
          zfs_inactive
            dmu_tx_wait
              txg_wait_open -> Waiting on txg_sync

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Signed-off-by: Tim Chase <tim@chase2k.com>
Closes #3808
Closes #3867
2015-12-18 13:27:12 -08:00
..
2014-08-01 14:28:05 -07:00
2015-01-16 14:41:26 -08:00
2015-01-16 14:41:26 -08:00
2015-12-07 12:20:43 -08:00
2015-01-16 14:41:26 -08:00
2015-12-15 16:21:43 -08:00
2013-12-18 16:46:35 -08:00
2015-01-16 14:41:26 -08:00
2015-01-16 14:41:26 -08:00
2015-01-16 14:41:26 -08:00
2010-08-31 13:41:59 -07:00
2010-08-31 13:41:58 -07:00
2015-08-19 16:04:33 -07:00
2015-09-02 09:30:18 -07:00
2015-01-16 14:41:26 -08:00
2015-01-16 14:41:26 -08:00
2015-01-16 14:41:26 -08:00
2015-01-16 14:41:26 -08:00
2015-01-16 14:41:26 -08:00
2013-10-31 14:58:04 -07:00
2015-09-01 15:22:07 -07:00
2015-12-04 09:39:20 -08:00
2015-05-04 09:41:09 -07:00
2015-01-16 14:41:26 -08:00
2010-08-31 13:41:58 -07:00
2015-09-04 16:08:14 -07:00
2015-01-16 14:41:26 -08:00
2013-10-30 14:51:27 -07:00
2014-09-05 15:11:43 -07:00
2015-01-16 14:41:26 -08:00
2014-08-01 14:28:05 -07:00
2015-12-18 13:27:12 -08:00
2015-12-15 16:21:43 -08:00