Message ID | 20190116191838.32127-4-tstoyanov@vmware.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | trace-cmd [POC]: Timestamps sync using PTP-like algorithm, relying on vsock events. | expand |
On Wed, 16 Jan 2019 21:18:34 +0200 Tzvetomir Stoyanov <tstoyanov@vmware.com> wrote: > Fixed the logic in tracecmd_read_page_record() when > searching for the next event in the event from the > ring buffer. Please explain what you are fixing. In other words, what was wrong with the current logic? -- Steve > > Signed-off-by: Tzvetomir Stoyanov <tstoyanov@vmware.com> > ---
On Mon, Jan 21, 2019 at 11:09 AM Steven Rostedt <rostedt@goodmis.org> wrote: > > On Wed, 16 Jan 2019 21:18:34 +0200 > Tzvetomir Stoyanov <tstoyanov@vmware.com> wrote: > > > Fixed the logic in tracecmd_read_page_record() when > > searching for the next event in the event from the > > ring buffer. > > Please explain what you are fixing. In other words, what was wrong with > the current logic? In the current logic, in the case when last_record is not NULL (we are searching for the second one) the check "if (ptr != last_record->data)" always fails. As I can understand, kbuffer_next_event() reads the event after the one pointed by last_record. In my use case I search for a series of few events, tracecmd_read_page_record() returns the first one (when I pass last_record=NULL), and always fails on the second one with the error "tracecmd_read_page_record: could not find last_record". I use a gdb to figure out what happens there. > > -- Steve > > > > > Signed-off-by: Tzvetomir Stoyanov <tstoyanov@vmware.com> > > ---
diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c index de15d4b..c2b993a 100644 --- a/lib/trace-cmd/trace-input.c +++ b/lib/trace-cmd/trace-input.c @@ -1688,18 +1688,22 @@ tracecmd_read_page_record(struct tep_handle *pevent, void *page, int size, goto out_free; } - do { + ptr = kbuffer_read_event(kbuf, &ts); + while (ptr < last_record->data) { ptr = kbuffer_next_event(kbuf, NULL); if (!ptr) break; - } while (ptr < last_record->data); + if (ptr == last_record->data) + break; + } if (ptr != last_record->data) { warning("tracecmd_read_page_record: could not find last_record"); goto out_free; } - } + ptr = kbuffer_next_event(kbuf, &ts); + } else + ptr = kbuffer_read_event(kbuf, &ts); - ptr = kbuffer_read_event(kbuf, &ts); if (!ptr) goto out_free;
Fixed the logic in tracecmd_read_page_record() when searching for the next event in the event from the ring buffer. Signed-off-by: Tzvetomir Stoyanov <tstoyanov@vmware.com> --- lib/trace-cmd/trace-input.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)