[Intel-gfx] [PATCH 11/20] drm/i915: Optimization to reduce the sampling time of GuC log buffer
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Fri Aug 12 15:06:38 UTC 2016
On 12/08/16 15:48, Goel, Akash wrote:
> On 8/12/2016 8:12 PM, Tvrtko Ursulin wrote:
>>
>> On 12/08/16 07:25, akash.goel at intel.com wrote:
>>> From: Akash Goel <akash.goel at intel.com>
>>>
>>> GuC firmware sends an interrupt to flush the log buffer when it becomes
>>> half full, so Driver doesn't really need to sample the complete buffer
>>> and can just copy only the newly written data by GuC into the local
>>> buffer, i.e. as per the read & write pointer values.
>>> Moreover the flush interrupt would generally come for one type of log
>>> buffer, when it becomes half full, so at that time the other 2 types of
>>> log buffer would comparatively have much lesser unread data in them.
>>> In case of overflow reported by GuC, Driver do need to copy the entire
>>> buffer as the whole buffer would contain the unread data.
>>>
>>> v2: Rebase.
>>>
>>> Signed-off-by: Akash Goel <akash.goel at intel.com>
>>> ---
>>> drivers/gpu/drm/i915/i915_guc_submission.c | 40
>>> +++++++++++++++++++++++++-----
>>> 1 file changed, 34 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c
>>> b/drivers/gpu/drm/i915/i915_guc_submission.c
>>> index 1ca1866..8e0f360 100644
>>> --- a/drivers/gpu/drm/i915/i915_guc_submission.c
>>> +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
>>> @@ -889,7 +889,8 @@ static void guc_read_update_log_buffer(struct
>>> intel_guc *guc)
>>> struct guc_log_buffer_state *log_buffer_state,
>>> *log_buffer_snapshot_state;
>>> struct guc_log_buffer_state log_buffer_state_local;
>>> void *src_data_ptr, *dst_data_ptr;
>>> - u32 i, buffer_size;
>>> + bool new_overflow;
>>> + u32 i, buffer_size, read_offset, write_offset, bytes_to_copy;
>>>
>>> if (!guc->log.buf_addr)
>>> return;
>>> @@ -912,10 +913,13 @@ static void guc_read_update_log_buffer(struct
>>> intel_guc *guc)
>>> memcpy(&log_buffer_state_local, log_buffer_state,
>>> sizeof(struct guc_log_buffer_state));
>>> buffer_size = log_buffer_state_local.size;
>>> + read_offset = log_buffer_state_local.read_ptr;
>>> + write_offset = log_buffer_state_local.sampled_write_ptr;
>>>
>>> guc->log.flush_count[i] +=
>>> log_buffer_state_local.flush_to_file;
>>> if (log_buffer_state_local.buffer_full_cnt !=
>>> guc->log.prev_overflow_count[i]) {
>>
>> Wrong alignment. You can try checkpatch.pl for all of those.
>>
> Sorry for all the alignment & indentation issues.
>
> Should the above condition be written like this ?
>
> if (log_buffer_state_local.buffer_full_cnt !=
> guc->log.prev_overflow_count[i]) {
Yes, but checkpatch.pl is your friend. :)
>>> + new_overflow = 1;
>>
>> true/false since it is a bool
> fine will do that.
>>
>>> guc->log.total_overflow_count[i] +=
>>> (log_buffer_state_local.buffer_full_cnt -
>>> guc->log.prev_overflow_count[i]);
>>> @@ -929,7 +933,8 @@ static void guc_read_update_log_buffer(struct
>>> intel_guc *guc)
>>> guc->log.prev_overflow_count[i] =
>>> log_buffer_state_local.buffer_full_cnt;
>>> DRM_ERROR_RATELIMITED("GuC log buffer overflow\n");
>>> - }
>>> + } else
>>> + new_overflow = 0;
>>>
>>> if (log_buffer_snapshot_state) {
>>> /* First copy the state structure in local buffer */
>>> @@ -941,13 +946,37 @@ static void guc_read_update_log_buffer(struct
>>> intel_guc *guc)
>>> * for consistency set the write pointer value to same
>>> * value of sampled_write_ptr in the snapshot buffer.
>>> */
>>> - log_buffer_snapshot_state->write_ptr =
>>> - log_buffer_snapshot_state->sampled_write_ptr;
>>> + log_buffer_snapshot_state->write_ptr = write_offset;
>>>
>>> log_buffer_snapshot_state++;
>>>
>>> /* Now copy the actual logs */
>>> memcpy(dst_data_ptr, src_data_ptr, buffer_size);
>>
>> The confusing bit - the memcpy above still copies the whole buffer, no?
>>
> Really very sorry for this blooper.
No worries, it happens to everyone!
Regards,
Tvrtko
More information about the Intel-gfx
mailing list