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);
|
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 */
|
#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 };
|
struct iovec iov = { .iov_base = buf, .iov_len = bytes };
|
||||||
return qemu_co_sendv_recvv(sockfd, &iov, 1, 0, bytes, do_send);
|
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;
|
QEMUFile *file;
|
||||||
} QEMUFileSocket;
|
} 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,
|
static ssize_t socket_writev_buffer(void *opaque, struct iovec *iov, int iovcnt,
|
||||||
int64_t pos)
|
int64_t pos)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user