@@ -83,6 +83,54 @@ static int process_synthesized_event(struct perf_tool *tool,
83
83
return record__write (rec , event , event -> header .size );
84
84
}
85
85
86
+ static int
87
+ backward_rb_find_range (void * buf , int mask , u64 head , u64 * start , u64 * end )
88
+ {
89
+ struct perf_event_header * pheader ;
90
+ u64 evt_head = head ;
91
+ int size = mask + 1 ;
92
+
93
+ pr_debug2 ("backward_rb_find_range: buf=%p, head=%" PRIx64 "\n" , buf , head );
94
+ pheader = (struct perf_event_header * )(buf + (head & mask ));
95
+ * start = head ;
96
+ while (true) {
97
+ if (evt_head - head >= (unsigned int )size ) {
98
+ pr_debug ("Finshed reading backward ring buffer: rewind\n" );
99
+ if (evt_head - head > (unsigned int )size )
100
+ evt_head -= pheader -> size ;
101
+ * end = evt_head ;
102
+ return 0 ;
103
+ }
104
+
105
+ pheader = (struct perf_event_header * )(buf + (evt_head & mask ));
106
+
107
+ if (pheader -> size == 0 ) {
108
+ pr_debug ("Finshed reading backward ring buffer: get start\n" );
109
+ * end = evt_head ;
110
+ return 0 ;
111
+ }
112
+
113
+ evt_head += pheader -> size ;
114
+ pr_debug3 ("move evt_head: %" PRIx64 "\n" , evt_head );
115
+ }
116
+ WARN_ONCE (1 , "Shouldn't get here\n" );
117
+ return -1 ;
118
+ }
119
+
120
+ static int
121
+ rb_find_range (struct perf_evlist * evlist ,
122
+ void * data , int mask , u64 head , u64 old ,
123
+ u64 * start , u64 * end )
124
+ {
125
+ if (!evlist -> backward ) {
126
+ * start = old ;
127
+ * end = head ;
128
+ return 0 ;
129
+ }
130
+
131
+ return backward_rb_find_range (data , mask , head , start , end );
132
+ }
133
+
86
134
static int record__mmap_read (struct record * rec , int idx )
87
135
{
88
136
struct perf_mmap * md = & rec -> evlist -> mmap [idx ];
@@ -94,6 +142,10 @@ static int record__mmap_read(struct record *rec, int idx)
94
142
void * buf ;
95
143
int rc = 0 ;
96
144
145
+ if (rb_find_range (rec -> evlist , data , md -> mask , head ,
146
+ old , & start , & end ))
147
+ return -1 ;
148
+
97
149
if (start == end )
98
150
return 0 ;
99
151
0 commit comments