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

Commit ae5d2304 authored by Wei Wang's avatar Wei Wang Committed by Android (Google) Code Review
Browse files

Merge "Add atrace HAL 1.0"

parents b4484686 db895ad8
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