Hi, [ Sasha, please remember to CC people who were involved in discussions! ] On Mon, Apr 18, 2011 at 4:05 PM, Sasha Levin <levinsasha928@xxxxxxxxx> wrote: > 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 <levinsasha928@xxxxxxxxx> > --- > 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; As mentioned on IRC, I hate this patch with a passion. ;-) We don't do O_DIRECT now so this doesn't help with performance and the extra complexity it brings to the table isn't very appealing. Modifying the struct iovec (or making a copy of it) seems to be much nicer approach. Pekka -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html