Skip to content

Commit

Permalink
rcu: actually register threads that have RCU read-side critical sections
Browse files Browse the repository at this point in the history
Otherwise, grace periods are detected too early!

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
bonzini committed Jul 24, 2015
1 parent c170aad commit ab28bd2
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 0 deletions.
6 changes: 6 additions & 0 deletions cpus.c
Original file line number Diff line number Diff line change
Expand Up @@ -954,6 +954,8 @@ static void *qemu_kvm_cpu_thread_fn(void *arg)
CPUState *cpu = arg;
int r;

rcu_register_thread();

qemu_mutex_lock_iothread();
qemu_thread_get_self(cpu->thread);
cpu->thread_id = qemu_get_thread_id();
Expand Down Expand Up @@ -995,6 +997,8 @@ static void *qemu_dummy_cpu_thread_fn(void *arg)
sigset_t waitset;
int r;

rcu_register_thread();

qemu_mutex_lock_iothread();
qemu_thread_get_self(cpu->thread);
cpu->thread_id = qemu_get_thread_id();
Expand Down Expand Up @@ -1034,6 +1038,8 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
{
CPUState *cpu = arg;

rcu_register_thread();

qemu_mutex_lock_iothread();
qemu_tcg_init_cpu_signals();
qemu_thread_get_self(cpu->thread);
Expand Down
5 changes: 5 additions & 0 deletions iothread.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "sysemu/iothread.h"
#include "qmp-commands.h"
#include "qemu/error-report.h"
#include "qemu/rcu.h"

typedef ObjectClass IOThreadClass;

Expand All @@ -31,6 +32,8 @@ static void *iothread_run(void *opaque)
IOThread *iothread = opaque;
bool blocking;

rcu_register_thread();

qemu_mutex_lock(&iothread->init_done_lock);
iothread->thread_id = qemu_get_thread_id();
qemu_cond_signal(&iothread->init_done_cond);
Expand All @@ -45,6 +48,8 @@ static void *iothread_run(void *opaque)
}
aio_context_release(iothread->ctx);
}

rcu_unregister_thread();
return NULL;
}

Expand Down
4 changes: 4 additions & 0 deletions migration/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "block/block.h"
#include "qapi/qmp/qerror.h"
#include "qemu/sockets.h"
#include "qemu/rcu.h"
#include "migration/block.h"
#include "qemu/thread.h"
#include "qmp-commands.h"
Expand Down Expand Up @@ -917,6 +918,8 @@ static void *migration_thread(void *opaque)
int64_t start_time = initial_time;
bool old_vm_running = false;

rcu_register_thread();

qemu_savevm_state_header(s->file);
qemu_savevm_state_begin(s->file, &s->params);

Expand Down Expand Up @@ -1016,6 +1019,7 @@ static void *migration_thread(void *opaque)
qemu_bh_schedule(s->cleanup_bh);
qemu_mutex_unlock_iothread();

rcu_unregister_thread();
return NULL;
}

Expand Down
4 changes: 4 additions & 0 deletions tests/test-rcu-list.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ static void *rcu_q_reader(void *arg)
long long n_reads_local = 0;
struct list_element *el;

rcu_register_thread();

*(struct rcu_reader_data **)arg = &rcu_reader;
atomic_inc(&nthreadsrunning);
while (goflag == GOFLAG_INIT) {
Expand All @@ -129,6 +131,8 @@ static void *rcu_q_reader(void *arg)
qemu_mutex_lock(&counts_mutex);
n_reads += n_reads_local;
qemu_mutex_unlock(&counts_mutex);

rcu_unregister_thread();
return NULL;
}

Expand Down
2 changes: 2 additions & 0 deletions util/rcu.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@ static void *call_rcu_thread(void *opaque)
{
struct rcu_head *node;

rcu_register_thread();

for (;;) {
int tries = 0;
int n = atomic_read(&rcu_call_count);
Expand Down

0 comments on commit ab28bd2

Please sign in to comment.