blob: e991f131f33cf63a3a1750b7dc75a06da7b1252c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2015 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alexandre Montplaisir - Initial API and implementation
******************************************************************************/
package org.eclipse.tracecompass.analysis.os.linux.core.trace;
import java.util.Collection;
import java.util.Collections;
import org.eclipse.jdt.annotation.Nullable;
/**
* Interface to define "concepts" present in the Linux kernel (represented by
* its tracepoints), that can then be exposed by different tracers under
* different names.
*
* @author Alexandre Montplaisir
* @author Matthew Khouzam - Javadoc
*/
public interface IKernelAnalysisEventLayout {
// ------------------------------------------------------------------------
// Common definitions
// ------------------------------------------------------------------------
/**
* Whenever a process appears for the first time in a trace, we assume it
* starts inside this system call. (The syscall prefix is defined by the
* implementer of this interface.)
*
* TODO Change to a default method with Java 8?
*/
String INITIAL_SYSCALL_NAME = "clone"; //$NON-NLS-1$
// ------------------------------------------------------------------------
// Event names
// ------------------------------------------------------------------------
/**
* The system has just entered an interrupt handler or interrupt service
* routine. On some systems, this is known as the first level interrupt
* handler.
*
* @return the event name
*/
String eventIrqHandlerEntry();
/**
* The system will soon return from an interrupt handler or interrupt
* service routine.
*
* @return the event name
*/
String eventIrqHandlerExit();
/**
* Whenever a system call is about to return to userspace, or a hardware
* interrupt handler exits, any 'software interrupts' which are marked
* pending (usually by hardware interrupts) are run. Much of the real
* interrupt handling work is done here. The soft IRQ is also known as a
* deferred IRQ in windows. An event identifying as this needs to occur as
* the system is beginning to process the interrupt.
*
* @return the event name
*/
String eventSoftIrqEntry();
/**
* Whenever a system call is about to return to userspace, or a hardware
* interrupt handler exits, any 'software interrupts' which are marked
* pending (usually by hardware interrupts) are run Much of the real
* interrupt handling work is done here. The soft IRQ is also known as a
* deferred IRQ in windows. An event identifying as this needs to occur as
* the system is returning from the interrupt.
*
* @return the event name
*/
String eventSoftIrqExit();
/**
* Whenever a system call is about to return to userspace, or a hardware
* interrupt handler exits, any 'software interrupts' which are marked
* pending (usually by hardware interrupts) are run Much of the real
* interrupt handling work is done here. The soft IRQ is also known as a
* deferred IRQ in windows. An event identifying as this needs to occur as
* the system is signaling the need to enter the interrupt.
*
* @return the event name
*/
String eventSoftIrqRaise();
/**
* The scheduler will call a scheduler switch event when it is removing a
* task from a cpu and placing another one in its place. Which task and when
* depend on the scheduling strategy and the task priorities. This is a
* context switch.
*
* @return the event name
*/
String eventSchedSwitch();
/**
* sched_PI_setprio is a tracepoint called often when the schedulder
* priorities for a given task changes.
*
* @return the event name
* @since 1.0
*/
String eventSchedPiSetprio();
/**
* Scheduler is waking up a task. this happens before it is executed, and
* the data is loaded in memory if needed.
*
* @return the event names, as there are often several different ways to
* wake up
*/
Collection<String> eventsSchedWakeup();
/**
* Scheduler just forked a process, that means it has duplicated the program
* and assigned it a different process ID. This event is often followed by
* an {@link #eventSchedProcessExec()}. In windows, this is part of the
* "spawn" process.
*
* @return the event name
*/
String eventSchedProcessFork();
/**
* The process has finished running and the scheduler takes its TID back.
*
* @return the event name
*/
String eventSchedProcessExit();
/**
* The process free tracepoint is called when a process has finished running
* and the scheduler retrieves it's process ID.
*
* @return the event name
*/
String eventSchedProcessFree();
/**
* Optional event used by some tracers to deliver an initial state.
*
* @return the event name
*/
@Nullable String eventStatedumpProcessState();
/**
* System call entry prefix, something like "sys_open" or just "sys".
*
* @return the event name
*/
String eventSyscallEntryPrefix();
/**
* System call compatibility layer entry prefix, something like
* "compat_sys".
*
* @return the event name
*/
String eventCompatSyscallEntryPrefix();
/**
* System call exit prefix, something like "sys_exit".
*
* @return the event name
*/
String eventSyscallExitPrefix();
/**
* System call compatibility layer exit prefix, something like
* "compat_syscall_exit".
*
* @return the event name
* @since 2.0
*/
String eventCompatSyscallExitPrefix();
/**
* The scheduler replaced the current process image with a new one. The
* process should also be renamed at this point. In windows, this is part of
* the spawn process as well as fork.
*
* @return the event name
*
* @since 2.0
*/
String eventSchedProcessExec();
/**
* The scheduler calls wakeup on a sleeping process. The process will
* probably soon be scheduled in.
*
* @return the event name
*
* @since 2.0
*/
String eventSchedProcessWakeup();
/**
* The scheduler calls wakeup on a sleeping process. The process will
* probably soon be scheduled in. The new wakeup knows who triggered the
* wakeup.
*
* @return the event name
*
* @since 2.0
*/
String eventSchedProcessWakeupNew();
/**
* Event called when waking a task; this event is guaranteed to be called
* from the waking context.
*
* @return The name of the event
* @since 2.2
*/
default String eventSchedProcessWaking() {
return "sched_waking"; //$NON-NLS-1$
}
/**
* Migration event, moving a non-running thread from one CPU's run queue to
* another.
*
* @return The event name
* @since 2.5
*/
default String eventSchedMigrateTask() {
return "sched_migrate_task"; //$NON-NLS-1$
}
/**
* Starting the high resolution timer
* <p>
* In Linux, High resolution timers are used in the following:
* <ul>
* <li>nanosleep</li>
* <li>itimers</li>
* <li>posix timers</li>
* </ul>
*
* @return the event name
*
* @since 2.0
*/
String eventHRTimerStart();
/**
* Canceling the high resolution timer
* <p>
* In Linux, High resolution timers are used in the following:
* <ul>
* <li>nanosleep</li>
* <li>itimers</li>
* <li>posix timers</li>
* </ul>
*
* @return the event name
*
* @since 2.0
*/
String eventHRTimerCancel();
/**
* Entering the high resolution timer expired handler.
* <p>
* In Linux, High resolution timers are used in the following:
* <ul>
* <li>nanosleep</li>
* <li>itimers</li>
* <li>posix timers</li>
* </ul>
*
* @return the event name
*
* @since 2.0
*/
String eventHRTimerExpireEntry();
/**
* Exiting the high resolution timer expired handler.
* <p>
* In Linux, High resolution timers are used in the following:
* <ul>
* <li>nanosleep</li>
* <li>itimers</li>
* <li>posix timers</li>
* </ul>
*
* @return the event name
*
* @since 2.0
*/
String eventHRTimerExpireExit();
/**
* The kernel just allocated a page of memory.
* <p>
* In Linux, this typically means a user space application just got a page
* of ram.
*
* @return the event name
* @since 2.0
*/
String eventKmemPageAlloc();
/**
* The kernel just deallocated a page of memory.
* <p>
* In Linux, this typically means a page of ram was just freed
*
* @return the event name
* @since 2.0
*/
String eventKmemPageFree();
/**
* <em>Interprocessor interrupts</em> (IPIs) are special types of interrupts by which
* one processor will interrupt another in a multi-core and multi-cpu system. They are
* typically used for
* <ol>
* <li>cache flushes</li>
* <li>shutdowns</li>
* <ol>
* They are not logged with standard events, but rather events looking like
* "x86_irq_vectors_thermal_apic_exit".
* <p>
* This event describes the entries into IPIs.
*
* @return the IPI list
* @since 2.1
*/
default Collection<String> getIPIIrqVectorsEntries() {
return Collections.emptyList();
}
/**
* <em>Interprocessor interrupts</em> (IPIs) are special types of interrupts by which
* one processor will interrupt another in a multi-core and multi-cpu system. They are
* typically used for
* <ol>
* <li>cache flushes</li>
* <li>shutdowns</li>
* <ol>
* They are not logged with standard events, but rather events looking like
* "x86_irq_vectors_thermal_apic_exit".
* <p>
* This event describes the exits into IPIs.
*
* @return the IPI list
* @since 2.1
*/
default Collection<String> getIPIIrqVectorsExits() {
return Collections.emptyList();
}
// ------------------------------------------------------------------------
// Event field names
// ------------------------------------------------------------------------
/**
* The field with the IRQ number. This is used in irq_handlers (entry and
* exit). For soft IRQs see {@link #fieldVec}.
*
* @return the name of the field with the IRQ number
*/
String fieldIrq();
/**
* The field with the vector. This is the soft IRQ vector field used in soft
* IRQ raise, entry and exit. For hardware IRQs see {@link #fieldIrq}.
*
* @return the name of the field with the soft IRQ vector name
*/
String fieldVec();
/**
* The field with the thread ID. This is often used in scheduler calls to
* know which thread is being affected. (normally not in switch, but in
* priority and wakeup calls).
*
* @return the name of the field with the thread ID
*/
String fieldTid();
/**
* The field with the previous thread id. This is used in switching
* operations of a scheduler, when a thread is scheduled out for another,
* this field shows the thread id being scheduled out.
*
* @return The name of the field with the ID of the previous thread
*/
String fieldPrevTid();
/**
* The field with the state of the previous thread. This is used in
* switching operations of a scheduler, when a thread is scheduled out for
* another, this field shows the state of the thread being scheduled out.
*
* @return the name of the field of the previous thread's state
*/
String fieldPrevState();
/**
* The field with the next command to be run. This is used in switching
* operations of a scheduler, when a thread is scheduled out for another,
* this field shows the command being scheduled in. A command's value is
* often a String like "ls" or "hl3.exe".
*
* @return the name of the field with the next command to be run
*/
String fieldNextComm();
/**
* The field with the next thread ID. This is used in switching operations
* of a scheduler, when a thread is scheduled out for another, this field
* shows the thread being scheduled in.
*
* @return the name of the field with the next thread ID
*/
String fieldNextTid();
/**
* The field with the child command. This field is used in clone and spawn
* activities, to know which executable the clone is running.
*
* @return the name of the field with the child command
*/
String fieldChildComm();
/**
* The field with the parent thread ID. This field is used in clone and
* spawn activities, to know which thread triggered the clone.
*
* @return the name of the field with the parent thread ID
*/
String fieldParentTid();
/**
* The field with the child thread ID. This field is used in clone and spawn
* activities, to know which thread is the clone.
*
* @return the name of the field with the child thread ID
*/
String fieldChildTid();
/**
* The field with the child process ID. This field is used in clone and spawn
* activities, to know what is the process of the thread being cloned.
*
* @return the name of the field with the child process ID
* @since 2.5
*/
default String fieldChildPid() {
return "child_pid"; //$NON-NLS-1$
}
/**
* The field with the command. This is used in scheduling tracepoints that
* are not switches, and show the current process name. It is often a string
* like "zsh" or "cmd.exe".
*
* @return the name of the command field
* @since 2.0
*/
String fieldComm();
/**
* The field with the name. The name field is used in several disjoint
* events.
* <p>
* Examples include:
* <ul>
* <li>writeback_* - the name of the io device, often "(unknown)"</li>
* <li>module_* - the name of the module such as "binfmt_misc"</li>
* <li>irq_handler_entry - the field describes the name of the handler such
* as "i915"</li>
* <ul>
*
* @return the name of the field with a name
* @since 2.0
*/
String fieldName();
/**
* The field with the status. Often functions like a return value before we
* hit an exit.
* <p>
* Examples include:
* <ul>
* <li>ext4* - status</li>
* <li>asoc_snd_soc_cache_sync</li>
* <li>rpc_*</li>
* <li>state dumps</li>
* </ul>
*
* @return The name of the field with a status
* @since 2.0
*/
String fieldStatus();
/**
* The field with the last command to be run. This is often a string
* representing the command of the thread being scheduled out from a
* scheduler switch operation.
*
* @return the name of the field with the last command to be run
* @since 2.0
*/
String fieldPrevComm();
/**
* The field with the file name field. This is a string used mostly with
* file operations. These operations are often wrapped in system calls and
* can be:
* <ul>
* <li>open</li>
* <li>change mode</li>
* <li>change directory</li>
* <li>stat</li>
* </ul>
* It can also be used in exec commands to see what the command name should
* be.
* <p>
* Please note that file read and write often do not use the file name, they
* just use the file handle.
*
* @return the name of the field with the file name
* @since 2.0
*/
String fieldFilename();
/**
* The field with the priority. The priority of a given process is used by
* most scheduler events. The major exception is the switching operation as
* it has two processes so it has a previous and next priority.
*
* @return the name of the field with the thread or process' priority
* @since 1.0
*/
String fieldPrio();
/**
* The field with the new priority. This is used in the scheduler's
* pi_setprio event event to show the new priority of the thread or process.
*
* @return the name of the field with the thread or process' new priority
* @since 1.0
*/
String fieldNewPrio();
/**
* The field with the prev priority. This is used in the scheduler's switch
* event to show the priority of the thread being scheduled out.
*
* @return the name of the field with the priority of the previous thread
* @since 2.0
*/
String fieldPrevPrio();
/**
* The field with the next priority. This is used in the scheduler's switch
* event to show the priority of the next thread or process.
*
* @return the name of the field with the thread or process' next priority
* @since 1.0
*/
String fieldNextPrio();
/**
* The field with the hrtimer. The hrtimer holds the timer instance.
*
* @return the name of the hrTimer field
* @since 2.0
*/
String fieldHRtimer();
/**
* The field with the expires value. The expires field holds the expiry
* time. of the hrtimer.
*
* @return the name of the expires field
* @since 2.0
*/
String fieldHRtimerExpires();
/**
* Gets the field name with the softexpires value. The softexpire value is
* the absolute earliest expiry time of the hrtimer.
*
* @return the name of the softexpires field
* @since 2.0
*/
String fieldHRtimerSoftexpires();
/**
* The field of the function address value. The function field holds timer
* expiry callback function.
*
* @return the name of the function field
* @since 2.0
*/
String fieldHRtimerFunction();
/**
* The field of the now value. The now field holds the current time.
*
* @return the name of the now field (hrtimer)
* @since 2.0
*/
String fieldHRtimerNow();
/**
* The field containing the return value of a system call exit.
*
* @return The name of return field
* @since 2.0
*/
default String fieldSyscallRet() {
return "ret"; //$NON-NLS-1$
}
/**
* Field indicating the upcoming CPU of sched_wakeup and sched_waking
* events.
*
* @return The field name
* @since 2.5
*/
default String fieldTargetCpu() {
return "target_cpu"; //$NON-NLS-1$
}
/**
* Field of scheduler migration events, indicating the destination CPU of a
* thread being migrated.
*
* @return The field name
* @since 2.5
*/
default String fieldDestCpu() {
return "dest_cpu"; //$NON-NLS-1$
}
// ------------------------------------------------------------------------
// I/O events and fields
// ------------------------------------------------------------------------
/**
* A request to a block IO has just been inserted in the waiting queue.
*
* @return The name of the event
* @since 2.0
*/
default String eventBlockRqInsert() {
return "block_rq_insert"; //$NON-NLS-1$
}
/**
* A request to a block IO has just been issued and passed from the waiting
* queue to the driver queue. It is being served.
*
* @return The name of the event
* @since 2.0
*/
default String eventBlockRqIssue() {
return "block_rq_issue"; //$NON-NLS-1$
}
/**
* A request to a block IO has just been completed.
*
* @return The name of the event
* @since 2.0
*/
default String eventBlockRqComplete() {
return "block_rq_complete"; //$NON-NLS-1$
}
/**
* A BIO operation is being merged at the front of a waiting request
*
* @return The name of the event
* @since 2.0
*/
default String eventBlockBioFrontmerge() {
return "block_bio_frontmerge"; //$NON-NLS-1$
}
/**
* A BIO operation is being merged at the back of a waiting request
*
* @return The name of the event
* @since 2.0
*/
default String eventBlockBioBackmerge() {
return "block_bio_backmerge"; //$NON-NLS-1$
}
/**
* 2 requests previously inserted in the waiting queue are being merged
*
* @return The name of the event
* @since 2.0
*/
default String eventBlockRqMerge() {
return "block_rq_merge"; //$NON-NLS-1$
}
/**
* Optional event used by some tracers to associate the name of the block
* device to a device ID
*
* @return The name of the event
* @since 2.0
*/
default @Nullable String eventStatedumpBlockDevice() {
return null;
}
/**
* The field containing the device ID
*
* @return The name of the field
* @since 2.0
*/
default String fieldBlockDeviceId() {
return "dev"; //$NON-NLS-1$
}
/**
* The field with the first sector of a block operation
*
* @return The name of the field
* @since 2.0
*/
default String fieldBlockSector() {
return "sector"; //$NON-NLS-1$
}
/**
* The field with the number of sectors involved in a block operation
*
* @return The name of the field
* @since 2.0
*/
default String fieldBlockNrSector() {
return "nr_sector"; //$NON-NLS-1$
}
/**
* The field containing the read/write flag of a block operation
*
* @return The name of the field
* @since 2.0
*/
default String fieldBlockRwbs() {
return "rwbs"; //$NON-NLS-1$
}
/**
* The field with the first sector of a request in which another block
* operation is being merged
*
* @return The name of the field
* @since 2.0
*/
default String fieldBlockRqSector() {
return "rq_sector"; //$NON-NLS-1$
}
/**
* The field with the sector of the request being merged in another one
*
* @return The name of the field
* @since 2.0
*/
default String fieldBlockNextRqSector() {
return "nextrq_sector"; //$NON-NLS-1$
}
/**
* The field containing the name of the disk
*
* @return The name of the field
* @since 2.0
*/
default String fieldDiskname() {
return "diskname"; //$NON-NLS-1$
}
/**
* The field with the IRQ number. This is used in IPI handlers (entry and
* exit).
*
* @return the name of the field with the IRQ number
* @since 2.1
*/
default String fieldIPIVector() {
return "vector"; //$NON-NLS-1$
}
/**
* Get the name of the 'order' field from memory page allocation events.
*
* The 'order' of a page allocation is it's logarithm to the base 2, and the
* size of the allocation is 2^order, an integral power-of-2 number of
* pages. 'Order' ranges from from 0 to MAX_ORDER-1.
*
* The smallest - and most frequent - page allocation is 2^0 or 1 page. The
* maximum allocation possible is 2^(MAX_ORDER-1) pages. MAX_ORDER is
* assigned a default value of 11 - resulting in a maximum allocation of
* 2^10 or 1024 pages. However it may be redefined at kernel configuration
* time with the option CONFIG_FORCE_MAX_ZONEORDER.
*
* @return the name of the order field
* @since 2.2
*/
default @Nullable String fieldOrder() {
return null;
}
// ------------------------------------------------------------------------
// Network events and fields
// ------------------------------------------------------------------------
/**
* Get the list of events indicating that a packet is sent on the network
*
* @return The name of the packet send event
* @since 2.1
*/
default Collection<String> eventsNetworkSend() {
return Collections.emptySet();
}
/**
* Get the list of events indicating that a packet is received from the
* network
*
* @return The collection of names of the packet receive event
* @since 2.1
*/
default Collection<String> eventsNetworkReceive() {
return Collections.emptySet();
}
/**
* The path of the field corresponding to the sequence number field of a TCP
* header
*
* @return The path of the sequence number field in the TCP header of a
* network packet
* @since 2.1
*/
default String[] fieldPathTcpSeq() {
return new String[] { "seq" }; //$NON-NLS-1$
}
/**
* The path of the field corresponding to the acknowledgment number field of
* a TCP header
*
* @return The name of the acknowledgment number field in the TCP header of
* a network packet
* @since 2.1
*/
default String[] fieldPathTcpAckSeq() {
return new String[] { "ack_seq" }; //$NON-NLS-1$
}
/**
* The path of the field corresponding to the flags field of a TCP header
*
* @return The path of the flags field in the TCP header of a network packet
* @since 2.1
*/
default String[] fieldPathTcpFlags() {
return new String[] { "flags" }; //$NON-NLS-1$
}
// ------------------------------------------------------------------------
// VirtualMachine events : kvm entry/exit events
// ------------------------------------------------------------------------
/**
* KVM kernel event indicating that virtual machine code is being run
*
* @return The name of the kvm entry event
* @since 2.1
*/
default Collection<String> eventsKVMEntry() {
return Collections.emptySet();
}
/**
* KVM kernel event indicating that virtual machine code is not run anymore,
* but rather hypervisor-specific code
*
* @return The name of the kvm exit event
* @since 2.1
*/
default Collection<String> eventsKVMExit() {
return Collections.emptySet();
}
/**
* Get the name of the kernel event when the CPU frequency is changed
*
* @return The name of the cpu frequency change event
* @since 3.0
*/
default String eventCpuFrequency() {
return "power_cpu_frequency"; //$NON-NLS-1$
}
/**
* Get the name of the kernel event marking the entry of the complete IRQ
* execution. This event is different from {@link #eventIrqHandlerEntry()}
* and {@link #eventSoftIrqEntry()}. The latter mark the entry to the
* hardware or software handler. Here this event is at a higher level and
* may encompass both harware and software IRQs.
*
* @return The name of the irq entry function
* @since 3.1
*/
default String eventIrqEntry() {
return "do_IRQ_entry"; //$NON-NLS-1$
}
/**
* Get the name of the kernel event marking the exit of the complete IRQ
* execution. This event is different from {@link #eventIrqHandlerExit()}
* and {@link #eventSoftIrqExit()}. The latter mark the exit to the hardware
* or software handler. Here this event is at a higher level and may
* encompass both harware and software IRQs.
*
* @return The name of the irq exit function
* @since 3.1
*/
default String eventIrqExit() {
return "do_IRQ_return"; //$NON-NLS-1$
}
/**
* Get the name of the kernel events marking the entry to a network packet
* reception context. The matching return events can be obtained with
* {@link #eventsNetworkReceiveExit()}. The packet reception context will
* typically include the packet reception, with one of
* {@link #eventsNetworkReceive()} events and the wakeup events caused by
* the reception.
*
* @return The list of events marking the beginning of a packet reception
* phase
* @since 3.1
*/
default Collection<String> eventsNetworkReceiveEntry() {
return Collections.emptySet();
}
/**
* Get the name of the kernel event marking the return of a network packet
* reception code.
*
* @return The list of events marking the end of a packet reception phase
* @since 3.1
*/
default Collection<String> eventsNetworkReceiveExit() {
return Collections.emptySet();
}
}