[Intel-gfx] [CI 2/9] drm/i915/pmu: Expose a PMU interface for perf queries

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri Dec 1 09:51:16 UTC 2017


On 01/12/2017 01:01, Rodrigo Vivi wrote:
> On Tue, Nov 21, 2017 at 06:18:45PM +0000, Tvrtko Ursulin wrote:
>> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>
>> From: Chris Wilson <chris at chris-wilson.co.uk>
>> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>> From: Dmitry Rogozhkin <dmitry.v.rogozhkin at intel.com>
>>
>> The first goal is to be able to measure GPU (and invidual ring) busyness
>> without having to poll registers from userspace. (Which not only incurs
>> holding the forcewake lock indefinitely, perturbing the system, but also
>> runs the risk of hanging the machine.) As an alternative we can use the
>> perf event counter interface to sample the ring registers periodically
>> and send those results to userspace.
>>
>> Functionality we are exporting to userspace is via the existing perf PMU
>> API and can be exercised via the existing tools. For example:
>>
>>    perf stat -a -e i915/rcs0-busy/ -I 1000
>>
>> Will print the render engine busynnes once per second. All the performance
>> counters can be enumerated (perf list) and have their unit of measure
>> correctly reported in sysfs.

[snip]

>> +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;
>> +
>> +	if (event->attr.type != event->pmu->type)
>> +		return -ENOENT;
>> +
>> +	/* unsupported modes and filters */
>> +	if (event->attr.sample_period) /* no sampling */
>> +		return -EINVAL;
>> +
>> +	if (has_branch_stack(event))
>> +		return -EOPNOTSUPP;
>> +
>> +	if (event->cpu < 0)
>> +		return -EINVAL;
>> +
>> +	cpu = cpumask_any_and(&i915_pmu_cpumask,
>> +			      topology_sibling_cpumask(event->cpu));
>> +	if (cpu >= nr_cpu_ids)
>> +		return -ENODEV;
>> +
>> +	if (is_engine_event(event)) {
>> +		ret = engine_event_init(event);
>> +	} else {
>> +		ret = 0;
>> +		switch (event->attr.config) {
>> +		case I915_PMU_ACTUAL_FREQUENCY:
>> +			if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915))
>> +				 /* Requires a mutex for sampling! */
>> +				ret = -ENODEV;
> 
> Dummy random question...
> Is the missing break here intentional?
> on PMU_ACTUAL_FREQ we should return -ENODEV to gen < 6 || vlv || chv ?

I am not expert on pre-Gen6, but AFAICS yes, none of the frequency code 
paths seem to be active on those platforms. Was there some alternative 
way of managing frequencies back then, which would make some reporting 
still possible? I can't spot anything - Chris?

Regards,

Tvrtko


More information about the Intel-gfx mailing list