qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2] Optimize screendump
@ 2011-06-20  8:12 Avi Kivity
  2011-06-20 12:33 ` Jan Kiszka
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Avi Kivity @ 2011-06-20  8:12 UTC (permalink / raw)
  To: qemu-devel

When running kvm-autotest, fputc() is often the second highest (sometimes #1)
function showing up in a profile.  This is due to fputc() locking the file
for every byte written.

Optimize by buffering a line's worth of pixels and writing that out in a
single call.

Signed-off-by: Avi Kivity <avi@redhat.com>
---

v2: drop unportable fputc_unlocked

 hw/vga.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/hw/vga.c b/hw/vga.c
index d5bc582..97c96bf 100644
--- a/hw/vga.c
+++ b/hw/vga.c
@@ -2349,15 +2349,19 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)
     uint32_t v;
     int y, x;
     uint8_t r, g, b;
+    int ret;
+    char *linebuf, *pbuf;
 
     f = fopen(filename, "wb");
     if (!f)
         return -1;
     fprintf(f, "P6\n%d %d\n%d\n",
             ds->width, ds->height, 255);
+    linebuf = qemu_malloc(ds->width * 3);
     d1 = ds->data;
     for(y = 0; y < ds->height; y++) {
         d = d1;
+        pbuf = linebuf;
         for(x = 0; x < ds->width; x++) {
             if (ds->pf.bits_per_pixel == 32)
                 v = *(uint32_t *)d;
@@ -2369,13 +2373,16 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)
                 (ds->pf.gmax + 1);
             b = ((v >> ds->pf.bshift) & ds->pf.bmax) * 256 /
                 (ds->pf.bmax + 1);
-            fputc(r, f);
-            fputc(g, f);
-            fputc(b, f);
+            *pbuf++ = r;
+            *pbuf++ = g;
+            *pbuf++ = b;
             d += ds->pf.bytes_per_pixel;
         }
         d1 += ds->linesize;
+        ret = fwrite(linebuf, 1, pbuf - linebuf, f);
+        (void)ret;
     }
+    qemu_free(linebuf);
     fclose(f);
     return 0;
 }
-- 
1.7.5.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v2] Optimize screendump
  2011-06-20  8:12 [Qemu-devel] [PATCH v2] Optimize screendump Avi Kivity
@ 2011-06-20 12:33 ` Jan Kiszka
  2011-06-20 13:11   ` Avi Kivity
  2011-06-20 15:39 ` Stefan Hajnoczi
  2011-06-22 12:58 ` Anthony Liguori
  2 siblings, 1 reply; 7+ messages in thread
From: Jan Kiszka @ 2011-06-20 12:33 UTC (permalink / raw)
  To: Avi Kivity, qemu-devel

On 2011-06-20 10:12, Avi Kivity wrote:
> When running kvm-autotest, fputc() is often the second highest (sometimes #1)
> function showing up in a profile.  This is due to fputc() locking the file
> for every byte written.
> 
> Optimize by buffering a line's worth of pixels and writing that out in a
> single call.
> 
> Signed-off-by: Avi Kivity <avi@redhat.com>
> ---
> 
> v2: drop unportable fputc_unlocked
> 
>  hw/vga.c |   13 ++++++++++---
>  1 files changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/vga.c b/hw/vga.c
> index d5bc582..97c96bf 100644
> --- a/hw/vga.c
> +++ b/hw/vga.c
> @@ -2349,15 +2349,19 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)
>      uint32_t v;
>      int y, x;
>      uint8_t r, g, b;
> +    int ret;
> +    char *linebuf, *pbuf;
>  
>      f = fopen(filename, "wb");
>      if (!f)
>          return -1;
>      fprintf(f, "P6\n%d %d\n%d\n",
>              ds->width, ds->height, 255);
> +    linebuf = qemu_malloc(ds->width * 3);
>      d1 = ds->data;
>      for(y = 0; y < ds->height; y++) {
>          d = d1;
> +        pbuf = linebuf;
>          for(x = 0; x < ds->width; x++) {
>              if (ds->pf.bits_per_pixel == 32)
>                  v = *(uint32_t *)d;
> @@ -2369,13 +2373,16 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)
>                  (ds->pf.gmax + 1);
>              b = ((v >> ds->pf.bshift) & ds->pf.bmax) * 256 /
>                  (ds->pf.bmax + 1);
> -            fputc(r, f);
> -            fputc(g, f);
> -            fputc(b, f);
> +            *pbuf++ = r;
> +            *pbuf++ = g;
> +            *pbuf++ = b;
>              d += ds->pf.bytes_per_pixel;
>          }
>          d1 += ds->linesize;
> +        ret = fwrite(linebuf, 1, pbuf - linebuf, f);
> +        (void)ret;
>      }
> +    qemu_free(linebuf);
>      fclose(f);
>      return 0;
>  }

Unrelated to this patch, but why is this function located in vga.c and
not in console.c?

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v2] Optimize screendump
  2011-06-20 12:33 ` Jan Kiszka
