On 1/31/23 1:00 PM, Dave Marchevsky wrote: > This patch eliminates extra bpf_reg_state memory usage added due to > previous patch keeping a copy of lock identity in reg state for > non-owning refs. > > Instead of copying lock identity around, this patch changes > non_owning_ref_lock field to be a bool, taking advantage of the > following: > > * There can currently only be one active lock at a time > * non-owning refs are only valid in the critical section > > So if a verifier_state has an active_lock, any non-owning ref must've > been obtained under that lock, and any non-owning ref not obtained under > that lock must have been invalidated previously. Therefore if a > non-owning ref is associated with a lock, it's the active_lock of the > current state. So we can keep a bool "are we associated with active_lock > of current state" instead of copying lock identity around. > > Signed-off-by: Dave Marchevsky <davemarchevsky@xxxxxx> > --- > include/linux/bpf_verifier.h | 2 +- > kernel/bpf/verifier.c | 20 ++++++++++---------- > 2 files changed, 11 insertions(+), 11 deletions(-) > > diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h > index 1c6bbde40705..baeb5afb0b81 100644 > --- a/include/linux/bpf_verifier.h > +++ b/include/linux/bpf_verifier.h > @@ -84,7 +84,7 @@ struct bpf_reg_state { > struct { > struct btf *btf; > u32 btf_id; > - struct bpf_active_lock non_owning_ref_lock; > + bool non_owning_ref_lock; > }; > > u32 mem_size; /* for PTR_TO_MEM | PTR_TO_MEM_OR_NULL */ Pahole output after this change: union { int range; /* 8 4 */ struct { struct bpf_map * map_ptr; /* 8 8 */ u32 map_uid; /* 16 4 */ }; /* 8 16 */ struct { struct btf * btf; /* 8 8 */ u32 btf_id; /* 16 4 */ bool non_owning_ref_lock; /* 20 1 */ }; /* 8 16 */ u32 mem_size; /* 8 4 */ struct { enum bpf_dynptr_type type; /* 8 4 */ bool first_slot; /* 12 1 */ } dynptr; /* 8 8 */ struct { long unsigned int raw1; /* 8 8 */ long unsigned int raw2; /* 16 8 */ } raw; /* 8 16 */ u32 subprogno; /* 8 4 */ }; /* 8 16 */ The PTR_TO_BTF_ID union entry was taking 24 bytes in previous commit, now it's down to 16, so back to same size as before previous commit.