17
17
#include "test_ringbuf_n.lskel.h"
18
18
#include "test_ringbuf_map_key.lskel.h"
19
19
#include "test_ringbuf_write.lskel.h"
20
+ #include "test_ringbuf_overwrite.lskel.h"
20
21
21
22
#define EDONE 7777
22
23
@@ -497,6 +498,77 @@ static void ringbuf_map_key_subtest(void)
497
498
test_ringbuf_map_key_lskel__destroy (skel_map_key );
498
499
}
499
500
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
+
500
572
void test_ringbuf (void )
501
573
{
502
574
if (test__start_subtest ("ringbuf" ))
@@ -507,4 +579,6 @@ void test_ringbuf(void)
507
579
ringbuf_map_key_subtest ();
508
580
if (test__start_subtest ("ringbuf_write" ))
509
581
ringbuf_write_subtest ();
582
+ if (test__start_subtest ("ringbuf_overwrite_mode" ))
583
+ ringbuf_overwrite_mode_subtest ();
510
584
}
0 commit comments