Skip to content

Commit e81af28

Browse files
committed
Drop B: Bitmap type parameters from DescriptorChain::{read,write}
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 e81af28

File tree

3 files changed

+68
-74
lines changed

3 files changed

+68
-74
lines changed

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<'a>(self, mem: &'a M::Target) -> Result<Writer<'a, MS<'a, 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<'a>(self, mem: &'a M::Target) -> Result<Reader<'a, MS<'a, 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

+23-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,8 @@ 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 = Reader::<()>::new(&memory, chain.clone()).expect("failed to create Reader");
595+
let mut writer = Writer::<()>::new(&memory, chain).expect("failed to create Writer");
598596

599597
assert_eq!(reader.bytes_read(), 0);
600598
assert_eq!(writer.bytes_written(), 0);
@@ -636,7 +634,7 @@ mod tests {
636634
123,
637635
)
638636
.expect("create_descriptor_chain failed");
639-
let mut writer = Writer::new(&memory, chain_writer).expect("failed to create Writer");
637+
let mut writer = Writer::<()>::new(&memory, chain_writer).expect("failed to create Writer");
640638
if let Err(e) = writer.write_obj(secret) {
641639
panic!("write_obj should not fail here: {:?}", e);
642640
}
@@ -649,7 +647,7 @@ mod tests {
649647
123,
650648
)
651649
.expect("create_descriptor_chain failed");
652-
let mut reader = Reader::new(&memory, chain_reader).expect("failed to create Reader");
650+
let mut reader = Reader::<()>::new(&memory, chain_reader).expect("failed to create Reader");
653651
match reader.read_obj::<Le32>() {
654652
Err(e) => panic!("read_obj should not fail here: {:?}", e),
655653
Ok(read_secret) => assert_eq!(read_secret, secret),
@@ -671,7 +669,7 @@ mod tests {
671669
)
672670
.expect("create_descriptor_chain failed");
673671

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

676674
let mut buf = vec![0; 1024];
677675

@@ -705,13 +703,13 @@ mod tests {
705703
0,
706704
)
707705
.expect("create_descriptor_chain failed");
708-
let mut reader = Reader::new(&memory, chain.clone()).expect("failed to create Reader");
706+
let mut reader = Reader::<()>::new(&memory, chain.clone()).expect("failed to create Reader");
709707

710708
let other = reader.split_at(32).expect("failed to split Reader");
711709
assert_eq!(reader.available_bytes(), 32);
712710
assert_eq!(other.available_bytes(), 96);
713711

714-
let mut writer = Writer::new(&memory, chain.clone()).expect("failed to create Writer");
712+
let mut writer = Writer::<()>::new(&memory, chain.clone()).expect("failed to create Writer");
715713
let other = writer.split_at(64).expect("failed to split Writer");
716714
assert_eq!(writer.available_bytes(), 64);
717715
assert_eq!(other.available_bytes(), 4);
@@ -738,7 +736,7 @@ mod tests {
738736
0,
739737
)
740738
.expect("create_descriptor_chain failed");
741-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
739+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
742740

743741
let other = reader.split_at(24).expect("failed to split Reader");
744742
assert_eq!(reader.available_bytes(), 24);
@@ -766,7 +764,7 @@ mod tests {
766764
0,
767765
)
768766
.expect("create_descriptor_chain failed");
769-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
767+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
770768

771769
let other = reader.split_at(128).expect("failed to split Reader");
772770
assert_eq!(reader.available_bytes(), 128);
@@ -794,7 +792,7 @@ mod tests {
794792
0,
795793
)
796794
.expect("create_descriptor_chain failed");
797-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
795+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
798796

799797
let other = reader.split_at(0).expect("failed to split Reader");
800798
assert_eq!(reader.available_bytes(), 0);
@@ -822,7 +820,7 @@ mod tests {
822820
0,
823821
)
824822
.expect("create_descriptor_chain failed");
825-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
823+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
826824

827825
if reader.split_at(256).is_ok() {
828826
panic!("successfully split Reader with out of bounds offset");
@@ -843,7 +841,7 @@ mod tests {
843841
0,
844842
)
845843
.expect("create_descriptor_chain failed");
846-
let mut reader = Reader::new(&memory, chain).expect("failed to create Reader");
844+
let mut reader = Reader::<()>::new(&memory, chain).expect("failed to create Reader");
847845

848846
let mut buf = [0u8; 64];
849847
assert_eq!(
@@ -866,7 +864,7 @@ mod tests {
866864
0,
867865
)
868866
.expect("create_descriptor_chain failed");
869-
let mut writer = Writer::new(&memory, chain).expect("failed to create Writer");
867+
let mut writer = Writer::<()>::new(&memory, chain).expect("failed to create Writer");
870868

871869
let buf = [0xdeu8; 64];
872870
assert_eq!(

0 commit comments

Comments
 (0)