qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]