summaryrefslogtreecommitdiffstats
path: root/src/libsystemd
diff options
context:
space:
mode:
authorLuca Boccassi <bluca@debian.org>2023-10-02 23:59:07 +0200
committerGitHub <noreply@github.com>2023-10-02 23:59:07 +0200
commit88671227832c684737c5414c81a190d7c0685249 (patch)
tree88d31dc056d75f6332c54cbfda7e0b7a0ad75e89 /src/libsystemd
parentudevadm: avoid side-effect in assert() (diff)
parentsd-netlink: make the default timeout configurable by environment variable (diff)
downloadsystemd-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.c2
-rw-r--r--src/libsystemd/sd-netlink/sd-netlink.c45
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);