Skip to content

Commit 7baf24c

Browse files
authored
network/manager: hash_ops related cleanups (systemd#37121)
2 parents ce921df + 52278e0 commit 7baf24c

File tree

8 files changed

+49
-34
lines changed

8 files changed

+49
-34
lines changed

src/basic/hashmap.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,10 @@ OrderedHashmap* _ordered_hashmap_new(const struct hash_ops *hash_ops HASHMAP_DE
8888
#define hashmap_new(ops) _hashmap_new(ops HASHMAP_DEBUG_SRC_ARGS)
8989
#define ordered_hashmap_new(ops) _ordered_hashmap_new(ops HASHMAP_DEBUG_SRC_ARGS)
9090

91-
#define hashmap_free_and_replace(a, b) \
91+
#define hashmap_free_and_replace(a, b) \
9292
free_and_replace_full(a, b, hashmap_free)
93+
#define ordered_hashmap_free_and_replace(a, b) \
94+
free_and_replace_full(a, b, ordered_hashmap_free)
9395

9496
HashmapBase* _hashmap_free(HashmapBase *h, free_func_t default_free_key, free_func_t default_free_value);
9597
static inline Hashmap* hashmap_free(Hashmap *h) {

src/network/networkd-link.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ static void link_free_engines(Link *link) {
261261
link->radv = sd_radv_unref(link->radv);
262262
}
263263

264-
static Link *link_free(Link *link) {
264+
static Link* link_free(Link *link) {
265265
assert(link);
266266

267267
(void) link_clear_sysctl_shadows(link);
@@ -295,7 +295,7 @@ static Link *link_free(Link *link) {
295295
hashmap_free(link->bound_to_links);
296296
hashmap_free(link->bound_by_links);
297297

298-
set_free_with_destructor(link->slaves, link_unref);
298+
set_free(link->slaves);
299299

300300
network_unref(link->network);
301301

@@ -307,6 +307,11 @@ static Link *link_free(Link *link) {
307307

308308
DEFINE_TRIVIAL_REF_UNREF_FUNC(Link, link, link_free);
309309

310+
DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
311+
link_hash_ops,
312+
void, trivial_hash_func, trivial_compare_func,
313+
Link, link_unref);
314+
310315
int link_get_by_index(Manager *m, int ifindex, Link **ret) {
311316
Link *link;
312317

@@ -985,7 +990,7 @@ static int link_append_to_master(Link *link) {
985990
if (link_get_master(link, &master) < 0)
986991
return 0;
987992

988-
r = set_ensure_put(&master->slaves, NULL, link);
993+
r = set_ensure_put(&master->slaves, &link_hash_ops, link);
989994
if (r <= 0)
990995
return r;
991996

@@ -2746,7 +2751,7 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
27462751
.dns_over_tls_mode = _DNS_OVER_TLS_MODE_INVALID,
27472752
};
27482753

2749-
r = hashmap_ensure_put(&manager->links_by_index, NULL, INT_TO_PTR(link->ifindex), link);
2754+
r = hashmap_ensure_put(&manager->links_by_index, &link_hash_ops, INT_TO_PTR(link->ifindex), link);
27502755
if (r < 0)
27512756
return log_link_debug_errno(link, r, "Failed to store link into manager: %m");
27522757

src/network/networkd-link.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ typedef struct Link {
222222
char **ntp;
223223
} Link;
224224

225+
extern const struct hash_ops link_hash_ops;
226+
225227
typedef int (*link_netlink_message_handler_t)(sd_netlink*, sd_netlink_message*, Link*);
226228

227229
bool link_is_ready_to_configure(Link *link, bool allow_unmanaged);

src/network/networkd-manager.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -672,15 +672,16 @@ Manager* manager_free(Manager *m) {
672672
m->request_queue = ordered_set_free(m->request_queue);
673673
m->remove_request_queue = ordered_set_free(m->remove_request_queue);
674674

675-
m->dirty_links = set_free_with_destructor(m->dirty_links, link_unref);
676675
m->new_wlan_ifindices = set_free(m->new_wlan_ifindices);
676+
677+
m->dirty_links = set_free(m->dirty_links);
677678
m->links_by_name = hashmap_free(m->links_by_name);
678679
m->links_by_hw_addr = hashmap_free(m->links_by_hw_addr);
679680
m->links_by_dhcp_pd_subnet_prefix = hashmap_free(m->links_by_dhcp_pd_subnet_prefix);
680-
m->links_by_index = hashmap_free_with_destructor(m->links_by_index, link_unref);
681+
m->links_by_index = hashmap_free(m->links_by_index);
681682

682683
m->dhcp_pd_subnet_ids = set_free(m->dhcp_pd_subnet_ids);
683-
m->networks = ordered_hashmap_free_with_destructor(m->networks, network_unref);
684+
m->networks = ordered_hashmap_free(m->networks);
684685

685686
/* The same object may be registered with multiple names, and netdev_detach() may drop multiple
686687
* entries. Hence, hashmap_free_with_destructor() cannot be used. */
@@ -691,7 +692,7 @@ Manager* manager_free(Manager *m) {
691692
m->tuntap_fds_by_name = hashmap_free(m->tuntap_fds_by_name);
692693

693694
m->wiphy_by_name = hashmap_free(m->wiphy_by_name);
694-
m->wiphy_by_index = hashmap_free_with_destructor(m->wiphy_by_index, wiphy_free);
695+
m->wiphy_by_index = hashmap_free(m->wiphy_by_index);
695696

696697
ordered_set_free(m->address_pools);
697698

src/network/networkd-network.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@
4444
#include "strv.h"
4545
#include "tclass.h"
4646

47+
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
48+
network_hash_ops,
49+
char, string_hash_func, string_compare_func,
50+
Network, network_unref);
51+
52+
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
53+
stacked_netdevs_hash_ops,
54+
char, string_hash_func, string_compare_func,
55+
NetDev, netdev_unref);
56+
4757
static int network_resolve_netdev_one(Network *network, const char *name, NetDevKind kind, NetDev **ret) {
4858
const char *kind_string;
4959
NetDev *netdev;
@@ -105,14 +115,14 @@ static int network_resolve_stacked_netdevs(Network *network) {
105115
if (network_resolve_netdev_one(network, name, PTR_TO_INT(kind), &netdev) <= 0)
106116
continue;
107117

108-
r = hashmap_ensure_put(&network->stacked_netdevs, &string_hash_ops, netdev->ifname, netdev);
118+
r = hashmap_ensure_put(&network->stacked_netdevs, &stacked_netdevs_hash_ops, netdev->ifname, netdev);
109119
if (r == -ENOMEM)
110120
return log_oom();
111121
if (r < 0)
112122
log_warning_errno(r, "%s: Failed to add NetDev '%s' to network, ignoring: %m",
113123
network->filename, (const char *) name);
114124

115-
netdev = NULL;
125+
TAKE_PTR(netdev);
116126
}
117127

118128
return 0;
@@ -589,7 +599,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
589599
if (r < 0)
590600
return r; /* network_verify() logs internally. */
591601

592-
r = ordered_hashmap_ensure_put(networks, &string_hash_ops, network->name, network);
602+
r = ordered_hashmap_ensure_put(networks, &network_hash_ops, network->name, network);
593603
if (r < 0)
594604
return log_warning_errno(r, "%s: Failed to store configuration into hashmap: %m", filename);
595605

@@ -640,15 +650,15 @@ static bool network_netdev_equal(Network *a, Network *b) {
640650
}
641651

642652
int network_reload(Manager *manager) {
643-
OrderedHashmap *new_networks = NULL;
653+
_cleanup_ordered_hashmap_free_ OrderedHashmap *new_networks = NULL;
644654
Network *n, *old;
645655
int r;
646656

647657
assert(manager);
648658

649659
r = network_load(manager, &new_networks);
650660
if (r < 0)
651-
goto failure;
661+
return r;
652662

653663
ORDERED_HASHMAP_FOREACH(n, new_networks) {
654664
r = network_get_by_name(manager, n->name, &old);
@@ -670,14 +680,13 @@ int network_reload(Manager *manager) {
670680
/* Nothing updated, use the existing Network object, and drop the new one. */
671681
r = ordered_hashmap_replace(new_networks, old->name, old);
672682
if (r < 0)
673-
goto failure;
683+
return r;
674684

675685
network_ref(old);
676686
network_unref(n);
677687
}
678688

679-
ordered_hashmap_free_with_destructor(manager->networks, network_unref);
680-
manager->networks = new_networks;
689+
ordered_hashmap_free_and_replace(manager->networks, new_networks);
681690

682691
r = manager_build_dhcp_pd_subnet_ids(manager);
683692
if (r < 0)
@@ -688,11 +697,6 @@ int network_reload(Manager *manager) {
688697
return r;
689698

690699
return 0;
691-
692-
failure:
693-
ordered_hashmap_free_with_destructor(new_networks, network_unref);
694-
695-
return r;
696700
}
697701

698702
int manager_build_dhcp_pd_subnet_ids(Manager *manager) {
@@ -820,7 +824,7 @@ static Network *network_free(Network *network) {
820824
netdev_unref(network->bridge);
821825
netdev_unref(network->bond);
822826
netdev_unref(network->vrf);
823-
hashmap_free_with_destructor(network->stacked_netdevs, netdev_unref);
827+
hashmap_free(network->stacked_netdevs);
824828

825829
/* static configs */
826830
set_free(network->ipv6_proxy_ndp_addresses);

src/network/networkd-state-file.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -947,8 +947,6 @@ static int link_save(Link *link) {
947947
}
948948

949949
void link_dirty(Link *link) {
950-
int r;
951-
952950
assert(link);
953951
assert(link->manager);
954952

@@ -962,10 +960,9 @@ void link_dirty(Link *link) {
962960
/* Also mark manager dirty as link is dirty */
963961
link->manager->dirty = true;
964962

965-
r = set_ensure_put(&link->manager->dirty_links, NULL, link);
966-
if (r <= 0)
967-
/* Ignore allocation errors and don't take another ref if the link was already dirty */
968-
return;
963+
if (set_ensure_put(&link->manager->dirty_links, &link_hash_ops, link) <= 0)
964+
return; /* Ignore allocation errors and don't take another ref if the link was already dirty */
965+
969966
link_ref(link);
970967
}
971968

src/network/networkd-wiphy.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "udev-util.h"
1313
#include "wifi-util.h"
1414

15-
Wiphy *wiphy_free(Wiphy *w) {
15+
static Wiphy* wiphy_free(Wiphy *w) {
1616
if (!w)
1717
return NULL;
1818

@@ -29,6 +29,13 @@ Wiphy *wiphy_free(Wiphy *w) {
2929
return mfree(w);
3030
}
3131

32+
DEFINE_TRIVIAL_CLEANUP_FUNC(Wiphy*, wiphy_free);
33+
34+
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
35+
wiphy_hash_ops,
36+
void, trivial_hash_func, trivial_compare_func,
37+
Wiphy, wiphy_free);
38+
3239
static int wiphy_new(Manager *manager, sd_netlink_message *message, Wiphy **ret) {
3340
_cleanup_(wiphy_freep) Wiphy *w = NULL;
3441
_cleanup_free_ char *name = NULL;
@@ -56,7 +63,7 @@ static int wiphy_new(Manager *manager, sd_netlink_message *message, Wiphy **ret)
5663
.name = TAKE_PTR(name),
5764
};
5865

59-
r = hashmap_ensure_put(&manager->wiphy_by_index, NULL, UINT32_TO_PTR(w->index), w);
66+
r = hashmap_ensure_put(&manager->wiphy_by_index, &wiphy_hash_ops, UINT32_TO_PTR(w->index), w);
6067
if (r < 0)
6168
return r;
6269

src/network/networkd-wiphy.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ typedef struct Wiphy {
3131
RFKillState rfkill_state;
3232
} Wiphy;
3333

34-
Wiphy *wiphy_free(Wiphy *w);
35-
DEFINE_TRIVIAL_CLEANUP_FUNC(Wiphy*, wiphy_free);
36-
3734
int wiphy_get_by_index(Manager *manager, uint32_t index, Wiphy **ret);
3835
int wiphy_get_by_name(Manager *manager, const char *name, Wiphy **ret);
3936

0 commit comments

Comments
 (0)