svn commit: r340415 - in head/sys: kern sys
Gleb Smirnoff
glebius at FreeBSD.org
Tue Nov 13 23:20:58 UTC 2018
Author: glebius
Date: Tue Nov 13 23:20:55 2018
New Revision: 340415
URL: https://svnweb.freebsd.org/changeset/base/340415
Log:
The dualism between epoch_tracker and epoch_thread is fragile and
unnecessary. So, expose CK types to kernel and use a single normal
structure for epoch_tracker.
Reviewed by: jtl, gallatin
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 Tue Nov 13 23:08:46 2018 (r340414)
+++ head/sys/kern/subr_epoch.c Tue Nov 13 23:20:55 2018 (r340415)
@@ -55,25 +55,13 @@ __FBSDID("$FreeBSD$");
static MALLOC_DEFINE(M_EPOCH, "epoch", "epoch based reclamation");
-typedef struct epoch_thread {
-#ifdef EPOCH_TRACKER_DEBUG
- uint64_t et_magic_pre;
-#endif
- TAILQ_ENTRY(epoch_thread) et_link; /* Epoch queue. */
- struct thread *et_td; /* pointer to thread in section */
- ck_epoch_section_t et_section; /* epoch section object */
-#ifdef EPOCH_TRACKER_DEBUG
- uint64_t et_magic_post;
-#endif
-} *epoch_thread_t;
-TAILQ_HEAD (epoch_tdlist, epoch_thread);
-
#ifdef __amd64__
#define EPOCH_ALIGN CACHE_LINE_SIZE*2
#else
#define EPOCH_ALIGN CACHE_LINE_SIZE
#endif
+TAILQ_HEAD (epoch_tdlist, epoch_tracker);
typedef struct epoch_record {
ck_epoch_record_t er_read_record;
ck_epoch_record_t er_write_record;
@@ -252,27 +240,25 @@ void
epoch_enter_preempt(epoch_t epoch, epoch_tracker_t et)
{
struct epoch_record *er;
- struct epoch_thread *etd;
struct thread_lite *td;
MPASS(cold || epoch != NULL);
INIT_CHECK(epoch);
- etd = (void *)et;
MPASS(epoch->e_flags & EPOCH_PREEMPT);
#ifdef EPOCH_TRACKER_DEBUG
- etd->et_magic_pre = EPOCH_MAGIC0;
- etd->et_magic_post = EPOCH_MAGIC1;
+ et->et_magic_pre = EPOCH_MAGIC0;
+ et->et_magic_post = EPOCH_MAGIC1;
#endif
td = (struct thread_lite *)curthread;
- etd->et_td = (void*)td;
+ et->et_td = (void*)td;
td->td_epochnest++;
critical_enter();
sched_pin_lite(td);
td->td_pre_epoch_prio = td->td_priority;
er = epoch_currecord(epoch);
- TAILQ_INSERT_TAIL(&er->er_tdlist, etd, et_link);
- ck_epoch_begin(&er->er_read_record, (ck_epoch_section_t *)&etd->et_section);
+ TAILQ_INSERT_TAIL(&er->er_tdlist, et, et_link);
+ ck_epoch_begin(&er->er_read_record, &et->et_section);
critical_exit();
}
@@ -296,7 +282,6 @@ void
epoch_exit_preempt(epoch_t epoch, epoch_tracker_t et)
{
struct epoch_record *er;
- struct epoch_thread *etd;
struct thread_lite *td;
INIT_CHECK(epoch);
@@ -307,19 +292,19 @@ epoch_exit_preempt(epoch_t epoch, epoch_tracker_t et)
td->td_epochnest--;
er = epoch_currecord(epoch);
MPASS(epoch->e_flags & EPOCH_PREEMPT);
- etd = (void *)et;
- MPASS(etd != NULL);
- MPASS(etd->et_td == (struct thread *)td);
+ MPASS(et != NULL);
+ MPASS(et->et_td == (struct thread *)td);
#ifdef EPOCH_TRACKER_DEBUG
- MPASS(etd->et_magic_pre == EPOCH_MAGIC0);
- MPASS(etd->et_magic_post == EPOCH_MAGIC1);
- etd->et_magic_pre = 0;
- etd->et_magic_post = 0;
+ MPASS(et->et_magic_pre == EPOCH_MAGIC0);
+ MPASS(et->et_magic_post == EPOCH_MAGIC1);
+ et->et_magic_pre = 0;
+ et->et_magic_post = 0;
#endif
- etd->et_td = (void*)0xDEADBEEF;
- ck_epoch_end(&er->er_read_record,
- (ck_epoch_section_t *)&etd->et_section);
- TAILQ_REMOVE(&er->er_tdlist, etd, et_link);
+#ifdef INVARIANTS
+ et->et_td = (void*)0xDEADBEEF;
+#endif
+ ck_epoch_end(&er->er_read_record, &et->et_section);
+ TAILQ_REMOVE(&er->er_tdlist, et, et_link);
er->er_gen++;
if (__predict_false(td->td_pre_epoch_prio != td->td_priority))
epoch_adjust_prio((struct thread *)td, td->td_pre_epoch_prio);
@@ -351,7 +336,7 @@ epoch_block_handler_preempt(struct ck_epoch *global __
{
epoch_record_t record;
struct thread *td, *owner, *curwaittd;
- struct epoch_thread *tdwait;
+ struct epoch_tracker *tdwait;
struct turnstile *ts;
struct lock_object *lock;
int spincount, gen;
@@ -633,7 +618,7 @@ epoch_call_task(void *arg __unused)
int
in_epoch_verbose(epoch_t epoch, int dump_onfail)
{
- struct epoch_thread *tdwait;
+ struct epoch_tracker *tdwait;
struct thread *td;
epoch_record_t er;
Modified: head/sys/sys/epoch.h
==============================================================================
--- head/sys/sys/epoch.h Tue Nov 13 23:08:46 2018 (r340414)
+++ head/sys/sys/epoch.h Tue Nov 13 23:20:55 2018 (r340415)
@@ -30,31 +30,16 @@
#ifndef _SYS_EPOCH_H_
#define _SYS_EPOCH_H_
-/*
- * XXXGL: temporarily keep epoch_tracker exposed to userland until
- * we remove trackers embedded into network structs.
- */
-
struct epoch_context {
void *data[2];
} __aligned(sizeof(void *));
typedef struct epoch_context *epoch_context_t;
-struct epoch_tracker {
- void *datap[3];
-#ifdef EPOCH_TRACKER_DEBUG
- int datai[5];
-#else
- int datai[1];
-#endif
-} __aligned(sizeof(void *));
-
-typedef struct epoch_tracker *epoch_tracker_t;
-
#ifdef _KERNEL
#include <sys/lock.h>
#include <sys/pcpu.h>
+#include <ck_epoch.h>
struct epoch;
typedef struct epoch *epoch_t;
@@ -64,6 +49,21 @@ typedef struct epoch *epoch_t;
extern epoch_t global_epoch;
extern epoch_t global_epoch_preempt;
+
+struct epoch_tracker {
+#ifdef EPOCH_TRACKER_DEBUG
+#define EPOCH_MAGIC0 0xFADECAFEF00DD00D
+#define EPOCH_MAGIC1 0xBADDBABEDEEDFEED
+ uint64_t et_magic_pre;
+#endif
+ TAILQ_ENTRY(epoch_tracker) et_link;
+ struct thread *et_td;
+ ck_epoch_section_t et_section;
+#ifdef EPOCH_TRACKER_DEBUG
+ uint64_t et_magic_post;
+#endif
+} __aligned(sizeof(void *));
+typedef struct epoch_tracker *epoch_tracker_t;
epoch_t epoch_alloc(int flags);
void epoch_free(epoch_t epoch);
More information about the svn-src-all
mailing list