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: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -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 @@
|
|||||||
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 @@
|
|||||||
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)) { \
|
||||||
|
|||||||
Reference in New Issue
Block a user