qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V7 2/6] Adding utility function iov_net_csum_add


From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] [PATCH V7 2/6] Adding utility function iov_net_csum_add() for iovec checksum calculation Adding utility function iov_rebuild() for smart iovec copy
Date: Fri, 30 Nov 2012 16:35:09 +0100

On Fri, Nov 16, 2012 at 2:55 PM, Dmitry Fleytman <address@hidden> wrote:
> @@ -252,6 +253,58 @@ unsigned iov_copy(struct iovec *dst_iov, unsigned int 
> dst_iov_cnt,
>      return j;
>  }
>
> +size_t iov_rebuild(struct iovec *dst, unsigned int dst_cnt,
> +                   const struct iovec *src, const unsigned int src_cnt,
> +                   size_t src_off)
> +{
> +    size_t curr_src_off = 0;
> +    unsigned int i, j = 0;
> +
> +    for (i = 0; i < src_cnt; i++) {
> +        if (src_off < (curr_src_off + src[i].iov_len)) {
> +            if (j == dst_cnt) {
> +                return (size_t) -1;
> +            }
> +
> +            dst[j].iov_len = curr_src_off + src[i].iov_len - src_off;
> +            dst[j].iov_base = src[i].iov_base + (src_off - curr_src_off);
> +
> +            src_off += dst[j].iov_len;
> +            j++;
> +        }
> +        curr_src_off += src[i].iov_len;
> +    }
> +    return j;
> +}

The existing iov_copy() function provides equivalent functionality.  I
don't think iov_rebuild() is needed.

> +uint32_t
> +iov_net_csum_add(const struct iovec *iov, const unsigned int iov_cnt,
> +                 size_t iov_off, size_t size)
> +{
> +    size_t iovec_off, buf_off;
> +    unsigned int i;
> +    uint32_t res = 0;
> +    uint32_t seq = 0;
> +
> +    iovec_off = 0;
> +    buf_off = 0;
> +    for (i = 0; i < iov_cnt && size; i++) {
> +        if (iov_off < (iovec_off + iov[i].iov_len)) {
> +            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
> +            void *chunk_buf = iov[i].iov_base + (iov_off - iovec_off);
> +
> +            res += net_checksum_add_cont(len, chunk_buf, seq);
> +            seq += len;
> +
> +            buf_off += len;
> +            iov_off += len;
> +            size -= len;
> +        }
> +        iovec_off += iov[i].iov_len;
> +    }
> +    return res;
> +}

Rename this net_checksum_add_iov() and place it in net/checksum.c,
then the new dependency on net from block can be dropped.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]