|
@@ -3444,40 +3444,32 @@ static void perf_swcounter_add(struct perf_counter *counter, u64 nr,
|
|
|
|
|
|
static int perf_swcounter_is_counting(struct perf_counter *counter)
|
|
|
{
|
|
|
- struct perf_counter_context *ctx;
|
|
|
- unsigned long flags;
|
|
|
- int count;
|
|
|
-
|
|
|
+ /*
|
|
|
+ * The counter is active, we're good!
|
|
|
+ */
|
|
|
if (counter->state == PERF_COUNTER_STATE_ACTIVE)
|
|
|
return 1;
|
|
|
|
|
|
+ /*
|
|
|
+ * The counter is off/error, not counting.
|
|
|
+ */
|
|
|
if (counter->state != PERF_COUNTER_STATE_INACTIVE)
|
|
|
return 0;
|
|
|
|
|
|
/*
|
|
|
- * If the counter is inactive, it could be just because
|
|
|
- * its task is scheduled out, or because it's in a group
|
|
|
- * which could not go on the PMU. We want to count in
|
|
|
- * the first case but not the second. If the context is
|
|
|
- * currently active then an inactive software counter must
|
|
|
- * be the second case. If it's not currently active then
|
|
|
- * we need to know whether the counter was active when the
|
|
|
- * context was last active, which we can determine by
|
|
|
- * comparing counter->tstamp_stopped with ctx->time.
|
|
|
- *
|
|
|
- * We are within an RCU read-side critical section,
|
|
|
- * which protects the existence of *ctx.
|
|
|
+ * The counter is inactive, if the context is active
|
|
|
+ * we're part of a group that didn't make it on the 'pmu',
|
|
|
+ * not counting.
|
|
|
*/
|
|
|
- ctx = counter->ctx;
|
|
|
- spin_lock_irqsave(&ctx->lock, flags);
|
|
|
- count = 1;
|
|
|
- /* Re-check state now we have the lock */
|
|
|
- if (counter->state < PERF_COUNTER_STATE_INACTIVE ||
|
|
|
- counter->ctx->is_active ||
|
|
|
- counter->tstamp_stopped < ctx->time)
|
|
|
- count = 0;
|
|
|
- spin_unlock_irqrestore(&ctx->lock, flags);
|
|
|
- return count;
|
|
|
+ if (counter->ctx->is_active)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We're inactive and the context is too, this means the
|
|
|
+ * task is scheduled out, we're counting events that happen
|
|
|
+ * to us, like migration events.
|
|
|
+ */
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
static int perf_swcounter_match(struct perf_counter *counter,
|