svn commit: r333697 - in head/sys: kern sys

Matt Macy mmacy at FreeBSD.org
Thu May 17 01:13:42 UTC 2018


Author: mmacy
Date: Thu May 17 01:13:40 2018
New Revision: 333697
URL: https://svnweb.freebsd.org/changeset/base/333697

Log:
  epoch(9): make recursion lighter weight
  
  There isn't any real work to do except bump td_epochnest when recursing.
  Skip the additional work in this case.
  
  Approved by:	sbruno

Modified:
  head/sys/kern/subr_epoch.c
  head/sys/sys/epoch.h

Modified: head/sys/kern/subr_epoch.c
==============================================================================
--- head/sys/kern/subr_epoch.c	Thu May 17 00:52:48 2018	(r333696)
+++ head/sys/kern/subr_epoch.c	Thu May 17 01:13:40 2018	(r333697)
@@ -284,21 +284,15 @@ epoch_free(epoch_t epoch)
 	} while (0)
 
 void
-epoch_enter(epoch_t epoch)
+epoch_enter_internal(epoch_t epoch, struct thread *td)
 {
 	struct epoch_pcpu_state *eps;
-	struct thread *td;
 
 	INIT_CHECK(epoch);
-
-	td = curthread;
 	critical_enter();
 	eps = epoch->e_pcpu[curcpu];
-	td->td_epochnest++;
-	MPASS(td->td_epochnest < UCHAR_MAX - 2);
-	if (td->td_epochnest == 1)
-		TAILQ_INSERT_TAIL(&eps->eps_record.er_tdlist, td, td_epochq);
 #ifdef INVARIANTS
+	MPASS(td->td_epochnest < UCHAR_MAX - 2);
 	if (td->td_epochnest > 1) {
 		struct thread *curtd;
 		int found = 0;
@@ -307,38 +301,31 @@ epoch_enter(epoch_t epoch)
 			if (curtd == td)
 				found = 1;
 		KASSERT(found, ("recursing on a second epoch"));
-	}
-#endif
-	if (td->td_epochnest > 1) {
 		critical_exit();
 		return;
 	}
+#endif
+	TAILQ_INSERT_TAIL(&eps->eps_record.er_tdlist, td, td_epochq);
 	sched_pin();
 	ck_epoch_begin(&eps->eps_record.er_record, (ck_epoch_section_t*)&td->td_epoch_section);
 	critical_exit();
 }
 
 void
-epoch_exit(epoch_t epoch)
+epoch_exit_internal(epoch_t epoch, struct thread *td)
 {
 	struct epoch_pcpu_state *eps;
-	struct thread *td;
 
 	td = curthread;
+	MPASS(td->td_epochnest == 0);
 	INIT_CHECK(epoch);
-	MPASS(td->td_epochnest);
 	critical_enter();
 	eps = epoch->e_pcpu[curcpu];
-	td->td_epochnest--;
-	if (td->td_epochnest == 0)
-		TAILQ_REMOVE(&eps->eps_record.er_tdlist, td, td_epochq);
-	else {
-		critical_exit();
-		return;
-	}
-	sched_unpin();
+
 	ck_epoch_end(&eps->eps_record.er_record, (ck_epoch_section_t*)&td->td_epoch_section);
+	TAILQ_REMOVE(&eps->eps_record.er_tdlist, td, td_epochq);
 	eps->eps_record.er_gen++;
+	sched_unpin();
 	critical_exit();
 }
 

Modified: head/sys/sys/epoch.h
==============================================================================
--- head/sys/sys/epoch.h	Thu May 17 00:52:48 2018	(r333696)
+++ head/sys/sys/epoch.h	Thu May 17 01:13:40 2018	(r333697)
@@ -29,6 +29,8 @@
 
 #ifndef _SYS_EPOCH_H_
 #define _SYS_EPOCH_H_
+#include <sys/lock.h>
+#include <sys/proc.h>
 
 struct epoch;
 typedef struct epoch *epoch_t;
@@ -43,10 +45,35 @@ typedef struct epoch_context *epoch_context_t;
 
 epoch_t epoch_alloc(void);
 void epoch_free(epoch_t epoch);
-void epoch_enter(epoch_t epoch);
-void epoch_exit(epoch_t epoch);
+void epoch_enter_internal(epoch_t epoch, struct thread *td);
+void epoch_exit_internal(epoch_t epoch, struct thread *td);
 void epoch_wait(epoch_t epoch);
 void epoch_call(epoch_t epoch, epoch_context_t ctx, void (*callback) (epoch_context_t));
 int in_epoch(void);
+
+static __inline void
+epoch_enter(epoch_t epoch)
+{
+	struct thread *td;
+	int nesting;
+
+	td = curthread;
+	nesting = td->td_epochnest++;
+#ifndef INVARIANTS
+	if (nesting == 0)
+#endif
+		epoch_enter_internal(epoch, td);
+}
+
+static __inline void
+epoch_exit(epoch_t epoch)
+{
+	struct thread *td;
+
+	td = curthread;
+	MPASS(td->td_epochnest);
+	if (td->td_epochnest-- == 1)
+		epoch_exit_internal(epoch, td);
+}
 
 #endif


More information about the svn-src-all mailing list