mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Allow callers to get the ordered_events last flush timestamp. This is needed in perf inject to obey finished-round ordering when injecting additional events (e.g. from a guest perf.data file) with timestamps. Any additional events that have timestamps before the last flush time must be injected before the corresponding FINISHED_ROUND event. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Acked-by: Ian Rogers <irogers@google.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: kvm@vger.kernel.org Link: https://lore.kernel.org/r/20220711093218.10967-4-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
			
				
	
	
		
			84 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
#ifndef __ORDERED_EVENTS_H
 | 
						|
#define __ORDERED_EVENTS_H
 | 
						|
 | 
						|
#include <linux/types.h>
 | 
						|
 | 
						|
struct perf_sample;
 | 
						|
 | 
						|
struct ordered_event {
 | 
						|
	u64			timestamp;
 | 
						|
	u64			file_offset;
 | 
						|
	const char		*file_path;
 | 
						|
	union perf_event	*event;
 | 
						|
	struct list_head	list;
 | 
						|
};
 | 
						|
 | 
						|
enum oe_flush {
 | 
						|
	OE_FLUSH__NONE,
 | 
						|
	OE_FLUSH__FINAL,
 | 
						|
	OE_FLUSH__ROUND,
 | 
						|
	OE_FLUSH__HALF,
 | 
						|
	OE_FLUSH__TOP,
 | 
						|
	OE_FLUSH__TIME,
 | 
						|
};
 | 
						|
 | 
						|
struct ordered_events;
 | 
						|
 | 
						|
typedef int (*ordered_events__deliver_t)(struct ordered_events *oe,
 | 
						|
					 struct ordered_event *event);
 | 
						|
 | 
						|
struct ordered_events_buffer {
 | 
						|
	struct list_head	list;
 | 
						|
	struct ordered_event	event[];
 | 
						|
};
 | 
						|
 | 
						|
struct ordered_events {
 | 
						|
	u64				 last_flush;
 | 
						|
	u64				 next_flush;
 | 
						|
	u64				 max_timestamp;
 | 
						|
	u64				 max_alloc_size;
 | 
						|
	u64				 cur_alloc_size;
 | 
						|
	struct list_head		 events;
 | 
						|
	struct list_head		 cache;
 | 
						|
	struct list_head		 to_free;
 | 
						|
	struct ordered_events_buffer	*buffer;
 | 
						|
	struct ordered_event		*last;
 | 
						|
	ordered_events__deliver_t	 deliver;
 | 
						|
	int				 buffer_idx;
 | 
						|
	unsigned int			 nr_events;
 | 
						|
	enum oe_flush			 last_flush_type;
 | 
						|
	u32				 nr_unordered_events;
 | 
						|
	bool				 copy_on_queue;
 | 
						|
	void				*data;
 | 
						|
};
 | 
						|
 | 
						|
int ordered_events__queue(struct ordered_events *oe, union perf_event *event,
 | 
						|
			  u64 timestamp, u64 file_offset, const char *file_path);
 | 
						|
void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event);
 | 
						|
int ordered_events__flush(struct ordered_events *oe, enum oe_flush how);
 | 
						|
int ordered_events__flush_time(struct ordered_events *oe, u64 timestamp);
 | 
						|
void ordered_events__init(struct ordered_events *oe, ordered_events__deliver_t deliver,
 | 
						|
			  void *data);
 | 
						|
void ordered_events__free(struct ordered_events *oe);
 | 
						|
void ordered_events__reinit(struct ordered_events *oe);
 | 
						|
u64 ordered_events__first_time(struct ordered_events *oe);
 | 
						|
 | 
						|
static inline
 | 
						|
void ordered_events__set_alloc_size(struct ordered_events *oe, u64 size)
 | 
						|
{
 | 
						|
	oe->max_alloc_size = size;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void ordered_events__set_copy_on_queue(struct ordered_events *oe, bool copy)
 | 
						|
{
 | 
						|
	oe->copy_on_queue = copy;
 | 
						|
}
 | 
						|
 | 
						|
static inline u64 ordered_events__last_flush_time(struct ordered_events *oe)
 | 
						|
{
 | 
						|
	return oe->last_flush;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* __ORDERED_EVENTS_H */
 |