Skip to content

Commit b0f1a4c

Browse files
committed
Drop B: Bitmap type parameters from DescriptorChain fns
The `DescriptorChain::read` and `DescriptorChain::write` define a `B: BitmapSlice` type parameter. However, the type of the bitmap that will be associated with the `VolatileSlices` is already transitively prescribed by the `M` type parameter on the `DescriptorChain` object itself. To reconcile this, these functions need lengthy `WithBitmapSlice` bounds (which tells the compiler "these two different BitMap type variables are actually the same"). Drop the `B: Bitmap` slice parameter from these functions, and instead simply return `Reader<'a, MS<M::Target>>`, where `MS<M::Target>` resolves to the bitmap type induced by the guest memory implementation. This avoids the `WithBitmapSlice` bounds completely. Signed-off-by: Patrick Roy <[email protected]>
1 parent 67d5be7 commit b0f1a4c

File tree

4 files changed

+105
-101
lines changed

4 files changed

+105
-101
lines changed

fuzz/fuzz_targets/vsock.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ fuzz_target!(|data: &[u8]| {
2828
if let Ok(mut chain) = vq.build_desc_chain(&descriptors) {
2929
let packet = match fuzz_input.init_function {
3030
InitFunction::FromRX => {
31-
VsockPacket::from_rx_virtq_chain(&m, &mut chain, fuzz_input.pkt_max_data)
31+
VsockPacket::<()>::from_rx_virtq_chain(&m, &mut chain, fuzz_input.pkt_max_data)
3232
}
3333
InitFunction::FromTX => {
34-
VsockPacket::from_tx_virtq_chain(&m, &mut chain, fuzz_input.pkt_max_data)
34+
VsockPacket::<()>::from_tx_virtq_chain(&m, &mut chain, fuzz_input.pkt_max_data)
3535
}
3636
};
3737
if let Ok(mut p) = packet {

virtio-queue/src/chain.rs

+6-8
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use std::fmt::{self, Debug};
1414
use std::mem::size_of;
1515
use std::ops::Deref;
1616

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

2020
use crate::{Descriptor, Error, Reader, Writer};
2121
use virtio_bindings::bindings::virtio_ring::VRING_DESC_ALIGN_SIZE;
@@ -90,21 +90,19 @@ where
9090
}
9191

9292
/// Return a new instance of Writer
93-
pub fn writer<'a, B: BitmapSlice>(self, mem: &'a M::Target) -> Result<Writer<'a, B>, Error>
93+
pub fn writer(self, mem: &M::Target) -> Result<Writer<MS<M::Target>>, Error>
9494
where
9595
M::Target: Sized,
96-
<<M::Target as GuestMemory>::R as GuestMemoryRegion>::B: WithBitmapSlice<'a, S = B>,
9796
{
98-
Writer::new(mem, self).map_err(|_| Error::InvalidChain)
97+
Writer::<MS<M::Target>>::new(mem, self).map_err(|_| Error::InvalidChain)
9998
}
10099

101100
/// Return a new instance of Reader
102-
pub fn reader<'a, B: BitmapSlice>(self, mem: &'a M::Target) -> Result<Reader<'a, B>, Error>
101+
pub fn reader(self, mem: &M::Target) -> Result<Reader<MS<M::Target>>, Error>
103102
where
104103
M::Target: Sized,
105-
<<M::Target as GuestMemory>::R as GuestMemoryRegion>::B: WithBitmapSlice<'a, S = B>,
106104
{
107-
Reader::new(mem, self).map_err(|_| Error::InvalidChain)
105+
Reader::<MS<M::Target>>::new(mem, self).map_err(|_| Error::InvalidChain)
108106
}
109107

110108
/// Return an iterator that only yields the writable descriptors in the chain.

virtio-queue/src/descriptor_utils.rs

+26-25
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use std::ptr::copy_nonoverlapping;
1414
use std::{cmp, result};
1515

1616
use crate::{DescriptorChain, Error};
17-
use vm_memory::bitmap::{BitmapSlice, WithBitmapSlice};
17+
use vm_memory::bitmap::{BitmapSlice, MS};
1818
use vm_memory::{
1919
Address, ByteValued, GuestMemory, GuestMemoryRegion, MemoryRegionAddress, VolatileSlice,
2020
};
@@ -157,10 +157,9 @@ pub struct Reader<'a, B = ()> {
157157

158158
impl<'a, B: BitmapSlice> Reader<'a, B> {
159159
/// Construct a new Reader wrapper over `desc_chain`.
160-
pub fn new<M, T>(mem: &'a M, desc_chain: DescriptorChain<T>) -> Result<Reader<'a, B>>
160+
pub fn new<M, T>(mem: &'a M, desc_chain: DescriptorChain<T>) -> Result<Reader<'a, MS<'a, M>>>
161161
where
162162
M: GuestMemory,
163-
<<M as GuestMemory>::R as GuestMemoryRegion>::B: WithBitmapSlice<'a, S = B>,
164163
T: Deref,
165164
T::Target: GuestMemory + Sized,
166165
{
@@ -186,7 +185,7 @@ impl<'a, B: BitmapSlice> Reader<'a, B> {
186185
.get_slice(MemoryRegionAddress(offset.raw_value()), desc.len() as usize)
187186
.map_err(Error::GuestMemoryError)
188187
})
189-
.collect::<Result<VecDeque<VolatileSlice<'a, B>>>>()?;
188+
.collect::<Result<VecDeque<_>>>()?;
190189
Ok(Reader {
191190
buffer: DescriptorChainConsumer {
192191
buffers,
@@ -269,10 +268,9 @@ pub struct Writer<'a, B = ()> {
269268

270269
impl<'a, B: BitmapSlice> Writer<'a, B> {
271270
/// Construct a new Writer wrapper over `desc_chain`.
272-
pub fn new<M, T>(mem: &'a M, desc_chain: DescriptorChain<T>) -> Result<Writer<'a, B>>
271+
pub fn new<M, T>(mem: &'a M, desc_chain: DescriptorChain<T>) -> Result<Writer<'a, MS<'a, M>>>
273272
where
274273
M: GuestMemory,
275-
<<M as GuestMemory>::R as GuestMemoryRegion>::B: WithBitmapSlice<'a, S = B>,
276274
T: Deref,
277275
T::Target: GuestMemory + Sized,
278276
{
@@ -298,7 +296,7 @@ impl<'a, B: BitmapSlice> Writer<'a, B> {
298296
.get_slice(MemoryRegionAddress(offset.raw_value()), desc.len() as usize)
299297
.map_err(Error::GuestMemoryError)
300298
})
301-
.collect::<Result<VecDeque<VolatileSlice<'a, B>>>>()?;
299+
.collect::<Result<VecDeque<_>>>()?;
302300

303301
Ok(Writer {
304302
buffer: DescriptorChainConsumer {
@@ -451,7 +449,7 @@ mod tests {
451449

452450
let chain = queue.iter(&memory).unwrap().next().unwrap();
453451

454-
assert!(Reader::new(&memory, chain).is_err());
452+
assert!(Reader::<()>::new(&memory, chain).is_err());
455453
}
456454

457455
#[test]
@@ -473,7 +471,7 @@ mod tests {
473471
0,
474472
)
475473
.expect("create_descriptor_chain failed");
476-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
474+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
477475
assert_eq!(reader.available_bytes(), 106);
478476
assert_eq!(reader.bytes_read(), 0);
479477

@@ -513,7 +511,7 @@ mod tests {
513511
0,
514512
)
515513
.expect("create_descriptor_chain failed");
516-
let mut writer = Writer::new(&memory, chain).expect("failed to create Writer");
514+
let mut writer = Writer::<()>::new(&memory, chain).expect("failed to create Writer");
517515
assert_eq!(writer.available_bytes(), 106);
518516
assert_eq!(writer.bytes_written(), 0);
519517

@@ -543,7 +541,7 @@ mod tests {
543541

544542
let chain = create_descriptor_chain(&memory, GuestAddress(0x0), vec![(Writable, 8)], 0)
545543
.expect("create_descriptor_chain failed");
546-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
544+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
547545
assert_eq!(reader.available_bytes(), 0);
548546
assert_eq!(reader.bytes_read(), 0);
549547

@@ -562,7 +560,7 @@ mod tests {
562560

563561
let chain = create_descriptor_chain(&memory, GuestAddress(0x0), vec![(Readable, 8)], 0)
564562
.expect("create_descriptor_chain failed");
565-
let mut writer = Writer::new(&memory, chain).expect("failed to create Writer");
563+
let mut writer = Writer::<()>::new(&memory, chain).expect("failed to create Writer");
566564
assert_eq!(writer.available_bytes(), 0);
567565
assert_eq!(writer.bytes_written(), 0);
568566

@@ -593,8 +591,9 @@ mod tests {
593591
0,
594592
)
595593
.expect("create_descriptor_chain failed");
596-
let mut reader = Reader::new(&memory, chain.clone()).expect("failed to create Reader");
597-
let mut writer = Writer::new(&memory, chain).expect("failed to create Writer");
594+
let mut reader =
595+
Reader::<()>::new(&memory, chain.clone()).expect("failed to create Reader");
596+
let mut writer = Writer::<()>::new(&memory, chain).expect("failed to create Writer");
598597

599598
assert_eq!(reader.bytes_read(), 0);
600599
assert_eq!(writer.bytes_written(), 0);
@@ -636,7 +635,7 @@ mod tests {
636635
123,
637636
)
638637
.expect("create_descriptor_chain failed");
639-
let mut writer = Writer::new(&memory, chain_writer).expect("failed to create Writer");
638+
let mut writer = Writer::<()>::new(&memory, chain_writer).expect("failed to create Writer");
640639
if let Err(e) = writer.write_obj(secret) {
641640
panic!("write_obj should not fail here: {:?}", e);
642641
}
@@ -649,7 +648,7 @@ mod tests {
649648
123,
650649
)
651650
.expect("create_descriptor_chain failed");
652-
let mut reader = Reader::new(&memory, chain_reader).expect("failed to create Reader");
651+
let mut reader = Reader::<()>::new(&memory, chain_reader).expect("failed to create Reader");
653652
match reader.read_obj::<Le32>() {
654653
Err(e) => panic!("read_obj should not fail here: {:?}", e),
655654
Ok(read_secret) => assert_eq!(read_secret, secret),
@@ -671,7 +670,7 @@ mod tests {
671670
)
672671
.expect("create_descriptor_chain failed");
673672

674-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
673+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
675674

676675
let mut buf = vec![0; 1024];
677676

@@ -705,13 +704,15 @@ mod tests {
705704
0,
706705
)
707706
.expect("create_descriptor_chain failed");
708-
let mut reader = Reader::new(&memory, chain.clone()).expect("failed to create Reader");
707+
let mut reader =
708+
Reader::<()>::new(&memory, chain.clone()).expect("failed to create Reader");
709709

710710
let other = reader.split_at(32).expect("failed to split Reader");
711711
assert_eq!(reader.available_bytes(), 32);
712712
assert_eq!(other.available_bytes(), 96);
713713

714-
let mut writer = Writer::new(&memory, chain.clone()).expect("failed to create Writer");
714+
let mut writer =
715+
Writer::<()>::new(&memory, chain.clone()).expect("failed to create Writer");
715716
let other = writer.split_at(64).expect("failed to split Writer");
716717
assert_eq!(writer.available_bytes(), 64);
717718
assert_eq!(other.available_bytes(), 4);
@@ -738,7 +739,7 @@ mod tests {
738739
0,
739740
)
740741
.expect("create_descriptor_chain failed");
741-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
742+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
742743

743744
let other = reader.split_at(24).expect("failed to split Reader");
744745
assert_eq!(reader.available_bytes(), 24);
@@ -766,7 +767,7 @@ mod tests {
766767
0,
767768
)
768769
.expect("create_descriptor_chain failed");
769-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
770+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
770771

771772
let other = reader.split_at(128).expect("failed to split Reader");
772773
assert_eq!(reader.available_bytes(), 128);
@@ -794,7 +795,7 @@ mod tests {
794795
0,
795796
)
796797
.expect("create_descriptor_chain failed");
797-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
798+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
798799

799800
let other = reader.split_at(0).expect("failed to split Reader");
800801
assert_eq!(reader.available_bytes(), 0);
@@ -822,7 +823,7 @@ mod tests {
822823
0,
823824
)
824825
.expect("create_descriptor_chain failed");
825-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
826+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
826827

827828
if reader.split_at(256).is_ok() {
828829
panic!("successfully split Reader with out of bounds offset");
@@ -843,7 +844,7 @@ mod tests {
843844
0,
844845
)
845846
.expect("create_descriptor_chain failed");
846-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
847+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
847848

848849
let mut buf = [0u8; 64];
849850
assert_eq!(
@@ -866,7 +867,7 @@ mod tests {
866867
0,
867868
)
868869
.expect("create_descriptor_chain failed");
869-
let mut writer = Writer::new(&memory, chain).expect("failed to create Writer");
870+
let mut writer = Writer::<()>::new(&memory, chain).expect("failed to create Writer");
870871

871872
let buf = [0xdeu8; 64];
872873
assert_eq!(

0 commit comments

Comments
 (0)