@@ -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 map -> value_size ;
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 );
@@ -1732,15 +1734,15 @@ static int map_lookup_elem(union bpf_attr *attr)
17321734 if (!(map_get_sys_perms (map , f ) & FMODE_CAN_READ ))
17331735 return - EPERM ;
17341736
1735- err = bpf_map_check_op_flags (map , attr -> flags , BPF_F_LOCK );
1737+ err = bpf_map_check_op_flags (map , attr -> flags , BPF_F_LOCK | BPF_F_CPU );
17361738 if (err )
17371739 return err ;
17381740
17391741 key = __bpf_copy_key (ukey , map -> key_size );
17401742 if (IS_ERR (key ))
17411743 return PTR_ERR (key );
17421744
1743- value_size = bpf_map_value_size (map );
1745+ value_size = bpf_map_value_size (map , attr -> flags );
17441746
17451747 err = - ENOMEM ;
17461748 value = kvmalloc (value_size , GFP_USER | __GFP_NOWARN );
@@ -1781,6 +1783,7 @@ static int map_update_elem(union bpf_attr *attr, bpfptr_t uattr)
17811783 bpfptr_t uvalue = make_bpfptr (attr -> value , uattr .is_kernel );
17821784 struct bpf_map * map ;
17831785 void * key , * value ;
1786+ u64 allowed_flags ;
17841787 u32 value_size ;
17851788 int err ;
17861789
@@ -1797,7 +1800,8 @@ static int map_update_elem(union bpf_attr *attr, bpfptr_t uattr)
17971800 goto err_put ;
17981801 }
17991802
1800- err = bpf_map_check_op_flags (map , attr -> flags , ~0 );
1803+ allowed_flags = (BPF_F_ALL_CPUS << 1 ) - 1 ;
1804+ err = bpf_map_check_op_flags (map , attr -> flags , allowed_flags );
18011805 if (err )
18021806 goto err_put ;
18031807
@@ -1807,7 +1811,7 @@ static int map_update_elem(union bpf_attr *attr, bpfptr_t uattr)
18071811 goto err_put ;
18081812 }
18091813
1810- value_size = bpf_map_value_size (map );
1814+ value_size = bpf_map_value_size (map , attr -> flags );
18111815 value = kvmemdup_bpfptr (uvalue , value_size );
18121816 if (IS_ERR (value )) {
18131817 err = PTR_ERR (value );
@@ -2001,13 +2005,15 @@ int generic_map_update_batch(struct bpf_map *map, struct file *map_file,
20012005 void __user * keys = u64_to_user_ptr (attr -> batch .keys );
20022006 u32 value_size , cp , max_count ;
20032007 void * key , * value ;
2008+ u64 allowed_flags ;
20042009 int err = 0 ;
20052010
2006- err = bpf_map_check_op_flags (map , attr -> batch .elem_flags , BPF_F_LOCK );
2011+ allowed_flags = BPF_EXIST | BPF_F_LOCK | BPF_F_CPU | BPF_F_ALL_CPUS ;
2012+ err = bpf_map_check_op_flags (map , attr -> batch .elem_flags , allowed_flags );
20072013 if (err )
20082014 return err ;
20092015
2010- value_size = bpf_map_value_size (map );
2016+ value_size = bpf_map_value_size (map , attr -> batch . elem_flags );
20112017
20122018 max_count = attr -> batch .count ;
20132019 if (!max_count )
@@ -2062,11 +2068,11 @@ int generic_map_lookup_batch(struct bpf_map *map,
20622068 u32 value_size , cp , max_count ;
20632069 int err ;
20642070
2065- err = bpf_map_check_op_flags (map , attr -> batch .elem_flags , BPF_F_LOCK );
2071+ err = bpf_map_check_op_flags (map , attr -> batch .elem_flags , BPF_F_LOCK | BPF_F_CPU );
20662072 if (err )
20672073 return err ;
20682074
2069- value_size = bpf_map_value_size (map );
2075+ value_size = bpf_map_value_size (map , attr -> batch . elem_flags );
20702076
20712077 max_count = attr -> batch .count ;
20722078 if (!max_count )
@@ -2188,7 +2194,7 @@ static int map_lookup_and_delete_elem(union bpf_attr *attr)
21882194 goto err_put ;
21892195 }
21902196
2191- value_size = bpf_map_value_size (map );
2197+ value_size = bpf_map_value_size (map , 0 );
21922198
21932199 err = - ENOMEM ;
21942200 value = kvmalloc (value_size , GFP_USER | __GFP_NOWARN );
0 commit comments