public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Tom Zanussi <zanussi@kernel.org>
To: Masami Hiramatsu <mhiramat@kernel.org>
Cc: rostedt@goodmis.org, axelrasmussen@google.com,
	dan.carpenter@oracle.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v6 3/6] tracing: Update synth command errors
Date: Mon, 25 Jan 2021 10:20:02 -0600	[thread overview]
Message-ID: <b671a1ad7906be389190fd98df6112de87259f91.camel@kernel.org> (raw)
In-Reply-To: <20210122222311.7559b4e71d1dc3ce60fa3fcc@kernel.org>

On Fri, 2021-01-22 at 22:23 +0900, Masami Hiramatsu wrote:
> Hi Tom,
> 
> On Thu, 21 Jan 2021 11:01:06 -0600
> Tom Zanussi <zanussi@kernel.org> wrote:
> 
> > Since array types are handled differently, errors referencing them
> > also need to be handled differently.  Add and use a new
> > INVALID_ARRAY_SPEC error.  Also add INVALID_CMD and INVALID_DYN_CMD
> > to
> > catch and display the correct form for badly-formed commands, which
> > can also be used in place of CMD_INCOMPLETE, which is removed, and
> > remove CMD_TOO_LONG, since it's no longer used.
> 
> OK, so this will add new errors for precise error logging.
> 
> > 
> > Signed-off-by: Tom Zanussi <zanussi@kernel.org>
> > ---
> >  kernel/trace/trace_events_synth.c | 72
> > +++++++++++++++++++++++++++----
> >  1 file changed, 63 insertions(+), 9 deletions(-)
> > 
> > diff --git a/kernel/trace/trace_events_synth.c
> > b/kernel/trace/trace_events_synth.c
> > index a79c17b97add..dd141ee6b3fc 100644
> > --- a/kernel/trace/trace_events_synth.c
> > +++ b/kernel/trace/trace_events_synth.c
> > @@ -23,13 +23,14 @@
> >  #undef ERRORS
> >  #define ERRORS	\
> >  	C(BAD_NAME,		"Illegal name"),		\
> > -	C(CMD_INCOMPLETE,	"Incomplete command"),		\
> > +	C(INVALID_CMD,		"Command must be of the form:
> > <name> field[;field] ..."),\
> > +	C(INVALID_DYN_CMD,	"Command must be of the form: s or
> > -:[synthetic/]<name> field[;field] ..."),\
> >  	C(EVENT_EXISTS,		"Event already exists"),	\
> >  	C(TOO_MANY_FIELDS,	"Too many fields"),		\
> >  	C(INCOMPLETE_TYPE,	"Incomplete type"),		\
> >  	C(INVALID_TYPE,		"Invalid type"),		\
> > -	C(INVALID_FIELD,	"Invalid field"),		\
> > -	C(CMD_TOO_LONG,		"Command too long"),
> > +	C(INVALID_FIELD,        "Invalid field"),		\
> > +	C(INVALID_ARRAY_SPEC,	"Invalid array specification"),
> >  
> >  #undef C
> >  #define C(a, b)		SYNTH_ERR_##a
> > @@ -655,7 +656,10 @@ static struct synth_field
> > *parse_synth_field(int argc, char **argv)
> >  
> >  	size = synth_field_size(field->type);
> >  	if (size < 0) {
> > -		synth_err(SYNTH_ERR_INVALID_TYPE, errpos(field_type));
> > +		if (array)
> > +			synth_err(SYNTH_ERR_INVALID_ARRAY_SPEC,
> > errpos(field_name));
> > +		else
> > +			synth_err(SYNTH_ERR_INVALID_TYPE,
> > errpos(field_type));
> >  		ret = -EINVAL;
> >  		goto free;
> >  	} else if (size == 0) {
> > @@ -1176,7 +1180,7 @@ static int __create_synth_event(const char
> > *name, const char *raw_fields)
> >  	mutex_lock(&event_mutex);
> >  
> >  	if (name[0] == '\0') {
> > -		synth_err(SYNTH_ERR_CMD_INCOMPLETE, 0);
> > +		synth_err(SYNTH_ERR_INVALID_CMD, 0);
> >  		ret = -EINVAL;
> >  		goto out;
> >  	}
> > @@ -1228,7 +1232,7 @@ static int __create_synth_event(const char
> > *name, const char *raw_fields)
> >  	}
> >  
> >  	if (n_fields == 0) {
> > -		synth_err(SYNTH_ERR_CMD_INCOMPLETE, 0);
> > +		synth_err(SYNTH_ERR_INVALID_CMD, 0);
> >  		ret = -EINVAL;
> >  		goto err;
> >  	}
> > @@ -1366,6 +1370,40 @@ int synth_event_delete(const char
> > *event_name)
> >  }
> >  EXPORT_SYMBOL_GPL(synth_event_delete);
> >  
> > +static int check_command(const char *raw_command)
> > +{
> > +	char **argv = NULL, *cmd, *saved_cmd, *name_and_field;
> > +	int argc, ret = 0;
> > +
> > +	cmd = saved_cmd = kstrdup(raw_command, GFP_KERNEL);
> > +	if (!cmd)
> > +		return -ENOMEM;
> > +
> > +	name_and_field = strsep(&cmd, ";");
> > +	if (!name_and_field) {
> > +		ret = -EINVAL;
> > +		goto free;
> > +	}
> > +
> > +	if (name_and_field[0] == '!')
> > +		goto free;
> > +
> > +	argv = argv_split(GFP_KERNEL, name_and_field, &argc);
> > +	if (!argv) {
> > +		ret = -ENOMEM;
> > +		goto free;
> > +	}
> > +
> > +	if (argc < 3)
> > +		ret = -EINVAL;
> > +free:
> > +	kfree(saved_cmd);
> > +	if (argv)
> > +		argv_free(argv);
> > +
> > +	return ret;
> > +}
> 
> But I'm not sure why this (yet another parser) is needed. What you
> are expecting
> for this check_command()? Could you tell me some examples?
> 

