diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h
index 7b80dd9..5a37e6a 100644
--- a/include/binder/Parcel.h
+++ b/include/binder/Parcel.h
@@ -372,11 +372,9 @@
 
 private:
     size_t mBlobAshmemSize;
-    size_t mOpenAshmemSize;
 
 public:
     size_t getBlobAshmemSize() const;
-    size_t getOpenAshmemSize() const;
 };
 
 // ---------------------------------------------------------------------------
@@ -444,9 +442,9 @@
 
 // Generic acquire and release of objects.
 void acquire_object(const sp<ProcessState>& proc,
-                    const flat_binder_object& obj, const void* who, size_t* outAshmemSize);
+                    const flat_binder_object& obj, const void* who);
 void release_object(const sp<ProcessState>& proc,
-                    const flat_binder_object& obj, const void* who, size_t* outAshmemSize);
+                    const flat_binder_object& obj, const void* who);
 
 void flatten_binder(const sp<ProcessState>& proc,
                     const sp<IBinder>& binder, flat_binder_object* out);
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index 5a62fce..436af85 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -96,7 +96,7 @@
 };
 
 void acquire_object(const sp<ProcessState>& proc,
-    const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
+    const flat_binder_object& obj, const void* who)
 {
     switch (obj.type) {
         case BINDER_TYPE_BINDER:
@@ -123,13 +123,8 @@
             return;
         }
         case BINDER_TYPE_FD: {
-            if (obj.cookie != 0) {
-                // If we own an ashmem fd, keep track of how much memory it refers to.
-                int size = ashmem_get_size_region(obj.handle);
-                if (size > 0) {
-                    *outAshmemSize += size;
-                }
-            }
+            // intentionally blank -- nothing to do to acquire this, but we do
+            // recognize it as a legitimate object type.
             return;
         }
     }
@@ -138,7 +133,7 @@
 }
 
 void release_object(const sp<ProcessState>& proc,
-    const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
+    const flat_binder_object& obj, const void* who)
 {
     switch (obj.type) {
         case BINDER_TYPE_BINDER:
@@ -165,14 +160,7 @@
             return;
         }
         case BINDER_TYPE_FD: {
-            if (obj.cookie != 0) {
-                int size = ashmem_get_size_region(obj.handle);
-                if (size > 0) {
-                    *outAshmemSize -= size;
-                }
-
-                close(obj.handle);
-            }
+            if (obj.cookie != 0) close(obj.handle);
             return;
         }
     }
@@ -514,7 +502,7 @@
 
             flat_binder_object* flat
                 = reinterpret_cast<flat_binder_object*>(mData + off);
-            acquire_object(proc, *flat, this, &mOpenAshmemSize);
+            acquire_object(proc, *flat, this);
 
             if (flat->type == BINDER_TYPE_FD) {
                 // If this is a file descriptor, we need to dup it so the
@@ -1235,7 +1223,7 @@
         // Need to write meta-data?
         if (nullMetaData || val.binder != 0) {
             mObjects[mObjectsSize] = mDataPos;
-            acquire_object(ProcessState::self(), val, this, &mOpenAshmemSize);
+            acquire_object(ProcessState::self(), val, this);
             mObjectsSize++;
         }
 
@@ -2095,7 +2083,7 @@
         i--;
         const flat_binder_object* flat
             = reinterpret_cast<flat_binder_object*>(data+objects[i]);
-        release_object(proc, *flat, this, &mOpenAshmemSize);
+        release_object(proc, *flat, this);
     }
 }
 
@@ -2109,7 +2097,7 @@
         i--;
         const flat_binder_object* flat
             = reinterpret_cast<flat_binder_object*>(data+objects[i]);
-        acquire_object(proc, *flat, this, &mOpenAshmemSize);
+        acquire_object(proc, *flat, this);
     }
 }
 
@@ -2297,7 +2285,7 @@
                     // will need to rescan because we may have lopped off the only FDs
                     mFdsKnown = false;
                 }
-                release_object(proc, *flat, this, &mOpenAshmemSize);
+                release_object(proc, *flat, this);
             }
             binder_size_t* objects =
                 (binder_size_t*)realloc(mObjects, objectsSize*sizeof(binder_size_t));
@@ -2384,7 +2372,6 @@
     mAllowFds = true;
     mOwner = NULL;
     mBlobAshmemSize = 0;
-    mOpenAshmemSize = 0;
 }
 
 void Parcel::scanForFds() const
@@ -2407,11 +2394,6 @@
     return mBlobAshmemSize;
 }
 
-size_t Parcel::getOpenAshmemSize() const
-{
-    return mOpenAshmemSize;
-}
-
 // --- Parcel::Blob ---
 
 Parcel::Blob::Blob() :
