Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-23 Thread Mathieu Desnoyers
- Original Message -
> From: "Jérémie Galarneau" 
> To: "Wang Nan" 
> Cc: "Jiri Olsa" , "Sebastian Andrzej Siewior" 
> , "Li Zefan"
> , linux-kernel@vger.kernel.org, "Mathieu Desnoyers" 
> 
> Sent: Wednesday, January 21, 2015 10:14:16 PM
> Subject: Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid 
> reserved keywords.
> 
> On Wed, Jan 21, 2015 at 8:38 PM, Wang Nan  wrote:
> > On 2015/1/21 23:56, Jérémie Galarneau wrote:
> >> On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa  wrote:
> >>> On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
> >>>> Some parameters of syscall tracepoints named as 'nr', 'event', etc.
> >>>> When dealing with them, perf convert to ctf meets some problem:
> >>>>
> >>>>  1. If a parameter with name 'nr', it will duplicate syscall's
> >>>> common field 'nr'. One such syscall is io_submit().
> >>>>
> >>>>  2. If a parameter with name 'event', it is denied to be inserted
> >>>> because 'event' is a babeltrace keywork. One such syscall is
> >>>> epoll_ctl.
> >>>
> >>> hum, so this problem 2 is detectable only via
> >>> bt_ctf_event_class_add_field function?
> >>>
> >>> how big is the blaklist?
> >>>
> >>
> >> The blacklist is defined by the CTF specification here [1].
> >>
> >> Jérémie
> >>
> >> [1]
> >> http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477
> >
> > Is there any possibility that the someone expand the list?
> >
> 
> Good question. There is discussion around a v1.9 version of the CTF
> spec going on at the moment (which should not affect the Babeltrace
> API).
> 
> As far as I know, adding "__attribute__" has been discussed. CC'ing
> Mathieu Desnoyers who may have other extensions in mind.

I've had in mind adding an optional $ prefix to identifiers so they
don't clash with reserved keywords. This would have to go into a
CTF 1.9 though.

Meanwhile, validating that there are no identifier clash in babeltrace
seems like a good idea. Alternatively, prefixing all identifiers with
an underscore eliminates those clashes, and Babeltrace even strip those
underscore before printing, but since underscore is a character that
is allowed within keywords, this can bring interesting clash when
a keyword actually begins with an underscore, so I would like to
replace those by $.

Thoughts ?

Thanks,

Mathieu

> 
> Jérémie
> 
> >>
> >>> SNIP
> >>>
> >>>> +}
> >>>> +
> >>>>  static int add_tracepoint_fields_types(struct ctf_writer *cw,
> >>>>  struct format_field *fields,
> >>>>  struct bt_ctf_event_class
> >>>>  *event_class)
> >>>> @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct
> >>>> ctf_writer *cw,
> >>>>   for (field = fields; field; field = field->next) {
> >>>>   struct bt_ctf_field_type *type;
> >>>>   unsigned long flags = field->flags;
> >>>> + struct bt_ctf_field_type *f = NULL;
> >>>> + char *name;
> >>>> + int dup = 1;
> >>>>
> >>>>   pr2("  field '%s'\n", field->name);
> >>>>
> >>>> @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct
> >>>> ctf_writer *cw,
> >>>>   if (flags & FIELD_IS_ARRAY)
> >>>>   type = bt_ctf_field_type_array_create(type,
> >>>>   field->arraylen);
> >>>>
> >>>> - ret = bt_ctf_event_class_add_field(event_class, type,
> >>>> - field->name);
> >>>> + /* Check name duplication */
> >>>> + name = field->name;
> >>>
> >>> could you please put this in separated function like 'get_field_name(..)'
> >>> so we dont polute this function even more
> >>>
> >>> name == get_field_name(...)
> >>> if (!name)
> >>> error path
> >>>
> >>>
> >>> thanks,
> >>> jirka
> >>
> >>
> >>
> >
> >
> 
> 
> 
> --
> Jérémie Galarneau
> EfficiOS Inc.
> http://www.efficios.com
> 

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-23 Thread Mathieu Desnoyers
- Original Message -
 From: Jérémie Galarneau jeremie.galarn...@efficios.com
 To: Wang Nan wangn...@huawei.com
 Cc: Jiri Olsa jo...@redhat.com, Sebastian Andrzej Siewior 
 bige...@linutronix.de, Li Zefan
 lize...@huawei.com, linux-kernel@vger.kernel.org, Mathieu Desnoyers 
 mathieu.desnoy...@efficios.com
 Sent: Wednesday, January 21, 2015 10:14:16 PM
 Subject: Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid 
 reserved keywords.
 
 On Wed, Jan 21, 2015 at 8:38 PM, Wang Nan wangn...@huawei.com wrote:
  On 2015/1/21 23:56, Jérémie Galarneau wrote:
  On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa jo...@redhat.com wrote:
  On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
  Some parameters of syscall tracepoints named as 'nr', 'event', etc.
  When dealing with them, perf convert to ctf meets some problem:
 
   1. If a parameter with name 'nr', it will duplicate syscall's
  common field 'nr'. One such syscall is io_submit().
 
   2. If a parameter with name 'event', it is denied to be inserted
  because 'event' is a babeltrace keywork. One such syscall is
  epoll_ctl.
 
  hum, so this problem 2 is detectable only via
  bt_ctf_event_class_add_field function?
 
  how big is the blaklist?
 
 
  The blacklist is defined by the CTF specification here [1].
 
  Jérémie
 
  [1]
  http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477
 
  Is there any possibility that the someone expand the list?
 
 
 Good question. There is discussion around a v1.9 version of the CTF
 spec going on at the moment (which should not affect the Babeltrace
 API).
 
 As far as I know, adding __attribute__ has been discussed. CC'ing
 Mathieu Desnoyers who may have other extensions in mind.

I've had in mind adding an optional $ prefix to identifiers so they
don't clash with reserved keywords. This would have to go into a
CTF 1.9 though.

Meanwhile, validating that there are no identifier clash in babeltrace
seems like a good idea. Alternatively, prefixing all identifiers with
an underscore eliminates those clashes, and Babeltrace even strip those
underscore before printing, but since underscore is a character that
is allowed within keywords, this can bring interesting clash when
a keyword actually begins with an underscore, so I would like to
replace those by $.

Thoughts ?

Thanks,

Mathieu

 
 Jérémie
 
 
  SNIP
 
  +}
  +
   static int add_tracepoint_fields_types(struct ctf_writer *cw,
   struct format_field *fields,
   struct bt_ctf_event_class
   *event_class)
  @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct
  ctf_writer *cw,
