Il 29 luglio 2026 18:17:31 UTC, Wen Yang <[email protected]> ha scritto:
>> +#define rv_get_current() (unlikely(kunit_get_current_test()) ?
>> rv_get_mock_current() : current)
...
>> +/*
>> + * rv_get_mock_current() is called only if we are running from a KUnit test.
>> + * This can occur from a legitimate RV test or any unrelated test running
>> when
>> + * a real RV monitor is active and triggering events.
>> + * We assume the former case is the only one where mock_current is not NULL
>> and
>> + * can occur only sequentially (KUnit doesn't run tests in parallel).
>> + * We cannot rely on the test's context because there is no way to safely
>> + * understand from which test we are running and KUnit utilities require
>> + * locking, which is unsafe from NMI or scheduling context.
>> + * Note that it is not possible for a real RV monitor to run when the RV
>> KUnit
>> + * tests are running (see rv_set_testing()).
>> + */
>> +static struct task_struct *mock_current;
>> +
>> +void rv_mock_current(struct task_struct *tsk)
>> +{
>> + mock_current = tsk;
>> +}
>> +EXPORT_SYMBOL_IF_KUNIT(rv_mock_current);
>> +
>> +struct task_struct *rv_get_mock_current(void)
>> +{
>> + return mock_current ?: current;
>> +}
>> +EXPORT_SYMBOL_GPL(rv_get_mock_current);
>> #endif
>
>rv_mock_current() uses EXPORT_SYMBOL_IF_KUNIT, but rv_get_mock_current() uses
>EXPORT_SYMBOL_GPL. Both are defined inside the same
>CONFIG_RV_MONITORS_KUNIT_TEST block, so rv_get_mock_current should use
>EXPORT_SYMBOL_IF_KUNIT as well, otherwise it leaks a test-only symbol into
>production builds.
>
>With that fixed:
>Reviewed-by: Wen Yang <[email protected]>
Thanks for the review.
This was intentional however: rv_get_current() can be called by any monitor,
those don't have to be KUnit.
Since rv_get_current() is a macro also calling rv_get_mock_current() we need to
be able to link that too.
The idea is that a "real" (non-kunit) monitor handler could be run when
interrupting a KUnit test (not an RV one, we make sure of that). In that case
we do call rv_get_mock_current() and return current after the function call.
rv_mock_current() CANNOT be called outside of the RV KUnit test cases, it uses
a global variable (for problems I tried to explain in the comment), so should
be exported only to KUnit and called directly from the test case.
Does it make sense to you?
Thanks,
Gabriele