From patchwork Mon Apr 18 13:05:59 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 715071 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3ID6k5K018351 for ; Mon, 18 Apr 2011 13:06:46 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753440Ab1DRNGU (ORCPT ); Mon, 18 Apr 2011 09:06:20 -0400 Received: from mail-wy0-f174.google.com ([74.125.82.174]:33641 "EHLO mail-wy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752670Ab1DRNGT (ORCPT ); Mon, 18 Apr 2011 09:06:19 -0400 Received: by wya21 with SMTP id 21so3885630wya.19 for ; Mon, 18 Apr 2011 06:06:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer; bh=YsatFyVIBibWJ7f11FmQFpj0ciLlmAOh9pdYNLT+ykw=; b=maDtY4FzVjehpcDBjORznZPiDzxjjghZMW7G6jqVcBh4lmFpAYUpmC/Flf6jwsAQpM /DJxVGOyUtDH3j3R/css9NOApLIpIhr95Jk8I66s6JHSYja+F0Fe6AjuLZBzptH3Tp0w EUhJM4cfQWshxjP2Ead5ZdLvW5q6fgJhIboBk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=dBM1+laszJqKSbEhF+onk+nlzK2L7iqi++CjFVfl/ZLhijPGqtYl6FBdQyFEQ82OkL d7PgvNxMESbVeffvu972NSy/kGnHWPJg72m7jaH9iyxrPrubs4HVx7QcupXtWraGCgoN CM08KRVtYbnC0TsZNOIhkAcWWQqqJMD21Xsl8= Received: by 10.227.179.207 with SMTP id br15mr4965631wbb.191.1303131977866; Mon, 18 Apr 2011 06:06:17 -0700 (PDT) Received: from localhost.localdomain (bzq-79-181-210-229.red.bezeqint.net [79.181.210.229]) by mx.google.com with ESMTPS id w25sm3253201wbd.56.2011.04.18.06.06.15 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 18 Apr 2011 06:06:17 -0700 (PDT) From: Sasha Levin To: penberg@kernel.org Cc: mingo@elte.hu, asias.hejun@gmail.com, gorcunov@gmail.com, prasadjoshi124@gmail.com, kvm@vger.kernel.org, Sasha Levin Subject: [PATCH 4/4 V2] kvm tools: Complete missing segments in a iov op using regular op Date: Mon, 18 Apr 2011 16:05:59 +0300 Message-Id: <1303131959-25309-1-git-send-email-levinsasha928@gmail.com> X-Mailer: git-send-email 1.7.5.rc1 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Mon, 18 Apr 2011 13:06:46 +0000 (UTC) If any of the iov operations return mid-block, use regular ops to complete the current block and continue using iov ops. Signed-off-by: Sasha Levin --- tools/kvm/read-write.c | 58 ++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 51 insertions(+), 7 deletions(-) diff --git a/tools/kvm/read-write.c b/tools/kvm/read-write.c index 0c995c8..bf2e4a0 100644 --- a/tools/kvm/read-write.c +++ b/tools/kvm/read-write.c @@ -189,10 +189,10 @@ static inline ssize_t get_iov_size(const struct iovec *iov, int iovcnt) } static inline void shift_iovec(const struct iovec **iov, int *iovcnt, - size_t nr, ssize_t *total, size_t *count, off_t *offset) + ssize_t *nr, ssize_t *total, size_t *count, off_t *offset) { - while (nr >= (*iov)->iov_len) { - nr -= (*iov)->iov_len; + while ((size_t)*nr >= (*iov)->iov_len) { + *nr -= (*iov)->iov_len; *total += (*iov)->iov_len; *count -= (*iov)->iov_len; if (offset) @@ -218,7 +218,18 @@ ssize_t readv_in_full(int fd, const struct iovec *iov, int iovcnt) return -1; } - shift_iovec(&iov, &iovcnt, nr, &total, &count, NULL); + shift_iovec(&iov, &iovcnt, &nr, &total, &count, NULL); + + while (nr > 0) { + ssize_t nr_readagain; + nr_readagain = xread(fd, iov->iov_base + nr, + iov->iov_len - nr); + if (nr_readagain <= 0) + return total; + + nr += nr_readagain; + shift_iovec(&iov, &iovcnt, &nr, &total, &count, NULL); + } } return total; @@ -240,7 +251,18 @@ ssize_t writev_in_full(int fd, const struct iovec *iov, int iovcnt) return -1; } - shift_iovec(&iov, &iovcnt, nr, &total, &count, NULL); + shift_iovec(&iov, &iovcnt, &nr, &total, &count, NULL); + + while (nr > 0) { + ssize_t nr_writeagain; + nr_writeagain = xwrite(fd, iov->iov_base + nr, + iov->iov_len - nr); + if (nr_writeagain <= 0) + return total; + + nr += nr_writeagain; + shift_iovec(&iov, &iovcnt, &nr, &total, &count, NULL); + } } return total; @@ -288,7 +310,18 @@ ssize_t preadv_in_full(int fd, const struct iovec *iov, int iovcnt, off_t offset return -1; } - shift_iovec(&iov, &iovcnt, nr, &total, &count, &offset); + shift_iovec(&iov, &iovcnt, &nr, &total, &count, &offset); + + while (nr > 0) { + ssize_t nr_readagain; + nr_readagain = xpread(fd, iov->iov_base + nr, + iov->iov_len - nr, offset + nr); + if (nr_readagain <= 0) + return total; + + nr += nr_readagain; + shift_iovec(&iov, &iovcnt, &nr, &total, &count, &offset); + } } return total; @@ -310,7 +343,18 @@ ssize_t pwritev_in_full(int fd, const struct iovec *iov, int iovcnt, off_t offse return -1; } - shift_iovec(&iov, &iovcnt, nr, &total, &count, &offset); + shift_iovec(&iov, &iovcnt, &nr, &total, &count, &offset); + + while (nr > 0) { + ssize_t nr_writeagain; + nr_writeagain = xpwrite(fd, iov->iov_base + nr, + iov->iov_len - nr, offset + nr); + if (nr_writeagain <= 0) + return total; + + nr += nr_writeagain; + shift_iovec(&iov, &iovcnt, &nr, &total, &count, &offset); + } } return total;