[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 1/5] lib/vfscore: introduce vfscore_uioforeach
This is a template-type of function, to avoid code duplication. Compiler optimizes extra call to the function pointer passed as argument, so this should not have any performance impacts Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> --- lib/vfscore/include/vfscore/uio.h | 45 +++++++++++++++++++++++++++++++ lib/vfscore/subr_uio.c | 34 ++++++----------------- 2 files changed, 53 insertions(+), 26 deletions(-) diff --git a/lib/vfscore/include/vfscore/uio.h b/lib/vfscore/include/vfscore/uio.h index c734fa19..83dd5b9a 100644 --- a/lib/vfscore/include/vfscore/uio.h +++ b/lib/vfscore/include/vfscore/uio.h @@ -57,6 +57,51 @@ struct uio { enum uio_rw uio_rw; /* operation */ }; +/* This is a wrapper for functions f with a "memcpy-like" signature + * "dst, src, cnt" to be executed over a scatter-gather list provided + * by a struct uio. f() might be called multiple times to read from or + * write to cp up to n bytes of data (or up to the capacity of the uio + * scatter-gather buffers). + */ +static inline +int vfscore_uioforeach(int (*f)(void *, void *, size_t *), void *cp, + size_t n, struct uio *uio) +{ + int ret = 0; + + UK_ASSERT(uio->uio_rw == UIO_READ || uio->uio_rw == UIO_WRITE); + + while (n > 0 && uio->uio_resid) { + struct iovec *iov = uio->uio_iov; + size_t cnt = iov->iov_len; + + if (cnt == 0) { + uio->uio_iov++; + uio->uio_iovcnt--; + continue; + } + if (cnt > n) + cnt = n; + + if (uio->uio_rw == UIO_READ) + ret = f(iov->iov_base, cp, &cnt); + else + ret = f(cp, iov->iov_base, &cnt); + + iov->iov_base = (char *)iov->iov_base + cnt; + iov->iov_len -= cnt; + uio->uio_resid -= cnt; + uio->uio_offset += cnt; + cp = (char *)cp + cnt; + n -= cnt; + + if (ret) + break; + } + + return ret; +} + int vfscore_uiomove(void *cp, int n, struct uio *uio); #endif /* !_UIO_H_ */ diff --git a/lib/vfscore/subr_uio.c b/lib/vfscore/subr_uio.c index aa176074..e6e1cdf0 100644 --- a/lib/vfscore/subr_uio.c +++ b/lib/vfscore/subr_uio.c @@ -45,34 +45,16 @@ #include <string.h> #include <vfscore/uio.h> +static int __memcpy_wrapper(void *dst, void *src, size_t *cnt) +{ + memcpy(dst, src, *cnt); + return 0; +} + int vfscore_uiomove(void *cp, int n, struct uio *uio) { - UK_ASSERT(uio->uio_rw == UIO_READ || uio->uio_rw == UIO_WRITE); + int ret = vfscore_uioforeach(__memcpy_wrapper, cp, n, uio); - while (n > 0 && uio->uio_resid) { - struct iovec *iov = uio->uio_iov; - int cnt = iov->iov_len; - if (cnt == 0) { - uio->uio_iov++; - uio->uio_iovcnt--; - continue; - } - if (cnt > n) - cnt = n; - - if (uio->uio_rw == UIO_READ) - memcpy(iov->iov_base, cp, cnt); - else - memcpy(cp, iov->iov_base, cnt); - - iov->iov_base = (char *)iov->iov_base + cnt; - iov->iov_len -= cnt; - uio->uio_resid -= cnt; - uio->uio_offset += cnt; - cp = (char *)cp + cnt; - n -= cnt; - } - - return 0; + return ret; } -- 2.19.2 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |