diff --git a/cmds/atrace/atrace.cpp b/cmds/atrace/atrace.cpp
index 26c5b4a..7201e77 100644
--- a/cmds/atrace/atrace.cpp
+++ b/cmds/atrace/atrace.cpp
@@ -93,6 +93,7 @@
     { "sched",      "CPU Scheduling",   0, {
         { REQ,      "/sys/kernel/debug/tracing/events/sched/sched_switch/enable" },
         { REQ,      "/sys/kernel/debug/tracing/events/sched/sched_wakeup/enable" },
+        { OPT,      "/sys/kernel/debug/tracing/events/sched/sched_blocked_reason/enable" },
     } },
     { "irq",        "IRQ Events",   0, {
         { REQ,      "/sys/kernel/debug/tracing/events/irq/enable" },
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index b88b605..a2e4f4b 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -262,6 +262,8 @@
 
 /* End copy from system/core/logd/LogBuffer.cpp */
 
+static const unsigned long logcat_min_timeout = 40000; /* ms */
+
 /* dumps the current system state to stdout */
 static void dumpstate() {
     unsigned long timeout;
@@ -334,18 +336,18 @@
     // dump_file("EVENT LOG TAGS", "/etc/event-log-tags");
     // calculate timeout
     timeout = logcat_timeout("main") + logcat_timeout("system") + logcat_timeout("crash");
-    if (timeout < 20000) {
-        timeout = 20000;
+    if (timeout < logcat_min_timeout) {
+        timeout = logcat_min_timeout;
     }
     run_command("SYSTEM LOG", timeout / 1000, "logcat", "-v", "threadtime", "-d", "*:v", NULL);
     timeout = logcat_timeout("events");
-    if (timeout < 20000) {
-        timeout = 20000;
+    if (timeout < logcat_min_timeout) {
+        timeout = logcat_min_timeout;
     }
     run_command("EVENT LOG", timeout / 1000, "logcat", "-b", "events", "-v", "threadtime", "-d", "*:v", NULL);
     timeout = logcat_timeout("radio");
-    if (timeout < 20000) {
-        timeout = 20000;
+    if (timeout < logcat_min_timeout) {
+        timeout = logcat_min_timeout;
     }
     run_command("RADIO LOG", timeout / 1000, "logcat", "-b", "radio", "-v", "threadtime", "-d", "*:v", NULL);
 
diff --git a/include/gui/SensorManager.h b/include/gui/SensorManager.h
index f039caf..0cff46c 100644
--- a/include/gui/SensorManager.h
+++ b/include/gui/SensorManager.h
@@ -22,11 +22,9 @@
 #include <stdint.h>
 #include <sys/types.h>
 
-#include <binder/BinderService.h>
 #include <binder/IBinder.h>
 #include <binder/IPCThreadState.h>
 #include <binder/IServiceManager.h>
-#include <binder/PermissionCache.h>
 
 #include <utils/Errors.h>
 #include <utils/RefBase.h>
@@ -56,8 +54,7 @@
     static SensorManager& getInstanceForPackage(const String16& packageName);
     ~SensorManager();
 
-    ssize_t getSensorList(Sensor const* const** list);
-    ssize_t getAvailableSensorList(Sensor const* const** list);
+    ssize_t getSensorList(Sensor const* const** list) const;
     Sensor const* getDefaultSensor(int type);
     sp<SensorEventQueue> createEventQueue(String8 packageName = String8(""), int mode = 0);
     bool isDataInjectionEnabled();
@@ -67,27 +64,18 @@
     void sensorManagerDied();
 
     SensorManager(const String16& opPackageName);
-    status_t assertStateLocked();
-    void updateAvailableSensorList();
+    status_t assertStateLocked() const;
 
 private:
     static Mutex sLock;
     static std::map<String16, SensorManager*> sPackageInstances;
 
-    Mutex mLock;
-    sp<ISensorServer> mSensorServer;
-
-    // for Java API
-    Sensor const** mSensorList;
-
-    // for NDK API
-    Sensor const** mAvailableSensorList;
-    ssize_t mNumAvailableSensor;
-
-    Vector<Sensor> mSensors;
-    sp<IBinder::DeathRecipient> mDeathObserver;
+    mutable Mutex mLock;
+    mutable sp<ISensorServer> mSensorServer;
+    mutable Sensor const** mSensorList;
+    mutable Vector<Sensor> mSensors;
+    mutable sp<IBinder::DeathRecipient> mDeathObserver;
     const String16 mOpPackageName;
-    bool mBodyPermission;
 };
 
 // ----------------------------------------------------------------------------
diff --git a/libs/gui/SensorManager.cpp b/libs/gui/SensorManager.cpp
index 4277032..33608b5 100644
--- a/libs/gui/SensorManager.cpp
+++ b/libs/gui/SensorManager.cpp
@@ -89,8 +89,7 @@
 }
 
 SensorManager::SensorManager(const String16& opPackageName)
-    : mSensorList(NULL), mAvailableSensorList(NULL), mNumAvailableSensor(0),
-      mOpPackageName(opPackageName), mBodyPermission(false)
+    : mSensorList(0), mOpPackageName(opPackageName)
 {
     // okay we're not locked here, but it's not needed during construction
     assertStateLocked();
@@ -99,9 +98,6 @@
 SensorManager::~SensorManager()
 {
     free(mSensorList);
-    if (mAvailableSensorList) {
-        free(mAvailableSensorList);
-    }
 }
 
 void SensorManager::sensorManagerDied()
@@ -110,14 +106,10 @@
     mSensorServer.clear();
     free(mSensorList);
     mSensorList = NULL;
-    if (mAvailableSensorList) {
-        free(mAvailableSensorList);
-        mAvailableSensorList = NULL;
-    }
     mSensors.clear();
 }
 
-status_t SensorManager::assertStateLocked() {
+status_t SensorManager::assertStateLocked() const {
     bool initSensorManager = false;
     if (mSensorServer == NULL) {
         initSensorManager = true;
@@ -167,14 +159,13 @@
         for (size_t i=0 ; i<count ; i++) {
             mSensorList[i] = mSensors.array() + i;
         }
-
-        updateAvailableSensorList();
     }
 
     return NO_ERROR;
 }
 
-ssize_t SensorManager::getSensorList(Sensor const* const** list) {
+ssize_t SensorManager::getSensorList(Sensor const* const** list) const
+{
     Mutex::Autolock _l(mLock);
     status_t err = assertStateLocked();
     if (err < 0) {
@@ -184,76 +175,10 @@
     return static_cast<ssize_t>(mSensors.size());
 }
 
-void SensorManager::updateAvailableSensorList() {
-    const int uid = static_cast<int>(IPCThreadState::self()->getCallingUid());
-    const int pid = static_cast<int>(IPCThreadState::self()->getCallingPid());
-    const String16 BODY_SENSOR_PERMISSION("android.permission.BODY_SENSORS");
-    const String8 BODY_SENSOR_PERMISSION8("android.permission.BODY_SENSORS");
-
-    bool bodySensorPermission = false;
-
-    sp<IBinder> binder = defaultServiceManager()->getService(String16("permission"));
-    if (binder != NULL) {
-        bodySensorPermission = interface_cast<IPermissionController>(binder)->
-                checkPermission(BODY_SENSOR_PERMISSION, pid, uid);
-    }
-
-    // only update if app got BODY_SENSORS permission after last call or the sensor list has not
-    // been populated.
-    //
-    // it is not possible for the reverse transition, as the app will be killed when permission is
-    // revoked.
-    if ( (bodySensorPermission && !mBodyPermission) || mAvailableSensorList == NULL) {
-
-        // allocate only when necessary
-        if (mAvailableSensorList == NULL) {
-            // allocate a list big enough to fit all sensors (including those requires permission
-            // that the app do not have;
-            mAvailableSensorList =
-                    static_cast<Sensor const**>(malloc(mSensors.size() * sizeof(Sensor*)));
-
-            // first populate all sensors that do not need body sensor permission
-            ssize_t& n = mNumAvailableSensor;
-            for (size_t i = 0; i < mSensors.size() ; i++) {
-                if (mSensors[i].getRequiredPermission() != BODY_SENSOR_PERMISSION8) {
-                    mAvailableSensorList[n++] = mSensors.array() + i;
-                }
-            }
-        }
-
-        if (bodySensorPermission) {
-            // if the app just got the sensor permission back, fill the sensor at the end of list
-            ssize_t& n = mNumAvailableSensor;
-            for (size_t i = 0; i < mSensors.size() ; i++) {
-                if (mSensors[i].getRequiredPermission() == BODY_SENSOR_PERMISSION8) {
-                    mAvailableSensorList[n++] = mSensors.array() + i;
-                }
-            }
-        }
-
-        mBodyPermission = bodySensorPermission;
-    }
-}
-
-ssize_t SensorManager::getAvailableSensorList(Sensor const* const** list) {
-    Mutex::Autolock _l(mLock);
-    status_t err = assertStateLocked();
-    if (err < 0) {
-        return static_cast<ssize_t>(err);
-    }
-
-    updateAvailableSensorList();
-
-    *list = mAvailableSensorList;
-    return mNumAvailableSensor;
-}
-
-Sensor const* SensorManager::getDefaultSensor(int type) {
+Sensor const* SensorManager::getDefaultSensor(int type)
+{
     Mutex::Autolock _l(mLock);
     if (assertStateLocked() == NO_ERROR) {
-
-        updateAvailableSensorList();
-
         bool wakeUpSensor = false;
         // For the following sensor types, return a wake-up sensor. These types are by default
         // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return
@@ -267,9 +192,9 @@
         // in the future it will make sense to let the SensorService make
         // that decision.
         for (size_t i=0 ; i<mSensors.size() ; i++) {
-            if (mAvailableSensorList[i]->getType() == type &&
-                mAvailableSensorList[i]->isWakeUpSensor() == wakeUpSensor) {
-                return mAvailableSensorList[i];
+            if (mSensorList[i]->getType() == type &&
+                mSensorList[i]->isWakeUpSensor() == wakeUpSensor) {
+                return mSensorList[i];
             }
         }
     }
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 956d8e8..fd72b23 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -723,7 +723,14 @@
     Vector<Sensor> accessibleSensorList;
     for (size_t i = 0; i < initialSensorList.size(); i++) {
         Sensor sensor = initialSensorList[i];
-        accessibleSensorList.add(sensor);
+        if (canAccessSensor(sensor, "getSensorList", opPackageName)) {
+            accessibleSensorList.add(sensor);
+        } else {
+            ALOGI("Skipped sensor %s because it requires permission %s and app op %d",
+                  sensor.getName().string(),
+                  sensor.getRequiredPermission().string(),
+                  sensor.getRequiredAppOp());
+        }
     }
     return accessibleSensorList;
 }
diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk
index 1eb2361..1901ef9 100644
--- a/services/surfaceflinger/Android.mk
+++ b/services/surfaceflinger/Android.mk
@@ -122,6 +122,10 @@
 LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\"
 LOCAL_CPPFLAGS := -std=c++11
 
+ifneq ($(ENABLE_CPUSETS),)
+    LOCAL_CFLAGS += -DENABLE_CPUSETS
+endif
+
 LOCAL_SRC_FILES := \
     main_surfaceflinger.cpp
 
diff --git a/services/surfaceflinger/main_surfaceflinger.cpp b/services/surfaceflinger/main_surfaceflinger.cpp
index a74bc4c..6fa8b53 100644
--- a/services/surfaceflinger/main_surfaceflinger.cpp
+++ b/services/surfaceflinger/main_surfaceflinger.cpp
@@ -41,6 +41,13 @@
 
     set_sched_policy(0, SP_FOREGROUND);
 
+#ifdef ENABLE_CPUSETS
+    // Put most SurfaceFlinger threads in the system-background cpuset
+    // Keeps us from unnecessarily using big cores
+    // Do this after the binder thread pool init
+    set_cpuset_policy(0, SP_SYSTEM);
+#endif
+
     // initialize before clients can connect
     flinger->init();
 
