Thread (15 messages) 15 messages, 5 authors, 2016-09-02

[PATCH 2/3] nvme: Pass pointers, not dma addresses, to nvme_get/set_features()

From: luto@amacapital.net (Andy Lutomirski)
Date: 2016-08-30 16:00:56
Also in: lkml

On Mon, Aug 29, 2016@11:36 PM, Christoph Hellwig [off-list ref] wrote:
On Mon, Aug 29, 2016@04:20:43PM -0700, Andy Lutomirski wrote:
quoted
The "Set Features" command (section 5.15) Figure 103 says:

If using PRPs, this field shall not be a pointer to a PRP List as the
data buffer may not cross more than one page boundary. If no data
structure is used as part of the specified feature, then this field is
not used.

Does the Linux driver use PRPs?
The Linux PCIe driver always uses PRPs - and for admin command only
Fabrics can use SGLs anyway.
quoted
Do we need to worry about kmalloc
returning a buffer that spans a 4k boundary but does not span a Linux
page boundary?
Isn't kmalloc supposed to return naturally aligned buffers?
From brief inspection of the code, it looks like kmalloc always
returns a pointer aligned to a biggest power of two that can hold the
allocation except when it uses 96-byte or 192-byte alignment.  96 and
192 don't divide 4k.

However, I think this is all moot because I misunderstood the spec.  It says:

Data Pointer (DPTR): This field specifies the start of the data
buffer. Refer to Figure 11 for the
definition of this field. If using PRPs, this field shall not be a
pointer to a PRP List as the data buffer
may not cross more than one page boundary. If no data structure is
used as part of the specified
feature, then this field is not used.

It doesn't say "may not cross a page boundary" -- it says it may not
cross *more than one* page boundary.  I think that all it's trying to
say is that there aren't any features that have buffers larger than a
page, so no matter how they're aligned there are at most two PRP
entries, and two PRP entries can be expressed without a PRP List.

So I'm just going to remove the warning.

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