Commit 7a1bcb5d authored by Al Viro's avatar Al Viro

iov_iter: massage iterate_iovec and iterate_kvec to logics similar to iterate_bvec

Premature optimization is the root of all evil...  Trying
to unroll the first pass through the loop makes it harder
to follow and not just for readers - compiler ends up
generating worse code than it would on a "non-optimized"
loop.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent f5da8354
...@@ -16,55 +16,44 @@ ...@@ -16,55 +16,44 @@
#define PIPE_PARANOIA /* for now */ #define PIPE_PARANOIA /* for now */
#define iterate_iovec(i, n, __v, __p, skip, STEP) { \ #define iterate_iovec(i, n, __v, __p, skip, STEP) { \
size_t left; \ size_t left; \
size_t wanted = n; \ size_t wanted = n; \
__p = i->iov; \ __p = i->iov; \
__v.iov_len = min(n, __p->iov_len - skip); \ do { \
if (likely(__v.iov_len)) { \ __v.iov_len = min(n, __p->iov_len - skip); \
__v.iov_base = __p->iov_base + skip; \ if (likely(__v.iov_len)) { \
left = (STEP); \ __v.iov_base = __p->iov_base + skip; \
__v.iov_len -= left; \ left = (STEP); \
skip += __v.iov_len; \ __v.iov_len -= left; \
n -= __v.iov_len; \ skip += __v.iov_len; \
} else { \ n -= __v.iov_len; \
left = 0; \ if (skip < __p->iov_len) \
} \ break; \
while (unlikely(!left && n)) { \ } \
__p++; \ __p++; \
__v.iov_len = min(n, __p->iov_len); \ skip = 0; \
if (unlikely(!__v.iov_len)) \ } while (n); \
continue; \ n = wanted - n; \
__v.iov_base = __p->iov_base; \
left = (STEP); \
__v.iov_len -= left; \
skip = __v.iov_len; \
n -= __v.iov_len; \
} \
n = wanted - n; \
} }
#define iterate_kvec(i, n, __v, __p, skip, STEP) { \ #define iterate_kvec(i, n, __v, __p, skip, STEP) { \
size_t wanted = n; \ size_t wanted = n; \
__p = i->kvec; \ __p = i->kvec; \
__v.iov_len = min(n, __p->iov_len - skip); \ do { \
if (likely(__v.iov_len)) { \ __v.iov_len = min(n, __p->iov_len - skip); \
__v.iov_base = __p->iov_base + skip; \ if (likely(__v.iov_len)) { \
(void)(STEP); \ __v.iov_base = __p->iov_base + skip; \
skip += __v.iov_len; \ (void)(STEP); \
n -= __v.iov_len; \ skip += __v.iov_len; \
} \ n -= __v.iov_len; \
while (unlikely(n)) { \ if (skip < __p->iov_len) \
__p++; \ break; \
__v.iov_len = min(n, __p->iov_len); \ } \
if (unlikely(!__v.iov_len)) \ __p++; \
continue; \ skip = 0; \
__v.iov_base = __p->iov_base; \ } while (n); \
(void)(STEP); \ n = wanted - n; \
skip = __v.iov_len; \
n -= __v.iov_len; \
} \
n = wanted; \
} }
#define iterate_bvec(i, n, __v, __bi, skip, STEP) { \ #define iterate_bvec(i, n, __v, __bi, skip, STEP) { \
...@@ -123,10 +112,6 @@ ...@@ -123,10 +112,6 @@
const struct iovec *iov; \ const struct iovec *iov; \
struct iovec v; \ struct iovec v; \
iterate_iovec(i, n, v, iov, skip, (I)) \ iterate_iovec(i, n, v, iov, skip, (I)) \
if (skip == iov->iov_len) { \
iov++; \
skip = 0; \
} \
i->nr_segs -= iov - i->iov; \ i->nr_segs -= iov - i->iov; \
i->iov = iov; \ i->iov = iov; \
} else if (iov_iter_is_bvec(i)) { \ } else if (iov_iter_is_bvec(i)) { \
...@@ -141,10 +126,6 @@ ...@@ -141,10 +126,6 @@
const struct kvec *kvec; \ const struct kvec *kvec; \
struct kvec v; \ struct kvec v; \
iterate_kvec(i, n, v, kvec, skip, (K)) \ iterate_kvec(i, n, v, kvec, skip, (K)) \
if (skip == kvec->iov_len) { \
kvec++; \
skip = 0; \
} \
i->nr_segs -= kvec - i->kvec; \ i->nr_segs -= kvec - i->kvec; \
i->kvec = kvec; \ i->kvec = kvec; \
} else if (iov_iter_is_xarray(i)) { \ } else if (iov_iter_is_xarray(i)) { \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment