all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH backup] config: don't manually track padding size
@ 2022-03-03 14:00 Wolfgang Bumiller
  2022-03-10 10:15 ` [pbs-devel] applied: " Thomas Lamprecht
  0 siblings, 1 reply; 2+ messages in thread
From: Wolfgang Bumiller @ 2022-03-03 14:00 UTC (permalink / raw)
  To: pbs-devel

make ConfigVersionCacheData a #[repr(C)] union to fix its
size and let it transparently `Deref{,Mut}` to its actual
contents

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
---
 pbs-config/src/config_version_cache.rs | 34 ++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/pbs-config/src/config_version_cache.rs b/pbs-config/src/config_version_cache.rs
index 39a433ed..958ae457 100644
--- a/pbs-config/src/config_version_cache.rs
+++ b/pbs-config/src/config_version_cache.rs
@@ -1,7 +1,7 @@
 use std::path::Path;
 use std::sync::Arc;
 use std::sync::atomic::{AtomicUsize, Ordering};
-use std::mem::MaybeUninit;
+use std::mem::{MaybeUninit, ManuallyDrop};
 
 use anyhow::{bail, Error};
 use once_cell::sync::OnceCell;
@@ -18,7 +18,7 @@ use proxmox_shared_memory::*;
 
 #[derive(Debug)]
 #[repr(C)]
-struct ConfigVersionCacheData {
+struct ConfigVersionCacheDataInner {
     magic: [u8; 8],
     // User (user.cfg) cache generation/version.
     user_cache_generation: AtomicUsize,
@@ -27,11 +27,35 @@ struct ConfigVersionCacheData {
     // datastore (datastore.cfg) generation/version
     datastore_generation: AtomicUsize,
 
-    // Add further atomics here (and reduce padding size)
-
-    padding: [u8; 4096 - 4*8],
+    // Add further atomics here
 }
 
+#[repr(C)]
+union ConfigVersionCacheData {
+    data: ManuallyDrop<ConfigVersionCacheDataInner>,
+    _padding: [u8; 4096],
+}
+
+#[test]
+fn assert_cache_size() {
+    assert_eq!(std::mem::size_of::<ConfigVersionCacheData>(), 4096);
+}
+
+impl std::ops::Deref for ConfigVersionCacheData {
+    type Target = ConfigVersionCacheDataInner;
+
+    #[inline]
+    fn deref(&self) -> &ConfigVersionCacheDataInner {
+        unsafe { &self.data }
+    }
+}
+
+impl std::ops::DerefMut for ConfigVersionCacheData {
+    #[inline]
+    fn deref_mut(&mut self) -> &mut ConfigVersionCacheDataInner {
+        unsafe { &mut self.data }
+    }
+}
 
 impl Init for ConfigVersionCacheData {
     fn initialize(this: &mut MaybeUninit<Self>) {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 2+ messages in thread

* [pbs-devel] applied: [PATCH backup] config: don't manually track padding size
  2022-03-03 14:00 [pbs-devel] [PATCH backup] config: don't manually track padding size Wolfgang Bumiller
@ 2022-03-10 10:15 ` Thomas Lamprecht
  0 siblings, 0 replies; 2+ messages in thread
From: Thomas Lamprecht @ 2022-03-10 10:15 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Wolfgang Bumiller

On 03.03.22 15:00, Wolfgang Bumiller wrote:
> make ConfigVersionCacheData a #[repr(C)] union to fix its
> size and let it transparently `Deref{,Mut}` to its actual
> contents
> 
> Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
> ---
>  pbs-config/src/config_version_cache.rs | 34 ++++++++++++++++++++++----
>  1 file changed, 29 insertions(+), 5 deletions(-)
> 
>

applied, thanks!




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-03-10 10:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-03 14:00 [pbs-devel] [PATCH backup] config: don't manually track padding size Wolfgang Bumiller
2022-03-10 10:15 ` [pbs-devel] applied: " Thomas Lamprecht

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal