Skip to content

Commit 7a1db2b

Browse files
committed
build: Update vm-memory to 0.18.0
The main change is that `GuestMemory` can now handle virtual memory, which requires passing the needed access permissions. The previous `GuestMemory` is now called `GuestMemoryBackend`, so we need to use that in the kani verification code. As for getting the memory’s bitmap type, we need to use `GuestMemory::Bitmap` instead of going through the region type. Finally, there is no longer a `GuestMemory::get_slice()` (only `get_slices()`), but the previous commits have already prepared for that. Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
1 parent 33cde3b commit 7a1db2b

File tree

13 files changed

+69
-37
lines changed

13 files changed

+69
-37
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ lto = true
1515
codegen-units = 1
1616

1717
[workspace.dependencies]
18-
vm-memory = "0.17.1"
18+
vm-memory = "0.18.0"
1919
vmm-sys-util = "0.15.0"

fuzz/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ memfd = "0.6.3"
2020
virtio-queue = { path = "../virtio-queue", features = ["test-utils"] }
2121
virtio-vsock = { path = "../virtio-vsock" }
2222
virtio-queue-ser = { path = "../virtio-queue-ser" }
23-
vm-memory = { version = "0.17.1", features = ["backend-mmap", "backend-atomic"] }
23+
vm-memory = { version = "0.18.0", features = ["backend-mmap", "backend-atomic"] }
2424
common = { path = "common" }
2525
virtio-blk = { path = "../virtio-blk", features = ["backend-stdio"] }
2626

fuzz/common/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ virtio-queue = { path = "../../virtio-queue", features = ["test-utils"] }
1313
virtio-vsock = { path = "../../virtio-vsock" }
1414
virtio-queue-ser = { path = "../../virtio-queue-ser" }
1515
virtio-blk = { path = "../../virtio-blk" }
16-
vm-memory = { version = "0.17.1", features = ["backend-mmap", "backend-atomic"] }
16+
vm-memory = { version = "0.18.0", features = ["backend-mmap", "backend-atomic"] }

