- event = field->u.perf_counter.e[ctx->cpu];
- event->pmu->read(event);
- value = local64_read(&event->count);
- lib_ring_buffer_align_ctx(ctx, ltt_alignof(value));
+ event = field->u.perf_counter->e[ctx->cpu];
+ if (likely(event)) {
+ if (unlikely(event->state == PERF_EVENT_STATE_ERROR)) {
+ value = 0;
+ } else {
+ event->pmu->read(event);
+ value = local64_read(&event->count);
+ }
+ } else {
+ /*
+ * Perf chooses not to be clever and not to support enabling a
+ * perf counter before the cpu is brought up. Therefore, we need
+ * to support having events coming (e.g. scheduler events)
+ * before the counter is setup. Write an arbitrary 0 in this
+ * case.
+ */
+ value = 0;
+ }
+ lib_ring_buffer_align_ctx(ctx, lttng_alignof(value));