X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/ff6e181ae92fc6f1e89841290f461d1f2f9badd9..fe8ab488e9161c46dd9885d58fc52996dc0249ff:/osfmk/kern/processor_data.h diff --git a/osfmk/kern/processor_data.h b/osfmk/kern/processor_data.h index c497974a8..da90d7b40 100644 --- a/osfmk/kern/processor_data.h +++ b/osfmk/kern/processor_data.h @@ -1,14 +1,19 @@ /* - * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2003-2009 Apple Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER @@ -18,7 +23,7 @@ * Please see the License for the specific language governing rights and * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * Machine independent per processor data. @@ -36,15 +41,30 @@ #include #include +struct processor_sched_statistics { + uint32_t csw_count; + uint32_t preempt_count; + uint32_t preempted_rt_count; + uint32_t preempted_by_rt_count; + uint32_t rt_sched_count; + uint32_t interrupt_count; + uint32_t ipi_count; + uint32_t timer_pop_count; + uint32_t idle_transitions; + uint32_t quantum_timer_expirations; +}; + struct processor_data { /* Processor state statistics */ - integer_t cpu_ticks[CPU_STATE_MAX]; + timer_data_t idle_state; + timer_data_t system_state; + timer_data_t user_state; + + timer_t current_state; -#if !STAT_TIME - /* Current execution timer */ - timer_t current_timer; - timer_data_t offline_timer; -#endif /* STAT_TIME */ + /* Thread execution timers */ + timer_t thread_timer; + timer_t kernel_timer; /* Kernel stack cache */ struct stack_cache { @@ -52,11 +72,8 @@ struct processor_data { unsigned int count; } stack_cache; - /* Pending timer callouts */ - queue_head_t timer_call_queue; - /* VM event counters */ - vm_statistics_data_t vm_stat; + vm_statistics64_data_t vm_stat; /* IPC free message cache */ struct ikm_cache { @@ -64,8 +81,14 @@ struct processor_data { ipc_kmsg_t entries[IKM_STASH]; unsigned int avail; } ikm_cache; - - int slot_num; + int start_color; + unsigned long page_grab_count; + void *free_pages; + struct processor_sched_statistics sched_stats; + uint64_t timer_call_ttd; /* current timer call time-to-deadline */ + uint64_t wakeups_issued_total; /* Count of thread wakeups issued + * by this processor + */ }; typedef struct processor_data processor_data_t; @@ -76,6 +99,41 @@ typedef struct processor_data processor_data_t; extern void processor_data_init( processor_t processor); +#define SCHED_STATS_INTERRUPT(p) \ +MACRO_BEGIN \ + if (__builtin_expect(sched_stats_active, 0)) { \ + (p)->processor_data.sched_stats.interrupt_count++; \ + } \ +MACRO_END + +#define SCHED_STATS_TIMER_POP(p) \ +MACRO_BEGIN \ + if (__builtin_expect(sched_stats_active, 0)) { \ + (p)->processor_data.sched_stats.timer_pop_count++; \ + } \ +MACRO_END + +#define SCHED_STATS_IPI(p) \ +MACRO_BEGIN \ + if (__builtin_expect(sched_stats_active, 0)) { \ + (p)->processor_data.sched_stats.ipi_count++; \ + } \ +MACRO_END + +#define SCHED_STATS_CPU_IDLE_START(p) \ +MACRO_BEGIN \ + if (__builtin_expect(sched_stats_active, 0)) { \ + (p)->processor_data.sched_stats.idle_transitions++; \ + } \ +MACRO_END + +#define SCHED_STATS_QUANTUM_TIMER_EXPIRATION(p) \ +MACRO_BEGIN \ + if (__builtin_expect(sched_stats_active, 0)) { \ + (p)->processor_data.sched_stats.quantum_timer_expirations++; \ + } \ +MACRO_END + #endif /* MACH_KERNEL_PRIVATE */ #endif /* _KERN_PROCESSOR_DATA_H_ */