diff --git a/Android.bp b/Android.bp index 7ba06adc36..143f0f830a 100644 --- a/Android.bp +++ b/Android.bp @@ -3,6 +3,7 @@ subdirs = [ "audio/common/2.0", "audio/effect/2.0", "benchmarks/msgq/1.0", + "memtrack/1.0", "nfc/1.0", "nfc/1.0/default", "tests/bar/1.0", diff --git a/memtrack/1.0/Android.bp b/memtrack/1.0/Android.bp new file mode 100644 index 0000000000..3696aeab20 --- /dev/null +++ b/memtrack/1.0/Android.bp @@ -0,0 +1,46 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +genrule { + name: "android.hardware.memtrack@1.0_genc++", + tool: "hidl-gen", + cmd: "$tool -o $genDir -Lc++ -randroid.hardware:hardware/interfaces android.hardware.memtrack@1.0", + srcs: [ + "types.hal", + "IMemtrack.hal", + ], + out: [ + "android/hardware/memtrack/1.0/types.cpp", + "android/hardware/memtrack/1.0/MemtrackAll.cpp", + ], +} + +genrule { + name: "android.hardware.memtrack@1.0_genc++_headers", + tool: "hidl-gen", + cmd: "$tool -o $genDir -Lc++ -randroid.hardware:hardware/interfaces android.hardware.memtrack@1.0", + srcs: [ + "types.hal", + "IMemtrack.hal", + ], + out: [ + "android/hardware/memtrack/1.0/types.h", + "android/hardware/memtrack/1.0/IMemtrack.h", + "android/hardware/memtrack/1.0/IHwMemtrack.h", + "android/hardware/memtrack/1.0/BnMemtrack.h", + "android/hardware/memtrack/1.0/BpMemtrack.h", + "android/hardware/memtrack/1.0/BsMemtrack.h", + ], +} + +cc_library_shared { + name: "android.hardware.memtrack@1.0", + generated_sources: ["android.hardware.memtrack@1.0_genc++"], + generated_headers: ["android.hardware.memtrack@1.0_genc++_headers"], + export_generated_headers: ["android.hardware.memtrack@1.0_genc++_headers"], + shared_libs: [ + "libhidl", + "libhwbinder", + "libutils", + "libcutils", + ], +} diff --git a/memtrack/1.0/Android.mk b/memtrack/1.0/Android.mk new file mode 100644 index 0000000000..4abe505bcb --- /dev/null +++ b/memtrack/1.0/Android.mk @@ -0,0 +1,204 @@ +# This file is autogenerated by hidl-gen. Do not edit manually. + +LOCAL_PATH := $(call my-dir) + +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.memtrack@1.0-java +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(local-generated-sources-dir) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +# +# Build types.hal (MemtrackFlag) +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/MemtrackFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::types.MemtrackFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackRecord) +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/MemtrackRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::types.MemtrackRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackStatus) +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/MemtrackStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::types.MemtrackStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackType) +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/MemtrackType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::types.MemtrackType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IMemtrack.hal +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/IMemtrack.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMemtrack.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::IMemtrack + +$(GEN): $(LOCAL_PATH)/IMemtrack.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_JAVA_LIBRARY) + + +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.memtrack@1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(local-generated-sources-dir) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +# +# Build types.hal (MemtrackFlag) +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/MemtrackFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::types.MemtrackFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackRecord) +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/MemtrackRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::types.MemtrackRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackStatus) +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/MemtrackStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::types.MemtrackStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackType) +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/MemtrackType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::types.MemtrackType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IMemtrack.hal +# +GEN := $(intermediates)/android/hardware/memtrack/1.0/IMemtrack.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMemtrack.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.memtrack@1.0::IMemtrack + +$(GEN): $(LOCAL_PATH)/IMemtrack.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/memtrack/1.0/IMemtrack.hal b/memtrack/1.0/IMemtrack.hal new file mode 100644 index 0000000000..064f2feb17 --- /dev/null +++ b/memtrack/1.0/IMemtrack.hal @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.memtrack@1.0; + +/* + * The Memory Tracker HAL is designed to return information about + * device-specific memory usage. + * The primary goal is to be able to track memory that is not + * trackable in any other way, for example texture memory that is allocated by + * a process, but not mapped in to that process's address space. + * A secondary goal is to be able to categorize memory used by a process into + * GL, graphics, etc. All memory sizes must be in real memory usage, + * accounting for stride, bit depth, rounding up to page size, etc. + * + * Constructor for the interface should be used to perform memtrack management + * setup actions and is called once before any calls to getMemory(). + */ +interface IMemtrack { + /* + * getMemory() populates MemtrackRecord vector with the sizes of memory + * plus associated flags for that memory. + * + * This function must be thread-safe, it may get called from multiple + * threads at the same time. + * + * A process collecting memory statistics will call getMemory for each + * combination of pid and memory type. For each memory type that it + * recognizes, the HAL must fill out an array of memtrack_record + * structures breaking down the statistics of that memory type as much as + * possible. For example, + * getMemory(, GL) might return: + * { { 4096, ACCOUNTED | PRIVATE | SYSTEM }, + * { 40960, UNACCOUNTED | PRIVATE | SYSTEM }, + * { 8192, ACCOUNTED | PRIVATE | DEDICATED }, + * { 8192, UNACCOUNTED | PRIVATE | DEDICATED } } + * If the HAL cannot differentiate between SYSTEM and DEDICATED memory, it + * could return: + * { { 12288, ACCOUNTED | PRIVATE }, + * { 49152, UNACCOUNTED | PRIVATE } } + * + * Memory must not overlap between types. For example, a graphics buffer + * that has been mapped into the GPU as a surface must show up when + * GRAPHICS is requested and not when GL + * is requested. + * + * @param pid process for which memory infromation is requested + * @param type memory type that information is being requested about + * @return records vector of MemtrackRecord containing memory information + * @return retval SUCCESS on success, TYPE_NOT_FOUND if the type is not + * supported. + */ + getMemory(int32_t pid, MemtrackType type) + generates (MemtrackStatus retval, vec records); +}; diff --git a/memtrack/1.0/types.hal b/memtrack/1.0/types.hal new file mode 100644 index 0000000000..3d702b3f34 --- /dev/null +++ b/memtrack/1.0/types.hal @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.memtrack@1.0; + +/* + * SMAPS_ACCOUNTED/SMAPS_UNACCOUNTED + * Flags to differentiate memory that can already be accounted for in + * /proc//smaps, + * (Shared_Clean + Shared_Dirty + Private_Clean + Private_Dirty = Size). + * In general, memory mapped in to a userspace process is accounted unless + * it was mapped with remap_pfn_range. + * Exactly one of these must be set. + * + * SHARED/SHARED_PSS/PRIVATE + * Flags to differentiate memory shared across multiple processes vs. memory + * used by a single process. + * If SHARED_PSS flags is used, the memory must be divided by the number of + * processes holding reference to it (shared / num_processes). + * Only zero or one of these may be set in a record. + * If none are set, record is assumed to count shared + private memory. + * + * SYSTEM/DEDICATED + * Flags to differentiate memory taken from the kernel's allocation pool vs. + * memory that is dedicated to non-kernel allocations, for example a carveout + * or separate video memory. Only zero or one of these may be set in a record. + * If none are set, record is assumed to count system + dedicated memory. + * + * NONSECURE/SECURE + * Flags to differentiate memory accessible by the CPU in non-secure mode vs. + * memory that is protected. Only zero or one of these may be set in a record. + * If none are set, record is assumed to count secure + nonsecure memory. + */ +enum MemtrackFlag : uint32_t { + SMAPS_ACCOUNTED = 1 << 1, + SMAPS_UNACCOUNTED = 1 << 2, + SHARED = 1 << 3, + SHARED_PSS = 1 << 4, + PRIVATE = 1 << 5, + SYSTEM = 1 << 6, + DEDICATED = 1 << 7, + NONSECURE = 1 << 8, + SECURE = 1 << 9, +}; + +/* Tags which define the usage of the memory buffers. */ +enum MemtrackType : uint32_t { + OTHER = 0, + GL = 1, + GRAPHICS = 2, + MULTIMEDIA = 3, + CAMERA = 4, + NUM_TYPES, +}; + +enum MemtrackStatus : uint32_t { + SUCCESS = 0, + MEMORY_TRACKING_NOT_SUPPORTED = 1, + TYPE_NOT_SUPPORTED = 2, +}; + +/* A vector of MemtrackRecord is returned by the function getMemory(). + * Each record consists of the size of the memory used by the process and + * flags indicate the all the MemtrackFlag that are valid for this record. + * see getMemory() comments for further details. + */ +struct MemtrackRecord { + uint64_t sizeInBytes; + /* + * This is the bitfield for the MemtrackFlag indicating all the flags that + * are valid for this record. + */ + uint32_t flags; +};