io: Add helper for setting socket send buffer size

Testing reading and writing from qemu-nbd using a unix domain socket
shows that the platform default send buffer size is too low, leading to
poor performance and hight cpu usage.

Add a helper for setting socket send buffer size to be used in NBD code.
It can also be used in other contexts.

We don't need a helper for receive buffer size since it is not used with
unix domain sockets. This is documented for Linux, and not documented
for macOS.

Failing to set the socket buffer size is not a fatal error, but the
caller may want to warn about the failure.

Signed-off-by: Nir Soffer <nirsof@gmail.com>
Message-ID: <20250517201154.88456-2-nirsof@gmail.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Nir Soffer 2025-05-17 23:11:52 +03:00 committed by Eric Blake
parent d2e9b78162
commit e2e360db7a
2 changed files with 24 additions and 0 deletions

View file

@ -261,5 +261,18 @@ QIOChannelSocket *
qio_channel_socket_accept(QIOChannelSocket *ioc,
Error **errp);
/**
* qio_channel_socket_set_send_buffer:
* @ioc: the socket channel object
* @size: buffer size
* @errp: pointer to a NULL-initialized error object
*
* Set the underlying socket send buffer size.
*
* Retruns: 0 on success, or -1 on error.
*/
int qio_channel_socket_set_send_buffer(QIOChannelSocket *ioc,
size_t size,
Error **errp);
#endif /* QIO_CHANNEL_SOCKET_H */

View file

@ -78,6 +78,17 @@ qio_channel_socket_new(void)
return sioc;
}
int qio_channel_socket_set_send_buffer(QIOChannelSocket *ioc,
size_t size,
Error **errp)
{
if (setsockopt(ioc->fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)) < 0) {
error_setg_errno(errp, errno, "Unable to set socket send buffer size");
return -1;
}
return 0;
}
static int
qio_channel_socket_set_fd(QIOChannelSocket *sioc,