[Intel-gfx] [PATCH 05/38] drm/i915: Compress GPU objects in error state
Joonas Lahtinen
joonas.lahtinen at linux.intel.com
Wed Sep 21 07:55:41 UTC 2016
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.lahtinen at linux.intel.com>
Regards, Joonas
--
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
More information about the Intel-gfx
mailing list