From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: [PATCH 11/33] rust: remove unused global qemu "allocator"
Date: Mon, 8 Sep 2025 12:49:43 +0200 [thread overview]
Message-ID: <20250908105005.2119297-12-pbonzini@redhat.com> (raw)
In-Reply-To: <20250908105005.2119297-1-pbonzini@redhat.com>
From: Marc-André Lureau <marcandre.lureau@redhat.com>
The global allocator has always been disabled. There is no clear reason
Rust and C should use the same allocator. Allocations made from Rust
must be freed by Rust, and same for C, otherwise we head into troubles.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Link: https://lore.kernel.org/r/20250827104147.717203-3-marcandre.lureau@redhat.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
meson.build | 4 --
rust/Cargo.toml | 2 +-
rust/qemu-api/Cargo.toml | 1 -
rust/qemu-api/meson.build | 1 -
rust/qemu-api/src/lib.rs | 135 --------------------------------------
5 files changed, 1 insertion(+), 142 deletions(-)
diff --git a/meson.build b/meson.build
index ef3f52b951d..49395197f44 100644
--- a/meson.build
+++ b/meson.build
@@ -1090,9 +1090,6 @@ glib = declare_dependency(dependencies: [glib_pc, gmodule],
# TODO: remove this check and the corresponding workaround (qtree) when
# the minimum supported glib is >= 2.75.3
glib_has_gslice = glib.version().version_compare('<2.75.3')
-# Check whether glib has the aligned_alloc family of functions.
-# <https://docs.gtk.org/glib/func.aligned_alloc.html>
-glib_has_aligned_alloc = glib.version().version_compare('>=2.72.0')
# override glib dep to include the above refinements
meson.override_dependency('glib-2.0', glib)
@@ -2706,7 +2703,6 @@ config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
-config_host_data.set('HAVE_GLIB_WITH_ALIGNED_ALLOC', glib_has_aligned_alloc)
config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul', prefix: osdep_prefix))
config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
diff --git a/rust/Cargo.toml b/rust/Cargo.toml
index 9b26aa07cec..d98d2b77026 100644
--- a/rust/Cargo.toml
+++ b/rust/Cargo.toml
@@ -23,7 +23,7 @@ libc = "0.2.162"
[workspace.lints.rust]
unexpected_cfgs = { level = "deny", check-cfg = [
- 'cfg(MESON)', 'cfg(HAVE_GLIB_WITH_ALIGNED_ALLOC)',
+ 'cfg(MESON)',
] }
# Occasionally, we may need to silence warnings and clippy lints that
diff --git a/rust/qemu-api/Cargo.toml b/rust/qemu-api/Cargo.toml
index c07a17a28b0..c5ed78035b6 100644
--- a/rust/qemu-api/Cargo.toml
+++ b/rust/qemu-api/Cargo.toml
@@ -21,7 +21,6 @@ libc = { workspace = true }
[features]
default = ["debug_cell"]
-allocator = []
debug_cell = []
[lints]
diff --git a/rust/qemu-api/meson.build b/rust/qemu-api/meson.build
index a090297c458..062009f1618 100644
--- a/rust/qemu-api/meson.build
+++ b/rust/qemu-api/meson.build
@@ -2,7 +2,6 @@ _qemu_api_cfg = run_command(rustc_args,
'--config-headers', config_host_h, '--features', files('Cargo.toml'),
capture: true, check: true).stdout().strip().splitlines()
-# _qemu_api_cfg += ['--cfg', 'feature="allocator"']
if get_option('debug_mutex')
_qemu_api_cfg += ['--cfg', 'feature="debug_cell"']
endif
diff --git a/rust/qemu-api/src/lib.rs b/rust/qemu-api/src/lib.rs
index bcb51c7986a..daa2493bb69 100644
--- a/rust/qemu-api/src/lib.rs
+++ b/rust/qemu-api/src/lib.rs
@@ -36,139 +36,4 @@
// crate).
extern crate self as qemu_api;
-use std::{
- alloc::{GlobalAlloc, Layout},
- ffi::c_void,
-};
-
pub use error::{Error, Result};
-
-#[cfg(HAVE_GLIB_WITH_ALIGNED_ALLOC)]
-extern "C" {
- fn g_aligned_alloc0(
- n_blocks: bindings::gsize,
- n_block_bytes: bindings::gsize,
- alignment: bindings::gsize,
- ) -> bindings::gpointer;
- fn g_aligned_free(mem: bindings::gpointer);
-}
-
-#[cfg(not(HAVE_GLIB_WITH_ALIGNED_ALLOC))]
-extern "C" {
- fn qemu_memalign(alignment: usize, size: usize) -> *mut c_void;
- fn qemu_vfree(ptr: *mut c_void);
-}
-
-extern "C" {
- fn g_malloc0(n_bytes: bindings::gsize) -> bindings::gpointer;
- fn g_free(mem: bindings::gpointer);
-}
-
-/// An allocator that uses the same allocator as QEMU in C.
-///
-/// It is enabled by default with the `allocator` feature.
-///
-/// To set it up manually as a global allocator in your crate:
-///
-/// ```ignore
-/// use qemu_api::QemuAllocator;
-///
-/// #[global_allocator]
-/// static GLOBAL: QemuAllocator = QemuAllocator::new();
-/// ```
-#[derive(Clone, Copy, Debug)]
-#[repr(C)]
-pub struct QemuAllocator {
- _unused: [u8; 0],
-}
-
-#[cfg_attr(all(feature = "allocator", not(test)), global_allocator)]
-pub static GLOBAL: QemuAllocator = QemuAllocator::new();
-
-impl QemuAllocator {
- // From the glibc documentation, on GNU systems, malloc guarantees 16-byte
- // alignment on 64-bit systems and 8-byte alignment on 32-bit systems. See
- // https://www.gnu.org/software/libc/manual/html_node/Malloc-Examples.html.
- // This alignment guarantee also applies to Windows and Android. On Darwin
- // and OpenBSD, the alignment is 16 bytes on both 64-bit and 32-bit systems.
- #[cfg(all(
- target_pointer_width = "32",
- not(any(target_os = "macos", target_os = "openbsd"))
- ))]
- pub const DEFAULT_ALIGNMENT_BYTES: Option<usize> = Some(8);
- #[cfg(all(
- target_pointer_width = "64",
- not(any(target_os = "macos", target_os = "openbsd"))
- ))]
- pub const DEFAULT_ALIGNMENT_BYTES: Option<usize> = Some(16);
- #[cfg(all(
- any(target_pointer_width = "32", target_pointer_width = "64"),
- any(target_os = "macos", target_os = "openbsd")
- ))]
- pub const DEFAULT_ALIGNMENT_BYTES: Option<usize> = Some(16);
- #[cfg(not(any(target_pointer_width = "32", target_pointer_width = "64")))]
- pub const DEFAULT_ALIGNMENT_BYTES: Option<usize> = None;
-
- pub const fn new() -> Self {
- Self { _unused: [] }
- }
-}
-
-impl Default for QemuAllocator {
- fn default() -> Self {
- Self::new()
- }
-}
-
-// Sanity check.
-const _: [(); 8] = [(); ::core::mem::size_of::<*mut c_void>()];
-
-unsafe impl GlobalAlloc for QemuAllocator {
- unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
- if matches!(Self::DEFAULT_ALIGNMENT_BYTES, Some(default) if default.checked_rem(layout.align()) == Some(0))
- {
- // SAFETY: g_malloc0() is safe to call.
- unsafe { g_malloc0(layout.size().try_into().unwrap()).cast::<u8>() }
- } else {
- #[cfg(HAVE_GLIB_WITH_ALIGNED_ALLOC)]
- {
- // SAFETY: g_aligned_alloc0() is safe to call.
- unsafe {
- g_aligned_alloc0(
- layout.size().try_into().unwrap(),
- 1,
- layout.align().try_into().unwrap(),
- )
- .cast::<u8>()
- }
- }
- #[cfg(not(HAVE_GLIB_WITH_ALIGNED_ALLOC))]
- {
- // SAFETY: qemu_memalign() is safe to call.
- unsafe { qemu_memalign(layout.align(), layout.size()).cast::<u8>() }
- }
- }
- }
-
- unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
- if matches!(Self::DEFAULT_ALIGNMENT_BYTES, Some(default) if default.checked_rem(layout.align()) == Some(0))
- {
- // SAFETY: `ptr` must have been allocated by Self::alloc thus a valid
- // glib-allocated pointer, so `g_free`ing is safe.
- unsafe { g_free(ptr.cast::<_>()) }
- } else {
- #[cfg(HAVE_GLIB_WITH_ALIGNED_ALLOC)]
- {
- // SAFETY: `ptr` must have been allocated by Self::alloc thus a valid aligned
- // glib-allocated pointer, so `g_aligned_free`ing is safe.
- unsafe { g_aligned_free(ptr.cast::<_>()) }
- }
- #[cfg(not(HAVE_GLIB_WITH_ALIGNED_ALLOC))]
- {
- // SAFETY: `ptr` must have been allocated by Self::alloc thus a valid aligned
- // glib-allocated pointer, so `qemu_vfree`ing is safe.
- unsafe { qemu_vfree(ptr.cast::<_>()) }
- }
- }
- }
-}
--
2.51.0
next prev parent reply other threads:[~2025-09-08 11:00 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-08 10:49 [PATCH 00/33] First Rust update for QEMU 10.2 Paolo Bonzini
2025-09-08 10:49 ` [PATCH 01/33] ci: temporarily remove rust from Debian and Ubuntu Paolo Bonzini
2025-09-11 3:14 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 03/33] meson, cargo: require Rust 1.83.0 Paolo Bonzini
2025-09-11 3:19 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 04/33] rust: add missing const markers for MSRV==1.83.0 Paolo Bonzini
2025-09-11 3:20 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 05/33] rust: use inline const expressions Paolo Bonzini
2025-09-11 6:15 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 06/33] rust: add qdev Device derive macro Paolo Bonzini
2025-09-11 6:58 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 07/33] rust: vmstate: convert to use builder pattern Paolo Bonzini
2025-09-08 10:49 ` [PATCH 08/33] rust: vmstate: use const_refs_to_static Paolo Bonzini
2025-09-11 10:07 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 09/33] rust: qdev: const_refs_to_static Paolo Bonzini
2025-09-11 10:20 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 10/33] docs/rust: update msrv Paolo Bonzini
2025-09-11 10:21 ` Zhao Liu
2025-09-08 10:49 ` Paolo Bonzini [this message]
2025-09-11 10:21 ` [PATCH 11/33] rust: remove unused global qemu "allocator" Zhao Liu
2025-09-08 10:49 ` [PATCH 12/33] rust: add workspace authors Paolo Bonzini
2025-09-11 10:23 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 13/33] rust: move vmstate_clock!() to qdev module Paolo Bonzini
2025-09-11 10:25 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 14/33] rust: move VMState handling to QOM module Paolo Bonzini
2025-09-11 10:26 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 15/33] rust: move Cell vmstate impl Paolo Bonzini
2025-09-11 10:31 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 16/33] rust: split Rust-only "common" crate Paolo Bonzini
2025-09-11 10:44 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 17/33] rust: make build.rs generic over various ./rust/projects Paolo Bonzini
2025-09-12 7:43 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 18/33] rust: split "util" crate Paolo Bonzini
2025-09-12 8:00 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 19/33] rust: split "migration" crate Paolo Bonzini
2025-09-12 8:09 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 20/33] rust: split "bql" crate Paolo Bonzini
2025-09-12 8:31 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 21/33] rust: split "qom" crate Paolo Bonzini
2025-09-08 10:49 ` [PATCH 22/33] rust: split "chardev" crate Paolo Bonzini
2025-09-12 8:35 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 23/33] rust: split "system" crate Paolo Bonzini
2025-09-12 8:38 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 24/33] rust: split "hwcore" crate Paolo Bonzini
2025-09-12 8:41 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 25/33] rust: rename qemu_api_macros -> qemu_macros Paolo Bonzini
2025-09-12 8:41 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 26/33] rust/hpet: drop now unneeded qemu_api dep Paolo Bonzini
2025-09-12 8:42 ` Zhao Liu
2025-09-08 10:49 ` [PATCH 27/33] rust/pl011: drop dependency on qemu_api Paolo Bonzini
2025-09-12 8:45 ` Zhao Liu
2025-09-08 10:50 ` [PATCH 28/33] rust: repurpose qemu_api -> tests Paolo Bonzini
2025-09-12 8:57 ` Zhao Liu
2025-09-08 10:50 ` [PATCH 29/33] rust: re-export qemu_macros internal helper in "bits" Paolo Bonzini
2025-09-12 9:01 ` Zhao Liu
2025-09-08 10:50 ` [PATCH 30/33] rust: re-export qemu macros from common/qom/hwcore Paolo Bonzini
2025-09-12 9:03 ` Zhao Liu
2025-09-08 10:50 ` [PATCH 31/33] docs: update rust.rst Paolo Bonzini
2025-09-12 9:13 ` Zhao Liu
2025-09-08 10:50 ` [PATCH 32/33] rust: meson: remove unnecessary complication in device crates Paolo Bonzini
2025-09-12 9:20 ` Zhao Liu
2025-09-08 10:50 ` [PATCH 33/33] rust: do not inline do_init_io Paolo Bonzini
2025-09-12 9:21 ` Zhao Liu
[not found] ` <20250908105005.2119297-3-pbonzini@redhat.com>
2025-09-11 3:17 ` [PATCH 02/33] configure: bump Meson to 1.9.0 for use with Rust Zhao Liu
2025-09-11 10:04 ` [PATCH 00/33] First Rust update for QEMU 10.2 Peter Maydell
2025-09-11 11:18 ` Marc-André Lureau
2025-09-12 7:42 ` Zhao Liu
2025-09-12 8:47 ` Marc-André Lureau
2025-09-15 14:27 ` Paolo Bonzini
2025-09-15 17:51 ` Daniel P. Berrangé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250908105005.2119297-12-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).