lttng: Update LTTng event matching to use event layout
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Tue, 2 Aug 2016 15:27:05 +0000 (11:27 -0400)
committerGenevieve Bastien <gbastien+lttng@versatic.net>
Thu, 11 Aug 2016 00:36:47 +0000 (20:36 -0400)
This removes the netif_receive_skb and net_dev_queue from the TcpEventStrings
and makes use of the layout in the TcpLttngEventMatching class.

Change-Id: I2b168114228a79195c088430baf75a64f07c2698
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/78333
Reviewed-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Alexandre Montplaisir <alexmonthy@efficios.com>
lttng/org.eclipse.tracecompass.lttng2.kernel.core/META-INF/MANIFEST.MF
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/TcpEventStrings.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerExecutionGraph.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/event/matching/TcpLttngEventMatching.java

index 5d1b03fb3fa4f373b8466e09721b39b8b92ba88d..cfb8645a901162f2a8666133727b59d263ac56d5 100644 (file)
@@ -28,5 +28,6 @@ Export-Package: org.eclipse.tracecompass.internal.lttng2.kernel.core;x-friends:=
  org.eclipse.tracecompass.internal.lttng2.kernel.core.event.matching;x-friends:="org.eclipse.tracecompass.lttng2.kernel.core.tests",
  org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout;x-friends:="org.eclipse.tracecompass.lttng2.kernel.core.tests,org.eclipse.tracecompass.lttng2.kernel.ui",
  org.eclipse.tracecompass.lttng2.kernel.core.trace
