@@ -185,6 +185,7 @@ static const char * const map_type_name[] = {
185
185
[BPF_MAP_TYPE_BLOOM_FILTER ] = "bloom_filter" ,
186
186
[BPF_MAP_TYPE_USER_RINGBUF ] = "user_ringbuf" ,
187
187
[BPF_MAP_TYPE_CGRP_STORAGE ] = "cgrp_storage" ,
188
+ [BPF_MAP_TYPE_ARENA ] = "arena" ,
188
189
};
189
190
190
191
static const char * const prog_type_name [] = {
@@ -1684,7 +1685,7 @@ static struct bpf_map *bpf_object__add_map(struct bpf_object *obj)
1684
1685
return map ;
1685
1686
}
1686
1687
1687
- static size_t bpf_map_mmap_sz (unsigned int value_sz , unsigned int max_entries )
1688
+ static size_t array_map_mmap_sz (unsigned int value_sz , unsigned int max_entries )
1688
1689
{
1689
1690
const long page_sz = sysconf (_SC_PAGE_SIZE );
1690
1691
size_t map_sz ;
@@ -1694,6 +1695,20 @@ static size_t bpf_map_mmap_sz(unsigned int value_sz, unsigned int max_entries)
1694
1695
return map_sz ;
1695
1696
}
1696
1697
1698
+ static size_t bpf_map_mmap_sz (const struct bpf_map * map )
1699
+ {
1700
+ const long page_sz = sysconf (_SC_PAGE_SIZE );
1701
+
1702
+ switch (map -> def .type ) {
1703
+ case BPF_MAP_TYPE_ARRAY :
1704
+ return array_map_mmap_sz (map -> def .value_size , map -> def .max_entries );
1705
+ case BPF_MAP_TYPE_ARENA :
1706
+ return page_sz * map -> def .max_entries ;
1707
+ default :
1708
+ return 0 ; /* not supported */
1709
+ }
1710
+ }
1711
+
1697
1712
static int bpf_map_mmap_resize (struct bpf_map * map , size_t old_sz , size_t new_sz )
1698
1713
{
1699
1714
void * mmaped ;
@@ -1847,7 +1862,7 @@ bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type,
1847
1862
pr_debug ("map '%s' (global data): at sec_idx %d, offset %zu, flags %x.\n" ,
1848
1863
map -> name , map -> sec_idx , map -> sec_offset , def -> map_flags );
1849
1864
1850
- mmap_sz = bpf_map_mmap_sz (map -> def . value_size , map -> def . max_entries );
1865
+ mmap_sz = bpf_map_mmap_sz (map );
1851
1866
map -> mmaped = mmap (NULL , mmap_sz , PROT_READ | PROT_WRITE ,
1852
1867
MAP_SHARED | MAP_ANONYMOUS , -1 , 0 );
1853
1868
if (map -> mmaped == MAP_FAILED ) {
@@ -5017,6 +5032,7 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, b
5017
5032
case BPF_MAP_TYPE_SOCKHASH :
5018
5033
case BPF_MAP_TYPE_QUEUE :
5019
5034
case BPF_MAP_TYPE_STACK :
5035
+ case BPF_MAP_TYPE_ARENA :
5020
5036
create_attr .btf_fd = 0 ;
5021
5037
create_attr .btf_key_type_id = 0 ;
5022
5038
create_attr .btf_value_type_id = 0 ;
@@ -5261,7 +5277,19 @@ bpf_object__create_maps(struct bpf_object *obj)
5261
5277
if (err < 0 )
5262
5278
goto err_out ;
5263
5279
}
5264
-
5280
+ if (map -> def .type == BPF_MAP_TYPE_ARENA ) {
5281
+ map -> mmaped = mmap ((void * )map -> map_extra , bpf_map_mmap_sz (map ),
5282
+ PROT_READ | PROT_WRITE ,
5283
+ map -> map_extra ? MAP_SHARED | MAP_FIXED : MAP_SHARED ,
5284
+ map -> fd , 0 );
5285
+ if (map -> mmaped == MAP_FAILED ) {
5286
+ err = - errno ;
5287
+ map -> mmaped = NULL ;
5288
+ pr_warn ("map '%s': failed to mmap arena: %d\n" ,
5289
+ map -> name , err );
5290
+ return err ;
5291
+ }
5292
+ }
5265
5293
if (map -> init_slots_sz && map -> def .type != BPF_MAP_TYPE_PROG_ARRAY ) {
5266
5294
err = init_map_in_map_slots (obj , map );
5267
5295
if (err < 0 )
@@ -8761,7 +8789,7 @@ static void bpf_map__destroy(struct bpf_map *map)
8761
8789
if (map -> mmaped ) {
8762
8790
size_t mmap_sz ;
8763
8791
8764
- mmap_sz = bpf_map_mmap_sz (map -> def . value_size , map -> def . max_entries );
8792
+ mmap_sz = bpf_map_mmap_sz (map );
8765
8793
munmap (map -> mmaped , mmap_sz );
8766
8794
map -> mmaped = NULL ;
8767
8795
}
@@ -9995,11 +10023,14 @@ int bpf_map__set_value_size(struct bpf_map *map, __u32 size)
9995
10023
return libbpf_err (- EBUSY );
9996
10024
9997
10025
if (map -> mmaped ) {
9998
- int err ;
9999
10026
size_t mmap_old_sz , mmap_new_sz ;
10027
+ int err ;
10028
+
10029
+ if (map -> def .type != BPF_MAP_TYPE_ARRAY )
10030
+ return - EOPNOTSUPP ;
10000
10031
10001
- mmap_old_sz = bpf_map_mmap_sz (map -> def . value_size , map -> def . max_entries );
10002
- mmap_new_sz = bpf_map_mmap_sz (size , map -> def .max_entries );
10032
+ mmap_old_sz = bpf_map_mmap_sz (map );
10033
+ mmap_new_sz = array_map_mmap_sz (size , map -> def .max_entries );
10003
10034
err = bpf_map_mmap_resize (map , mmap_old_sz , mmap_new_sz );
10004
10035
if (err ) {
10005
10036
pr_warn ("map '%s': failed to resize memory-mapped region: %d\n" ,
@@ -13530,7 +13561,7 @@ int bpf_object__load_skeleton(struct bpf_object_skeleton *s)
13530
13561
13531
13562
for (i = 0 ; i < s -> map_cnt ; i ++ ) {
13532
13563
struct bpf_map * map = * s -> maps [i ].map ;
13533
- size_t mmap_sz = bpf_map_mmap_sz (map -> def . value_size , map -> def . max_entries );
13564
+ size_t mmap_sz = bpf_map_mmap_sz (map );
13534
13565
int prot , map_fd = map -> fd ;
13535
13566
void * * mmaped = s -> maps [i ].mmaped ;
13536
13567
0 commit comments