On Sat 2020-06-13 09:57:25, Jim Cromie wrote:
> Accept these additional query forms:
> 
>    echo "file $filestr +_" > control
> 
>        path/to/file.c:100     # as from control, column 1
>        path/to/file.c:1-100   # or any legal line-range
>        path/to/file.c:func_A  # as from an editor/browser
>        path/to/file.c:drm_\*  # wildcards still work
                            ^

Should the backslash be there?

>        path/to/file.c:*_foo   # lead wildcard too
> 
> 1st 2 examples are treated as line-ranges, 3,4 are treated as func's

There is also 5th example.

> Doc these changes, and sprinkle in a few extra wild-card examples and
> trailing # explanation texts.
> ---
>  .../admin-guide/dynamic-debug-howto.rst       |  5 +++++
>  lib/dynamic_debug.c                           | 20 ++++++++++++++++++-
>  2 files changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst 
> b/Documentation/admin-guide/dynamic-debug-howto.rst
> index 1423af580bed..6c04aea8f4cd 100644
> --- a/Documentation/admin-guide/dynamic-debug-howto.rst
> +++ b/Documentation/admin-guide/dynamic-debug-howto.rst
> @@ -164,6 +164,7 @@ func
>      of each callsite.  Example::
>  
>       func svc_tcp_accept
> +     func *recv*             # in rfcomm, bluetooth, ping, tcp
>  
>  file
>      The given string is compared against either the src-root relative
> @@ -172,6 +173,9 @@ file
>  
>       file svcsock.c
>       file kernel/freezer.c   # ie column 1 of control file
> +     file drivers/usb/*      # all callsites under it
> +     file inode.c:start_*    # parse :tail as a func (above)
> +     file inode.c:1-100      # parse :tail as a line-range (above)
>  
>  module
>      The given string is compared against the module name
> @@ -181,6 +185,7 @@ module
>  
>       module sunrpc
>       module nfsd
> +     module drm*     # both drm, drm_kms_helper
>  
>  format
>      The given string is searched for in the dynamic debug format
> diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> index f87a7bef4204..784c075c7db9 100644
> --- a/lib/dynamic_debug.c
> +++ b/lib/dynamic_debug.c
> @@ -322,6 +322,8 @@ static int parse_linerange(struct ddebug_query *query, 
> const char *first)
>       } else {
>               query->last_lineno = query->first_lineno;
>       }
> +     vpr_info("parsed line %d-%d\n", query->first_lineno,
> +              query->last_lineno);

Is this supposed to be in the final code?
I do not see such messages printed for other parsed variants.

>       return 0;
>  }
>  
> @@ -358,6 +360,7 @@ static int ddebug_parse_query(char *words[], int nwords,
>  {
>       unsigned int i;
>       int rc = 0;
> +     char *fline;
>  
>       /* check we have an even number of words */
>       if (nwords % 2 != 0) {
> @@ -374,7 +377,22 @@ static int ddebug_parse_query(char *words[], int nwords,
>               if (!strcmp(words[i], "func")) {
>                       rc = check_set(&query->function, words[i+1], "func");
>               } else if (!strcmp(words[i], "file")) {
> -                     rc = check_set(&query->filename, words[i+1], "file");
> +                     if (check_set(&query->filename, words[i+1], "file"))
> +                             return -EINVAL;

There is no reason to hard code the error code. It should look like:

                        rc = check_set(&query->filename, words[i+1], "file");
                        if (rc)
                                return rc;
> +
> +                     /* tail :$info is function or line-range */
> +                     fline = strchr(query->filename, ':');
> +                     if (!fline)
> +                             break;
> +                     *fline++ = '\0';
> +                     if (isalpha(*fline) || *fline == '*' || *fline == '?') {

I would do the oposite and check whether is starts with number.

> +                             /* take as function name */
> +                             if (check_set(&query->function, fline, "func"))
> +                                     return -EINVAL;
> +                     } else {
> +                             if (parse_linerange(query, fline))
> +                                     return -EINVAL;
> +                     }

Also I would hide this into another function:

                        rc = parse_filenane(...);


>               } else if (!strcmp(words[i], "module")) {
>                       rc = check_set(&query->module, words[i+1], "module");
>               } else if (!strcmp(words[i], "format")) {
> -- 
> 2.26.2

Best Regards,
Petr

Reply via email to