All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ser, Simon" <simon.ser@intel.com>
To: "rodrigosiqueiramelo@gmail.com" <rodrigosiqueiramelo@gmail.com>
Cc: "intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"igt-dev@lists.freedesktop.org" <igt-dev@lists.freedesktop.org>,
	"nd@arm.com" <nd@arm.com>
Subject: Re: [igt-dev] [PATCH V6 i-g-t 3/6] lib: Add function to hash a framebuffer
Date: Fri, 12 Jul 2019 12:17:42 +0000	[thread overview]
Message-ID: <89a0e0508c989289690ecea001bb9ae51da9ac07.camel@intel.com> (raw)
In-Reply-To: <20190712024941.4asntpe6s23x66q4@smtp.gmail.com>

On Thu, 2019-07-11 at 23:49 -0300, Rodrigo Siqueira wrote:
> On 07/10, Ser, Simon wrote:
> > On Wed, 2019-07-10 at 15:30 +0000, Ser, Simon wrote:
> > > Mostly LGTM, here are a few nits.
> > > 
> > > On Wed, 2019-06-12 at 23:17 -0300, Brian Starkey wrote:
> > > > To use writeback buffers as a CRC source, we need to be able to hash
> > > > them. Implement a simple FVA-1a hashing routine for this purpose.
> > > > 
> > > > Doing a bytewise hash on the framebuffer directly can be very slow if
> > > > the memory is noncached. By making a copy of each line in the FB first
> > > > (which can take advantage of word-access speedup), we can do the hash
> > > > on a cached copy, which is much faster (10x speedup on my platform).
> > > > 
> > > > v6: use igt_memcpy_from_wc() instead of plain memcpy, as suggested by
> > > >     Chris Wilson
> > > > 
> > > > Signed-off-by: Brian Starkey <brian.starkey@arm.com>
> > > > [rebased and updated to the most recent API]
> > > > Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
> > > > ---
> > > >  lib/igt_fb.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> > > >  lib/igt_fb.h |  3 +++
> > > >  2 files changed, 69 insertions(+)
> > > > 
> > > > diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> > > > index 9d4f905e..d07dae39 100644
> > > > --- a/lib/igt_fb.c
> > > > +++ b/lib/igt_fb.c
> > > > @@ -3256,6 +3256,72 @@ bool igt_fb_supported_format(uint32_t drm_format)
> > > >  	return false;
> > > >  }
> > > >  
> > > > +/*
> > > > + * This implements the FNV-1a hashing algorithm instead of CRC, for
> > > > + * simplicity
> > > > + * http://www.isthe.com/chongo/tech/comp/fnv/index.html
> > > > + *
> > > > + * hash = offset_basis
> > > > + * for each octet_of_data to be hashed
> > > > + *         hash = hash xor octet_of_data
> > > > + *         hash = hash * FNV_prime
> > > > + * return hash
> > > > + *
> > > > + * 32 bit offset_basis = 2166136261
> > > > + * 32 bit FNV_prime = 224 + 28 + 0x93 = 16777619
> > > > + */
> > > > +int igt_fb_get_crc(struct igt_fb *fb, igt_crc_t *crc)
> > > > +{
> > > > +#define FNV1a_OFFSET_BIAS 2166136261
> > > > +#define FNV1a_PRIME 16777619
> > > 
> > > I'd just use plain uint32_t variables for those, but no big deal.
> > > 
> > > > +	uint32_t hash;
> > > > +	void *map;
> > > > +	char *ptr, *line = NULL;
> > > > +	int x, y, cpp = igt_drm_format_to_bpp(fb->drm_format) / 8;
> > > > +	uint32_t stride = calc_plane_stride(fb, 0);
> > > 
> > > We could return -EINVAL in case fb->num_planes != 1.
> > 
> > Let's not waste cycles. With this ^ fixed, this patch is:
> > 
> > Reviewed-by: Simon Ser <simon.ser@intel.com>
> > 
> > Other nits are optional.
> 
> I agreed with all your suggestions, and I already applied all of them.
> Should I wait for the other patches review, or should I resend the new
> version?

I'm fine with waiting for the full review before a new version of the
whole patchset, but you can also send an updated version of a single
patch with:

    git send-email --in-reply-to="<cover.1560374714.git.rodrigosiqueiramelo@gmail.com>" -1 <commit hash>

where In-Reply-To is the Message-Id of the patch you want to update. I
agree it's a little tedious since you need to extract the Message-Id
from the message header.

> Thanks for all the feedback

:)

