Merge remote-tracking branch 'goog/mirror-upstream-master' into HEAD
diff --git a/devlib/bin/scripts/shutils.in b/devlib/bin/scripts/shutils.in
index d44e444..04712aa 100755
--- a/devlib/bin/scripts/shutils.in
+++ b/devlib/bin/scripts/shutils.in
@@ -177,6 +177,15 @@
 	exit 0
 }
 
+cgroup_trace_attach_task() {
+        DST_ROOT=${1}
+        DST_PATH=${2}
+        TASKS_FILE=${3}
+
+        cat $TASKS_FILE | while read PID; do
+            echo "cgroup_attach_task_devlib: dst_root=$DST_ROOT dst_path=$DST_PATH pid=$PID" > /sys/kernel/debug/tracing/trace_marker
+        done
+}
 
 ################################################################################
 # Main Function Dispatcher
@@ -198,6 +207,9 @@
 cpufreq_trace_all_frequencies)
     cpufreq_trace_all_frequencies $*
     ;;
+cgroup_trace_attach_task)
+    cgroup_trace_attach_task $*
+    ;;
 cpuidle_wake_all_cpus)
     cpuidle_wake_all_cpus $*
     ;;
diff --git a/devlib/instrument/monsoon.py b/devlib/instrument/monsoon.py
index e373d68..dd99df0 100644
--- a/devlib/instrument/monsoon.py
+++ b/devlib/instrument/monsoon.py
@@ -61,6 +61,8 @@
         if self.process:
             self.process.kill()
 
+        os.system(self.monsoon_bin + ' --usbpassthrough off')
+
         cmd = [self.monsoon_bin,
                '--hz', str(self.sample_rate_hz),
                '--samples', '-1', # -1 means sample indefinitely
@@ -97,6 +99,11 @@
         self.buffer_file = None
 
         self.output = (stdout, stderr)
+        os.system(self.monsoon_bin + ' --usbpassthrough on')
+
+        # Wait for USB connection to be restored
+        print ('waiting for usb connection to be back')
+        os.system('adb wait-for-device')
 
     def get_data(self, outfile):
         if self.process:
diff --git a/devlib/module/cgroups.py b/devlib/module/cgroups.py
index bfe2785..472304e 100644
--- a/devlib/module/cgroups.py
+++ b/devlib/module/cgroups.py
@@ -287,6 +287,11 @@
         logging.debug('Tasks: %s', task_ids)
         return map(int, task_ids)
 
+    # Used to insert fake cgroup attach events to know existing cgroup assignments
+    def trace_cgroup_tasks(self):
+        exec_cmd = "cgroup_trace_attach_task {} {} {}".format(self.controller.hid, self.directory, self.tasks_file)
+        self.target._execute_util(exec_cmd)
+
     def add_task(self, tid):
         self.target.write_value(self.tasks_file, tid, verify=False)
 
diff --git a/devlib/utils/android.py b/devlib/utils/android.py
index f683190..d2a1629 100644
--- a/devlib/utils/android.py
+++ b/devlib/utils/android.py
@@ -451,7 +451,15 @@
     logger.debug('Discovering ANDROID_HOME from adb path.')
     env.platform_tools = os.path.dirname(adb_full_path)
     env.android_home = os.path.dirname(env.platform_tools)
-    _init_common(env)
+    try:
+        _init_common(env)
+    except:
+        env.aapt = which('aapt')
+        if env.aapt:
+            logger.info('Using aapt: ' + env.aapt)
+        else:
+            raise RuntimeError('aapt not found, try setting ANDROID_HOME to \
+                                Android SDK or run LISA from android environment')
     return env