summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChen Guanqiao <chen.chenchacha@foxmail.com>2024-10-02 07:10:21 +0200
committerLuca Boccassi <luca.boccassi@gmail.com>2024-10-08 23:36:59 +0200
commit00ad3f02275b507a753495ace5e5f84cb38b604d (patch)
treedceb7c06540b440d04857f53ac20490058ec796e
parentMerge pull request #34675 from poettering/dupfd-query (diff)
downloadsystemd-00ad3f02275b507a753495ace5e5f84cb38b604d.tar.xz
systemd-00ad3f02275b507a753495ace5e5f84cb38b604d.zip
mount: optimize mountinfo traversal by decoupling device discovery
In mount_load_proc_self_mountinfo(), device_found_node() is synchronously called during the traversal of mountinfo entries. When there are a large number of mount points, and the device types are not significantly different, this results in excessive time consumption during device discovery, causing a performance bottleneck. This issue is particularly prominent on servers with a large number of cores in IDC. This patch decouples device discovery from the mountinfo traversal process, avoiding redundant device operations. As a result, it significantly improves performance, especially in environments with numerous mount points. Signed-off-by: Chen Guanqiao <chen.chenchacha@foxmail.com>
-rw-r--r--src/core/mount.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/core/mount.c b/src/core/mount.c
index 28701df231..5261b80957 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -1857,6 +1857,7 @@ static int mount_setup_unit(
static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
_cleanup_(mnt_free_tablep) struct libmnt_table *table = NULL;
_cleanup_(mnt_free_iterp) struct libmnt_iter *iter = NULL;
+ _cleanup_set_free_ Set *devices = NULL;
int r;
assert(m);
@@ -1883,7 +1884,11 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
if (!device || !path)
continue;
- device_found_node(m, device, DEVICE_FOUND_MOUNT, DEVICE_FOUND_MOUNT);
+ /* Just to achieve device name uniqueness. Note that the suppresion of the duplicate
+ * processing is merely an optimization, hence in case of OOM (unlikely) we'll just process
+ * it twice. */
+ if (set_put_strdup_full(&devices, &path_hash_ops_free, device) != 0)
+ device_found_node(m, device, DEVICE_FOUND_MOUNT, DEVICE_FOUND_MOUNT);
(void) mount_setup_unit(m, device, path, options, fstype, set_flags);
}