From owner-dev-commits-src-branches@freebsd.org  Thu Feb  4 22:35:01 2021
Return-Path: <owner-dev-commits-src-branches@freebsd.org>
Delivered-To: dev-commits-src-branches@mailman.nyi.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1])
 by mailman.nyi.freebsd.org (Postfix) with ESMTP id 28571531332;
 Thu,  4 Feb 2021 22:35:01 +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 4DWtfD0lmlz3GsS;
 Thu,  4 Feb 2021 22:35:00 +0000 (UTC) (envelope-from git@FreeBSD.org)
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 B3ED913E23;
 Thu,  4 Feb 2021 22:34:57 +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 114MYvI9007573;
 Thu, 4 Feb 2021 22:34:57 GMT (envelope-from git@gitrepo.freebsd.org)
Received: (from git@localhost)
 by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 114MYvk4007572;
 Thu, 4 Feb 2021 22:34:57 GMT (envelope-from git)
Date: Thu, 4 Feb 2021 22:34:57 GMT
Message-Id: <202102042234.114MYvk4007572@gitrepo.freebsd.org>
To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org,
 dev-commits-src-branches@FreeBSD.org
From: "Alexander V. Chernikov" <melifaro@FreeBSD.org>
Subject: git: 2a3cbb6c8954 - stable/13 - MFC dd9163003cb1: Add
 rib_subscribe_locked() and rib_unsubsribe_locked() to support subscriptions
 during RIB modifications. Add new subscriptions to the beginning of the lists
 instead of the end. This fixes the situation when new subscription is created
 int the callback for the existing subscription,
 leading to the  subscription notification handler pick it.
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Git-Committer: melifaro
X-Git-Repository: src
X-Git-Refname: refs/heads/stable/13
X-Git-Reftype: branch
X-Git-Commit: 2a3cbb6c8954b71ee5bcd49cd2d05e41b960975d
Auto-Submitted: auto-generated
X-BeenThere: dev-commits-src-branches@freebsd.org
X-Mailman-Version: 2.1.34
Precedence: list
List-Id: Commits to the stable branches of the FreeBSD src repository
 <dev-commits-src-branches.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/dev-commits-src-branches>, 
 <mailto:dev-commits-src-branches-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/dev-commits-src-branches/>
List-Post: <mailto:dev-commits-src-branches@freebsd.org>
List-Help: <mailto:dev-commits-src-branches-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/dev-commits-src-branches>, 
 <mailto:dev-commits-src-branches-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 04 Feb 2021 22:35:01 -0000

The branch stable/13 has been updated by melifaro:

URL: https://cgit.FreeBSD.org/src/commit/?id=2a3cbb6c8954b71ee5bcd49cd2d05e41b960975d

commit 2a3cbb6c8954b71ee5bcd49cd2d05e41b960975d
Author:     Alexander V. Chernikov <melifaro@FreeBSD.org>
AuthorDate: 2021-01-30 21:52:44 +0000
Commit:     Alexander V. Chernikov <melifaro@FreeBSD.org>
CommitDate: 2021-02-04 22:34:15 +0000

    MFC dd9163003cb1: Add rib_subscribe_locked() and rib_unsubsribe_locked()
     to support subscriptions during RIB modifications.
    Add new subscriptions to the beginning of the lists instead of
     the end. This fixes the situation when new subscription is created
     int the callback for the existing subscription, leading to the
     subscription notification handler pick it.
---
 sys/net/route/route_ctl.c | 34 +++++++++++++++++++++++++++++++++-
 sys/net/route/route_ctl.h |  3 +++
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/sys/net/route/route_ctl.c b/sys/net/route/route_ctl.c
index 955b1df9029f..6b0869196d12 100644
--- a/sys/net/route/route_ctl.c
+++ b/sys/net/route/route_ctl.c
@@ -1407,13 +1407,31 @@ rib_subscribe_internal(struct rib_head *rnh, rib_subscription_cb_t *f, void *arg
 
 	NET_EPOCH_ENTER(et);
 	RIB_WLOCK(rnh);
-	CK_STAILQ_INSERT_TAIL(&rnh->rnh_subscribers, rs, next);
+	CK_STAILQ_INSERT_HEAD(&rnh->rnh_subscribers, rs, next);
 	RIB_WUNLOCK(rnh);
 	NET_EPOCH_EXIT(et);
 
 	return (rs);
 }
 
+struct rib_subscription *
+rib_subscribe_locked(struct rib_head *rnh, rib_subscription_cb_t *f, void *arg,
+    enum rib_subscription_type type)
+{
+	struct rib_subscription *rs;
+
+	NET_EPOCH_ASSERT();
+	RIB_WLOCK_ASSERT(rnh);
+
+	if ((rs = allocate_subscription(f, arg, type, false)) == NULL)
+		return (NULL);
+	rs->rnh = rnh;
+
+	CK_STAILQ_INSERT_HEAD(&rnh->rnh_subscribers, rs, next);
+
+	return (rs);
+}
+
 /*
  * Remove rtable subscription @rs from the routing table.
  * Needs to be run in network epoch.
@@ -1433,6 +1451,20 @@ rib_unsibscribe(struct rib_subscription *rs)
 	    &rs->epoch_ctx);
 }
 
+void
+rib_unsibscribe_locked(struct rib_subscription *rs)
+{
+	struct rib_head *rnh = rs->rnh;
+
+	NET_EPOCH_ASSERT();
+	RIB_WLOCK_ASSERT(rnh);
+
+	CK_STAILQ_REMOVE(&rnh->rnh_subscribers, rs, rib_subscription, next);
+
+	epoch_call(net_epoch_preempt, destroy_subscription_epoch,
+	    &rs->epoch_ctx);
+}
+
 /*
  * Epoch callback indicating subscription is safe to destroy
  */
diff --git a/sys/net/route/route_ctl.h b/sys/net/route/route_ctl.h
index ecbc9ee91dc0..bd256e9f0834 100644
--- a/sys/net/route/route_ctl.h
+++ b/sys/net/route/route_ctl.h
@@ -144,6 +144,9 @@ struct rib_subscription *rib_subscribe(uint32_t fibnum, int family,
 struct rib_subscription *rib_subscribe_internal(struct rib_head *rnh,
     rib_subscription_cb_t *f, void *arg, enum rib_subscription_type type,
     bool waitok);
+struct rib_subscription *rib_subscribe_locked(struct rib_head *rnh,
+    rib_subscription_cb_t *f, void *arg, enum rib_subscription_type type);
 void rib_unsibscribe(struct rib_subscription *rs);
+void rib_unsibscribe_locked(struct rib_subscription *rs);
 
 #endif