From patchwork Wed Jan 10 10:16:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 858176 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGlLT5ScWz9s7M for ; Wed, 10 Jan 2018 21:17:21 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965139AbeAJKRD (ORCPT ); Wed, 10 Jan 2018 05:17:03 -0500 Received: from mail.kernel.org ([198.145.29.99]:51000 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932327AbeAJKRB (ORCPT ); Wed, 10 Jan 2018 05:17:01 -0500 Received: from localhost.localdomain (NE2965lan1.rev.em-net.ne.jp [210.141.244.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 58D5E21724; Wed, 10 Jan 2018 10:16:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 58D5E21724 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=mhiramat@kernel.org From: Masami Hiramatsu To: Alexei Starovoitov , Josef Bacik Cc: rostedt@goodmis.org, mingo@redhat.com, davem@davemloft.net, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, ast@kernel.org, kernel-team@fb.com, daniel@iogearbox.net, linux-btrfs@vger.kernel.org, darrick.wong@oracle.com, mhiramat@kernel.org, Josef Bacik , Akinobu Mita Subject: [PATCH bpf-next v3 0/5] Separate error injection table from kprobes Date: Wed, 10 Jan 2018 19:16:34 +0900 Message-Id: <151557939382.6629.18074658376309258555.stgit@devbox> X-Mailer: git-send-email 2.13.6 User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Hi, Here are the 3rd version of patches to moving error injection table from kprobes. This series includes some fixes and error type descriptions which we discussed in the previous thread. Here is the previous version: https://lkml.org/lkml/2017/12/26/26 There are 2 main reasons why I separate it from kprobes. - kprobes users can modify execution path not only at error-injection whitelist functions but also other functions. - This error injection information is also useful for ftrace (function-hook) and livepatch. It should not be limited by CONFIG_KPROBES. So I introduced CONFIG_FUNCTION_ERROR_INJECTION for this feature. Unfortunately currently CONFIG_FUNCTION_ERROR_INJECTION depends on CONFIG_KPROBES because of arch_deref_entry_point(), which should be provided by asm/types.h as ppc64 and ia64 do or kallsyms subsystem. Anyway, since that is another story, I will make another series to fix it. For [1/5], I tested it by test_override_return.sh on the kernel with CONFIG_DYNAMIC_FTRACE=n, and succeeded as below. (actually I'v found some bugs and fixed, thanks Alexei!) ====== # LANG=C ./test_override_return.sh 1+0 records in 1+0 records out 1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00200037 s, 524 MB/s btrfs-progs v4.9.1 See http://btrfs.wiki.kernel.org for more information. Performing full device TRIM /dev/loop1 (1001.00MiB) ... Label: (null) UUID: 02635ea7-f6d1-4ee8-a677-4354a38f6930 Node size: 16384 Sector size: 4096 Filesystem size: 1001.00MiB Block group profiles: Data: single 8.00MiB Metadata: DUP 50.00MiB System: DUP 8.00MiB SSD detected: no Incompat features: extref, skinny-metadata Number of devices: 1 Devices: ID SIZE PATH 1 1001.00MiB /dev/loop1 mount: /opt/samples/bpf/tmpmnt: mount(2) system call failed: Cannot allocate memory. SUCCESS! ====== I've removed RFC from this series, but actually, [4/5] and [5/5] will be need more discussion. So please feel free to merge [1/5] to [3/5] separately. [4/5] introduces error return types for describing what error values the function callers must expect. For the purpose of error injection test is to find out hidden problems which caller doesn't handle errors correctly. So if the caller is programmed correctly, even if we inject an error, it continues to work as expected. However, if we inject a succeed return value even though the callee doesn't do anything, the caller does wrong processing (and end up with kernel panic, or even worse data corruption). That is not what we want to do with error injection. [5/5] introduces function-based error injection interface via debugfs, which can cause "success injection", So I coupled it with [4/5] to ensure the expected error types for the target function. Changes in v3: - [1/5] Move arch_ftrace_kprobe_override_function() to core.c to remove CONFIG_KPROBE_ON_FTRACE dependency, and fix a bug in trace_kprobe_on_func_entry(). - [3/5] Fix a build error and typos, separate CONFIG_MODULES dependent code, add CONFIG_KPROBES dependency, and call error-injection init function in late_initcall stage. - [4/5] Newly added - [5/5] Check and adjust error value for each target function and add more documents and example. Thank you, --- Masami Hiramatsu (5): tracing/kprobe: bpf: Check error injectable event is on function entry tracing/kprobe: bpf: Compare instruction pointer with original one error-injection: Separate error-injection from kprobe error-injection: Add injectable error types error-injection: Support fault injection framework Documentation/fault-injection/fault-injection.txt | 62 +++++ arch/Kconfig | 2 arch/x86/Kconfig | 2 arch/x86/include/asm/error-injection.h | 13 + arch/x86/include/asm/kprobes.h | 4 arch/x86/kernel/kprobes/ftrace.c | 14 - arch/x86/lib/Makefile | 1 arch/x86/lib/error-inject.c | 19 ++ fs/btrfs/disk-io.c | 2 fs/btrfs/free-space-cache.c | 2 include/asm-generic/error-injection.h | 35 +++ include/asm-generic/vmlinux.lds.h | 14 + include/linux/bpf.h | 12 - include/linux/error-injection.h | 27 ++ include/linux/kprobes.h | 1 include/linux/module.h | 7 - kernel/Makefile | 1 kernel/fail_function.c | 217 +++++++++++++++++++ kernel/kprobes.c | 163 -------------- kernel/module.c | 8 - kernel/trace/Kconfig | 4 kernel/trace/bpf_trace.c | 9 - kernel/trace/trace_kprobe.c | 33 +-- kernel/trace/trace_probe.h | 12 + lib/Kconfig.debug | 14 + lib/Makefile | 1 lib/error-inject.c | 242 +++++++++++++++++++++ 27 files changed, 679 insertions(+), 242 deletions(-) create mode 100644 arch/x86/include/asm/error-injection.h create mode 100644 arch/x86/lib/error-inject.c create mode 100644 include/asm-generic/error-injection.h create mode 100644 include/linux/error-injection.h create mode 100644 kernel/fail_function.c create mode 100644 lib/error-inject.c -- Masami Hiramatsu (Linaro)