From nobody Mon Mar 20 16:39:31 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 4PgL6q5PM1z3yxJ3; Mon, 20 Mar 2023 16:39:31 +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 4PgL6q4wX2z4B6y; Mon, 20 Mar 2023 16:39:31 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1679330371; 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=8SiIJ1aqXIIVxzx5xwOlm840LfnEOoX008JAtqDKgtk=; b=dngvtcXjTy0pDLLAtzkAbzU5Fp/RvPrz7wFyGNPFCCACA+UVdsW9/dngVHLxYkgTHzsS+E cab4InPAf+GATlABAzFOlIYoIZcbqpDX0gXYVHApW1SYS0gYAQJXQUq6wS70D0Dgo5I9a4 ZvbMIbTppCD4aKsP3/Y61u7NYArO9G7I/UFNJItRIp12akzzx/ux5kD2HE+5nAaIgSA1ET sEFkN/y997/v4C+xFEHHVpoge/DekhGMT5y4fSm1ylhLv8LXe/SlslNRPz6AfzJ++BVycW Xgj5lPt5QD3TcmGGRoCwROoQ29MM5CiC5cUzbNDniLoF9Igs5cT/ZXNGQhEVew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1679330371; 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=8SiIJ1aqXIIVxzx5xwOlm840LfnEOoX008JAtqDKgtk=; b=gQDQTrgeETjKsB1KLp/JmkXpmt0pU0Ocy2P1lE3+S/Y73VxhNwlduPhPzvyPPgaUh9yIox Q49J1286Iyu9LmlIVx11R4lRhLc63uRedUc/f2OKcOnGN2cI6iw1IPSpgzuRHFxUHGfctu LfuZrz9AkOSN7ChTS1yp4UrRI8qTCxM2cK9XK9E6Kokc41i3IZkeBEjZO6GjG+O4wfcZ4v 4j/JvK6Cs7cfvzdHeayP0cxkdjTf/WjbVpSTU3LwZZurQzDE01uh2WNcS+MgDQ3D0mc5d1 stTIwWI2zGoaDGpWypr/igDMYlAmy90luIt2RObKJ2YGXMpVWg70o7474g4kuw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1679330371; a=rsa-sha256; cv=none; b=t6tcBIHvxETDMES/3qRGjx67713beGCFEh/Q0nxDL+LZUlv7ybbR6DzSfshaXHf3k2ESdb H1GM3vCe6WwUYV/8xOFj+ymrEq10PVlJgnJwhle7qF51CIkzy4Y8hIGRIKSaWZnthK3+2j KieGO+YHgKwyJ9tM1Q6wr5ssnueD80KSw76DMP5ZcZsX6HquOCidWPVVS+0bd3PTxMkFUc 3rA2tB1kTnNI+eNly+06yFxTvB21iGtpFl7dIW5IDXgftTgGcQSLo93VnNatIxcSpr0ttp rpZWEgboXOLckDqy5aZJRZP6aijPXKY1EUr7aNw+kNAWOjQbcJZGZSKaWW7lGQ== 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 4PgL6q3qByzcXF; Mon, 20 Mar 2023 16:39:31 +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 32KGdVgg071214; Mon, 20 Mar 2023 16:39:31 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 32KGdVl5071213; Mon, 20 Mar 2023 16:39:31 GMT (envelope-from git) Date: Mon, 20 Mar 2023 16:39:31 GMT Message-Id: <202303201639.32KGdVl5071213@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kristof Provost Subject: git: 53247cdf1244 - main - 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/main X-Git-Reftype: branch X-Git-Commit: 53247cdf12449e90f6736ae563e4cce8315c923f Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kp: URL: https://cgit.FreeBSD.org/src/commit/?id=53247cdf12449e90f6736ae563e4cce8315c923f commit 53247cdf12449e90f6736ae563e4cce8315c923f Author: Kristof Provost AuthorDate: 2023-03-20 13:29:55 +0000 Commit: Kristof Provost CommitDate: 2023-03-20 15:39:14 +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) --- 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 4c834c7f0315..ae3a2e46e26b 100644 --- a/sys/netpfil/pf/if_pfsync.c +++ b/sys/netpfil/pf/if_pfsync.c @@ -297,6 +297,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);