[Libguestfs] [libnbd PATCH 0/3] Avoid deadlock with in-flight commands

Eric Blake eblake at redhat.com
Tue May 21 15:09:27 UTC 2019


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
server read()s, but the serialized server won't read until we parse
off the reply).  My solution was to allow a notifyread at any time we
are in the middle of writing a request, at which point we pause the
current write, force the state machine to completely receive the
reply, then resume where we left off writing the request.

Eric Blake (3):
  commands: Preserve FIFO ordering
  states: Split ISSUE_COMMAND.SEND_REQUEST
  states: Allow in-flight read while writing next command

 generator/generator              | 34 +++++++++++++++-
 generator/states-issue-command.c | 68 ++++++++++++++++++++++++--------
 generator/states-reply.c         | 18 +++++++--
 lib/internal.h                   |  1 +
 lib/rw.c                         | 13 ++++--
 5 files changed, 108 insertions(+), 26 deletions(-)

-- 
2.20.1




More information about the Libguestfs mailing list