From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id A7EA61FF13F for ; Thu, 12 Mar 2026 14:53:15 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id F413C17385; Thu, 12 Mar 2026 14:53:11 +0100 (CET) From: Lukas Wagner To: pdm-devel@lists.proxmox.com Subject: [PATCH proxmox 01/26] sys: procfs: don't read from sysfs during unit tests Date: Thu, 12 Mar 2026 14:52:02 +0100 Message-ID: <20260312135229.420729-2-l.wagner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260312135229.420729-1-l.wagner@proxmox.com> References: <20260312135229.420729-1-l.wagner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1773323521764 X-SPAM-LEVEL: Spam detection results: 0 AWL -1.018 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_MSPIKE_H2 0.001 Average reputation (+2) RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.408 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.819 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.903 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: TMYIDOZ64ICUV7XBBQO54ELT72CJISLX X-Message-ID-Hash: TMYIDOZ64ICUV7XBBQO54ELT72CJISLX X-MailFrom: l.wagner@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: When running tests in sbuild, /sys/kernel/mm/ksm/pages_sharing cannot be read; the test fails with a 'permission denied' error. To solve this, we move reading the file to the caller, allowing us to provide a static string an input during the test. Signed-off-by: Lukas Wagner --- proxmox-sys/src/linux/procfs/mod.rs | 30 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/proxmox-sys/src/linux/procfs/mod.rs b/proxmox-sys/src/linux/procfs/mod.rs index 202b6a45..d399cdc3 100644 --- a/proxmox-sys/src/linux/procfs/mod.rs +++ b/proxmox-sys/src/linux/procfs/mod.rs @@ -434,10 +434,16 @@ pub fn read_meminfo() -> Result { let path = "/proc/meminfo"; let meminfo_str = std::fs::read_to_string(path)?; - parse_proc_meminfo(&meminfo_str) + + let pages_sharing = match read_firstline("/sys/kernel/mm/ksm/pages_sharing") { + Ok(p) => Some(p), + Err(err) if err.kind() == std::io::ErrorKind::NotFound => None, + Err(err) => bail!("unable to get KSM pages_sharing - {err}"), + }; + parse_proc_meminfo(&meminfo_str, pages_sharing.as_deref()) } -fn parse_proc_meminfo(text: &str) -> Result { +fn parse_proc_meminfo(text: &str, pages_sharing: Option<&str>) -> Result { let mut meminfo = ProcFsMemInfo { memtotal: 0, memfree: 0, @@ -471,10 +477,9 @@ fn parse_proc_meminfo(text: &str) -> Result { meminfo.swapused = meminfo.swaptotal - meminfo.swapfree; - meminfo.memshared = match read_firstline("/sys/kernel/mm/ksm/pages_sharing") { - Ok(spages_line) => spages_line.trim_end().parse::()? * 4096, - Err(err) if err.kind() == std::io::ErrorKind::NotFound => 0, - Err(err) => bail!("unable to get KSM pages_sharing - {err}"), + meminfo.memshared = match pages_sharing { + Some(pages_sharing) => pages_sharing.trim_end().parse::()? * 4096, + None => 0, }; Ok(meminfo) @@ -482,8 +487,7 @@ fn parse_proc_meminfo(text: &str) -> Result { #[test] fn test_read_proc_meminfo() { - let meminfo = parse_proc_meminfo( - "MemTotal: 32752584 kB + let proc_meminfo = "MemTotal: 32752584 kB MemFree: 2106048 kB MemAvailable: 13301592 kB Buffers: 0 kB @@ -538,9 +542,14 @@ Hugetlb: 0 kB DirectMap4k: 237284 kB DirectMap2M: 13281280 kB DirectMap1G: 22020096 kB +"; + + let pages_sharing = Some( + "2 ", - ) - .expect("successful parsed a sample /proc/meminfo entry"); + ); + let meminfo = parse_proc_meminfo(proc_meminfo, pages_sharing) + .expect("successful parsed a sample /proc/meminfo entry"); assert_eq!(meminfo.memtotal, 33538646016); assert_eq!(meminfo.memused, 19917815808); @@ -549,6 +558,7 @@ DirectMap1G: 22020096 kB assert_eq!(meminfo.swapfree, 2048); assert_eq!(meminfo.swaptotal, 3072); assert_eq!(meminfo.swapused, 1024); + assert_eq!(meminfo.memshared, 8192); } #[derive(Clone, Debug)] -- 2.47.3