[DTrace-devel] [PATCH] bpf: ensure speculations drops are reported when needed

Eugene Loh eugene.loh at oracle.com
Tue May 30 20:33:07 UTC 2023


Anyhow, while I don't understand what the compiler used to be doing with 
the code, this patch seems correct.  So:

Reviewed-by: Eugene Loh <eugene.loh at oracle.com>

although again a goto rather than break (as mentioned below) might be good.

On 5/30/23 16:07, Eugene Loh wrote:
> So simple, but I'm puzzled.  Yes, the old code was wrong, but wasn't 
> it unambiguously wrong, regardless of any (legal) compiler 
> optimization?  That is, if a D script emitted a bunch of 
> "speculation()" calls, it would use up all nspec speculations. The 
> next speculation() would march through the SEARCH() until it exceeded 
> NSPEC, and then it would return 0, without registering SPEC_UNAVAIL.  
> I don't see how "lucky" compiler optimization would "help" get around 
> this problem.  I guess I'm missing something.
>
> Also, instead of a "break", how about a goto to the return statement 
> to shave off the subsequent, fruitless searches.  Not a big deal, but 
> maybe cleaner, both for code execution and for reading/understanding 
> the code.
>
> On 5/30/23 14:25, Kris Van Hees via DTrace-devel wrote:
>> The unrolled loop in dt_speculation() would return without recording
>> a speculation drop if an iteration was attempted beyond the configured
>> NSPEC value.  Depending on how the compiler optimized the code, that
>> could lead to an early return from the function without ever calling
>> dt_no_spec().
>>
>> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
>> ---
>>   bpf/speculation.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/bpf/speculation.c b/bpf/speculation.c
>> index 82d09e1a..7f4ebd34 100644
>> --- a/bpf/speculation.c
>> +++ b/bpf/speculation.c
>> @@ -54,7 +54,7 @@ noinline uint32_t dt_speculation(void)
>>   #define SEARCH(n)                            \
>>       do {                                \
>>           if (n > (uint64_t) &NSPEC)                \
>> -            return 0;                    \
>> +            break;                        \
>>           id = (n);                        \
>>           if (bpf_map_update_elem(&specs, &id, &zero,        \
>>               BPF_NOEXIST) == 0)                \



More information about the DTrace-devel mailing list