Displaying 8 results from an estimated 8 matches for "command_common".
2019 May 22
0
[libnbd PATCH v2 1/5] lib: Refactor state event into command_common
The next patch wants to make queuing commands smarter; rather than
duplicating the logic at each command's call site, it's better to
centralize things in command_common, and to also make this helper
routine visible for use in NBD_CMD_DISC.
---
lib/disconnect.c | 17 +++--------------
lib/internal.h | 6 ++++++
lib/rw.c | 19 +++----------------
3 files changed, 12 insertions(+), 30 deletions(-)
diff --git a/lib/disconnect.c b/lib/disconnect.c
index bc...
2019 May 22
0
[libnbd PATCH v3 1/7] lib: Refactor command_common() to do more common work
Our construction of struct command_in_flight was ad hoc; most
parameters were set in command_common(), but extent callbacks were
done after the fact, and NBD_CMD_DISC was open-coding things.
Furthermore, every caller was triggering nbd_internal_run() for the
cmd_issue event; doing that in a central place makes it easier for the
next patch to improve that logic without duplicating the fix at each...
2019 May 22
10
[libnbd PATCH v2 0/5] Avoid deadlock with in-flight commands
...of whether the state machine is currently in READY. I also polished up
the tmp demo into a bit more full-fledged example file, worth
including since it also let me discover a hard-to-hit race with large
NBD_CMD_WRITE vs. EAGAIN failures (now fixed).
Eric Blake (5):
lib: Refactor state event into command_common
commands: Allow for a command queue
states: Split ISSUE_COMMAND.SEND_REQUEST
states: Allow in-flight read while writing next command
examples: Add example to demonstrate just-fixed deadlock scenario
.gitignore | 1 +
examples/Makefile.am | 10 ++
examp...
2019 May 22
12
[libnbd PATCH v3 0/7] Avoid deadlock with in-flight commands
Since v2:
- rebase to Rich's new API calls
- more refactoring in patch 1 (retitled)
- new patches 3 and 4
- fix data corruption in patch 6 (was 4)
- more tweaks to the reproducer example (including using new API from 3)
Eric Blake (7):
lib: Refactor command_common() to do more common work
commands: Allow for a command queue
commands: Expose FIFO ordering of server completions
disconnect: Allow shutdown during processing
states: Split ISSUE_COMMAND.SEND_REQUEST
states: Allow in-flight read while writing next command
examples: Add example to demons...
2019 May 21
0
[libnbd PATCH 1/3] commands: Preserve FIFO ordering
...;
+ while (prev_cmd->next)
+ prev_cmd = prev_cmd->next;
+ prev_cmd->next = cmd;
+ }
+ else
+ conn->cmds_done = cmd;
SET_NEXT_STATE (%.READY);
return 0;
diff --git a/lib/rw.c b/lib/rw.c
index 9dfce97..fa7dc52 100644
--- a/lib/rw.c
+++ b/lib/rw.c
@@ -246,7 +246,7 @@ command_common (struct nbd_connection *conn,
uint16_t flags, uint16_t type,
uint64_t offset, uint64_t count, void *data)
{
- struct command_in_flight *cmd;
+ struct command_in_flight *cmd, *prev_cmd;
switch (type) {
/* Commands which send or receive data are limited t...
2019 May 22
0
[libnbd PATCH v2 2/5] commands: Allow for a command queue
...d, the first list contains commands waiting
* to be issued. The second list contains commands which have been
* issued and waiting for replies. The third list contains commands
diff --git a/lib/rw.c b/lib/rw.c
index a7587e9..ebd4ff9 100644
--- a/lib/rw.c
+++ b/lib/rw.c
@@ -246,7 +246,8 @@ command_common (struct nbd_connection *conn,
uint16_t flags, uint16_t type,
uint64_t offset, uint64_t count, void *data)
{
- struct command_in_flight *cmd;
+ struct command_in_flight *cmd, *prev_cmd;
+ bool event = !conn->reached_ready;
switch (type) {
/* Commands...
2019 May 22
1
Re: [libnbd PATCH v2 2/5] commands: Allow for a command queue
...un
}
else if (nbd_unlocked_aio_is_processing (conn)) {
// can't call nbd_internal_run because we're in the
// wrong state, but we can enqueue the command and it
// will be processed next time we get to READY
}
else {
// this is an error
}
> @@ -296,9 +297,24 @@ command_common (struct nbd_connection *conn,
> if (conn->structured_replies && cmd->data && type == NBD_CMD_READ)
> memset (cmd->data, 0, cmd->count);
>
> - cmd->next = conn->cmds_to_issue;
> - conn->cmds_to_issue = cmd;
> - if (nbd_internal_run (...
2019 May 21
9
[libnbd PATCH 0/3] Avoid deadlock with in-flight commands
This might not be the final solution, but it certainly seems to solve
a deadlock for me that I could trigger by using 'nbdkit
--filter=noparallel memory 512k' and calling nbd_aio_pread for a
request larger than 256k (enough for the Linux kernel to block the
server until libnbd read()s), immediately followed by nbd_aio_pwrite
for a request larger than 256k (enough to block libnbd until the