Lines Matching refs:iter
296 struct trace_remote_iterator *iter; in __poll_remote() local
298 iter = container_of(dwork, struct trace_remote_iterator, poll_work); in __poll_remote()
299 ring_buffer_poll_remote(iter->remote->trace_buffer, iter->cpu); in __poll_remote()
301 msecs_to_jiffies(iter->remote->poll_ms)); in __poll_remote()
304 static void __free_ring_buffer_iter(struct trace_remote_iterator *iter, int cpu) in __free_ring_buffer_iter() argument
307 ring_buffer_read_finish(iter->rb_iter); in __free_ring_buffer_iter()
312 if (iter->rb_iters[cpu]) in __free_ring_buffer_iter()
313 ring_buffer_read_finish(iter->rb_iters[cpu]); in __free_ring_buffer_iter()
316 kfree(iter->rb_iters); in __free_ring_buffer_iter()
319 static int __alloc_ring_buffer_iter(struct trace_remote_iterator *iter, int cpu) in __alloc_ring_buffer_iter() argument
322 iter->rb_iter = ring_buffer_read_start(iter->remote->trace_buffer, cpu, GFP_KERNEL); in __alloc_ring_buffer_iter()
324 return iter->rb_iter ? 0 : -ENOMEM; in __alloc_ring_buffer_iter()
327 iter->rb_iters = kcalloc(nr_cpu_ids, sizeof(*iter->rb_iters), GFP_KERNEL); in __alloc_ring_buffer_iter()
328 if (!iter->rb_iters) in __alloc_ring_buffer_iter()
332 iter->rb_iters[cpu] = ring_buffer_read_start(iter->remote->trace_buffer, cpu, in __alloc_ring_buffer_iter()
334 if (!iter->rb_iters[cpu]) { in __alloc_ring_buffer_iter()
336 if (!trace_remote_has_cpu(iter->remote, cpu)) in __alloc_ring_buffer_iter()
339 __free_ring_buffer_iter(iter, RING_BUFFER_ALL_CPUS); in __alloc_ring_buffer_iter()
350 struct trace_remote_iterator *iter = NULL; in trace_remote_iter() local
367 iter = kzalloc_obj(*iter); in trace_remote_iter()
368 if (iter) { in trace_remote_iter()
369 iter->remote = remote; in trace_remote_iter()
370 iter->cpu = cpu; in trace_remote_iter()
371 iter->type = type; in trace_remote_iter()
372 trace_seq_init(&iter->seq); in trace_remote_iter()
377 INIT_DELAYED_WORK(&iter->poll_work, __poll_remote); in trace_remote_iter()
378 schedule_delayed_work(&iter->poll_work, msecs_to_jiffies(remote->poll_ms)); in trace_remote_iter()
381 ret = __alloc_ring_buffer_iter(iter, cpu); in trace_remote_iter()
388 return iter; in trace_remote_iter()
393 kfree(iter); in trace_remote_iter()
399 static void trace_remote_iter_free(struct trace_remote_iterator *iter) in trace_remote_iter_free() argument
403 if (!iter) in trace_remote_iter_free()
406 remote = iter->remote; in trace_remote_iter_free()
410 switch (iter->type) { in trace_remote_iter_free()
412 cancel_delayed_work_sync(&iter->poll_work); in trace_remote_iter_free()
415 __free_ring_buffer_iter(iter, iter->cpu); in trace_remote_iter_free()
419 kfree(iter); in trace_remote_iter_free()
423 static void trace_remote_iter_read_start(struct trace_remote_iterator *iter) in trace_remote_iter_read_start() argument
425 struct trace_remote *remote = iter->remote; in trace_remote_iter_read_start()
426 int cpu = iter->cpu; in trace_remote_iter_read_start()
429 if (cpu == RING_BUFFER_ALL_CPUS && iter->type == TRI_CONSUMING) in trace_remote_iter_read_start()
446 if (iter->type == TRI_CONSUMING) in trace_remote_iter_read_start()
452 static void trace_remote_iter_read_finished(struct trace_remote_iterator *iter) in trace_remote_iter_read_finished() argument
454 struct trace_remote *remote = iter->remote; in trace_remote_iter_read_finished()
455 int cpu = iter->cpu; in trace_remote_iter_read_finished()
463 if (iter->type == TRI_CONSUMING) in trace_remote_iter_read_finished()
470 if (cpu == RING_BUFFER_ALL_CPUS && iter->type == TRI_CONSUMING) in trace_remote_iter_read_finished()
476 static struct ring_buffer_iter *__get_rb_iter(struct trace_remote_iterator *iter, int cpu) in __get_rb_iter() argument
478 return iter->cpu != RING_BUFFER_ALL_CPUS ? iter->rb_iter : iter->rb_iters[cpu]; in __get_rb_iter()
482 __peek_event(struct trace_remote_iterator *iter, int cpu, u64 *ts, unsigned long *lost_events) in __peek_event() argument
487 switch (iter->type) { in __peek_event()
489 return ring_buffer_peek(iter->remote->trace_buffer, cpu, ts, lost_events); in __peek_event()
491 rb_iter = __get_rb_iter(iter, cpu); in __peek_event()
507 static bool trace_remote_iter_read_event(struct trace_remote_iterator *iter) in trace_remote_iter_read_event() argument
509 struct trace_buffer *trace_buffer = iter->remote->trace_buffer; in trace_remote_iter_read_event()
511 int cpu = iter->cpu; in trace_remote_iter_read_event()
517 rb_evt = __peek_event(iter, cpu, &iter->ts, &iter->lost_events); in trace_remote_iter_read_event()
521 iter->evt_cpu = cpu; in trace_remote_iter_read_event()
522 iter->evt = ring_buffer_event_data(rb_evt); in trace_remote_iter_read_event()
526 iter->ts = U64_MAX; in trace_remote_iter_read_event()
534 rb_evt = __peek_event(iter, cpu, &ts, &lost_events); in trace_remote_iter_read_event()
538 if (ts >= iter->ts) in trace_remote_iter_read_event()
541 iter->ts = ts; in trace_remote_iter_read_event()
542 iter->evt_cpu = cpu; in trace_remote_iter_read_event()
543 iter->evt = ring_buffer_event_data(rb_evt); in trace_remote_iter_read_event()
544 iter->lost_events = lost_events; in trace_remote_iter_read_event()
547 return iter->ts != U64_MAX; in trace_remote_iter_read_event()
550 static void trace_remote_iter_move(struct trace_remote_iterator *iter) in trace_remote_iter_move() argument
552 struct trace_buffer *trace_buffer = iter->remote->trace_buffer; in trace_remote_iter_move()
554 switch (iter->type) { in trace_remote_iter_move()
556 ring_buffer_consume(trace_buffer, iter->evt_cpu, NULL, NULL); in trace_remote_iter_move()
559 ring_buffer_iter_advance(__get_rb_iter(iter, iter->evt_cpu)); in trace_remote_iter_move()
566 static int trace_remote_iter_print_event(struct trace_remote_iterator *iter) in trace_remote_iter_print_event() argument
570 u64 ts = iter->ts; in trace_remote_iter_print_event()
572 if (iter->lost_events) in trace_remote_iter_print_event()
573 trace_seq_printf(&iter->seq, "CPU:%d [LOST %lu EVENTS]\n", in trace_remote_iter_print_event()
574 iter->evt_cpu, iter->lost_events); in trace_remote_iter_print_event()
579 trace_seq_printf(&iter->seq, "[%03d]\t%5llu.%06lu: ", iter->evt_cpu, in trace_remote_iter_print_event()
582 evt = trace_remote_find_event(iter->remote, iter->evt->id); in trace_remote_iter_print_event()
584 trace_seq_printf(&iter->seq, "UNKNOWN id=%d\n", iter->evt->id); in trace_remote_iter_print_event()
586 evt->print(iter->evt, &iter->seq); in trace_remote_iter_print_event()
588 return trace_seq_has_overflowed(&iter->seq) ? -EOVERFLOW : 0; in trace_remote_iter_print_event()
594 struct trace_remote_iterator *iter; in trace_pipe_open() local
599 iter = trace_remote_iter(remote, cpu, TRI_CONSUMING); in trace_pipe_open()
600 if (IS_ERR(iter)) in trace_pipe_open()
601 return PTR_ERR(iter); in trace_pipe_open()
603 filp->private_data = iter; in trace_pipe_open()
610 struct trace_remote_iterator *iter = filp->private_data; in trace_pipe_release() local
611 struct trace_remote *remote = iter->remote; in trace_pipe_release()
615 trace_remote_iter_free(iter); in trace_pipe_release()
622 struct trace_remote_iterator *iter = filp->private_data; in trace_pipe_read() local
623 struct trace_buffer *trace_buffer = iter->remote->trace_buffer; in trace_pipe_read()
627 ret = trace_seq_to_user(&iter->seq, ubuf, cnt); in trace_pipe_read()
631 trace_seq_init(&iter->seq); in trace_pipe_read()
633 ret = ring_buffer_wait(trace_buffer, iter->cpu, 0, NULL, NULL); in trace_pipe_read()
637 trace_remote_iter_read_start(iter); in trace_pipe_read()
639 while (trace_remote_iter_read_event(iter)) { in trace_pipe_read()
640 int prev_len = iter->seq.seq.len; in trace_pipe_read()
642 if (trace_remote_iter_print_event(iter)) { in trace_pipe_read()
643 iter->seq.seq.len = prev_len; in trace_pipe_read()
647 trace_remote_iter_move(iter); in trace_pipe_read()
650 trace_remote_iter_read_finished(iter); in trace_pipe_read()
663 struct trace_remote_iterator *iter = m->private; in trace_next() local
667 if (!iter || !trace_remote_iter_read_event(iter)) in trace_next()
670 trace_remote_iter_move(iter); in trace_next()
671 iter->pos++; in trace_next()
673 return iter; in trace_next()
678 struct trace_remote_iterator *iter = m->private; in trace_start() local
681 if (!iter) in trace_start()
684 trace_remote_iter_read_start(iter); in trace_start()
687 iter->pos = -1; in trace_start()
691 i = iter->pos; in trace_start()
693 iter = trace_next(m, NULL, &i); in trace_start()
694 if (!iter) in trace_start()
698 return iter; in trace_start()
703 struct trace_remote_iterator *iter = v; in trace_show() local
705 trace_seq_init(&iter->seq); in trace_show()
707 if (trace_remote_iter_print_event(iter)) { in trace_show()
708 seq_printf(m, "[EVENT %d PRINT TOO BIG]\n", iter->evt->id); in trace_show()
712 return trace_print_seq(m, &iter->seq); in trace_show()
717 struct trace_remote_iterator *iter = m->private; in trace_stop() local
719 if (iter) in trace_stop()
720 trace_remote_iter_read_finished(iter); in trace_stop()
733 struct trace_remote_iterator *iter = NULL; in trace_open() local
742 iter = trace_remote_iter(remote, cpu, TRI_NONCONSUMING); in trace_open()
743 if (IS_ERR(iter)) in trace_open()
744 return PTR_ERR(iter); in trace_open()
748 trace_remote_iter_free(iter); in trace_open()
752 ((struct seq_file *)filp->private_data)->private = (void *)iter; in trace_open()
759 struct trace_remote_iterator *iter; in trace_release() local
764 iter = ((struct seq_file *)filp->private_data)->private; in trace_release()
767 if (!iter) in trace_release()
770 guard(mutex)(&iter->remote->lock); in trace_release()
772 trace_remote_iter_free(iter); in trace_release()