> Best Regards
>  
> > > > +	if (fb->is_dumb)
> > > > +		map = kmstest_dumb_map_buffer(fb->fd, fb->gem_handle, fb->size,
> > > > +					      PROT_READ);
> > > > +	else
> > > > +		map = gem_mmap__gtt(fb->fd, fb->gem_handle, fb->size,
> > > > +				    PROT_READ);
> > > > +	ptr = map;
> > > 
> > > Nit: no need for this, can assign the result of mmap directly to ptr.
> > > 
> > > > +
> > > > +	/*
> > > > +	 * Framebuffers are often uncached, which can make byte-wise accesses
> > > > +	 * very slow. We copy each line of the FB into a local buffer to speed
> > > > +	 * up the hashing.
> > > > +	 */
> > > > +	line = malloc(stride);
> > > > +	if (!line) {
> > > > +		munmap(map, fb->size);
> > > > +		return -ENOMEM;
> > > > +	}
> > > > +
> > > > +	hash = FNV1a_OFFSET_BIAS;
> > > > +
> > > > +	for (y = 0; y < fb->height; y++, ptr += stride) {
> > > > +
> > > > +		igt_memcpy_from_wc(line, ptr, stride);
> > > 
> > > Nit: no need to copy the whole stride actually, we can just copy
> > > fb->width * cpp since we're only going to read that.
> > > 
> > > > +
> > > > +		for (x = 0; x < fb->width * cpp; x++) {
> > > > +			hash ^= line[x];
> > > > +			hash *= FNV1a_PRIME;
> > > > +		}
> > > > +	}
> > > > +
> > > > +	crc->n_words = 1;
> > > > +	crc->crc[0] = hash;
> > > > +
> > > > +	free(line);
> > > > +	munmap(map, fb->size);
> > > > +
> > > > +	return 0;
> > > > +#undef FNV1a_OFFSET_BIAS
> > > > +#undef FNV1a_PRIME
> > > > +}
> > > > +
> > > >  /**
> > > >   * igt_format_is_yuv:
> > > >   * @drm_format: drm fourcc
> > > > diff --git a/lib/igt_fb.h b/lib/igt_fb.h
> > > > index adefebe1..a2741c05 100644
> > > > --- a/lib/igt_fb.h
> > > > +++ b/lib/igt_fb.h
> > > > @@ -37,6 +37,7 @@
> > > >  #include <i915_drm.h>
> > > >  
> > > >  #include "igt_color_encoding.h"
> > > > +#include "igt_debugfs.h"
> > > >  
> > > >  /*
> > > >   * Internal format to denote a buffer compatible with pixman's
> > > > @@ -194,5 +195,7 @@ int igt_format_plane_bpp(uint32_t drm_format, int plane);
> > > >  void igt_format_array_fill(uint32_t **formats_array, unsigned int *count,
> > > >  			   bool allow_yuv);
> > > >  
> > > > +int igt_fb_get_crc(struct igt_fb *fb, igt_crc_t *crc);
> > > > +
> > > >  #endif /* __IGT_FB_H__ */
> > > >  
> > > > _______________________________________________
> > > > igt-dev mailing list
> > > > igt-dev@lists.freedesktop.org
> > > > https://lists.freedesktop.org/mailman/listinfo/igt-dev
> > > _______________________________________________
> > > igt-dev mailing list
> > > igt-dev@lists.freedesktop.org
> > > https://lists.freedesktop.org/mailman/listinfo/igt-dev
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

WARNING: multiple messages have this Message-ID (diff)
From: "Ser, Simon" <simon.ser@intel.com>
To: "rodrigosiqueiramelo@gmail.com" <rodrigosiqueiramelo@gmail.com>
Cc: "Latvala, Petri" <petri.latvala@intel.com>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"Liviu.Dudau@arm.com" <Liviu.Dudau@arm.com>,
	"igt-dev@lists.freedesktop.org" <igt-dev@lists.freedesktop.org>,
	"daniel@ffwll.ch" <daniel@ffwll.ch>, "nd@arm.com" <nd@arm.com>,
	"Brian.Starkey@arm.com" <Brian.Starkey@arm.com>
