[Intel-gfx] [PATCH v5 26/35] drm/i915: Added debugfs interface to scheduler tuning parameters
John Harrison
John.C.Harrison at Intel.com
Fri Mar 11 16:28:31 UTC 2016
On 23/02/2016 21:06, Jesse Barnes wrote:
> On 02/18/2016 06:27 AM, John.C.Harrison at Intel.com wrote:
>> From: John Harrison <John.C.Harrison at Intel.com>
>>
>> There are various parameters within the scheduler which can be tuned
>> to improve performance, reduce memory footprint, etc. This change adds
>> support for altering these via debugfs.
>>
>> v2: Updated for priorities now being signed values.
>>
>> v5: Squashed priority bumping entries into this patch rather than a
>> separate patch all of their own.
>>
>> For: VIZ-1587
>> Signed-off-by: John Harrison <John.C.Harrison at Intel.com>
>> ---
>> drivers/gpu/drm/i915/i915_debugfs.c | 169 ++++++++++++++++++++++++++++++++++++
>> 1 file changed, 169 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
>> index b923949..7d01c07 100644
>> --- a/drivers/gpu/drm/i915/i915_debugfs.c
>> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
>> @@ -39,6 +39,7 @@
>> #include "intel_ringbuffer.h"
>> #include <drm/i915_drm.h>
>> #include "i915_drv.h"
>> +#include "i915_scheduler.h"
>>
>> enum {
>> ACTIVE_LIST,
>> @@ -1122,6 +1123,168 @@ DEFINE_SIMPLE_ATTRIBUTE(i915_next_seqno_fops,
>> i915_next_seqno_get, i915_next_seqno_set,
>> "0x%llx\n");
>>
>> +static int
>> +i915_scheduler_priority_min_get(void *data, u64 *val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + *val = (u64) scheduler->priority_level_min;
>> + return 0;
>> +}
>> +
>> +static int
>> +i915_scheduler_priority_min_set(void *data, u64 val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + scheduler->priority_level_min = (int32_t) val;
>> + return 0;
>> +}
>> +
>> +DEFINE_SIMPLE_ATTRIBUTE(i915_scheduler_priority_min_fops,
>> + i915_scheduler_priority_min_get,
>> + i915_scheduler_priority_min_set,
>> + "%lld\n");
>> +
>> +static int
>> +i915_scheduler_priority_max_get(void *data, u64 *val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + *val = (u64) scheduler->priority_level_max;
>> + return 0;
>> +}
>> +
>> +static int
>> +i915_scheduler_priority_max_set(void *data, u64 val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + scheduler->priority_level_max = (int32_t) val;
>> + return 0;
>> +}
>> +
>> +DEFINE_SIMPLE_ATTRIBUTE(i915_scheduler_priority_max_fops,
>> + i915_scheduler_priority_max_get,
>> + i915_scheduler_priority_max_set,
>> + "%lld\n");
>> +
>> +static int
>> +i915_scheduler_priority_bump_get(void *data, u64 *val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + *val = (u64) scheduler->priority_level_bump;
>> + return 0;
>> +}
>> +
>> +static int
>> +i915_scheduler_priority_bump_set(void *data, u64 val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + scheduler->priority_level_bump = (u32) val;
>> + return 0;
>> +}
>> +
>> +DEFINE_SIMPLE_ATTRIBUTE(i915_scheduler_priority_bump_fops,
>> + i915_scheduler_priority_bump_get,
>> + i915_scheduler_priority_bump_set,
>> + "%lld\n");
>> +
>> +static int
>> +i915_scheduler_priority_preempt_get(void *data, u64 *val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + *val = (u64) scheduler->priority_level_preempt;
>> + return 0;
>> +}
>> +
>> +static int
>> +i915_scheduler_priority_preempt_set(void *data, u64 val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + scheduler->priority_level_preempt = (u32) val;
>> + return 0;
>> +}
>> +
>> +DEFINE_SIMPLE_ATTRIBUTE(i915_scheduler_priority_preempt_fops,
>> + i915_scheduler_priority_preempt_get,
>> + i915_scheduler_priority_preempt_set,
>> + "%lld\n");
>> +
>> +static int
>> +i915_scheduler_min_flying_get(void *data, u64 *val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + *val = (u64) scheduler->min_flying;
>> + return 0;
>> +}
>> +
>> +static int
>> +i915_scheduler_min_flying_set(void *data, u64 val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + scheduler->min_flying = (u32) val;
>> + return 0;
>> +}
>> +
>> +DEFINE_SIMPLE_ATTRIBUTE(i915_scheduler_min_flying_fops,
>> + i915_scheduler_min_flying_get,
>> + i915_scheduler_min_flying_set,
>> + "%llu\n");
>> +
>> +static int
>> +i915_scheduler_file_queue_max_get(void *data, u64 *val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + *val = (u64) scheduler->file_queue_max;
>> + return 0;
>> +}
>> +
>> +static int
>> +i915_scheduler_file_queue_max_set(void *data, u64 val)
>> +{
>> + struct drm_device *dev = data;
>> + struct drm_i915_private *dev_priv = dev->dev_private;
>> + struct i915_scheduler *scheduler = dev_priv->scheduler;
>> +
>> + scheduler->file_queue_max = (u32) val;
>> + return 0;
>> +}
>> +
>> +DEFINE_SIMPLE_ATTRIBUTE(i915_scheduler_file_queue_max_fops,
>> + i915_scheduler_file_queue_max_get,
>> + i915_scheduler_file_queue_max_set,
>> + "%llu\n");
>> +
>> static int i915_frequency_info(struct seq_file *m, void *unused)
>> {
>> struct drm_info_node *node = m->private;
>> @@ -5424,6 +5587,12 @@ static const struct i915_debugfs_files {
>> {"i915_gem_drop_caches", &i915_drop_caches_fops},
>> {"i915_error_state", &i915_error_state_fops},
>> {"i915_next_seqno", &i915_next_seqno_fops},
>> + {"i915_scheduler_priority_min", &i915_scheduler_priority_min_fops},
>> + {"i915_scheduler_priority_max", &i915_scheduler_priority_max_fops},
>> + {"i915_scheduler_priority_bump", &i915_scheduler_priority_bump_fops},
>> + {"i915_scheduler_priority_preempt", &i915_scheduler_priority_preempt_fops},
>> + {"i915_scheduler_min_flying", &i915_scheduler_min_flying_fops},
>> + {"i915_scheduler_file_queue_max", &i915_scheduler_file_queue_max_fops},
>> {"i915_display_crc_ctl", &i915_display_crc_ctl_fops},
>> {"i915_pri_wm_latency", &i915_pri_wm_latency_fops},
>> {"i915_spr_wm_latency", &i915_spr_wm_latency_fops},
>>
> Do these need to be serialized at all? I guess some raciness doesn't hurt too much for these guys, unless somehow an inconsistent set of values would cause a livelock in the scheduler or something.
Serialised with what? Each other or the scheduler operation? Neither
should be necessary. The scheduler will read the current values whenever
it tests against one of these limits. If multiple are being changed
while the system is busy, it doesn't really matter. They are just tuning
values and best guesses type of numbers not array indices or other
things that would cause kernel panics if you got them wrong. E.g. if you
set the max file queue depth to smaller than the current queue contents
that just means you won't be able to submit more stuff until the queue
has drained - which is presumably the intended result of lowering the
max queue value anyway. The queue won't leak the extra entries or get
into an inconsistent state.
>
> If not,
> Reviewed-by: Jesse Barnes <jbarnes at virtuousgeek.org>
More information about the Intel-gfx
mailing list