From: Junio C Hamano Date: Wed, 04 Mar 2026 22:05:05 GMT Subject: Re: [PATCH v2 07/10] sideband: use writev(3p) to send pktlines Message-ID: In-Reply-To: <20260303-pks-upload-pack-write-contention-v2-7-7321830f08fe@pks.im> Patrick Steinhardt writes: > 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 > Signed-off-by: Patrick Steinhardt > --- > sideband.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) Quite straight-forward. Looking good. > 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; > }