rdma: export yield_until_fd_readable()
The RDMA event channel can be made non-blocking just like a TCP socket. Exporting this function allows us to yield so that the QEMU monitor remains available. Reviewed-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Chegu Vinod <chegu_vinod@hp.com> Tested-by: Chegu Vinod <chegu_vinod@hp.com> Tested-by: Michael R. Hines <mrhines@us.ibm.com> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
2b0ce0797d
commit
9f05d0c3a4
@ -209,4 +209,10 @@ void qemu_co_rwlock_unlock(CoRwlock *lock);
|
||||
*/
|
||||
void coroutine_fn co_sleep_ns(QEMUClock *clock, int64_t ns);
|
||||
|
||||
/**
|
||||
* Yield until a file descriptor becomes readable
|
||||
*
|
||||
* Note that this function clobbers the handlers for the file descriptor.
|
||||
*/
|
||||
void coroutine_fn yield_until_fd_readable(int fd);
|
||||
#endif /* QEMU_COROUTINE_H */
|
||||
|
@ -63,3 +63,26 @@ qemu_co_send_recv(int sockfd, void *buf, size_t bytes, bool do_send)
|
||||
struct iovec iov = { .iov_base = buf, .iov_len = bytes };
|
||||
return qemu_co_sendv_recvv(sockfd, &iov, 1, 0, bytes, do_send);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
Coroutine *co;
|
||||
int fd;
|
||||
} FDYieldUntilData;
|
||||
|
||||
static void fd_coroutine_enter(void *opaque)
|
||||
{
|
||||
FDYieldUntilData *data = opaque;
|
||||
qemu_set_fd_handler(data->fd, NULL, NULL, NULL);
|
||||
qemu_coroutine_enter(data->co, NULL);
|
||||
}
|
||||
|
||||
void coroutine_fn yield_until_fd_readable(int fd)
|
||||
{
|
||||
FDYieldUntilData data;
|
||||
|
||||
assert(qemu_in_coroutine());
|
||||
data.co = qemu_coroutine_self();
|
||||
data.fd = fd;
|
||||
qemu_set_fd_handler(fd, fd_coroutine_enter, NULL, &data);
|
||||
qemu_coroutine_yield();
|
||||
}
|
||||
|
28
savevm.c
28
savevm.c
@ -149,34 +149,6 @@ typedef struct QEMUFileSocket
|
||||
QEMUFile *file;
|
||||
} QEMUFileSocket;
|
||||
|
||||
typedef struct {
|
||||
Coroutine *co;
|
||||
int fd;
|
||||
} FDYieldUntilData;
|
||||
|
||||
static void fd_coroutine_enter(void *opaque)
|
||||
{
|
||||
FDYieldUntilData *data = opaque;
|
||||
qemu_set_fd_handler(data->fd, NULL, NULL, NULL);
|
||||
qemu_coroutine_enter(data->co, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Yield until a file descriptor becomes readable
|
||||
*
|
||||
* Note that this function clobbers the handlers for the file descriptor.
|
||||
*/
|
||||
static void coroutine_fn yield_until_fd_readable(int fd)
|
||||
{
|
||||
FDYieldUntilData data;
|
||||
|
||||
assert(qemu_in_coroutine());
|
||||
data.co = qemu_coroutine_self();
|
||||
data.fd = fd;
|
||||
qemu_set_fd_handler(fd, fd_coroutine_enter, NULL, &data);
|
||||
qemu_coroutine_yield();
|
||||
}
|
||||
|
||||
static ssize_t socket_writev_buffer(void *opaque, struct iovec *iov, int iovcnt,
|
||||
int64_t pos)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user