* [PATCH v1] kunit: fix failure to build without printk @ 2019-08-27 17:49 Brendan Higgins 2019-08-27 18:58 ` Randy Dunlap ` (2 more replies) 0 siblings, 3 replies; 16+ messages in thread From: Brendan Higgins @ 2019-08-27 17:49 UTC (permalink / raw) To: shuah Cc: kunit-dev, linux-kernel, linux-kselftest, frowand.list, sboyd, Brendan Higgins, Randy Dunlap, Stephen Rothwell Previously KUnit assumed that printk would always be present, which is not a valid assumption to make. Fix that by ifdefing out functions which directly depend on printk core functions similar to what dev_printk does. Reported-by: Randy Dunlap <rdunlap@infradead.org> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t Cc: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> --- include/kunit/test.h | 7 +++++++ kunit/test.c | 41 ++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/include/kunit/test.h b/include/kunit/test.h index 8b7eb03d4971..339af5f95c4a 100644 --- a/include/kunit/test.h +++ b/include/kunit/test.h @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) void kunit_cleanup(struct kunit *test); +#ifdef CONFIG_PRINTK void __printf(3, 4) kunit_printk(const char *level, const struct kunit *test, const char *fmt, ...); +#else +static inline void __printf(3, 4) kunit_printk(const char *level, + const struct kunit *test, + const char *fmt, ...) +{} +#endif /** * kunit_info() - Prints an INFO level message associated with @test. diff --git a/kunit/test.c b/kunit/test.c index b2ca9b94c353..0aa1caf07a6b 100644 --- a/kunit/test.c +++ b/kunit/test.c @@ -16,6 +16,7 @@ static void kunit_set_failure(struct kunit *test) WRITE_ONCE(test->success, false); } +#ifdef CONFIG_PRINTK static int kunit_vprintk_emit(int level, const char *fmt, va_list args) { return vprintk_emit(0, level, NULL, 0, fmt, args); @@ -40,6 +41,29 @@ static void kunit_vprintk(const struct kunit *test, kunit_printk_emit(level[1] - '0', "\t# %s: %pV", test->name, vaf); } +void kunit_printk(const char *level, + const struct kunit *test, + const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + kunit_vprintk(test, level, &vaf); + + va_end(args); +} +#else /* CONFIG_PRINTK */ +static inline int kunit_printk_emit(int level, const char *fmt, ...) +{ + return 0; +} +#endif /* CONFIG_PRINTK */ + static void kunit_print_tap_version(void) { static bool kunit_has_printed_tap_version; @@ -504,20 +528,3 @@ void kunit_cleanup(struct kunit *test) kunit_resource_free(test, resource); } } - -void kunit_printk(const char *level, - const struct kunit *test, - const char *fmt, ...) -{ - struct va_format vaf; - va_list args; - - va_start(args, fmt); - - vaf.fmt = fmt; - vaf.va = &args; - - kunit_vprintk(test, level, &vaf); - - va_end(args); -} -- 2.23.0.187.g17f5b7556c-goog ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 17:49 [PATCH v1] kunit: fix failure to build without printk Brendan Higgins @ 2019-08-27 18:58 ` Randy Dunlap 2019-08-27 20:21 ` shuah 2019-08-27 21:46 ` Stephen Boyd 2 siblings, 0 replies; 16+ messages in thread From: Randy Dunlap @ 2019-08-27 18:58 UTC (permalink / raw) To: Brendan Higgins, shuah Cc: kunit-dev, linux-kernel, linux-kselftest, frowand.list, sboyd, Stephen Rothwell On 8/27/19 10:49 AM, Brendan Higgins wrote: > Previously KUnit assumed that printk would always be present, which is > not a valid assumption to make. Fix that by ifdefing out functions which > directly depend on printk core functions similar to what dev_printk > does. > > Reported-by: Randy Dunlap <rdunlap@infradead.org> > Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > Cc: Stephen Rothwell <sfr@canb.auug.org.au> > Signed-off-by: Brendan Higgins <brendanhiggins@google.com> Acked-by: Randy Dunlap <rdunlap@infradead.org> # build-tested Thanks. > --- > include/kunit/test.h | 7 +++++++ > kunit/test.c | 41 ++++++++++++++++++++++++----------------- > 2 files changed, 31 insertions(+), 17 deletions(-) -- ~Randy ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 17:49 [PATCH v1] kunit: fix failure to build without printk Brendan Higgins 2019-08-27 18:58 ` Randy Dunlap @ 2019-08-27 20:21 ` shuah 2019-08-27 20:53 ` Randy Dunlap 2019-08-27 21:03 ` Brendan Higgins 2019-08-27 21:46 ` Stephen Boyd 2 siblings, 2 replies; 16+ messages in thread From: shuah @ 2019-08-27 20:21 UTC (permalink / raw) To: Brendan Higgins Cc: kunit-dev, linux-kernel, linux-kselftest, frowand.list, sboyd, Randy Dunlap, Stephen Rothwell, shuah On 8/27/19 11:49 AM, Brendan Higgins wrote: > Previously KUnit assumed that printk would always be present, which is > not a valid assumption to make. Fix that by ifdefing out functions which > directly depend on printk core functions similar to what dev_printk > does. > > Reported-by: Randy Dunlap <rdunlap@infradead.org> > Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > Cc: Stephen Rothwell <sfr@canb.auug.org.au> > Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > --- > include/kunit/test.h | 7 +++++++ > kunit/test.c | 41 ++++++++++++++++++++++++----------------- > 2 files changed, 31 insertions(+), 17 deletions(-) > > diff --git a/include/kunit/test.h b/include/kunit/test.h > index 8b7eb03d4971..339af5f95c4a 100644 > --- a/include/kunit/test.h > +++ b/include/kunit/test.h > @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) > > void kunit_cleanup(struct kunit *test); > > +#ifdef CONFIG_PRINTK Please make this #if defined(CONFIG_PRINTK) > void __printf(3, 4) kunit_printk(const char *level, Line these two up with const char *level, > const struct kunit *test, > const char *fmt, ...); > +#else > +static inline void __printf(3, 4) kunit_printk(const char *level, > + const struct kunit *test, > + const char *fmt, ...) Same here. > +{} Either line this up or make it const char *fmt, ...) { } It is hard to read the way it is currently indented. > +#endif > > /** > * kunit_info() - Prints an INFO level message associated with @test. > diff --git a/kunit/test.c b/kunit/test.c > index b2ca9b94c353..0aa1caf07a6b 100644 > --- a/kunit/test.c > +++ b/kunit/test.c > @@ -16,6 +16,7 @@ static void kunit_set_failure(struct kunit *test) > WRITE_ONCE(test->success, false); > } > > +#ifdef CONFIG_PRINTK Same here - if defined > static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > { > return vprintk_emit(0, level, NULL, 0, fmt, args); > @@ -40,6 +41,29 @@ static void kunit_vprintk(const struct kunit *test, > kunit_printk_emit(level[1] - '0', "\t# %s: %pV", test->name, vaf); > } > > +void kunit_printk(const char *level, > + const struct kunit *test, > + const char *fmt, ...) Line the arguments up. > +{ > + struct va_format vaf; > + va_list args; > + > + va_start(args, fmt); > + > + vaf.fmt = fmt; > + vaf.va = &args; > + > + kunit_vprintk(test, level, &vaf); > + > + va_end(args); > +} > +#else /* CONFIG_PRINTK */ > +static inline int kunit_printk_emit(int level, const char *fmt, ...) > +{ > + return 0; Is there a reason to not use > +} > +#endif /* CONFIG_PRINTK */ > + > static void kunit_print_tap_version(void) > { > static bool kunit_has_printed_tap_version; > @@ -504,20 +528,3 @@ void kunit_cleanup(struct kunit *test) > kunit_resource_free(test, resource); > } > } > - > -void kunit_printk(const char *level, > - const struct kunit *test, > - const char *fmt, ...) > -{ > - struct va_format vaf; > - va_list args; > - > - va_start(args, fmt); > - > - vaf.fmt = fmt; > - vaf.va = &args; > - > - kunit_vprintk(test, level, &vaf); > - > - va_end(args); > -} > Okay after reviewing this, I am not sure why you need to do all this. Why can't you just change the root function that throws the warn: static int kunit_vprintk_emit(int level, const char *fmt, va_list args) { return vprintk_emit(0, level, NULL, 0, fmt, args); } You aren'r really doing anything extra here, other than calling vprintk_emit() Unless I am missing something, can't you solve this problem by including printk.h and let it handle the !CONFIG_PRINTK case? thanks, -- Shuah ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 20:21 ` shuah @ 2019-08-27 20:53 ` Randy Dunlap 2019-08-27 21:16 ` shuah 2019-08-27 21:03 ` Brendan Higgins 1 sibling, 1 reply; 16+ messages in thread From: Randy Dunlap @ 2019-08-27 20:53 UTC (permalink / raw) To: shuah, Brendan Higgins Cc: kunit-dev, linux-kernel, linux-kselftest, frowand.list, sboyd, Stephen Rothwell On 8/27/19 1:21 PM, shuah wrote: > On 8/27/19 11:49 AM, Brendan Higgins wrote: >> Previously KUnit assumed that printk would always be present, which is >> not a valid assumption to make. Fix that by ifdefing out functions which >> directly depend on printk core functions similar to what dev_printk >> does. >> >> Reported-by: Randy Dunlap <rdunlap@infradead.org> >> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t >> Cc: Stephen Rothwell <sfr@canb.auug.org.au> >> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> >> --- >> include/kunit/test.h | 7 +++++++ >> kunit/test.c | 41 ++++++++++++++++++++++++----------------- >> 2 files changed, 31 insertions(+), 17 deletions(-) >> >> diff --git a/include/kunit/test.h b/include/kunit/test.h >> index 8b7eb03d4971..339af5f95c4a 100644 >> --- a/include/kunit/test.h >> +++ b/include/kunit/test.h >> @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) >> void kunit_cleanup(struct kunit *test); >> +#ifdef CONFIG_PRINTK > > Please make this #if defined(CONFIG_PRINTK) explain why, please? thanks. -- ~Randy ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 20:53 ` Randy Dunlap @ 2019-08-27 21:16 ` shuah 0 siblings, 0 replies; 16+ messages in thread From: shuah @ 2019-08-27 21:16 UTC (permalink / raw) To: Randy Dunlap, Brendan Higgins Cc: kunit-dev, linux-kernel, linux-kselftest, frowand.list, sboyd, Stephen Rothwell, shuah On 8/27/19 2:53 PM, Randy Dunlap wrote: > On 8/27/19 1:21 PM, shuah wrote: >> On 8/27/19 11:49 AM, Brendan Higgins wrote: >>> Previously KUnit assumed that printk would always be present, which is >>> not a valid assumption to make. Fix that by ifdefing out functions which >>> directly depend on printk core functions similar to what dev_printk >>> does. >>> >>> Reported-by: Randy Dunlap <rdunlap@infradead.org> >>> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t >>> Cc: Stephen Rothwell <sfr@canb.auug.org.au> >>> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> >>> --- >>> include/kunit/test.h | 7 +++++++ >>> kunit/test.c | 41 ++++++++++++++++++++++++----------------- >>> 2 files changed, 31 insertions(+), 17 deletions(-) >>> >>> diff --git a/include/kunit/test.h b/include/kunit/test.h >>> index 8b7eb03d4971..339af5f95c4a 100644 >>> --- a/include/kunit/test.h >>> +++ b/include/kunit/test.h >>> @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) >>> void kunit_cleanup(struct kunit *test); >>> +#ifdef CONFIG_PRINTK >> >> Please make this #if defined(CONFIG_PRINTK) > > explain why, please? > > thanks. > This can be used to do compound logic. I have been using this style for that reason starting a couple of years now. I seem to work in code paths where I have to look for multiple config vars. In this case, it probably doesn't matter as much either way. thanks, -- Shuah ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 20:21 ` shuah 2019-08-27 20:53 ` Randy Dunlap @ 2019-08-27 21:03 ` Brendan Higgins 2019-08-27 21:09 ` Brendan Higgins 1 sibling, 1 reply; 16+ messages in thread From: Brendan Higgins @ 2019-08-27 21:03 UTC (permalink / raw) To: shuah Cc: kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Stephen Boyd, Randy Dunlap, Stephen Rothwell On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: > > On 8/27/19 11:49 AM, Brendan Higgins wrote: > > Previously KUnit assumed that printk would always be present, which is > > not a valid assumption to make. Fix that by ifdefing out functions which > > directly depend on printk core functions similar to what dev_printk > > does. > > > > Reported-by: Randy Dunlap <rdunlap@infradead.org> > > Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > > Cc: Stephen Rothwell <sfr@canb.auug.org.au> > > Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > > --- > > include/kunit/test.h | 7 +++++++ > > kunit/test.c | 41 ++++++++++++++++++++++++----------------- > > 2 files changed, 31 insertions(+), 17 deletions(-) > > > > diff --git a/include/kunit/test.h b/include/kunit/test.h > > index 8b7eb03d4971..339af5f95c4a 100644 > > --- a/include/kunit/test.h > > +++ b/include/kunit/test.h > > @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) [...] > Okay after reviewing this, I am not sure why you need to do all > this. > > Why can't you just change the root function that throws the warn: > > static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > { > return vprintk_emit(0, level, NULL, 0, fmt, args); > } > > You aren'r really doing anything extra here, other than calling > vprintk_emit() Yeah, I did that a while ago. I think it was a combination of trying to avoid an extra layer of adding and then removing the log level, and that's what dev_printk and friends did. But I think you are probably right. It's a lot of maintenance overhead to get rid of that. Probably best to just use what the printk people have. > Unless I am missing something, can't you solve this problem by including > printk.h and let it handle the !CONFIG_PRINTK case? Randy, I hope you don't mind, but I am going to ask you to re-ack my next revision since it basically addresses the problem in a totally different way. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 21:03 ` Brendan Higgins @ 2019-08-27 21:09 ` Brendan Higgins 2019-08-27 21:36 ` Brendan Higgins 0 siblings, 1 reply; 16+ messages in thread From: Brendan Higgins @ 2019-08-27 21:09 UTC (permalink / raw) To: shuah Cc: kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Stephen Boyd, Randy Dunlap, Stephen Rothwell On Tue, Aug 27, 2019 at 2:03 PM Brendan Higgins <brendanhiggins@google.com> wrote: > > On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: > > > > On 8/27/19 11:49 AM, Brendan Higgins wrote: > > > Previously KUnit assumed that printk would always be present, which is > > > not a valid assumption to make. Fix that by ifdefing out functions which > > > directly depend on printk core functions similar to what dev_printk > > > does. > > > > > > Reported-by: Randy Dunlap <rdunlap@infradead.org> > > > Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > > > Cc: Stephen Rothwell <sfr@canb.auug.org.au> > > > Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > > > --- > > > include/kunit/test.h | 7 +++++++ > > > kunit/test.c | 41 ++++++++++++++++++++++++----------------- > > > 2 files changed, 31 insertions(+), 17 deletions(-) > > > > > > diff --git a/include/kunit/test.h b/include/kunit/test.h > > > index 8b7eb03d4971..339af5f95c4a 100644 > > > --- a/include/kunit/test.h > > > +++ b/include/kunit/test.h > > > @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) > [...] > > Okay after reviewing this, I am not sure why you need to do all > > this. > > > > Why can't you just change the root function that throws the warn: > > > > static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > > { > > return vprintk_emit(0, level, NULL, 0, fmt, args); > > } > > > > You aren'r really doing anything extra here, other than calling > > vprintk_emit() > > Yeah, I did that a while ago. I think it was a combination of trying > to avoid an extra layer of adding and then removing the log level, and > that's what dev_printk and friends did. > > But I think you are probably right. It's a lot of maintenance overhead > to get rid of that. Probably best to just use what the printk people > have. > > > Unless I am missing something, can't you solve this problem by including > > printk.h and let it handle the !CONFIG_PRINTK case? > > Randy, I hope you don't mind, but I am going to ask you to re-ack my > next revision since it basically addresses the problem in a totally > different way. Actually, scratch that. Checkpatch doesn't like me calling printk without using a KERN_<LEVEL>. Now that I am thinking back to when I wrote this. I think it also might not like using a dynamic KERN_<LEVEL> either (printk("%s my message", KERN_INFO)). I am going to have to do some more investigation. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 21:09 ` Brendan Higgins @ 2019-08-27 21:36 ` Brendan Higgins 2019-08-27 22:00 ` shuah 0 siblings, 1 reply; 16+ messages in thread From: Brendan Higgins @ 2019-08-27 21:36 UTC (permalink / raw) To: shuah Cc: kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Stephen Boyd, Randy Dunlap, Stephen Rothwell On Tue, Aug 27, 2019 at 2:09 PM Brendan Higgins <brendanhiggins@google.com> wrote: > > On Tue, Aug 27, 2019 at 2:03 PM Brendan Higgins > <brendanhiggins@google.com> wrote: > > > > On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: > > > > > > On 8/27/19 11:49 AM, Brendan Higgins wrote: > > > > Previously KUnit assumed that printk would always be present, which is > > > > not a valid assumption to make. Fix that by ifdefing out functions which > > > > directly depend on printk core functions similar to what dev_printk > > > > does. > > > > > > > > Reported-by: Randy Dunlap <rdunlap@infradead.org> > > > > Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > > > > Cc: Stephen Rothwell <sfr@canb.auug.org.au> > > > > Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > > > > --- > > > > include/kunit/test.h | 7 +++++++ > > > > kunit/test.c | 41 ++++++++++++++++++++++++----------------- > > > > 2 files changed, 31 insertions(+), 17 deletions(-) > > > > > > > > diff --git a/include/kunit/test.h b/include/kunit/test.h > > > > index 8b7eb03d4971..339af5f95c4a 100644 > > > > --- a/include/kunit/test.h > > > > +++ b/include/kunit/test.h > > > > @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) > > [...] > > > Okay after reviewing this, I am not sure why you need to do all > > > this. > > > > > > Why can't you just change the root function that throws the warn: > > > > > > static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > > > { > > > return vprintk_emit(0, level, NULL, 0, fmt, args); > > > } > > > > > > You aren'r really doing anything extra here, other than calling > > > vprintk_emit() > > > > Yeah, I did that a while ago. I think it was a combination of trying > > to avoid an extra layer of adding and then removing the log level, and > > that's what dev_printk and friends did. > > > > But I think you are probably right. It's a lot of maintenance overhead > > to get rid of that. Probably best to just use what the printk people > > have. > > > > > Unless I am missing something, can't you solve this problem by including > > > printk.h and let it handle the !CONFIG_PRINTK case? > > > > Randy, I hope you don't mind, but I am going to ask you to re-ack my > > next revision since it basically addresses the problem in a totally > > different way. > > Actually, scratch that. Checkpatch doesn't like me calling printk > without using a KERN_<LEVEL>. > > Now that I am thinking back to when I wrote this. I think it also > might not like using a dynamic KERN_<LEVEL> either (printk("%s my > message", KERN_INFO)). > > I am going to have to do some more investigation. Alright, I am pretty sure it is safe to do printk("%smessage", KERN_<LEVEL>); Looking at the printk implementation, it appears to do the format before it checks the log level: https://elixir.bootlin.com/linux/v5.2.10/source/kernel/printk/printk.c#L1907 So I am pretty sure we can do it either with the vprintk_emit or with printk. So it appears that we have to weigh the following trade-offs: Using vprintk_emit: Pros: - That's what dev_printk uses. - No checkpatch warnings. Cons: - Harder to maintain (requires ifdefery). Using printk: Pros: - Easier to maintain. Cons: - I am less confident that it is correct (I am not 100% certain that printk is intended to be used this way). - Checkpatch warnings. - Extra layer of string formatting. My preference is to go the vprintk_emit route since I am more confident that it is right, but I don't have a strong preference. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 21:36 ` Brendan Higgins @ 2019-08-27 22:00 ` shuah 2019-08-27 22:16 ` Brendan Higgins 0 siblings, 1 reply; 16+ messages in thread From: shuah @ 2019-08-27 22:00 UTC (permalink / raw) To: Brendan Higgins Cc: kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Stephen Boyd, Randy Dunlap, Stephen Rothwell, shuah On 8/27/19 3:36 PM, Brendan Higgins wrote: > On Tue, Aug 27, 2019 at 2:09 PM Brendan Higgins > <brendanhiggins@google.com> wrote: >> >> On Tue, Aug 27, 2019 at 2:03 PM Brendan Higgins >> <brendanhiggins@google.com> wrote: >>> >>> On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: >>>> >>>> On 8/27/19 11:49 AM, Brendan Higgins wrote: >>>>> Previously KUnit assumed that printk would always be present, which is >>>>> not a valid assumption to make. Fix that by ifdefing out functions which >>>>> directly depend on printk core functions similar to what dev_printk >>>>> does. >>>>> >>>>> Reported-by: Randy Dunlap <rdunlap@infradead.org> >>>>> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t >>>>> Cc: Stephen Rothwell <sfr@canb.auug.org.au> >>>>> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> >>>>> --- >>>>> include/kunit/test.h | 7 +++++++ >>>>> kunit/test.c | 41 ++++++++++++++++++++++++----------------- >>>>> 2 files changed, 31 insertions(+), 17 deletions(-) >>>>> >>>>> diff --git a/include/kunit/test.h b/include/kunit/test.h >>>>> index 8b7eb03d4971..339af5f95c4a 100644 >>>>> --- a/include/kunit/test.h >>>>> +++ b/include/kunit/test.h >>>>> @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) >>> [...] >>>> Okay after reviewing this, I am not sure why you need to do all >>>> this. >>>> >>>> Why can't you just change the root function that throws the warn: >>>> >>>> static int kunit_vprintk_emit(int level, const char *fmt, va_list args) >>>> { >>>> return vprintk_emit(0, level, NULL, 0, fmt, args); >>>> } >>>> >>>> You aren'r really doing anything extra here, other than calling >>>> vprintk_emit() >>> >>> Yeah, I did that a while ago. I think it was a combination of trying >>> to avoid an extra layer of adding and then removing the log level, and >>> that's what dev_printk and friends did. >>> >>> But I think you are probably right. It's a lot of maintenance overhead >>> to get rid of that. Probably best to just use what the printk people >>> have. >>> >>>> Unless I am missing something, can't you solve this problem by including >>>> printk.h and let it handle the !CONFIG_PRINTK case? >>> >>> Randy, I hope you don't mind, but I am going to ask you to re-ack my >>> next revision since it basically addresses the problem in a totally >>> different way. >> >> Actually, scratch that. Checkpatch doesn't like me calling printk >> without using a KERN_<LEVEL>. >> >> Now that I am thinking back to when I wrote this. I think it also >> might not like using a dynamic KERN_<LEVEL> either (printk("%s my >> message", KERN_INFO)). >> >> I am going to have to do some more investigation. > > Alright, I am pretty sure it is safe to do printk("%smessage", KERN_<LEVEL>); > > Looking at the printk implementation, it appears to do the format > before it checks the log level: > > https://elixir.bootlin.com/linux/v5.2.10/source/kernel/printk/printk.c#L1907 > > So I am pretty sure we can do it either with the vprintk_emit or with printk. Let me see if we are on the same page first. I am asking if you can just include printk.h for vprintk_emit() define for both CONFIG_PRINTK and !CONFIG_PRINTK cases. I am not asking you to use printk() in place of vprintk_emit(). It is perfectly fine to use vprintk_emit() > > So it appears that we have to weigh the following trade-offs: > > Using vprintk_emit: > > Pros: > - That's what dev_printk uses. Not sure what you mean by this. I am suggesting if you can just call vprintk_emit() and include printk.h and not have to ifdef around all the other callers of kunit_vprintk_emit() Yes. There is the other issue of why do you need the complexity of having kunit_vprintk_emit() at all. thanks, -- Shuah ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 22:00 ` shuah @ 2019-08-27 22:16 ` Brendan Higgins 2019-08-27 22:37 ` Tim.Bird 2019-08-27 22:55 ` shuah 0 siblings, 2 replies; 16+ messages in thread From: Brendan Higgins @ 2019-08-27 22:16 UTC (permalink / raw) To: shuah Cc: kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Stephen Boyd, Randy Dunlap, Stephen Rothwell On Tue, Aug 27, 2019 at 3:00 PM shuah <shuah@kernel.org> wrote: > > On 8/27/19 3:36 PM, Brendan Higgins wrote: > > On Tue, Aug 27, 2019 at 2:09 PM Brendan Higgins > > <brendanhiggins@google.com> wrote: > >> > >> On Tue, Aug 27, 2019 at 2:03 PM Brendan Higgins > >> <brendanhiggins@google.com> wrote: > >>> > >>> On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: > >>>> > >>>> On 8/27/19 11:49 AM, Brendan Higgins wrote: > >>>>> Previously KUnit assumed that printk would always be present, which is > >>>>> not a valid assumption to make. Fix that by ifdefing out functions which > >>>>> directly depend on printk core functions similar to what dev_printk > >>>>> does. > >>>>> > >>>>> Reported-by: Randy Dunlap <rdunlap@infradead.org> > >>>>> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > >>>>> Cc: Stephen Rothwell <sfr@canb.auug.org.au> > >>>>> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > >>>>> --- > >>>>> include/kunit/test.h | 7 +++++++ > >>>>> kunit/test.c | 41 ++++++++++++++++++++++++----------------- > >>>>> 2 files changed, 31 insertions(+), 17 deletions(-) > >>>>> > >>>>> diff --git a/include/kunit/test.h b/include/kunit/test.h > >>>>> index 8b7eb03d4971..339af5f95c4a 100644 > >>>>> --- a/include/kunit/test.h > >>>>> +++ b/include/kunit/test.h > >>>>> @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) > >>> [...] > >>>> Okay after reviewing this, I am not sure why you need to do all > >>>> this. > >>>> > >>>> Why can't you just change the root function that throws the warn: > >>>> > >>>> static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > >>>> { > >>>> return vprintk_emit(0, level, NULL, 0, fmt, args); > >>>> } > >>>> > >>>> You aren'r really doing anything extra here, other than calling > >>>> vprintk_emit() > >>> > >>> Yeah, I did that a while ago. I think it was a combination of trying > >>> to avoid an extra layer of adding and then removing the log level, and > >>> that's what dev_printk and friends did. > >>> > >>> But I think you are probably right. It's a lot of maintenance overhead > >>> to get rid of that. Probably best to just use what the printk people > >>> have. > >>> > >>>> Unless I am missing something, can't you solve this problem by including > >>>> printk.h and let it handle the !CONFIG_PRINTK case? > >>> > >>> Randy, I hope you don't mind, but I am going to ask you to re-ack my > >>> next revision since it basically addresses the problem in a totally > >>> different way. > >> > >> Actually, scratch that. Checkpatch doesn't like me calling printk > >> without using a KERN_<LEVEL>. > >> > >> Now that I am thinking back to when I wrote this. I think it also > >> might not like using a dynamic KERN_<LEVEL> either (printk("%s my > >> message", KERN_INFO)). > >> > >> I am going to have to do some more investigation. > > > > Alright, I am pretty sure it is safe to do printk("%smessage", KERN_<LEVEL>); > > > > Looking at the printk implementation, it appears to do the format > > before it checks the log level: > > > > https://elixir.bootlin.com/linux/v5.2.10/source/kernel/printk/printk.c#L1907 > > > > So I am pretty sure we can do it either with the vprintk_emit or with printk. > > Let me see if we are on the same page first. I am asking if you can > just include printk.h for vprintk_emit() define for both CONFIG_PRINTK > and !CONFIG_PRINTK cases. Ah sorry, I misunderstood you. No, that doesn't work. I tried including linux/printk.h, and I get the same error. The reason for this is that vprintk_emit() is only defined when CONFIG_PRINTK=y: https://elixir.bootlin.com/linux/latest/ident/vprintk_emit > I am not asking you to use printk() in place of vprintk_emit(). > It is perfectly fine to use vprintk_emit() Okay, cool. > > > > So it appears that we have to weigh the following trade-offs: > > > > Using vprintk_emit: > > > > Pros: > > - That's what dev_printk uses. > > Not sure what you mean by this. I am suggesting if you can just > call vprintk_emit() and include printk.h and not have to ifdef > around all the other callers of kunit_vprintk_emit() Oh, I was just saying that I heavily based my implementation of kunit_printk on dev_printk. So I have a high degree of confidence that it is okay to use it the way that I am using it. > Yes. There is the other issue of why do you need the complexity > of having kunit_vprintk_emit() at all. Right, and the problem with the alternative, is there is no good kernel API for logging with the log level set dynamically. printk prefers to have it as a string prefix on the format string, but I cannot do that because I need to add my own prefix to the format string. So, I guess I should just go ahead and address the earlier comments on this patch? ^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 22:16 ` Brendan Higgins @ 2019-08-27 22:37 ` Tim.Bird 2019-08-27 22:51 ` Brendan Higgins 2019-08-27 22:55 ` shuah 1 sibling, 1 reply; 16+ messages in thread From: Tim.Bird @ 2019-08-27 22:37 UTC (permalink / raw) To: brendanhiggins, shuah Cc: kunit-dev, linux-kernel, linux-kselftest, frowand.list, sboyd, rdunlap, sfr > -----Original Message----- > From: Brendan Higgins > > On Tue, Aug 27, 2019 at 3:00 PM shuah <shuah@kernel.org> wrote: > > > > On 8/27/19 3:36 PM, Brendan Higgins wrote: > > > On Tue, Aug 27, 2019 at 2:09 PM Brendan Higgins > > > <brendanhiggins@google.com> wrote: > > >> > > >> On Tue, Aug 27, 2019 at 2:03 PM Brendan Higgins > > >> <brendanhiggins@google.com> wrote: > > >>> > > >>> On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: > > >>>> > > >>>> On 8/27/19 11:49 AM, Brendan Higgins wrote: > > >>>>> Previously KUnit assumed that printk would always be present, > which is > > >>>>> not a valid assumption to make. Fix that by ifdefing out functions > which > > >>>>> directly depend on printk core functions similar to what dev_printk > > >>>>> does. > > >>>>> > > >>>>> Reported-by: Randy Dunlap <rdunlap@infradead.org> > > >>>>> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97- > 715a-fabe016259df@kernel.org/T/#t > > >>>>> Cc: Stephen Rothwell <sfr@canb.auug.org.au> > > >>>>> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > > >>>>> --- > > >>>>> include/kunit/test.h | 7 +++++++ > > >>>>> kunit/test.c | 41 ++++++++++++++++++++++++----------------- > > >>>>> 2 files changed, 31 insertions(+), 17 deletions(-) > > >>>>> > > >>>>> diff --git a/include/kunit/test.h b/include/kunit/test.h > > >>>>> index 8b7eb03d4971..339af5f95c4a 100644 > > >>>>> --- a/include/kunit/test.h > > >>>>> +++ b/include/kunit/test.h > > >>>>> @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit > *test, size_t size, gfp_t gfp) > > >>> [...] > > >>>> Okay after reviewing this, I am not sure why you need to do all > > >>>> this. > > >>>> > > >>>> Why can't you just change the root function that throws the warn: > > >>>> > > >>>> static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > > >>>> { > > >>>> return vprintk_emit(0, level, NULL, 0, fmt, args); > > >>>> } > > >>>> > > >>>> You aren'r really doing anything extra here, other than calling > > >>>> vprintk_emit() > > >>> > > >>> Yeah, I did that a while ago. I think it was a combination of trying > > >>> to avoid an extra layer of adding and then removing the log level, and > > >>> that's what dev_printk and friends did. > > >>> > > >>> But I think you are probably right. It's a lot of maintenance overhead > > >>> to get rid of that. Probably best to just use what the printk people > > >>> have. > > >>> > > >>>> Unless I am missing something, can't you solve this problem by > including > > >>>> printk.h and let it handle the !CONFIG_PRINTK case? > > >>> > > >>> Randy, I hope you don't mind, but I am going to ask you to re-ack my > > >>> next revision since it basically addresses the problem in a totally > > >>> different way. > > >> > > >> Actually, scratch that. Checkpatch doesn't like me calling printk > > >> without using a KERN_<LEVEL>. > > >> > > >> Now that I am thinking back to when I wrote this. I think it also > > >> might not like using a dynamic KERN_<LEVEL> either (printk("%s my > > >> message", KERN_INFO)). > > >> > > >> I am going to have to do some more investigation. > > > > > > Alright, I am pretty sure it is safe to do printk("%smessage", > KERN_<LEVEL>); > > > > > > Looking at the printk implementation, it appears to do the format > > > before it checks the log level: > > > > > > > https://elixir.bootlin.com/linux/v5.2.10/source/kernel/printk/printk.c#L1907 > > > > > > So I am pretty sure we can do it either with the vprintk_emit or with > printk. > > > > Let me see if we are on the same page first. I am asking if you can > > just include printk.h for vprintk_emit() define for both CONFIG_PRINTK > > and !CONFIG_PRINTK cases. > > Ah sorry, I misunderstood you. > > No, that doesn't work. I tried including linux/printk.h, and I get the > same error. > > The reason for this is that vprintk_emit() is only defined when > CONFIG_PRINTK=y: > > https://elixir.bootlin.com/linux/latest/ident/vprintk_emit Ugh. That's just a bug in include/linux/printk.h There should be a stub definition for vprintk_emit() in the #else part of #ifdef CONFIG_PRINTK. You shouldn't be dealing with whether printk is present or not in the kunit code. All the printk-related routines are supposed to evaporate themselves, based on the conditional in include/linux/printk.h That should be fixed there instead of in your code. Let me know if you'd like me to submit a patch for that. I only hesitate because your patch depends on it, and IMHO it makes more sense to include it in your batch than separately. Otherwise there's a patch race condition. -- Tim ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 22:37 ` Tim.Bird @ 2019-08-27 22:51 ` Brendan Higgins 0 siblings, 0 replies; 16+ messages in thread From: Brendan Higgins @ 2019-08-27 22:51 UTC (permalink / raw) To: Bird, Timothy Cc: shuah, kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Stephen Boyd, Randy Dunlap, sfr On Tue, Aug 27, 2019 at 3:38 PM <Tim.Bird@sony.com> wrote: > > > > > -----Original Message----- > > From: Brendan Higgins > > > > On Tue, Aug 27, 2019 at 3:00 PM shuah <shuah@kernel.org> wrote: > > > > > > On 8/27/19 3:36 PM, Brendan Higgins wrote: > > > > On Tue, Aug 27, 2019 at 2:09 PM Brendan Higgins > > > > <brendanhiggins@google.com> wrote: > > > >> > > > >> On Tue, Aug 27, 2019 at 2:03 PM Brendan Higgins > > > >> <brendanhiggins@google.com> wrote: > > > >>> > > > >>> On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: > > > >>>> > > > >>>> On 8/27/19 11:49 AM, Brendan Higgins wrote: > > > >>>>> Previously KUnit assumed that printk would always be present, > > which is > > > >>>>> not a valid assumption to make. Fix that by ifdefing out functions > > which > > > >>>>> directly depend on printk core functions similar to what dev_printk > > > >>>>> does. > > > >>>>> > > > >>>>> Reported-by: Randy Dunlap <rdunlap@infradead.org> > > > >>>>> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97- > > 715a-fabe016259df@kernel.org/T/#t > > > >>>>> Cc: Stephen Rothwell <sfr@canb.auug.org.au> > > > >>>>> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > > > >>>>> --- > > > >>>>> include/kunit/test.h | 7 +++++++ > > > >>>>> kunit/test.c | 41 ++++++++++++++++++++++++----------------- > > > >>>>> 2 files changed, 31 insertions(+), 17 deletions(-) > > > >>>>> > > > >>>>> diff --git a/include/kunit/test.h b/include/kunit/test.h > > > >>>>> index 8b7eb03d4971..339af5f95c4a 100644 > > > >>>>> --- a/include/kunit/test.h > > > >>>>> +++ b/include/kunit/test.h > > > >>>>> @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit > > *test, size_t size, gfp_t gfp) > > > >>> [...] > > > >>>> Okay after reviewing this, I am not sure why you need to do all > > > >>>> this. > > > >>>> > > > >>>> Why can't you just change the root function that throws the warn: > > > >>>> > > > >>>> static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > > > >>>> { > > > >>>> return vprintk_emit(0, level, NULL, 0, fmt, args); > > > >>>> } > > > >>>> > > > >>>> You aren'r really doing anything extra here, other than calling > > > >>>> vprintk_emit() > > > >>> > > > >>> Yeah, I did that a while ago. I think it was a combination of trying > > > >>> to avoid an extra layer of adding and then removing the log level, and > > > >>> that's what dev_printk and friends did. > > > >>> > > > >>> But I think you are probably right. It's a lot of maintenance overhead > > > >>> to get rid of that. Probably best to just use what the printk people > > > >>> have. > > > >>> > > > >>>> Unless I am missing something, can't you solve this problem by > > including > > > >>>> printk.h and let it handle the !CONFIG_PRINTK case? > > > >>> > > > >>> Randy, I hope you don't mind, but I am going to ask you to re-ack my > > > >>> next revision since it basically addresses the problem in a totally > > > >>> different way. > > > >> > > > >> Actually, scratch that. Checkpatch doesn't like me calling printk > > > >> without using a KERN_<LEVEL>. > > > >> > > > >> Now that I am thinking back to when I wrote this. I think it also > > > >> might not like using a dynamic KERN_<LEVEL> either (printk("%s my > > > >> message", KERN_INFO)). > > > >> > > > >> I am going to have to do some more investigation. > > > > > > > > Alright, I am pretty sure it is safe to do printk("%smessage", > > KERN_<LEVEL>); > > > > > > > > Looking at the printk implementation, it appears to do the format > > > > before it checks the log level: > > > > > > > > > > https://elixir.bootlin.com/linux/v5.2.10/source/kernel/printk/printk.c#L1907 > > > > > > > > So I am pretty sure we can do it either with the vprintk_emit or with > > printk. > > > > > > Let me see if we are on the same page first. I am asking if you can > > > just include printk.h for vprintk_emit() define for both CONFIG_PRINTK > > > and !CONFIG_PRINTK cases. > > > > Ah sorry, I misunderstood you. > > > > No, that doesn't work. I tried including linux/printk.h, and I get the > > same error. > > > > The reason for this is that vprintk_emit() is only defined when > > CONFIG_PRINTK=y: > > > > https://elixir.bootlin.com/linux/latest/ident/vprintk_emit > > Ugh. That's just a bug in include/linux/printk.h > > There should be a stub definition for vprintk_emit() in the #else part > of #ifdef CONFIG_PRINTK. > > You shouldn't be dealing with whether printk is present or not > in the kunit code. All the printk-related routines are supposed > to evaporate themselves, based on the conditional in > include/linux/printk.h > > That should be fixed there instead of in your code. Alright. That makes sense. I will submit a patch to fix it. Sorry for not suggesting that, I just assumed that it was my mistake in how I was using printk. > Let me know if you'd like me to submit a patch for that. I only hesitate > because your patch depends on it, and IMHO it makes more sense to > include it in your batch than separately. Otherwise there's a patch race > condition. Thanks for clearing up the confusion! ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 22:16 ` Brendan Higgins 2019-08-27 22:37 ` Tim.Bird @ 2019-08-27 22:55 ` shuah 2019-08-27 23:11 ` Brendan Higgins 1 sibling, 1 reply; 16+ messages in thread From: shuah @ 2019-08-27 22:55 UTC (permalink / raw) To: Brendan Higgins Cc: kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Stephen Boyd, Randy Dunlap, Stephen Rothwell, shuah On 8/27/19 4:16 PM, Brendan Higgins wrote: > On Tue, Aug 27, 2019 at 3:00 PM shuah <shuah@kernel.org> wrote: >> >> On 8/27/19 3:36 PM, Brendan Higgins wrote: >>> On Tue, Aug 27, 2019 at 2:09 PM Brendan Higgins >>> <brendanhiggins@google.com> wrote: >>>> >>>> On Tue, Aug 27, 2019 at 2:03 PM Brendan Higgins >>>> <brendanhiggins@google.com> wrote: >>>>> >>>>> On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: >>>>>> >>>>>> On 8/27/19 11:49 AM, Brendan Higgins wrote: >>>>>>> Previously KUnit assumed that printk would always be present, which is >>>>>>> not a valid assumption to make. Fix that by ifdefing out functions which >>>>>>> directly depend on printk core functions similar to what dev_printk >>>>>>> does. >>>>>>> >>>>>>> Reported-by: Randy Dunlap <rdunlap@infradead.org> >>>>>>> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t >>>>>>> Cc: Stephen Rothwell <sfr@canb.auug.org.au> >>>>>>> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> >>>>>>> --- >>>>>>> include/kunit/test.h | 7 +++++++ >>>>>>> kunit/test.c | 41 ++++++++++++++++++++++++----------------- >>>>>>> 2 files changed, 31 insertions(+), 17 deletions(-) >>>>>>> >>>>>>> diff --git a/include/kunit/test.h b/include/kunit/test.h >>>>>>> index 8b7eb03d4971..339af5f95c4a 100644 >>>>>>> --- a/include/kunit/test.h >>>>>>> +++ b/include/kunit/test.h >>>>>>> @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) >>>>> [...] >>>>>> Okay after reviewing this, I am not sure why you need to do all >>>>>> this. >>>>>> >>>>>> Why can't you just change the root function that throws the warn: >>>>>> >>>>>> static int kunit_vprintk_emit(int level, const char *fmt, va_list args) >>>>>> { >>>>>> return vprintk_emit(0, level, NULL, 0, fmt, args); >>>>>> } >>>>>> >>>>>> You aren'r really doing anything extra here, other than calling >>>>>> vprintk_emit() >>>>> >>>>> Yeah, I did that a while ago. I think it was a combination of trying >>>>> to avoid an extra layer of adding and then removing the log level, and >>>>> that's what dev_printk and friends did. >>>>> >>>>> But I think you are probably right. It's a lot of maintenance overhead >>>>> to get rid of that. Probably best to just use what the printk people >>>>> have. >>>>> >>>>>> Unless I am missing something, can't you solve this problem by including >>>>>> printk.h and let it handle the !CONFIG_PRINTK case? >>>>> >>>>> Randy, I hope you don't mind, but I am going to ask you to re-ack my >>>>> next revision since it basically addresses the problem in a totally >>>>> different way. >>>> >>>> Actually, scratch that. Checkpatch doesn't like me calling printk >>>> without using a KERN_<LEVEL>. >>>> >>>> Now that I am thinking back to when I wrote this. I think it also >>>> might not like using a dynamic KERN_<LEVEL> either (printk("%s my >>>> message", KERN_INFO)). >>>> >>>> I am going to have to do some more investigation. >>> >>> Alright, I am pretty sure it is safe to do printk("%smessage", KERN_<LEVEL>); >>> >>> Looking at the printk implementation, it appears to do the format >>> before it checks the log level: >>> >>> https://elixir.bootlin.com/linux/v5.2.10/source/kernel/printk/printk.c#L1907 >>> >>> So I am pretty sure we can do it either with the vprintk_emit or with printk. >> >> Let me see if we are on the same page first. I am asking if you can >> just include printk.h for vprintk_emit() define for both CONFIG_PRINTK >> and !CONFIG_PRINTK cases. > > Ah sorry, I misunderstood you. > > No, that doesn't work. I tried including linux/printk.h, and I get the > same error. > > The reason for this is that vprintk_emit() is only defined when CONFIG_PRINTK=y: > This is the real problem here. printk.h defines several for !CONFIG_PRINTK case. > https://elixir.bootlin.com/linux/latest/ident/vprintk_emit > >> I am not asking you to use printk() in place of vprintk_emit(). >> It is perfectly fine to use vprintk_emit() > > Okay, cool. > >>> >>> So it appears that we have to weigh the following trade-offs: >>> >>> Using vprintk_emit: >>> >>> Pros: >>> - That's what dev_printk uses. >> >> Not sure what you mean by this. I am suggesting if you can just >> call vprintk_emit() and include printk.h and not have to ifdef >> around all the other callers of kunit_vprintk_emit() > > Oh, I was just saying that I heavily based my implementation of > kunit_printk on dev_printk. So I have a high degree of confidence that > it is okay to use it the way that I am using it. > >> Yes. There is the other issue of why do you need the complexity >> of having kunit_vprintk_emit() at all. > > Right, and the problem with the alternative, is there is no good > kernel API for logging with the log level set dynamically. printk > prefers to have it as a string prefix on the format string, but I > cannot do that because I need to add my own prefix to the format > string. > > So, I guess I should just go ahead and address the earlier comments on > this patch? > So what does your code do in the case of !CONFIG_PRINTK. From my read of it, it returns 0 from kunit_printk_emit(0 from my read of it. What I am saying is this is a lot of indirection instead of fixing the leaf function which is kunit_vprintk_emit(). +#else /* CONFIG_PRINTK */ +static inline int kunit_printk_emit(int level, const char *fmt, ...) +{ + return 0; +} +#endif /* CONFIG_PRINTK */ Does the following work? #if defined CONFIG_PRINTK static int kunit_vprintk_emit(int level, const char *fmt, va_list args) { return vprintk_emit(0, level, NULL, 0, fmt, args); } #else static int kunit_vprintk_emit(int level, const char *fmt, va_list args) { return 0; } #endif I think the real problem is in the printk.h with its missing define for vprintk_emit() for !CONFIG_PRINTK case. There seem to only one call for this in drivers/base/core.c in CONFIG_PRINTK path. Unless I am totally missing some context for why there is no stub for vprintk_emit() for !CONFIG_PRINTK case thanks, -- Shuah ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 22:55 ` shuah @ 2019-08-27 23:11 ` Brendan Higgins 0 siblings, 0 replies; 16+ messages in thread From: Brendan Higgins @ 2019-08-27 23:11 UTC (permalink / raw) To: shuah Cc: kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Stephen Boyd, Randy Dunlap, Stephen Rothwell On Tue, Aug 27, 2019 at 3:55 PM shuah <shuah@kernel.org> wrote: > > On 8/27/19 4:16 PM, Brendan Higgins wrote: > > On Tue, Aug 27, 2019 at 3:00 PM shuah <shuah@kernel.org> wrote: > >> > >> On 8/27/19 3:36 PM, Brendan Higgins wrote: > >>> On Tue, Aug 27, 2019 at 2:09 PM Brendan Higgins > >>> <brendanhiggins@google.com> wrote: > >>>> > >>>> On Tue, Aug 27, 2019 at 2:03 PM Brendan Higgins > >>>> <brendanhiggins@google.com> wrote: > >>>>> > >>>>> On Tue, Aug 27, 2019 at 1:21 PM shuah <shuah@kernel.org> wrote: > >>>>>> > >>>>>> On 8/27/19 11:49 AM, Brendan Higgins wrote: > >>>>>>> Previously KUnit assumed that printk would always be present, which is > >>>>>>> not a valid assumption to make. Fix that by ifdefing out functions which > >>>>>>> directly depend on printk core functions similar to what dev_printk > >>>>>>> does. > >>>>>>> > >>>>>>> Reported-by: Randy Dunlap <rdunlap@infradead.org> > >>>>>>> Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > >>>>>>> Cc: Stephen Rothwell <sfr@canb.auug.org.au> > >>>>>>> Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > >>>>>>> --- > >>>>>>> include/kunit/test.h | 7 +++++++ > >>>>>>> kunit/test.c | 41 ++++++++++++++++++++++++----------------- > >>>>>>> 2 files changed, 31 insertions(+), 17 deletions(-) > >>>>>>> > >>>>>>> diff --git a/include/kunit/test.h b/include/kunit/test.h > >>>>>>> index 8b7eb03d4971..339af5f95c4a 100644 > >>>>>>> --- a/include/kunit/test.h > >>>>>>> +++ b/include/kunit/test.h > >>>>>>> @@ -339,9 +339,16 @@ static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) > >>>>> [...] > >>>>>> Okay after reviewing this, I am not sure why you need to do all > >>>>>> this. > >>>>>> > >>>>>> Why can't you just change the root function that throws the warn: > >>>>>> > >>>>>> static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > >>>>>> { > >>>>>> return vprintk_emit(0, level, NULL, 0, fmt, args); > >>>>>> } > >>>>>> > >>>>>> You aren'r really doing anything extra here, other than calling > >>>>>> vprintk_emit() > >>>>> > >>>>> Yeah, I did that a while ago. I think it was a combination of trying > >>>>> to avoid an extra layer of adding and then removing the log level, and > >>>>> that's what dev_printk and friends did. > >>>>> > >>>>> But I think you are probably right. It's a lot of maintenance overhead > >>>>> to get rid of that. Probably best to just use what the printk people > >>>>> have. > >>>>> > >>>>>> Unless I am missing something, can't you solve this problem by including > >>>>>> printk.h and let it handle the !CONFIG_PRINTK case? > >>>>> > >>>>> Randy, I hope you don't mind, but I am going to ask you to re-ack my > >>>>> next revision since it basically addresses the problem in a totally > >>>>> different way. > >>>> > >>>> Actually, scratch that. Checkpatch doesn't like me calling printk > >>>> without using a KERN_<LEVEL>. > >>>> > >>>> Now that I am thinking back to when I wrote this. I think it also > >>>> might not like using a dynamic KERN_<LEVEL> either (printk("%s my > >>>> message", KERN_INFO)). > >>>> > >>>> I am going to have to do some more investigation. > >>> > >>> Alright, I am pretty sure it is safe to do printk("%smessage", KERN_<LEVEL>); > >>> > >>> Looking at the printk implementation, it appears to do the format > >>> before it checks the log level: > >>> > >>> https://elixir.bootlin.com/linux/v5.2.10/source/kernel/printk/printk.c#L1907 > >>> > >>> So I am pretty sure we can do it either with the vprintk_emit or with printk. > >> > >> Let me see if we are on the same page first. I am asking if you can > >> just include printk.h for vprintk_emit() define for both CONFIG_PRINTK > >> and !CONFIG_PRINTK cases. > > > > Ah sorry, I misunderstood you. > > > > No, that doesn't work. I tried including linux/printk.h, and I get the > > same error. > > > > The reason for this is that vprintk_emit() is only defined when CONFIG_PRINTK=y: > > > > This is the real problem here. printk.h defines several for > !CONFIG_PRINTK case. Yeah, Tim pointed that out. I think both of you are right, I should be filing my fix against them. > > https://elixir.bootlin.com/linux/latest/ident/vprintk_emit > > > >> I am not asking you to use printk() in place of vprintk_emit(). > >> It is perfectly fine to use vprintk_emit() > > > > Okay, cool. > > > >>> > >>> So it appears that we have to weigh the following trade-offs: > >>> > >>> Using vprintk_emit: > >>> > >>> Pros: > >>> - That's what dev_printk uses. > >> > >> Not sure what you mean by this. I am suggesting if you can just > >> call vprintk_emit() and include printk.h and not have to ifdef > >> around all the other callers of kunit_vprintk_emit() > > > > Oh, I was just saying that I heavily based my implementation of > > kunit_printk on dev_printk. So I have a high degree of confidence that > > it is okay to use it the way that I am using it. > > > >> Yes. There is the other issue of why do you need the complexity > >> of having kunit_vprintk_emit() at all. > > > > Right, and the problem with the alternative, is there is no good > > kernel API for logging with the log level set dynamically. printk > > prefers to have it as a string prefix on the format string, but I > > cannot do that because I need to add my own prefix to the format > > string. > > > > So, I guess I should just go ahead and address the earlier comments on > > this patch? > > > > So what does your code do in the case of !CONFIG_PRINTK. From my read of > it, it returns 0 from kunit_printk_emit(0 from my read of it. What I am > saying is this is a lot of indirection instead of fixing the leaf > function which is kunit_vprintk_emit(). Agreed. My apologies, as I mentioned in response to Tim, I just assumed I was using it wrong. > +#else /* CONFIG_PRINTK */ > +static inline int kunit_printk_emit(int level, const char *fmt, ...) > +{ > + return 0; > +} > +#endif /* CONFIG_PRINTK */ > > Does the following work? > > #if defined CONFIG_PRINTK > static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > { > return vprintk_emit(0, level, NULL, 0, fmt, args); > } > #else > static int kunit_vprintk_emit(int level, const char *fmt, va_list args) > { > return 0; > } > #endif > > I think the real problem is in the printk.h with its missing define for > vprintk_emit() for !CONFIG_PRINTK case. There seem to only one call for > this in drivers/base/core.c in CONFIG_PRINTK path. Unless I am totally > missing some context for why there is no stub for vprintk_emit() for > !CONFIG_PRINTK case Agreed. Sorry again for the confusion. Thanks! ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 17:49 [PATCH v1] kunit: fix failure to build without printk Brendan Higgins 2019-08-27 18:58 ` Randy Dunlap 2019-08-27 20:21 ` shuah @ 2019-08-27 21:46 ` Stephen Boyd 2019-08-27 21:51 ` Brendan Higgins 2 siblings, 1 reply; 16+ messages in thread From: Stephen Boyd @ 2019-08-27 21:46 UTC (permalink / raw) To: Brendan Higgins, shuah Cc: kunit-dev, linux-kernel, linux-kselftest, frowand.list, Brendan Higgins, Randy Dunlap, Stephen Rothwell Quoting Brendan Higgins (2019-08-27 10:49:32) > Previously KUnit assumed that printk would always be present, which is > not a valid assumption to make. Fix that by ifdefing out functions which > directly depend on printk core functions similar to what dev_printk > does. > > Reported-by: Randy Dunlap <rdunlap@infradead.org> > Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > Cc: Stephen Rothwell <sfr@canb.auug.org.au> > Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > --- Does kunit itself have any meaning if printk doesn't work? Why not just depend on CONFIG_PRINTK for now? ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v1] kunit: fix failure to build without printk 2019-08-27 21:46 ` Stephen Boyd @ 2019-08-27 21:51 ` Brendan Higgins 0 siblings, 0 replies; 16+ messages in thread From: Brendan Higgins @ 2019-08-27 21:51 UTC (permalink / raw) To: Stephen Boyd Cc: shuah, kunit-dev, Linux Kernel Mailing List, open list:KERNEL SELFTEST FRAMEWORK, Frank Rowand, Randy Dunlap, Stephen Rothwell On Tue, Aug 27, 2019 at 2:46 PM Stephen Boyd <sboyd@kernel.org> wrote: > > Quoting Brendan Higgins (2019-08-27 10:49:32) > > Previously KUnit assumed that printk would always be present, which is > > not a valid assumption to make. Fix that by ifdefing out functions which > > directly depend on printk core functions similar to what dev_printk > > does. > > > > Reported-by: Randy Dunlap <rdunlap@infradead.org> > > Link: https://lore.kernel.org/linux-kselftest/0352fae9-564f-4a97-715a-fabe016259df@kernel.org/T/#t > > Cc: Stephen Rothwell <sfr@canb.auug.org.au> > > Signed-off-by: Brendan Higgins <brendanhiggins@google.com> > > --- > > Does kunit itself have any meaning if printk doesn't work? Why not just > depend on CONFIG_PRINTK for now? I was thinking about that, but I figured it is probably easier in the long run to make sure it always works without printk. It also just seemed like the right thing to do, but I suppose that's not a very good reason. I am fine with any of the three options: depend on CONFIG_PRINTK - as suggested by Stephen, just use printk - as suggested by Shuah, or continue to use vprintk_emit as I have been doing. However, my preference is the vprintk_emit option. Anyone have any strong opinions on the matter? ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2019-08-27 23:11 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-08-27 17:49 [PATCH v1] kunit: fix failure to build without printk Brendan Higgins 2019-08-27 18:58 ` Randy Dunlap 2019-08-27 20:21 ` shuah 2019-08-27 20:53 ` Randy Dunlap 2019-08-27 21:16 ` shuah 2019-08-27 21:03 ` Brendan Higgins 2019-08-27 21:09 ` Brendan Higgins 2019-08-27 21:36 ` Brendan Higgins 2019-08-27 22:00 ` shuah 2019-08-27 22:16 ` Brendan Higgins 2019-08-27 22:37 ` Tim.Bird 2019-08-27 22:51 ` Brendan Higgins 2019-08-27 22:55 ` shuah 2019-08-27 23:11 ` Brendan Higgins 2019-08-27 21:46 ` Stephen Boyd 2019-08-27 21:51 ` Brendan Higgins
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).