]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
MFC r339299: Pull in a follow-on commit to resolve a deadlock in ZFS
authormav <mav@FreeBSD.org>
Tue, 12 Mar 2019 16:46:34 +0000 (16:46 +0000)
committermav <mav@FreeBSD.org>
Tue, 12 Mar 2019 16:46:34 +0000 (16:46 +0000)
commit4c0a72f14452f163891b74a31d221bceb4672ed7
treeeda4dd1bfbb5ca7bede80dc6d1b638227250c2d0
parent97b398a5915d56e3cf9a02ff03fd72a508444ee9
MFC r339299: Pull in a follow-on commit to resolve a deadlock in ZFS
sequential resilver (r334844)

MFV/ZoL: Fix deadlock in IO pipeline

commit a76f3d0437e5e974f0f748f8735af3539443b388
Author: Brian Behlendorf <behlendorf1@llnl.gov>
Date:   Fri Mar 16 16:46:06 2018 -0700

    Fix deadlock in IO pipeline

    In vdev_queue_aggregate() the zio_execute() bypass should not be
    called under the vdev queue lock.  This can result in a deadlock
    as shown in the stack traces below.

    Drop the vdev queue lock then walk the parents of the aggregate IO
    to determine the list of component IOs to be bypassed.  This can
    be done safely without holding the io_lock since the new aggregate
    IO has not yet been returned and its parents cannot change.

    ---  THREAD 1 ---
    arc_read()
      zio_nowait()
        zio_vdev_io_start()
          vdev_queue_io() <--- mutex_enter(vq->vq_lock)
            vdev_queue_io_to_issue()
              vdev_queue_aggregate()
                zio_execute()
            vdev_queue_io_to_issue()
              vdev_queue_aggregate()
                zio_execute()
                  zio_vdev_io_assess()
                    zio_wait_for_children() <- mutex_enter(zio->io_lock)

    --- THREAD 2 --- (inverse order)
    arc_read()
      zio_change_priority() <- mutex_enter(zio->zio_lock)
        vdev_queue_change_io_priority() <- mutex_enter(vq->vq_lock)

Reviewed-by: Tom Caputi <tcaputi@datto.com>
Reviewed-by: Don Brady <don.brady@delphix.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c