Skip to content

Commit ef9133a

Browse files
daschinmoy21rbradford
authored andcommitted
vmm: acpi: Take &T instead of &Arc<Mutex<T>>
Refactor ACPI table creation functions to accept borrowed references, removing double indirection and moving locking to callers. Signed-off-by: Chinmoy <daschinmoyy21@gmail.com>
1 parent 7461143 commit ef9133a

3 files changed

Lines changed: 43 additions & 58 deletions

File tree

vmm/src/acpi.rs

Lines changed: 32 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
//
33
// SPDX-License-Identifier: Apache-2.0
44
//
5-
use std::sync::{Arc, Mutex};
65
use std::time::Instant;
76

87
use acpi_tables::Aml;
@@ -192,7 +191,7 @@ bitflags! {
192191

193192
impl MemoryAffinity {
194193
fn from_region(
195-
region: &Arc<GuestRegionMmap>,
194+
region: &GuestRegionMmap,
196195
proximity_domain: u32,
197196
flags: MemAffinityFlags,
198197
) -> Self {
@@ -258,34 +257,33 @@ struct ViotPciRangeNode {
258257
}
259258

260259
pub fn create_dsdt_table(
261-
device_manager: &Arc<Mutex<DeviceManager>>,
262-
cpu_manager: &Arc<Mutex<CpuManager>>,
263-
memory_manager: &Arc<Mutex<MemoryManager>>,
260+
device_manager: &DeviceManager,
261+
cpu_manager: &CpuManager,
262+
memory_manager: &MemoryManager,
264263
) -> Sdt {
265264
trace_scoped!("create_dsdt_table");
266265
// DSDT
267266
let mut dsdt = Sdt::new(*b"DSDT", 36, 6, *b"CLOUDH", *b"CHDSDT ", 1);
268267

269268
let mut bytes = Vec::new();
270269

271-
device_manager.lock().unwrap().to_aml_bytes(&mut bytes);
272-
cpu_manager.lock().unwrap().to_aml_bytes(&mut bytes);
273-
memory_manager.lock().unwrap().to_aml_bytes(&mut bytes);
270+
device_manager.to_aml_bytes(&mut bytes);
271+
cpu_manager.to_aml_bytes(&mut bytes);
272+
memory_manager.to_aml_bytes(&mut bytes);
274273
dsdt.append_slice(&bytes);
275274

276275
dsdt
277276
}
278277

279278
const FACP_DSDT_OFFSET: usize = 140;
280279

281-
fn create_facp_table(dsdt_offset: GuestAddress, device_manager: &Arc<Mutex<DeviceManager>>) -> Sdt {
280+
fn create_facp_table(dsdt_offset: GuestAddress, device_manager: &DeviceManager) -> Sdt {
282281
trace_scoped!("create_facp_table");
283282

284283
// Revision 6 of the ACPI FADT table is 276 bytes long
285284
let mut facp = Sdt::new(*b"FACP", 276, 6, *b"CLOUDH", *b"CHFACP ", 1);
286285

287286
{
288-
let device_manager = device_manager.lock().unwrap();
289287
if let Some(address) = device_manager.acpi_platform_addresses().reset_reg_address {
290288
// RESET_REG
291289
facp.write(116, address);
@@ -369,7 +367,7 @@ fn create_tpm2_table() -> Sdt {
369367

370368
fn create_srat_table(
371369
numa_nodes: &NumaNodes,
372-
device_manager: &Arc<Mutex<DeviceManager>>,
370+
device_manager: &DeviceManager,
373371
#[cfg(target_arch = "x86_64")] topology: Option<(u16, u16, u16, u16)>,
374372
) -> Sdt {
375373
let mut srat = Sdt::new(*b"SRAT", 36, 3, *b"CLOUDH", *b"CHSRAT ", 1);
@@ -381,7 +379,6 @@ fn create_srat_table(
381379
assert_eq!(std::mem::size_of::<MemoryAffinity>(), 40);
382380
// Confirm struct size matches ACPI 6.6 spec
383381
assert_eq!(std::mem::size_of::<GenericInitiatorAffinity>(), 32);
384-
let dm = device_manager.lock().unwrap();
385382
for (node_id, node) in numa_nodes.iter() {
386383
let proximity_domain = *node_id;
387384

@@ -436,7 +433,7 @@ fn create_srat_table(
436433
// Add Generic Initiator Affinity structures for device-only NUMA nodes
437434
if let Some(device_id) = &node.device_id {
438435
// Resolve device_id to guest BDF
439-
if let Some(bdf) = dm.get_device_bdf(device_id) {
436+
if let Some(bdf) = device_manager.get_device_bdf(device_id) {
440437
srat.append(GenericInitiatorAffinity::from_pci_bdf(
441438
bdf,
442439
proximity_domain,
@@ -852,9 +849,9 @@ fn create_viot_table(iommu_bdf: &PciBdf, devices_bdf: &[PciBdf]) -> Sdt {
852849
// * `Vec<u64>` contains a list of table pointers stored in XSDT.
853850
fn create_acpi_tables_internal(
854851
dsdt_addr: GuestAddress,
855-
device_manager: &Arc<Mutex<DeviceManager>>,
856-
cpu_manager: &Arc<Mutex<CpuManager>>,
857-
memory_manager: &Arc<Mutex<MemoryManager>>,
852+
device_manager: &DeviceManager,
853+
cpu_manager: &CpuManager,
854+
memory_manager: &MemoryManager,
858855
numa_nodes: &NumaNodes,
859856
tpm_enabled: bool,
860857
) -> (Rsdp, Vec<u8>, Vec<u64>) {
@@ -876,15 +873,13 @@ fn create_acpi_tables_internal(
876873
// MADT
877874
#[cfg(target_arch = "aarch64")]
878875
let vgic = device_manager
879-
.lock()
880-
.unwrap()
881876
.get_interrupt_controller()
882877
.unwrap()
883878
.lock()
884879
.unwrap()
885880
.get_vgic()
886881
.unwrap();
887-
let madt = cpu_manager.lock().unwrap().create_madt(
882+
let madt = cpu_manager.create_madt(
888883
#[cfg(target_arch = "aarch64")]
889884
vgic,
890885
);
@@ -897,7 +892,7 @@ fn create_acpi_tables_internal(
897892
// PPTT
898893
#[cfg(target_arch = "aarch64")]
899894
{
900-
let pptt = cpu_manager.lock().unwrap().create_pptt();
895+
let pptt = cpu_manager.create_pptt();
901896
let pptt_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap();
902897
tables_bytes.extend_from_slice(pptt.as_slice());
903898
xsdt_table_pointers.push(pptt_addr.0);
@@ -917,7 +912,7 @@ fn create_acpi_tables_internal(
917912
}
918913

919914
// MCFG
920-
let mcfg = create_mcfg_table(device_manager.lock().unwrap().pci_segments());
915+
let mcfg = create_mcfg_table(device_manager.pci_segments());
921916
let mcfg_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap();
922917
tables_bytes.extend_from_slice(mcfg.as_slice());
923918
xsdt_table_pointers.push(mcfg_addr.0);
@@ -928,16 +923,12 @@ fn create_acpi_tables_internal(
928923
#[cfg(target_arch = "aarch64")]
929924
{
930925
let is_serial_on = device_manager
931-
.lock()
932-
.unwrap()
933926
.get_device_info()
934927
.clone()
935928
.contains_key(&(DeviceType::Serial, DeviceType::Serial.to_string()));
936929
let serial_device_addr = arch::layout::LEGACY_SERIAL_MAPPED_IO_START.raw_value();
937930
let serial_device_irq = if is_serial_on {
938931
device_manager
939-
.lock()
940-
.unwrap()
941932
.get_device_info()
942933
.clone()
943934
.get(&(DeviceType::Serial, DeviceType::Serial.to_string()))
@@ -979,7 +970,7 @@ fn create_acpi_tables_internal(
979970
// Only created if the NUMA nodes list is not empty.
980971
if !numa_nodes.is_empty() {
981972
#[cfg(target_arch = "x86_64")]
982-
let topology = cpu_manager.lock().unwrap().get_vcpu_topology();
973+
let topology = cpu_manager.get_vcpu_topology();
983974
// SRAT
984975
let srat = create_srat_table(
985976
numa_nodes,
@@ -1003,7 +994,7 @@ fn create_acpi_tables_internal(
1003994

1004995
#[cfg(target_arch = "aarch64")]
1005996
{
1006-
let iort = create_iort_table(device_manager.lock().unwrap().pci_segments());
997+
let iort = create_iort_table(device_manager.pci_segments());
1007998
let iort_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap();
1008999
tables_bytes.extend_from_slice(iort.as_slice());
10091000
xsdt_table_pointers.push(iort_addr.0);
@@ -1012,8 +1003,7 @@ fn create_acpi_tables_internal(
10121003
}
10131004

10141005
// VIOT
1015-
if let Some((iommu_bdf, devices_bdf)) = device_manager.lock().unwrap().iommu_attached_devices()
1016-
{
1006+
if let Some((iommu_bdf, devices_bdf)) = device_manager.iommu_attached_devices() {
10171007
let viot = create_viot_table(iommu_bdf, devices_bdf);
10181008

10191009
let viot_addr = prev_tbl_addr.checked_add(prev_tbl_len).unwrap();
@@ -1040,9 +1030,9 @@ fn create_acpi_tables_internal(
10401030

10411031
#[cfg(feature = "fw_cfg")]
10421032
pub fn create_acpi_tables_for_fw_cfg(
1043-
device_manager: &Arc<Mutex<DeviceManager>>,
1044-
cpu_manager: &Arc<Mutex<CpuManager>>,
1045-
memory_manager: &Arc<Mutex<MemoryManager>>,
1033+
device_manager: &DeviceManager,
1034+
cpu_manager: &CpuManager,
1035+
memory_manager: &MemoryManager,
10461036
numa_nodes: &NumaNodes,
10471037
tpm_enabled: bool,
10481038
) -> Result<(), crate::vm::Error> {
@@ -1087,8 +1077,6 @@ pub fn create_acpi_tables_for_fw_cfg(
10871077
checksums.push(xsdt_checksum);
10881078

10891079
device_manager
1090-
.lock()
1091-
.unwrap()
10921080
.fw_cfg()
10931081
.expect("fw_cfg must be present")
10941082
.lock()
@@ -1099,9 +1087,9 @@ pub fn create_acpi_tables_for_fw_cfg(
10991087

11001088
pub fn create_acpi_tables(
11011089
guest_mem: &GuestMemoryMmap,
1102-
device_manager: &Arc<Mutex<DeviceManager>>,
1103-
cpu_manager: &Arc<Mutex<CpuManager>>,
1104-
memory_manager: &Arc<Mutex<MemoryManager>>,
1090+
device_manager: &DeviceManager,
1091+
cpu_manager: &CpuManager,
1092+
memory_manager: &MemoryManager,
11051093
numa_nodes: &NumaNodes,
11061094
tpm_enabled: bool,
11071095
) -> GuestAddress {
@@ -1139,9 +1127,9 @@ pub fn create_acpi_tables(
11391127

11401128
#[cfg(feature = "tdx")]
11411129
pub fn create_acpi_tables_tdx(
1142-
device_manager: &Arc<Mutex<DeviceManager>>,
1143-
cpu_manager: &Arc<Mutex<CpuManager>>,
1144-
memory_manager: &Arc<Mutex<MemoryManager>>,
1130+
device_manager: &DeviceManager,
1131+
cpu_manager: &CpuManager,
1132+
memory_manager: &MemoryManager,
11451133
numa_nodes: &NumaNodes,
11461134
) -> Vec<Sdt> {
11471135
// DSDT
@@ -1155,18 +1143,16 @@ pub fn create_acpi_tables_tdx(
11551143
tables.push(create_facp_table(GuestAddress(0), device_manager));
11561144

11571145
// MADT
1158-
tables.push(cpu_manager.lock().unwrap().create_madt());
1146+
tables.push(cpu_manager.create_madt());
11591147

11601148
// MCFG
1161-
tables.push(create_mcfg_table(
1162-
device_manager.lock().unwrap().pci_segments(),
1163-
));
1149+
tables.push(create_mcfg_table(device_manager.pci_segments()));
11641150

11651151
// SRAT and SLIT
11661152
// Only created if the NUMA nodes list is not empty.
11671153
if !numa_nodes.is_empty() {
11681154
#[cfg(target_arch = "x86_64")]
1169-
let topology = cpu_manager.lock().unwrap().get_vcpu_topology();
1155+
let topology = cpu_manager.get_vcpu_topology();
11701156

11711157
// SRAT
11721158
tables.push(create_srat_table(
@@ -1181,8 +1167,7 @@ pub fn create_acpi_tables_tdx(
11811167
}
11821168

11831169
// VIOT
1184-
if let Some((iommu_bdf, devices_bdf)) = device_manager.lock().unwrap().iommu_attached_devices()
1185-
{
1170+
if let Some((iommu_bdf, devices_bdf)) = device_manager.iommu_attached_devices() {
11861171
tables.push(create_viot_table(iommu_bdf, devices_bdf));
11871172
}
11881173

vmm/src/device_manager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,7 +1756,7 @@ impl DeviceManager {
17561756
}
17571757

17581758
#[cfg(target_arch = "aarch64")]
1759-
pub fn get_interrupt_controller(&mut self) -> Option<&Arc<Mutex<gic::Gic>>> {
1759+
pub fn get_interrupt_controller(&self) -> Option<&Arc<Mutex<gic::Gic>>> {
17601760
self.interrupt_controller.as_ref()
17611761
}
17621762

@@ -1793,7 +1793,7 @@ impl DeviceManager {
17931793
}
17941794

17951795
#[cfg(target_arch = "riscv64")]
1796-
pub fn get_interrupt_controller(&mut self) -> Option<&Arc<Mutex<aia::Aia>>> {
1796+
pub fn get_interrupt_controller(&self) -> Option<&Arc<Mutex<aia::Aia>>> {
17971797
self.interrupt_controller.as_ref()
17981798
}
17991799

vmm/src/vm.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2514,9 +2514,9 @@ impl Vm {
25142514
// Loop over the ACPI tables and copy them to the HOB.
25152515

25162516
for acpi_table in crate::acpi::create_acpi_tables_tdx(
2517-
&self.device_manager,
2518-
&self.cpu_manager,
2519-
&self.memory_manager,
2517+
&self.device_manager.lock().unwrap(),
2518+
&self.cpu_manager.lock().unwrap(),
2519+
&self.memory_manager.lock().unwrap(),
25202520
&self.numa_nodes,
25212521
) {
25222522
hob.add_acpi_table(&mem, acpi_table.as_slice())
@@ -2576,9 +2576,9 @@ impl Vm {
25762576
let tpm_enabled = self.config.lock().unwrap().tpm.is_some();
25772577
let rsdp_addr = crate::acpi::create_acpi_tables(
25782578
&mem,
2579-
&self.device_manager,
2580-
&self.cpu_manager,
2581-
&self.memory_manager,
2579+
&self.device_manager.lock().unwrap(),
2580+
&self.cpu_manager.lock().unwrap(),
2581+
&self.memory_manager.lock().unwrap(),
25822582
&self.numa_nodes,
25832583
tpm_enabled,
25842584
);
@@ -2643,9 +2643,9 @@ impl Vm {
26432643
if fw_cfg_config.acpi_tables {
26442644
let tpm_enabled = self.config.lock().unwrap().tpm.is_some();
26452645
crate::acpi::create_acpi_tables_for_fw_cfg(
2646-
&self.device_manager,
2647-
&self.cpu_manager,
2648-
&self.memory_manager,
2646+
&self.device_manager.lock().unwrap(),
2647+
&self.cpu_manager.lock().unwrap(),
2648+
&self.memory_manager.lock().unwrap(),
26492649
&self.numa_nodes,
26502650
tpm_enabled,
26512651
)?;

0 commit comments

Comments
 (0)