svn commit: r333745 - in head/sys/contrib/ck: include src
Matt Macy
mmacy at FreeBSD.org
Thu May 17 18:14:11 UTC 2018
Author: mmacy
Date: Thu May 17 18:14:10 2018
New Revision: 333745
URL: https://svnweb.freebsd.org/changeset/base/333745
Log:
ck: add support for executing callbacks outside of main poll loop
Pull in change from upstream deca119d14bfffd440770eb67cbdbeaf7b57eb7b
| ck_epoch: introduce ck_epoch_deferred
|
| Allow for deferral to occur outside epoch poll critical loop (which may access per-CPU structures).
|
Approved by: sbruno
Modified:
head/sys/contrib/ck/include/ck_epoch.h
head/sys/contrib/ck/src/ck_epoch.c
Modified: head/sys/contrib/ck/include/ck_epoch.h
==============================================================================
--- head/sys/contrib/ck/include/ck_epoch.h Thu May 17 17:59:35 2018 (r333744)
+++ head/sys/contrib/ck/include/ck_epoch.h Thu May 17 18:14:10 2018 (r333745)
@@ -266,6 +266,7 @@ void ck_epoch_register(ck_epoch_t *, ck_epoch_record_t
void ck_epoch_unregister(ck_epoch_record_t *);
bool ck_epoch_poll(ck_epoch_record_t *);
+bool ck_epoch_poll_deferred(struct ck_epoch_record *record, ck_stack_t *deferred);
void ck_epoch_synchronize(ck_epoch_record_t *);
void ck_epoch_synchronize_wait(ck_epoch_t *, ck_epoch_wait_cb_t *, void *);
void ck_epoch_barrier(ck_epoch_record_t *);
Modified: head/sys/contrib/ck/src/ck_epoch.c
==============================================================================
--- head/sys/contrib/ck/src/ck_epoch.c Thu May 17 17:59:35 2018 (r333744)
+++ head/sys/contrib/ck/src/ck_epoch.c Thu May 17 18:14:10 2018 (r333745)
@@ -349,7 +349,7 @@ ck_epoch_scan(struct ck_epoch *global,
}
static void
-ck_epoch_dispatch(struct ck_epoch_record *record, unsigned int e)
+ck_epoch_dispatch(struct ck_epoch_record *record, unsigned int e, ck_stack_t *deferred)
{
unsigned int epoch = e & (CK_EPOCH_LENGTH - 1);
ck_stack_entry_t *head, *next, *cursor;
@@ -362,7 +362,10 @@ ck_epoch_dispatch(struct ck_epoch_record *record, unsi
ck_epoch_entry_container(cursor);
next = CK_STACK_NEXT(cursor);
- entry->function(entry);
+ if (deferred != NULL)
+ ck_stack_push_spnc(deferred, &entry->stack_entry);
+ else
+ entry->function(entry);
i++;
}
@@ -390,7 +393,7 @@ ck_epoch_reclaim(struct ck_epoch_record *record)
unsigned int epoch;
for (epoch = 0; epoch < CK_EPOCH_LENGTH; epoch++)
- ck_epoch_dispatch(record, epoch);
+ ck_epoch_dispatch(record, epoch, NULL);
return;
}
@@ -551,7 +554,7 @@ ck_epoch_barrier_wait(struct ck_epoch_record *record,
* is far from ideal too.
*/
bool
-ck_epoch_poll(struct ck_epoch_record *record)
+ck_epoch_poll_deferred(struct ck_epoch_record *record, ck_stack_t *deferred)
{
bool active;
unsigned int epoch;
@@ -572,7 +575,7 @@ ck_epoch_poll(struct ck_epoch_record *record)
if (active == false) {
record->epoch = epoch;
for (epoch = 0; epoch < CK_EPOCH_LENGTH; epoch++)
- ck_epoch_dispatch(record, epoch);
+ ck_epoch_dispatch(record, epoch, deferred);
return true;
}
@@ -580,6 +583,13 @@ ck_epoch_poll(struct ck_epoch_record *record)
/* If an active thread exists, rely on epoch observation. */
(void)ck_pr_cas_uint(&global->epoch, epoch, epoch + 1);
- ck_epoch_dispatch(record, epoch + 1);
+ ck_epoch_dispatch(record, epoch + 1, deferred);
return true;
+}
+
+bool
+ck_epoch_poll(struct ck_epoch_record *record)
+{
+
+ return ck_epoch_poll_deferred(record, NULL);
}
More information about the svn-src-all
mailing list