On Tue, Jun 30, 2020 at 7:52 AM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote: > > On 6/30/20 8:15 AM, Andrii Nakryiko wrote: > > BPF ringbuf assumes the size to be a multiple of page size and the power of > > 2 value. The latter is important to avoid division while calculating position > > inside the ring buffer and using (N-1) mask instead. This patch fixes omission > > to enforce power-of-2 size rule. > > > > Fixes: 457f44363a88 ("bpf: Implement BPF ring buffer and verifier support for it") > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> > > Lgtm, applied, thanks! > Thanks, Daniel! > [...] > > @@ -166,9 +157,16 @@ static struct bpf_map *ringbuf_map_alloc(union bpf_attr *attr) > > return ERR_PTR(-EINVAL); > > > > if (attr->key_size || attr->value_size || > > - attr->max_entries == 0 || !PAGE_ALIGNED(attr->max_entries)) > > + !is_power_of_2(attr->max_entries) || > > + !PAGE_ALIGNED(attr->max_entries)) > > Technically !IS_ALIGNED(attr->max_entries, PAGE_SIZE) might have been a bit cleaner > since PAGE_ALIGNED() is only intended for pointers, though, not wrong here given > max_entries is u32. I've found a bunch of uses on non-pointers, e.g., `if (!PAGE_ALIGNED(fs_info->nodesize)) {` in BTRFS code, so assumed it's intended to be used more generically. But let me know if you want me to do IS_ALIGNED change. > > Thanks, > Daniel