Skip to content

Commit dc1b567

Browse files
JBYoshiJonathanWoollett-Light
authored andcommitted
Change interrupt_status to u32
Interrupt statuses are stored as 32-bit values in the system, but as 64-bit values in the snapshots. This commit changes the snapshot type to a u32 to remove those conversions. Signed-off-by: Jonathan Browne <[email protected]>
1 parent fd0a564 commit dc1b567

File tree

14 files changed

+64
-41
lines changed

14 files changed

+64
-41
lines changed

src/vmm/src/device_manager/mmio.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ impl DeviceInfoForFDT for MMIODeviceInfo {
462462

463463
#[cfg(test)]
464464
mod tests {
465-
use std::sync::atomic::AtomicUsize;
465+
use std::sync::atomic::AtomicU32;
466466
use std::sync::Arc;
467467

468468
use utils::eventfd::EventFd;
@@ -541,8 +541,8 @@ mod tests {
541541
&self.interrupt_evt
542542
}
543543

544-
fn interrupt_status(&self) -> Arc<AtomicUsize> {
545-
Arc::new(AtomicUsize::new(0))
544+
fn interrupt_status(&self) -> Arc<AtomicU32> {
545+
Arc::new(AtomicU32::new(0))
546546
}
547547

548548
fn ack_features_by_page(&mut self, page: u32, value: u32) {

src/vmm/src/devices/virtio/balloon/device.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
use std::io::Write;
5-
use std::sync::atomic::AtomicUsize;
5+
use std::sync::atomic::AtomicU32;
66
use std::sync::Arc;
77
use std::time::Duration;
88
use std::{cmp, fmt};
@@ -586,7 +586,7 @@ impl VirtioDevice for Balloon {
586586
&self.irq_trigger.irq_evt
587587
}
588588

589-
fn interrupt_status(&self) -> Arc<AtomicUsize> {
589+
fn interrupt_status(&self) -> Arc<AtomicU32> {
590590
self.irq_trigger.irq_status.clone()
591591
}
592592

src/vmm/src/devices/virtio/balloon/persist.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
//! Defines the structures needed for saving/restoring balloon devices.
55
6-
use std::sync::atomic::AtomicUsize;
6+
use std::sync::atomic::AtomicU32;
77
use std::sync::Arc;
88
use std::time::Duration;
99

@@ -141,7 +141,7 @@ impl Persist<'_> for Balloon {
141141
)
142142
.map_err(|_| Self::Error::QueueRestoreError)?;
143143
balloon.irq_trigger.irq_status =
144-
Arc::new(AtomicUsize::new(state.virtio_state.interrupt_status));
144+
Arc::new(AtomicU32::new(state.virtio_state.interrupt_status));
145145
balloon.avail_features = state.virtio_state.avail_features;
146146
balloon.acked_features = state.virtio_state.acked_features;
147147
balloon.latest_stats = state.latest_stats.create_stats();

src/vmm/src/devices/virtio/block/device.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use std::fs::{File, OpenOptions};
1111
use std::io::{Seek, SeekFrom, Write};
1212
use std::os::linux::fs::MetadataExt;
1313
use std::path::PathBuf;
14-
use std::sync::atomic::AtomicUsize;
14+
use std::sync::atomic::AtomicU32;
1515
use std::sync::Arc;
1616

1717
use block_io::FileEngine;
@@ -571,7 +571,7 @@ impl VirtioDevice for Block {
571571
}
572572

573573
/// Returns the current device interrupt status.
574-
fn interrupt_status(&self) -> Arc<AtomicUsize> {
574+
fn interrupt_status(&self) -> Arc<AtomicU32> {
575575
self.irq_trigger.irq_status.clone()
576576
}
577577

src/vmm/src/devices/virtio/block/persist.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
//! Defines the structures needed for saving/restoring block devices.
55
6-
use std::sync::atomic::AtomicUsize;
6+
use std::sync::atomic::AtomicU32;
77
use std::sync::Arc;
88

99
use snapshot::Persist;
@@ -201,7 +201,7 @@ impl Persist<'_> for Block {
201201
)
202202
.map_err(BlockError::Persist)?;
203203
block.irq_trigger.irq_status =
204-
Arc::new(AtomicUsize::new(state.virtio_state.interrupt_status));
204+
Arc::new(AtomicU32::new(state.virtio_state.interrupt_status));
205205
block.avail_features = state.virtio_state.avail_features;
206206
block.acked_features = state.virtio_state.acked_features;
207207

src/vmm/src/devices/virtio/device.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// found in the THIRD-PARTY file.
77

88
use std::fmt;
9-
use std::sync::atomic::{AtomicUsize, Ordering};
9+
use std::sync::atomic::{AtomicU32, Ordering};
1010
use std::sync::Arc;
1111

1212
use utils::eventfd::EventFd;
@@ -54,14 +54,14 @@ pub enum IrqType {
5454
/// Helper struct that is responsible for triggering guest IRQs
5555
#[derive(Debug)]
5656
pub struct IrqTrigger {
57-
pub(crate) irq_status: Arc<AtomicUsize>,
57+
pub(crate) irq_status: Arc<AtomicU32>,
5858
pub(crate) irq_evt: EventFd,
5959
}
6060

6161
impl IrqTrigger {
6262
pub fn new() -> std::io::Result<Self> {
6363
Ok(Self {
64-
irq_status: Arc::new(AtomicUsize::new(0)),
64+
irq_status: Arc::new(AtomicU32::new(0)),
6565
irq_evt: EventFd::new(libc::EFD_NONBLOCK)?,
6666
})
6767
}
@@ -71,7 +71,7 @@ impl IrqTrigger {
7171
IrqType::Config => VIRTIO_MMIO_INT_CONFIG,
7272
IrqType::Vring => VIRTIO_MMIO_INT_VRING,
7373
};
74-
self.irq_status.fetch_or(irq as usize, Ordering::SeqCst);
74+
self.irq_status.fetch_or(irq, Ordering::SeqCst);
7575

7676
self.irq_evt.write(1).map_err(|err| {
7777
error!("Failed to send irq to the guest: {:?}", err);
@@ -121,7 +121,7 @@ pub trait VirtioDevice: AsAny + Send {
121121
fn interrupt_evt(&self) -> &EventFd;
122122

123123
/// Returns the current device interrupt status.
124-
fn interrupt_status(&self) -> Arc<AtomicUsize>;
124+
fn interrupt_status(&self) -> Arc<AtomicU32>;
125125

126126
/// The set of feature bits shifted by `page * 32`.
127127
fn avail_features_by_page(&self, page: u32) -> u32 {
@@ -196,7 +196,7 @@ pub(crate) mod tests {
196196
return false;
197197
}
198198

199-
let irq_status = self.irq_status.load(Ordering::SeqCst) as u32;
199+
let irq_status = self.irq_status.load(Ordering::SeqCst);
200200
return matches!(
201201
(irq_status, irq_type),
202202
(VIRTIO_MMIO_INT_CONFIG, IrqType::Config)
@@ -268,7 +268,7 @@ pub(crate) mod tests {
268268
todo!()
269269
}
270270

271-
fn interrupt_status(&self) -> Arc<AtomicUsize> {
271+
fn interrupt_status(&self) -> Arc<AtomicU32> {
272272
todo!()
273273
}
274274

src/vmm/src/devices/virtio/mmio.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// found in the THIRD-PARTY file.
77

88
use std::fmt::Debug;
9-
use std::sync::atomic::{AtomicUsize, Ordering};
9+
use std::sync::atomic::{AtomicU32, Ordering};
1010
use std::sync::{Arc, Mutex, MutexGuard};
1111

1212
use utils::byte_order;
@@ -54,7 +54,7 @@ pub struct MmioTransport {
5454
pub(crate) device_status: u32,
5555
pub(crate) config_generation: u32,
5656
mem: GuestMemoryMmap,
57-
pub(crate) interrupt_status: Arc<AtomicUsize>,
57+
pub(crate) interrupt_status: Arc<AtomicU32>,
5858
}
5959

6060
impl MmioTransport {
@@ -237,7 +237,7 @@ impl MmioTransport {
237237
}
238238
0x34 => self.with_queue(0, |q| u32::from(q.get_max_size())),
239239
0x44 => self.with_queue(0, |q| u32::from(q.ready)),
240-
0x60 => self.interrupt_status.load(Ordering::SeqCst) as u32,
240+
0x60 => self.interrupt_status.load(Ordering::SeqCst),
241241
0x70 => self.device_status,
242242
0xfc => self.config_generation,
243243
_ => {
@@ -292,8 +292,7 @@ impl MmioTransport {
292292
0x44 => self.update_queue_field(|q| q.ready = v == 1),
293293
0x64 => {
294294
if self.check_device_status(device_status::DRIVER_OK, 0) {
295-
self.interrupt_status
296-
.fetch_and(!(v as usize), Ordering::SeqCst);
295+
self.interrupt_status.fetch_and(!v, Ordering::SeqCst);
297296
}
298297
}
299298
0x70 => self.set_device_status(v),
@@ -340,7 +339,7 @@ pub(crate) mod tests {
340339
acked_features: u64,
341340
avail_features: u64,
342341
interrupt_evt: EventFd,
343-
interrupt_status: Arc<AtomicUsize>,
342+
interrupt_status: Arc<AtomicU32>,
344343
queue_evts: Vec<EventFd>,
345344
queues: Vec<Queue>,
346345
device_activated: bool,
@@ -353,7 +352,7 @@ pub(crate) mod tests {
353352
acked_features: 0,
354353
avail_features: 0,
355354
interrupt_evt: EventFd::new(libc::EFD_NONBLOCK).unwrap(),
356-
interrupt_status: Arc::new(AtomicUsize::new(0)),
355+
interrupt_status: Arc::new(AtomicU32::new(0)),
357356
queue_evts: vec![
358357
EventFd::new(libc::EFD_NONBLOCK).unwrap(),
359358
EventFd::new(libc::EFD_NONBLOCK).unwrap(),
@@ -402,7 +401,7 @@ pub(crate) mod tests {
402401
&self.interrupt_evt
403402
}
404403

405-
fn interrupt_status(&self) -> Arc<AtomicUsize> {
404+
fn interrupt_status(&self) -> Arc<AtomicU32> {
406405
self.interrupt_status.clone()
407406
}
408407

src/vmm/src/devices/virtio/net/device.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
use std::io::{Read, Write};
99
use std::net::Ipv4Addr;
10-
use std::sync::atomic::AtomicUsize;
10+
use std::sync::atomic::AtomicU32;
1111
use std::sync::{Arc, Mutex};
1212
use std::{cmp, mem};
1313

@@ -789,7 +789,7 @@ impl VirtioDevice for Net {
789789
&self.irq_trigger.irq_evt
790790
}
791791

792-
fn interrupt_status(&self) -> Arc<AtomicUsize> {
792+
fn interrupt_status(&self) -> Arc<AtomicU32> {
793793
self.irq_trigger.irq_status.clone()
794794
}
795795

src/vmm/src/devices/virtio/net/persist.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//! Defines the structures needed for saving/restoring net devices.
55
66
use std::io;
7-
use std::sync::atomic::AtomicUsize;
7+
use std::sync::atomic::AtomicU32;
88
use std::sync::{Arc, Mutex};
99

1010
use log::warn;
@@ -156,8 +156,7 @@ impl Persist<'_> for Net {
156156
NET_NUM_QUEUES,
157157
FIRECRACKER_MAX_QUEUE_SIZE,
158158
)?;
159-
net.irq_trigger.irq_status =
160-
Arc::new(AtomicUsize::new(state.virtio_state.interrupt_status));
159+
net.irq_trigger.irq_status = Arc::new(AtomicU32::new(state.virtio_state.interrupt_status));
161160
net.avail_features = state.virtio_state.avail_features;
162161
net.acked_features = state.virtio_state.acked_features;
163162

src/vmm/src/devices/virtio/persist.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,15 @@ pub struct VirtioDeviceState {
103103
/// List of queues.
104104
pub queues: Vec<QueueState>,
105105
/// The MMIO interrupt status.
106-
pub interrupt_status: usize,
106+
#[version(
107+
start = 2,
108+
de_fn = "de_interrupt_status",
109+
ser_fn = "ser_interrupt_status"
110+
)]
111+
pub interrupt_status: u32,
112+
/// The MMIO interrupt status as a usize.
113+
#[version(end = 2)]
114+
pub interrupt_status_old: usize,
107115
/// Flag for activated status.
108116
pub activated: bool,
109117
}
@@ -117,6 +125,7 @@ impl VirtioDeviceState {
117125
acked_features: device.acked_features(),
118126
queues: device.queues().iter().map(Persist::save).collect(),
119127
interrupt_status: device.interrupt_status().load(Ordering::Relaxed),
128+
interrupt_status_old: device.interrupt_status().load(Ordering::Relaxed) as usize,
120129
activated: device.is_activated(),
121130
}
122131
}
@@ -170,6 +179,21 @@ impl VirtioDeviceState {
170179
}
171180
Ok(queues)
172181
}
182+
183+
#[allow(clippy::cast_possible_truncation)]
184+
fn de_interrupt_status(&mut self, version: u16) -> VersionizeResult<()> {
185+
// v1 uses a usize type for interrupt status.
186+
if version < 2 {
187+
self.interrupt_status = self.interrupt_status_old as u32;
188+
}
189+
Ok(())
190+
}
191+
192+
fn ser_interrupt_status(&mut self, _target_version: u16) -> VersionizeResult<()> {
193+
// v1 uses a usize type for interrupt status.
194+
self.interrupt_status_old = self.interrupt_status as usize;
195+
Ok(())
196+
}
173197
}
174198

175199
/// Transport information saved in snapshot.

0 commit comments

Comments
 (0)