aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2026-03-13 07:45:18 +0100
committerJunio C Hamano <gitster@pobox.com>2026-03-13 08:54:14 -0700
commit26986f4cbaf38d84a82b0b35da211389ce49552c (patch)
treecc9d63343f164e017a3870c1206fcc56f9a8ced6
parent1970fcef93adcc5a35f6468d00a5a634d5af2b3c (diff)
downloadgit-26986f4cbaf38d84a82b0b35da211389ce49552c.tar.xz
sideband: use writev(3p) to send pktlines
Every pktline that we send out via `send_sideband()` currently requires two syscalls: one to write the pktline's length, and one to send its data. This typically isn't all that much of a problem, but under extreme load the syscalls may cause contention in the kernel. Refactor the code to instead use the newly introduced writev(3p) infra so that we can send out the data with a single syscall. This reduces the number of syscalls from around 133,000 calls to write(3p) to around 67,000 calls to writev(3p). Suggested-by: Jeff King <peff@peff.net> Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--sideband.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sideband.c b/sideband.c
index ea7c25211e..1ed6614eaf 100644
--- a/sideband.c
+++ b/sideband.c
@@ -264,6 +264,7 @@ void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_ma
const char *p = data;
while (sz) {
+ struct iovec iov[2];
unsigned n;
char hdr[5];
@@ -273,12 +274,19 @@ void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_ma
if (0 <= band) {
xsnprintf(hdr, sizeof(hdr), "%04x", n + 5);
hdr[4] = band;
- write_or_die(fd, hdr, 5);
+ iov[0].iov_base = hdr;
+ iov[0].iov_len = 5;
} else {
xsnprintf(hdr, sizeof(hdr), "%04x", n + 4);
- write_or_die(fd, hdr, 4);
+ iov[0].iov_base = hdr;
+ iov[0].iov_len = 4;
}
- write_or_die(fd, p, n);
+
+ iov[1].iov_base = (void *) p;
+ iov[1].iov_len = n;
+
+ writev_or_die(fd, iov, ARRAY_SIZE(iov));
+
p += n;
sz -= n;
}