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
..
2015-05-11 12:23:16 -07:00
2015-09-11 11:14:38 -07:00
2015-09-11 11:14:38 -07:00
2015-07-10 11:58:37 -07:00
2014-08-01 14:28:05 -07:00
2014-01-07 10:33:11 -08:00
2014-08-01 14:28:05 -07:00
2014-03-04 12:22:24 -08:00
2013-12-10 10:09:27 -08:00
2015-12-15 16:21:43 -08:00
2014-07-29 10:55:29 -07:00
2014-07-29 10:55:29 -07:00
2013-11-04 11:18:14 -08:00
2013-09-04 16:01:24 -07:00
2013-11-04 11:17:48 -08:00
2015-09-03 14:14:55 -07:00
2015-09-19 14:04:14 -07:00
2014-08-13 10:35:00 -07:00
2014-07-30 09:20:35 -07:00
2013-09-04 16:01:24 -07:00
2015-05-11 12:23:16 -07:00
2015-01-06 16:53:24 -08:00
2011-02-10 09:21:43 -08:00
2013-11-04 10:55:25 -08:00
2013-12-18 16:46:35 -08:00
2015-06-25 08:58:16 -07:00
2015-06-09 13:48:02 -07:00
2011-03-02 11:43:50 -08:00
2015-12-04 09:39:20 -08:00
2014-07-28 14:29:58 -07:00
2013-11-04 10:55:25 -08:00
2015-09-04 16:08:14 -07:00
2013-12-18 16:46:35 -08:00
2011-02-10 09:27:21 -08:00
2013-11-04 10:55:25 -08:00
2015-09-19 14:04:14 -07:00
2014-08-11 16:11:43 -07:00
2015-06-09 13:48:02 -07:00
2013-11-04 10:55:25 -08:00
2013-11-05 12:14:56 -08:00
2015-12-18 13:27:12 -08:00
2015-09-03 14:14:55 -07:00