Alex Williamson
2007-Aug-21 15:44 UTC
[Xen-devel] Re: [Xen-ia64-devel] [PATCH] Fix unaligned reference of QEMU
On Tue, 2007-08-21 at 06:23 -0600, Alex Williamson wrote:> On Tue, 2007-08-21 at 14:58 +0800, Duan, Ronghui wrote: > > Hi > > > > In current changeset.,qemu copy data uses memcpy_words, which copies 4 > > bytes at once if the length is larger than 4. This causes unaligned > > reference and leads to a performance downgrade. The issue met in > > rtl8139 emulator. This patch fixes it. > > Hi, > > I''d like to see this get fixed, but I''m not sure this is the right > way to do it. Originally, there was a simple memcpy() here. The > trouble started with this patch: > > http://xenbits.xensource.com/xen-unstable.hg?rev/677731eb734d > > This change required 8-byte alignment on 64 bit systems instead of the > 4-byte claimed in the changelog, which resulted in this patch: > > http://xenbits.xensource.com/xen-unstable.hg?rev/896b536d66c9 > > Now the problem appears to be that memcpy_words() is not isolated to > only the USB traffic. When I see the unaligned accesses, they seem to > have some correlation with network traffic, and your benchmark results > prove that. I think we need figure out when to use memcpy_words to > avoid the USB issue and when to use memcpy. Maybe we can do that by > looking at the alignment and using the best one, or maybe it''s possible > to distinguish data streams in exec-dm. Thanks,Here''s a fix that might work. We simply test the alignment of source and destination and choose which copy method to use. If its aligned, word copy, otherwise memcpy. The assumption being that these magic USB buffers that need alignment will do the right thing. This actually increases throughput more than 10x in a wget into an HVM domain (~2.5MB/s vs ~30MB/s). Keir, if this looks ok, could you please apply to the mainline since this is common code? Thanks, Alex Signed-off-by: Alex Williamson <alex.williamson@hp.com> --- diff -r 049d4baa9965 tools/ioemu/target-i386-dm/exec-dm.c --- a/tools/ioemu/target-i386-dm/exec-dm.c Thu Aug 16 13:46:50 2007 -0600 +++ b/tools/ioemu/target-i386-dm/exec-dm.c Tue Aug 21 09:28:27 2007 -0600 @@ -470,6 +470,12 @@ static void memcpy_words(void *dst, void #else static void memcpy_words(void *dst, void *src, size_t n) { + /* word copies require proper alignment of src & dst */ + if ((((unsigned long)dst | (unsigned long)src) & 0x3) != 0) { + memcpy(dst, src, n); + return; + } + while (n >= sizeof(uint32_t)) { *((uint32_t *)dst) = *((uint32_t *)src); dst = ((uint32_t *)dst) + 1; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Maybe Matching Threads
- Bug#389320: Patch to add ia64 support
- [PATCH] trivial build cleanup
- RE: [Xen-ia64-devel] New error trying to create a domain(usinglatestxend-unstable
- [Bug 1462] New: Unaligned access warnings on IA64 when using umac-64
- [RFC v1 3/5] VBD: enlarge max segment per request in blkfront