-Import-Package: com.google.common.collect,
- com.google.common.hash;version="15.0.0"
+Import-Package: com.google.common.cache,
+ com.google.common.collect,
+ com.google.common.hash
index dd9fd3c47aab15e5cccf04c103f1676dcf1dff7f..2937884ed8f131d2fa43b273236050381ee9e84f 100644 (file)
@@ -38,8 +38,6 @@ public interface TcpEventStrings {
     public static final String INET_SOCK_CLONE = "inet_sock_clone";
     public static final String INET_ACCEPT = "inet_accept";
     public static final String INET_SOCK_DELETE = "inet_sock_delete";
-    public static final String NETIF_RECEIVE_SKB = "netif_receive_skb";
-    public static final String NET_DEV_QUEUE = "net_dev_queue";
 
     /* Field names */
     public static final String SEQ = "seq";
@@ -54,7 +52,5 @@ public interface TcpEventStrings {
     public static final String CHECK = "check";
     public static final String WINDOW = "window";
     public static final String FLAGS = "flags";
-    public static final String TRANSPORT_FIELDS = "transport_fields";
-    public static final String TYPE_TCP = "thtype_tcp";
 
 }
index bca62e4a633dc3b782dce25452696d0c84bc7c8a..e7730a01966cd9e55dedac865b6d1f89201bf882 100644 (file)
@@ -134,11 +134,11 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
             handleSchedSwitch(ev);
         } else if (eventName.equals(eventLayout.eventSoftIrqEntry())) {
             handleSoftirqEntry(ev);
-        } else if (eventName.equals(TcpEventStrings.INET_SOCK_LOCAL_IN) ||
-                eventName.equals(TcpEventStrings.NETIF_RECEIVE_SKB)) {
+        } else if (eventLayout.eventsNetworkReceive().contains(eventName) ||
+                eventName.equals(TcpEventStrings.INET_SOCK_LOCAL_IN)) {
             handleInetSockLocalIn(ev);
-        } else if (eventName.equals(TcpEventStrings.INET_SOCK_LOCAL_OUT) ||
-                eventName.equals(TcpEventStrings.NET_DEV_QUEUE)) {
+        } else if (eventLayout.eventsNetworkSend().contains(eventName) ||
+                eventName.equals(TcpEventStrings.INET_SOCK_LOCAL_OUT)) {
             handleInetSockLocalOut(ev);
         } else if (isWakeupEvent(ev)) {
             handleSchedWakeup(ev);
index 01747fa27dbdecce2e26c5e2fcaa03d999fbab66..952c338a5a0d0bcc09d2a0cb90507d3333bf84ca 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013, 2015 École Polytechnique de Montréal
+ * Copyright (c) 2013, 2016 École Polytechnique de Montréal
  *
  * All rights reserved. This program and the accompanying materials are made
  * available under the terms of the Eclipse Public License v1.0 which
 
 package org.eclipse.tracecompass.internal.lttng2.kernel.core.event.matching;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
+import java.util.WeakHashMap;
 
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.tracecompass.internal.lttng2.kernel.core.TcpEventStrings;
+import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
+import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelTrace;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
-import org.eclipse.tracecompass.tmf.core.event.ITmfEventField;
 import org.eclipse.tracecompass.tmf.core.event.TmfEventField;
 import org.eclipse.tracecompass.tmf.core.event.matching.IEventMatchingKey;
 import org.eclipse.tracecompass.tmf.core.event.matching.ITmfMatchEventDefinition;
@@ -28,48 +31,47 @@ import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTraceWithPreDefinedEvents;
 import org.eclipse.tracecompass.tmf.core.trace.TmfEventTypeCollectionHelper;
 
-import com.google.common.collect.ImmutableSet;
-
 /**
- * Class to match tcp type events. This class applies to traces obtained with
- * the full network tracepoint data available from an experimental branch of
- * lttng-modules. This branch is often rebased on lttng-modules master and is
- * available at
- * http://git.dorsal.polymtl.ca/~gbastien?p=lttng-modules.git;a=summary
- * net_data_experimental branch.
+ * Class to match tcp events. They use the main kernel's tracepoints
+ * netif_receive_skb and net_dev_queue to check if they have a TCP header and
+ * use the sequence, acknowledge and flags fields to match packets
  *
  * @author Geneviève Bastien
  */
 public class TcpLttngEventMatching implements ITmfMatchEventDefinition {
 
-    private static final String @NonNull [] KEY_SEQ = { TcpEventStrings.TRANSPORT_FIELDS, TcpEventStrings.TYPE_TCP, TcpEventStrings.SEQ };
-    private static final String @NonNull [] KEY_ACKSEQ = { TcpEventStrings.TRANSPORT_FIELDS, TcpEventStrings.TYPE_TCP, TcpEventStrings.ACKSEQ };
-    private static final String @NonNull [] KEY_FLAGS = { TcpEventStrings.TRANSPORT_FIELDS, TcpEventStrings.TYPE_TCP, TcpEventStrings.FLAGS };
-
-    private static final ImmutableSet<String> REQUIRED_EVENTS = ImmutableSet.of(
-            TcpEventStrings.NET_DEV_QUEUE,
-            TcpEventStrings.NETIF_RECEIVE_SKB);
-
-    private static boolean canMatchPacket(final ITmfEvent event) {
-        TmfEventField field = (TmfEventField) event.getContent();
+    private static final Map<IKernelAnalysisEventLayout, Set<String>> REQUIRED_EVENTS = new HashMap<>();
 
-        String[] tcp_data = { TcpEventStrings.TRANSPORT_FIELDS, TcpEventStrings.TYPE_TCP };
-        ITmfEventField data = field.getField(tcp_data);
-        if (data != null) {
-            return (data.getValue() != null);
-        }
-        return false;
-    }
+    /** Use a weak hash map so that traces can be garbage collected */
+    private static final Map<ITmfTrace, IKernelAnalysisEventLayout> TRACE_LAYOUTS = new WeakHashMap<>();
 
     @Override
     public boolean canMatchTrace(ITmfTrace trace) {
+        // Get the events that this trace needs to have
+        if (!(trace instanceof IKernelTrace)) {
+            // Not a kernel trace, we cannot know what events to use, return
+            // false
+            return false;
+        }
+        IKernelAnalysisEventLayout layout = ((IKernelTrace) trace).getKernelEventLayout();
+        TRACE_LAYOUTS.put(trace, layout);
+
+        Set<String> events = REQUIRED_EVENTS.get(layout);
+        if (events == null) {
+            events = new HashSet<>();
+            events.addAll(layout.eventsNetworkSend());
+            events.addAll(layout.eventsNetworkReceive());
+            REQUIRED_EVENTS.put(layout, events);
+        }
+
         if (!(trace instanceof ITmfTraceWithPreDefinedEvents)) {
+            // No predefined events, suppose events are present
             return true;
         }
         ITmfTraceWithPreDefinedEvents ktrace = (ITmfTraceWithPreDefinedEvents) trace;
 
         Set<String> traceEvents = TmfEventTypeCollectionHelper.getEventNames(ktrace.getContainedEventTypes());
-        traceEvents.retainAll(REQUIRED_EVENTS);
+        traceEvents.retainAll(events);
         return !traceEvents.isEmpty();
     }
 
@@ -78,12 +80,15 @@ public class TcpLttngEventMatching implements ITmfMatchEventDefinition {
      */
     @Override
     public Direction getDirection(ITmfEvent event) {
+        IKernelAnalysisEventLayout layout = TRACE_LAYOUTS.get(event.getTrace());
+        if (layout == null) {
+            return null;
+        }
         String evname = event.getName();
-
         /* Is the event a tcp socket in or out event */
-        if (evname.equals(TcpEventStrings.NETIF_RECEIVE_SKB) && canMatchPacket(event)) {
+        if (layout.eventsNetworkReceive().contains(evname)) {
             return Direction.EFFECT;
-        } else if (evname.equals(TcpEventStrings.NET_DEV_QUEUE) && canMatchPacket(event)) {
+        } else if (layout.eventsNetworkSend().contains(evname)) {
             return Direction.CAUSE;
         }
         return null;
@@ -91,32 +96,24 @@ public class TcpLttngEventMatching implements ITmfMatchEventDefinition {
 
     @Override
     public IEventMatchingKey getEventKey(ITmfEvent event) {
-        TmfEventField field = (TmfEventField) event.getContent();
-        ITmfEventField data;
-
-        long seq = -1, ackseq = -1, flags = -1;
-        data = field.getField(KEY_SEQ);
-        if (data != null) {
-            seq = (long) data.getValue();
-        } else {
+        IKernelAnalysisEventLayout layout = TRACE_LAYOUTS.get(event.getTrace());
+        if (layout == null) {
             return null;
         }
-        data = field.getField(KEY_ACKSEQ);
-        if (data != null) {
-            ackseq = (long) data.getValue();
-        } else {
-            return null;
-        }
-        data = field.getField(KEY_FLAGS);
-        if (data != null) {
-            flags = (long) data.getValue();
-        } else {
+
+        TmfEventField content = (TmfEventField) event.getContent();
+
+        Long sequence = content.getFieldValue(Long.class, layout.fieldPathTcpSeq());
+        Long ack = content.getFieldValue(Long.class, layout.fieldPathTcpAckSeq());
+        Long flags = content.getFieldValue(Long.class, layout.fieldPathTcpFlags());
+
+        if (sequence == null || ack == null || flags == null) {
             return null;
         }
 
-        IEventMatchingKey key = new TcpEventKey(seq, ackseq, flags);
-
+        IEventMatchingKey key = new TcpEventKey(sequence, ack, flags);
         return key;
+
     }
 
 }
This page took 0.028278 seconds and 5 git commands to generate.