On ti, 2016-09-20 at 09:29 +0100, Chris Wilson wrote:
> @@ -175,6 +176,110 @@ static void i915_error_puts(struct 
> drm_i915_error_state_buf *e,
>  #define err_printf(e, ...) i915_error_printf(e, __VA_ARGS__)
>  #define err_puts(e, s) i915_error_puts(e, s)
>  
> +#ifdef CONFIG_DRM_I915_COMPRESS_ERROR
> +
> +static bool compress_init(struct z_stream_s *zstream)
> +{
> +     memset(zstream, 0, sizeof(*zstream));
> +
> +     zstream->workspace =
> +             kmalloc(zlib_deflate_workspacesize(MAX_WBITS, MAX_MEM_LEVEL),
> +                     GFP_ATOMIC | __GFP_NOWARN);
> +     if (!zstream->workspace)
> +             return NULL;

                return false;

> +static int compress_page(struct z_stream_s *zstream,
> +                      void *src,
> +                      struct drm_i915_error_object *dst)
> +{
> +     zstream->next_in = src;
> +     zstream->avail_in = PAGE_SIZE;
> +
> +     do {
> +             if (zstream->avail_out == 0) {
> +                     unsigned long page;
> +
> +                     page = __get_free_page(GFP_ATOMIC | __GFP_NOWARN);
> +                     if (!page)
> +                             return -ENOMEM;
> +
> +                     dst->pages[dst->page_count++] = (void *)page;
> +
> +                     zstream->next_out = (void *)page;
> +                     zstream->avail_out = PAGE_SIZE;
> +             }
> +
> +             if (zlib_deflate(zstream, Z_SYNC_FLUSH) != Z_OK)
> +                     return -EIO;
> +
> +             /* Fallback to uncompressed if we increase size? */
> +             if (0 && zstream->total_out > zstream->total_in)
> +                     return -E2BIG;

We could still end up decreasing in the future, so this check should
really be outside of this function at the end of compression.

> @@ -327,13 +450,23 @@ static void print_error_obj(struct 
> drm_i915_error_state_buf *m,
>                          lower_32_bits(obj->gtt_offset));
>       }
>  
> -     for (page = offset = 0; page < obj->page_count; page++) {
> -             for (elt = 0; elt < PAGE_SIZE/4; elt++) {
> -                     err_printf(m, "%08x :  %08x\n", offset,
> -                                obj->pages[page][elt]);
> -                     offset += 4;
> +     err_compression_marker(m);
> +     for (page = 0; page < obj->page_count; page++) {
> +             int i, len;
> +
> +             len = PAGE_SIZE;
> +             if (page == obj->page_count - 1)
> +                     len -= obj->unused;
> +             len = (len + 3) / 4;

Magic-ish. ascii85_length() or so.

> +     num_pages = DIV_ROUND_UP(10 * num_pages, 8); /* worstcase zlib growth */

Could be a function added to kernel zlib.

Above addressed;

Reviewed-by: Joonas Lahtinen <joonas.lahti...@linux.intel.com>

Regards, Joonas
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to