|
[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 |