2019-06-13 18:29:05 -03:00
// SPDX-License-Identifier: GPL-2.0
2023-04-04 13:59:47 -07:00
# include <inttypes.h>
2019-05-08 15:20:07 +02:00
# include <linux/compiler.h>
# include <linux/kernel.h>
# include "tests.h"
# include "map.h"
2019-11-25 22:24:10 -03:00
# include "maps.h"
2019-05-08 15:20:07 +02:00
# include "dso.h"
# include "debug.h"
struct map_def {
const char * name ;
u64 start ;
u64 end ;
} ;
2019-11-25 21:58:33 -03:00
static int check_maps ( struct map_def * merged , unsigned int size , struct maps * maps )
2019-05-08 15:20:07 +02:00
{
2023-03-20 14:22:33 -07:00
struct map_rb_node * rb_node ;
2019-05-08 15:20:07 +02:00
unsigned int i = 0 ;
2023-04-04 13:59:47 -07:00
bool failed = false ;
2019-05-08 15:20:07 +02:00
2023-04-04 13:59:47 -07:00
if ( maps__nr_maps ( maps ) ! = size ) {
pr_debug ( " Expected %d maps, got %d " , size , maps__nr_maps ( maps ) ) ;
failed = true ;
} else {
maps__for_each_entry ( maps , rb_node ) {
struct map * map = rb_node - > map ;
2023-03-20 14:22:33 -07:00
2023-04-04 13:59:47 -07:00
if ( map__start ( map ) ! = merged [ i ] . start | |
map__end ( map ) ! = merged [ i ] . end | |
strcmp ( map__dso ( map ) - > name , merged [ i ] . name ) | |
2023-04-12 12:36:58 -03:00
refcount_read ( map__refcnt ( map ) ) ! = 1 ) {
2023-04-04 13:59:47 -07:00
failed = true ;
}
i + + ;
}
2019-05-08 15:20:07 +02:00
}
2023-04-04 13:59:47 -07:00
if ( failed ) {
pr_debug ( " Expected: \n " ) ;
for ( i = 0 ; i < size ; i + + ) {
pr_debug ( " \t start: % " PRIu64 " end: % " PRIu64 " name: '%s' refcnt: 1 \n " ,
merged [ i ] . start , merged [ i ] . end , merged [ i ] . name ) ;
}
pr_debug ( " Got: \n " ) ;
maps__for_each_entry ( maps , rb_node ) {
struct map * map = rb_node - > map ;
2019-05-08 15:20:07 +02:00
2023-04-04 13:59:47 -07:00
pr_debug ( " \t start: % " PRIu64 " end: % " PRIu64 " name: '%s' refcnt: %d \n " ,
map__start ( map ) ,
map__end ( map ) ,
map__dso ( map ) - > name ,
2023-04-12 12:36:58 -03:00
refcount_read ( map__refcnt ( map ) ) ) ;
2023-04-04 13:59:47 -07:00
}
}
return failed ? TEST_FAIL : TEST_OK ;
2019-05-08 15:20:07 +02:00
}
2021-11-03 23:41:51 -07:00
static int test__maps__merge_in ( struct test_suite * t __maybe_unused , int subtest __maybe_unused )
2019-05-08 15:20:07 +02:00
{
unsigned int i ;
struct map_def bpf_progs [ ] = {
{ " bpf_prog_1 " , 200 , 300 } ,
{ " bpf_prog_2 " , 500 , 600 } ,
{ " bpf_prog_3 " , 800 , 900 } ,
} ;
struct map_def merged12 [ ] = {
{ " kcore1 " , 100 , 200 } ,
{ " bpf_prog_1 " , 200 , 300 } ,
{ " kcore1 " , 300 , 500 } ,
{ " bpf_prog_2 " , 500 , 600 } ,
{ " kcore1 " , 600 , 800 } ,
{ " bpf_prog_3 " , 800 , 900 } ,
{ " kcore1 " , 900 , 1000 } ,
} ;
struct map_def merged3 [ ] = {
{ " kcore1 " , 100 , 200 } ,
{ " bpf_prog_1 " , 200 , 300 } ,
{ " kcore1 " , 300 , 500 } ,
{ " bpf_prog_2 " , 500 , 600 } ,
{ " kcore1 " , 600 , 800 } ,
{ " bpf_prog_3 " , 800 , 900 } ,
{ " kcore1 " , 900 , 1000 } ,
{ " kcore3 " , 1000 , 1100 } ,
} ;
struct map * map_kcore1 , * map_kcore2 , * map_kcore3 ;
int ret ;
2022-02-11 02:33:59 -08:00
struct maps * maps = maps__new ( NULL ) ;
2019-05-08 15:20:07 +02:00
2022-02-11 02:33:59 -08:00
TEST_ASSERT_VAL ( " failed to create maps " , maps ) ;
2019-05-08 15:20:07 +02:00
for ( i = 0 ; i < ARRAY_SIZE ( bpf_progs ) ; i + + ) {
struct map * map ;
map = dso__new_map ( bpf_progs [ i ] . name ) ;
TEST_ASSERT_VAL ( " failed to create map " , map ) ;
2023-04-19 12:24:12 -03:00
map__set_start ( map , bpf_progs [ i ] . start ) ;
map__set_end ( map , bpf_progs [ i ] . end ) ;
2023-03-20 14:22:33 -07:00
TEST_ASSERT_VAL ( " failed to insert map " , maps__insert ( maps , map ) = = 0 ) ;
2019-05-08 15:20:07 +02:00
map__put ( map ) ;
}
map_kcore1 = dso__new_map ( " kcore1 " ) ;
TEST_ASSERT_VAL ( " failed to create map " , map_kcore1 ) ;
map_kcore2 = dso__new_map ( " kcore2 " ) ;
TEST_ASSERT_VAL ( " failed to create map " , map_kcore2 ) ;
map_kcore3 = dso__new_map ( " kcore3 " ) ;
TEST_ASSERT_VAL ( " failed to create map " , map_kcore3 ) ;
/* kcore1 map overlaps over all bpf maps */
2023-04-19 12:24:12 -03:00
map__set_start ( map_kcore1 , 100 ) ;
map__set_end ( map_kcore1 , 1000 ) ;
2019-05-08 15:20:07 +02:00
/* kcore2 map hides behind bpf_prog_2 */
2023-04-19 12:24:12 -03:00
map__set_start ( map_kcore2 , 550 ) ;
map__set_end ( map_kcore2 , 570 ) ;
2019-05-08 15:20:07 +02:00
/* kcore3 map hides behind bpf_prog_3, kcore1 and adds new map */
2023-04-19 12:24:12 -03:00
map__set_start ( map_kcore3 , 880 ) ;
map__set_end ( map_kcore3 , 1100 ) ;
2019-05-08 15:20:07 +02:00
2022-02-11 02:33:59 -08:00
ret = maps__merge_in ( maps , map_kcore1 ) ;
2019-05-08 15:20:07 +02:00
TEST_ASSERT_VAL ( " failed to merge map " , ! ret ) ;
2022-02-11 02:33:59 -08:00
ret = check_maps ( merged12 , ARRAY_SIZE ( merged12 ) , maps ) ;
2019-05-08 15:20:07 +02:00
TEST_ASSERT_VAL ( " merge check failed " , ! ret ) ;
2022-02-11 02:33:59 -08:00
ret = maps__merge_in ( maps , map_kcore2 ) ;
2019-05-08 15:20:07 +02:00
TEST_ASSERT_VAL ( " failed to merge map " , ! ret ) ;
2022-02-11 02:33:59 -08:00
ret = check_maps ( merged12 , ARRAY_SIZE ( merged12 ) , maps ) ;
2019-05-08 15:20:07 +02:00
TEST_ASSERT_VAL ( " merge check failed " , ! ret ) ;
2022-02-11 02:33:59 -08:00
ret = maps__merge_in ( maps , map_kcore3 ) ;
2019-05-08 15:20:07 +02:00
TEST_ASSERT_VAL ( " failed to merge map " , ! ret ) ;
2022-02-11 02:33:59 -08:00
ret = check_maps ( merged3 , ARRAY_SIZE ( merged3 ) , maps ) ;
2019-05-08 15:20:07 +02:00
TEST_ASSERT_VAL ( " merge check failed " , ! ret ) ;
2021-07-15 18:07:12 +02:00
2022-02-11 02:33:59 -08:00
maps__delete ( maps ) ;
2019-05-08 15:20:07 +02:00
return TEST_OK ;
}
2021-11-03 23:41:50 -07:00
DEFINE_SUITE ( " maps__merge_in " , maps__merge_in ) ;