drm/i915/perf: Allow dynamic reconfiguration of the OA stream
Introduce a new perf_ioctl command to change the OA configuration of the active stream. This allows the OA stream to be reconfigured between batch buffers, giving greater flexibility in sampling. We inject a request into the OA context to reconfigure the stream asynchronously on the GPU in between and ordered with execbuffer calls. Original patch for dynamic reconfiguration by Lionel Landwerlin. Link: https://gitlab.freedesktop.org/mesa/mesa/merge_requests/932 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20191014201404.22468-3-chris@chris-wilson.co.uk
This commit is contained in:
		
							parent
							
								
									4f6ccc74a8
								
							
						
					
					
						commit
						7831e9a965
					
				| @ -2862,6 +2862,40 @@ static void i915_perf_disable_locked(struct i915_perf_stream *stream) | |||||||
| 		stream->ops->disable(stream); | 		stream->ops->disable(stream); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static long i915_perf_config_locked(struct i915_perf_stream *stream, | ||||||
|  | 				    unsigned long metrics_set) | ||||||
|  | { | ||||||
|  | 	struct i915_oa_config *config; | ||||||
|  | 	long ret = stream->oa_config->id; | ||||||
|  | 
 | ||||||
|  | 	config = i915_perf_get_oa_config(stream->perf, metrics_set); | ||||||
|  | 	if (!config) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	if (config != stream->oa_config) { | ||||||
|  | 		int err; | ||||||
|  | 
 | ||||||
|  | 		/*
 | ||||||
|  | 		 * If OA is bound to a specific context, emit the | ||||||
|  | 		 * reconfiguration inline from that context. The update | ||||||
|  | 		 * will then be ordered with respect to submission on that | ||||||
|  | 		 * context. | ||||||
|  | 		 * | ||||||
|  | 		 * When set globally, we use a low priority kernel context, | ||||||
|  | 		 * so it will effectively take effect when idle. | ||||||
|  | 		 */ | ||||||
|  | 		err = emit_oa_config(stream, oa_context(stream)); | ||||||
|  | 		if (err == 0) | ||||||
|  | 			config = xchg(&stream->oa_config, config); | ||||||
|  | 		else | ||||||
|  | 			ret = err; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	i915_oa_config_put(config); | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * i915_perf_ioctl - support ioctl() usage with i915 perf stream FDs |  * i915_perf_ioctl - support ioctl() usage with i915 perf stream FDs | ||||||
|  * @stream: An i915 perf stream |  * @stream: An i915 perf stream | ||||||
| @ -2885,6 +2919,8 @@ static long i915_perf_ioctl_locked(struct i915_perf_stream *stream, | |||||||
| 	case I915_PERF_IOCTL_DISABLE: | 	case I915_PERF_IOCTL_DISABLE: | ||||||
| 		i915_perf_disable_locked(stream); | 		i915_perf_disable_locked(stream); | ||||||
| 		return 0; | 		return 0; | ||||||
|  | 	case I915_PERF_IOCTL_CONFIG: | ||||||
|  | 		return i915_perf_config_locked(stream, arg); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return -EINVAL; | 	return -EINVAL; | ||||||
| @ -4023,7 +4059,15 @@ void i915_perf_fini(struct drm_i915_private *i915) | |||||||
|  */ |  */ | ||||||
| int i915_perf_ioctl_version(void) | int i915_perf_ioctl_version(void) | ||||||
| { | { | ||||||
| 	return 1; | 	/*
 | ||||||
|  | 	 * 1: Initial version | ||||||
|  | 	 *   I915_PERF_IOCTL_ENABLE | ||||||
|  | 	 *   I915_PERF_IOCTL_DISABLE | ||||||
|  | 	 * | ||||||
|  | 	 * 2: Added runtime modification of OA config. | ||||||
|  | 	 *   I915_PERF_IOCTL_CONFIG | ||||||
|  | 	 */ | ||||||
|  | 	return 2; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) | #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) | ||||||
|  | |||||||
| @ -1932,6 +1932,19 @@ struct drm_i915_perf_open_param { | |||||||
|  */ |  */ | ||||||
| #define I915_PERF_IOCTL_DISABLE	_IO('i', 0x1) | #define I915_PERF_IOCTL_DISABLE	_IO('i', 0x1) | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Change metrics_set captured by a stream. | ||||||
|  |  * | ||||||
|  |  * If the stream is bound to a specific context, the configuration change | ||||||
|  |  * will performed inline with that context such that it takes effect before | ||||||
|  |  * the next execbuf submission. | ||||||
|  |  * | ||||||
|  |  * Returns the previously bound metrics set id, or a negative error code. | ||||||
|  |  * | ||||||
|  |  * This ioctl is available in perf revision 2. | ||||||
|  |  */ | ||||||
|  | #define I915_PERF_IOCTL_CONFIG	_IO('i', 0x2) | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Common to all i915 perf records |  * Common to all i915 perf records | ||||||
|  */ |  */ | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user