for (field = fields; field; field = field-next) {
struct bt_ctf_field_type *type;
unsigned long flags = field-flags;
  + struct bt_ctf_field_type *f = NULL;
  + char *name;
  + int dup = 1;
 
pr2(  field '%s'\n, field-name);
 
  @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct
  ctf_writer *cw,
if (flags  FIELD_IS_ARRAY)
type = bt_ctf_field_type_array_create(type,
field-arraylen);
 
  - ret = bt_ctf_event_class_add_field(event_class, type,
  - field-name);
  + /* Check name duplication */
  + name = field-name;
 
  could you please put this in separated function like 'get_field_name(..)'
  so we dont polute this function even more
 
  name == get_field_name(...)
  if (!name)
  error path
 
 
  thanks,
  jirka
 
 
 
 
 
 
 
 
 --
 Jérémie Galarneau
 EfficiOS Inc.
 http://www.efficios.com
 

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Wang Nan
On 2015/1/22 11:14, Jérémie Galarneau wrote:
> On Wed, Jan 21, 2015 at 8:38 PM, Wang Nan  wrote:
>> On 2015/1/21 23:56, Jérémie Galarneau wrote:
>>> On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa  wrote:
 On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
> Some parameters of syscall tracepoints named as 'nr', 'event', etc.
> When dealing with them, perf convert to ctf meets some problem:
>
>  1. If a parameter with name 'nr', it will duplicate syscall's
> common field 'nr'. One such syscall is io_submit().
>
>  2. If a parameter with name 'event', it is denied to be inserted
> because 'event' is a babeltrace keywork. One such syscall is
> epoll_ctl.

 hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
 function?

 how big is the blaklist?

>>>
>>> The blacklist is defined by the CTF specification here [1].
>>>
>>> Jérémie
>>>
>>> [1] 
>>> http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477
>>
>> Is there any possibility that the someone expand the list?
>>
> 
> Good question. There is discussion around a v1.9 version of the CTF
> spec going on at the moment (which should not affect the Babeltrace
> API).
> 

Since the blacklist is expanding, do you think babeltrace API should provide a 
mean to
notify users the reason about the failure, such as returning meanful error code 
instead
of -1, or exporting validate_identifier() to users?

> As far as I know, adding "__attribute__" has been discussed. CC'ing
> Mathieu Desnoyer who may have other extensions in mind.
> 
> Jérémie
> 
>>>
 SNIP

> +}
> +
>  static int add_tracepoint_fields_types(struct ctf_writer *cw,
>  struct format_field *fields,
>  struct bt_ctf_event_class 
> *event_class)
> @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct 
> ctf_writer *cw,
>   for (field = fields; field; field = field->next) {
>   struct bt_ctf_field_type *type;
>   unsigned long flags = field->flags;
> + struct bt_ctf_field_type *f = NULL;
> + char *name;
> + int dup = 1;
>
>   pr2("  field '%s'\n", field->name);
>
> @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
> ctf_writer *cw,
>   if (flags & FIELD_IS_ARRAY)
>   type = bt_ctf_field_type_array_create(type, 
> field->arraylen);
>
> - ret = bt_ctf_event_class_add_field(event_class, type,
> - field->name);
> + /* Check name duplication */
> + name = field->name;

 could you please put this in separated function like 'get_field_name(..)'
 so we dont polute this function even more

 name == get_field_name(...)
 if (!name)
 error path


 thanks,
 jirka
>>>
>>>
>>>
>>
>>
> 
> 
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jérémie Galarneau
On Wed, Jan 21, 2015 at 8:38 PM, Wang Nan  wrote:
> On 2015/1/21 23:56, Jérémie Galarneau wrote:
>> On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa  wrote:
>>> On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
 Some parameters of syscall tracepoints named as 'nr', 'event', etc.
 When dealing with them, perf convert to ctf meets some problem:

  1. If a parameter with name 'nr', it will duplicate syscall's
 common field 'nr'. One such syscall is io_submit().

  2. If a parameter with name 'event', it is denied to be inserted
 because 'event' is a babeltrace keywork. One such syscall is
 epoll_ctl.
>>>
>>> hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
>>> function?
>>>
>>> how big is the blaklist?
>>>
>>
>> The blacklist is defined by the CTF specification here [1].
>>
>> Jérémie
>>
>> [1] 
>> http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477
>
> Is there any possibility that the someone expand the list?
>

Good question. There is discussion around a v1.9 version of the CTF
spec going on at the moment (which should not affect the Babeltrace
API).

As far as I know, adding "__attribute__" has been discussed. CC'ing
Mathieu Desnoyer who may have other extensions in mind.

Jérémie

>>
>>> SNIP
>>>
 +}
 +
  static int add_tracepoint_fields_types(struct ctf_writer *cw,
  struct format_field *fields,
  struct bt_ctf_event_class 
 *event_class)
 @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   for (field = fields; field; field = field->next) {
   struct bt_ctf_field_type *type;
   unsigned long flags = field->flags;
 + struct bt_ctf_field_type *f = NULL;
 + char *name;
 + int dup = 1;

   pr2("  field '%s'\n", field->name);

 @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   if (flags & FIELD_IS_ARRAY)
   type = bt_ctf_field_type_array_create(type, 
 field->arraylen);

 - ret = bt_ctf_event_class_add_field(event_class, type,
 - field->name);
 + /* Check name duplication */
 + name = field->name;
>>>
>>> could you please put this in separated function like 'get_field_name(..)'
>>> so we dont polute this function even more
>>>
>>> name == get_field_name(...)
>>> if (!name)
>>> error path
>>>
>>>
>>> thanks,
>>> jirka
>>
>>
>>
>
>



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Wang Nan
On 2015/1/21 23:56, Jérémie Galarneau wrote:
> On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa  wrote:
>> On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
>>> Some parameters of syscall tracepoints named as 'nr', 'event', etc.
>>> When dealing with them, perf convert to ctf meets some problem:
>>>
>>>  1. If a parameter with name 'nr', it will duplicate syscall's
>>> common field 'nr'. One such syscall is io_submit().
>>>
>>>  2. If a parameter with name 'event', it is denied to be inserted
>>> because 'event' is a babeltrace keywork. One such syscall is
>>> epoll_ctl.
>>
>> hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
>> function?
>>
>> how big is the blaklist?
>>
> 
> The blacklist is defined by the CTF specification here [1].
> 
> Jérémie
> 
> [1] 
> http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477

Is there any possibility that the someone expand the list?

> 
>> SNIP
>>
>>> +}
>>> +
>>>  static int add_tracepoint_fields_types(struct ctf_writer *cw,
>>>  struct format_field *fields,
>>>  struct bt_ctf_event_class *event_class)
>>> @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct 
>>> ctf_writer *cw,
>>>   for (field = fields; field; field = field->next) {
>>>   struct bt_ctf_field_type *type;
>>>   unsigned long flags = field->flags;
>>> + struct bt_ctf_field_type *f = NULL;
>>> + char *name;
>>> + int dup = 1;
>>>
>>>   pr2("  field '%s'\n", field->name);
>>>
>>> @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
>>> ctf_writer *cw,
>>>   if (flags & FIELD_IS_ARRAY)
>>>   type = bt_ctf_field_type_array_create(type, 
>>> field->arraylen);
>>>
>>> - ret = bt_ctf_event_class_add_field(event_class, type,
>>> - field->name);
>>> + /* Check name duplication */
>>> + name = field->name;
>>
>> could you please put this in separated function like 'get_field_name(..)'
>> so we dont polute this function even more
>>
>> name == get_field_name(...)
>> if (!name)
>> error path
>>
>>
>> thanks,
>> jirka
> 
> 
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jérémie Galarneau
On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa  wrote:
> On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
>> Some parameters of syscall tracepoints named as 'nr', 'event', etc.
>> When dealing with them, perf convert to ctf meets some problem:
>>
>>  1. If a parameter with name 'nr', it will duplicate syscall's
>> common field 'nr'. One such syscall is io_submit().
>>
>>  2. If a parameter with name 'event', it is denied to be inserted
>> because 'event' is a babeltrace keywork. One such syscall is
>> epoll_ctl.
>
> hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
> function?
>
> how big is the blaklist?
>

The blacklist is defined by the CTF specification here [1].

Jérémie

[1] 
http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477

> SNIP
>
>> +}
>> +
>>  static int add_tracepoint_fields_types(struct ctf_writer *cw,
>>  struct format_field *fields,
>>  struct bt_ctf_event_class *event_class)
>> @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct ctf_writer 
>> *cw,
>>   for (field = fields; field; field = field->next) {
>>   struct bt_ctf_field_type *type;
>>   unsigned long flags = field->flags;
>> + struct bt_ctf_field_type *f = NULL;
>> + char *name;
>> + int dup = 1;
>>
>>   pr2("  field '%s'\n", field->name);
>>
>> @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
>> ctf_writer *cw,
>>   if (flags & FIELD_IS_ARRAY)
>>   type = bt_ctf_field_type_array_create(type, 
>> field->arraylen);
>>
>> - ret = bt_ctf_event_class_add_field(event_class, type,
>> - field->name);
>> + /* Check name duplication */
>> + name = field->name;
>
> could you please put this in separated function like 'get_field_name(..)'
> so we dont polute this function even more
>
> name == get_field_name(...)
> if (!name)
> error path
>
>
> thanks,
> jirka



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jiri Olsa
On Wed, Jan 21, 2015 at 09:25:45AM -0500, Steven Rostedt wrote:
> On Wed, 21 Jan 2015 15:19:38 +0100
> Jiri Olsa  wrote:
> 
> > On Wed, Jan 21, 2015 at 07:16:39PM +0800, Wang Nan wrote:
> > > Hi Jiri,
> > > 
> > > I found that only this patch is not enough. When converting such 
> > > tracepoints,
> > > it uses add_tracepoint_fields_values(..., struct format_field *fields 
> > > ...),
> > > and fields->name is still the original one.
> > > 
> > > If 'struct format_field' has a field like 'dup_name' we can make things 
> > > simpler.
> > > However, struct format_field is part of traceevent, not only used by perf.
> > > 
> > > I have no enough time to think on it. Jiri, could you please give me some 
> > > hints
> > > so I can implement another patch tomorrow?
> > 
> > yea, looks like we either need to add 'void *priv' into 'struct 
> > format_field'
> > or if Steven doesn't like it, we'd need to save 'our' field name in some way
> > so it's reachable via format_field::name string.
> > 
> > Steven,
> > we need to use changed format_field::name to interface babeltrace
> > library, because it has restriction that fields within tracepoint
> > should have unique names.
> > 
> > Any chance we could introduce 'void *priv' member to format_field::name ?
> > Maybe with 'destroy_priv' callback to be called when the field is destroyed.
> > 
> > I can provide patch, just wanted to know first if you're not strictly 
> > against ;-)
> > 
> 
> I'm not exactly sure what the issue is. I guess I need to see a patch
> to understand better.

