From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Juraj Marcin <jmarcin@redhat.com>
Cc: qemu-devel@nongnu.org, vsementsov@yandex-team.ru,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH v3 5/5] utils/qemu-sockets: Introduce inet socket options controlling TCP keep-alive
Date: Fri, 11 Apr 2025 14:54:29 +0100 [thread overview]
Message-ID: <Z_kfFTiGkK0dC73f@redhat.com> (raw)
In-Reply-To: <20250408112508.1638722-6-jmarcin@redhat.com>
On Tue, Apr 08, 2025 at 01:25:04PM +0200, Juraj Marcin wrote:
> From: Juraj Marcin <jmarcin@redhat.com>
>
> With the default TCP stack configuration, it could be even 2 hours
> before the connection times out due to the other side not being
> reachable. However, in some cases, the application needs to be aware of
> a connection issue much sooner.
>
> This is the case, for example, for postcopy live migration. If there is
> no traffic from the migration destination guest (server-side) to the
> migration source guest (client-side), the destination keeps waiting for
> pages indefinitely and does not switch to the postcopy-paused state.
> This can happen, for example, if the destination QEMU instance is
> started with the '-S' command line option and the machine is not started
> yet, or if the machine is idle and produces no new page faults for
> not-yet-migrated pages.
>
> This patch introduces new inet socket parameters that control count,
> idle period, and interval of TCP keep-alive packets before the
> connection is considered broken. These parameters are available on
> systems where the respective TCP socket options are defined
> (TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL).
>
> The default value for all is 0, which means the system configuration is
> used.
>
> Signed-off-by: Juraj Marcin <jmarcin@redhat.com>
> ---
> meson.build | 6 ++++
> qapi/sockets.json | 15 ++++++++
> util/qemu-sockets.c | 88 +++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 109 insertions(+)
>
> diff --git a/meson.build b/meson.build
> index 41f68d3806..680f47cf42 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -2734,6 +2734,12 @@ if linux_io_uring.found()
> config_host_data.set('HAVE_IO_URING_PREP_WRITEV2',
> cc.has_header_symbol('liburing.h', 'io_uring_prep_writev2'))
> endif
> +config_host_data.set('HAVE_TCP_KEEPCNT',
> + cc.has_header_symbol('netinet/tcp.h', 'TCP_KEEPCN'T))
> +config_host_data.set('HAVE_TCP_KEEPIDLE',
> + cc.has_header_symbol('netinet/tcp.h', 'TCP_KEEPIDLE'))
> +config_host_data.set('HAVE_TCP_KEEPINTVL',
> + cc.has_header_symbol('netinet/tcp.h', 'TCP_KEEPINTVL'))
What platforms are you aware of that do NOT have these
settings available ? I'm wondering if we can just assume
they always exist.
>
> # has_member
> config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
> diff --git a/qapi/sockets.json b/qapi/sockets.json
> index 62797cd027..bb9d298635 100644
> --- a/qapi/sockets.json
> +++ b/qapi/sockets.json
> @@ -59,6 +59,18 @@
> # @keep-alive: enable keep-alive when connecting to/listening on this socket.
> # (Since 4.2, not supported for listening sockets until 10.1)
> #
> +# @keep-alive-count: number of keep-alive packets sent before the connection is
> +# closed. Only supported for TCP sockets on systems where TCP_KEEPCNT
> +# socket option is defined. (Since 10.1)
> +#
> +# @keep-alive-idle: time in seconds the connection needs to be idle before
> +# sending a keepalive packet. Only supported for TCP sockets on systems
> +# where TCP_KEEPIDLE socket option is defined. (Since 10.1)
> +#
> +# @keep-alive-interval: time in secods between keep-alive packets. Only
Trivial typo s/secods/seconds/
> +# supported for TCP sockets on systems where TCP_KEEPINTVL is defined.
> +# (Since 10.1)
> +#
> # @mptcp: enable multi-path TCP. (Since 6.1)
> #
> # Since: 1.3
> @@ -71,6 +83,9 @@
> '*ipv4': 'bool',
> '*ipv6': 'bool',
> '*keep-alive': 'bool',
> + '*keep-alive-count': { 'type': 'uint32', 'if': 'HAVE_TCP_KEEPCNT' },
> + '*keep-alive-idle': { 'type': 'uint32', 'if': 'HAVE_TCP_KEEPIDLE' },
> + '*keep-alive-interval': { 'type': 'uint32', 'if': 'HAVE_TCP_KEEPINTVL' },
> '*mptcp': { 'type': 'bool', 'if': 'HAVE_IPPROTO_MPTCP' } } }
>
> ##
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2025-04-11 13:55 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-08 11:24 [PATCH v3 0/5] util/qemu-sockets: Introduce inet socket options controlling TCP keep-alive Juraj Marcin
2025-04-08 11:25 ` [PATCH v3 1/5] io: Fix partial struct copy in qio_dns_resolver_lookup_sync_inet() Juraj Marcin
2025-04-11 10:38 ` Daniel P. Berrangé
2025-04-08 11:25 ` [PATCH v3 2/5] util/qemu-sockets: Refactor setting client sockopts into a separate function Juraj Marcin
2025-04-11 10:40 ` Daniel P. Berrangé
2025-04-08 11:25 ` [PATCH v3 3/5] util/qemu-sockets: Refactor success and failure paths in inet_listen_saddr() Juraj Marcin
2025-04-11 13:47 ` Daniel P. Berrangé
2025-04-08 11:25 ` [PATCH v3 4/5] util/qemu-sockets: Add support for keep-alive flag to passive sockets Juraj Marcin
2025-04-11 13:49 ` Daniel P. Berrangé
2025-04-08 11:25 ` [PATCH v3 5/5] utils/qemu-sockets: Introduce inet socket options controlling TCP keep-alive Juraj Marcin
2025-04-11 13:54 ` Daniel P. Berrangé [this message]
2025-04-11 15:49 ` Daniel P. Berrangé
2025-04-30 14:47 ` Juraj Marcin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z_kfFTiGkK0dC73f@redhat.com \
--to=berrange@redhat.com \
--cc=jmarcin@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@yandex-team.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.