#ifndef _ASM_POWERPC_DTL_H #define _ASM_POWERPC_DTL_H #include <asm/lppaca.h> #include <linux/spinlock_types.h> /* * Layout of entries in the hypervisor's dispatch trace log buffer. */ struct dtl_entry { u8 dispatch_reason; u8 preempt_reason; __be16 processor_id; __be32 enqueue_to_dispatch_time; __be32 ready_to_enqueue_time; __be32 waiting_to_ready_time; __be64 timebase; __be64 fault_addr; __be64 srr0; __be64 srr1; }; #define DISPATCH_LOG_BYTES 4096 /* bytes per cpu */ #define N_DISPATCH_LOG (DISPATCH_LOG_BYTES / sizeof(struct dtl_entry)) /* * Dispatch trace log event enable mask: * 0x1: voluntary virtual processor waits * 0x2: time-slice preempts * 0x4: virtual partition memory page faults */ #define DTL_LOG_CEDE 0x1 #define DTL_LOG_PREEMPT 0x2 #define DTL_LOG_FAULT 0x4 #define DTL_LOG_ALL (DTL_LOG_CEDE | DTL_LOG_PREEMPT | DTL_LOG_FAULT) extern struct kmem_cache *dtl_cache; extern rwlock_t dtl_access_lock; /* * When CONFIG_VIRT_CPU_ACCOUNTING_NATIVE = y, the cpu accounting code controls * reading from the dispatch trace log. If other code wants to consume * DTL entries, it can set this pointer to a function that will get * called once for each DTL entry that gets processed. */ extern void (*dtl_consumer)(struct dtl_entry *entry, u64 index); extern void register_dtl_buffer(int cpu); extern void alloc_dtl_buffers(unsigned long *time_limit); extern long hcall_vphn(unsigned long cpu, u64 flags, __be32 *associativity); #endif /* _ASM_POWERPC_DTL_H */