git: ab6d9aaed76e - main - Move business logic from rebuild_fd_callout() into rebuild_fd().

Alexander V. Chernikov melifaro at FreeBSD.org
Sat Jan 30 23:28:08 UTC 2021


The branch main has been updated by melifaro:

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

commit ab6d9aaed76ed9f86fd0d938ebb6ea81f5ad6a82
Author:     Alexander V. Chernikov <melifaro at FreeBSD.org>
AuthorDate: 2021-01-30 22:32:42 +0000
Commit:     Alexander V. Chernikov <melifaro at FreeBSD.org>
CommitDate: 2021-01-30 23:25:57 +0000

    Move business logic from rebuild_fd_callout() into rebuild_fd().
    
    This simplifies code a bit and allows for future non-callout
     callers to request rebuild.
    
    MFC after:      3 days
---
 sys/net/route/fib_algo.c | 40 +++++++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/sys/net/route/fib_algo.c b/sys/net/route/fib_algo.c
index 1f040ad259c5..f7a8b3f82431 100644
--- a/sys/net/route/fib_algo.c
+++ b/sys/net/route/fib_algo.c
@@ -155,6 +155,7 @@ struct fib_data {
 	TAILQ_ENTRY(fib_data)	entries;	/* list of all fds in vnet */
 };
 
+static bool rebuild_fd(struct fib_data *fd);
 static void rebuild_fd_callout(void *_data);
 static void destroy_fd_instance_epoch(epoch_context_t ctx);
 static enum flm_op_result attach_datapath(struct fib_data *fd);
@@ -1011,13 +1012,28 @@ setup_fd_instance(struct fib_lookup_module *flm, struct rib_head *rh,
 static void
 rebuild_fd_callout(void *_data)
 {
-	struct fib_data *fd, *fd_new, *fd_tmp;
+	struct fib_data *fd = (struct fib_data *)_data;
+
+	FD_PRINTF(LOG_INFO, fd, "running callout rebuild");
+
+	CURVNET_SET(fd->fd_vnet);
+	rebuild_fd(fd);
+	CURVNET_RESTORE();
+}
+
+/*
+ * Tries to create new algo instance based on @fd data.
+ * Returns true on success.
+ */
+static bool
+rebuild_fd(struct fib_data *fd)
+{
+	struct fib_data *fd_new, *fd_tmp;
 	struct fib_lookup_module *flm_new = NULL;
 	struct epoch_tracker et;
 	enum flm_op_result result;
 	bool need_rebuild = false;
 
-	fd = (struct fib_data *)_data;
 
 	FIB_MOD_LOCK();
 	need_rebuild = fd->fd_need_rebuild;
@@ -1026,15 +1042,12 @@ rebuild_fd_callout(void *_data)
 	fd->fd_num_changes = 0;
 	FIB_MOD_UNLOCK();
 
-	CURVNET_SET(fd->fd_vnet);
-
 	/* First, check if we're still OK to use this algo */
 	if (!is_algo_fixed(fd->fd_rh))
 		flm_new = fib_check_best_algo(fd->fd_rh, fd->fd_flm);
 	if ((flm_new == NULL) && (!need_rebuild)) {
 		/* Keep existing algo, no need to rebuild. */
-		CURVNET_RESTORE();
-		return;
+		return (true);
 	}
 
 	if (flm_new == NULL) {
@@ -1051,19 +1064,16 @@ rebuild_fd_callout(void *_data)
 	}
 	if (result != FLM_SUCCESS) {
 		FD_PRINTF(LOG_NOTICE, fd, "table rebuild failed");
-		CURVNET_RESTORE();
-		return;
+		return (false);
 	}
 	FD_PRINTF(LOG_INFO, fd_new, "switched to new instance");
 
-	/* Remove old instance removal */
-	if (fd != NULL) {
-		NET_EPOCH_ENTER(et);
-		schedule_destroy_fd_instance(fd, true);
-		NET_EPOCH_EXIT(et);
-	}
+	/* Remove old instance */
+	NET_EPOCH_ENTER(et);
+	schedule_destroy_fd_instance(fd, true);
+	NET_EPOCH_EXIT(et);
 
-	CURVNET_RESTORE();
+	return (true);
 }
 
 /*


More information about the dev-commits-src-all mailing list