ok, will do

jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Steven Rostedt
On Wed, 21 Jan 2015 15:19:38 +0100
Jiri Olsa  wrote:

> On Wed, Jan 21, 2015 at 07:16:39PM +0800, Wang Nan wrote:
> > Hi Jiri,
> > 
> > I found that only this patch is not enough. When converting such 
> > tracepoints,
> > it uses add_tracepoint_fields_values(..., struct format_field *fields ...),
> > and fields->name is still the original one.
> > 
> > If 'struct format_field' has a field like 'dup_name' we can make things 
> > simpler.
> > However, struct format_field is part of traceevent, not only used by perf.
> > 
> > I have no enough time to think on it. Jiri, could you please give me some 
> > hints
> > so I can implement another patch tomorrow?
> 
> yea, looks like we either need to add 'void *priv' into 'struct format_field'
> or if Steven doesn't like it, we'd need to save 'our' field name in some way
> so it's reachable via format_field::name string.
> 
> Steven,
> we need to use changed format_field::name to interface babeltrace
> library, because it has restriction that fields within tracepoint
> should have unique names.
> 
> Any chance we could introduce 'void *priv' member to format_field::name ?
> Maybe with 'destroy_priv' callback to be called when the field is destroyed.
> 
> I can provide patch, just wanted to know first if you're not strictly against 
> ;-)
> 

I'm not exactly sure what the issue is. I guess I need to see a patch
to understand better.

-- Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jiri Olsa
On Wed, Jan 21, 2015 at 07:16:39PM +0800, Wang Nan wrote:
> Hi Jiri,
> 
> I found that only this patch is not enough. When converting such tracepoints,
> it uses add_tracepoint_fields_values(..., struct format_field *fields ...),
> and fields->name is still the original one.
> 
> If 'struct format_field' has a field like 'dup_name' we can make things 
> simpler.
> However, struct format_field is part of traceevent, not only used by perf.
> 
> I have no enough time to think on it. Jiri, could you please give me some 
> hints
> so I can implement another patch tomorrow?

