Thread (38 messages) 38 messages, 7 authors, 2020-12-24

Re: [PATCH v1 0/6] no-copy bvec

From: James Bottomley <James.Bottomley@HansenPartnership.com>
Date: 2020-12-24 17:31:16
Also in: io-uring, linux-block, linux-fsdevel, linux-scsi, linux-xfs, lkml, target-devel

On Wed, 2020-12-23 at 15:23 -0500, Douglas Gilbert wrote:
On 2020-12-23 11:04 a.m., James Bottomley wrote:
quoted
On Wed, 2020-12-23 at 15:51 +0000, Christoph Hellwig wrote:
quoted
On Wed, Dec 23, 2020 at 12:52:59PM +0000, Pavel Begunkov wrote:
quoted
Can scatterlist have 0-len entries? Those are directly
translated into bvecs, e.g. in nvme/target/io-cmd-file.c and
target/target_core_file.c. I've audited most of others by this
moment, they're fine.
For block layer SGLs we should never see them, and for nvme
neither. I think the same is true for the SCSI target code, but
please double check.
Right, no-one ever wants to see a 0-len scatter list entry.  The
reason is that every driver uses the sgl to program the device DMA
engine in the way NVME does.  a 0 length sgl would be a dangerous
corner case: some DMA engines would ignore it and others would go
haywire, so if we ever let a 0 length list down into the driver,
they'd have to understand the corner case behaviour of their DMA
engine and filter it accordingly, which is why we disallow them in
the upper levels, since they're effective nops anyway.
When using scatter gather lists at the far end (i.e. on the storage
device) the T10 examples (WRITE SCATTERED and POPULATE TOKEN in SBC-
4) explicitly allow the "number of logical blocks" in their sgl_s to
be zero and state that it is _not_ to be considered an error.
But that's pretty irrelevant.  The scatterlists that block has been
constructing to drive DMA engines pre-date SCSI's addition of SGLs by
decades (all SCSI commands before the object commands use a linear
buffer which is implemented in the HBA engine as a scatterlist but not
described by the SCSI standard as one).

So the answer to the question should the block layer emit zero length
sgl elements is "no" because they can confuse some DMA engines.

If there's a more theoretical question of whether the target driver in
adding commands it doesn't yet support should inject zero length SGL
elements into block because SCSI allows it, the answer is still "no"
because we don't want block to have SGLs that may confuse other DMA
engines.  There's lots of daft corner cases in the SCSI standard we
don't implement and a nop for SGL elements seems to be one of the more
hare brained because it adds no useful feature and merely causes
compatibility issues.

James
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help