mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-05 13:05:45 +00:00
block_util: io_uring: Move to vectored I/O
In anticipation for supporting multiple virtio descriptors, let's make sure the read/write operations are performed with vectored I/O. Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
parent
b3435d51d9
commit
5f6432830c
@ -292,10 +292,16 @@ impl Request {
|
|||||||
return Err(ExecuteError::BadRequest(Error::InvalidOffset));
|
return Err(ExecuteError::BadRequest(Error::InvalidOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut iovecs = Vec::new();
|
||||||
let buf = mem
|
let buf = mem
|
||||||
.get_slice(data_addr, data_len as usize)
|
.get_slice(data_addr, data_len as usize)
|
||||||
.map_err(ExecuteError::GetHostAddress)?
|
.map_err(ExecuteError::GetHostAddress)?
|
||||||
.as_ptr();
|
.as_ptr();
|
||||||
|
let iovec = libc::iovec {
|
||||||
|
iov_base: buf as *mut libc::c_void,
|
||||||
|
iov_len: data_len as libc::size_t,
|
||||||
|
};
|
||||||
|
iovecs.push(iovec);
|
||||||
let offset = (sector as i64) << SECTOR_SHIFT;
|
let offset = (sector as i64) << SECTOR_SHIFT;
|
||||||
|
|
||||||
let (submitter, sq, _) = io_uring.split();
|
let (submitter, sq, _) = io_uring.split();
|
||||||
@ -308,7 +314,11 @@ impl Request {
|
|||||||
// relied on vm-memory to provide the buffer address.
|
// relied on vm-memory to provide the buffer address.
|
||||||
let _ = unsafe {
|
let _ = unsafe {
|
||||||
avail_sq.push(
|
avail_sq.push(
|
||||||
opcode::Read::new(opcode::types::Fd(disk_image_fd), buf, data_len)
|
opcode::Readv::new(
|
||||||
|
opcode::types::Fd(disk_image_fd),
|
||||||
|
iovecs.as_ptr(),
|
||||||
|
iovecs.len() as u32,
|
||||||
|
)
|
||||||
.offset(offset)
|
.offset(offset)
|
||||||
.build()
|
.build()
|
||||||
.user_data(user_data),
|
.user_data(user_data),
|
||||||
@ -320,7 +330,11 @@ impl Request {
|
|||||||
// relied on vm-memory to provide the buffer address.
|
// relied on vm-memory to provide the buffer address.
|
||||||
let _ = unsafe {
|
let _ = unsafe {
|
||||||
avail_sq.push(
|
avail_sq.push(
|
||||||
opcode::Write::new(opcode::types::Fd(disk_image_fd), buf, data_len)
|
opcode::Writev::new(
|
||||||
|
opcode::types::Fd(disk_image_fd),
|
||||||
|
iovecs.as_ptr(),
|
||||||
|
iovecs.len() as u32,
|
||||||
|
)
|
||||||
.offset(offset)
|
.offset(offset)
|
||||||
.build()
|
.build()
|
||||||
.user_data(user_data),
|
.user_data(user_data),
|
||||||
|
Loading…
Reference in New Issue
Block a user