From nobody Thu Aug 10 08:35:15 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4RM0c34lFPz4TnY6; Thu, 10 Aug 2023 08:35:15 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RM0c34F4Kz4VG1; Thu, 10 Aug 2023 08:35:15 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1691656515; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cxGAU0Qnwd+XPvtCS5n361QEN9zJZYU6BPHj31BhKl0=; b=ssP0cs05sgOSFZ9TqCmLH+LBktwS8f4X7lchZsqAhnLTs3NgUGIVtlzX27ZHmNeLm2BNoC dmBYL+NAGe7MvIYO0AU7wOdvA/ftfB9JG5kDdqgJEkcDO6WzajtGvzAG84TPM+bJNWkIBH gI0qF1/GlzwPCLPYWQohlwXEQ8KyFaBxmo9TBXN+9USt1AmNKOfAsEX945KHrs++MEeIat QzvnZ2+3QNHB0ptixou6v2b662vZpbF5KCWdk1751AkH3UyLCErl3RPUrod5r8g87r+fFh iOC8fmtMCUuNdlNPnrQxk9tXZ1//mvcTp/bF2jcFkdQc51fC/rs0EnpovTSIig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1691656515; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cxGAU0Qnwd+XPvtCS5n361QEN9zJZYU6BPHj31BhKl0=; b=Zf+CH+DBdLdX81yqqn28I42UxYhYzKx3vAFe7FMnxUubiRb3tzSWIG+3iHQEKGjjnHVjSS CnucL095Nm9AEXdLSGn43Rm8VHgDj8XY7+B/KWcfr3khgQQnbF8DjMZVb43Ub35ambG1G6 DIR4bjvNjH04r9Y7r9J3YWNULwyNzrPQYUkkmTdp1q5hisZ/UQYoKJc6F0PRSwEi4DPIEq 0qgcrCbhrosuOSD0pVjc+hdg8HmPAfC95KAi6ezg+gSvbCmyKsoJfqJ9ynWDKnE6ZuIqvK gaov/p3u/mlCyBv/klWR40F2H9WHAaTPD2tB+ezB+eS93AFA5mhUkateyIeesQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1691656515; a=rsa-sha256; cv=none; b=yRCeJOQ7iPeM29ZiVFYQi8g3wLFsF4iuYSC7uMsCfhI6JByVggliBXw4oVyNK9IkrWmGQd ZP9GsSMn3SIi282Hg7T8BvjFdFvRSIgFwTt9CKkqzbWkapP61fCHsTIx1ZkW+es1sWk92l 0Acq+rZ3tn4uGVXWnTesMkDu4U8mtZBdvrENyCR8IaEaN62tPXtI8JLFLSq95UTcoDPdQq AZwf4GYrSG5JhHiLvBmIbyl+BVCkc2exdyK4/OI8f6sZSk8EvzVm5blqur7zYJOTofDvJF eqR9TV0zvaYu4Xzf4pvUFZNJzCYuqFOPE6n4Kc9gDdGKOjpHQ6xp6IkHGMhMOQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4RM0c33HBpzqky; Thu, 10 Aug 2023 08:35:15 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 37A8ZFpa042545; Thu, 10 Aug 2023 08:35:15 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 37A8ZFgc042543; Thu, 10 Aug 2023 08:35:15 GMT (envelope-from git) Date: Thu, 10 Aug 2023 08:35:15 GMT Message-Id: <202308100835.37A8ZFgc042543@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Martin Matuska Subject: git: cd25b0f740f8 - main - zfs: cherry-pick fix from openzfs List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mm X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: cd25b0f740f8c846562fd66e7380437eb898c875 Auto-Submitted: auto-generated The branch main has been updated by mm: URL: https://cgit.FreeBSD.org/src/commit/?id=cd25b0f740f8c846562fd66e7380437eb898c875 commit cd25b0f740f8c846562fd66e7380437eb898c875 Author: Martin Matuska AuthorDate: 2023-08-10 07:55:42 +0000 Commit: Martin Matuska CommitDate: 2023-08-10 07:56:53 +0000 zfs: cherry-pick fix from openzfs Vendor PR: #15080 ZIL: Fix config lock deadlock Obtained from: OpenZFS OpenZFS commit: 2cb992a99ccadb78d97049b40bd442eb4fdc549d Note: full vendor imports will continue when stable/14 has been branched --- sys/contrib/openzfs/module/zfs/zil.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/sys/contrib/openzfs/module/zfs/zil.c b/sys/contrib/openzfs/module/zfs/zil.c index 00d66a2481d7..af7137faaccf 100644 --- a/sys/contrib/openzfs/module/zfs/zil.c +++ b/sys/contrib/openzfs/module/zfs/zil.c @@ -151,6 +151,7 @@ static kmem_cache_t *zil_lwb_cache; static kmem_cache_t *zil_zcw_cache; static void zil_lwb_commit(zilog_t *zilog, lwb_t *lwb, itx_t *itx); +static void zil_lwb_write_issue(zilog_t *zilog, lwb_t *lwb); static itx_t *zil_itx_clone(itx_t *oitx); static int @@ -1768,7 +1769,7 @@ static uint_t zil_maxblocksize = SPA_OLD_MAXBLOCKSIZE; * Has to be called under zl_issuer_lock to chain more lwbs. */ static lwb_t * -zil_lwb_write_close(zilog_t *zilog, lwb_t *lwb) +zil_lwb_write_close(zilog_t *zilog, lwb_t *lwb, list_t *ilwbs) { lwb_t *nlwb = NULL; zil_chain_t *zilc; @@ -1870,6 +1871,27 @@ zil_lwb_write_close(zilog_t *zilog, lwb_t *lwb) dmu_tx_commit(tx); + /* + * We need to acquire the config lock for the lwb to issue it later. + * However, if we already have a queue of closed parent lwbs already + * holding the config lock (but not yet issued), we can't block here + * waiting on the lock or we will deadlock. In that case we must + * first issue to parent IOs before waiting on the lock. + */ + if (ilwbs && !list_is_empty(ilwbs)) { + if (!spa_config_tryenter(spa, SCL_STATE, lwb, RW_READER)) { + lwb_t *tlwb; + while ((tlwb = list_remove_head(ilwbs)) != NULL) + zil_lwb_write_issue(zilog, tlwb); + spa_config_enter(spa, SCL_STATE, lwb, RW_READER); + } + } else { + spa_config_enter(spa, SCL_STATE, lwb, RW_READER); + } + + if (ilwbs) + list_insert_tail(ilwbs, lwb); + /* * If there was an allocation failure then nlwb will be null which * forces a txg_wait_synced(). @@ -1933,7 +1955,7 @@ zil_lwb_write_issue(zilog_t *zilog, lwb_t *lwb) ZIL_STAT_INCR(zilog, zil_itx_metaslab_normal_alloc, BP_GET_LSIZE(&lwb->lwb_blk)); } - spa_config_enter(zilog->zl_spa, SCL_STATE, lwb, RW_READER); + ASSERT(spa_config_held(zilog->zl_spa, SCL_STATE, RW_READER)); zil_lwb_add_block(lwb, &lwb->lwb_blk); lwb->lwb_issued_timestamp = gethrtime(); zio_nowait(lwb->lwb_root_zio); @@ -2037,8 +2059,7 @@ cont: lwb_sp < zil_max_waste_space(zilog) && (dlen % max_log_data == 0 || lwb_sp < reclen + dlen % max_log_data))) { - list_insert_tail(ilwbs, lwb); - lwb = zil_lwb_write_close(zilog, lwb); + lwb = zil_lwb_write_close(zilog, lwb, ilwbs); if (lwb == NULL) return (NULL); zil_lwb_write_open(zilog, lwb); @@ -2937,8 +2958,7 @@ zil_process_commit_list(zilog_t *zilog, zil_commit_waiter_t *zcw, list_t *ilwbs) zfs_commit_timeout_pct / 100; if (sleep < zil_min_commit_timeout || lwb->lwb_sz - lwb->lwb_nused < lwb->lwb_sz / 8) { - list_insert_tail(ilwbs, lwb); - lwb = zil_lwb_write_close(zilog, lwb); + lwb = zil_lwb_write_close(zilog, lwb, ilwbs); zilog->zl_cur_used = 0; if (lwb == NULL) { while ((lwb = list_remove_head(ilwbs)) @@ -3096,7 +3116,7 @@ zil_commit_waiter_timeout(zilog_t *zilog, zil_commit_waiter_t *zcw) * since we've reached the commit waiter's timeout and it still * hasn't been issued. */ - lwb_t *nlwb = zil_lwb_write_close(zilog, lwb); + lwb_t *nlwb = zil_lwb_write_close(zilog, lwb, NULL); ASSERT3S(lwb->lwb_state, !=, LWB_STATE_OPENED);