Skip to content

Commit ba06486

Browse files
author
Serban Iorga
committed
[vsock] remove buf pointer from Packet
Signed-off-by: Serban Iorga <[email protected]>
1 parent 0d5eece commit ba06486

File tree

4 files changed

+76
-66
lines changed

4 files changed

+76
-66
lines changed

src/devices/src/virtio/vsock/csm/connection.rs

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -890,9 +890,16 @@ mod tests {
890890
}
891891

892892
fn init_data_pkt(&mut self, data: &[u8]) -> &VsockPacket {
893-
assert!(data.len() <= self.pkt.buf().unwrap().len());
893+
assert!(data.len() <= self.pkt.buf_size());
894894
self.init_pkt(uapi::VSOCK_OP_RW, data.len() as u32);
895-
self.pkt.buf_mut().unwrap()[..data.len()].copy_from_slice(data);
895+
self.pkt
896+
.read_at_offset_from(
897+
&self._vsock_test_ctx.mem,
898+
0,
899+
&mut std::io::Cursor::new(data.to_vec()),
900+
data.len(),
901+
)
902+
.unwrap();
896903
&self.pkt
897904
}
898905
}
@@ -960,7 +967,17 @@ mod tests {
960967
ctx.recv();
961968
assert_eq!(ctx.pkt.op(), uapi::VSOCK_OP_RW);
962969
assert_eq!(ctx.pkt.len() as usize, data.len());
963-
assert_eq!(ctx.pkt.buf().unwrap()[..ctx.pkt.len() as usize], *data);
970+
971+
let mut buf = vec![];
972+
ctx.pkt
973+
.write_from_offset_to(
974+
&ctx._vsock_test_ctx.mem,
975+
0,
976+
&mut buf,
977+
ctx.pkt.len() as usize,
978+
)
979+
.unwrap();
980+
assert_eq!(&buf, data);
964981

965982
// There's no more data in the stream, so `recv_pkt` should yield `VsockError::NoData`.
966983
match ctx.conn.recv_pkt(&mut ctx.pkt, &ctx._vsock_test_ctx.mem) {
@@ -1030,7 +1047,17 @@ mod tests {
10301047
ctx.notify_epollin();
10311048
ctx.recv();
10321049
assert_eq!(ctx.pkt.op(), uapi::VSOCK_OP_RW);
1033-
assert_eq!(&ctx.pkt.buf().unwrap()[..ctx.pkt.len() as usize], data);
1050+
1051+
let mut buf = vec![];
1052+
ctx.pkt
1053+
.write_from_offset_to(
1054+
&ctx._vsock_test_ctx.mem,
1055+
0,
1056+
&mut buf,
1057+
ctx.pkt.len() as usize,
1058+
)
1059+
.unwrap();
1060+
assert_eq!(&buf, data);
10341061

10351062
ctx.init_data_pkt(data);
10361063
ctx.send();
@@ -1222,7 +1249,7 @@ mod tests {
12221249
ctx.set_stream(stream);
12231250

12241251
// Fill up the TX buffer.
1225-
let data = vec![0u8; ctx.pkt.buf().unwrap().len()];
1252+
let data = vec![0u8; ctx.pkt.buf_size()];
12261253
ctx.init_data_pkt(data.as_slice());
12271254
for _i in 0..(csm_defs::CONN_TX_BUF_SIZE / data.len() as u32) {
12281255
ctx.send();

src/devices/src/virtio/vsock/packet.rs

Lines changed: 5 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@
1515
/// in guest memory. This is done to avoid unnecessarily copying data from guest memory
1616
/// to temporary buffers, before passing it on to the vsock backend.
1717
use std::io::{Read, Write};
18-
use std::result;
1918

2019
use vm_memory::{
21-
self, Address, ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryError, GuestMemoryMmap,
20+
self, Address, ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryMmap,
2221
GuestMemoryRegion, GuestRegionMmap, MemoryRegionAddress,
2322
};
2423

@@ -93,18 +92,9 @@ pub struct VsockPacket {
9392
// 1 write for Rx and 1 read for Tx, plus 1 `check_range` call for each.
9493
hdr: VsockPacketHeader,
9594
buf_addr: Option<GuestAddress>,
96-
buf: Option<*mut u8>,
9795
buf_size: usize,
9896
}
9997

100-
fn get_host_address<T: GuestMemory>(
101-
mem: &T,
102-
guest_addr: GuestAddress,
103-
size: usize,
104-
) -> result::Result<*mut u8, GuestMemoryError> {
105-
Ok(mem.get_slice(guest_addr, size)?.as_ptr())
106-
}
107-
10898
impl VsockPacket {
10999
fn check_desc_write_only(desc: &DescriptorChain, expected_write_only: bool) -> Result<()> {
110100
if desc.is_write_only() != expected_write_only {
@@ -150,10 +140,6 @@ impl VsockPacket {
150140
}
151141

152142
self.buf_addr = Some(buf_desc.addr);
153-
self.buf = Some(
154-
get_host_address(buf_desc.mem, buf_desc.addr, buf_size)
155-
.map_err(VsockError::GuestMemoryMmap)?,
156-
);
157143
self.buf_size = buf_size;
158144

159145
Ok(())
@@ -181,7 +167,6 @@ impl VsockPacket {
181167
.read_obj(hdr_desc.addr)
182168
.map_err(VsockError::GuestMemoryMmap)?,
183169
buf_addr: None,
184-
buf: None,
185170
buf_size: 0,
186171
};
187172

@@ -222,7 +207,6 @@ impl VsockPacket {
222207
// to the guest memory once, before marking the RX descriptor chain as used.
223208
hdr: VsockPacketHeader::default(),
224209
buf_addr: None,
225-
buf: None,
226210
buf_size: 0,
227211
};
228212

@@ -242,36 +226,6 @@ impl VsockPacket {
242226
.map_err(VsockError::GuestMemoryMmap)
243227
}
244228

245-
/// Provides in-place, byte-slice access to the vsock packet data buffer.
246-
///
247-
/// Note: control packets (e.g. connection request or reset) have no data buffer associated.
248-
/// For those packets, this method will return `None`.
249-
/// Also note: calling `len()` on the returned slice will yield the buffer size, which may be
250-
/// (and often is) larger than the length of the packet data. The packet data length
251-
/// is stored in the packet header, and accessible via `VsockPacket::len()`.
252-
pub fn buf(&self) -> Option<&[u8]> {
253-
self.buf.map(|ptr| {
254-
// This is safe since bound checks have already been performed when creating the packet
255-
// from the virtq descriptor.
256-
unsafe { std::slice::from_raw_parts(ptr as *const u8, self.buf_size) }
257-
})
258-
}
259-
260-
/// Provides in-place, byte-slice, mutable access to the vsock packet data buffer.
261-
///
262-
/// Note: control packets (e.g. connection request or reset) have no data buffer associated.
263-
/// For those packets, this method will return `None`.
264-
/// Also note: calling `len()` on the returned slice will yield the buffer size, which may be
265-
/// (and often is) larger than the length of the packet data. The packet data length
266-
/// is stored in the packet header, and accessible via `VsockPacket::len()`.
267-
pub fn buf_mut(&mut self) -> Option<&mut [u8]> {
268-
self.buf.map(|ptr| {
269-
// This is safe since bound checks have already been performed when creating the packet
270-
// from the virtq descriptor.
271-
unsafe { std::slice::from_raw_parts_mut(ptr, self.buf_size) }
272-
})
273-
}
274-
275229
pub fn buf_size(&self) -> usize {
276230
self.buf_size
277231
}
@@ -508,7 +462,7 @@ mod tests {
508462
)
509463
.unwrap();
510464
assert_eq!(
511-
pkt.buf().unwrap().len(),
465+
pkt.buf_size(),
512466
handler_ctx.guest_txvq.dtable[1].len.get() as usize
513467
);
514468
}
@@ -535,14 +489,13 @@ mod tests {
535489
{
536490
create_context!(test_ctx, handler_ctx);
537491
set_pkt_len(0, &handler_ctx.guest_txvq.dtable[0], &test_ctx.mem);
538-
let mut pkt = VsockPacket::from_tx_virtq_head(
492+
let pkt = VsockPacket::from_tx_virtq_head(
539493
&handler_ctx.device.queues[TXQ_INDEX]
540494
.pop(&test_ctx.mem)
541495
.unwrap(),
542496
)
543497
.unwrap();
544-
assert!(pkt.buf().is_none());
545-
assert!(pkt.buf_mut().is_none());
498+
assert!(pkt.buf_addr.is_none());
546499
}
547500

548501
// Test case: TX packet has more data than we can handle.
@@ -597,7 +550,7 @@ mod tests {
597550
)
598551
.unwrap();
599552
assert_eq!(
600-
pkt.buf().unwrap().len(),
553+
pkt.buf_size,
601554
handler_ctx.guest_rxvq.dtable[1].len.get() as usize
602555
);
603556
}

src/devices/src/virtio/vsock/test_utils.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,17 @@ impl Default for TestBackend {
5757
}
5858

5959
impl VsockChannel for TestBackend {
60-
fn recv_pkt(&mut self, _pkt: &mut VsockPacket, _mem: &GuestMemoryMmap) -> Result<()> {
60+
fn recv_pkt(&mut self, pkt: &mut VsockPacket, mem: &GuestMemoryMmap) -> Result<()> {
6161
let cool_buf = [0xDu8, 0xE, 0xA, 0xD, 0xB, 0xE, 0xE, 0xF];
6262
match self.rx_err.take() {
6363
None => {
64-
if let Some(buf) = _pkt.buf_mut() {
65-
for i in 0..buf.len() {
66-
buf[i] = cool_buf[i % cool_buf.len()];
67-
}
64+
let buf_size = pkt.buf_size();
65+
if buf_size > 0 {
66+
let buf: Vec<u8> = (0..buf_size)
67+
.map(|i| cool_buf[i % cool_buf.len()])
68+
.collect();
69+
pkt.read_at_offset_from(mem, 0, &mut std::io::Cursor::new(buf), buf_size)
70+
.unwrap();
6871
}
6972
self.rx_ok_cnt += 1;
7073
Ok(())

src/devices/src/virtio/vsock/unix/muxer.rs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -841,10 +841,17 @@ mod tests {
841841
peer_port: u32,
842842
data: &[u8],
843843
) -> &mut VsockPacket {
844-
assert!(data.len() <= self.pkt.buf().unwrap().len() as usize);
844+
assert!(data.len() <= self.pkt.buf_size());
845845
self.init_pkt(local_port, peer_port, uapi::VSOCK_OP_RW)
846846
.set_len(data.len() as u32);
847-
self.pkt.buf_mut().unwrap()[..data.len()].copy_from_slice(data);
847+
self.pkt
848+
.read_at_offset_from(
849+
&self._vsock_test_ctx.mem,
850+
0,
851+
&mut std::io::Cursor::new(data.to_vec()),
852+
data.len(),
853+
)
854+
.unwrap();
848855
&mut self.pkt
849856
}
850857

@@ -1074,10 +1081,20 @@ mod tests {
10741081
assert!(ctx.muxer.has_pending_rx());
10751082
ctx.recv();
10761083
assert_eq!(ctx.pkt.op(), uapi::VSOCK_OP_RW);
1077-
assert_eq!(ctx.pkt.buf().unwrap()[..data.len()], data);
10781084
assert_eq!(ctx.pkt.src_port(), LOCAL_PORT);
10791085
assert_eq!(ctx.pkt.dst_port(), PEER_PORT);
10801086

1087+
let mut buf = vec![];
1088+
ctx.pkt
1089+
.write_from_offset_to(
1090+
&ctx._vsock_test_ctx.mem,
1091+
0,
1092+
&mut buf,
1093+
ctx.pkt.len() as usize,
1094+
)
1095+
.unwrap();
1096+
assert_eq!(&buf, &data);
1097+
10811098
assert!(!ctx.muxer.has_pending_rx());
10821099
}
10831100

@@ -1106,7 +1123,17 @@ mod tests {
11061123
assert_eq!(ctx.pkt.op(), uapi::VSOCK_OP_RW);
11071124
assert_eq!(ctx.pkt.src_port(), local_port);
11081125
assert_eq!(ctx.pkt.dst_port(), peer_port);
1109-
assert_eq!(ctx.pkt.buf().unwrap()[..data.len()], data);
1126+
1127+
let mut buf = vec![];
1128+
ctx.pkt
1129+
.write_from_offset_to(
1130+
&ctx._vsock_test_ctx.mem,
1131+
0,
1132+
&mut buf,
1133+
ctx.pkt.len() as usize,
1134+
)
1135+
.unwrap();
1136+
assert_eq!(&buf, &data);
11101137
}
11111138

11121139
#[test]

0 commit comments

Comments
 (0)