[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <d151f81e-ec56-59c0-d2a0-ffd4a269fec1@gmail.com>
Date: Tue, 15 Dec 2020 11:23:34 +0000
From: Pavel Begunkov <asml.silence@...il.com>
To: David Laight <David.Laight@...LAB.COM>,
"linux-block@...r.kernel.org" <linux-block@...r.kernel.org>
Cc: Jens Axboe <axboe@...nel.dk>,
Christoph Hellwig <hch@...radead.org>,
Matthew Wilcox <willy@...radead.org>,
Ming Lei <ming.lei@...hat.com>,
Johannes Weiner <hannes@...xchg.org>,
Alexander Viro <viro@...iv.linux.org.uk>,
"Darrick J . Wong" <darrick.wong@...cle.com>,
"Martin K . Petersen" <martin.petersen@...cle.com>,
Jonathan Corbet <corbet@....net>,
"linux-xfs@...r.kernel.org" <linux-xfs@...r.kernel.org>,
"linux-fsdevel@...r.kernel.org" <linux-fsdevel@...r.kernel.org>,
"io-uring@...r.kernel.org" <io-uring@...r.kernel.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"target-devel@...r.kernel.org" <target-devel@...r.kernel.org>,
"linux-scsi@...r.kernel.org" <linux-scsi@...r.kernel.org>,
"linux-doc@...r.kernel.org" <linux-doc@...r.kernel.org>
Subject: Re: [PATCH v1 2/6] iov_iter: optimise bvec iov_iter_advance()
On 15/12/2020 09:37, David Laight wrote:
> From: Pavel Begunkov
>> Sent: 15 December 2020 00:20
>>
>> iov_iter_advance() is heavily used, but implemented through generic
>> iteration. As bvecs have a specifically crafted advance() function, i.e.
>> bvec_iter_advance(), which is faster and slimmer, use it instead.
>>
>> lib/iov_iter.c | 19 +++++++++++++++++++
[...]
>> void iov_iter_advance(struct iov_iter *i, size_t size)
>> {
>> if (unlikely(iov_iter_is_pipe(i))) {
>> @@ -1077,6 +1092,10 @@ void iov_iter_advance(struct iov_iter *i, size_t size)
>> i->count -= size;
>> return;
>> }
>> + if (iov_iter_is_bvec(i)) {
>> + iov_iter_bvec_advance(i, size);
>> + return;
>> + }
>> iterate_and_advance(i, size, v, 0, 0, 0)
>> }
>
> This seems to add yet another comparison before what is probably
> the common case on an IOVEC (ie normal userspace buffer).
If Al finally takes the patch for iov_iter_is_*() helpers it would
be completely optimised out.
>
> Can't the call to bver_iter_advance be dropped into the 'advance'
> path for BVEC's inside iterate_and_advance?
It iterates by page/segment/etc., why would you want to do
bver_iter_advance(i->count) there?
>
> iterate_and_advance itself has three 'unlikely' conditional tests
> that may be mis-predicted taken before the 'likely' path.
> One is for DISCARD which is checked twice on the object I just
> looked at - the test in iov_iter_advance() is pointless.
And again, both second checks, including for discards, would be
optimised out by the iov_iter_is_* patch.
--
Pavel Begunkov
Powered by blists - more mailing lists