Stefano Brivio <sbrivio@xxxxxxxxxx> wrote: > struct nft_pipapo_field { > @@ -439,6 +456,9 @@ struct nft_pipapo_field { > unsigned long rules; > size_t bsize; > int bb; > +#ifdef NFT_PIPAPO_ALIGN > + unsigned long *lt_aligned; > +#endif > unsigned long *lt; > union nft_pipapo_map_bucket *mt; > }; I wonder if these structs can be compressed. AFAICS bsize is in sizes of longs, so when this number is large then we also need to kvmalloc a large blob of memory. I think u32 would be enough? nft_pipapo_field is probably the most relevant one wrt. to size. > struct nft_pipapo_match { > int field_count; > +#ifdef NFT_PIPAPO_ALIGN > + unsigned long * __percpu *scratch_aligned; > +#endif > unsigned long * __percpu *scratch; > size_t bsize_max; Same here (bsize_max -- could fit with hole after field_count)? Also, since you know the size of nft_pipapo_match (including the dynamically allocated array at the end), you could store the original memory (*scratch) and the rcu_head at the end, since they are not needed at lookup time and a little overhead to calculate their storage offset is fine. Not sure its worth it, just an idea.