@ 2011-06-20 13:11   ` Avi Kivity
  2011-06-22 21:22     ` Andreas Färber
  0 siblings, 1 reply; 7+ messages in thread
From: Avi Kivity @ 2011-06-20 13:11 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: qemu-devel

On 06/20/2011 03:33 PM, Jan Kiszka wrote:
> >  --- a/hw/vga.c
> >  +++ b/hw/vga.c
> >  @@ -2349,15 +2349,19 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)

> Unrelated to this patch, but why is this function located in vga.c and
> not in console.c?

It's located in omap_lcdc.c  as well.  But it needs to be fully 
generalized to be moved out (handle all PixelFormats).

-- 
error compiling committee.c: too many arguments to function

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v2] Optimize screendump
  2011-06-20  8:12 [Qemu-devel] [PATCH v2] Optimize screendump Avi Kivity
  2011-06-20 12:33 ` Jan Kiszka
@ 2011-06-20 15:39 ` Stefan Hajnoczi
  2011-06-22 12:58 ` Anthony Liguori
  2 siblings, 0 replies; 7+ messages in thread
From: Stefan Hajnoczi @ 2011-06-20 15:39 UTC (permalink / raw)
  To: Avi Kivity; +Cc: qemu-devel

On Mon, Jun 20, 2011 at 9:12 AM, Avi Kivity <avi@redhat.com> wrote:
> When running kvm-autotest, fputc() is often the second highest (sometimes #1)
> function showing up in a profile.  This is due to fputc() locking the file
> for every byte written.
>
> Optimize by buffering a line's worth of pixels and writing that out in a
> single call.
>
> Signed-off-by: Avi Kivity <avi@redhat.com>
> ---
>
> v2: drop unportable fputc_unlocked
>
>  hw/vga.c |   13 ++++++++++---
>  1 files changed, 10 insertions(+), 3 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v2] Optimize screendump
  2011-06-20  8:12 [Qemu-devel] [PATCH v2] Optimize screendump Avi Kivity
  2011-06-20 12:33 ` Jan Kiszka
  2011-06-20 15:39 ` Stefan Hajnoczi
@ 2011-06-22 12:58 ` Anthony Liguori
  2 siblings, 0 replies; 7+ messages in thread
From: Anthony Liguori @ 2011-06-22 12:58 UTC (permalink / raw)
  To: Avi Kivity; +Cc: qemu-devel

