On 21/09/17 21:51, Paolo Bonzini wrote: > On 21/09/2017 10:50, Alexey Kardashevskiy wrote: >> * since FlatView::rcu is used now to dispose FV, call_rcu() in >> address_space_update_topology() is replaced with direct call to >> flatview_unref() > > Hmm, this is not correct, as you could have > > > thread 1 thread 2 RCU thread > ------------------------------------------------------------- > rcu_read_lock > read as->current_map > set as->current_map > flatview_unref > '--> call_rcu > flatview_ref > rcu_read_unlock > flatview_destroy > > I need to think a bit more about this (and possibly ask Paul...). > > Paolo >
Nah, you're right, it should be like this: diff --git a/memory.c b/memory.c index 35b2fc5f7f..689bf53866 100644 --- a/memory.c +++ b/memory.c @@ -317,7 +317,7 @@ static void flatview_ref(FlatView *view) static void flatview_unref(FlatView *view) { if (atomic_fetch_dec(&view->ref) == 1) { - call_rcu(view, flatview_destroy, rcu); + flatview_destroy(view); } } @@ -768,7 +768,7 @@ static FlatView *generate_memory_topology(MemoryRegion *mr) flatview_simplify(view); if (!view->nr) { - flatview_destroy(view); + flatview_unref(view); use_empty = true; } } @@ -1026,7 +1026,7 @@ static void address_space_set_flatview(AddressSpace *as) /* Writes are protected by the BQL. */ atomic_rcu_set(&as->current_map, new_view); if (old_view) { - flatview_unref(old_view); + call_rcu(view, flatview_unref, rcu); } -- Alexey