yonghong-song wrote:

> what veristat says before/after?

I tried with latest bpf-next and latest llvm trunk. The following is the 
difference
with/without this patch:
```
[~/work/bpf-next/tools/testing/selftests/bpf (master)]$ ./veristat *.bpf.o -o 
csv > old.csv
[~/work/bpf-next/tools/testing/selftests/bpf (master)]$ ./veristat *.bpf.o -o 
csv > new.csv
[~/work/bpf-next/tools/testing/selftests/bpf (master)]$ ./veristat -e 
file,prog,insns -C old.csv new.csv -f 'insns_diff!=0'
File                             Program                             Insns (A)  
Insns (B)  Insns  (DIFF)
-------------------------------  ----------------------------------  ---------  
---------  -------------
cgroup_skb_sk_lookup_kern.bpf.o  ingress_lookup                             96  
      106  +10 (+10.42%)
cgroup_tcp_skb.bpf.o             client_egress                              94  
      104  +10 (+10.64%)
cgroup_tcp_skb.bpf.o             client_egress_srv                         115  
      125   +10 (+8.70%)
cgroup_tcp_skb.bpf.o             client_ingress                            115  
      125   +10 (+8.70%)
cgroup_tcp_skb.bpf.o             client_ingress_srv                         94  
      104  +10 (+10.64%)
cgroup_tcp_skb.bpf.o             server_egress                             115  
      125   +10 (+8.70%)
cgroup_tcp_skb.bpf.o             server_egress_srv                          94  
      104  +10 (+10.64%)
cgroup_tcp_skb.bpf.o             server_ingress                            129  
      139   +10 (+7.75%)
cgroup_tcp_skb.bpf.o             server_ingress_srv                        137  
      147   +10 (+7.30%)
verifier_array_access.bpf.o      an_array_with_a_constant_too_small          7  
        9   +2 (+28.57%)
[~/work/bpf-next/tools/testing/selftests/bpf (master)]$
```
For cgroup_tcp_skb.c, e.g.,
```
SEC("cgroup_skb/egress")
int server_egress_srv(struct __sk_buff *skb)
{
        struct tcphdr tcph;

        if (!needed_tcp_pkt(skb, &tcph))
                return 1;
...
```
the tcphdr is larger so it costs more with initializing to 0.
The same for cgroup_skb_sk_lookup_kern.c.

For verifier_array_access.c,
```
SEC("socket")
__description("invalid map access into an array using constant smaller than 
key_size")
__failure __msg("R0 invalid mem access 'map_value_or_null'")
unsigned int an_array_with_a_constant_too_small(void)
{       
        __u32 __attribute__((aligned(8))) key;
        struct test_val *val;

        /* Mark entire key as STACK_MISC */
        bpf_probe_read_user(&key, sizeof(key), NULL);
        ...
}
```
the 'key' is initialized.

> 
> re: selftests
> 
> there should be a flag to disable this, so the tests can remain as-is (with 
> only Makefile change).

Will do.

> 
> There is also -ftrivial-auto-var-init-max-size= flag. What is the default? 
> Looks like: char buf[64]; will be zero inited as well? 

The default is 0 (-ftrivial-auto-var-init-max-size=0) which means there is no 
limitation.
yes, char buf[64] and all buf[64] will be initialized to 0 if the compiler does 
not know whehter any buf[i](i = 0...63) is used or not.

>That will probably hurt performance/verification for cases like: char 
>comm[16]; bpf_get_current_comm(comm, ...) ?
I checked. In almost all cases in bpf selftest progs, comm[16] is a field in a 
map, so it is not impacted.



https://github.com/llvm/llvm-project/pull/125601
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to