]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - kernel/bpf/arraymap.c
bpf: Fix and simplifications on inline map lookup
[linux.git] / kernel / bpf / arraymap.c
index bcf9955fac956cc7c92837089aad6526c90aadc6..4d7d5d0ed76a6dd61b36c412c49d46dcf872b5c2 100644 (file)
@@ -117,20 +117,17 @@ static void *array_map_lookup_elem(struct bpf_map *map, void *key)
 /* emit BPF instructions equivalent to C code of array_map_lookup_elem() */
 static u32 array_map_gen_lookup(struct bpf_map *map, struct bpf_insn *insn_buf)
 {
-       struct bpf_array *array = container_of(map, struct bpf_array, map);
        struct bpf_insn *insn = insn_buf;
-       u32 elem_size = array->elem_size;
+       u32 elem_size = round_up(map->value_size, 8);
        const int ret = BPF_REG_0;
        const int map_ptr = BPF_REG_1;
        const int index = BPF_REG_2;
 
        *insn++ = BPF_ALU64_IMM(BPF_ADD, map_ptr, offsetof(struct bpf_array, value));
        *insn++ = BPF_LDX_MEM(BPF_W, ret, index, 0);
-       *insn++ = BPF_JMP_IMM(BPF_JGE, ret, array->map.max_entries,
-                             elem_size == 1 ? 2 : 3);
-       if (elem_size == 1) {
-               /* nop */
-       } else if (is_power_of_2(elem_size)) {
+       *insn++ = BPF_JMP_IMM(BPF_JGE, ret, map->max_entries, 3);
+
+       if (is_power_of_2(elem_size)) {
                *insn++ = BPF_ALU64_IMM(BPF_LSH, ret, ilog2(elem_size));
        } else {
                *insn++ = BPF_ALU64_IMM(BPF_MUL, ret, elem_size);