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