mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 09:43:56 -06:00
NBD patches for 2023-09-07
- Andrey Drobyshev - fix regression in iotest 197 under -nbd - Stefan Hajnoczi - allow coroutine read and write context to split across threads - Philippe Mathieu-Daudé - remove a VLA allocation - Denis V. Lunev - fix regression in iotest 233 with qemu-nbd -v --fork -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEccLMIrHEYCkn0vOqp6FrSiUnQ2oFAmT7EsUACgkQp6FrSiUn Q2qiKgf9EqCWPmcsH2nvXrDvZmDc0/I4tineaNY+hSdPtSb6RFA1IH8AvzkrkPYU 9ojX6QFp1Z30fUs+pwweQhBMYta03QyjCFhsbPRmDq391dtIDCeww3o+RD1kw/pg 2ZC+P9N1U3pi2Hi8FhxH17GYYgOQnHMKM9gt1V7JOQvFsDFWbTo9sFj8p/BPoWxV I3TeLQDWqVnNjf57lG2pwhdKc8DbKoqRmA3XNiXiKI5inEBeRJsTdMMGn4YWpwJE Y5imM/PbyCqRKQ6MYyJenVk4QVTe1IKO6D4vf1ZHLDBEiaw9NaeYHlk6lnDC4O9v PeTycAwND6cMKYlKMyEzcJXv9IdRBw== =jAZi -----END PGP SIGNATURE----- Merge tag 'pull-nbd-2023-09-07-v2' of https://repo.or.cz/qemu/ericb into staging NBD patches for 2023-09-07 - Andrey Drobyshev - fix regression in iotest 197 under -nbd - Stefan Hajnoczi - allow coroutine read and write context to split across threads - Philippe Mathieu-Daudé - remove a VLA allocation - Denis V. Lunev - fix regression in iotest 233 with qemu-nbd -v --fork # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCAAdFiEEccLMIrHEYCkn0vOqp6FrSiUnQ2oFAmT7EsUACgkQp6FrSiUn # Q2qiKgf9EqCWPmcsH2nvXrDvZmDc0/I4tineaNY+hSdPtSb6RFA1IH8AvzkrkPYU # 9ojX6QFp1Z30fUs+pwweQhBMYta03QyjCFhsbPRmDq391dtIDCeww3o+RD1kw/pg # 2ZC+P9N1U3pi2Hi8FhxH17GYYgOQnHMKM9gt1V7JOQvFsDFWbTo9sFj8p/BPoWxV # I3TeLQDWqVnNjf57lG2pwhdKc8DbKoqRmA3XNiXiKI5inEBeRJsTdMMGn4YWpwJE # Y5imM/PbyCqRKQ6MYyJenVk4QVTe1IKO6D4vf1ZHLDBEiaw9NaeYHlk6lnDC4O9v # PeTycAwND6cMKYlKMyEzcJXv9IdRBw== # =jAZi # -----END PGP SIGNATURE----- # gpg: Signature made Fri 08 Sep 2023 08:25:41 EDT # gpg: using RSA key 71C2CC22B1C4602927D2F3AAA7A16B4A2527436A # gpg: Good signature from "Eric Blake <eblake@redhat.com>" [full] # gpg: aka "Eric Blake (Free Software Programmer) <ebb9@byu.net>" [full] # gpg: aka "[jpeg image of size 6874]" [full] # Primary key fingerprint: 71C2 CC22 B1C4 6029 27D2 F3AA A7A1 6B4A 2527 436A * tag 'pull-nbd-2023-09-07-v2' of https://repo.or.cz/qemu/ericb: qemu-nbd: document -v behavior in respect to --fork in man qemu-nbd: Restore "qemu-nbd -v --fork" output qemu-nbd: invent nbd_client_release_pipe() helper qemu-nbd: put saddr into into struct NbdClientOpts qemu-nbd: move srcpath into struct NbdClientOpts qemu-nbd: define struct NbdClientOpts when HAVE_NBD_DEVICE is not defined qemu-nbd: improve error message for dup2 error util/iov: Avoid dynamic stack allocation io: follow coroutine AioContext in qio_channel_yield() io: check there are no qio_channel_yield() coroutines during ->finalize() nbd: drop unused nbd_start_negotiate() aio_context argument nbd: drop unused nbd_receive_negotiate() aio_context argument qemu-iotests/197: use more generic commands for formats other than qcow2 Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
0b63052a46
24 changed files with 328 additions and 219 deletions
|
@ -324,8 +324,7 @@ typedef struct NBDExportInfo {
|
|||
char **contexts;
|
||||
} NBDExportInfo;
|
||||
|
||||
int nbd_receive_negotiate(AioContext *aio_context, QIOChannel *ioc,
|
||||
QCryptoTLSCreds *tlscreds,
|
||||
int nbd_receive_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
||||
const char *hostname, QIOChannel **outioc,
|
||||
NBDExportInfo *info, Error **errp);
|
||||
void nbd_free_export_list(NBDExportInfo *info, int count);
|
||||
|
|
|
@ -49,4 +49,27 @@
|
|||
QIOChannel *qio_channel_new_fd(int fd,
|
||||
Error **errp);
|
||||
|
||||
/**
|
||||
* qio_channel_util_set_aio_fd_handler:
|
||||
* @read_fd: the file descriptor for the read handler
|
||||
* @read_ctx: the AioContext for the read handler
|
||||
* @io_read: the read handler
|
||||
* @write_fd: the file descriptor for the write handler
|
||||
* @write_ctx: the AioContext for the write handler
|
||||
* @io_write: the write handler
|
||||
* @opaque: the opaque argument to the read and write handler
|
||||
*
|
||||
* Set the read and write handlers when @read_ctx and @write_ctx are non-NULL,
|
||||
* respectively. To leave a handler in its current state, pass a NULL
|
||||
* AioContext. To clear a handler, pass a non-NULL AioContext and a NULL
|
||||
* handler.
|
||||
*/
|
||||
void qio_channel_util_set_aio_fd_handler(int read_fd,
|
||||
AioContext *read_ctx,
|
||||
IOHandler *io_read,
|
||||
int write_fd,
|
||||
AioContext *write_ctx,
|
||||
IOHandler *io_write,
|
||||
void *opaque);
|
||||
|
||||
#endif /* QIO_CHANNEL_UTIL_H */
|
||||
|
|
|
@ -81,9 +81,11 @@ struct QIOChannel {
|
|||
Object parent;
|
||||
unsigned int features; /* bitmask of QIOChannelFeatures */
|
||||
char *name;
|
||||
AioContext *ctx;
|
||||
AioContext *read_ctx;
|
||||
Coroutine *read_coroutine;
|
||||
AioContext *write_ctx;
|
||||
Coroutine *write_coroutine;
|
||||
bool follow_coroutine_ctx;
|
||||
#ifdef _WIN32
|
||||
HANDLE event; /* For use with GSource on Win32 */
|
||||
#endif
|
||||
|
@ -140,8 +142,9 @@ struct QIOChannelClass {
|
|||
int whence,
|
||||
Error **errp);
|
||||
void (*io_set_aio_fd_handler)(QIOChannel *ioc,
|
||||
AioContext *ctx,
|
||||
AioContext *read_ctx,
|
||||
IOHandler *io_read,
|
||||
AioContext *write_ctx,
|
||||
IOHandler *io_write,
|
||||
void *opaque);
|
||||
int (*io_flush)(QIOChannel *ioc,
|
||||
|
@ -498,6 +501,21 @@ int qio_channel_set_blocking(QIOChannel *ioc,
|
|||
bool enabled,
|
||||
Error **errp);
|
||||
|
||||
/**
|
||||
* qio_channel_set_follow_coroutine_ctx:
|
||||
* @ioc: the channel object
|
||||
* @enabled: whether or not to follow the coroutine's AioContext
|
||||
*
|
||||
* If @enabled is true, calls to qio_channel_yield() use the current
|
||||
* coroutine's AioContext. Usually this is desirable.
|
||||
*
|
||||
* If @enabled is false, calls to qio_channel_yield() use the global iohandler
|
||||
* AioContext. This is may be used by coroutines that run in the main loop and
|
||||
* do not wish to respond to I/O during nested event loops. This is the
|
||||
* default for compatibility with code that is not aware of AioContexts.
|
||||
*/
|
||||
void qio_channel_set_follow_coroutine_ctx(QIOChannel *ioc, bool enabled);
|
||||
|
||||
/**
|
||||
* qio_channel_close:
|
||||
* @ioc: the channel object
|
||||
|
@ -703,41 +721,6 @@ GSource *qio_channel_add_watch_source(QIOChannel *ioc,
|
|||
GDestroyNotify notify,
|
||||
GMainContext *context);
|
||||
|
||||
/**
|
||||
* qio_channel_attach_aio_context:
|
||||
* @ioc: the channel object
|
||||
* @ctx: the #AioContext to set the handlers on
|
||||
*
|
||||
* Request that qio_channel_yield() sets I/O handlers on
|
||||
* the given #AioContext. If @ctx is %NULL, qio_channel_yield()
|
||||
* uses QEMU's main thread event loop.
|
||||
*
|
||||
* You can move a #QIOChannel from one #AioContext to another even if
|
||||
* I/O handlers are set for a coroutine. However, #QIOChannel provides
|
||||
* no synchronization between the calls to qio_channel_yield() and
|
||||
* qio_channel_attach_aio_context().
|
||||
*
|
||||
* Therefore you should first call qio_channel_detach_aio_context()
|
||||
* to ensure that the coroutine is not entered concurrently. Then,
|
||||
* while the coroutine has yielded, call qio_channel_attach_aio_context(),
|
||||
* and then aio_co_schedule() to place the coroutine on the new
|
||||
* #AioContext. The calls to qio_channel_detach_aio_context()
|
||||
* and qio_channel_attach_aio_context() should be protected with
|
||||
* aio_context_acquire() and aio_context_release().
|
||||
*/
|
||||
void qio_channel_attach_aio_context(QIOChannel *ioc,
|
||||
AioContext *ctx);
|
||||
|
||||
/**
|
||||
* qio_channel_detach_aio_context:
|
||||
* @ioc: the channel object
|
||||
*
|
||||
* Disable any I/O handlers set by qio_channel_yield(). With the
|
||||
* help of aio_co_schedule(), this allows moving a coroutine that was
|
||||
* paused by qio_channel_yield() to another context.
|
||||
*/
|
||||
void qio_channel_detach_aio_context(QIOChannel *ioc);
|
||||
|
||||
/**
|
||||
* qio_channel_yield:
|
||||
* @ioc: the channel object
|
||||
|
@ -785,8 +768,9 @@ void qio_channel_wait(QIOChannel *ioc,
|
|||
/**
|
||||
* qio_channel_set_aio_fd_handler:
|
||||
* @ioc: the channel object
|
||||
* @ctx: the AioContext to set the handlers on
|
||||
* @read_ctx: the AioContext to set the read handler on or NULL
|
||||
* @io_read: the read handler
|
||||
* @write_ctx: the AioContext to set the write handler on or NULL
|
||||
* @io_write: the write handler
|
||||
* @opaque: the opaque value passed to the handler
|
||||
*
|
||||
|
@ -794,10 +778,17 @@ void qio_channel_wait(QIOChannel *ioc,
|
|||
* be used by channel implementations to forward the handlers
|
||||
* to another channel (e.g. from #QIOChannelTLS to the
|
||||
* underlying socket).
|
||||
*
|
||||
* When @read_ctx is NULL, don't touch the read handler. When @write_ctx is
|
||||
* NULL, don't touch the write handler. Note that setting the read handler
|
||||
* clears the write handler, and vice versa, if they share the same AioContext.
|
||||
* Therefore the caller must pass both handlers together when sharing the same
|
||||
* AioContext.
|
||||
*/
|
||||
void qio_channel_set_aio_fd_handler(QIOChannel *ioc,
|
||||
AioContext *ctx,
|
||||
AioContext *read_ctx,
|
||||
IOHandler *io_read,
|
||||
AioContext *write_ctx,
|
||||
IOHandler *io_write,
|
||||
void *opaque);
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ typedef struct {
|
|||
unsigned int in_flight; /* atomic */
|
||||
|
||||
/* Protected by ctx lock */
|
||||
bool in_qio_channel_yield;
|
||||
bool wait_idle;
|
||||
VuDev vu_dev;
|
||||
QIOChannel *ioc; /* The I/O channel with the client */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue