From 0426c046546140fc42db5addeb7e2298dd0b6fb1 Mon Sep 17 00:00:00 2001 From: Tvrtko Ursulin Date: Thu, 23 Nov 2017 12:34:32 +0000 Subject: [PATCH] drm/i915/pmu: Only allow running on a single CPU We do two things, both of which are purely to simplify and clarify the implementation: 1. Simplify the CPU online callback so it is more obvious that the purpose there is to set a single CPU mask bit for the first CPU which comes online. Using cpumask_weight for this reads more obvious than the trick with cpumask_and_any. 2. Modify the event init so that events can be created only on a single CPU. This removes looking at the requested CPU thread siblings, and only allows creating on the current active CPU. Signed-off-by: Tvrtko Ursulin Cc: Chris Wilson Cc: Dmitry Rogozhkin Tested-by: Chris Wilson Reviewed-by: Chris Wilson Link: https://patchwork.freedesktop.org/patch/msgid/20171123123432.25035-2-tvrtko.ursulin@linux.intel.com --- drivers/gpu/drm/i915/i915_pmu.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c index 21006e8065a0..2b7a4779f184 100644 --- a/drivers/gpu/drm/i915/i915_pmu.c +++ b/drivers/gpu/drm/i915/i915_pmu.c @@ -344,7 +344,7 @@ static int i915_pmu_event_init(struct perf_event *event) { struct drm_i915_private *i915 = container_of(event->pmu, typeof(*i915), pmu.base); - int cpu, ret; + int ret; if (event->attr.type != event->pmu->type) return -ENOENT; @@ -359,9 +359,8 @@ static int i915_pmu_event_init(struct perf_event *event) if (event->cpu < 0) return -EINVAL; - cpu = cpumask_any_and(&i915_pmu_cpumask, - topology_sibling_cpumask(event->cpu)); - if (cpu >= nr_cpu_ids) + /* only allow running on one cpu at a time */ + if (!cpumask_test_cpu(event->cpu, &i915_pmu_cpumask)) return -ENODEV; if (is_engine_event(event)) { @@ -396,7 +395,6 @@ static int i915_pmu_event_init(struct perf_event *event) if (ret) return ret; - event->cpu = cpu; if (!event->parent) event->destroy = i915_pmu_event_destroy; @@ -773,13 +771,11 @@ static const struct attribute_group *i915_pmu_attr_groups[] = { static int i915_pmu_cpu_online(unsigned int cpu, struct hlist_node *node) { struct i915_pmu *pmu = hlist_entry_safe(node, typeof(*pmu), node); - unsigned int target; GEM_BUG_ON(!pmu->base.event_init); - target = cpumask_any_and(&i915_pmu_cpumask, &i915_pmu_cpumask); /* Select the first online CPU as a designated reader. */ - if (target >= nr_cpu_ids) + if (!cpumask_weight(&i915_pmu_cpumask)) cpumask_set_cpu(cpu, &i915_pmu_cpumask); return 0; -- GitLab