yea, looks like we either need to add 'void *priv' into 'struct format_field'
or if Steven doesn't like it, we'd need to save 'our' field name in some way
so it's reachable via format_field::name string.

Steven,
we need to use changed format_field::name to interface babeltrace
library, because it has restriction that fields within tracepoint
should have unique names.

Any chance we could introduce 'void *priv' member to format_field::name ?
Maybe with 'destroy_priv' callback to be called when the field is destroyed.

I can provide patch, just wanted to know first if you're not strictly against 
;-)

thanks,
jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jiri Olsa
On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
> Some parameters of syscall tracepoints named as 'nr', 'event', etc.
> When dealing with them, perf convert to ctf meets some problem:
> 
>  1. If a parameter with name 'nr', it will duplicate syscall's
> common field 'nr'. One such syscall is io_submit().
> 
>  2. If a parameter with name 'event', it is denied to be inserted
> because 'event' is a babeltrace keywork. One such syscall is
> epoll_ctl.

hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
function?

how big is the blaklist?

SNIP

> +}
> +
>  static int add_tracepoint_fields_types(struct ctf_writer *cw,
>  struct format_field *fields,
>  struct bt_ctf_event_class *event_class)
> @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct ctf_writer 
> *cw,
>   for (field = fields; field; field = field->next) {
>   struct bt_ctf_field_type *type;
>   unsigned long flags = field->flags;
> + struct bt_ctf_field_type *f = NULL;
> + char *name;
> + int dup = 1;
>  
>   pr2("  field '%s'\n", field->name);
>  
> @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
> ctf_writer *cw,
>   if (flags & FIELD_IS_ARRAY)
>   type = bt_ctf_field_type_array_create(type, 
> field->arraylen);
>  
> - ret = bt_ctf_event_class_add_field(event_class, type,
> - field->name);
> + /* Check name duplication */
> + name = field->name;

could you please put this in separated function like 'get_field_name(..)'
so we dont polute this function even more

name == get_field_name(...)
if (!name)
error path


thanks,
jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Wang Nan
Hi Jiri,

I found that only this patch is not enough. When converting such tracepoints,
it uses add_tracepoint_fields_values(..., struct format_field *fields ...),
and fields->name is still the original one.

If 'struct format_field' has a field like 'dup_name' we can make things simpler.
However, struct format_field is part of traceevent, not only used by perf.

I have no enough time to think on it. Jiri, could you please give me some hints
so I can implement another patch tomorrow?

Thank you.

On 2015/1/21 11:23, Wang Nan wrote:
> Some parameters of syscall tracepoints named as 'nr', 'event', etc.
> When dealing with them, perf convert to ctf meets some problem:
> 
>  1. If a parameter with name 'nr', it will duplicate syscall's
> common field 'nr'. One such syscall is io_submit().
> 
>  2. If a parameter with name 'event', it is denied to be inserted
> because 'event' is a babeltrace keywork. One such syscall is
> epoll_ctl.
> 
> This patch appends '_dupl_X' suffix to avoid problem 1, prepend a '_'
> prefix to avoid problem 2.
> 
> Signed-off-by: Wang Nan 
> ---
>  tools/perf/util/data-convert-bt.c | 65 
> ---
>  1 file changed, 61 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/perf/util/data-convert-bt.c 
> b/tools/perf/util/data-convert-bt.c
> index ddecce8..b0a042d 100644
> --- a/tools/perf/util/data-convert-bt.c
> +++ b/tools/perf/util/data-convert-bt.c
> @@ -567,6 +567,38 @@ static int process_sample_event(struct perf_tool *tool,
>   return cs ? 0 : -1;
>  }
>  
> +/* If dup < 0, add a prefix. Else, add _dupl_X suffix. */
> +static char *change_name(char *name, char *orig_name, int dup)
> +{
> + char *new_name = NULL;
> + size_t len;
> +
> + if (!name)
> + name = orig_name;
> +
> + if (dup >= 10)
> + goto out;
> +
> + if (dup < 0)
> + len = strlen(name) + sizeof("_");
> + else
> + len = strlen(orig_name) + sizeof("_dupl_X");
> +
> + new_name = malloc(len);
> + if (!new_name)
> + goto out;
> +
> + if (dup < 0)
> + snprintf(new_name, len, "_%s", name);
> + else
> + snprintf(new_name, len, "%s_dupl_%d", orig_name, dup);
> +
> +out:
> + if (name != orig_name)
> + free(name);
> + return new_name;
> +}
> +
>  static int add_tracepoint_fields_types(struct ctf_writer *cw,
>  struct format_field *fields,
>  struct bt_ctf_event_class *event_class)
> @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct ctf_writer 
> *cw,
>   for (field = fields; field; field = field->next) {
>   struct bt_ctf_field_type *type;
>   unsigned long flags = field->flags;
> + struct bt_ctf_field_type *f = NULL;
> + char *name;
> + int dup = 1;
>  
>   pr2("  field '%s'\n", field->name);
>  
> @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
> ctf_writer *cw,
>   if (flags & FIELD_IS_ARRAY)
>   type = bt_ctf_field_type_array_create(type, 
> field->arraylen);
>  
> - ret = bt_ctf_event_class_add_field(event_class, type,
> - field->name);
> + /* Check name duplication */
> + name = field->name;
> + while (f = bt_ctf_event_class_get_field_by_name(event_class, 
> name)) {
> + bt_ctf_field_type_put(f);
> + name = change_name(name, field->name, dup++);
> + if (!name) {
> + pr_err("Failed to create dup name for '%s'\n", 
> field->name);
> + return -1;
> + }
> + }
> +
> + ret = bt_ctf_event_class_add_field(event_class, type, name);
> + /* if failed, we may hit a keywork. try again with a '_' prefix 
> */
> + if (ret) {
> + name = change_name(name, field->name, -1);
> + if (!name) {
> + pr_err("Failed to alloc name for '_%s'\n", 
> field->name);
> + return -1;
> + }
> + ret = bt_ctf_event_class_add_field(event_class, type, 
> name);
> + }
> + if (name != field->name)
> + free(name);
>  
>   if (flags & FIELD_IS_ARRAY)
>   bt_ctf_field_type_put(type);
>  
>   if (ret) {
> - pr_err("Failed to add field '%s\n", field->name);
> + pr_err("Failed to add field '%s': %d\n",
> + field->name, ret);
>   return -1;
>   }
>   }
> @@ -646,7 +703,7 @@ static int add_generic_types(struct ctf_writer *cw, 
> struct perf_evsel *evsel,
>   do {

Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jérémie Galarneau
On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa jo...@redhat.com wrote:
 On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
 Some parameters of syscall tracepoints named as 'nr', 'event', etc.
 When dealing with them, perf convert to ctf meets some problem:

  1. If a parameter with name 'nr', it will duplicate syscall's
 common field 'nr'. One such syscall is io_submit().

  2. If a parameter with name 'event', it is denied to be inserted
 because 'event' is a babeltrace keywork. One such syscall is
 epoll_ctl.

 hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
 function?

 how big is the blaklist?


The blacklist is defined by the CTF specification here [1].

Jérémie

[1] 
http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477

 SNIP

 +}
 +
  static int add_tracepoint_fields_types(struct ctf_writer *cw,
  struct format_field *fields,
  struct bt_ctf_event_class *event_class)
 @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct ctf_writer 
 *cw,
   for (field = fields; field; field = field-next) {
   struct bt_ctf_field_type *type;
   unsigned long flags = field-flags;
 + struct bt_ctf_field_type *f = NULL;
 + char *name;
 + int dup = 1;

   pr2(  field '%s'\n, field-name);

 @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   if (flags  FIELD_IS_ARRAY)
   type = bt_ctf_field_type_array_create(type, 
 field-arraylen);

 - ret = bt_ctf_event_class_add_field(event_class, type,
 - field-name);
 + /* Check name duplication */
 + name = field-name;

 could you please put this in separated function like 'get_field_name(..)'
 so we dont polute this function even more

 name == get_field_name(...)
 if (!name)
 error path


 thanks,
 jirka



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jérémie Galarneau
On Wed, Jan 21, 2015 at 8:38 PM, Wang Nan wangn...@huawei.com wrote:
 On 2015/1/21 23:56, Jérémie Galarneau wrote:
 On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa jo...@redhat.com wrote:
 On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
 Some parameters of syscall tracepoints named as 'nr', 'event', etc.
 When dealing with them, perf convert to ctf meets some problem:

  1. If a parameter with name 'nr', it will duplicate syscall's
 common field 'nr'. One such syscall is io_submit().

  2. If a parameter with name 'event', it is denied to be inserted
 because 'event' is a babeltrace keywork. One such syscall is
 epoll_ctl.

 hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
 function?

 how big is the blaklist?


 The blacklist is defined by the CTF specification here [1].

 Jérémie

 [1] 
 http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477

 Is there any possibility that the someone expand the list?


Good question. There is discussion around a v1.9 version of the CTF
spec going on at the moment (which should not affect the Babeltrace
API).

As far as I know, adding __attribute__ has been discussed. CC'ing
Mathieu Desnoyer who may have other extensions in mind.

Jérémie


 SNIP

 +}
 +
  static int add_tracepoint_fields_types(struct ctf_writer *cw,
  struct format_field *fields,
  struct bt_ctf_event_class 
 *event_class)
 @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   for (field = fields; field; field = field-next) {
   struct bt_ctf_field_type *type;
   unsigned long flags = field-flags;
 + struct bt_ctf_field_type *f = NULL;
 + char *name;
 + int dup = 1;

   pr2(  field '%s'\n, field-name);

 @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   if (flags  FIELD_IS_ARRAY)
   type = bt_ctf_field_type_array_create(type, 
 field-arraylen);

 - ret = bt_ctf_event_class_add_field(event_class, type,
 - field-name);
 + /* Check name duplication */
 + name = field-name;

 could you please put this in separated function like 'get_field_name(..)'
 so we dont polute this function even more

 name == get_field_name(...)
 if (!name)
 error path


 thanks,
 jirka








-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Wang Nan
On 2015/1/21 23:56, Jérémie Galarneau wrote:
 On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa jo...@redhat.com wrote:
 On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
 Some parameters of syscall tracepoints named as 'nr', 'event', etc.
 When dealing with them, perf convert to ctf meets some problem:

  1. If a parameter with name 'nr', it will duplicate syscall's
 common field 'nr'. One such syscall is io_submit().

  2. If a parameter with name 'event', it is denied to be inserted
 because 'event' is a babeltrace keywork. One such syscall is
 epoll_ctl.

 hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
 function?

 how big is the blaklist?

 
 The blacklist is defined by the CTF specification here [1].
 
 Jérémie
 
 [1] 
 http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477

Is there any possibility that the someone expand the list?

 
 SNIP

 +}
 +
  static int add_tracepoint_fields_types(struct ctf_writer *cw,
  struct format_field *fields,
  struct bt_ctf_event_class *event_class)
 @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   for (field = fields; field; field = field-next) {
   struct bt_ctf_field_type *type;
   unsigned long flags = field-flags;
 + struct bt_ctf_field_type *f = NULL;
 + char *name;
 + int dup = 1;

   pr2(  field '%s'\n, field-name);

 @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   if (flags  FIELD_IS_ARRAY)
   type = bt_ctf_field_type_array_create(type, 
 field-arraylen);

 - ret = bt_ctf_event_class_add_field(event_class, type,
 - field-name);
 + /* Check name duplication */
 + name = field-name;

 could you please put this in separated function like 'get_field_name(..)'
 so we dont polute this function even more

 name == get_field_name(...)
 if (!name)
 error path


 thanks,
 jirka
 
 
 


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Wang Nan
On 2015/1/22 11:14, Jérémie Galarneau wrote:
 On Wed, Jan 21, 2015 at 8:38 PM, Wang Nan wangn...@huawei.com wrote:
 On 2015/1/21 23:56, Jérémie Galarneau wrote:
 On Wed, Jan 21, 2015 at 9:11 AM, Jiri Olsa jo...@redhat.com wrote:
 On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
 Some parameters of syscall tracepoints named as 'nr', 'event', etc.
 When dealing with them, perf convert to ctf meets some problem:

  1. If a parameter with name 'nr', it will duplicate syscall's
 common field 'nr'. One such syscall is io_submit().

  2. If a parameter with name 'event', it is denied to be inserted
 because 'event' is a babeltrace keywork. One such syscall is
 epoll_ctl.

 hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
 function?

 how big is the blaklist?


 The blacklist is defined by the CTF specification here [1].

 Jérémie

 [1] 
 http://git.efficios.com/?p=ctf.git;a=blob;f=common-trace-format-specification.txt;h=abe4fb70fff7f17f6e8242f313fb74bff44cf89a;hb=HEAD#l1477

 Is there any possibility that the someone expand the list?

 
 Good question. There is discussion around a v1.9 version of the CTF
 spec going on at the moment (which should not affect the Babeltrace
 API).
 

Since the blacklist is expanding, do you think babeltrace API should provide a 
mean to
notify users the reason about the failure, such as returning meanful error code 
instead
of -1, or exporting validate_identifier() to users?

 As far as I know, adding __attribute__ has been discussed. CC'ing
 Mathieu Desnoyer who may have other extensions in mind.
 
 Jérémie
 

 SNIP

 +}
 +
  static int add_tracepoint_fields_types(struct ctf_writer *cw,
  struct format_field *fields,
  struct bt_ctf_event_class 
 *event_class)
 @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   for (field = fields; field; field = field-next) {
   struct bt_ctf_field_type *type;
   unsigned long flags = field-flags;
 + struct bt_ctf_field_type *f = NULL;
 + char *name;
 + int dup = 1;

   pr2(  field '%s'\n, field-name);

 @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   if (flags  FIELD_IS_ARRAY)
   type = bt_ctf_field_type_array_create(type, 
 field-arraylen);

 - ret = bt_ctf_event_class_add_field(event_class, type,
 - field-name);
 + /* Check name duplication */
 + name = field-name;

 could you please put this in separated function like 'get_field_name(..)'
 so we dont polute this function even more

 name == get_field_name(...)
 if (!name)
 error path


 thanks,
 jirka





 
 
 


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Wang Nan
Hi Jiri,

I found that only this patch is not enough. When converting such tracepoints,
it uses add_tracepoint_fields_values(..., struct format_field *fields ...),
and fields-name is still the original one.

If 'struct format_field' has a field like 'dup_name' we can make things simpler.
However, struct format_field is part of traceevent, not only used by perf.

I have no enough time to think on it. Jiri, could you please give me some hints
so I can implement another patch tomorrow?

Thank you.

On 2015/1/21 11:23, Wang Nan wrote:
 Some parameters of syscall tracepoints named as 'nr', 'event', etc.
 When dealing with them, perf convert to ctf meets some problem:
 
  1. If a parameter with name 'nr', it will duplicate syscall's
 common field 'nr'. One such syscall is io_submit().
 
  2. If a parameter with name 'event', it is denied to be inserted
 because 'event' is a babeltrace keywork. One such syscall is
 epoll_ctl.
 
 This patch appends '_dupl_X' suffix to avoid problem 1, prepend a '_'
 prefix to avoid problem 2.
 
 Signed-off-by: Wang Nan wangn...@huawei.com
 ---
  tools/perf/util/data-convert-bt.c | 65 
 ---
  1 file changed, 61 insertions(+), 4 deletions(-)
 
 diff --git a/tools/perf/util/data-convert-bt.c 
 b/tools/perf/util/data-convert-bt.c
 index ddecce8..b0a042d 100644
 --- a/tools/perf/util/data-convert-bt.c
 +++ b/tools/perf/util/data-convert-bt.c
 @@ -567,6 +567,38 @@ static int process_sample_event(struct perf_tool *tool,
   return cs ? 0 : -1;
  }
  
 +/* If dup  0, add a prefix. Else, add _dupl_X suffix. */
 +static char *change_name(char *name, char *orig_name, int dup)
 +{
 + char *new_name = NULL;
 + size_t len;
 +
 + if (!name)
 + name = orig_name;
 +
 + if (dup = 10)
 + goto out;
 +
 + if (dup  0)
 + len = strlen(name) + sizeof(_);
 + else
 + len = strlen(orig_name) + sizeof(_dupl_X);
 +
 + new_name = malloc(len);
 + if (!new_name)
 + goto out;
 +
 + if (dup  0)
 + snprintf(new_name, len, _%s, name);
 + else
 + snprintf(new_name, len, %s_dupl_%d, orig_name, dup);
 +
 +out:
 + if (name != orig_name)
 + free(name);
 + return new_name;
 +}
 +
  static int add_tracepoint_fields_types(struct ctf_writer *cw,
  struct format_field *fields,
  struct bt_ctf_event_class *event_class)
 @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct ctf_writer 
 *cw,
   for (field = fields; field; field = field-next) {
   struct bt_ctf_field_type *type;
   unsigned long flags = field-flags;
 + struct bt_ctf_field_type *f = NULL;
 + char *name;
 + int dup = 1;
  
   pr2(  field '%s'\n, field-name);
  
 @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   if (flags  FIELD_IS_ARRAY)
   type = bt_ctf_field_type_array_create(type, 
 field-arraylen);
  
 - ret = bt_ctf_event_class_add_field(event_class, type,
 - field-name);
 + /* Check name duplication */
 + name = field-name;
 + while (f = bt_ctf_event_class_get_field_by_name(event_class, 
 name)) {
 + bt_ctf_field_type_put(f);
 + name = change_name(name, field-name, dup++);
 + if (!name) {
 + pr_err(Failed to create dup name for '%s'\n, 
 field-name);
 + return -1;
 + }
 + }
 +
 + ret = bt_ctf_event_class_add_field(event_class, type, name);
 + /* if failed, we may hit a keywork. try again with a '_' prefix 
 */
 + if (ret) {
 + name = change_name(name, field-name, -1);
 + if (!name) {
 + pr_err(Failed to alloc name for '_%s'\n, 
 field-name);
 + return -1;
 + }
 + ret = bt_ctf_event_class_add_field(event_class, type, 
 name);
 + }
 + if (name != field-name)
 + free(name);
  
   if (flags  FIELD_IS_ARRAY)
   bt_ctf_field_type_put(type);
  
   if (ret) {
 - pr_err(Failed to add field '%s\n, field-name);
 + pr_err(Failed to add field '%s': %d\n,
 + field-name, ret);
   return -1;
   }
   }
 @@ -646,7 +703,7 @@ static int add_generic_types(struct ctf_writer *cw, 
 struct perf_evsel *evsel,
   do {\
   pr2(  field '%s'\n, n);   \
   if 

Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Steven Rostedt
On Wed, 21 Jan 2015 15:19:38 +0100
Jiri Olsa jo...@redhat.com wrote:

 On Wed, Jan 21, 2015 at 07:16:39PM +0800, Wang Nan wrote:
  Hi Jiri,
  
  I found that only this patch is not enough. When converting such 
  tracepoints,
  it uses add_tracepoint_fields_values(..., struct format_field *fields ...),
  and fields-name is still the original one.
  
  If 'struct format_field' has a field like 'dup_name' we can make things 
  simpler.
  However, struct format_field is part of traceevent, not only used by perf.
  
  I have no enough time to think on it. Jiri, could you please give me some 
  hints
  so I can implement another patch tomorrow?
 
 yea, looks like we either need to add 'void *priv' into 'struct format_field'
 or if Steven doesn't like it, we'd need to save 'our' field name in some way
 so it's reachable via format_field::name string.
 
 Steven,
 we need to use changed format_field::name to interface babeltrace
 library, because it has restriction that fields within tracepoint
 should have unique names.
 
 Any chance we could introduce 'void *priv' member to format_field::name ?
 Maybe with 'destroy_priv' callback to be called when the field is destroyed.
 
 I can provide patch, just wanted to know first if you're not strictly against 
 ;-)
 

I'm not exactly sure what the issue is. I guess I need to see a patch
to understand better.

-- Steve
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jiri Olsa
On Wed, Jan 21, 2015 at 09:25:45AM -0500, Steven Rostedt wrote:
 On Wed, 21 Jan 2015 15:19:38 +0100
 Jiri Olsa jo...@redhat.com wrote:
 
  On Wed, Jan 21, 2015 at 07:16:39PM +0800, Wang Nan wrote:
   Hi Jiri,
   
   I found that only this patch is not enough. When converting such 
   tracepoints,
   it uses add_tracepoint_fields_values(..., struct format_field *fields 
   ...),
   and fields-name is still the original one.
   
   If 'struct format_field' has a field like 'dup_name' we can make things 
   simpler.
   However, struct format_field is part of traceevent, not only used by perf.
   
   I have no enough time to think on it. Jiri, could you please give me some 
   hints
   so I can implement another patch tomorrow?
  
  yea, looks like we either need to add 'void *priv' into 'struct 
  format_field'
  or if Steven doesn't like it, we'd need to save 'our' field name in some way
  so it's reachable via format_field::name string.
  
  Steven,
  we need to use changed format_field::name to interface babeltrace
  library, because it has restriction that fields within tracepoint
  should have unique names.
  
  Any chance we could introduce 'void *priv' member to format_field::name ?
  Maybe with 'destroy_priv' callback to be called when the field is destroyed.
  
  I can provide patch, just wanted to know first if you're not strictly 
  against ;-)
  
 
 I'm not exactly sure what the issue is. I guess I need to see a patch
 to understand better.

ok, will do

jirka
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jiri Olsa
On Wed, Jan 21, 2015 at 11:23:54AM +0800, Wang Nan wrote:
 Some parameters of syscall tracepoints named as 'nr', 'event', etc.
 When dealing with them, perf convert to ctf meets some problem:
 
  1. If a parameter with name 'nr', it will duplicate syscall's
 common field 'nr'. One such syscall is io_submit().
 
  2. If a parameter with name 'event', it is denied to be inserted
 because 'event' is a babeltrace keywork. One such syscall is
 epoll_ctl.

hum, so this problem 2 is detectable only via bt_ctf_event_class_add_field 
function?

how big is the blaklist?

SNIP

 +}
 +
  static int add_tracepoint_fields_types(struct ctf_writer *cw,
  struct format_field *fields,
  struct bt_ctf_event_class *event_class)
 @@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct ctf_writer 
 *cw,
   for (field = fields; field; field = field-next) {
   struct bt_ctf_field_type *type;
   unsigned long flags = field-flags;
 + struct bt_ctf_field_type *f = NULL;
 + char *name;
 + int dup = 1;
  
   pr2(  field '%s'\n, field-name);
  
 @@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct 
 ctf_writer *cw,
   if (flags  FIELD_IS_ARRAY)
   type = bt_ctf_field_type_array_create(type, 
 field-arraylen);
  
 - ret = bt_ctf_event_class_add_field(event_class, type,
 - field-name);
 + /* Check name duplication */
 + name = field-name;

could you please put this in separated function like 'get_field_name(..)'
so we dont polute this function even more

name == get_field_name(...)
if (!name)
error path


thanks,
jirka
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-21 Thread Jiri Olsa
On Wed, Jan 21, 2015 at 07:16:39PM +0800, Wang Nan wrote:
 Hi Jiri,
 
 I found that only this patch is not enough. When converting such tracepoints,
 it uses add_tracepoint_fields_values(..., struct format_field *fields ...),
 and fields-name is still the original one.
 
 If 'struct format_field' has a field like 'dup_name' we can make things 
 simpler.
 However, struct format_field is part of traceevent, not only used by perf.
 
 I have no enough time to think on it. Jiri, could you please give me some 
 hints
 so I can implement another patch tomorrow?

yea, looks like we either need to add 'void *priv' into 'struct format_field'
or if Steven doesn't like it, we'd need to save 'our' field name in some way
so it's reachable via format_field::name string.

Steven,
we need to use changed format_field::name to interface babeltrace
library, because it has restriction that fields within tracepoint
should have unique names.

Any chance we could introduce 'void *priv' member to format_field::name ?
Maybe with 'destroy_priv' callback to be called when the field is destroyed.

I can provide patch, just wanted to know first if you're not strictly against 
;-)

thanks,
jirka
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-20 Thread Wang Nan
Some parameters of syscall tracepoints named as 'nr', 'event', etc.
When dealing with them, perf convert to ctf meets some problem:

 1. If a parameter with name 'nr', it will duplicate syscall's
common field 'nr'. One such syscall is io_submit().

 2. If a parameter with name 'event', it is denied to be inserted
because 'event' is a babeltrace keywork. One such syscall is
epoll_ctl.

This patch appends '_dupl_X' suffix to avoid problem 1, prepend a '_'
prefix to avoid problem 2.

Signed-off-by: Wang Nan 
---
 tools/perf/util/data-convert-bt.c | 65 ---
 1 file changed, 61 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/data-convert-bt.c 
b/tools/perf/util/data-convert-bt.c
index ddecce8..b0a042d 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -567,6 +567,38 @@ static int process_sample_event(struct perf_tool *tool,
return cs ? 0 : -1;
 }
 
+/* If dup < 0, add a prefix. Else, add _dupl_X suffix. */
+static char *change_name(char *name, char *orig_name, int dup)
+{
+   char *new_name = NULL;
+   size_t len;
+
+   if (!name)
+   name = orig_name;
+
+   if (dup >= 10)
+   goto out;
+
+   if (dup < 0)
+   len = strlen(name) + sizeof("_");
+   else
+   len = strlen(orig_name) + sizeof("_dupl_X");
+
+   new_name = malloc(len);
+   if (!new_name)
+   goto out;
+
+   if (dup < 0)
+   snprintf(new_name, len, "_%s", name);
+   else
+   snprintf(new_name, len, "%s_dupl_%d", orig_name, dup);
+
+out:
+   if (name != orig_name)
+   free(name);
+   return new_name;
+}
+
 static int add_tracepoint_fields_types(struct ctf_writer *cw,
   struct format_field *fields,
   struct bt_ctf_event_class *event_class)
@@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct ctf_writer 
*cw,
for (field = fields; field; field = field->next) {
struct bt_ctf_field_type *type;
unsigned long flags = field->flags;
+   struct bt_ctf_field_type *f = NULL;
+   char *name;
+   int dup = 1;
 
pr2("  field '%s'\n", field->name);
 
@@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct ctf_writer 
*cw,
if (flags & FIELD_IS_ARRAY)
type = bt_ctf_field_type_array_create(type, 
field->arraylen);
 
-   ret = bt_ctf_event_class_add_field(event_class, type,
-   field->name);
+   /* Check name duplication */
+   name = field->name;
+   while (f = bt_ctf_event_class_get_field_by_name(event_class, 
name)) {
+   bt_ctf_field_type_put(f);
+   name = change_name(name, field->name, dup++);
+   if (!name) {
+   pr_err("Failed to create dup name for '%s'\n", 
field->name);
+   return -1;
+   }
+   }
+
+   ret = bt_ctf_event_class_add_field(event_class, type, name);
+   /* if failed, we may hit a keywork. try again with a '_' prefix 
*/
+   if (ret) {
+   name = change_name(name, field->name, -1);
+   if (!name) {
+   pr_err("Failed to alloc name for '_%s'\n", 
field->name);
+   return -1;
+   }
+   ret = bt_ctf_event_class_add_field(event_class, type, 
name);
+   }
+   if (name != field->name)
+   free(name);
 
if (flags & FIELD_IS_ARRAY)
bt_ctf_field_type_put(type);
 
if (ret) {
-   pr_err("Failed to add field '%s\n", field->name);
+   pr_err("Failed to add field '%s': %d\n",
+   field->name, ret);
return -1;
}
}
@@ -646,7 +703,7 @@ static int add_generic_types(struct ctf_writer *cw, struct 
perf_evsel *evsel,
do {\
pr2("  field '%s'\n", n);   \
if (bt_ctf_event_class_add_field(cl, t, n)) {   \
-   pr_err("Failed to add field '%s;\n", n);\
+   pr_err("Failed to add field '%s';\n", n);   \
return -1;  \
}   \
} while (0)
-- 
1.8.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More 

[PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords.

2015-01-20 Thread Wang Nan
Some parameters of syscall tracepoints named as 'nr', 'event', etc.
When dealing with them, perf convert to ctf meets some problem:

 1. If a parameter with name 'nr', it will duplicate syscall's
common field 'nr'. One such syscall is io_submit().

 2. If a parameter with name 'event', it is denied to be inserted
because 'event' is a babeltrace keywork. One such syscall is
epoll_ctl.

This patch appends '_dupl_X' suffix to avoid problem 1, prepend a '_'
prefix to avoid problem 2.

Signed-off-by: Wang Nan wangn...@huawei.com
---
 tools/perf/util/data-convert-bt.c | 65 ---
 1 file changed, 61 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/data-convert-bt.c 
b/tools/perf/util/data-convert-bt.c
index ddecce8..b0a042d 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -567,6 +567,38 @@ static int process_sample_event(struct perf_tool *tool,
return cs ? 0 : -1;
 }
 
+/* If dup  0, add a prefix. Else, add _dupl_X suffix. */
+static char *change_name(char *name, char *orig_name, int dup)
+{
+   char *new_name = NULL;
+   size_t len;
+
+   if (!name)
+   name = orig_name;
+
+   if (dup = 10)
+   goto out;
+
+   if (dup  0)
+   len = strlen(name) + sizeof(_);
+   else
+   len = strlen(orig_name) + sizeof(_dupl_X);
+
+   new_name = malloc(len);
+   if (!new_name)
+   goto out;
+
+   if (dup  0)
+   snprintf(new_name, len, _%s, name);
+   else
+   snprintf(new_name, len, %s_dupl_%d, orig_name, dup);
+
+out:
+   if (name != orig_name)
+   free(name);
+   return new_name;
+}
+
 static int add_tracepoint_fields_types(struct ctf_writer *cw,
   struct format_field *fields,
   struct bt_ctf_event_class *event_class)
@@ -577,6 +609,9 @@ static int add_tracepoint_fields_types(struct ctf_writer 
*cw,
for (field = fields; field; field = field-next) {
struct bt_ctf_field_type *type;
unsigned long flags = field-flags;
+   struct bt_ctf_field_type *f = NULL;
+   char *name;
+   int dup = 1;
 
pr2(  field '%s'\n, field-name);
 
@@ -595,14 +630,36 @@ static int add_tracepoint_fields_types(struct ctf_writer 
*cw,
if (flags  FIELD_IS_ARRAY)
type = bt_ctf_field_type_array_create(type, 
field-arraylen);
 
-   ret = bt_ctf_event_class_add_field(event_class, type,
-   field-name);
+   /* Check name duplication */
+   name = field-name;
+   while (f = bt_ctf_event_class_get_field_by_name(event_class, 
name)) {
+   bt_ctf_field_type_put(f);
+   name = change_name(name, field-name, dup++);
+   if (!name) {
+   pr_err(Failed to create dup name for '%s'\n, 
field-name);
+   return -1;
+   }
+   }
+
+   ret = bt_ctf_event_class_add_field(event_class, type, name);
+   /* if failed, we may hit a keywork. try again with a '_' prefix 
*/
+   if (ret) {
+   name = change_name(name, field-name, -1);
+   if (!name) {
+   pr_err(Failed to alloc name for '_%s'\n, 
field-name);
+   return -1;
+   }
+   ret = bt_ctf_event_class_add_field(event_class, type, 
name);
+   }
+   if (name != field-name)
+   free(name);
 
if (flags  FIELD_IS_ARRAY)
bt_ctf_field_type_put(type);
 
if (ret) {
-   pr_err(Failed to add field '%s\n, field-name);
+   pr_err(Failed to add field '%s': %d\n,
+   field-name, ret);
return -1;
}
}
@@ -646,7 +703,7 @@ static int add_generic_types(struct ctf_writer *cw, struct 
perf_evsel *evsel,
do {\
pr2(  field '%s'\n, n);   \
if (bt_ctf_event_class_add_field(cl, t, n)) {   \
-   pr_err(Failed to add field '%s;\n, n);\
+   pr_err(Failed to add field '%s';\n, n);   \
return -1;  \
}   \
} while (0)
-- 
1.8.4

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at