Blob Blame History Raw
commit 7a6ae407b62615d3ffa9b0d2ac17771b7fc63056
Author: Vince Weaver <vince@deater.net>
Date:   Thu Sep 27 23:47:58 2018 -0400

    perf_event: avoid floating point exception if running is 0
    
    The perf_event interface isn't supposed to return 0 for running, but
    it happens occasionally.  So be sure not to divide by zero if this
    happens.  This makes the rdpmc code match the generic perf code in this
    case.
    
    This is in response to bitbucket issue #52

diff --git a/src/components/perf_event/perf_event.c b/src/components/perf_event/perf_event.c
index 7fd753ed..82b7d398 100644
--- a/src/components/perf_event/perf_event.c
+++ b/src/components/perf_event/perf_event.c
@@ -1099,14 +1099,23 @@ _pe_rdpmc_read( hwd_context_t *ctx, hwd_control_state_t *ctl,
 		count = mmap_read_self(pe_ctl->events[i].mmap_buf,
 						&enabled,&running);
 
-		/* TODO: error checking? */
+		/* TODO: more error checking? */
 
 		/* Handle multiplexing case */
-		if (enabled!=running) {
+		if (enabled == running) {
+			/* no adjustment needed */
+		}
+		else if (enabled && running) {
 			adjusted = (enabled * 128LL) / running;
 			adjusted = adjusted * count;
 			adjusted = adjusted / 128LL;
 			count = adjusted;
+		} else {
+			/* This should not happen, but we have had it reported */
+			SUBDBG("perf_event kernel bug(?) count, enabled, "
+				"running: %lld, %lld, %lld\n",
+				papi_pe_buffer[0],enabled,running);
+
 		}
 
 		pe_ctl->counts[i] = count;