#include "poll-loop.h"
#include "seq.h"
#include "timeval.h"
-#include "vlog.h"
+#include "openvswitch/vlog.h"
VLOG_DEFINE_THIS_MODULE(ovs_rcu);
};
struct ovsrcu_cbset {
- struct list list_node;
+ struct ovs_list list_node;
struct ovsrcu_cb cbs[16];
int n_cbs;
};
struct ovsrcu_perthread {
- struct list list_node; /* In global list. */
+ struct ovs_list list_node; /* In global list. */
struct ovs_mutex mutex;
uint64_t seqno;
static struct seq *global_seqno;
static pthread_key_t perthread_key;
-static struct list ovsrcu_threads;
+static struct ovs_list ovsrcu_threads;
static struct ovs_mutex ovsrcu_threads_mutex;
static struct guarded_list flushed_cbsets;
void
ovsrcu_quiesce(void)
{
- ovsrcu_init_module();
- ovsrcu_perthread_get()->seqno = seq_read(global_seqno);
+ struct ovsrcu_perthread *perthread;
+
+ perthread = ovsrcu_perthread_get();
+ perthread->seqno = seq_read(global_seqno);
+ if (perthread->cbset) {
+ ovsrcu_flush_cbset(perthread);
+ }
seq_change(global_seqno);
ovsrcu_quiesced();
ovsrcu_call_postponed(void)
{
struct ovsrcu_cbset *cbset, *next_cbset;
- struct list cbsets;
+ struct ovs_list cbsets;
guarded_list_pop_all(&flushed_cbsets, &cbsets);
if (list_is_empty(&cbsets)) {