From: Al Viro <viro@ZenIV.linux.org.uk>
To: Christoph Hellwig <hch@infradead.org>
Cc: Jens Axboe <axboe@fb.com>,
linux-kernel@vger.kernel.org, linux-block@vger.kernel.org
Subject: Re: [RFC] weird semantics of SG_DXFER_TO_FROM_DEV in BLK_DEV_SKD (drivers/block/skd*)
Date: Tue, 5 Apr 2016 00:45:08 +0100 [thread overview]
Message-ID: <20160404234508.GJ17997@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20160404195042.GH17997@ZenIV.linux.org.uk>
On Mon, Apr 04, 2016 at 08:50:42PM +0100, Al Viro wrote:
> What happens if somebody issues SG_IO with 256-segment vector, each segment
> 1 byte long and page-aligned? Will the driver really be happy with the
> resulting request, as long as it hasn't claimed non-zero queue_virt_boundary?
> Because AFAICS we'll get a request with a pile of bvecs, each with
> ->bv_offset equal to 0 and ->bv_len equal to 1; can that really work?
OK, it really doesn't make sense. What happened, AFAICS, is that when
blk_rq_map_user_iov() has grown a "misaligned, need to copy" code, the
check had been mishandled - rather than checking both the base and the
length of segments, as blk_rq_map_{user,kern} used to do (and as ..._kern
is still doing) it checked only the base.
Then in "block: use blk_rq_map_user_iov to implement blk_rq_map_user" you've
missed that problem, which got us the current situaiton. Note that e.g.
PIO case of libata really wants copy in case of 500 bytes + 12 bytes
vector - it'll splat the last 12 bytes adjacent to the end of the first
segment, etc.
AFAICS, what we need there is simply
nr_pages = iov_iter_npages(iter);
alignment = iov_iter_alignment(iter);
if (alignment & (queue_dma_alignment(q) | q->dma_pad_mask))
copy = true;
and I really wonder if we care about special-casing the situation when the
ends are not aligned to queue_virt_boundary(q). If we don't, we might as
well add queue_virt_boundary(q) to the mask we are checking. If we do,
it's not hard to add a variant that would calculate both the alignment and
alignment for internal boundaries...
next prev parent reply other threads:[~2016-04-04 23:45 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-04 3:38 [RFC] weird semantics of SG_DXFER_TO_FROM_DEV in BLK_DEV_SKD (drivers/block/skd*) Al Viro
2016-04-04 6:52 ` Christoph Hellwig
2016-04-04 17:16 ` Al Viro
2016-04-04 18:47 ` Al Viro
2016-04-04 19:50 ` Al Viro
2016-04-04 23:45 ` Al Viro [this message]
2016-04-07 15:55 ` Christoph Hellwig
2016-04-08 19:19 ` Al Viro
2016-04-07 15:53 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160404234508.GJ17997@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=axboe@fb.com \
--cc=hch@infradead.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.