1717#include  "test_ringbuf_n.lskel.h" 
1818#include  "test_ringbuf_map_key.lskel.h" 
1919#include  "test_ringbuf_write.lskel.h" 
20+ #include  "test_ringbuf_overwrite.lskel.h" 
2021
2122#define  EDONE  7777
2223
@@ -497,6 +498,77 @@ static void ringbuf_map_key_subtest(void)
497498	test_ringbuf_map_key_lskel__destroy (skel_map_key );
498499}
499500
501+ static  void  ringbuf_overwrite_mode_subtest (void )
502+ {
503+ 	unsigned long  size , len1 , len2 , len3 , len4 , len5 ;
504+ 	unsigned long  expect_avail_data , expect_prod_pos , expect_over_pos ;
505+ 	struct  test_ringbuf_overwrite_lskel  * skel ;
506+ 	int  err ;
507+ 
508+ 	skel  =  test_ringbuf_overwrite_lskel__open ();
509+ 	if  (!ASSERT_OK_PTR (skel , "skel_open" ))
510+ 		return ;
511+ 
512+ 	size  =  0x1000 ;
513+ 	len1  =  0x800 ;
514+ 	len2  =  0x400 ;
515+ 	len3  =  size  -  len1  -  len2  -  BPF_RINGBUF_HDR_SZ  *  3 ; /* 0x3e8 */ 
516+ 	len4  =  len3  -  8 ; /* 0x3e0 */ 
517+ 	len5  =  len3 ; /* retry with len3 */ 
518+ 
519+ 	skel -> maps .ringbuf .max_entries  =  size ;
520+ 	skel -> rodata -> LEN1  =  len1 ;
521+ 	skel -> rodata -> LEN2  =  len2 ;
522+ 	skel -> rodata -> LEN3  =  len3 ;
523+ 	skel -> rodata -> LEN4  =  len4 ;
524+ 	skel -> rodata -> LEN5  =  len5 ;
525+ 
526+ 	skel -> bss -> pid  =  getpid ();
527+ 
528+ 	err  =  test_ringbuf_overwrite_lskel__load (skel );
529+ 	if  (!ASSERT_OK (err , "skel_load" ))
530+ 		goto cleanup ;
531+ 
532+ 	err  =  test_ringbuf_overwrite_lskel__attach (skel );
533+ 	if  (!ASSERT_OK (err , "skel_attach" ))
534+ 		goto cleanup ;
535+ 
536+ 	syscall (__NR_getpgid );
537+ 
538+ 	ASSERT_EQ (skel -> bss -> reserve1_fail , 0 , "reserve 1" );
539+ 	ASSERT_EQ (skel -> bss -> reserve2_fail , 0 , "reserve 2" );
540+ 	ASSERT_EQ (skel -> bss -> reserve3_fail , 1 , "reserve 3" );
541+ 	ASSERT_EQ (skel -> bss -> reserve4_fail , 0 , "reserve 4" );
542+ 	ASSERT_EQ (skel -> bss -> reserve5_fail , 0 , "reserve 5" );
543+ 
544+ 	CHECK (skel -> bss -> ring_size  !=  size ,
545+ 	      "check_ring_size" , "exp %lu, got %lu\n" ,
546+ 	      size , skel -> bss -> ring_size );
547+ 
548+ 	expect_avail_data  =  len2  +  len4  +  len5  +  3  *  BPF_RINGBUF_HDR_SZ ;
549+ 	CHECK (skel -> bss -> avail_data  !=  expect_avail_data ,
550+ 	      "check_avail_size" , "exp %lu, got %lu\n" ,
551+ 	      expect_avail_data , skel -> bss -> avail_data );
552+ 
553+ 	CHECK (skel -> bss -> cons_pos  !=  0 ,
554+ 	      "check_cons_pos" , "exp 0, got %lu\n" ,
555+ 	      skel -> bss -> cons_pos );
556+ 
557+ 	expect_prod_pos  =  len1  +  len2  +  len4  +  len5  +  4  *  BPF_RINGBUF_HDR_SZ ;
558+ 	CHECK (skel -> bss -> prod_pos  !=  expect_prod_pos ,
559+ 	      "check_prod_pos" , "exp %lu, got %lu\n" ,
560+ 	      expect_prod_pos , skel -> bss -> prod_pos );
561+ 
562+ 	expect_over_pos  =  len1  +  BPF_RINGBUF_HDR_SZ ;
563+ 	CHECK (skel -> bss -> over_pos  !=  expect_over_pos ,
564+ 	      "check_over_pos" , "exp %lu, got %lu\n" ,
565+ 	      (unsigned long )expect_over_pos , skel -> bss -> over_pos );
566+ 
567+ 	test_ringbuf_overwrite_lskel__detach (skel );
568+ cleanup :
569+ 	test_ringbuf_overwrite_lskel__destroy (skel );
570+ }
571+ 
500572void  test_ringbuf (void )
501573{
502574	if  (test__start_subtest ("ringbuf" ))
@@ -507,4 +579,6 @@ void test_ringbuf(void)
507579		ringbuf_map_key_subtest ();
508580	if  (test__start_subtest ("ringbuf_write" ))
509581		ringbuf_write_subtest ();
582+ 	if  (test__start_subtest ("ringbuf_overwrite_mode" ))
583+ 		ringbuf_overwrite_mode_subtest ();
510584}
0 commit comments