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

[Xen-devel] [RFC PATCH v3 17/22] Add lu_stream_{open, close, append}_record()



From: David Woodhouse <dwmw@xxxxxxxxxxxx>

Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx>
---
 xen/common/lu/stream.c | 50 ++++++++++++++++++++++++++++++++++++++++++
 xen/include/xen/lu.h   |  5 +++++
 2 files changed, 55 insertions(+)

diff --git a/xen/common/lu/stream.c b/xen/common/lu/stream.c
index 8c44a4eb37..2ee870e80a 100644
--- a/xen/common/lu/stream.c
+++ b/xen/common/lu/stream.c
@@ -33,6 +33,7 @@
 #include <xen/types.h>
 #include <xen/vmap.h>
 #include <xen/lu.h>
+#include <public/migration_stream.h>
 
 static int lu_stream_extend(struct lu_stream *stream, int nr_pages)
 {
@@ -105,6 +106,55 @@ int lu_stream_append(struct lu_stream *stream, const void 
*data, size_t size)
     return 0;
 }
 
+int lu_stream_open_record(struct lu_stream *stream, unsigned int type)
+{
+    struct mr_rhdr *hdr;
+
+    stream->last_hdr = stream->len;
+
+    hdr = lu_stream_reserve(stream, sizeof(hdr));
+    if (!hdr)
+        return -ENOMEM;
+
+    hdr->type = type;
+    hdr->length = 0;
+
+    lu_stream_end_reservation(stream, sizeof(*hdr));
+
+    return 0;
+}
+
+int lu_stream_close_record(struct lu_stream *stream)
+{
+    uint64_t zeroes = 0;
+    struct mr_rhdr *hdr;
+    int rc = 0;
+
+    hdr = (struct mr_rhdr *)(stream->data + stream->last_hdr);
+
+    hdr->length = stream->len - stream->last_hdr - sizeof(*hdr);
+
+    if (stream->len & 7)
+        rc = lu_stream_append(stream, &zeroes, 8 - (stream->len & 7));
+
+    return rc;
+}
+
+int lu_stream_append_record(struct lu_stream *stream, unsigned int type,
+                            void *rec, size_t len)
+{
+    int rc;
+
+
+    rc = lu_stream_open_record(stream, type);
+    if (!rc && len)
+        rc = lu_stream_append(stream, rec, len);
+    if (!rc)
+        rc = lu_stream_close_record(stream);
+
+    return 0;
+}
+
 void lu_stream_free(struct lu_stream *stream)
 {
     unsigned int order = get_order_from_bytes((stream->nr_pages + 1) * 
sizeof(mfn_t));
diff --git a/xen/include/xen/lu.h b/xen/include/xen/lu.h
index 21abace130..c02268e414 100644
--- a/xen/include/xen/lu.h
+++ b/xen/include/xen/lu.h
@@ -9,6 +9,7 @@
 
 struct lu_stream {
     mfn_t *pagelist;
+    size_t last_hdr;
     size_t len;
     int nr_pages;
     char *data;
@@ -17,6 +18,10 @@ struct lu_stream {
 void *lu_stream_reserve(struct lu_stream *stream, size_t size);
 void lu_stream_end_reservation(struct lu_stream *stream, size_t size);
 int lu_stream_append(struct lu_stream *stream, const void *data, size_t size);
+int lu_stream_open_record(struct lu_stream *stream, unsigned int type);
+int lu_stream_close_record(struct lu_stream *stream);
+int lu_stream_append_record(struct lu_stream *stream, unsigned int type,
+                            void *rec, size_t len);
 void lu_stream_free(struct lu_stream *stream);
 
 struct kexec_image;
-- 
2.21.0


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.