Skip to content

Commit ba9ec78

Browse files
pks-tgitster
authored andcommitted
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>
1 parent 0b2112c commit ba9ec78

1 file changed

Lines changed: 11 additions & 3 deletions

File tree

sideband.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_ma
264264
const char *p = data;
265265

266266
while (sz) {
267+
struct iovec iov[2];
267268
unsigned n;
268269
char hdr[5];
269270

@@ -273,12 +274,19 @@ void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_ma
273274
if (0 <= band) {
274275
xsnprintf(hdr, sizeof(hdr), "%04x", n + 5);
275276
hdr[4] = band;
276-
write_or_die(fd, hdr, 5);
277+
iov[0].iov_base = hdr;
278+
iov[0].iov_len = 5;
277279
} else {
278280
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;
280283
}
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+
282290
p += n;
283291
sz -= n;
284292
}

0 commit comments

Comments
 (0)