|  | 
| 12 | 12 | #include <sys/sysinfo.h> | 
| 13 | 13 | #include <linux/perf_event.h> | 
| 14 | 14 | #include <linux/ring_buffer.h> | 
|  | 15 | + | 
| 15 | 16 | #include "test_ringbuf.lskel.h" | 
| 16 | 17 | #include "test_ringbuf_n.lskel.h" | 
| 17 | 18 | #include "test_ringbuf_map_key.lskel.h" | 
|  | 19 | +#include "test_ringbuf_write.lskel.h" | 
| 18 | 20 | 
 | 
| 19 | 21 | #define EDONE 7777 | 
| 20 | 22 | 
 | 
| @@ -84,6 +86,48 @@ static void *poll_thread(void *input) | 
| 84 | 86 | 	return (void *)(long)ring_buffer__poll(ringbuf, timeout); | 
| 85 | 87 | } | 
| 86 | 88 | 
 | 
|  | 89 | +static void ringbuf_write_subtest(void) | 
|  | 90 | +{ | 
|  | 91 | +	struct test_ringbuf_write_lskel *skel; | 
|  | 92 | +	int page_size = getpagesize(); | 
|  | 93 | +	size_t *mmap_ptr; | 
|  | 94 | +	int err, rb_fd; | 
|  | 95 | + | 
|  | 96 | +	skel = test_ringbuf_write_lskel__open(); | 
|  | 97 | +	if (!ASSERT_OK_PTR(skel, "skel_load")) | 
|  | 98 | +		return; | 
|  | 99 | + | 
|  | 100 | +	skel->maps.ringbuf.max_entries = 0x4000; | 
|  | 101 | + | 
|  | 102 | +	err = test_ringbuf_write_lskel__load(skel); | 
|  | 103 | +	if (!ASSERT_OK(err, "ringbuf_write")) | 
|  | 104 | +		goto cleanup; | 
|  | 105 | + | 
|  | 106 | +	rb_fd = skel->maps.ringbuf.map_fd; | 
|  | 107 | + | 
|  | 108 | +	mmap_ptr = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, rb_fd, 0); | 
|  | 109 | +	ASSERT_OK_PTR(mmap_ptr, "rw_cons_pos"); | 
|  | 110 | +	*mmap_ptr = 0x3000; | 
|  | 111 | +	ASSERT_OK(munmap(mmap_ptr, page_size), "unmap_rw"); | 
|  | 112 | + | 
|  | 113 | +	skel->bss->pid = getpid(); | 
|  | 114 | + | 
|  | 115 | +	ringbuf = ring_buffer__new(rb_fd, process_sample, NULL, NULL); | 
|  | 116 | +	if (!ASSERT_OK_PTR(ringbuf, "ringbuf_create")) | 
|  | 117 | +		goto cleanup; | 
|  | 118 | + | 
|  | 119 | +	err = test_ringbuf_write_lskel__attach(skel); | 
|  | 120 | +	if (!ASSERT_OK(err, "ringbuf_write")) | 
|  | 121 | +		goto cleanup; | 
|  | 122 | + | 
|  | 123 | +	trigger_samples(); | 
|  | 124 | +	ASSERT_GE(skel->bss->discarded, 1, "discarded"); | 
|  | 125 | +	ASSERT_EQ(skel->bss->passed, 0, "passed"); | 
|  | 126 | +cleanup: | 
|  | 127 | +	ring_buffer__free(ringbuf); | 
|  | 128 | +	test_ringbuf_write_lskel__destroy(skel); | 
|  | 129 | +} | 
|  | 130 | + | 
| 87 | 131 | static void ringbuf_subtest(void) | 
| 88 | 132 | { | 
| 89 | 133 | 	const size_t rec_sz = BPF_RINGBUF_HDR_SZ + sizeof(struct sample); | 
| @@ -451,4 +495,6 @@ void test_ringbuf(void) | 
| 451 | 495 | 		ringbuf_n_subtest(); | 
| 452 | 496 | 	if (test__start_subtest("ringbuf_map_key")) | 
| 453 | 497 | 		ringbuf_map_key_subtest(); | 
|  | 498 | +	if (test__start_subtest("ringbuf_write")) | 
|  | 499 | +		ringbuf_write_subtest(); | 
| 454 | 500 | } | 
0 commit comments