@@ -133,12 +133,14 @@ bool bpf_map_write_active(const struct bpf_map *map)
133133 return atomic64_read (& map -> writecnt ) != 0 ;
134134}
135135
136- static u32 bpf_map_value_size (const struct bpf_map * map )
137- {
138- if (map -> map_type == BPF_MAP_TYPE_PERCPU_HASH ||
139- map -> map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH ||
140- map -> map_type == BPF_MAP_TYPE_PERCPU_ARRAY ||
141- map -> map_type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE )
136+ static u32 bpf_map_value_size (const struct bpf_map * map , u64 flags )
137+ {
138+ if (flags & (BPF_F_CPU | BPF_F_ALL_CPUS ))
139+ return round_up (map -> value_size , 8 );
140+ else if (map -> map_type == BPF_MAP_TYPE_PERCPU_HASH ||
141+ map -> map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH ||
142+ map -> map_type == BPF_MAP_TYPE_PERCPU_ARRAY ||
143+ map -> map_type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE )
142144 return round_up (map -> value_size , 8 ) * num_possible_cpus ();
143145 else if (IS_FD_MAP (map ))
144146 return sizeof (u32 );
@@ -1715,15 +1717,15 @@ static int map_lookup_elem(union bpf_attr *attr)
17151717 if (!(map_get_sys_perms (map , f ) & FMODE_CAN_READ ))
17161718 return - EPERM ;
17171719
1718- err = bpf_map_check_op_flags (map , attr -> flags , BPF_F_LOCK );
1720+ err = bpf_map_check_op_flags (map , attr -> flags , BPF_F_LOCK | BPF_F_CPU );
17191721 if (err )
17201722 return err ;
17211723
17221724 key = __bpf_copy_key (ukey , map -> key_size );
17231725 if (IS_ERR (key ))
17241726 return PTR_ERR (key );
17251727
1726- value_size = bpf_map_value_size (map );
1728+ value_size = bpf_map_value_size (map , attr -> flags );
17271729
17281730 err = - ENOMEM ;
17291731 value = kvmalloc (value_size , GFP_USER | __GFP_NOWARN );
@@ -1790,7 +1792,7 @@ static int map_update_elem(union bpf_attr *attr, bpfptr_t uattr)
17901792 goto err_put ;
17911793 }
17921794
1793- value_size = bpf_map_value_size (map );
1795+ value_size = bpf_map_value_size (map , attr -> flags );
17941796 value = kvmemdup_bpfptr (uvalue , value_size );
17951797 if (IS_ERR (value )) {
17961798 err = PTR_ERR (value );
@@ -1986,11 +1988,12 @@ int generic_map_update_batch(struct bpf_map *map, struct file *map_file,
19861988 void * key , * value ;
19871989 int err = 0 ;
19881990
1989- err = bpf_map_check_op_flags (map , attr -> batch .elem_flags , BPF_F_LOCK );
1991+ err = bpf_map_check_op_flags (map , attr -> batch .elem_flags ,
1992+ BPF_F_LOCK | BPF_F_CPU | BPF_F_ALL_CPUS );
19901993 if (err )
19911994 return err ;
19921995
1993- value_size = bpf_map_value_size (map );
1996+ value_size = bpf_map_value_size (map , attr -> batch . elem_flags );
19941997
19951998 max_count = attr -> batch .count ;
19961999 if (!max_count )
@@ -2045,11 +2048,11 @@ int generic_map_lookup_batch(struct bpf_map *map,
20452048 u32 value_size , cp , max_count ;
20462049 int err ;
20472050
2048- err = bpf_map_check_op_flags (map , attr -> batch .elem_flags , BPF_F_LOCK );
2051+ err = bpf_map_check_op_flags (map , attr -> batch .elem_flags , BPF_F_LOCK | BPF_F_CPU );
20492052 if (err )
20502053 return err ;
20512054
2052- value_size = bpf_map_value_size (map );
2055+ value_size = bpf_map_value_size (map , attr -> batch . elem_flags );
20532056
20542057 max_count = attr -> batch .count ;
20552058 if (!max_count )
@@ -2171,7 +2174,7 @@ static int map_lookup_and_delete_elem(union bpf_attr *attr)
21712174 goto err_put ;
21722175 }
21732176
2174- value_size = bpf_map_value_size (map );
2177+ value_size = bpf_map_value_size (map , 0 );
21752178
21762179 err = - ENOMEM ;
21772180 value = kvmalloc (value_size , GFP_USER | __GFP_NOWARN );
0 commit comments