Jesper Dangaard Brouer <bro...@redhat.com> writes: > On Mon, 22 Jul 2019 13:52:48 +0200 > Toke Høiland-Jørgensen <t...@redhat.com> wrote: > >> +static inline struct hlist_head *dev_map_index_hash(struct bpf_dtab *dtab, >> + int idx) >> +{ >> + return &dtab->dev_index_head[idx & (NETDEV_HASHENTRIES - 1)]; >> +} > > It is good for performance that our "hash" function is simply an AND > operation on the idx. We want to keep it this way. > > I don't like that you are using NETDEV_HASHENTRIES, because the BPF map > infrastructure already have a way to specify the map size (struct > bpf_map_def .max_entries). BUT for performance reasons, to keep the > AND operation, we would need to round up the hash-array size to nearest > power of 2 (or reject if user didn't specify a power of 2, if we want > to "expose" this limit to users).
But do we really want the number of hash buckets to be equal to the max number of entries? The values are not likely to be evenly distributed, so we'll end up with big buckets if the number is small, meaning we'll blow performance on walking long lists in each bucket. Also, if the size is dynamic the size needs to be loaded from memory instead of being a compile-time constant, which will presumably hurt performance (though not sure by how much)? -Toke