blob: 3e3c87707277217cad820e00f703bfa897032132 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 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.internal.lttng2.kernel.core.trace.layout;
import java.util.Collection;
import java.util.Collections;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
import com.google.common.collect.ImmutableList;
/**
* This file defines all the known event and field names for LTTng kernel
* traces, for versions of lttng-modules up to 2.5.
*
* These should not be externalized, since they need to match exactly what the
* tracer outputs. If you want to localize them in a view, you should do a
* mapping in the view itself.
*
* @author Alexandre Montplaisir
*/
@SuppressWarnings("nls")
public class LttngEventLayout implements IKernelAnalysisEventLayout {
/* Event names */
private static final String IRQ_HANDLER_ENTRY = "irq_handler_entry";
private static final String IRQ_HANDLER_EXIT = "irq_handler_exit";
private static final String SOFTIRQ_ENTRY = "softirq_entry";
private static final String SOFTIRQ_EXIT = "softirq_exit";
private static final String SOFTIRQ_RAISE = "softirq_raise";
private static final String HRTIMER_START = "hrtimer_start";
private static final String HRTIMER_CANCEL = "hrtimer_cancel";
private static final String HRTIMER_EXPIRE_ENTRY = "hrtimer_expire_entry";
private static final String HRTIMER_EXPIRE_EXIT = "hrtimer_expire_exit";
private static final String SCHED_SWITCH = "sched_switch";
private static final String SCHED_PI_SETPRIO = "sched_pi_setprio";
private static final String SCHED_TTWU = "sched_ttwu";
private static final String SCHED_WAKEUP = "sched_wakeup";
private static final String SCHED_WAKEUP_NEW = "sched_wakeup_new";
private static final Collection<String> SCHED_WAKEUP_EVENTS =
ImmutableList.of(SCHED_WAKEUP, SCHED_WAKEUP_NEW);
private static final String SCHED_PROCESS_FORK = "sched_process_fork";
private static final String SCHED_PROCESS_EXIT = "sched_process_exit";
private static final String SCHED_PROCESS_FREE = "sched_process_free";
private static final String SCHED_PROCESS_EXEC = "sched_process_exec";
private static final String STATEDUMP_PROCESS_STATE = "lttng_statedump_process_state";
private static final String SYSCALL_ENTRY_PREFIX = "sys_";
private static final String COMPAT_SYSCALL_ENTRY_PREFIX = "compat_sys_";
private static final String SYSCALL_EXIT_PREFIX = "exit_syscall";
private static final String BLOCK_RQ_INSERT= "block_rq_insert";
private static final String BLOCK_RQ_ISSUE= "block_rq_issue";
private static final String ELV_MERGE_REQUESTS= "addons_elv_merge_requests";
private static final String BLOCK_RQ_COMPLETE= "block_rq_complete";
private static final String LTTNG_STATEDUMP_BLOCK_DEVICE= "lttng_statedump_block_device";
private static final String BLOCK_BIO_FRONTMERGE = "block_bio_frontmerge";
private static final String BLOCK_BIO_BACKMERGE = "block_bio_backmerge";
/* Field names */
private static final String IRQ = "irq";
private static final String TID = "tid";
private static final String VEC = "vec";
private static final String PREV_TID = "prev_tid";
private static final String PREV_STATE = "prev_state";
private static final String NEXT_COMM = "next_comm";
private static final String NEXT_TID = "next_tid";
private static final String PARENT_TID = "parent_tid";
private static final String CHILD_COMM = "child_comm";
private static final String CHILD_TID = "child_tid";
private static final String CHILD_PID = "child_pid";
private static final String PRIO = "prio";
private static final String PREV_PRIO = "prev_prio";
private static final String NEXT_PRIO = "next_prio";
private static final String NEW_PRIO = "newprio";
private static final String COMM = "comm";
private static final String NAME = "name";
private static final String STATUS = "status";
private static final String PREV_COMM = "prev_comm";
private static final String FILENAME = "filename";
private static final String HRTIMER = "hrtimer";
private static final String HRTIMER_FUNCTION = "function";
private static final String HRTIMER_EXPIRES = "expires";
private static final String HRTIMER_NOW = "now";
private static final String HRTIMER_SOFT_EXPIRES = "softexpires";
private static final String KMEM_ALLOC = "mm_page_alloc";
private static final String KMEM_FREE = "mm_page_free";
private static final String SYSCALL_RET = "ret";
private static final String RWBS="rwbs";
private static final String DISKNAME="diskname";
private static final String BLOCK_DEV="dev";
private static final String SECTOR="sector";
private static final String NR_SECTOR="nr_sector";
private static final String RQ_SECTOR= "rq_sector";
private static final String NEXTRQ_SECTOR= "nextrq_sector";
private static final String ORDER = "order";
/* Network events and field names */
private static final Collection<String> EVENTS_NETWORK_SEND = Collections.singleton("net_dev_queue");
private static final Collection<String> EVENTS_NETWORK_RECEIVE = Collections.singleton("netif_receive_skb");
private static final String[] TCP_SEQ_FIELD = { "transport_fields", "thtype_tcp", "seq" };
private static final String[] TCP_ACK_FIELD = { "transport_fields", "thtype_tcp", "ack_seq" };
private static final String[] TCP_FLAGS_FIELD = { "transport_fields", "thtype_tcp", "flags" };
/* KVM events */
private static final Collection<String> KVM_ENTRY_EVENTS = Collections.singleton("kvm_entry");
private static final Collection<String> KVM_EXIT_EVENTS = Collections.singleton("kvm_exit");
/** All instances are the same. Only provide a static instance getter */
protected LttngEventLayout() {
}
private static final IKernelAnalysisEventLayout INSTANCE = new LttngEventLayout();
/**
* Get an instance of this event layout
*
* This object is completely immutable, so no need to create additional
* instances via the constructor.
*
* @return The instance
*/
public static IKernelAnalysisEventLayout getInstance() {
return INSTANCE;
}
// ------------------------------------------------------------------------
// Event names
// ------------------------------------------------------------------------
@Override
public String eventIrqHandlerEntry() {
return IRQ_HANDLER_ENTRY;
}
@Override
public String eventIrqHandlerExit() {
return IRQ_HANDLER_EXIT;
}
@Override
public String eventSoftIrqEntry() {
return SOFTIRQ_ENTRY;
}
@Override
public String eventSoftIrqExit() {
return SOFTIRQ_EXIT;
}
@Override
public String eventSoftIrqRaise() {
return SOFTIRQ_RAISE;
}
@Override
public String eventSchedSwitch() {
return SCHED_SWITCH;
}
@Override
public String eventSchedPiSetprio() {
return SCHED_PI_SETPRIO;
}
@Override
public Collection<String> eventsSchedWakeup() {
return SCHED_WAKEUP_EVENTS;
}
@Override
public String eventSchedProcessFork() {
return SCHED_PROCESS_FORK;
}
@Override
public String eventSchedProcessExit() {
return SCHED_PROCESS_EXIT;
}
@Override
public String eventSchedProcessFree() {
return SCHED_PROCESS_FREE;
}
@Override
public @NonNull String eventStatedumpProcessState() {
return STATEDUMP_PROCESS_STATE;
}
@Override
public String eventSyscallEntryPrefix() {
return SYSCALL_ENTRY_PREFIX;
}
@Override
public String eventCompatSyscallEntryPrefix() {
return COMPAT_SYSCALL_ENTRY_PREFIX;
}
@Override
public String eventSyscallExitPrefix() {
return SYSCALL_EXIT_PREFIX;
}
@Override
public String eventCompatSyscallExitPrefix() {
/*
* In LTTng < 2.6, the same generic event name is used for both standard
* and compat syscalls.
*/
return SYSCALL_EXIT_PREFIX;
}
/**
* @since 2.0
*/
@Override
public String eventKmemPageAlloc() {
return KMEM_ALLOC;
}
/**
* @since 2.0
*/
@Override
public String eventKmemPageFree() {
return KMEM_FREE;
}
// ------------------------------------------------------------------------
// Event field names
// ------------------------------------------------------------------------
@Override
public String fieldIrq() {
return IRQ;
}
@Override
public String fieldVec() {
return VEC;
}
@Override
public String fieldTid() {
return TID;
}
@Override
public String fieldPrevTid() {
return PREV_TID;
}
@Override
public String fieldPrevState() {
return PREV_STATE;
}
@Override
public String fieldNextComm() {
return NEXT_COMM;
}
@Override
public String fieldNextTid() {
return NEXT_TID;
}
@Override
public String fieldChildComm() {
return CHILD_COMM;
}
@Override
public String fieldParentTid() {
return PARENT_TID;
}
@Override
public String fieldChildTid() {
return CHILD_TID;
}
@Override
public String fieldChildPid() {
return CHILD_PID;
}
@Override
public String fieldPrio() {
return PRIO;
}
@Override
public String fieldNewPrio() {
return NEW_PRIO;
}
@Override
public String fieldPrevPrio() {
return PREV_PRIO;
}
@Override
public String fieldNextPrio() {
return NEXT_PRIO;
}
@Override
public String fieldComm() {
return COMM;
}
@Override
public String fieldName() {
return NAME;
}
@Override
public String fieldStatus() {
return STATUS;
}
@Override
public String fieldPrevComm() {
return PREV_COMM;
}
@Override
public String fieldFilename() {
return FILENAME;
}
@Override
public String eventSchedProcessExec() {
return SCHED_PROCESS_EXEC;
}
@Override
public String eventSchedProcessWakeup() {
return SCHED_WAKEUP;
}
@Override
public String eventSchedProcessWakeupNew() {
return SCHED_WAKEUP_NEW;
}
@Override
public String eventHRTimerStart() {
return HRTIMER_START;
}
@Override
public String eventHRTimerCancel() {
return HRTIMER_CANCEL;
}
@Override
public String eventHRTimerExpireEntry() {
return HRTIMER_EXPIRE_ENTRY;
}
@Override
public String eventHRTimerExpireExit() {
return HRTIMER_EXPIRE_EXIT;
}
/**
* Event indicating the source of the wakeup signal.
*
* @return The name of the event
* @since 2.0
*/
public String eventSchedProcessTTWU() {
return SCHED_TTWU;
}
@Override
public String fieldHRtimer() {
return HRTIMER;
}
@Override
public String fieldHRtimerFunction() {
return HRTIMER_FUNCTION;
}
@Override
public String fieldHRtimerExpires() {
return HRTIMER_EXPIRES;
}
@Override
public String fieldHRtimerSoftexpires() {
return HRTIMER_SOFT_EXPIRES;
}
@Override
public String fieldHRtimerNow() {
return HRTIMER_NOW;
}
@Override
public String fieldSyscallRet() {
return SYSCALL_RET;
}
// ------------------------------------------------------------------------
// I/O events and fields
// ------------------------------------------------------------------------
@Override
public String eventBlockRqInsert() {
return BLOCK_RQ_INSERT;
}
@Override
public String eventBlockRqIssue() {
return BLOCK_RQ_ISSUE;
}
@Override
public String eventBlockRqComplete() {
return BLOCK_RQ_COMPLETE;
}
@Override
public String eventBlockBioFrontmerge() {
return BLOCK_BIO_FRONTMERGE;
}
@Override
public String eventBlockBioBackmerge() {
return BLOCK_BIO_BACKMERGE;
}
@Override
public String eventBlockRqMerge() {
return ELV_MERGE_REQUESTS;
}
@Override
public @NonNull String eventStatedumpBlockDevice() {
return LTTNG_STATEDUMP_BLOCK_DEVICE;
}
@Override
public String fieldBlockDeviceId() {
return BLOCK_DEV;
}
@Override
public String fieldBlockSector() {
return SECTOR;
}
@Override
public String fieldBlockNrSector() {
return NR_SECTOR;
}
@Override
public String fieldBlockRwbs() {
return RWBS;
}
@Override
public String fieldBlockRqSector() {
return RQ_SECTOR;
}
@Override
public String fieldBlockNextRqSector() {
return NEXTRQ_SECTOR;
}
@Override
public String fieldDiskname() {
return DISKNAME;
}
@Override
public Collection<String> eventsNetworkSend() {
return EVENTS_NETWORK_SEND;
}
@Override
public Collection<String> eventsNetworkReceive() {
return EVENTS_NETWORK_RECEIVE;
}
@Override
public String @NonNull [] fieldPathTcpSeq() {
return TCP_SEQ_FIELD;
}
@Override
public String @NonNull [] fieldPathTcpAckSeq() {
return TCP_ACK_FIELD;
}
@Override
public String @NonNull [] fieldPathTcpFlags() {
return TCP_FLAGS_FIELD;
}
@Override
public @NonNull String fieldOrder() {
return ORDER;
}
// ------------------------------------------------------------------------
// VirtualMachine events : kvm entry/exit events
// ------------------------------------------------------------------------
@Override
public @NonNull Collection<@NonNull String> eventsKVMEntry() {
return KVM_ENTRY_EVENTS;
}
@Override
public @NonNull Collection<@NonNull String> eventsKVMExit() {
return KVM_EXIT_EVENTS;
}
@Override
public Collection<String> eventsNetworkReceiveEntry() {
return Collections.singleton("netif_receive_skb_internal_entry");
}
@Override
public Collection<String> eventsNetworkReceiveExit() {
return Collections.singleton("netif_receive_skb_internal_return");
}
/**
* Get the PID context event
*
* @return The PID context event name
*/
public String contextPid() {
return "context._pid";
}
/**
* Get the TID context event
*
* @return The TID context event name
*/
public String contextTid() {
return "context._tid";
}
}