From nobody Mon Mar 27 08:16:36 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 4PlQdK0KClz41wlP; Mon, 27 Mar 2023 08:16:37 +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 4PlQdJ6jSCz4BHL; Mon, 27 Mar 2023 08:16:36 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1679904996; 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=wd8OIQuRX7OJSQzkkERq7BeYv52h+jONZfF2ny27Uog=; b=oEs545sC+CWoeDVaG08d3qVbIGdU/Eh+bqSLwvpAISzbJs671ClkROPUPWHeQAMLS007G+ i0ix+1oF8eJcl7Rz86fdUMJndyG0iNImhC40xw05m1G/elcWJa/fDB/+zcs2RKHlfDgdMW GjutA6/Jytb9qpNRwSNhL1L2LDBk28W8eOm7OEvkDqUZ5qEByLwTF6vHIdMSIahSUROMp6 5paqt+Uoef6M3UCAyrIs3gi9A3HDyP1hkeJeDLcmSLcD6NMPC6FGmkKKMFV+TQud00I+jh DIy4LR0wG1jPy/XkMC8U3Dmuo496v0BijvIeaMDXckCbPrG9xnaATuYiH0Ztng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1679904996; 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=wd8OIQuRX7OJSQzkkERq7BeYv52h+jONZfF2ny27Uog=; b=oBjPwW/ET+j8hd7srEv9xmG5bPpcwX+dXwjZCXjQrUzXe9TJzHOxU1z8oQ3s/o4ubXnxdS fSXtwLjMnhzs6uZi3hixPeWxVErDJz26sPLpJB2+IkWi55WQMoenSf87pHDMa/DLJAYDzQ mlj9FiujOSNZnFYzdJl3rmT/fLT14DyVckd3XIwKUadNfEE0OcDo0pAzFafz2hdQmFgEdU tsz1GU5pACuo2JGUmKwVkDvFbtv4OV6blZFd3WCT9vGkTmbPjqSW75vcGvxev3U9M8TshU agCpDZhrzniyA8cmLPkRorvFqKCvonksxa4xMfyoANQPveEs/sW/tcl7qzcLyg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1679904996; a=rsa-sha256; cv=none; b=N7bQG+aSjXfeugw53PGMUscqiTX5nbh/KI7naw7RAr7zXbV1JPmaay5KsXnlOFeIlpk71y jQGt/c5vUeQ2+oZxmMgYGUiK19WULA32o1XbWV9MZ9xKbUWkn7zEbTawljGli0V52vTKSh UP5gr4+aHLRgrYZtSi1GYAtj1OfzakM9NqNXK06wFRN/pap0cv/2HMpEzbopImO1nvw5PW LbuSj7mwDBUYO4GQhaAC+RUzkE/PXJvA58nGnOLGi81du6yfTibzft8qFHEwwVsVFQ4jfN cD6bIMRYl3ATxjK+N2AOfsT8H8qDoLJdH/Pi+dK+dgznEucEmqu2tX5TyMtMfg== 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 4PlQdJ5kZVzFNW; Mon, 27 Mar 2023 08:16:36 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 32R8Gaic045539; Mon, 27 Mar 2023 08:16:36 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 32R8GaRs045538; Mon, 27 Mar 2023 08:16:36 GMT (envelope-from git) Date: Mon, 27 Mar 2023 08:16:36 GMT Message-Id: <202303270816.32R8GaRs045538@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kristof Provost Subject: git: 44af4103e422 - stable/13 - pfsync: fix pfsync_undefer_state() locking 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: kp X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 44af4103e422029026e9bb1a5784550365831cf3 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by kp: URL: https://cgit.FreeBSD.org/src/commit/?id=44af4103e422029026e9bb1a5784550365831cf3 commit 44af4103e422029026e9bb1a5784550365831cf3 Author: Kristof Provost AuthorDate: 2023-03-20 13:29:55 +0000 Commit: Kristof Provost CommitDate: 2023-03-27 08:16:03 +0000 pfsync: fix pfsync_undefer_state() locking pfsync_undefer_state() takes the bucket lock, but could get called from places (e.g. from pfsync_update_state() or pfsync_delete_state()) where we already held the lock. As it can also be called from places where we don't yet hold the lock create new locked variant for use when the lock is already held. Keep using pfsync_undefer_state() where the lock must still be taken. PR: 268246 MFC after: 1 week Sponsored by: Rubicon Communications, LLC (Netgate) (cherry picked from commit 53247cdf12449e90f6736ae563e4cce8315c923f) --- sys/netpfil/pf/if_pfsync.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/sys/netpfil/pf/if_pfsync.c b/sys/netpfil/pf/if_pfsync.c index 610252a9fdf3..3b3d263fcf8b 100644 --- a/sys/netpfil/pf/if_pfsync.c +++ b/sys/netpfil/pf/if_pfsync.c @@ -296,6 +296,7 @@ static int pfsyncioctl(struct ifnet *, u_long, caddr_t); static int pfsync_defer(struct pf_kstate *, struct mbuf *); static void pfsync_undefer(struct pfsync_deferral *, int); +static void pfsync_undefer_state_locked(struct pf_kstate *, int); static void pfsync_undefer_state(struct pf_kstate *, int); static void pfsync_defer_tmo(void *); @@ -1851,28 +1852,37 @@ pfsync_defer_tmo(void *arg) } static void -pfsync_undefer_state(struct pf_kstate *st, int drop) +pfsync_undefer_state_locked(struct pf_kstate *st, int drop) { struct pfsync_softc *sc = V_pfsyncif; struct pfsync_deferral *pd; struct pfsync_bucket *b = pfsync_get_bucket(sc, st); - PFSYNC_BUCKET_LOCK(b); + PFSYNC_BUCKET_LOCK_ASSERT(b); TAILQ_FOREACH(pd, &b->b_deferrals, pd_entry) { if (pd->pd_st == st) { if (callout_stop(&pd->pd_tmo) > 0) pfsync_undefer(pd, drop); - PFSYNC_BUCKET_UNLOCK(b); return; } } - PFSYNC_BUCKET_UNLOCK(b); panic("%s: unable to find deferred state", __func__); } +static void +pfsync_undefer_state(struct pf_kstate *st, int drop) +{ + struct pfsync_softc *sc = V_pfsyncif; + struct pfsync_bucket *b = pfsync_get_bucket(sc, st); + + PFSYNC_BUCKET_LOCK(b); + pfsync_undefer_state_locked(st, drop); + PFSYNC_BUCKET_UNLOCK(b); +} + static struct pfsync_bucket* pfsync_get_bucket(struct pfsync_softc *sc, struct pf_kstate *st) { @@ -1891,7 +1901,7 @@ pfsync_update_state(struct pf_kstate *st) PFSYNC_BUCKET_LOCK(b); if (st->state_flags & PFSTATE_ACK) - pfsync_undefer_state(st, 0); + pfsync_undefer_state_locked(st, 0); if (st->state_flags & PFSTATE_NOSYNC) { if (st->sync_state != PFSYNC_S_NONE) pfsync_q_del(st, true, b); @@ -2034,7 +2044,7 @@ pfsync_delete_state(struct pf_kstate *st) PFSYNC_BUCKET_LOCK(b); if (st->state_flags & PFSTATE_ACK) - pfsync_undefer_state(st, 1); + pfsync_undefer_state_locked(st, 1); if (st->state_flags & PFSTATE_NOSYNC) { if (st->sync_state != PFSYNC_S_NONE) pfsync_q_del(st, true, b);