Subject: Re: [igt-dev] [PATCH V6 i-g-t 3/6] lib: Add function to hash a framebuffer
Date: Fri, 12 Jul 2019 12:17:42 +0000	[thread overview]
Message-ID: <89a0e0508c989289690ecea001bb9ae51da9ac07.camel@intel.com> (raw)
In-Reply-To: <20190712024941.4asntpe6s23x66q4@smtp.gmail.com>

On Thu, 2019-07-11 at 23:49 -0300, Rodrigo Siqueira wrote:
> On 07/10, Ser, Simon wrote:
> > On Wed, 2019-07-10 at 15:30 +0000, Ser, Simon wrote:
> > > Mostly LGTM, here are a few nits.
> > > 
> > > On Wed, 2019-06-12 at 23:17 -0300, Brian Starkey wrote:
> > > > To use writeback buffers as a CRC source, we need to be able to hash
> > > > them. Implement a simple FVA-1a hashing routine for this purpose.
> > > > 
> > > > Doing a bytewise hash on the framebuffer directly can be very slow if
> > > > the memory is noncached. By making a copy of each line in the FB first
> > > > (which can take advantage of word-access speedup), we can do the hash
> > > > on a cached copy, which is much faster (10x speedup on my platform).
> > > > 
> > > > v6: use igt_memcpy_from_wc() instead of plain memcpy, as suggested by
> > > >     Chris Wilson
> > > > 
> > > > Signed-off-by: Brian Starkey <brian.starkey@arm.com>
> > > > [rebased and updated to the most recent API]
> > > > Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
> > > > ---
> > > >  lib/igt_fb.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> > > >  lib/igt_fb.h |  3 +++
> > > >  2 files changed, 69 insertions(+)
> > > > 
> > > > diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> > > > index 9d4f905e..d07dae39 100644
> > > > --- a/lib/igt_fb.c
> > > > +++ b/lib/igt_fb.c
> > > > @@ -3256,6 +3256,72 @@ bool igt_fb_supported_format(uint32_t drm_format)
> > > >  	return false;
> > > >  }
> > > >  
> > > > +/*
> > > > + * This implements the FNV-1a hashing algorithm instead of CRC, for
> > > > + * simplicity
> > > > + * http://www.isthe.com/chongo/tech/comp/fnv/index.html
> > > > + *
> > > > + * hash = offset_basis
> > > > + * for each octet_of_data to be hashed
> > > > + *         hash = hash xor octet_of_data
> > > > + *         hash = hash * FNV_prime
> > > > + * return hash
> > > > + *
> > > > + * 32 bit offset_basis = 2166136261
> > > > + * 32 bit FNV_prime = 224 + 28 + 0x93 = 16777619
> > > > + */
> > > > +int igt_fb_get_crc(struct igt_fb *fb, igt_crc_t *crc)
> > > > +{
> > > > +#define FNV1a_OFFSET_BIAS 2166136261
> > > > +#define FNV1a_PRIME 16777619
> > > 
> > > I'd just use plain uint32_t variables for those, but no big deal.
> > > 
> > > > +	uint32_t hash;
> > > > +	void *map;
> > > > +	char *ptr, *line = NULL;
> > > > +	int x, y, cpp = igt_drm_format_to_bpp(fb->drm_format) / 8;
> > > > +	uint32_t stride = calc_plane_stride(fb, 0);
> > > 
> > > We could return -EINVAL in case fb->num_planes != 1.
> > 
> > Let's not waste cycles. With this ^ fixed, this patch is:
> > 
> > Reviewed-by: Simon Ser <simon.ser@intel.com>
> > 
> > Other nits are optional.
> 
> I agreed with all your suggestions, and I already applied all of them.
> Should I wait for the other patches review, or should I resend the new
> version?

I'm fine with waiting for the full review before a new version of the
whole patchset, but you can also send an updated version of a single
patch with:

    git send-email --in-reply-to="<cover.1560374714.git.rodrigosiqueiramelo@gmail.com>" -1 <commit hash>

where In-Reply-To is the Message-Id of the patch you want to update. I
agree it's a little tedious since you need to extract the Message-Id
from the message header.

> Thanks for all the feedback

:)

