Sorry for the delayed reply. I will be on vacation until Wednesday, October 16th. On Wed, Oct 9, 2019 at 9:36 AM Alan Maguire <alan.maguire@xxxxxxxxxx> wrote: > > On Tue, 8 Oct 2019, Brendan Higgins wrote: > > > On Tue, Oct 08, 2019 at 03:55:44PM +0100, Alan Maguire wrote: [...] > > > diff --git a/lib/kunit/string-stream.c b/lib/kunit/string-stream.c > > > index e6d17aa..e4f3a97 100644 > > > --- a/lib/kunit/string-stream.c > > > +++ b/lib/kunit/string-stream.c > > > @@ -100,6 +100,7 @@ int string_stream_vadd(struct string_stream *stream, > > > > > > return 0; > > > } > > > +EXPORT_SYMBOL_GPL(string_stream_vadd); > > > > Is this actually needed by anything other than lib/kunit/test.c right > > now? Maybe we should move the include file into the kunit/ directory to > > hide these so no one else can use them. > > > > I tried this, and it's the right answer I think but it exposes > a problem with symbol visibility when kunit is compiled as a module. > More on this below... > > > > int string_stream_add(struct string_stream *stream, const char *fmt, ...) > > > { > > > @@ -112,6 +113,7 @@ int string_stream_add(struct string_stream *stream, const char *fmt, ...) > > > > > > return result; > > > } > > > +EXPORT_SYMBOL_GPL(string_stream_add); > > [...] > > > diff --git a/lib/kunit/test.c b/lib/kunit/test.c > > > index c83c0fa..e7896f1 100644 > > > --- a/lib/kunit/test.c > > > +++ b/lib/kunit/test.c > > [...] > > > @@ -50,6 +51,7 @@ static unsigned long kunit_test_timeout(void) > > > * For more background on this topic, see: > > > * https://mike-bland.com/2011/11/01/small-medium-large.html > > > */ > > > +#ifndef MODULE > > > > Why is this block of code "ifndef MODULE"? > > > > Symbol visibility is the problem again; sysctl_hung_task_timeout_secs > isn't exported so when kunit is a module it can't find the symbol. > > I think I saw Kees mentioned something about symbol lookup too; in KTF > Knut solved this by defining ktf_find_symbol(). I'd suggest we may need a > kunit_find_symbol() with a function signature I thought we were just talking about exposing symbols for linking outside of a compilation unit (static vs. not static); nevertheless, I think you are right that it is relevant here. Kees, thoughts? > void *kunit_find_symbol(const char *modname, const char *symbol_name); > > ...which does a [module_]kallsyms_lookup_sym(). > > If the above makes sense I can look at adding it as a patch (and adding > a test of it of course!). What do you think? So that won't work if you are trying to link against a symbol not in a module, right? Also, it won't work against a static symbol, right? Even so, I think it is pretty wonky to expect users to either a) export any symbol name to be tested, or b) have to access them via kunit_find_symbol. I think it is fine to have some tests that cannot be compiled as modules, if there is no other user friendly way to make this work in those cases. Thoughts?