On 6/8/19 1:05 PM, Richard W.M. Jones wrote:
Split h->state into:
- h->public_state = the state on entry to the locked region
This is also the atomically, publicly visible state.
- h->state = the real current state of the handle
When we leave the locked region we update h->public_state with
h->state, so that from outside the lock the handle appears to move
atomically from its previous state to the final state without going
through any intermediate states.
Some calls to ‘get_state’ become calls to ‘get_next_state’ if the need
the real state. Others which need to see the publicly visible state
are changed to ‘get_public_state’.
All calls to ‘set_state’ become ‘set_next_state’ because that is the
real state that gets updated.
The purpose of this patch is to make it easier to reason about the
state in lockless code.
---
generator/generator | 87 ++++++++++++++++++++++++++++-----------------
lib/connect.c | 10 +++---
lib/disconnect.c | 8 ++---
lib/handle.c | 2 +-
lib/internal.h | 17 +++++++--
lib/is-state.c | 28 ++++++++-------
lib/rw.c | 4 +--
7 files changed, 97 insertions(+), 59 deletions(-)
@@ -2530,7 +2531,7 @@ let generate_lib_states_c () =
pr "{\n";
pr " int r = 0;\n";
pr "\n";
- pr " switch (get_state (h))\n";
+ pr " switch (get_next_state (h))\n";
pr " {\n";
List.iter (
fun ({ parsed = { state_enum; events } }) ->
We missed a spot. With this commit, we have:
pr "/* Returns whether in the current state read or write would be
valid.\n";
pr " * NB: is_locked = false, may_set_error = false.\n";
pr " */\n";
pr "int\n";
pr "nbd_unlocked_aio_get_direction (struct nbd_handle *h)\n";
pr "{\n";
pr " int r = 0;\n";
pr "\n";
pr " switch (get_next_state (h))\n";
which means the lockless public function nbd_aio_get_direction is
non-deterministic while another thread holds the lock. I'm applying the
obvious patch to split out nbd_internal_aio_get_direction(state), so
that the public version remains tied to the prior state, while
nbd_unlocked_poll() still tracks the internal state.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization:
qemu.org |
libvirt.org