On Wed, Sep 30, 2020 at 11:10:56PM +0200, Alexander Graf wrote: > Some NVMe controllers only support small maximum request sizes, such as > the AWS EBS NVMe implementation which only supports NVMe requests of up > to 32 pages (256kb) at once. > > BIOS callers can exceed those request sizes by defining sector counts > above this threshold. Currently we fall back to the bounce buffer > implementation for those. This is slow. > > This patch introduces splitting logic to the NVMe I/O request code so > that every NVMe I/O request gets handled in a chunk size that is > consumable by the NVMe adapter, while maintaining the fast path PRPL > logic we just introduced. > > Signed-off-by: Alexander Graf <g...@amazon.com> > --- > src/hw/nvme.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/src/hw/nvme.c b/src/hw/nvme.c > index b92ca52..cc37bca 100644 > --- a/src/hw/nvme.c > +++ b/src/hw/nvme.c > @@ -727,6 +727,22 @@ nvme_cmd_readwrite(struct nvme_namespace *ns, struct > disk_op_s *op, int write) > u16 const max_blocks = NVME_PAGE_SIZE / ns->block_size; > u16 i; > > + /* Split up requests that are larger than the device can handle */ > + if (op->count > ns->max_req_size) { > + u16 count = op->count; > + > + /* Handle the first max_req_size elements */ > + op->count = ns->max_req_size; > + if (nvme_cmd_readwrite(ns, op, write)) > + return res; > + > + /* Handle the remainder of the request */ > + op->count = count - ns->max_req_size; > + op->lba += ns->max_req_size; > + op->buf_fl += (ns->max_req_size * ns->block_size); > + return nvme_cmd_readwrite(ns, op, write); > + }
Depending on the disk access, this code could run with a small stack. I would avoid recursion. Otherwise, the patch series looks okay to me. (I don't have enough knowledge of the nvme code to give a full review though.) -Kevin _______________________________________________ SeaBIOS mailing list -- seabios@seabios.org To unsubscribe send an email to seabios-le...@seabios.org