From owner-cvs-src-old@FreeBSD.ORG Thu May 7 20:28:09 2009 Return-Path: Delivered-To: cvs-src-old@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 94E7E106564A for ; Thu, 7 May 2009 20:28:09 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 65DAD8FC1F for ; Thu, 7 May 2009 20:28:09 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n47KS9J8081255 for ; Thu, 7 May 2009 20:28:09 GMT (envelope-from kmacy@repoman.freebsd.org) Received: (from svn2cvs@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n47KS9dj081254 for cvs-src-old@freebsd.org; Thu, 7 May 2009 20:28:09 GMT (envelope-from kmacy@repoman.freebsd.org) Message-Id: <200905072028.n47KS9dj081254@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: svn2cvs set sender to kmacy@repoman.freebsd.org using -f From: Kip Macy Date: Thu, 7 May 2009 20:28:06 +0000 (UTC) To: cvs-src-old@freebsd.org X-FreeBSD-CVS-Branch: HEAD Subject: cvs commit: src/sys/cddl/contrib/opensolaris/uts/common/fs vnode.c src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs dmu.c zfs_vnops.c zil.c src/sys/cddl/contrib/opensolaris/uts/common/sys vnode.h X-BeenThere: cvs-src-old@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: **OBSOLETE** CVS commit messages for the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 May 2009 20:28:09 -0000 kmacy 2009-05-07 20:28:06 UTC FreeBSD src repository Modified files: sys/cddl/contrib/opensolaris/uts/common/fs vnode.c sys/cddl/contrib/opensolaris/uts/common/fs/zfs dmu.c zfs_vnops.c zil.c sys/cddl/contrib/opensolaris/uts/common/sys vnode.h Log: SVN rev 191900 on 2009-05-07 20:28:06Z by kmacy Asynchronously release vnodes to avoid blocking on range locks when calling back in to zfs. This is based on a fix that went in to opensolaris on March 9th. However, it uses a dedicated thread instead of a Solaris' taskq to avoid doing a blocking memory allocation with the vnode interlock held. This fixes a long-time deadlock in ZFS. This is not, strictly speaking, an LOR. The spa_zio thread releases a vnode, this calls in to vn_reclaim which in turn needs to acquire range locks to sync dirty data out to disk. The range locks are already held by a user-level process waiting on a condition variable that it the process is waiting on a spa_zio thread to signal it on. The process could not be signalled because the spa_zio thread could not proceed. The nature of this problem was not apparent due to ZFS locks opting out of witness which meant that DDB did not know about the locks that were held by ZFS. Reviewed by: pjd MFC after: 7 days Revision Changes Path 1.2 +137 -0 src/sys/cddl/contrib/opensolaris/uts/common/fs/vnode.c 1.4 +1 -0 src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c 1.40 +17 -3 src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c 1.6 +1 -1 src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c 1.2 +9 -0 src/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h