2019-04-02 03:44:25

by Tri Vo

[permalink] [raw]
Subject: [PATCH v3] gcov: fix when CONFIG_MODULES is not set

From: Tri Vo <[email protected]>

Fixes: 8c3d220cb6b5 ("gcov: clang support")

Cc: Greg Hackmann <[email protected]>
Cc: Peter Oberparleiter <[email protected]>
Cc: [email protected]
Cc: [email protected]
Reported-by: Randy Dunlap <[email protected]>
Reported-by: kbuild test robot <[email protected]>
Link: https://marc.info/?l=linux-mm&m=155384681109231&w=2
Signed-off-by: Nick Desaulniers <[email protected]>
Signed-off-by: Tri Vo <[email protected]>
---
kernel/gcov/clang.c | 4 ++++
kernel/gcov/gcc_3_4.c | 4 ++++
kernel/gcov/gcc_4_7.c | 4 ++++
3 files changed, 12 insertions(+)

diff --git a/kernel/gcov/clang.c b/kernel/gcov/clang.c
index 125c50397ba2..cfb9ce5e0fed 100644
--- a/kernel/gcov/clang.c
+++ b/kernel/gcov/clang.c
@@ -223,7 +223,11 @@ void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info)
*/
bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
{
+#ifdef CONFIG_MODULES
return within_module((unsigned long)info->filename, mod);
+#else
+ return false;
+#endif
}

/* Symbolic links to be created for each profiling data file. */
diff --git a/kernel/gcov/gcc_3_4.c b/kernel/gcov/gcc_3_4.c
index 801ee4b0b969..8fc30f178351 100644
--- a/kernel/gcov/gcc_3_4.c
+++ b/kernel/gcov/gcc_3_4.c
@@ -146,7 +146,11 @@ void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info)
*/
bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
{
+#ifdef CONFIG_MODULES
return within_module((unsigned long)info, mod);
+#else
+ return false;
+#endif
}

/* Symbolic links to be created for each profiling data file. */
diff --git a/kernel/gcov/gcc_4_7.c b/kernel/gcov/gcc_4_7.c
index ec37563674d6..0b6886d4a4dd 100644
--- a/kernel/gcov/gcc_4_7.c
+++ b/kernel/gcov/gcc_4_7.c
@@ -159,7 +159,11 @@ void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info)
*/
bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
{
+#ifdef CONFIG_MODULES
return within_module((unsigned long)info, mod);
+#else
+ return false;
+#endif
}

/* Symbolic links to be created for each profiling data file. */
--
2.21.0.392.gf8f6787159e-goog


2019-04-02 05:27:30

by Randy Dunlap

[permalink] [raw]
Subject: Re: [PATCH v3] gcov: fix when CONFIG_MODULES is not set

On 4/1/19 8:09 PM, [email protected] wrote:
> From: Tri Vo <[email protected]>
>
> Fixes: 8c3d220cb6b5 ("gcov: clang support")
>
> Cc: Greg Hackmann <[email protected]>
> Cc: Peter Oberparleiter <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Reported-by: Randy Dunlap <[email protected]>
> Reported-by: kbuild test robot <[email protected]>
> Link: https://marc.info/?l=linux-mm&m=155384681109231&w=2
> Signed-off-by: Nick Desaulniers <[email protected]>
> Signed-off-by: Tri Vo <[email protected]>

Acked-by: Randy Dunlap <[email protected]> # build-tested

Thanks.

> ---
> kernel/gcov/clang.c | 4 ++++
> kernel/gcov/gcc_3_4.c | 4 ++++
> kernel/gcov/gcc_4_7.c | 4 ++++
> 3 files changed, 12 insertions(+)
>
> diff --git a/kernel/gcov/clang.c b/kernel/gcov/clang.c
> index 125c50397ba2..cfb9ce5e0fed 100644
> --- a/kernel/gcov/clang.c
> +++ b/kernel/gcov/clang.c
> @@ -223,7 +223,11 @@ void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info)
> */
> bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
> {
> +#ifdef CONFIG_MODULES
> return within_module((unsigned long)info->filename, mod);
> +#else
> + return false;
> +#endif
> }
>
> /* Symbolic links to be created for each profiling data file. */
> diff --git a/kernel/gcov/gcc_3_4.c b/kernel/gcov/gcc_3_4.c
> index 801ee4b0b969..8fc30f178351 100644
> --- a/kernel/gcov/gcc_3_4.c
> +++ b/kernel/gcov/gcc_3_4.c
> @@ -146,7 +146,11 @@ void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info)
> */
> bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
> {
> +#ifdef CONFIG_MODULES
> return within_module((unsigned long)info, mod);
> +#else
> + return false;
> +#endif
> }
>
> /* Symbolic links to be created for each profiling data file. */
> diff --git a/kernel/gcov/gcc_4_7.c b/kernel/gcov/gcc_4_7.c
> index ec37563674d6..0b6886d4a4dd 100644
> --- a/kernel/gcov/gcc_4_7.c
> +++ b/kernel/gcov/gcc_4_7.c
> @@ -159,7 +159,11 @@ void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info)
> */
> bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
> {
> +#ifdef CONFIG_MODULES
> return within_module((unsigned long)info, mod);
> +#else
> + return false;
> +#endif
> }
>
> /* Symbolic links to be created for each profiling data file. */
>


--
~Randy

2019-04-03 15:29:40

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [PATCH v3] gcov: fix when CONFIG_MODULES is not set

On Tue, Apr 02, 2019 at 10:09:56AM +0700, [email protected] wrote:
> From: Tri Vo <[email protected]>
>
> Fixes: 8c3d220cb6b5 ("gcov: clang support")

I think this is the wrong fix. Why not simply:

+++ b/include/linux/module.h
@@ -709,6 +709,11 @@ static inline bool is_module_text_address(unsigned long addr)
return false;
}

+static inline bool within_module(unsigned long addr, const struct module *mod)
+{
+ return false;
+}
+
/* Get/put a kernel symbol (calls should be symmetric) */
#define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); })
#define symbol_put(x) do { } while (0)

2019-04-05 17:19:39

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH v3] gcov: fix when CONFIG_MODULES is not set

On Wed, Apr 3, 2019 at 8:27 AM Matthew Wilcox <[email protected]> wrote:
>
> On Tue, Apr 02, 2019 at 10:09:56AM +0700, [email protected] wrote:
> > From: Tri Vo <[email protected]>
> >
> > Fixes: 8c3d220cb6b5 ("gcov: clang support")
>
> I think this is the wrong fix. Why not simply:

I spoke with Tri quickly about this proposal and we agree it's a better fix.

Andrew, would you mind dropping:
https://ozlabs.org/~akpm/mmotm/broken-out/gcov-clang-support-fix.patch
?

Matthew, would you please send that patch with a commit message? Or
if you would prefer us to send with your suggested-by tag, we can do
that, too. Whichever you prefer, please let me know. Thanks for the
suggestion.

>
> +++ b/include/linux/module.h
> @@ -709,6 +709,11 @@ static inline bool is_module_text_address(unsigned long addr)
> return false;
> }
>
> +static inline bool within_module(unsigned long addr, const struct module *mod)
> +{
> + return false;
> +}
> +
> /* Get/put a kernel symbol (calls should be symmetric) */
> #define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); })
> #define symbol_put(x) do { } while (0)
>


--
Thanks,
~Nick Desaulniers