Prev: [RFC][PATCH v2 03/11] perf: x86, implement pmu::init_event
Next: [RFC][PATCH v2 05/11] perf: x86, remove hw_perf_event_init
From: Lin Ming on 18 May 2010 13:50 Add another pmu lookup method via sysfs. Now we have 2 methods: type->pmu and sys_fd->pmu Changes log, Lookup pmu via sysfs (Ingo Molnar) Signed-off-by: Lin Ming <ming.m.lin(a)intel.com> --- kernel/perf_event.c | 33 ++++++++++++++++++++++++++++++++- 1 files changed, 32 insertions(+), 1 deletions(-) diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 8640610..0ab4a8b 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c @@ -4680,7 +4680,7 @@ static struct pmu *sw_perf_event_init(struct perf_event *event) return pmu; } -static struct pmu *perf_event_lookup_pmu(struct perf_event *event) +static struct pmu *perf_event_lookup_pmu_by_type(struct perf_event *event) { struct pmu *pmu = NULL; int pmu_id = PERF_EVENT_ATTR_TYPE(&event->attr); @@ -4708,6 +4708,37 @@ static struct pmu *perf_event_lookup_pmu(struct perf_event *event) return pmu; } +static struct pmu *perf_event_lookup_pmu_by_fd(struct perf_event *event) +{ + struct pmu *pmu = NULL; + struct kobject *kobj; + int sys_fd = PERF_EVENT_ATTR_FD(&event->attr); + struct file *file; + int fput_needed; + + file = fget_light(sys_fd, &fput_needed); + if (!file) + return NULL; + + kobj = sysfs_get_kobject(file); + if (kobj) + pmu = container_of(kobj, struct pmu, kobj); + + fput_light(file, fput_needed); + + return pmu; +} + +static struct pmu *perf_event_lookup_pmu(struct perf_event *event) +{ + u32 type = event->attr.type; + + if (type & PERF_EVENT_FD) + return perf_event_lookup_pmu_by_fd(event); + else + return perf_event_lookup_pmu_by_type(event); +} + /* * Allocate and initialize a event structure */ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |