[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v6 01/11] libxl: Enhance libxl__sendmsg_fds to deal with EINTR and EWOULDBLOCK
This patch change the behavior of libxl__sendmsg_fds to retry sendmsg on EINTR error. This patch also allow a caller of libxl__sendmsg_fds to deal with EWOULDBLOCK. It is best to only sent one byte when dealing with non-blocking fds so a EWOULDBLOCK error would mean that the fds haven't been sent yet. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> --- tools/libxl/libxl_internal.h | 3 ++- tools/libxl/libxl_utils.c | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index e498435e16..ae5960d869 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1864,7 +1864,8 @@ _hidden void libxl__qmp_cleanup(libxl__gc *gc, uint32_t domid); _hidden int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid, const libxl_domain_config *guest_config); -/* on failure, logs */ +/* returns ERROR_NOT_READY on EWOULDBLOCK + * or logs on failure. */ int libxl__sendmsg_fds(libxl__gc *gc, int carrier, const void *data, size_t datalen, int nfds, const int fds[], const char *what); diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 5854717b11..5d20fd57c5 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -1088,11 +1088,20 @@ int libxl__sendmsg_fds(libxl__gc *gc, int carrier, msg.msg_controllen = cmsg->cmsg_len; - r = sendmsg(carrier, &msg, 0); - if (r < 0) { - LOGE(ERROR, "failed to send fd-carrying message (%s)", what); - return ERROR_FAIL; - } + while (1) { + r = sendmsg(carrier, &msg, 0); + if (r < 0) { + if (errno == EINTR) + continue; + if (errno == EWOULDBLOCK) { + assert(datalen == 1); + return ERROR_NOT_READY; + } + LOGE(ERROR, "failed to send fd-carrying message (%s)", what); + return ERROR_FAIL; + } + break; + }; return 0; } -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |