On Mon, 22 Jan 2024 15:40:12 +0800
Ye Bin <yebi...@huawei.com> wrote:

> Similar to '%pD' for printk, use '%pD' for print struct file's name.
> 
> Signed-off-by: Ye Bin <yebi...@huawei.com>
> ---
>  kernel/trace/trace_probe.c | 41 ++++++++++++++++++++++++--------------
>  1 file changed, 26 insertions(+), 15 deletions(-)
> 
> diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c
> index 1599c0c3e6b7..f9819625de58 100644
> --- a/kernel/trace/trace_probe.c
> +++ b/kernel/trace/trace_probe.c
> @@ -12,6 +12,7 @@
>  #define pr_fmt(fmt)  "trace_probe: " fmt
>  
>  #include <linux/bpf.h>
> +#include <linux/fs.h>
>  #include "trace_btf.h"
>  
>  #include "trace_probe.h"
> @@ -1572,28 +1573,38 @@ int traceprobe_expand_dentry_args(int argc, const 
> char *argv[], char *buf,
>  
>       used = 0;
>       for (i = 0; i < argc; i++) {
> -             if (str_has_suffix(argv[i], ":%pd")) {
> -                     char *tmp = kstrdup(argv[i], GFP_KERNEL);
> -                     char *equal;
> +             if (!str_has_suffix(argv[i], ":%pd") &&
> +                 !str_has_suffix(argv[i], ":%pD"))
> +                     continue;

And here too:

                if (!str_has_suffix(argv[i], ":%pd", &idx) &&
                    !str_has_suffix(argv[i], ":%pD", &idx))
                        continue;


>  
> -                     if (!tmp)
> -                             return -ENOMEM;
> +             char *tmp = kstrdup(argv[i], GFP_KERNEL);
> +             char *equal;
> +
> +             if (!tmp)
> +                     return -ENOMEM;
>  
> -                     equal = strchr(tmp, '=');
> -                     if (equal)
> -                             *equal = '\0';
> -                     tmp[strlen(argv[i]) - 4] = '\0';
> +             equal = strchr(tmp, '=');
> +             if (equal)
> +                     *equal = '\0';
> +             tmp[strlen(argv[i]) - 4] = '\0';

                tmp[idx] = '\0';

> +             if (argv[i][strlen(argv[i]) - 1] == 'd')

To avoid another strlen() call.

                if (tmp[idx + 3] == 'd')


-- Steve


>                       ret = snprintf(buf + used, bufsize - used,
>                                      "%s%s+0x0(+0x%zx(%s)):string",
>                                      equal ? tmp : "", equal ? "=" : "",
>                                      offsetof(struct dentry, d_name.name),
>                                      equal ? equal + 1 : tmp);
> -                     kfree(tmp);
> -                     if (ret >= bufsize - used)
> -                             return -ENOMEM;
> -                     argv[i] = buf + used;
> -                     used += ret + 1;
> -             }
> +             else
> +                     ret = snprintf(buf + used, bufsize - used,
> +                                    "%s%s+0x0(+0x%zx(+0x%zx(%s))):string",
> +                                    equal ? tmp : "", equal ? "=" : "",
> +                                    offsetof(struct dentry, d_name.name),
> +                                    offsetof(struct file, f_path.dentry),
> +                                    equal ? equal + 1 : tmp);
> +             kfree(tmp);
> +             if (ret >= bufsize - used)
> +                     return -ENOMEM;
> +             argv[i] = buf + used;
> +             used += ret + 1;
>       }
>  
>       return 0;


Reply via email to