diff options
author | Luca Boccassi <bluca@debian.org> | 2023-10-02 23:59:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-02 23:59:07 +0200 |
commit | 88671227832c684737c5414c81a190d7c0685249 (patch) | |
tree | 88d31dc056d75f6332c54cbfda7e0b7a0ad75e89 /src/libsystemd | |
parent | udevadm: avoid side-effect in assert() (diff) | |
parent | sd-netlink: make the default timeout configurable by environment variable (diff) | |
download | systemd-88671227832c684737c5414c81a190d7c0685249.tar.xz systemd-88671227832c684737c5414c81a190d7c0685249.zip |
Merge pull request #29390 from yuwata/sd-netlink-make-default-timeout-configurable
sd-netlink: make the default timeout configurable
Diffstat (limited to 'src/libsystemd')
-rw-r--r-- | src/libsystemd/sd-netlink/netlink-slot.c | 2 | ||||
-rw-r--r-- | src/libsystemd/sd-netlink/sd-netlink.c | 45 |
2 files changed, 27 insertions, 20 deletions
diff --git a/src/libsystemd/sd-netlink/netlink-slot.c b/src/libsystemd/sd-netlink/netlink-slot.c index b237db3c2f..d85d2cd2f4 100644 --- a/src/libsystemd/sd-netlink/netlink-slot.c +++ b/src/libsystemd/sd-netlink/netlink-slot.c @@ -63,7 +63,7 @@ void netlink_slot_disconnect(sd_netlink_slot *slot, bool unref) { case NETLINK_REPLY_CALLBACK: (void) hashmap_remove(nl->reply_callbacks, &slot->reply_callback.serial); - if (slot->reply_callback.timeout != 0) + if (slot->reply_callback.timeout != USEC_INFINITY) prioq_remove(nl->reply_callbacks_prioq, &slot->reply_callback, &slot->reply_callback.prioq_idx); break; diff --git a/src/libsystemd/sd-netlink/sd-netlink.c b/src/libsystemd/sd-netlink/sd-netlink.c index ce0687eb57..d3c906de15 100644 --- a/src/libsystemd/sd-netlink/sd-netlink.c +++ b/src/libsystemd/sd-netlink/sd-netlink.c @@ -215,7 +215,6 @@ static int process_timeout(sd_netlink *nl) { return r; assert_se(prioq_pop(nl->reply_callbacks_prioq) == c); - c->timeout = 0; hashmap_remove(nl->reply_callbacks, UINT32_TO_PTR(c->serial)); slot = container_of(c, sd_netlink_slot, reply_callback); @@ -248,10 +247,8 @@ static int process_reply(sd_netlink *nl, sd_netlink_message *m) { if (!c) return 0; - if (c->timeout != 0) { + if (c->timeout != USEC_INFINITY) prioq_remove(nl->reply_callbacks_prioq, c, &c->prioq_idx); - c->timeout = 0; - } r = sd_netlink_message_get_type(m, &type); if (r < 0) @@ -380,12 +377,28 @@ int sd_netlink_process(sd_netlink *nl, sd_netlink_message **ret) { return r; } -static usec_t calc_elapse(uint64_t usec) { - if (usec == UINT64_MAX) - return 0; +static usec_t timespan_to_timestamp(usec_t usec) { + static bool default_timeout_set = false; + static usec_t default_timeout; + int r; + + if (usec == 0) { + if (!default_timeout_set) { + const char *e; + + default_timeout_set = true; + default_timeout = NETLINK_DEFAULT_TIMEOUT_USEC; + + e = getenv("SYSTEMD_NETLINK_DEFAULT_TIMEOUT"); + if (e) { + r = parse_sec(e, &default_timeout); + if (r < 0) + log_debug_errno(r, "sd-netlink: Failed to parse $SYSTEMD_NETLINK_DEFAULT_TIMEOUT environment variable, ignoring: %m"); + } + } - if (usec == 0) - usec = NETLINK_DEFAULT_TIMEOUT_USEC; + usec = default_timeout; + } return usec_add(now(CLOCK_MONOTONIC), usec); } @@ -442,12 +455,6 @@ int sd_netlink_wait(sd_netlink *nl, uint64_t timeout_usec) { static int timeout_compare(const void *a, const void *b) { const struct reply_callback *x = a, *y = b; - if (x->timeout != 0 && y->timeout == 0) - return -1; - - if (x->timeout == 0 && y->timeout != 0) - return 1; - return CMP(x->timeout, y->timeout); } @@ -487,7 +494,7 @@ int sd_netlink_call_async( return r; slot->reply_callback.callback = callback; - slot->reply_callback.timeout = calc_elapse(usec); + slot->reply_callback.timeout = timespan_to_timestamp(usec); k = sd_netlink_send(nl, m, &slot->reply_callback.serial); if (k < 0) @@ -497,7 +504,7 @@ int sd_netlink_call_async( if (r < 0) return r; - if (slot->reply_callback.timeout != 0) { + if (slot->reply_callback.timeout != USEC_INFINITY) { r = prioq_put(nl->reply_callbacks_prioq, &slot->reply_callback, &slot->reply_callback.prioq_idx); if (r < 0) { (void) hashmap_remove(nl->reply_callbacks, UINT32_TO_PTR(slot->reply_callback.serial)); @@ -528,7 +535,7 @@ int sd_netlink_read( assert_return(nl, -EINVAL); assert_return(!netlink_pid_changed(nl), -ECHILD); - timeout = calc_elapse(usec); + timeout = timespan_to_timestamp(usec); for (;;) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL; @@ -567,7 +574,7 @@ int sd_netlink_read( /* received message, so try to process straight away */ continue; - if (timeout > 0) { + if (timeout != USEC_INFINITY) { usec_t n; n = now(CLOCK_MONOTONIC); |