block: do not ignore failures when pushing to io_uring submission queue

Instead of silently ignoring the error, return an error to the callers.

This in practice should never happen, because the submission queue size
(ring depth) is the same as the virtio queue size. Virtio queue won't
push more requests than there are submission queue entries.

Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
Wei Liu 2024-06-13 00:09:34 +00:00 committed by Rob Bradford
parent b2f40afc69
commit 090fcebfec

View File

@ -3,7 +3,7 @@
// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause // SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
use std::fs::File; use std::fs::File;
use std::io::{Seek, SeekFrom}; use std::io::{Error, Seek, SeekFrom};
use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::io::{AsRawFd, RawFd};
use io_uring::{opcode, squeue, types, IoUring}; use io_uring::{opcode, squeue, types, IoUring};
@ -86,7 +86,7 @@ impl AsyncIo for RawFileAsync {
// SAFETY: we know the file descriptor is valid and we // SAFETY: we know the file descriptor is valid and we
// relied on vm-memory to provide the buffer address. // relied on vm-memory to provide the buffer address.
let _ = unsafe { unsafe {
sq.push( sq.push(
&opcode::Readv::new(types::Fd(self.fd), iovecs.as_ptr(), iovecs.len() as u32) &opcode::Readv::new(types::Fd(self.fd), iovecs.as_ptr(), iovecs.len() as u32)
.offset(offset.try_into().unwrap()) .offset(offset.try_into().unwrap())
@ -94,6 +94,7 @@ impl AsyncIo for RawFileAsync {
.flags(squeue::Flags::ASYNC) .flags(squeue::Flags::ASYNC)
.user_data(user_data), .user_data(user_data),
) )
.map_err(|_| AsyncIoError::ReadVectored(Error::other("Submission queue is full")))?
}; };
// Update the submission queue and submit new operations to the // Update the submission queue and submit new operations to the
@ -114,7 +115,7 @@ impl AsyncIo for RawFileAsync {
// SAFETY: we know the file descriptor is valid and we // SAFETY: we know the file descriptor is valid and we
// relied on vm-memory to provide the buffer address. // relied on vm-memory to provide the buffer address.
let _ = unsafe { unsafe {
sq.push( sq.push(
&opcode::Writev::new(types::Fd(self.fd), iovecs.as_ptr(), iovecs.len() as u32) &opcode::Writev::new(types::Fd(self.fd), iovecs.as_ptr(), iovecs.len() as u32)
.offset(offset.try_into().unwrap()) .offset(offset.try_into().unwrap())
@ -122,6 +123,7 @@ impl AsyncIo for RawFileAsync {
.flags(squeue::Flags::ASYNC) .flags(squeue::Flags::ASYNC)
.user_data(user_data), .user_data(user_data),
) )
.map_err(|_| AsyncIoError::WriteVectored(Error::other("Submission queue is full")))?
}; };
// Update the submission queue and submit new operations to the // Update the submission queue and submit new operations to the
@ -137,13 +139,14 @@ impl AsyncIo for RawFileAsync {
let (submitter, mut sq, _) = self.io_uring.split(); let (submitter, mut sq, _) = self.io_uring.split();
// SAFETY: we know the file descriptor is valid. // SAFETY: we know the file descriptor is valid.
let _ = unsafe { unsafe {
sq.push( sq.push(
&opcode::Fsync::new(types::Fd(self.fd)) &opcode::Fsync::new(types::Fd(self.fd))
.build() .build()
.flags(squeue::Flags::ASYNC) .flags(squeue::Flags::ASYNC)
.user_data(user_data), .user_data(user_data),
) )
.map_err(|_| AsyncIoError::Fsync(Error::other("Submission queue is full")))?
}; };
// Update the submission queue and submit new operations to the // Update the submission queue and submit new operations to the