On 2/6/24 17:10, Stefano Brivio wrote:On Fri, 2 Feb 2024 15:11:28 +0100 Laurent Vivier <lvivier(a)redhat.com> wrote: ... diff --git a/iov.h b/iov.h new file mode 100644 index 000000000000..31fbf6d0e1cf --- /dev/null +++ b/iov.h @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/* some parts copied from QEMU include/qemu/iov.h */ + +#ifndef IOVEC_H +#define IOVEC_H + +#include <unistd.h> +#include <string.h> + +size_t iov_from_buf_full(const struct iovec *iov, unsigned int iov_cnt, + size_t offset, const void *buf, size_t bytes); +size_t iov_to_buf_full(const struct iovec *iov, const unsigned int iov_cnt, + size_t offset, void *buf, size_t bytes); + +static inline size_t iov_from_buf(const struct iovec *iov, + unsigned int iov_cnt, size_t offset, + const void *buf, size_t bytes) +{ Is there a particular reason to include these two in a header? The compiler will inline as needed if they are in a source file.This code has been introduced in QEMU by: commit ad523bca56a7202d2498c550a41be5c986c4d33c Author: Paolo Bonzini <pbonzini(a)redhat.com> Date: Tue Dec 22 12:03:33 2015 +0100 iov: avoid memcpy for "simple" iov_from_buf/iov_to_buf memcpy can take a large amount of time for small reads and writes. For virtio it is a common case that the first iovec can satisfy the whole read or write. In that case, and if bytes is a constant to avoid excessive growth of code, inline the first iteration into the caller. Signed-off-by: Paolo Bonzini <pbonzini(a)redhat.com> Message-id: 1450782213-14227-1-git-send-email-pbonzini(a)redhat.com Signed-off-by: Stefan Hajnoczi <stefanha(a)redhat.com> Is the compiler able to check "bytes" is a constant and inline the function if the definition is in a .c file and not in a .h ? Thanks, Laurent