BpfMap.h: add consume()

switch some iterate to forAll()/consume()

Currently we only use:
    BPF_MAP_LOOKUP_ELEM
    BPF_MAP_UPDATE_ELEM
    BPF_MAP_DELETE_ELEM
    BPF_MAP_GET_NEXT_KEY

Our implementation does:
  getFirstKey() -> BPF_MAP_GET_NEXT_KEY (with empty key, maybe newer kernels would accept null too)
  getNextKey(K) -> BPF_MAP_GET_NEXT_KEY
  readValue(K) -> BPF_MAP_LOOKUP_ELEM
  iterate(f(K)) -> getFirstKey(), loop { getNextKey(K) }
  forAll(f(K)) -> iterate(f(K))
  iterate(f(K, V)) -> getFirstKey(), loop { getNextKey(K) readValue(K) }
  forAll(f(K, V)) -> iterate(f(K, V))
  isEmpty() -> getFirstKey()
  writeValue(K, V) -> BPF_MAP_UPDATE_ELEM
  deleteValue(K) -> BPF_MAP_DELETE_ELEM
  clear() -> loop { getFirstKey() deleteValue(K) }
  consume(f(K, V)) -> iterate(f(K, V) + deleteValue(K))

but bpf on newer kernels also supports:
    BPF_MAP_LOOKUP_AND_DELETE_ELEM
and batch operations:
    BPF_MAP_LOOKUP_BATCH
    BPF_MAP_LOOKUP_AND_DELETE_BATCH
    BPF_MAP_UPDATE_BATCH
    BPF_MAP_DELETE_BATCH
that we don't currently use.

These can be utilized to lower the number of system calls:
- iterate(f(K, V)) might be able to use LOOPUP_BATCH(1)
- forAll() can probably use LOOKUP_BATCH(many)
- consume() can probably use one of LOOKUP_AND_DELETE_ELEM or LOOKUP_AND_DELETE_BATCH

UPDATE_BATCH seems like it could also be useful, though harder
to see how to make it useful from a clean API perspective...

(and obviously for bpf map ARRAYs [and thus bitmaps], mmap() is simply much better...)

Test: TreeHugger
Flag: EXEMPT mainline
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I2c142319c365aa1b9585256e2c604b221ba18c21
2 files changed