Show 15 quoted lines
> 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>
> ---
> sideband.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
Show 35 quoted lines
> 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;
> }