Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b6e5486 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

perf_counter: use misc field to widen type



Push the PERF_EVENT_COUNTER_OVERFLOW bit into the misc field so that
we can have the full 32bit for PERF_RECORD_ bits.

Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
LKML-Reference: <20090408130408.891867663@chello.nl>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 6fab0192
Loading
Loading
Loading
Loading
+10 −18
Original line number Diff line number Diff line
@@ -203,6 +203,7 @@ struct perf_counter_mmap_page {

#define PERF_EVENT_MISC_KERNEL		(1 << 0)
#define PERF_EVENT_MISC_USER		(1 << 1)
#define PERF_EVENT_MISC_OVERFLOW	(1 << 2)

struct perf_event_header {
	__u32	type;
@@ -230,36 +231,27 @@ enum perf_event_type {
	PERF_EVENT_MUNMAP		= 2,

	/*
	 * Half the event type space is reserved for the counter overflow
	 * bitfields, as found in hw_event.record_type.
	 *
	 * These events will have types of the form:
	 *   PERF_EVENT_COUNTER_OVERFLOW { | __PERF_EVENT_* } *
	 * When header.misc & PERF_EVENT_MISC_OVERFLOW the event_type field
	 * will be PERF_RECORD_*
	 *
	 * struct {
	 * 	struct perf_event_header	header;
	 *
	 * 	{ u64			ip;	  } && __PERF_EVENT_IP
	 * 	{ u32			pid, tid; } && __PERF_EVENT_TID
	 * 	{ u64			ip;	  } && PERF_RECORD_IP
	 * 	{ u32			pid, tid; } && PERF_RECORD_TID
	 *
	 * 	{ u64			nr;
	 * 	  { u64 event, val; } 	cnt[nr];  } && __PERF_EVENT_GROUP
	 * 	  { u64 event, val; } 	cnt[nr];  } && PERF_RECORD_GROUP
	 *
	 * 	{ u16			nr,
	 * 				hv,
	 * 				kernel,
	 * 				user;
	 * 	  u64			ips[nr];  } && __PERF_EVENT_CALLCHAIN
	 * 	  u64			ips[nr];  } && PERF_RECORD_CALLCHAIN
	 *
	 * 	{ u64			time;     } && __PERF_EVENT_TIME
	 * 	{ u64			time;     } && PERF_RECORD_TIME
	 * };
	 */
	PERF_EVENT_COUNTER_OVERFLOW	= 1UL << 31,
	__PERF_EVENT_IP			= PERF_RECORD_IP,
	__PERF_EVENT_TID		= PERF_RECORD_TID,
	__PERF_EVENT_GROUP		= PERF_RECORD_GROUP,
	__PERF_EVENT_CALLCHAIN		= PERF_RECORD_CALLCHAIN,
	__PERF_EVENT_TIME		= PERF_RECORD_TIME,
};

#ifdef __KERNEL__
+8 −7
Original line number Diff line number Diff line
@@ -1828,15 +1828,16 @@ static void perf_counter_output(struct perf_counter *counter,
	int callchain_size = 0;
	u64 time;

	header.type = PERF_EVENT_COUNTER_OVERFLOW;
	header.type = 0;
	header.size = sizeof(header);

	header.misc = user_mode(regs) ?
	header.misc = PERF_EVENT_MISC_OVERFLOW;
	header.misc |= user_mode(regs) ?
		PERF_EVENT_MISC_USER : PERF_EVENT_MISC_KERNEL;

	if (record_type & PERF_RECORD_IP) {
		ip = instruction_pointer(regs);
		header.type |= __PERF_EVENT_IP;
		header.type |= PERF_RECORD_IP;
		header.size += sizeof(ip);
	}

@@ -1845,12 +1846,12 @@ static void perf_counter_output(struct perf_counter *counter,
		tid_entry.pid = current->group_leader->pid;
		tid_entry.tid = current->pid;

		header.type |= __PERF_EVENT_TID;
		header.type |= PERF_RECORD_TID;
		header.size += sizeof(tid_entry);
	}

	if (record_type & PERF_RECORD_GROUP) {
		header.type |= __PERF_EVENT_GROUP;
		header.type |= PERF_RECORD_GROUP;
		header.size += sizeof(u64) +
			counter->nr_siblings * sizeof(group_entry);
	}
@@ -1861,7 +1862,7 @@ static void perf_counter_output(struct perf_counter *counter,
		if (callchain) {
			callchain_size = (1 + callchain->nr) * sizeof(u64);

			header.type |= __PERF_EVENT_CALLCHAIN;
			header.type |= PERF_RECORD_CALLCHAIN;
			header.size += callchain_size;
		}
	}
@@ -1872,7 +1873,7 @@ static void perf_counter_output(struct perf_counter *counter,
		 */
		time = sched_clock();

		header.type |= __PERF_EVENT_TIME;
		header.type |= PERF_RECORD_TIME;
		header.size += sizeof(u64);
	}