Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db895ad8 authored by Wei Wang's avatar Wei Wang
Browse files

Add atrace HAL 1.0

Bug: 111098596
Test: vts, atrace and systrace
Change-Id: If59efe6fe74e9ca832f38fe0cfe0186db5ca7fe3
parent 719d8f80
Loading
Loading
Loading
Loading

atrace/1.0/Android.bp

0 → 100644
+22 −0
Original line number Diff line number Diff line
// This file is autogenerated by hidl-gen -Landroidbp.

hidl_interface {
    name: "android.hardware.atrace@1.0",
    root: "android.hardware",
    vndk: {
        enabled: true,
    },
    srcs: [
        "types.hal",
        "IAtraceDevice.hal",
    ],
    interfaces: [
        "android.hidl.base@1.0",
    ],
    types: [
        "Status",
        "TracingCategory",
    ],
    gen_java: true,
}
+51 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.atrace@1.0;

interface IAtraceDevice {
    /**
     * Get vendor extended atrace points.
     *
     *
     * @return categories of tracing points the device extended.
     */
    listCategories() generates (vec<TracingCategory> categories);

    /**
     * A hook when atrace set to enable specific categories, so HAL
     * can enable kernel tracing points and/or notify other things
     * for userspace tracing turning on.
     *
     * @param categories A vector of strings of categories (corresponding to
     *        TracingCategory.name) atrace needs to be enabled.
     *
     * @return status SUCCESS on success,
     *         ERROR_TRACING_POINT on error with enabling categories,
     *         ERROR_INVALID_ARGUMENT on invalid argument passed.
     */
    enableCategories(vec<string> categories) generates (Status status);

    /**
     * A hook when atrace set to clean up tracing categories, so HAL
     * can disable all kernel tracing points and/or notify other things
     * for userspace tracing turning off.
     *
     * @return status SUCCESS on success,
     *         ERROR_TRACING_POINT on error with disabling categories.
     */
    disableAllCategories() generates (Status status);
};
+35 −0
Original line number Diff line number Diff line
//
// Copyright (C) 2018 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.

cc_binary {
    name: "android.hardware.atrace@1.0-service",
    defaults: ["hidl_defaults"],
    relative_install_path: "hw",
    vendor: true,
    init_rc: ["android.hardware.atrace@1.0-service.rc"],
    vintf_fragments: ["android.hardware.atrace@1.0-service.xml"],
    srcs: [
        "AtraceDevice.cpp",
        "service.cpp",
    ],
    shared_libs: [
        "liblog",
        "libbase",
        "libutils",
        "libhidlbase",
        "libhidltransport",
        "android.hardware.atrace@1.0",
    ],
}
+110 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.
 */

#include <android-base/file.h>
#include <android-base/logging.h>

#include "AtraceDevice.h"

namespace android {
namespace hardware {
namespace atrace {
namespace V1_0 {
namespace implementation {

using ::android::hardware::atrace::V1_0::Status;
using ::android::hardware::atrace::V1_0::TracingCategory;

struct TracingConfig {
    std::string description;
    std::vector<std::pair<std::string, bool>> paths;
};

// This is a map stores categories and their sysfs paths with required flags
const std::map<std::string, TracingConfig> kTracingMap = {
    // gfx
    {
        "gfx",
        {"Graphics",
         {{"/sys/kernel/debug/tracing/events/mdss/enable", false},
          {"/sys/kernel/debug/tracing/events/sde/enable", false},
          {"/sys/kernel/debug/tracing/events/mali_systrace/enable", false}}},
    },
    {
        "ion",
        {"ION allocation",
         {{"/sys/kernel/debug/tracing/events/kmem/ion_alloc_buffer_start/enable", true}}},
    },
};

// Methods from ::android::hardware::atrace::V1_0::IAtraceDevice follow.
Return<void> AtraceDevice::listCategories(listCategories_cb _hidl_cb) {
    hidl_vec<TracingCategory> categories;
    categories.resize(kTracingMap.size());
    std::size_t i = 0;
    for (auto& c : kTracingMap) {
        categories[i].name = c.first;
        categories[i].description = c.second.description;
        i++;
    }
    _hidl_cb(categories);
    return Void();
}

Return<::android::hardware::atrace::V1_0::Status> AtraceDevice::enableCategories(
    const hidl_vec<hidl_string>& categories) {
    if (!categories.size()) {
        return Status::ERROR_INVALID_ARGUMENT;
    }
    for (auto& c : categories) {
        if (kTracingMap.count(c)) {
            for (auto& p : kTracingMap.at(c).paths) {
                if (!android::base::WriteStringToFile("1", p.first)) {
                    LOG(ERROR) << "Failed to enable tracing on: " << p.first;
                    if (p.second) {
                        // disable before return
                        disableAllCategories();
                        return Status::ERROR_TRACING_POINT;
                    }
                }
            }
        } else {
            return Status::ERROR_INVALID_ARGUMENT;
        }
    }
    return Status::SUCCESS;
}

Return<::android::hardware::atrace::V1_0::Status> AtraceDevice::disableAllCategories() {
    auto ret = Status::SUCCESS;
    for (auto& c : kTracingMap) {
        for (auto& p : c.second.paths) {
            if (!android::base::WriteStringToFile("0", p.first)) {
                LOG(ERROR) << "Failed to enable tracing on: " << p.first;
                if (p.second) {
                    ret = Status::ERROR_TRACING_POINT;
                }
            }
        }
    }
    return ret;
}

}  // namespace implementation
}  // namespace V1_0
}  // namespace atrace
}  // namespace hardware
}  // namespace android
+54 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.
 */

#ifndef ANDROID_HARDWARE_ATRACE_V1_0_ATRACEDEVICE_H
#define ANDROID_HARDWARE_ATRACE_V1_0_ATRACEDEVICE_H

#include <android/hardware/atrace/1.0/IAtraceDevice.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>

namespace android {
namespace hardware {
namespace atrace {
namespace V1_0 {
namespace implementation {

using ::android::sp;
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;

struct AtraceDevice : public IAtraceDevice {
    // Methods from ::android::hardware::atrace::V1_0::IAtraceDevice follow.
    Return<void> listCategories(listCategories_cb _hidl_cb) override;
    Return<::android::hardware::atrace::V1_0::Status> enableCategories(
        const hidl_vec<hidl_string>& categories) override;
    Return<::android::hardware::atrace::V1_0::Status> disableAllCategories() override;

    // Methods from ::android::hidl::base::V1_0::IBase follow.
};

}  // namespace implementation
}  // namespace V1_0
}  // namespace atrace
}  // namespace hardware
}  // namespace android

#endif  // ANDROID_HARDWARE_ATRACE_V1_0_ATRACEDEVICE_H
Loading