Messages in this thread Patch in this message | | | Subject | Re: [RFC][PATCH 1/4] perf: core, add group scheduling transactional APIs | From | Lin Ming <> | Date | Thu, 22 Apr 2010 17:19:02 +0800 |
| |
On Thu, 2010-04-22 at 16:24 +0800, Peter Zijlstra wrote: > On Thu, 2010-04-22 at 15:51 +0800, Lin Ming wrote: > > + if (pmu->commit_txn) { > > + ret = pmu->commit_txn(pmu); > > + if (!ret) { > > + if (pmu->stop_txn) > > + pmu->stop_txn(pmu); > > + > > + return 0; > > + } > > + } > > I think we can mandate that if one of the _txn methods is available, > they all are, it would be weird otherwise. >
How about below?
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index ffd2360..72ea25c 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c @@ -635,12 +635,16 @@ group_sched_in(struct perf_event *group_event, { struct perf_event *event, *partial_group = NULL; const struct pmu *pmu = group_event->pmu; + bool txn = false; int ret; if (group_event->state == PERF_EVENT_STATE_OFF) return 0; if (pmu->start_txn) + txn = true; + + if (txn) pmu->start_txn(pmu); if (event_sched_in(group_event, cpuctx, ctx)) @@ -656,18 +660,17 @@ group_sched_in(struct perf_event *group_event, } } - if (pmu->commit_txn) { + if (txn) { ret = pmu->commit_txn(pmu); if (!ret) { - if (pmu->stop_txn) - pmu->stop_txn(pmu); + pmu->stop_txn(pmu); return 0; } } group_error: - if (pmu->stop_txn) + if (txn) pmu->stop_txn(pmu); /*
| |