[Intel-gfx] [PATCH] drm/i915/sdvo: Fix up debug output to not split lines

Daniel Vetter daniel.vetter at ffwll.ch
Wed Nov 27 15:26:07 CET 2013


On Wed, Nov 27, 2013 at 3:09 PM, Mika Kuoppala
<mika.kuoppala at linux.intel.com> wrote:
> Daniel Vetter <daniel.vetter at ffwll.ch> writes:
>> It leads to a big mess when stuff interleaves. Especially with the new
>> patch I've submitted for the drm core to no longer artificially split
>> up debug messages.
>>
>> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
>> ---
>>  drivers/gpu/drm/i915/intel_sdvo.c | 55 ++++++++++++++++++++++++++-------------
>>  1 file changed, 37 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
>> index a583e8f718a7..e88ad95df08f 100644
>> --- a/drivers/gpu/drm/i915/intel_sdvo.c
>> +++ b/drivers/gpu/drm/i915/intel_sdvo.c
>> @@ -413,23 +413,34 @@ static const struct _sdvo_cmd_name {
>>  static void intel_sdvo_debug_write(struct intel_sdvo *intel_sdvo, u8 cmd,
>>                                  const void *args, int args_len)
>>  {
>> -     int i;
>> +     int i, pos = 0;
>> +#define BUF_LEN 256
>> +     char buffer[BUF_LEN];
>> +
>> +#define BUF_PRINT(args...) \
>> +     pos += snprintf(buffer + pos, max_t(int, BUF_LEN - pos - 1, 0), args)
>> +
>
> You want scnprintf here as it returns the true number of bytes written
> instead of what would have been written. Also the size argument includes
> the the trailing null space. Consider:

Actually the semantics of snprintf which only returns the actual
characters written without the terminating 0 at the end is what I want
- the next BUF_PRINT should overwrite things.

In case of a buffer overrunt the max should make sure that we don't
actually overwrite anything, and the BUG_ON below makes sure that the
string we feed to printk is still 0-terminated (hence the - 1 there).

> BUG_ON((pos += scnprintf(buffer + pos, max_t(int, BUF_LEN - pos, 0), args)) >= BUF_LEN)
>
>> -     DRM_DEBUG_KMS("%s: W: %02X ",
>> -                             SDVO_NAME(intel_sdvo), cmd);
>> -     for (i = 0; i < args_len; i++)
>> -             DRM_LOG_KMS("%02X ", ((u8 *)args)[i]);
>> -     for (; i < 8; i++)
>> -             DRM_LOG_KMS("   ");
>> +     for (i = 0; i < args_len; i++) {
>> +             BUF_PRINT("%02X ", ((u8 *)args)[i]);
>> +     }
>> +     for (; i < 8; i++) {
>> +             BUF_PRINT("   ");
>> +     }
>>       for (i = 0; i < ARRAY_SIZE(sdvo_cmd_names); i++) {
>>               if (cmd == sdvo_cmd_names[i].cmd) {
>> -                     DRM_LOG_KMS("(%s)", sdvo_cmd_names[i].name);
>> +                     BUF_PRINT("(%s)", sdvo_cmd_names[i].name);
>>                       break;
>>               }
>>       }
>> -     if (i == ARRAY_SIZE(sdvo_cmd_names))
>> -             DRM_LOG_KMS("(%02X)", cmd);
>> -     DRM_LOG_KMS("\n");
>> +     if (i == ARRAY_SIZE(sdvo_cmd_names)) {
>> +             BUF_PRINT("(%02X)", cmd);
>> +     }
>> +     BUG_ON(pos >= BUF_LEN - 1);
>
> pos >= BUF_LEN is enough if you choose not to BUG_ON on each scnprintf

See above, with snprintf we need to make sure we have a terminating 0.
Without that the printk will go rampant.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch



More information about the Intel-gfx mailing list