Blame qemu-v2-block-avoid-creating-too-large-iovecs-in-multiwrite_merge.patch
|
Justin M. Forbes |
563054 |
If we go over the maximum number of iovecs support by syscall we get
|
|
Justin M. Forbes |
563054 |
back EINVAL from the kernel which translate to I/O errors for the guest.
|
|
Justin M. Forbes |
563054 |
|
|
Justin M. Forbes |
563054 |
Add a MAX_IOV defintion for platforms that don't have it. For now we use
|
|
Justin M. Forbes |
563054 |
the same 1024 define that's used on Linux and various other platforms,
|
|
Justin M. Forbes |
563054 |
but until the windows block backend implements some kind of vectored I/O
|
|
Justin M. Forbes |
563054 |
it doesn't matter.
|
|
Justin M. Forbes |
563054 |
|
|
Justin M. Forbes |
563054 |
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
|
Justin M. Forbes |
563054 |
|
|
Justin M. Forbes |
563054 |
Index: qemu/block.c
|
|
Justin M. Forbes |
563054 |
===================================================================
|
|
Justin M. Forbes |
563054 |
--- qemu.orig/block.c 2010-01-26 10:59:39.757004445 +0100
|
|
Justin M. Forbes |
563054 |
+++ qemu/block.c 2010-01-26 11:01:38.056023231 +0100
|
|
Justin M. Forbes |
563054 |
@@ -1689,6 +1689,10 @@ static int multiwrite_merge(BlockDriverS
|
|
Justin M. Forbes |
563054 |
merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]);
|
|
Justin M. Forbes |
563054 |
}
|
|
Justin M. Forbes |
563054 |
|
|
Justin M. Forbes |
563054 |
+ if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
|
|
Justin M. Forbes |
563054 |
+ merge = 0;
|
|
Justin M. Forbes |
563054 |
+ }
|
|
Justin M. Forbes |
563054 |
+
|
|
Justin M. Forbes |
563054 |
if (merge) {
|
|
Justin M. Forbes |
563054 |
size_t size;
|
|
Justin M. Forbes |
563054 |
QEMUIOVector *qiov = qemu_mallocz(sizeof(*qiov));
|
|
Justin M. Forbes |
563054 |
Index: qemu/qemu-common.h
|
|
Justin M. Forbes |
563054 |
===================================================================
|
|
Justin M. Forbes |
563054 |
--- qemu.orig/qemu-common.h 2010-01-26 14:41:40.894254285 +0100
|
|
Justin M. Forbes |
563054 |
+++ qemu/qemu-common.h 2010-01-26 14:42:27.267275698 +0100
|
|
Justin M. Forbes |
563054 |
@@ -54,6 +54,10 @@ struct iovec {
|
|
Justin M. Forbes |
563054 |
void *iov_base;
|
|
Justin M. Forbes |
563054 |
size_t iov_len;
|
|
Justin M. Forbes |
563054 |
};
|
|
Justin M. Forbes |
563054 |
+/*
|
|
Justin M. Forbes |
563054 |
+ * Use the same value as Linux for now.
|
|
Justin M. Forbes |
563054 |
+ */
|
|
Justin M. Forbes |
563054 |
+#define IOV_MAX 1024
|
|
Justin M. Forbes |
563054 |
#else
|
|
Justin M. Forbes |
563054 |
#include <sys/uio.h>
|
|
Justin M. Forbes |
563054 |
#endif
|
|
Justin M. Forbes |
563054 |
|