Commit ba58e470 authored by Pavel Emelyanov's avatar Pavel Emelyanov

protobuf: Use writev for writing image entries

Two writes are slower. This halves the amount of write syscalls
and reduces dump time of a basic container on 5%.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 740eb9c1
...@@ -599,6 +599,7 @@ int pb_write_one(int fd, void *obj, int type) ...@@ -599,6 +599,7 @@ int pb_write_one(int fd, void *obj, int type)
void *buf = (void *)&local; void *buf = (void *)&local;
u32 size, packed; u32 size, packed;
int ret = -1; int ret = -1;
struct iovec iov[2];
if (!cr_pb_descs[type].pb_desc) { if (!cr_pb_descs[type].pb_desc) {
pr_err("Wrong object requested %d\n", type); pr_err("Wrong object requested %d\n", type);
...@@ -618,17 +619,14 @@ int pb_write_one(int fd, void *obj, int type) ...@@ -618,17 +619,14 @@ int pb_write_one(int fd, void *obj, int type)
goto err; goto err;
} }
ret = write(fd, &size, sizeof(size)); iov[0].iov_base = &size;
if (ret != sizeof(size)) { iov[0].iov_len = sizeof(size);
ret = -1; iov[1].iov_base = buf;
pr_perror("Can't write %d bytes", (int)sizeof(size)); iov[1].iov_len = size;
goto err;
}
ret = write(fd, buf, size); ret = writev(fd, iov, 2);
if (ret != size) { if (ret != size + sizeof(size)) {
ret = -1; pr_perror("Can't write %d bytes", (int)(size + sizeof(size)));
pr_perror("Can't write %d bytes", size);
goto err; goto err;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment