lkml.org 
[lkml]   [2021]   [Jun]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 23/37] iov_iter: massage iterate_iovec and iterate_kvec to logics similar to iterate_bvec
    Date
    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>
    ---
    lib/iov_iter.c | 91 +++++++++++++++++++++++-----------------------------------
    1 file changed, 36 insertions(+), 55 deletions(-)

    diff --git a/lib/iov_iter.c b/lib/iov_iter.c
    index ebb907c6393c..578f40788943 100644
    --- a/lib/iov_iter.c
    +++ b/lib/iov_iter.c
    @@ -16,55 +16,44 @@

    #define PIPE_PARANOIA /* for now */

    -#define iterate_iovec(i, n, __v, __p, skip, STEP) { \
    - size_t left; \
    - size_t wanted = n; \
    - __p = i->iov; \
    - __v.iov_len = min(n, __p->iov_len - skip); \
    - if (likely(__v.iov_len)) { \
    - __v.iov_base = __p->iov_base + skip; \
    - left = (STEP); \
    - __v.iov_len -= left; \
    - skip += __v.iov_len; \
    - n -= __v.iov_len; \
    - } else { \
    - left = 0; \
    - } \
    - while (unlikely(!left && n)) { \
    - __p++; \
    - __v.iov_len = min(n, __p->iov_len); \
    - if (unlikely(!__v.iov_len)) \
    - continue; \
    - __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_iovec(i, n, __v, __p, skip, STEP) { \
    + size_t left; \
    + size_t wanted = n; \
    + __p = i->iov; \
    + do { \
    + __v.iov_len = min(n, __p->iov_len - skip); \
    + if (likely(__v.iov_len)) { \
    + __v.iov_base = __p->iov_base + skip; \
    + left = (STEP); \
    + __v.iov_len -= left; \
    + skip += __v.iov_len; \
    + n -= __v.iov_len; \
    + if (skip < __p->iov_len) \
    + break; \
    + } \
    + __p++; \
    + skip = 0; \
    + } while (n); \
    + n = wanted - n; \
    }

    -#define iterate_kvec(i, n, __v, __p, skip, STEP) { \
    - size_t wanted = n; \
    - __p = i->kvec; \
    - __v.iov_len = min(n, __p->iov_len - skip); \
    - if (likely(__v.iov_len)) { \
    - __v.iov_base = __p->iov_base + skip; \
    - (void)(STEP); \
    - skip += __v.iov_len; \
    - n -= __v.iov_len; \
    - } \
    - while (unlikely(n)) { \
    - __p++; \
    - __v.iov_len = min(n, __p->iov_len); \
    - if (unlikely(!__v.iov_len)) \
    - continue; \
    - __v.iov_base = __p->iov_base; \
    - (void)(STEP); \
    - skip = __v.iov_len; \
    - n -= __v.iov_len; \
    - } \
    - n = wanted; \
    +#define iterate_kvec(i, n, __v, __p, skip, STEP) { \
    + size_t wanted = n; \
    + __p = i->kvec; \
    + do { \
    + __v.iov_len = min(n, __p->iov_len - skip); \
    + if (likely(__v.iov_len)) { \
    + __v.iov_base = __p->iov_base + skip; \
    + (void)(STEP); \
    + skip += __v.iov_len; \
    + n -= __v.iov_len; \
    + if (skip < __p->iov_len) \
    + break; \
    + } \
    + __p++; \
    + skip = 0; \
    + } while (n); \
    + n = wanted - n; \
    }

    #define iterate_bvec(i, n, __v, __bi, skip, STEP) { \
    @@ -123,10 +112,6 @@
    const struct iovec *iov; \
    struct iovec v; \
    iterate_iovec(i, n, v, iov, skip, (I)) \
    - if (skip == iov->iov_len) { \
    - iov++; \
    - skip = 0; \
    - } \
    i->nr_segs -= iov - i->iov; \
    i->iov = iov; \
    } else if (iov_iter_is_bvec(i)) { \
    @@ -141,10 +126,6 @@
    const struct kvec *kvec; \
    struct kvec v; \
    iterate_kvec(i, n, v, kvec, skip, (K)) \
    - if (skip == kvec->iov_len) { \
    - kvec++; \
    - skip = 0; \
    - } \
    i->nr_segs -= kvec - i->kvec; \
    i->kvec = kvec; \
    } else if (iov_iter_is_xarray(i)) { \
    --
    2.11.0
    \
     
     \ /
      Last update: 2021-06-06 21:13    [W:4.060 / U:0.340 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site