From patchwork Thu Apr 5 15:16:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895440 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H62Q6Sycz9s0p for ; Fri, 6 Apr 2018 01:19:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751516AbeDEPQ4 (ORCPT ); Thu, 5 Apr 2018 11:16:56 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:34424 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751179AbeDEPQy (ORCPT ); Thu, 5 Apr 2018 11:16:54 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AF13A406E97C; Thu, 5 Apr 2018 15:16:53 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id 888AAAB400; Thu, 5 Apr 2018 15:16:51 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 1/9] perf tools: Make read_build_id function public Date: Thu, 5 Apr 2018 17:16:37 +0200 Message-Id: <20180405151645.19130-2-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:16:53 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:16:53 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org And renaming it into parse_notes_buildid to be more precise and usable in following patches. Link: http://lkml.kernel.org/n/tip-v1mz76rkdxfnbfz2v05fumn6@git.kernel.org Signed-off-by: Jiri Olsa --- tools/perf/util/symbol-minimal.c | 50 ++-------------------------------------- tools/perf/util/util.c | 48 ++++++++++++++++++++++++++++++++++++++ tools/perf/util/util.h | 4 ++++ 3 files changed, 54 insertions(+), 48 deletions(-) diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-minimal.c index ff48d0d49584..bd281d3dc508 100644 --- a/tools/perf/util/symbol-minimal.c +++ b/tools/perf/util/symbol-minimal.c @@ -24,53 +24,6 @@ static bool check_need_swap(int file_endian) return host_endian != file_endian; } -#define NOTE_ALIGN(sz) (((sz) + 3) & ~3) - -#define NT_GNU_BUILD_ID 3 - -static int read_build_id(void *note_data, size_t note_len, void *bf, - size_t size, bool need_swap) -{ - struct { - u32 n_namesz; - u32 n_descsz; - u32 n_type; - } *nhdr; - void *ptr; - - ptr = note_data; - while (ptr < (note_data + note_len)) { - const char *name; - size_t namesz, descsz; - - nhdr = ptr; - if (need_swap) { - nhdr->n_namesz = bswap_32(nhdr->n_namesz); - nhdr->n_descsz = bswap_32(nhdr->n_descsz); - nhdr->n_type = bswap_32(nhdr->n_type); - } - - namesz = NOTE_ALIGN(nhdr->n_namesz); - descsz = NOTE_ALIGN(nhdr->n_descsz); - - ptr += sizeof(*nhdr); - name = ptr; - ptr += namesz; - if (nhdr->n_type == NT_GNU_BUILD_ID && - nhdr->n_namesz == sizeof("GNU")) { - if (memcmp(name, "GNU", sizeof("GNU")) == 0) { - size_t sz = min(size, descsz); - memcpy(bf, ptr, sz); - memset(bf + sz, 0, size - sz); - return 0; - } - } - ptr += descsz; - } - - return -1; -} - int filename__read_debuglink(const char *filename __maybe_unused, char *debuglink __maybe_unused, size_t size __maybe_unused) @@ -153,7 +106,8 @@ int filename__read_build_id(const char *filename, void *bf, size_t size) if (fread(buf, buf_size, 1, fp) != 1) goto out_free; - ret = read_build_id(buf, buf_size, bf, size, need_swap); + ret = parse_notes_buildid(buf, buf_size, bf, size, + need_swap); if (ret == 0) ret = size; break; diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index 1019bbc5dbd8..41fc61d941ef 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c @@ -447,6 +447,54 @@ fetch_kernel_version(unsigned int *puint, char *str, return 0; } +#define NOTE_ALIGN(sz) (((sz) + 3) & ~3) + +#define NT_GNU_BUILD_ID 3 + +int parse_notes_buildid(void *note_data, size_t note_len, void *bf, + size_t size, bool need_swap) +{ + struct { + u32 n_namesz; + u32 n_descsz; + u32 n_type; + } *nhdr; + void *ptr; + + ptr = note_data; + while (ptr < (note_data + note_len)) { + const char *name; + size_t namesz, descsz; + + nhdr = ptr; + if (need_swap) { + nhdr->n_namesz = bswap_32(nhdr->n_namesz); + nhdr->n_descsz = bswap_32(nhdr->n_descsz); + nhdr->n_type = bswap_32(nhdr->n_type); + } + + namesz = NOTE_ALIGN(nhdr->n_namesz); + descsz = NOTE_ALIGN(nhdr->n_descsz); + + ptr += sizeof(*nhdr); + name = ptr; + ptr += namesz; + if (nhdr->n_type == NT_GNU_BUILD_ID && + nhdr->n_namesz == sizeof("GNU")) { + if (memcmp(name, "GNU", sizeof("GNU")) == 0) { + size_t sz = min(size, descsz); + + memcpy(bf, ptr, sz); + memset(bf + sz, 0, size - sz); + return 0; + } + } + ptr += descsz; + } + + return -1; +} + const char *perf_tip(const char *dirpath) { struct strlist *tips; diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 9496365da3d7..27106548396b 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -47,6 +47,10 @@ extern int cacheline_size; int fetch_kernel_version(unsigned int *puint, char *str, size_t str_sz); + +int parse_notes_buildid(void *note_data, size_t note_len, void *bf, + size_t size, bool need_swap); + #define KVER_VERSION(x) (((x) >> 16) & 0xff) #define KVER_PATCHLEVEL(x) (((x) >> 8) & 0xff) #define KVER_SUBLEVEL(x) ((x) & 0xff) From patchwork Thu Apr 5 15:16:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895439 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H61s44K2z9s0p for ; Fri, 6 Apr 2018 01:19:29 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751579AbeDEPQ7 (ORCPT ); Thu, 5 Apr 2018 11:16:59 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:34448 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751179AbeDEPQ5 (ORCPT ); Thu, 5 Apr 2018 11:16:57 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 39F4A40704BE; Thu, 5 Apr 2018 15:16:57 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id E7212AB400; Thu, 5 Apr 2018 15:16:53 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 2/9] perf tools: Add fetch_kernel_buildid function Date: Thu, 5 Apr 2018 17:16:38 +0200 Message-Id: <20180405151645.19130-3-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:16:57 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:16:57 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Adding fetch_kernel_buildid helper function to retrieve build id from running kernel. It will be used in following patches. Link: http://lkml.kernel.org/n/tip-at98orsncas8v2ito61u3qod@git.kernel.org Signed-off-by: Jiri Olsa --- tools/perf/util/util.c | 18 ++++++++++++++++++ tools/perf/util/util.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index 41fc61d941ef..26f93866bc02 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c @@ -495,6 +495,24 @@ int parse_notes_buildid(void *note_data, size_t note_len, void *bf, return -1; } +int fetch_kernel_buildid(char *buildid, int size) +{ + char path[PATH_MAX], *buf; + size_t len; + int err; + + scnprintf(path, PATH_MAX, "%s/kernel/notes", + sysfs__mountpoint()); + + if (filename__read_str(path, &buf, &len)) + return -EINVAL; + + err = parse_notes_buildid(buf, len, buildid, size, false); + + free(buf); + return err; +} + const char *perf_tip(const char *dirpath) { struct strlist *tips; diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 27106548396b..1ccaa957e3ab 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -48,6 +48,8 @@ extern int cacheline_size; int fetch_kernel_version(unsigned int *puint, char *str, size_t str_sz); +int fetch_kernel_buildid(char *buildid, int size); + int parse_notes_buildid(void *note_data, size_t note_len, void *bf, size_t size, bool need_swap); From patchwork Thu Apr 5 15:16:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895437 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H6193FyNz9s0p for ; Fri, 6 Apr 2018 01:18:53 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751722AbeDEPRD (ORCPT ); Thu, 5 Apr 2018 11:17:03 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:55684 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751616AbeDEPRA (ORCPT ); Thu, 5 Apr 2018 11:17:00 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C9B4B8182D06; Thu, 5 Apr 2018 15:16:59 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id 70FB6AB3FF; Thu, 5 Apr 2018 15:16:57 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 3/9] kbuild: Do not pass arguments to link-vmlinux.sh Date: Thu, 5 Apr 2018 17:16:39 +0200 Message-Id: <20180405151645.19130-4-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Thu, 05 Apr 2018 15:16:59 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Thu, 05 Apr 2018 15:16:59 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org There's no need to pass LD* arguments to link-vmlinux.sh, because they are passed as variables. The only argument the link-vmlinux.sh supports is the 'clean' argument. Signed-off-by: Jiri Olsa --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d3300e46f925..a65a3919c6ad 100644 --- a/Makefile +++ b/Makefile @@ -1027,7 +1027,7 @@ ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink) # Final link of vmlinux with optional arch pass after final link cmd_link-vmlinux = \ - $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) ; \ + $(CONFIG_SHELL) $< ; \ $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE From patchwork Thu Apr 5 15:16:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895438 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H61d2Ccrz9s0p for ; Fri, 6 Apr 2018 01:19:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752205AbeDEPTF (ORCPT ); Thu, 5 Apr 2018 11:19:05 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:34474 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751638AbeDEPRC (ORCPT ); Thu, 5 Apr 2018 11:17:02 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 178804072CF7; Thu, 5 Apr 2018 15:17:02 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0DE98AB400; Thu, 5 Apr 2018 15:16:59 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 4/9] kbuild: Add filechk2 function Date: Thu, 5 Apr 2018 17:16:40 +0200 Message-Id: <20180405151645.19130-5-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:02 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:02 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Adding filechk2 function that has the same semantics as filechk, but it takes the target file from the 2nd argument instead of from the '$@' as in the filechk function. This function is needed when we can't have separate target for the file, like in the following patch. Signed-off-by: Jiri Olsa --- scripts/Kbuild.include | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 065324a8046f..9775ce2771d4 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -67,6 +67,30 @@ define filechk fi endef +# filechk2 is used to check if the content of a generated file is updated. +# It follows the same logic as the filechk except instead of the $@ target +# variable, the checked file is passed in 2nd argument. +# +# Sample usage: +# define filechk_sample +# echo $KERNELRELEASE +# endef +# version.h : Makefile +# $(call filechk2,sample,version.h) +# endef +define filechk2 + $(Q)set -e; \ + $(kecho) ' CHK $(2)'; \ + mkdir -p $(dir $(2)); \ + $(filechk_$(1)) < $< > $(2).tmp; \ + if [ -r $(2) ] && cmp -s $(2) $(2).tmp; then \ + rm -f $(2).tmp; \ + else \ + $(kecho) ' UPD $(2)'; \ + mv -f $(2).tmp $(2); \ + fi +endef + ###### # gcc support functions # See documentation in Documentation/kbuild/makefiles.txt From patchwork Thu Apr 5 15:16:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895436 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H6106N1jz9s0p for ; Fri, 6 Apr 2018 01:18:44 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751842AbeDEPRH (ORCPT ); Thu, 5 Apr 2018 11:17:07 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:34480 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751624AbeDEPRF (ORCPT ); Thu, 5 Apr 2018 11:17:05 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5BD3BA1BCA; Thu, 5 Apr 2018 15:17:04 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id 50485AB3FD; Thu, 5 Apr 2018 15:17:02 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 5/9] bpf: Add CONFIG_BUILDID_H option Date: Thu, 5 Apr 2018 17:16:41 +0200 Message-Id: <20180405151645.19130-6-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Thu, 05 Apr 2018 15:17:04 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Thu, 05 Apr 2018 15:17:04 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Adding CONFIG_BUILDID_H option that forces build to generate file with GNU build id value: include/linux/buildid.h It contains following macros: #define LINUX_BUILDID_DATA "\x6c\x41\x0f\xea\xa9\x5d ... #define LINUX_BUILDID_SIZE 20 Those macros will be used in following patches to identify kernel in more precise way when loading eBPF program that can touch kernel internal structures. There's new build output for the check and update of the buildid.h: $ make ... LD vmlinux.o MODPOST vmlinux.o KSYM .tmp_kallsyms1.o KSYM .tmp_kallsyms2.o LD vmlinux SORTEX vmlinux SYSMAP System.map CHK include/generated/uapi/linux/buildid.h UPD include/generated/uapi/linux/buildid.h ... Signed-off-by: Jiri Olsa --- Makefile | 12 ++++++++++++ init/Kconfig | 3 +++ scripts/Makefile | 1 + scripts/extract-buildid.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 scripts/extract-buildid.c diff --git a/Makefile b/Makefile index a65a3919c6ad..92b04d8f08bc 100644 --- a/Makefile +++ b/Makefile @@ -1023,6 +1023,15 @@ endif include/generated/autoksyms.h: FORCE $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh true +ifdef CONFIG_BUILDID_H +buildid_h := include/linux/buildid.h + +define filechk_buildid.h + buildid=`readelf -n $@ | grep 'Build ID' | sed -e 's/^.*Build ID: \(.*\)$$/\1/'`; \ + scripts/extract-buildid $$buildid +endef +endif + ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink) # Final link of vmlinux with optional arch pass after final link @@ -1032,6 +1041,9 @@ cmd_link-vmlinux = \ vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE +$(call if_changed,link-vmlinux) +ifdef CONFIG_BUILDID_H + +$(call filechk2,buildid.h,$(buildid_h)) +endif # Build samples along the rest of the kernel ifdef CONFIG_SAMPLES diff --git a/init/Kconfig b/init/Kconfig index 2852692d7c9c..572df24dda9b 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1386,6 +1386,9 @@ config KALLSYMS_BASE_RELATIVE # end of the "standard kernel features (expert users)" menu +config BUILDID_H + bool + # syscall, maps, verifier config BPF_SYSCALL bool "Enable bpf() system call" diff --git a/scripts/Makefile b/scripts/Makefile index 25ab143cbe14..fa34eaed6c29 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -19,6 +19,7 @@ hostprogs-$(CONFIG_ASN1) += asn1_compiler hostprogs-$(CONFIG_MODULE_SIG) += sign-file hostprogs-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert hostprogs-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert +hostprogs-$(CONFIG_BUILDID_H) += extract-buildid HOSTCFLAGS_sortextable.o = -I$(srctree)/tools/include HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include diff --git a/scripts/extract-buildid.c b/scripts/extract-buildid.c new file mode 100644 index 000000000000..a116723da3ad --- /dev/null +++ b/scripts/extract-buildid.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Formats buildid into following macros: + * + * #define LINUX_BUILDID_DATA "\x6c\x41\x0f\xea\xa9\x5d\x46 ... + * #define LINUX_BUILDID_SIZE 20 + * + */ +#include +#include + +int main(int argc, char **argv) +{ + char *id; + int len, i; + + if (argc != 2) { + fprintf(stderr, "usage: %s buildid\n", argv[0]); + return -1; + } + + id = argv[1]; + len = strlen(id); + + printf("#ifndef _LINUX_BUILDID_H\n"); + printf("#define _LINUX_BUILDID_H\n"); + printf("\n"); + + printf("#define LINUX_BUILDID_DATA \""); + + for (i = 0; i < len; i += 2) + printf("\\x%c%c", id[i], id[i + 1]); + + printf("\"\n"); + + printf("#define LINUX_BUILDID_SIZE %u\n", len / 2); + + printf("\n"); + printf("#endif /* _LINUX_BUILDID_H */\n"); + return 0; +} From patchwork Thu Apr 5 15:16:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895434 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H60C5HRTz9s0p for ; Fri, 6 Apr 2018 01:18:03 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751913AbeDEPRM (ORCPT ); Thu, 5 Apr 2018 11:17:12 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:34490 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751624AbeDEPRJ (ORCPT ); Thu, 5 Apr 2018 11:17:09 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9FF9D4072CFA; Thu, 5 Apr 2018 15:17:08 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id 94001AB586; Thu, 5 Apr 2018 15:17:04 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 6/9] bpf: Add CONFIG_BPF_BUILDID_CHECK option Date: Thu, 5 Apr 2018 17:16:42 +0200 Message-Id: <20180405151645.19130-7-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:08 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:08 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Adding CONFIG_BPF_BUILDID_CHECK option that forces kernel to check on provided build id when loading eBPF program. If the build id does not match the one in kernel the program fails to load. Adding new field into struct bpf_attr. The kern_buildid points to the user memory that contains the buildid. Kernel expose the notes section via sysfs, but there's currently no other use for kernel's buildid, so I needed to add new __init buildid_init function to parse it out. Signed-off-by: Jiri Olsa --- include/uapi/linux/bpf.h | 2 ++ init/Kconfig | 9 ++++++ kernel/bpf/syscall.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 94 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index c5ec89732a8d..17d8d330e6c7 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -308,6 +308,8 @@ union bpf_attr { * (context accesses, allowed helpers, etc). */ __u32 expected_attach_type; + /* Checked when prog_type=kprobe and CONFIG_BPF_BUILDID_CHECK. */ + __aligned_u64 kern_buildid; }; struct { /* anonymous struct used by BPF_OBJ_* commands */ diff --git a/init/Kconfig b/init/Kconfig index 572df24dda9b..6d32220de7e0 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1406,6 +1406,15 @@ config BPF_JIT_ALWAYS_ON Enables BPF JIT and removes BPF interpreter to avoid speculative execution of BPF instructions by the interpreter +config BPF_BUILDID_CHECK + bool "Check buildid for kprobe and tracepoint programs" + depends on BPF_SYSCALL + select BUILDID_H + default n + help + Enables BPF program load code to check on kernel Build ID + for kprobe programs. + config USERFAULTFD bool "Enable userfaultfd() system call" select ANON_INODES diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 0244973ee544..d0b3bc0bd9e6 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -1239,7 +1239,85 @@ static int bpf_prog_attach_check_attach_type(const struct bpf_prog *prog, } /* last field in 'union bpf_attr' used by this command */ -#define BPF_PROG_LOAD_LAST_FIELD expected_attach_type +#define BPF_PROG_LOAD_LAST_FIELD kern_buildid + +#ifdef CONFIG_BPF_BUILDID_CHECK + +static struct { + const char *ptr; + int size; +} buildid; + +#define BUILDID_MAX 40 + +static int __check_buildid(union bpf_attr *attr) +{ + char id[buildid.size]; + + /* copy buildid from user space */ + if (strncpy_from_user(id, u64_to_user_ptr(attr->kern_buildid), + buildid.size) < 0) + return -EFAULT; + + return memcmp(id, buildid.ptr, buildid.size); +} + +static int check_buildid(union bpf_attr *attr) +{ + return buildid.ptr ? __check_buildid(attr) : 0; +} + +#define NT_ALIGN(n) (((n) + 3) & ~3) +#define NT_GNU_BUILD_ID 3 + +extern const void __start_notes __weak; +extern const void __stop_notes __weak; + +static int __init buildid_init(void) +{ + const void *ptr = &__start_notes; + + while (ptr < &__stop_notes) { + const Elf64_Nhdr *nhdr = ptr; + size_t namesz = NT_ALIGN(nhdr->n_namesz), + descsz = NT_ALIGN(nhdr->n_descsz); + const char *name; + + ptr += sizeof(*nhdr); + name = ptr; + ptr += namesz; + + if (nhdr->n_type != NT_GNU_BUILD_ID || + nhdr->n_namesz != sizeof("GNU") || + memcmp(name, "GNU", sizeof("GNU"))) { + ptr += descsz; + continue; + } + + buildid.ptr = ptr; + buildid.size = descsz; + break; + } + + /* Sanity checks on the parsed buildid. */ + if (!buildid.ptr) { + pr_warn("bpf: GNU buildid not found, switching off the check\n"); + } else if (buildid.size > 64) { + pr_warn("bpf: GNU buildid too long, switching off the check\n"); + buildid.ptr = NULL; + } + + return 0; +} + +subsys_initcall(buildid_init); + +#else +static int check_buildid(union bpf_attr *attr __maybe_unused) +{ + return 0; +} +#endif /* CONFIG_BPF_BUILDID_CHECK */ static int bpf_prog_load(union bpf_attr *attr) { @@ -1271,6 +1349,10 @@ static int bpf_prog_load(union bpf_attr *attr) attr->kern_version != LINUX_VERSION_CODE) return -EINVAL; + if (type == BPF_PROG_TYPE_KPROBE && + check_buildid(attr)) + return -EINVAL; + if (type != BPF_PROG_TYPE_SOCKET_FILTER && type != BPF_PROG_TYPE_CGROUP_SKB && !capable(CAP_SYS_ADMIN)) From patchwork Thu Apr 5 15:16:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895435 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H60t15mJz9s0p for ; Fri, 6 Apr 2018 01:18:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752059AbeDEPSJ (ORCPT ); Thu, 5 Apr 2018 11:18:09 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:34504 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751887AbeDEPRL (ORCPT ); Thu, 5 Apr 2018 11:17:11 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E07AD4072CFC; Thu, 5 Apr 2018 15:17:10 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id D6AECAB401; Thu, 5 Apr 2018 15:17:08 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 7/9] libbpf: Synchronize uapi bpf.h header Date: Thu, 5 Apr 2018 17:16:43 +0200 Message-Id: <20180405151645.19130-8-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:11 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:11 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Synchronize include/uapi/linux/bpf.h with tools version. Link: http://lkml.kernel.org/n/tip-gaja0nnet6oku657642nxnaf@git.kernel.org Signed-off-by: Jiri Olsa --- tools/include/uapi/linux/bpf.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 9d07465023a2..17d8d330e6c7 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -308,6 +308,8 @@ union bpf_attr { * (context accesses, allowed helpers, etc). */ __u32 expected_attach_type; + /* Checked when prog_type=kprobe and CONFIG_BPF_BUILDID_CHECK. */ + __aligned_u64 kern_buildid; }; struct { /* anonymous struct used by BPF_OBJ_* commands */ @@ -864,6 +866,7 @@ enum bpf_func_id { /* BPF_FUNC_skb_set_tunnel_key flags. */ #define BPF_F_ZERO_CSUM_TX (1ULL << 1) #define BPF_F_DONT_FRAGMENT (1ULL << 2) +#define BPF_F_SEQ_NUMBER (1ULL << 3) /* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and * BPF_FUNC_perf_event_read_value flags. From patchwork Thu Apr 5 15:16:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895432 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H5zZ12hrz9s0p for ; Fri, 6 Apr 2018 01:17:30 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751977AbeDEPRR (ORCPT ); Thu, 5 Apr 2018 11:17:17 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:34520 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751936AbeDEPRO (ORCPT ); Thu, 5 Apr 2018 11:17:14 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2EDAF402277B; Thu, 5 Apr 2018 15:17:13 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id 24858AB586; Thu, 5 Apr 2018 15:17:11 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 8/9] libbpf: Add support to attach buildid to program load Date: Thu, 5 Apr 2018 17:16:44 +0200 Message-Id: <20180405151645.19130-9-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:13 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:13 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Adding support to retrieve buildid from elf's "buildid" section and passing it through to the load_program function to kernel bpf syscall. Fixing perf use of the bpf_load_program function and linking in the vsprintf.o into bpftool to have the scnprintf function in. Link: http://lkml.kernel.org/n/tip-2pafwtzbyosmf9ftuf0udn54@git.kernel.org Signed-off-by: Jiri Olsa --- tools/bpf/bpftool/Makefile | 5 ++++- tools/lib/bpf/bpf.c | 6 ++++-- tools/lib/bpf/bpf.h | 5 +++-- tools/lib/bpf/libbpf.c | 46 ++++++++++++++++++++++++++++++++++++++++------ tools/perf/tests/bpf.c | 9 ++++++++- 5 files changed, 59 insertions(+), 12 deletions(-) diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile index 4e69782c4a79..9ac11ea5de1c 100644 --- a/tools/bpf/bpftool/Makefile +++ b/tools/bpf/bpftool/Makefile @@ -75,11 +75,14 @@ include $(wildcard $(OUTPUT)*.d) all: $(OUTPUT)bpftool SRCS = $(wildcard *.c) -OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o +OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o $(OUTPUT)vsprintf.o $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c $(QUIET_CC)$(COMPILE.c) -MMD -o $@ $< +$(OUTPUT)vsprintf.o: $(srctree)/tools/lib/vsprintf.c + $(QUIET_CC)$(COMPILE.c) -MMD -o $@ $< + $(OUTPUT)bpftool: $(OBJS) $(LIBBPF) $(QUIET_LINK)$(CC) $(CFLAGS) -o $@ $^ $(LIBS) diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index acbb3f8b3bec..8e384db5bbbd 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -168,6 +168,7 @@ int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr, attr.log_size = 0; attr.log_level = 0; attr.kern_version = load_attr->kern_version; + attr.kern_buildid = ptr_to_u64(load_attr->buildid); memcpy(attr.prog_name, load_attr->name, min(name_len, BPF_OBJ_NAME_LEN - 1)); @@ -185,8 +186,8 @@ int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr, int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns, size_t insns_cnt, const char *license, - __u32 kern_version, char *log_buf, - size_t log_buf_sz) + __u32 kern_version, const char *buildid, + char *log_buf, size_t log_buf_sz) { struct bpf_load_program_attr load_attr; @@ -198,6 +199,7 @@ int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns, load_attr.insns_cnt = insns_cnt; load_attr.license = license; load_attr.kern_version = kern_version; + load_attr.buildid = buildid; return bpf_load_program_xattr(&load_attr, log_buf, log_buf_sz); } diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index 39f6a0d64a3b..b5ffb178ebdd 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -49,6 +49,7 @@ struct bpf_load_program_attr { size_t insns_cnt; const char *license; __u32 kern_version; + const char *buildid; }; /* Recommend log buffer size */ @@ -57,8 +58,8 @@ int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr, char *log_buf, size_t log_buf_sz); int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns, size_t insns_cnt, const char *license, - __u32 kern_version, char *log_buf, - size_t log_buf_sz); + __u32 kern_version, const char *buildid, + char *log_buf, size_t log_buf_sz); int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns, size_t insns_cnt, int strict_alignment, const char *license, __u32 kern_version, diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 5922443063f0..421f2c2e0ebe 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -220,6 +220,7 @@ static LIST_HEAD(bpf_objects_list); struct bpf_object { char license[64]; + char buildid[64]; u32 kern_version; struct bpf_program *programs; @@ -599,6 +600,32 @@ bpf_object__init_kversion(struct bpf_object *obj, return 0; } +static void buildid_scnprint(char *buf, int n, char *buildid, int size) +{ + int i, ret = 0; + + for (i = 0; i < size; i++) { + ret += scnprintf(buf + ret, n - ret, "%x", + (unsigned char) buildid[i]); + } +} + +static int +bpf_object__init_buildid(struct bpf_object *obj, + void *data, size_t size) +{ + char buf[64]; + + if (size > sizeof(obj->buildid)) + return -LIBBPF_ERRNO__FORMAT; + + memcpy(&obj->buildid, data, size); + + buildid_scnprint(buf, 64, obj->buildid, size); + pr_debug("kernel buildid of %s is: %s\n", obj->path, buf); + return 0; +} + static int compare_bpf_map(const void *_a, const void *_b) { const struct bpf_map *a = _a; @@ -817,6 +844,10 @@ static int bpf_object__elf_collect(struct bpf_object *obj) err = bpf_object__init_kversion(obj, data->d_buf, data->d_size); + else if (strcmp(name, "buildid") == 0) + err = bpf_object__init_buildid(obj, + data->d_buf, + data->d_size); else if (strcmp(name, "maps") == 0) obj->efile.maps_shndx = idx; else if (sh.sh_type == SHT_SYMTAB) { @@ -1166,7 +1197,7 @@ static int bpf_object__collect_reloc(struct bpf_object *obj) static int load_program(enum bpf_prog_type type, enum bpf_attach_type expected_attach_type, const char *name, struct bpf_insn *insns, int insns_cnt, - char *license, u32 kern_version, int *pfd) + char *license, u32 kern_version, const char *buildid, int *pfd) { struct bpf_load_program_attr load_attr; char *log_buf; @@ -1180,6 +1211,7 @@ load_program(enum bpf_prog_type type, enum bpf_attach_type expected_attach_type, load_attr.insns_cnt = insns_cnt; load_attr.license = license; load_attr.kern_version = kern_version; + load_attr.buildid = buildid; if (!load_attr.insns || !load_attr.insns_cnt) return -EINVAL; @@ -1189,7 +1221,6 @@ load_program(enum bpf_prog_type type, enum bpf_attach_type expected_attach_type, pr_warning("Alloc log buffer for bpf loader error, continue without log\n"); ret = bpf_load_program_xattr(&load_attr, log_buf, BPF_LOG_BUF_SIZE); - if (ret >= 0) { *pfd = ret; ret = 0; @@ -1234,7 +1265,8 @@ load_program(enum bpf_prog_type type, enum bpf_attach_type expected_attach_type, static int bpf_program__load(struct bpf_program *prog, - char *license, u32 kern_version) + char *license, u32 kern_version, + const char *buildid) { int err = 0, fd, i; @@ -1261,7 +1293,7 @@ bpf_program__load(struct bpf_program *prog, } err = load_program(prog->type, prog->expected_attach_type, prog->name, prog->insns, prog->insns_cnt, - license, kern_version, &fd); + license, kern_version, buildid, &fd); if (!err) prog->instances.fds[0] = fd; goto out; @@ -1292,7 +1324,8 @@ bpf_program__load(struct bpf_program *prog, err = load_program(prog->type, prog->expected_attach_type, prog->name, result.new_insn_ptr, result.new_insn_cnt, - license, kern_version, &fd); + license, kern_version, + buildid, &fd); if (err) { pr_warning("Loading the %dth instance of program '%s' failed\n", @@ -1324,7 +1357,8 @@ bpf_object__load_progs(struct bpf_object *obj) continue; err = bpf_program__load(&obj->programs[i], obj->license, - obj->kern_version); + obj->kern_version, + obj->buildid); if (err) return err; } diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c index 79b54f8ddebf..2a738b7b743a 100644 --- a/tools/perf/tests/bpf.c +++ b/tools/perf/tests/bpf.c @@ -298,6 +298,7 @@ static int check_env(void) int err; unsigned int kver_int; char license[] = "GPL"; + char buildid[64]; struct bpf_insn insns[] = { BPF_MOV64_IMM(BPF_REG_0, 1), @@ -310,9 +311,15 @@ static int check_env(void) return err; } + err = fetch_kernel_buildid(buildid, sizeof(buildid)); + if (err) { + pr_debug("Unable to get kernel buildid\n"); + return err; + } + err = bpf_load_program(BPF_PROG_TYPE_KPROBE, insns, sizeof(insns) / sizeof(insns[0]), - license, kver_int, NULL, 0); + license, kver_int, buildid, NULL, 0); if (err < 0) { pr_err("Missing basic BPF support, skip this test: %s\n", strerror(errno)); From patchwork Thu Apr 5 15:16:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 895433 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40H5zw45d4z9s0p for ; Fri, 6 Apr 2018 01:17:48 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752018AbeDEPRg (ORCPT ); Thu, 5 Apr 2018 11:17:36 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:34532 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751624AbeDEPRQ (ORCPT ); Thu, 5 Apr 2018 11:17:16 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6F8C8406E8B9; Thu, 5 Apr 2018 15:17:15 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id 656A4AB401; Thu, 5 Apr 2018 15:17:13 +0000 (UTC) From: Jiri Olsa To: Alexei Starovoitov , Daniel Borkmann Cc: lkml , netdev@vger.kernel.org, linux-kbuild@vger.kernel.org, Quentin Monnet , Eugene Syromiatnikov , Jiri Benc , Stanislav Kozina , Jerome Marchand , Arnaldo Carvalho de Melo , Masahiro Yamada , Michal Marek , Jiri Kosina Subject: [PATCH 9/9] perf tools: The buildid usage in example eBPF program Date: Thu, 5 Apr 2018 17:16:45 +0200 Message-Id: <20180405151645.19130-10-jolsa@kernel.org> In-Reply-To: <20180405151645.19130-1-jolsa@kernel.org> References: <20180405151645.19130-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:15 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 05 Apr 2018 15:17:15 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The bpf-samples/bpf-stdout-example.c demonstrates how to put the buildid data into eBPF program. Link: http://lkml.kernel.org/n/tip-dq97ddil7h3qbvphbbo8p08c@git.kernel.org Signed-off-by: Jiri Olsa --- tools/perf/bpf-samples/bpf-stdout-example.c | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tools/perf/bpf-samples/bpf-stdout-example.c diff --git a/tools/perf/bpf-samples/bpf-stdout-example.c b/tools/perf/bpf-samples/bpf-stdout-example.c new file mode 100644 index 000000000000..60783442bd5c --- /dev/null +++ b/tools/perf/bpf-samples/bpf-stdout-example.c @@ -0,0 +1,42 @@ +#include +#include + +#define SEC(NAME) __attribute__((section(NAME), used)) + +char _license[] SEC("license") = "GPL"; +int _version SEC("version") = LINUX_VERSION_CODE; +char _buildid[] SEC("buildid") = LINUX_BUILDID_DATA; + +static unsigned long long (*bpf_get_smp_processor_id)(void) = + (void *) BPF_FUNC_get_smp_processor_id; +static int (*bpf_perf_event_output)(void *ctx, void *map, + unsigned long long flags, void *data, + int size) = + (void *) BPF_FUNC_perf_event_output; + +struct bpf_map_def { + unsigned int type; + unsigned int key_size; + unsigned int value_size; + unsigned int max_entries; + unsigned int map_flags; + unsigned int inner_map_idx; + unsigned int numa_node; +}; + +struct bpf_map_def SEC("maps") __bpf_stdout__ = { + .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY, + .key_size = sizeof(int), + .value_size = sizeof(u32), + .max_entries = __NR_CPUS__, +}; + +SEC("probe=sys_read") +int func(void *ctx) +{ + char output_str[] = "Raise a BPF event!"; + + bpf_perf_event_output(ctx, &__bpf_stdout__, bpf_get_smp_processor_id(), + &output_str, sizeof(output_str)); + return 0; +}