Commit 0f60a0bc authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge tag 'perf-urgent-for-mingo-5.5-20191205' of...

Merge tag 'perf-urgent-for-mingo-5.5-20191205' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux

 into perf/urgent

Pull perf fixes from Arnaldo Carvalho de Melo:

perf inject:

  Adrian Hunter:

  - Fix processing of ID index for injected instruction tracing

perf report:

  Ravi Bangoria:

  - Replace pr_err() with ui__error(), so that we can see the output
    in the TUI mode instead of showing and immediately restoring the
    screen to the state before perf was started.

  - Don't start --mem-mode/--branch-mode mode if required samples are not
    available.

tools headers UAPI:

  Arnaldo Carvalho de Melo:

  - Sync drm/i915_drm.h with the kernel sources

  - Update tools's copy of drm.h headers.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 9f58c93e fd9bee5e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -778,11 +778,12 @@ struct drm_syncobj_array {
	__u32 pad;
};

#define DRM_SYNCOBJ_QUERY_FLAGS_LAST_SUBMITTED (1 << 0) /* last available point on timeline syncobj */
struct drm_syncobj_timeline_array {
	__u64 handles;
	__u64 points;
	__u32 count_handles;
	__u32 pad;
	__u32 flags;
};


+125 −3
Original line number Diff line number Diff line
@@ -611,6 +611,13 @@ typedef struct drm_i915_irq_wait {
 * See I915_EXEC_FENCE_OUT and I915_EXEC_FENCE_SUBMIT.
 */
#define I915_PARAM_HAS_EXEC_SUBMIT_FENCE 53

/*
 * Revision of the i915-perf uAPI. The value returned helps determine what
 * i915-perf features are available. See drm_i915_perf_property_id.
 */
#define I915_PARAM_PERF_REVISION	54

/* Must be kept compact -- no holes and well documented */

typedef struct drm_i915_getparam {
@@ -1565,6 +1572,21 @@ struct drm_i915_gem_context_param {
 *   i915_context_engines_bond (I915_CONTEXT_ENGINES_EXT_BOND)
 */
#define I915_CONTEXT_PARAM_ENGINES	0xa

/*
 * I915_CONTEXT_PARAM_PERSISTENCE:
 *
 * Allow the context and active rendering to survive the process until
 * completion. Persistence allows fire-and-forget clients to queue up a
 * bunch of work, hand the output over to a display server and then quit.
 * If the context is marked as not persistent, upon closing (either via
 * an explicit DRM_I915_GEM_CONTEXT_DESTROY or implicitly from file closure
 * or process termination), the context and any outstanding requests will be
 * cancelled (and exported fences for cancelled requests marked as -EIO).
 *
 * By default, new contexts allow persistence.
 */
#define I915_CONTEXT_PARAM_PERSISTENCE	0xb
/* Must be kept compact -- no holes and well documented */

	__u64 value;
@@ -1844,23 +1866,31 @@ enum drm_i915_perf_property_id {
	 * Open the stream for a specific context handle (as used with
	 * execbuffer2). A stream opened for a specific context this way
	 * won't typically require root privileges.
	 *
	 * This property is available in perf revision 1.
	 */
	DRM_I915_PERF_PROP_CTX_HANDLE = 1,

	/**
	 * A value of 1 requests the inclusion of raw OA unit reports as
	 * part of stream samples.
	 *
	 * This property is available in perf revision 1.
	 */
	DRM_I915_PERF_PROP_SAMPLE_OA,

	/**
	 * The value specifies which set of OA unit metrics should be
	 * be configured, defining the contents of any OA unit reports.
	 *
	 * This property is available in perf revision 1.
	 */
	DRM_I915_PERF_PROP_OA_METRICS_SET,

	/**
	 * The value specifies the size and layout of OA unit reports.
	 *
	 * This property is available in perf revision 1.
	 */
	DRM_I915_PERF_PROP_OA_FORMAT,

@@ -1870,9 +1900,22 @@ enum drm_i915_perf_property_id {
	 * from this exponent as follows:
	 *
	 *   80ns * 2^(period_exponent + 1)
	 *
	 * This property is available in perf revision 1.
	 */
	DRM_I915_PERF_PROP_OA_EXPONENT,

	/**
	 * Specifying this property is only valid when specify a context to
	 * filter with DRM_I915_PERF_PROP_CTX_HANDLE. Specifying this property
	 * will hold preemption of the particular context we want to gather
	 * performance data about. The execbuf2 submissions must include a
	 * drm_i915_gem_execbuffer_ext_perf parameter for this to apply.
	 *
	 * This property is available in perf revision 3.
	 */
	DRM_I915_PERF_PROP_HOLD_PREEMPTION,

	DRM_I915_PERF_PROP_MAX /* non-ABI */
};

@@ -1901,6 +1944,8 @@ struct drm_i915_perf_open_param {
 * to close and re-open a stream with the same configuration.
 *
 * It's undefined whether any pending data for the stream will be lost.
 *
 * This ioctl is available in perf revision 1.
 */
#define I915_PERF_IOCTL_ENABLE	_IO('i', 0x0)

@@ -1908,9 +1953,24 @@ struct drm_i915_perf_open_param {
 * Disable data capture for a stream.
 *
 * It is an error to try and read a stream that is disabled.
 *
 * This ioctl is available in perf revision 1.
 */
#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
 */
@@ -1984,6 +2044,7 @@ struct drm_i915_query_item {
	__u64 query_id;
#define DRM_I915_QUERY_TOPOLOGY_INFO    1
#define DRM_I915_QUERY_ENGINE_INFO	2
#define DRM_I915_QUERY_PERF_CONFIG      3
/* Must be kept compact -- no holes and well documented */

	/*
@@ -1995,9 +2056,18 @@ struct drm_i915_query_item {
	__s32 length;

	/*
	 * Unused for now. Must be cleared to zero.
	 * When query_id == DRM_I915_QUERY_TOPOLOGY_INFO, must be 0.
	 *
	 * When query_id == DRM_I915_QUERY_PERF_CONFIG, must be one of the
	 * following :
	 *         - DRM_I915_QUERY_PERF_CONFIG_LIST
	 *         - DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_UUID
	 *         - DRM_I915_QUERY_PERF_CONFIG_FOR_UUID
	 */
	__u32 flags;
#define DRM_I915_QUERY_PERF_CONFIG_LIST          1
#define DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_UUID 2
#define DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_ID   3

	/*
	 * Data will be written at the location pointed by data_ptr when the
@@ -2033,8 +2103,10 @@ struct drm_i915_query {
 *           (data[X / 8] >> (X % 8)) & 1
 *
 * - the subslice mask for each slice with one bit per subslice telling
 *   whether a subslice is available. The availability of subslice Y in slice
 *   X can be queried with the following formula :
 *   whether a subslice is available. Gen12 has dual-subslices, which are
 *   similar to two gen11 subslices. For gen12, this array represents dual-
 *   subslices. The availability of subslice Y in slice X can be queried
 *   with the following formula :
 *
 *           (data[subslice_offset +
 *                 X * subslice_stride +
@@ -2123,6 +2195,56 @@ struct drm_i915_query_engine_info {
	struct drm_i915_engine_info engines[];
};

/*
 * Data written by the kernel with query DRM_I915_QUERY_PERF_CONFIG.
 */
struct drm_i915_query_perf_config {
	union {
		/*
		 * When query_item.flags == DRM_I915_QUERY_PERF_CONFIG_LIST, i915 sets
		 * this fields to the number of configurations available.
		 */
		__u64 n_configs;

		/*
		 * When query_id == DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_ID,
		 * i915 will use the value in this field as configuration
		 * identifier to decide what data to write into config_ptr.
		 */
		__u64 config;

		/*
		 * When query_id == DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_UUID,
		 * i915 will use the value in this field as configuration
		 * identifier to decide what data to write into config_ptr.
		 *
		 * String formatted like "%08x-%04x-%04x-%04x-%012x"
		 */
		char uuid[36];
	};

	/*
	 * Unused for now. Must be cleared to zero.
	 */
	__u32 flags;

	/*
	 * When query_item.flags == DRM_I915_QUERY_PERF_CONFIG_LIST, i915 will
	 * write an array of __u64 of configuration identifiers.
	 *
	 * When query_item.flags == DRM_I915_QUERY_PERF_CONFIG_DATA, i915 will
	 * write a struct drm_i915_perf_oa_config. If the following fields of
	 * drm_i915_perf_oa_config are set not set to 0, i915 will write into
	 * the associated pointers the values of submitted when the
	 * configuration was created :
	 *
	 *         - n_mux_regs
	 *         - n_boolean_regs
	 *         - n_flex_regs
	 */
	__u8 data[];
};

#if defined(__cplusplus)
}
#endif
+1 −12
Original line number Diff line number Diff line
@@ -403,17 +403,6 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,
	return err;
}

static int perf_event__repipe_id_index(struct perf_session *session,
				       union perf_event *event)
{
	int err;

	perf_event__repipe_synth(session->tool, event);
	err = perf_event__process_id_index(session, event);

	return err;
}

static int dso__read_build_id(struct dso *dso)
{
	if (dso->has_build_id)
@@ -651,7 +640,7 @@ static int __cmd_inject(struct perf_inject *inject)
		inject->tool.comm	    = perf_event__repipe_comm;
		inject->tool.namespaces	    = perf_event__repipe_namespaces;
		inject->tool.exit	    = perf_event__repipe_exit;
		inject->tool.id_index	    = perf_event__repipe_id_index;
		inject->tool.id_index	    = perf_event__process_id_index;
		inject->tool.auxtrace_info  = perf_event__process_auxtrace_info;
		inject->tool.auxtrace	    = perf_event__process_auxtrace;
		inject->tool.aux	    = perf_event__drop_aux;
+8 −0
Original line number Diff line number Diff line
@@ -388,6 +388,14 @@ static int report__setup_sample_type(struct report *rep)
		}
	}

	if (sort__mode == SORT_MODE__MEMORY) {
		if (!is_pipe && !(sample_type & PERF_SAMPLE_DATA_SRC)) {
			ui__error("Selected --mem-mode but no mem data. "
				  "Did you call perf record without -d?\n");
			return -1;
		}
	}

	if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) {
		if ((sample_type & PERF_SAMPLE_REGS_USER) &&
		    (sample_type & PERF_SAMPLE_STACK_USER)) {
+11 −5
Original line number Diff line number Diff line
@@ -2681,12 +2681,12 @@ static int setup_sort_list(struct perf_hpp_list *list, char *str,
			ret = sort_dimension__add(list, tok, evlist, level);
			if (ret == -EINVAL) {
				if (!cacheline_size() && !strncasecmp(tok, "dcacheline", strlen(tok)))
					pr_err("The \"dcacheline\" --sort key needs to know the cacheline size and it couldn't be determined on this system");
					ui__error("The \"dcacheline\" --sort key needs to know the cacheline size and it couldn't be determined on this system");
				else
					pr_err("Invalid --sort key: `%s'", tok);
					ui__error("Invalid --sort key: `%s'", tok);
				break;
			} else if (ret == -ESRCH) {
				pr_err("Unknown --sort key: `%s'", tok);
				ui__error("Unknown --sort key: `%s'", tok);
				break;
			}
		}
@@ -2743,7 +2743,7 @@ static int setup_sort_order(struct evlist *evlist)
		return 0;

	if (sort_order[1] == '\0') {
		pr_err("Invalid --sort key: `+'");
		ui__error("Invalid --sort key: `+'");
		return -EINVAL;
	}

@@ -2959,6 +2959,9 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
		if (strncasecmp(tok, sd->name, strlen(tok)))
			continue;

		if (sort__mode != SORT_MODE__MEMORY)
			return -EINVAL;

		return __sort_dimension__add_output(list, sd);
	}

@@ -2968,6 +2971,9 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
		if (strncasecmp(tok, sd->name, strlen(tok)))
			continue;

		if (sort__mode != SORT_MODE__BRANCH)
			return -EINVAL;

		return __sort_dimension__add_output(list, sd);
	}

@@ -3034,7 +3040,7 @@ static int __setup_output_field(void)
		strp++;

	if (!strlen(strp)) {
		pr_err("Invalid --fields key: `+'");
		ui__error("Invalid --fields key: `+'");
		goto out;
	}