[PATCH v4 09/14] nvme-pci: add SGL support for the dmabuf path
Pavel Begunkov
asml.silence at gmail.com
Wed Jul 29 06:08:50 PDT 2026
On 7/29/26 12:55, Christoph Hellwig wrote:
> On Wed, Jul 29, 2026 at 12:45:47PM +0100, Pavel Begunkov wrote:
>> It was exposed in early version as I was passing a [{dma,len}, ...]
>> array, but we moved from that. Maybe I should put the minimum
>> segment size in the map structure, and (possibly over) split using
>> that for now? Keith had this chunk in his patches:
>>
>> + int offset = offset_in_page(bio->bi_iter.bi_bvec_done);
>> +
>> + nsegs = ALIGN(bio->bi_iter.bi_size + offset, PAGE_SIZE) >>
>> + PAGE_SHIFT;
>> + if (bio->bi_iter.bi_size > max_bytes) {
>> + bytes = max_bytes;
>> + nsegs = (bytes + offset) >> PAGE_SHIFT;
>> + } else if (nsegs > lim->max_segments) {
>> + nsegs = lim->max_segments;
>> + bytes = PAGE_SIZE * nsegs - offset;
>> + } else {
>> + *segs = nsegs;
>> + return NULL;
>> + }
>
> This seems very pessimistic, especially for the case of the registration
> only having a single segment, which I'd expect to be fairly common due
> to P2P bar mappings, huge pages or IOMMU coalescing. So at very least
Agree that PAGE_SIZE is too pessimistic, but I'd calculate it from
the sg table on registration and use here. Not ideal but should cover
most common cases like huge pages.
> we'd want to special case that, but in an idea world the caller would
> be required to provide a useful nr_segments for the I/O.
Not sure we can do it in the straightforward way from the abstraction
perspective, mapping are hidden from io_uring, and there could be
multi-device files with differently shaped IOMMU mappings at some
point. We'll surely need readv/writev support later, so maybe we can
improve while doing that as it'd mean passing a {off,len} of some
sort from io_uring.
--
Pavel Begunkov
More information about the Linux-nvme
mailing list