fuzz/common/src/vsock.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ mod tests {
177177
use virtio_queue::desc::RawDescriptor;
178178
use virtio_queue::mock::MockSplitQueue;
179179
use virtio_vsock::packet::VsockPacket;
180-
use vm_memory::{Bytes, GuestAddress, GuestMemory, GuestMemoryMmap};
180+
use vm_memory::{Bytes, GuestAddress, GuestMemory, GuestMemoryMmap, Permissions};
181181

182182
// Random values to be used by the tests for the header fields.
183183
const SRC_CID: u64 = 1;
@@ -214,11 +214,17 @@ mod tests {
214214
mem: &M,
215215
addr: GuestAddress,
216216
length: usize,
217-
_rx_tx: RxTx,
217+
rx_tx: RxTx,
218218
) -> *const u8 {
219+
let access = match rx_tx {
220+
RxTx::Rx => Permissions::Write,
221+
RxTx::Tx => Permissions::Read,
222+
};
223+
219224
assert!(length > 0);
220225
let slice = mem
221-
.get_slices(addr, length)
226+
.get_slices(addr, length, access)
227+
.unwrap()
222228
.next()
223229
.unwrap()
224230
.unwrap();

virtio-blk/src/request.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use virtio_queue::{
3737
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
3838
DescriptorChain,
3939
};
40-
use vm_memory::{ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryError};
40+
use vm_memory::{ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryError, Permissions};
4141

4242
/// Block request parsing errors.
4343
#[derive(Debug)]
@@ -180,7 +180,7 @@ impl Request {
180180

181181
// Check that the address of the status is valid in guest memory.
182182
// We will write an u8 status here after executing the request.
183-
if !mem.check_range(desc.addr(), size_of::<u8>()) {
183+
if !mem.check_range(desc.addr(), size_of::<u8>(), Permissions::Write) {
184184
return Err(Error::GuestMemory(GuestMemoryError::InvalidGuestAddress(
185185
desc.addr(),
186186
)));

virtio-queue-ser/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
## Changed
66

7+
- Updated vm-memory from 0.17.1 to 0.18.0
8+
79
## Fixed
810

911
# v0.14.0

virtio-queue/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
## Changed
66

7+
- Updated vm-memory from 0.17.1 to 0.18.0
8+
79
## Fixed
810

911
# v0.17.0

virtio-queue/src/chain.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use std::mem::size_of;
1515
use std::ops::Deref;
1616

1717
use vm_memory::bitmap::{BitmapSlice, WithBitmapSlice};
18-
use vm_memory::{Address, Bytes, GuestAddress, GuestMemory, GuestMemoryRegion};
18+
use vm_memory::{Address, Bytes, GuestAddress, GuestMemory};
1919

2020
use crate::{desc::split::Descriptor, Error, Reader, Writer};
2121
use virtio_bindings::bindings::virtio_ring::VRING_DESC_ALIGN_SIZE;
@@ -92,7 +92,7 @@ where
9292
pub fn writer<'a, B: BitmapSlice>(self, mem: &'a M::Target) -> Result<Writer<'a, B>, Error>
9393
where
9494
M::Target: Sized,
95-
<<M::Target as GuestMemory>::R as GuestMemoryRegion>::B: WithBitmapSlice<'a, S = B>,
95+
<M::Target as GuestMemory>::Bitmap: WithBitmapSlice<'a, S = B>,
9696
{
9797
Writer::new(mem, self).map_err(|_| Error::InvalidChain)
9898
}
@@ -101,7 +101,7 @@ where
101101
pub fn reader<'a, B: BitmapSlice>(self, mem: &'a M::Target) -> Result<Reader<'a, B>, Error>
102102
where
103103
M::Target: Sized,
104-
<<M::Target as GuestMemory>::R as GuestMemoryRegion>::B: WithBitmapSlice<'a, S = B>,
104+
<M::Target as GuestMemory>::Bitmap: WithBitmapSlice<'a, S = B>,
105105
{
106106
Reader::new(mem, self).map_err(|_| Error::InvalidChain)
107107
}

virtio-queue/src/descriptor_utils.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use std::{cmp, result};
1515

1616
use crate::{DescriptorChain, Error};
1717
use vm_memory::bitmap::{BitmapSlice, WithBitmapSlice};
18-
use vm_memory::{ByteValued, GuestMemory, GuestMemoryRegion, VolatileSlice};
18+
use vm_memory::{ByteValued, GuestMemory, Permissions, VolatileSlice};
1919

2020
pub type Result<T> = result::Result<T, Error>;
2121

@@ -158,7 +158,7 @@ impl<'a, B: BitmapSlice> Reader<'a, B> {
158158
pub fn new<M, T>(mem: &'a M, desc_chain: DescriptorChain<T>) -> Result<Reader<'a, B>>
159159
where
160160
M: GuestMemory,
161-
<<M as GuestMemory>::R as GuestMemoryRegion>::B: WithBitmapSlice<'a, S = B>,
161+
<M as GuestMemory>::Bitmap: WithBitmapSlice<'a, S = B>,
162162
T: Deref,
163163
T::Target: GuestMemory + Sized,
164164
{
@@ -173,7 +173,9 @@ impl<'a, B: BitmapSlice> Reader<'a, B> {
173173
.checked_add(desc.len() as usize)
174174
.ok_or(Error::DescriptorChainOverflow)?;
175175

176-
let slices = mem.get_slices(desc.addr(), desc.len() as usize);
176+
let slices = mem
177+
.get_slices(desc.addr(), desc.len() as usize, Permissions::Read)
178+
.map_err(Error::GuestMemoryError)?;
177179
for slice in slices {
178180
buffers.push_back(slice.map_err(Error::GuestMemoryError)?);
179181
}
@@ -264,7 +266,7 @@ impl<'a, B: BitmapSlice> Writer<'a, B> {
264266
pub fn new<M, T>(mem: &'a M, desc_chain: DescriptorChain<T>) -> Result<Writer<'a, B>>
265267
where
266268
M: GuestMemory,
267-
<<M as GuestMemory>::R as GuestMemoryRegion>::B: WithBitmapSlice<'a, S = B>,
269+
<M as GuestMemory>::Bitmap: WithBitmapSlice<'a, S = B>,
268270
T: Deref,
269271
T::Target: GuestMemory + Sized,
270272
{
@@ -279,7 +281,9 @@ impl<'a, B: BitmapSlice> Writer<'a, B> {
279281
.checked_add(desc.len() as usize)
280282
.ok_or(Error::DescriptorChainOverflow)?;
281283

282-
let slices = mem.get_slices(desc.addr(), desc.len() as usize);
284+
let slices = mem
285+
.get_slices(desc.addr(), desc.len() as usize, Permissions::Write)
286+
.map_err(Error::GuestMemoryError)?;
283287
for slice in slices {
284288
buffers.push_back(slice.map_err(Error::GuestMemoryError)?);
285289
}

virtio-queue/src/queue.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use std::num::Wrapping;
1212
use std::ops::Deref;
1313
use std::sync::atomic::{fence, Ordering};
1414

15-
use vm_memory::{Address, Bytes, GuestAddress, GuestMemory};
15+
use vm_memory::{Address, Bytes, GuestAddress, GuestMemory, Permissions};
1616

1717
use crate::defs::{
1818
DEFAULT_AVAIL_RING_ADDR, DEFAULT_DESC_TABLE_ADDR, DEFAULT_USED_RING_ADDR,
@@ -313,21 +313,21 @@ impl QueueT for Queue {
313313
if !self.ready {
314314
error!("attempt to use virtio queue that is not marked ready");
315315
false
316-
} else if !mem.check_range(desc_table, desc_table_size as usize) {
316+
} else if !mem.check_range(desc_table, desc_table_size as usize, Permissions::Read) {
317317
error!(
318318
"virtio queue descriptor table is not accessible: start:0x{:08x} size:0x{:08x}",
319319
desc_table.raw_value(),
320320
desc_table_size
321321
);
322322
false
323-
} else if !mem.check_range(avail_ring, avail_ring_size as usize) {
323+
} else if !mem.check_range(avail_ring, avail_ring_size as usize, Permissions::Read) {
324324
error!(
325325
"virtio queue available ring is not accessible: start:0x{:08x} size:0x{:08x}",
326326
avail_ring.raw_value(),
327327
avail_ring_size
328328
);
329329
false
330-
} else if !mem.check_range(used_ring, used_ring_size as usize) {
330+
} else if !mem.check_range(used_ring, used_ring_size as usize, Permissions::Write) {
331331
error!(
332332
"virtio queue used ring is not accessible: start:0x{:08x} size:0x{:08x}",
333333
used_ring.raw_value(),

0 commit comments

Comments
 (0)