> Best Regards
>  
> > > > +	if (fb->is_dumb)
> > > > +		map = kmstest_dumb_map_buffer(fb->fd, fb->gem_handle, fb->size,
> > > > +					      PROT_READ);
> > > > +	else
> > > > +		map = gem_mmap__gtt(fb->fd, fb->gem_handle, fb->size,
> > > > +				    PROT_READ);
> > > > +	ptr = map;
> > > 
> > > Nit: no need for this, can assign the result of mmap directly to ptr.
> > > 
> > > > +
> > > > +	/*
> > > > +	 * Framebuffers are often uncached, which can make byte-wise accesses
> > > > +	 * very slow. We copy each line of the FB into a local buffer to speed
> > > > +	 * up the hashing.
> > > > +	 */
> > > > +	line = malloc(stride);
> > > > +	if (!line) {
> > > > +		munmap(map, fb->size);
> > > > +		return -ENOMEM;
> > > > +	}
> > > > +
> > > > +	hash = FNV1a_OFFSET_BIAS;
> > > > +
> > > > +	for (y = 0; y < fb->height; y++, ptr += stride) {
> > > > +
> > > > +		igt_memcpy_from_wc(line, ptr, stride);
> > > 
> > > Nit: no need to copy the whole stride actually, we can just copy
> > > fb->width * cpp since we're only going to read that.
> > > 
> > > > +
> > > > +		for (x = 0; x < fb->width * cpp; x++) {
> > > > +			hash ^= line[x];
> > > > +			hash *= FNV1a_PRIME;
> > > > +		}
> > > > +	}
> > > > +
> > > > +	crc->n_words = 1;
> > > > +	crc->crc[0] = hash;
> > > > +
> > > > +	free(line);
> > > > +	munmap(map, fb->size);
> > > > +
> > > > +	return 0;
> > > > +#undef FNV1a_OFFSET_BIAS
> > > > +#undef FNV1a_PRIME
> > > > +}
> > > > +
> > > >  /**
> > > >   * igt_format_is_yuv:
> > > >   * @drm_format: drm fourcc
> > > > diff --git a/lib/igt_fb.h b/lib/igt_fb.h
> > > > index adefebe1..a2741c05 100644
> > > > --- a/lib/igt_fb.h
> > > > +++ b/lib/igt_fb.h
> > > > @@ -37,6 +37,7 @@
> > > >  #include <i915_drm.h>
> > > >  
> > > >  #include "igt_color_encoding.h"
> > > > +#include "igt_debugfs.h"
> > > >  
> > > >  /*
> > > >   * Internal format to denote a buffer compatible with pixman's
> > > > @@ -194,5 +195,7 @@ int igt_format_plane_bpp(uint32_t drm_format, int plane);
> > > >  void igt_format_array_fill(uint32_t **formats_array, unsigned int *count,
> > > >  			   bool allow_yuv);
> > > >  
> > > > +int igt_fb_get_crc(struct igt_fb *fb, igt_crc_t *crc);
> > > > +
> > > >  #endif /* __IGT_FB_H__ */
> > > >  
> > > > _______________________________________________
> > > > igt-dev mailing list
> > > > igt-dev@lists.freedesktop.org
> > > > https://lists.freedesktop.org/mailman/listinfo/igt-dev
> > > _______________________________________________
> > > igt-dev mailing list
> > > igt-dev@lists.freedesktop.org
> > > https://lists.freedesktop.org/mailman/listinfo/igt-dev
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  reply	other threads:[~2019-07-12 12:17 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-13  2:14 [PATCH V6 i-g-t 0/6] igt: Add support for testing writeback connectors Rodrigo Siqueira
2019-06-13  2:14 ` [igt-dev] " Rodrigo Siqueira
2019-06-13  2:16 ` [PATCH V6 i-g-t 1/6] lib/igt_kms: Add writeback support Brian Starkey
2019-06-13  2:16   ` [Intel-gfx] " Brian Starkey
2019-06-13 14:54   ` Liviu Dudau
2019-06-13 14:54     ` [igt-dev] " Liviu Dudau
2019-06-18 21:56     ` Rodrigo Siqueira
2019-06-18 21:56       ` [igt-dev] " Rodrigo Siqueira
2019-07-03 12:15       ` Ser, Simon
2019-07-03 12:15         ` Ser, Simon
2019-07-09 14:32         ` Rodrigo Siqueira
2019-07-09 14:32           ` Rodrigo Siqueira
2019-07-09 14:42           ` Ser, Simon
2019-07-09 14:42             ` Ser, Simon
2019-07-09 15:07             ` Rodrigo Siqueira
2019-07-09 15:07               ` Rodrigo Siqueira
2019-07-10  8:48   ` Ser, Simon
2019-07-10  8:48     ` Ser, Simon
2019-06-13  2:16 ` [PATCH V6 i-g-t 2/6] kms_writeback: Add initial writeback tests Brian Starkey
2019-06-13  2:16   ` [igt-dev] " Brian Starkey
2019-07-10 11:57   ` Ser, Simon
2019-07-10 11:57     ` Ser, Simon
2019-07-12  2:44     ` Rodrigo Siqueira
2019-07-12  2:44       ` Rodrigo Siqueira
2019-07-12 11:40       ` Ser, Simon
2019-07-12 11:40         ` Ser, Simon
2019-07-17  1:21         ` Rodrigo Siqueira
2019-07-17  1:21           ` Rodrigo Siqueira
2019-07-17 13:00           ` Ser, Simon
2019-07-17 13:00             ` Ser, Simon
2019-07-16 15:22       ` Liviu.Dudau
2019-07-16 15:22         ` Liviu.Dudau
2019-07-17 11:46         ` Ser, Simon
2019-07-17 11:46           ` [Intel-gfx] " Ser, Simon
2019-07-18  9:49           ` Liviu.Dudau
2019-07-18  9:49             ` Liviu.Dudau
2019-07-18  9:56             ` Ser, Simon
2019-07-18  9:56               ` Ser, Simon
2019-07-18 11:15               ` Liviu.Dudau
2019-07-18 11:15                 ` Liviu.Dudau
2019-07-18 11:46                 ` Ser, Simon
2019-07-18 11:46                   ` Ser, Simon
2019-07-19  1:21                 ` Rodrigo Siqueira
2019-07-19  1:21                   ` Rodrigo Siqueira
2019-06-13  2:17 ` [PATCH V6 i-g-t 3/6] lib: Add function to hash a framebuffer Brian Starkey
2019-06-13  2:17   ` [Intel-gfx] " Brian Starkey
2019-07-10 15:30   ` [igt-dev] " Ser, Simon
2019-07-10 15:30     ` Ser, Simon
2019-07-10 15:34     ` Ser, Simon
2019-07-10 15:34       ` Ser, Simon
2019-07-12  2:49       ` Rodrigo Siqueira
2019-07-12  2:49         ` Rodrigo Siqueira
2019-07-12 12:17         ` Ser, Simon [this message]
2019-07-12 12:17           ` Ser, Simon
2019-07-17  1:25           ` Rodrigo Siqueira
2019-07-17  1:25             ` Rodrigo Siqueira
2019-06-13  2:17 ` [PATCH V6 i-g-t 4/6] kms_writeback: Add writeback-check-output Brian Starkey
2019-06-13  2:17   ` [igt-dev] " Brian Starkey
2019-07-12 12:34   ` Ser, Simon
2019-07-12 12:34     ` Ser, Simon
2019-06-13  2:18 ` [PATCH V6 i-g-t 5/6] lib/igt_kms: Add igt_output_clone_pipe for cloning Brian Starkey
2019-06-13  2:18   ` [igt-dev] " Brian Starkey
2019-07-12 12:54   ` Ser, Simon
2019-07-12 12:54     ` Ser, Simon
2019-07-17  1:47     ` Rodrigo Siqueira
2019-07-17  1:47       ` Rodrigo Siqueira
2019-07-17 13:10       ` Ser, Simon
2019-07-17 13:10         ` Ser, Simon
2019-06-13  2:19 ` [PATCH V6 i-g-t 6/6] kms_writeback: Add tests using a cloned output Brian Starkey
2019-06-13  2:19   ` [igt-dev] " Brian Starkey
2019-06-13  3:38 ` [igt-dev] ✗ Fi.CI.BAT: failure for igt: Add support for testing writeback connectors (rev6) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=89a0e0508c989289690ecea001bb9ae51da9ac07.camel@intel.com \
    --to=simon.ser@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=nd@arm.com \
    --cc=rodrigosiqueiramelo@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.