blob: 12aaf9580ee01cfb2d71abc4e2334c6a1c97928f [file] [log] [blame]
Chenbo Fengd3e29562018-08-24 15:05:01 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Steven Morelanda3074542020-01-13 14:13:44 -080017#include <android-base/logging.h>
Chenbo Fengf434e862018-06-27 14:08:39 -070018#include <android-base/stringprintf.h>
Chenbo Fengd3e29562018-08-24 15:05:01 -070019#include <benchmark/benchmark.h>
20
21#include "bpf/BpfMap.h"
22#include "bpf/BpfUtils.h"
Chenbo Fengf434e862018-06-27 14:08:39 -070023
Chenbo Fengd3e29562018-08-24 15:05:01 -070024constexpr uint32_t TEST_MAP_SIZE = 10000;
25
Steven Morelanda3074542020-01-13 14:13:44 -080026using android::base::Result;
Chenbo Fengf434e862018-06-27 14:08:39 -070027using android::base::StringPrintf;
Chenbo Fengd3e29562018-08-24 15:05:01 -070028using android::bpf::BpfMap;
29
30class BpfBenchMark : public ::benchmark::Fixture {
31 public:
32 BpfBenchMark() : mBpfTestMap(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, BPF_F_NO_PREALLOC) {}
33 BpfMap<uint32_t, uint32_t> mBpfTestMap;
34};
35
36BENCHMARK_DEFINE_F(BpfBenchMark, MapWriteNewEntry)(benchmark::State& state) {
Yi Kongd49c83d2019-03-06 14:03:53 -080037 for (auto _ : state) {
Steven Morelanda3074542020-01-13 14:13:44 -080038 // TODO(b/147676069) assert
39 mBpfTestMap.writeValue(state.range(0), state.range(0), BPF_NOEXIST);
Yi Kongd49c83d2019-03-06 14:03:53 -080040 }
Chenbo Fengd3e29562018-08-24 15:05:01 -070041}
42
43BENCHMARK_DEFINE_F(BpfBenchMark, MapUpdateEntry)(benchmark::State& state) {
Sehee Park8659b8d2018-11-16 10:53:16 +090044 for (uint32_t i = 0; i < TEST_MAP_SIZE; i++) {
Steven Morelanda3074542020-01-13 14:13:44 -080045 // TODO(b/147676069) assert
46 mBpfTestMap.writeValue(i, i, BPF_NOEXIST);
Bernie Innocenti6f9fd902018-10-11 20:50:23 +090047 }
48 for (auto _ : state) {
Steven Morelanda3074542020-01-13 14:13:44 -080049 // TODO(b/147676069) assert
50 mBpfTestMap.writeValue(state.range(0), state.range(0) + 1, BPF_EXIST);
Bernie Innocenti6f9fd902018-10-11 20:50:23 +090051 }
Chenbo Fengd3e29562018-08-24 15:05:01 -070052}
53
54BENCHMARK_DEFINE_F(BpfBenchMark, MapDeleteAddEntry)(benchmark::State& state) {
Sehee Park8659b8d2018-11-16 10:53:16 +090055 for (uint32_t i = 0; i < TEST_MAP_SIZE; i++) {
Steven Morelanda3074542020-01-13 14:13:44 -080056 // TODO(b/147676069) assert
57 mBpfTestMap.writeValue(i, i, BPF_NOEXIST);
Bernie Innocenti6f9fd902018-10-11 20:50:23 +090058 }
Chenbo Fengd3e29562018-08-24 15:05:01 -070059 for (auto _ : state) {
Steven Morelanda3074542020-01-13 14:13:44 -080060 // TODO(b/147676069) assert
61 mBpfTestMap.deleteValue(state.range(0));
62 // TODO(b/147676069) assert
63 mBpfTestMap.writeValue(state.range(0), state.range(0) + 1, BPF_NOEXIST);
Chenbo Fengd3e29562018-08-24 15:05:01 -070064 }
65}
66
Chenbo Fengf434e862018-06-27 14:08:39 -070067BENCHMARK_DEFINE_F(BpfBenchMark, WaitForRcu)(benchmark::State& state) {
68 for (auto _ : state) {
69 int ret = android::bpf::synchronizeKernelRCU();
70 if (ret) {
71 state.SkipWithError(
72 StringPrintf("synchronizeKernelRCU() failed with errno=%d", -ret).c_str());
73 }
74 }
75}
76
Chenbo Fengd3e29562018-08-24 15:05:01 -070077BENCHMARK_REGISTER_F(BpfBenchMark, MapUpdateEntry)->Arg(1);
78BENCHMARK_REGISTER_F(BpfBenchMark, MapWriteNewEntry)->Arg(1);
79BENCHMARK_REGISTER_F(BpfBenchMark, MapDeleteAddEntry)->Arg(1);
Chenbo Fengf434e862018-06-27 14:08:39 -070080BENCHMARK_REGISTER_F(BpfBenchMark, WaitForRcu)->Arg(1);
Chenbo Fengd3e29562018-08-24 15:05:01 -070081BENCHMARK_MAIN();