Skip to content

Commit 9fbb28c

Browse files
committed
simpleperf: don't looking for _text symbol in /proc/kallsyms.
simpleperf looks for _text symbol in /proc/kallsyms to get kernel address space information. But that info is no longer needed. As some kernels don't have _text symbol, we should remove the corresponding code. Bug: 27814103 Change-Id: I4eb9869b58c51846c99b1204f304cd107a0eb354 (cherry picked from commit 7134f38)
1 parent b543b4e commit 9fbb28c

File tree

3 files changed

+21
-64
lines changed

3 files changed

+21
-64
lines changed

simpleperf/cmd_record.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -527,24 +527,19 @@ std::unique_ptr<RecordFileWriter> RecordCommand::CreateRecordFile(const std::str
527527

528528
bool RecordCommand::DumpKernelAndModuleMmaps() {
529529
KernelMmap kernel_mmap;
530-
std::vector<ModuleMmap> module_mmaps;
531-
if (!GetKernelAndModuleMmaps(&kernel_mmap, &module_mmaps)) {
532-
return false;
533-
}
530+
std::vector<KernelMmap> module_mmaps;
531+
GetKernelAndModuleMmaps(&kernel_mmap, &module_mmaps);
532+
534533
const perf_event_attr* attr = event_selection_set_.FindEventAttrByType(measured_event_types_[0]);
535534
CHECK(attr != nullptr);
536535
MmapRecord mmap_record = CreateMmapRecord(*attr, true, UINT_MAX, 0, kernel_mmap.start_addr,
537-
kernel_mmap.len, kernel_mmap.pgoff, kernel_mmap.name);
536+
kernel_mmap.len, 0, kernel_mmap.filepath);
538537
if (!ProcessRecord(&mmap_record)) {
539538
return false;
540539
}
541540
for (auto& module_mmap : module_mmaps) {
542-
std::string filename = module_mmap.filepath;
543-
if (filename.empty()) {
544-
filename = "[" + module_mmap.name + "]";
545-
}
546541
MmapRecord mmap_record = CreateMmapRecord(*attr, true, UINT_MAX, 0, module_mmap.start_addr,
547-
module_mmap.len, 0, filename);
542+
module_mmap.len, 0, module_mmap.filepath);
548543
if (!ProcessRecord(&mmap_record)) {
549544
return false;
550545
}

simpleperf/environment.cpp

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -141,37 +141,8 @@ bool ProcessKernelSymbols(const std::string& symbol_file,
141141
return false;
142142
}
143143

144-
static bool FindStartOfKernelSymbolCallback(const KernelSymbol& symbol, uint64_t* start_addr) {
145-
if (symbol.module == nullptr) {
146-
*start_addr = symbol.addr;
147-
return true;
148-
}
149-
return false;
150-
}
151-
152-
static bool FindStartOfKernelSymbol(const std::string& symbol_file, uint64_t* start_addr) {
153-
return ProcessKernelSymbols(
154-
symbol_file, std::bind(&FindStartOfKernelSymbolCallback, std::placeholders::_1, start_addr));
155-
}
156-
157-
static bool FindKernelFunctionSymbolCallback(const KernelSymbol& symbol, const std::string& name,
158-
uint64_t* addr) {
159-
if ((symbol.type == 'T' || symbol.type == 'W' || symbol.type == 'A') &&
160-
symbol.module == nullptr && name == symbol.name) {
161-
*addr = symbol.addr;
162-
return true;
163-
}
164-
return false;
165-
}
166-
167-
static bool FindKernelFunctionSymbol(const std::string& symbol_file, const std::string& name,
168-
uint64_t* addr) {
169-
return ProcessKernelSymbols(
170-
symbol_file, std::bind(&FindKernelFunctionSymbolCallback, std::placeholders::_1, name, addr));
171-
}
172-
173-
std::vector<ModuleMmap> GetLoadedModules() {
174-
std::vector<ModuleMmap> result;
144+
static std::vector<KernelMmap> GetLoadedModules() {
145+
std::vector<KernelMmap> result;
175146
FILE* fp = fopen("/proc/modules", "re");
176147
if (fp == nullptr) {
177148
// There is no /proc/modules on Android devices, so we don't print error if failed to open it.
@@ -185,7 +156,7 @@ std::vector<ModuleMmap> GetLoadedModules() {
185156
char name[reader.MaxLineSize()];
186157
uint64_t addr;
187158
if (sscanf(line, "%s%*lu%*u%*s%*s 0x%" PRIx64, name, &addr) == 2) {
188-
ModuleMmap map;
159+
KernelMmap map;
189160
map.name = name;
190161
map.start_addr = addr;
191162
result.push_back(map);
@@ -223,9 +194,9 @@ static void GetAllModuleFiles(const std::string& path,
223194
}
224195
}
225196

226-
static std::vector<ModuleMmap> GetModulesInUse() {
197+
static std::vector<KernelMmap> GetModulesInUse() {
227198
// TODO: There is no /proc/modules or /lib/modules on Android, find methods work on it.
228-
std::vector<ModuleMmap> module_mmaps = GetLoadedModules();
199+
std::vector<KernelMmap> module_mmaps = GetLoadedModules();
229200
std::string linux_version = GetLinuxVersion();
230201
std::string module_dirpath = "/lib/modules/" + linux_version + "/kernel";
231202
std::unordered_map<std::string, std::string> module_file_map;
@@ -239,24 +210,23 @@ static std::vector<ModuleMmap> GetModulesInUse() {
239210
return module_mmaps;
240211
}
241212

242-
bool GetKernelAndModuleMmaps(KernelMmap* kernel_mmap, std::vector<ModuleMmap>* module_mmaps) {
243-
if (!FindStartOfKernelSymbol("/proc/kallsyms", &kernel_mmap->start_addr)) {
244-
LOG(DEBUG) << "call FindStartOfKernelSymbol() failed";
245-
return false;
246-
}
247-
if (!FindKernelFunctionSymbol("/proc/kallsyms", "_text", &kernel_mmap->pgoff)) {
248-
LOG(DEBUG) << "call FindKernelFunctionSymbol() failed";
249-
return false;
250-
}
213+
void GetKernelAndModuleMmaps(KernelMmap* kernel_mmap, std::vector<KernelMmap>* module_mmaps) {
251214
kernel_mmap->name = DEFAULT_KERNEL_MMAP_NAME;
215+
kernel_mmap->start_addr = 0;
216+
kernel_mmap->filepath = kernel_mmap->name;
252217
*module_mmaps = GetModulesInUse();
218+
for (auto& map : *module_mmaps) {
219+
if (map.filepath.empty()) {
220+
map.filepath = "[" + map.name + "]";
221+
}
222+
}
223+
253224
if (module_mmaps->size() == 0) {
254225
kernel_mmap->len = std::numeric_limits<unsigned long long>::max() - kernel_mmap->start_addr;
255226
} else {
256227
std::sort(
257228
module_mmaps->begin(), module_mmaps->end(),
258-
[](const ModuleMmap& m1, const ModuleMmap& m2) { return m1.start_addr < m2.start_addr; });
259-
CHECK_LE(kernel_mmap->start_addr, (*module_mmaps)[0].start_addr);
229+
[](const KernelMmap& m1, const KernelMmap& m2) { return m1.start_addr < m2.start_addr; });
260230
// When not having enough privilege, all addresses are read as 0.
261231
if (kernel_mmap->start_addr == (*module_mmaps)[0].start_addr) {
262232
kernel_mmap->len = 0;
@@ -274,7 +244,6 @@ bool GetKernelAndModuleMmaps(KernelMmap* kernel_mmap, std::vector<ModuleMmap>* m
274244
module_mmaps->back().len =
275245
std::numeric_limits<unsigned long long>::max() - module_mmaps->back().start_addr;
276246
}
277-
return true;
278247
}
279248

280249
static bool ReadThreadNameAndTgid(const std::string& status_file, std::string* comm, pid_t* tgid) {

simpleperf/environment.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,13 @@ std::vector<int> GetCpusFromString(const std::string& s);
3232
constexpr char DEFAULT_KERNEL_MMAP_NAME[] = "[kernel.kallsyms]_text";
3333

3434
struct KernelMmap {
35-
std::string name;
36-
uint64_t start_addr;
37-
uint64_t len;
38-
uint64_t pgoff;
39-
};
40-
41-
struct ModuleMmap {
4235
std::string name;
4336
uint64_t start_addr;
4437
uint64_t len;
4538
std::string filepath;
4639
};
4740

48-
bool GetKernelAndModuleMmaps(KernelMmap* kernel_mmap, std::vector<ModuleMmap>* module_mmaps);
41+
void GetKernelAndModuleMmaps(KernelMmap* kernel_mmap, std::vector<KernelMmap>* module_mmaps);
4942

5043
struct ThreadComm {
5144
pid_t pid, tid;

0 commit comments

Comments
 (0)