[Intel-gfx] [PATCH 19/20] drm/i915: Use SSE4.1 movntdqa based memcpy for sampling GuC log buffer

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri Aug 12 16:06:22 UTC 2016


On 12/08/16 07:25, akash.goel at intel.com wrote:
> From: Akash Goel <akash.goel at intel.com>
>
> In order to have fast reads from the GuC log buffer, used SSE4.1 movntdqa
> based memcpy function i915_memcpy_from_wc.
> GuC log buffer has a WC type vmalloc mapping and copying using movntqda from
> WC type memory is almost as fast as reading from WB memory.
> This will further reduce the log buffer sampling time, so is needed dearly
> to deal with the flush interrupt storm when GuC is generating logs at a very
> high rate.
> Ideally SSE 4.1 should be present on all chipsets supporting GuC based
> submisssions, but if not then logging will not be enabled.
>
> Suggested-by: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Akash Goel <akash.goel at intel.com>
> ---
>   drivers/gpu/drm/i915/i915_guc_submission.c | 17 ++++++++++++++---
>   1 file changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
> index 1818343..af48f62 100644
> --- a/drivers/gpu/drm/i915/i915_guc_submission.c
> +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
> @@ -987,15 +987,16 @@ static void guc_read_update_log_buffer(struct intel_guc *guc)
>   			/* Just copy the newly written data */
>   			if (read_offset <= write_offset) {
>   				bytes_to_copy = write_offset - read_offset;
> -				memcpy(dst_data_ptr + read_offset,
> +				i915_memcpy_from_wc(dst_data_ptr + read_offset,
>   				     src_data_ptr + read_offset, bytes_to_copy);
>   			} else {
>   				bytes_to_copy = buffer_size - read_offset;
> -				memcpy(dst_data_ptr + read_offset,
> +				i915_memcpy_from_wc(dst_data_ptr + read_offset,
>   				     src_data_ptr + read_offset, bytes_to_copy);
>
>   				bytes_to_copy = write_offset;
> -				memcpy(dst_data_ptr, src_data_ptr, bytes_to_copy);
> +				i915_memcpy_from_wc(dst_data_ptr, src_data_ptr,
> +				     bytes_to_copy);
>   			}
>
>   			src_data_ptr += buffer_size;
> @@ -1210,6 +1211,16 @@ static void guc_create_log(struct intel_guc *guc)
>
>   	obj = guc->log.obj;
>   	if (!obj) {
> +		/* We require SSE 4.1 for fast reads from the GuC log buffer and
> +		 * it should be present on the chipsets supporting GuC based
> +		 * submisssions.
> +		 */
> +		if (WARN_ON(!i915_memcpy_from_wc(NULL, NULL, 0))) {
> +			/* logging will not be enabled */
> +			i915.guc_log_level = -1;
> +			return;
> +		}
> +
>   		obj = gem_allocate_guc_obj(dev_priv, size);
>   		if (!obj) {
>   			/* logging will be off */
>

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko


More information about the Intel-gfx mailing list