Projects
openEuler:24.03:SP1:Everything
systemd
_service:tar_scm:backport-mount-optimize-mounti...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:backport-mount-optimize-mountinfo-traversal-by-decoupling-dev.patch of Package systemd
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
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2