[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [Bug 1618122] Re: qemu-monitor screendump very slow
From: |
vans163 |
Subject: |
[Qemu-devel] [Bug 1618122] Re: qemu-monitor screendump very slow |
Date: |
Mon, 29 Aug 2016 19:01:48 -0000 |
** Description changed:
qemu-monitor screendump often using 10-20% cpu usage of one core to take
a small capture.
Most of the CPU usage seems to come from libpixman. There were many
reports of libpixman becoming 8 times slower in newer releases.
https://github.com/qemu/qemu/blob/0c56c6ab68902281094c7aac6305e2321c34c187/ui/console.c#L285
Simple Valgrind Ir report.
--------------------------------------------------------------------------------
- Ir
+ Ir
--------------------------------------------------------------------------------
9,994,313,959 PROGRAM TOTALS
--------------------------------------------------------------------------------
- Ir file:function
+ Ir file:function
--------------------------------------------------------------------------------
4,883,603,360
/usr/src/debug/pixman-0.34.0/pixman/pixman-access.c:store_scanline_b8g8r8
[/usr/lib64/libpixman-1.so.0.34.0]
- 282,312,800
/usr/src/debug/pixman-0.34.0/pixman/pixman-implementation.c:_pixman_implementation_iter_init
[/usr/lib64/libpixman-1.so.0.34.0]
- 267,394,160
/usr/src/debug/pixman-0.34.0/pixman/pixman-sse2.c:sse2_fetch_x8r8g8b8
[/usr/lib64/libpixman-1.so.0.34.0]
- 256,761,600
/usr/src/debug/pixman-0.34.0/pixman/pixman-private.h:store_scanline_b8g8r8
- 254,676,199 ???:0x0000000000011f40 [/usr/lib64/libjemalloc.so.2]
- 199,990,526 ???:0x0000000000011a10 [/usr/lib64/libjemalloc.so.2]
+ 282,312,800
/usr/src/debug/pixman-0.34.0/pixman/pixman-implementation.c:_pixman_implementation_iter_init
[/usr/lib64/libpixman-1.so.0.34.0]
+ 267,394,160
/usr/src/debug/pixman-0.34.0/pixman/pixman-sse2.c:sse2_fetch_x8r8g8b8
[/usr/lib64/libpixman-1.so.0.34.0]
+ 256,761,600
/usr/src/debug/pixman-0.34.0/pixman/pixman-private.h:store_scanline_b8g8r8
+ 254,676,199 ???:0x0000000000011f40 [/usr/lib64/libjemalloc.so.2]
+ 199,990,526 ???:0x0000000000011a10 [/usr/lib64/libjemalloc.so.2]
+
+ Calls to there start from.
+ qemu_pixman_linebuf_fill
+ pixman_image_composite
+ ????
+ pixman_image_composite32
+ general_composite_rect
I tried taking a look on how to fix this, but it seems pixman is deeply
enrooted inside the monitor. I wanted to try to simply take whats on the
display and memcpy it into .ppm format manually creating the file header, but I
cant figure out where the raw display buffer/image is gotten from.
For example this is DisplaySurface:
struct DisplaySurface {
pixman_format_code_t format;
pixman_image_t *image;
uint8_t flags;
#ifdef CONFIG_OPENGL
GLenum glformat;
GLenum gltype;
GLuint texture;
#endif
};
Which as you can see already has the pixman_image_t. Maybe I should just
work with that pixman_image_t?
The most effective solution IMO seems to just memcpy from the display
into a premade header for a .ppm or .bmp file assuming 24 or 32 bpp. No
need for libpixman.
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1618122
Title:
qemu-monitor screendump very slow
Status in QEMU:
New
Bug description:
qemu-monitor screendump often using 10-20% cpu usage of one core to
take a small capture.
Most of the CPU usage seems to come from libpixman. There were many
reports of libpixman becoming 8 times slower in newer releases.
https://github.com/qemu/qemu/blob/0c56c6ab68902281094c7aac6305e2321c34c187/ui/console.c#L285
Simple Valgrind Ir report.
--------------------------------------------------------------------------------
Ir
--------------------------------------------------------------------------------
9,994,313,959 PROGRAM TOTALS
--------------------------------------------------------------------------------
Ir file:function
--------------------------------------------------------------------------------
4,883,603,360
/usr/src/debug/pixman-0.34.0/pixman/pixman-access.c:store_scanline_b8g8r8
[/usr/lib64/libpixman-1.so.0.34.0]
282,312,800
/usr/src/debug/pixman-0.34.0/pixman/pixman-implementation.c:_pixman_implementation_iter_init
[/usr/lib64/libpixman-1.so.0.34.0]
267,394,160
/usr/src/debug/pixman-0.34.0/pixman/pixman-sse2.c:sse2_fetch_x8r8g8b8
[/usr/lib64/libpixman-1.so.0.34.0]
256,761,600
/usr/src/debug/pixman-0.34.0/pixman/pixman-private.h:store_scanline_b8g8r8
254,676,199 ???:0x0000000000011f40 [/usr/lib64/libjemalloc.so.2]
199,990,526 ???:0x0000000000011a10 [/usr/lib64/libjemalloc.so.2]
Calls to there start from.
qemu_pixman_linebuf_fill
pixman_image_composite
????
pixman_image_composite32
general_composite_rect
I tried taking a look on how to fix this, but it seems pixman is deeply
enrooted inside the monitor. I wanted to try to simply take whats on the
display and memcpy it into .ppm format manually creating the file header, but I
cant figure out where the raw display buffer/image is gotten from.
For example this is DisplaySurface:
struct DisplaySurface {
pixman_format_code_t format;
pixman_image_t *image;
uint8_t flags;
#ifdef CONFIG_OPENGL
GLenum glformat;
GLenum gltype;
GLuint texture;
#endif
};
Which as you can see already has the pixman_image_t. Maybe I should
just work with that pixman_image_t?
The most effective solution IMO seems to just memcpy from the display
into a premade header for a .ppm or .bmp file assuming 24 or 32 bpp.
No need for libpixman.
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1618122/+subscriptions