Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 Jan 2021 23:28:09 GMT
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: dd9163003cb1 - main - 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.
Message-ID:  <202101302328.10UNS9J6074955@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by melifaro:

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

commit dd9163003cb1be494609d904521e8dae7737caa7
Author:     Alexander V. Chernikov <melifaro@FreeBSD.org>
AuthorDate: 2021-01-30 21:52:44 +0000
Commit:     Alexander V. Chernikov <melifaro@FreeBSD.org>
CommitDate: 2021-01-30 23:25:57 +0000

    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.
    
    MFC after: 3 days
---
 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 230d23845c64..c46d0430a164 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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101302328.10UNS9J6074955>