From: Jens Axboe Date: Wed, 14 Mar 2012 20:25:51 +0000 (+0100) Subject: server: add fio_sendv_data() X-Git-Tag: gfio-0.1~142 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=5235f62680ba4be74d56805eb54c3af4de28e556 server: add fio_sendv_data() Signed-off-by: Jens Axboe --- diff --git a/server.c b/server.c index 116b3d60..73e36a50 100644 --- a/server.c +++ b/server.c @@ -68,19 +68,40 @@ const char *fio_server_op(unsigned int op) return buf; } -int fio_send_data(int sk, const void *p, unsigned int len) +static ssize_t iov_total_len(const struct iovec *iov, int count) { - assert(len <= sizeof(struct fio_net_cmd) + FIO_SERVER_MAX_FRAGMENT_PDU); + ssize_t ret = 0; - do { - int ret = send(sk, p, len, 0); + while (count--) { + ret += iov->iov_len; + iov++; + } + + return ret; +} + +static int fio_sendv_data(int sk, struct iovec *iov, int count) +{ + ssize_t total_len = iov_total_len(iov, count); + ssize_t ret; + do { + ret = writev(sk, iov, count); if (ret > 0) { - len -= ret; - if (!len) + total_len -= ret; + if (!total_len) break; - p += ret; - continue; + + while (ret) { + if (ret >= iov->iov_len) { + ret -= iov->iov_len; + iov++; + continue; + } + iov->iov_base += ret; + iov->iov_len -= ret; + ret = 0; + } } else if (!ret) break; else if (errno == EAGAIN || errno == EINTR) @@ -89,7 +110,7 @@ int fio_send_data(int sk, const void *p, unsigned int len) break; } while (!exit_backend); - if (!len) + if (!total_len) return 0; if (errno) @@ -98,6 +119,15 @@ int fio_send_data(int sk, const void *p, unsigned int len) return 1; } +int fio_send_data(int sk, const void *p, unsigned int len) +{ + struct iovec iov = { .iov_base = (void *) p, .iov_len = len }; + + assert(len <= sizeof(struct fio_net_cmd) + FIO_SERVER_MAX_FRAGMENT_PDU); + + return fio_sendv_data(sk, &iov, 1); +} + int fio_recv_data(int sk, void *p, unsigned int len) { do {