On 06/20/2011 03:12 AM, Avi Kivity wrote:
> When running kvm-autotest, fputc() is often the second highest (sometimes #1)
> function showing up in a profile.  This is due to fputc() locking the file
> for every byte written.
>
> Optimize by buffering a line's worth of pixels and writing that out in a
> single call.
>
> Signed-off-by: Avi Kivity<avi@redhat.com>

Applied.  Thanks.

Regards,

Anthony Liguori

> ---
>
> v2: drop unportable fputc_unlocked
>
>   hw/vga.c |   13 ++++++++++---
>   1 files changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/hw/vga.c b/hw/vga.c
> index d5bc582..97c96bf 100644
> --- a/hw/vga.c
> +++ b/hw/vga.c
> @@ -2349,15 +2349,19 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)
>       uint32_t v;
>       int y, x;
>       uint8_t r, g, b;
> +    int ret;
> +    char *linebuf, *pbuf;
>
>       f = fopen(filename, "wb");
>       if (!f)
>           return -1;
>       fprintf(f, "P6\n%d %d\n%d\n",
>               ds->width, ds->height, 255);
> +    linebuf = qemu_malloc(ds->width * 3);
>       d1 = ds->data;
>       for(y = 0; y<  ds->height; y++) {
>           d = d1;
> +        pbuf = linebuf;
>           for(x = 0; x<  ds->width; x++) {
>               if (ds->pf.bits_per_pixel == 32)
>                   v = *(uint32_t *)d;
> @@ -2369,13 +2373,16 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)
>                   (ds->pf.gmax + 1);
>               b = ((v>>  ds->pf.bshift)&  ds->pf.bmax) * 256 /
>                   (ds->pf.bmax + 1);
> -            fputc(r, f);
> -            fputc(g, f);
> -            fputc(b, f);
> +            *pbuf++ = r;
> +            *pbuf++ = g;
> +            *pbuf++ = b;
>               d += ds->pf.bytes_per_pixel;
>           }
>           d1 += ds->linesize;
> +        ret = fwrite(linebuf, 1, pbuf - linebuf, f);
> +        (void)ret;
>       }
> +    qemu_free(linebuf);
>       fclose(f);
>       return 0;
>   }

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v2] Optimize screendump
  2011-06-20 13:11   ` Avi Kivity
@ 2011-06-22 21:22     ` Andreas Färber
  2011-06-26 17:52       ` Blue Swirl
  0 siblings, 1 reply; 7+ messages in thread
From: Andreas Färber @ 2011-06-22 21:22 UTC (permalink / raw)
  To: Avi Kivity; +Cc: Blue Swirl, Jan Kiszka, qemu-devel Developers

Am 20.06.2011 um 15:11 schrieb Avi Kivity:

> On 06/20/2011 03:33 PM, Jan Kiszka wrote:
>> >  --- a/hw/vga.c
>> >  +++ b/hw/vga.c
>> >  @@ -2349,15 +2349,19 @@ int ppm_save(const char *filename,  
>> struct DisplaySurface *ds)
>
>> Unrelated to this patch, but why is this function located in vga.c  
>> and
>> not in console.c?
>
> It's located in omap_lcdc.c  as well.  But it needs to be fully  
> generalized to be moved out (handle all PixelFormats).

For the record, there's a similar function in tcx.c as well, and I  
have one coming in ibm8514.c.

Andreas

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v2] Optimize screendump
  2011-06-22 21:22     ` Andreas Färber
@ 2011-06-26 17:52       ` Blue Swirl
  0 siblings, 0 replies; 7+ messages in thread
From: Blue Swirl @ 2011-06-26 17:52 UTC (permalink / raw)
  To: Andreas Färber; +Cc: Jan Kiszka, Avi Kivity, qemu-devel Developers

On Thu, Jun 23, 2011 at 12:22 AM, Andreas Färber <andreas.faerber@web.de> wrote:
> Am 20.06.2011 um 15:11 schrieb Avi Kivity:
>
>> On 06/20/2011 03:33 PM, Jan Kiszka wrote:
>>>
>>> >  --- a/hw/vga.c
>>> >  +++ b/hw/vga.c
>>> >  @@ -2349,15 +2349,19 @@ int ppm_save(const char *filename, struct
>>> > DisplaySurface *ds)
>>
>>> Unrelated to this patch, but why is this function located in vga.c and
>>> not in console.c?
>>
>> It's located in omap_lcdc.c  as well.  But it needs to be fully
>> generalized to be moved out (handle all PixelFormats).
>
> For the record, there's a similar function in tcx.c as well, and I have one
> coming in ibm8514.c.

The screen dumpers generate their output based on the current state of
the graphics card and the VRAM, this is why they are device specific.

A generic screen dumper (if possible) would read the data from display
surface. Maybe this should be done at the SDL/VNC/Spice/curses/dummy
level, but the output shouldn't change depending on the back end in
question.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-06-26 17:53 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-20  8:12 [Qemu-devel] [PATCH v2] Optimize screendump Avi Kivity
2011-06-20 12:33 ` Jan Kiszka
2011-06-20 13:11   ` Avi Kivity
2011-06-22 21:22     ` Andreas Färber
2011-06-26 17:52       ` Blue Swirl
2011-06-20 15:39 ` Stefan Hajnoczi
2011-06-22 12:58 ` Anthony Liguori

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).