[Spice-devel] [Xspice PATCH 09/11] qxl_ring: replace memcpy with a simple copy_to/from_qxl_ring
Uri Lublin
uril at redhat.com
Mon Jan 26 02:35:41 PST 2015
cc: Dave Airlie <airlied at redhat.com>
Since memcpy is not supposed to be used on volatile memory, use
a simple loop that copies one byte at a time.
This fixes compiler warnings:
qxl_ring.c: In function ‘qxl_ring_push’:
qxl_ring.c:96: warning: cast discards qualifiers from pointer target type
qxl_ring.c: In function ‘qxl_ring_pop’:
qxl_ring.c:121: warning: cast discards qualifiers from pointer target type
Related to commit f7ba4bae
This commit may hurt performance a bit, but users of these functions use
n=8 or n=16, so it should not be too bad.
To boost performance, we can copy 8 bytes (uint64_t) at a time
instead of one, as users of this function always have n=8 or n=16.
---
src/qxl_ring.c | 24 ++++++++++++++++++++----
1 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/src/qxl_ring.c b/src/qxl_ring.c
index 0dcacf7..3928d51 100644
--- a/src/qxl_ring.c
+++ b/src/qxl_ring.c
@@ -69,6 +69,24 @@ qxl_ring_create (struct qxl_ring_header *header,
return ring;
}
+static void
+copy_to_qxl_ring(volatile uint8_t *ring_dst, const uint8_t *src, int n)
+{
+ int i;
+
+ for (i=0; i<n; i++)
+ ring_dst[i] = src[i];
+}
+
+static void
+copy_from_qxl_ring(uint8_t *dst, volatile uint8_t *ring_src, int n)
+{
+ int i;
+
+ for (i=0; i<n; i++)
+ dst[i] = ring_src[i];
+}
+
void
qxl_ring_push (struct qxl_ring *ring,
const void *new_elt)
@@ -91,9 +109,7 @@ qxl_ring_push (struct qxl_ring *ring,
idx = header->prod & (ring->n_elements - 1);
elt = ring->ring->elements + idx * ring->element_size;
- /* TODO: We should use proper MMIO accessors; the use of
- volatile leads to a gcc warning. See commit f7ba4bae */
- memcpy((void *)elt, new_elt, ring->element_size);
+ copy_to_qxl_ring(elt, new_elt, ring->element_size);
header->prod++;
@@ -118,7 +134,7 @@ qxl_ring_pop (struct qxl_ring *ring,
idx = header->cons & (ring->n_elements - 1);
ring_elt = ring->ring->elements + idx * ring->element_size;
- memcpy (element, (void *)ring_elt, ring->element_size);
+ copy_from_qxl_ring(element, ring_elt, ring->element_size);
header->cons++;
--
1.7.1
More information about the Spice-devel
mailing list