Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf tools: Make fetch_kernel_version() publicly available

There are 2 places in llvm-utils.c which find kernel version information
through uname. This patch extracts the uname related code into a
fetch_kernel_version() function and puts it into util.h so it can be
reused.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1446818135-87310-1-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Wang Nan and committed by
Arnaldo Carvalho de Melo
07bc5c69 45825d8a

+50 -34
+17 -34
tools/perf/util/llvm-utils.c
··· 4 4 */ 5 5 6 6 #include <stdio.h> 7 - #include <sys/utsname.h> 8 7 #include "util.h" 9 8 #include "debug.h" 10 9 #include "llvm-utils.h" ··· 215 216 const char *suffix_dir = ""; 216 217 217 218 char *autoconf_path; 218 - struct utsname utsname; 219 219 220 220 int err; 221 221 222 222 if (!test_dir) { 223 - err = uname(&utsname); 224 - if (err) { 225 - pr_warning("uname failed: %s\n", strerror(errno)); 226 - return -EINVAL; 227 - } 223 + /* _UTSNAME_LENGTH is 65 */ 224 + char release[128]; 228 225 229 - test_dir = utsname.release; 226 + err = fetch_kernel_version(NULL, release, 227 + sizeof(release)); 228 + if (err) 229 + return -EINVAL; 230 + 231 + test_dir = release; 230 232 prefix_dir = "/lib/modules/"; 231 233 suffix_dir = "/build"; 232 234 } ··· 325 325 pr_debug("include option is set to %s\n", *kbuild_include_opts); 326 326 } 327 327 328 - static unsigned long 329 - fetch_kernel_version(void) 330 - { 331 - struct utsname utsname; 332 - int version, patchlevel, sublevel, err; 333 - 334 - if (uname(&utsname)) 335 - return 0; 336 - 337 - err = sscanf(utsname.release, "%d.%d.%d", 338 - &version, &patchlevel, &sublevel); 339 - 340 - if (err != 3) { 341 - pr_debug("Unablt to get kernel version from uname '%s'\n", 342 - utsname.release); 343 - return 0; 344 - } 345 - 346 - return (version << 16) + (patchlevel << 8) + sublevel; 347 - } 348 - 349 328 int llvm__compile_bpf(const char *path, void **p_obj_buf, 350 329 size_t *p_obj_buf_sz) 351 330 { 331 + size_t obj_buf_sz; 332 + void *obj_buf = NULL; 352 333 int err, nr_cpus_avail; 353 - char clang_path[PATH_MAX], nr_cpus_avail_str[64]; 334 + unsigned int kernel_version; 354 335 char linux_version_code_str[64]; 355 336 const char *clang_opt = llvm_param.clang_opt; 356 - const char *template = llvm_param.clang_bpf_cmd_template; 337 + char clang_path[PATH_MAX], nr_cpus_avail_str[64]; 357 338 char *kbuild_dir = NULL, *kbuild_include_opts = NULL; 358 - void *obj_buf = NULL; 359 - size_t obj_buf_sz; 339 + const char *template = llvm_param.clang_bpf_cmd_template; 360 340 361 341 if (!template) 362 342 template = CLANG_BPF_CMD_DEFAULT_TEMPLATE; ··· 368 388 snprintf(nr_cpus_avail_str, sizeof(nr_cpus_avail_str), "%d", 369 389 nr_cpus_avail); 370 390 391 + if (fetch_kernel_version(&kernel_version, NULL, 0)) 392 + kernel_version = 0; 393 + 371 394 snprintf(linux_version_code_str, sizeof(linux_version_code_str), 372 - "0x%lx", fetch_kernel_version()); 395 + "0x%x", kernel_version); 373 396 374 397 force_set_env("NR_CPUS", nr_cpus_avail_str); 375 398 force_set_env("LINUX_VERSION_CODE", linux_version_code_str);
+30
tools/perf/util/util.c
··· 3 3 #include "debug.h" 4 4 #include <api/fs/fs.h> 5 5 #include <sys/mman.h> 6 + #include <sys/utsname.h> 6 7 #ifdef HAVE_BACKTRACE_SUPPORT 7 8 #include <execinfo.h> 8 9 #endif ··· 665 664 666 665 closedir(dir); 667 666 return ret ? false : true; 667 + } 668 + 669 + int 670 + fetch_kernel_version(unsigned int *puint, char *str, 671 + size_t str_size) 672 + { 673 + struct utsname utsname; 674 + int version, patchlevel, sublevel, err; 675 + 676 + if (uname(&utsname)) 677 + return -1; 678 + 679 + if (str && str_size) { 680 + strncpy(str, utsname.release, str_size); 681 + str[str_size - 1] = '\0'; 682 + } 683 + 684 + err = sscanf(utsname.release, "%d.%d.%d", 685 + &version, &patchlevel, &sublevel); 686 + 687 + if (err != 3) { 688 + pr_debug("Unablt to get kernel version from uname '%s'\n", 689 + utsname.release); 690 + return -1; 691 + } 692 + 693 + if (puint) 694 + *puint = (version << 16) + (patchlevel << 8) + sublevel; 695 + return 0; 668 696 }
+3
tools/perf/util/util.h
··· 350 350 351 351 int get_stack_size(const char *str, unsigned long *_size); 352 352 353 + int fetch_kernel_version(unsigned int *puint, 354 + char *str, size_t str_sz); 355 + 353 356 #endif /* GIT_COMPAT_UTIL_H */