This is just a common function to check we even have the possibility of
a valid command.  It will catch things right off the top like

  # echo 'myevent' >> synthetic_events

or

  # echo 'myevent int'  >> synthetic events

You're right, it's confusing to have it in this patch, since it really
belongs in the rework patch - I'll move it there.

Thanks,

Tom


> Thank you,
> 
> 
> 


  reply	other threads:[~2021-01-25 16:23 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-21 17:01 [PATCH v6 0/6] tracing: More synthetic event error fixes Tom Zanussi
2021-01-21 17:01 ` [PATCH v6 1/6] tracing/dynevent: Delegate parsing to create function Tom Zanussi
2021-01-21 17:01 ` [PATCH v6 2/6] tracing: Rework synthetic event command parsing Tom Zanussi
2021-01-22 13:16   ` Masami Hiramatsu
2021-01-25 16:16     ` Tom Zanussi
2021-01-22 21:00   ` Steven Rostedt
2021-01-25 16:22     ` Tom Zanussi
2021-01-21 17:01 ` [PATCH v6 3/6] tracing: Update synth command errors Tom Zanussi
2021-01-22 13:23   ` Masami Hiramatsu
2021-01-25 16:20     ` Tom Zanussi [this message]
2021-01-22 21:06   ` Steven Rostedt
2021-01-21 17:01 ` [PATCH v6 4/6] tracing: Add a backward-compatibility check for synthetic event creation Tom Zanussi
2021-01-22 21:12   ` Steven Rostedt
2021-01-25 16:25     ` Tom Zanussi
2021-01-21 17:01 ` [PATCH v6 5/6] selftests/ftrace: Update synthetic event syntax errors Tom Zanussi
2021-01-21 17:01 ` [PATCH v6 6/6] selftests/ftrace: Add '!event' synthetic event syntax check Tom Zanussi

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=b671a1ad7906be389190fd98df6112de87259f91.camel@kernel.org \
    --to=zanussi@kernel.org \
    --cc=axelrasmussen@google.com \
    --cc=dan.carpenter@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=rostedt@goodmis.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox