On 10/6/22 1:36 PM, Jiri Olsa wrote:
On Wed, Oct 05, 2022 at 11:46:34AM +0100, Donald Hunter wrote:
From: Dave Tucker <dave@xxxxxxxxxxxxx>
Add documentation for the BPF_MAP_TYPE_ARRAY including kernel version
introduced, usage and examples. Also document BPF_MAP_TYPE_PERCPU_ARRAY
which is similar.
Signed-off-by: Dave Tucker <dave@xxxxxxxxxxxxx>
Signed-off-by: Donald Hunter <donald.hunter@xxxxxxxxx>
---
Documentation/bpf/map_array.rst | 231 ++++++++++++++++++++++++++++++++
1 file changed, 231 insertions(+)
create mode 100644 Documentation/bpf/map_array.rst
diff --git a/Documentation/bpf/map_array.rst b/Documentation/bpf/map_array.rst
new file mode 100644
index 000000000000..9d2da884c41e
--- /dev/null
+++ b/Documentation/bpf/map_array.rst
@@ -0,0 +1,231 @@
+.. SPDX-License-Identifier: GPL-2.0-only
+.. Copyright (C) 2022 Red Hat, Inc.
+
+================================================
+BPF_MAP_TYPE_ARRAY and BPF_MAP_TYPE_PERCPU_ARRAY
+================================================
+
+.. note::
+ - ``BPF_MAP_TYPE_ARRAY`` was introduced in kernel version 3.19
+ - ``BPF_MAP_TYPE_PERCPU_ARRAY`` was introduced in version 4.6
+
+``BPF_MAP_TYPE_ARRAY`` and ``BPF_MAP_TYPE_PERCPU_ARRAY`` provide generic array
+storage. The key type is an unsigned 32-bit integer (4 bytes) and the map is of
+constant size. All array elements are pre-allocated and zero initialized when
+created. ``BPF_MAP_TYPE_PERCPU_ARRAY`` uses a different memory region for each
+CPU whereas ``BPF_MAP_TYPE_ARRAY`` uses the same memory region. The maximum
+size of an array, defined in max_entries, is limited to 2^32. The value stored
+can be of any size, however, small values will be rounded up to 8 bytes.
I recently hit 32k size limit for per-cpu map value.. it seems to be
size limit for generic per cpu allocation, but would be great to have
it confirmed by somebody who knows mm better ;-)
Yes, for percpu the max is PCPU_MIN_UNIT_SIZE which is 32k, see mm/percpu.c +1756.
In many cases it's implementation specific, so it probably does not make too much
sense to state limits like 2^32, or at least it should say that its theoretical/uapi
limit and actual limits may be implementation/config specific.