|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] xen/nospec: Allow evaluate_nospec() to short circuit constant expressions
On 04.03.2024 17:10, Andrew Cooper wrote:
> --- a/xen/include/xen/nospec.h
> +++ b/xen/include/xen/nospec.h
> @@ -18,6 +18,15 @@ static always_inline bool evaluate_nospec(bool cond)
> #ifndef arch_evaluate_nospec
> #define arch_evaluate_nospec(cond) cond
> #endif
> +
> + /*
> + * If the compiler can reduce the condition to a constant, then it won't
> + * be emitting a conditional branch, and there's nothing needing
> + * protecting.
> + */
> + if ( __builtin_constant_p(cond) )
> + return cond;
> +
> return arch_evaluate_nospec(cond);
> }
While for now, even after having some hours for considering, I can't point
out anything concrete that could potentially become a problem here, I
still have the gut feeling that this would better be left in the arch
logic. (There's the oddity of what the function actually expands to if the
#define in context actually takes effect, but that's merely cosmetic.)
The one thing I'm firmly unhappy with is "won't" in the comment: We can't
know what the compiler will do. I've certainly known of compilers which
didn't as you indicate here. That was nothing remotely recent, but
ancient DOS/Windows ones. Still, unlike with e.g. __{get,put}_user_bad()
the compiler doing something unexpected would go entirely silently here.
The other (minor) aspect I'm not entirely happy with is that you insert
between the fallback #define and its use. I think (if we need such a
#define in the first place) the two would better stay close together.
As to the need for the #define: To me
static always_inline bool evaluate_nospec(bool cond)
{
#ifdef arch_evaluate_nospec
return arch_evaluate_nospec(cond);
#else
return cond;
#endif
}
or even
static always_inline bool evaluate_nospec(bool cond)
{
#ifdef arch_evaluate_nospec
return arch_evaluate_nospec(cond);
#endif
return cond;
}
reads no worse, but perhaps slightly better, and is then consistent with
block_speculation(). At which point the question about "insertion point"
here would hopefully also disappear, as this addition is meaningful only
ahead of the #else.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |