summaryrefslogtreecommitdiff
path: root/backport-mount-optimize-mountinfo-traversal-by-decoupling-dev.patch
diff options
context:
space:
mode:
Diffstat (limited to 'backport-mount-optimize-mountinfo-traversal-by-decoupling-dev.patch')
-rw-r--r--backport-mount-optimize-mountinfo-traversal-by-decoupling-dev.patch50
1 files changed, 50 insertions, 0 deletions
diff --git a/backport-mount-optimize-mountinfo-traversal-by-decoupling-dev.patch b/backport-mount-optimize-mountinfo-traversal-by-decoupling-dev.patch
new file mode 100644
index 0000000..daa0afa
--- /dev/null
+++ b/backport-mount-optimize-mountinfo-traversal-by-decoupling-dev.patch
@@ -0,0 +1,50 @@
+From 00ad3f02275b507a753495ace5e5f84cb38b604d Mon Sep 17 00:00:00 2001
+From: Chen Guanqiao <chen.chenchacha@foxmail.com>
+Date: Wed, 2 Oct 2024 13:10:21 +0800
+Subject: [PATCH] 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>
+---
+ src/core/mount.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+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);
+ }
+--
+2.33.0
+