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>

Patrick Steinhardt committed Mar 13, 2026 at 07:45 UTC 26986f4cbaf38d84a82b0b35da211389ce49552c
1 file changed +11 -3
sideband.c
+11 -3
@@ -264,6 +264,7 @@ void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_ma
264 const char *p = data;
265
266 while (sz) {
267 + struct iovec iov[2];
268 unsigned n;
269 char hdr[5];
270
@@ -273,12 +274,19 @@ void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_ma
274 if (0 <= band) {
275 xsnprintf(hdr, sizeof(hdr), "%04x", n + 5);
276 hdr[4] = band;
276 - write_or_die(fd, hdr, 5);
277 + iov[0].iov_base = hdr;
278 + iov[0].iov_len = 5;
279 } else {
280 xsnprintf(hdr, sizeof(hdr), "%04x", n + 4);
279 - write_or_die(fd, hdr, 4);
281 + iov[0].iov_base = hdr;
282 + iov[0].iov_len = 4;
283 }
281 - write_or_die(fd, p, n);
284 +
285 + iov[1].iov_base = (void *) p;
286 + iov[1].iov_len = n;
287 +
288 + writev_or_die(fd, iov, ARRAY_SIZE(iov));
289 +
290 p += n;
291 sz -= n;
292 }