{"id":833386,"url":"http://patchwork.ozlabs.org/api/1.2/patches/833386/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/1509633431-2184-3-git-send-email-josef@toxicpanda.com/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/1.2/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<1509633431-2184-3-git-send-email-josef@toxicpanda.com>","list_archive_url":null,"date":"2017-11-02T14:37:11","name":"[2/2] samples/bpf: add a test for bpf_override_return","commit_ref":null,"pull_url":null,"state":"changes-requested","archived":true,"hash":"f767335782ba8de995a14d9470f7d39be03f8a60","submitter":{"id":72383,"url":"http://patchwork.ozlabs.org/api/1.2/people/72383/?format=json","name":"Josef Bacik","email":"josef@toxicpanda.com"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/1.2/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/1509633431-2184-3-git-send-email-josef@toxicpanda.com/mbox/","series":[{"id":11520,"url":"http://patchwork.ozlabs.org/api/1.2/series/11520/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/list/?series=11520","date":"2017-11-02T14:37:10","name":"Add the ability to do BPF directed error injection","version":1,"mbox":"http://patchwork.ozlabs.org/series/11520/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/833386/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/833386/checks/","tags":{},"related":[],"headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=toxicpanda-com.20150623.gappssmtp.com\n\theader.i=@toxicpanda-com.20150623.gappssmtp.com\n\theader.b=\"rq8w13Tf\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3ySSPG4NfJz9sNw\n\tfor <patchwork-incoming@ozlabs.org>;\n\tFri,  3 Nov 2017 01:38:10 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S933627AbdKBOhh (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tThu, 2 Nov 2017 10:37:37 -0400","from mail-qk0-f196.google.com ([209.85.220.196]:56116 \"EHLO\n\tmail-qk0-f196.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S933458AbdKBOhT (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Thu, 2 Nov 2017 10:37:19 -0400","by mail-qk0-f196.google.com with SMTP id x82so6386741qkb.12\n\tfor <netdev@vger.kernel.org>; Thu, 02 Nov 2017 07:37:18 -0700 (PDT)","from localhost\n\t(cpe-2606-A000-4381-1201-225-22FF-FEB3-E51A.dyn6.twc.com.\n\t[2606:a000:4381:1201:225:22ff:feb3:e51a])\n\tby smtp.gmail.com with ESMTPSA id\n\tk126sm2148538qkc.69.2017.11.02.07.37.17\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tThu, 02 Nov 2017 07:37:17 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=toxicpanda-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=/xZ+xdxCmKjNGEQmfg98zrHbzr6GBRz/LJMbBzz29o0=;\n\tb=rq8w13TfuSD8sfBon9jeMtN8hrHXSECNaWVsqi7JCYFTsKmt7RGkF5z8pPY5yo8HTX\n\tPlyNBeNVsoVrzrQKzv3f0wUMfYzq2owVl0JtSdlUFycRoQLag5PxN2t0jF3ZQ34LXsH1\n\tWfy9dh9QhluywZSW2E59j1zcvUN75zwk1O2s/CFmgt4D0mn6rkj5fCL2G1/ApgNQLCMb\n\t1Bv6b7mSCoyhYk5AfgHkh4G0GuAw+bvQkJVlOcOVM3YWp4/mte0IlwbrLfl1qYvLcpxh\n\tiBpcDwRAFe5jiaV1Kj/Elvf/fSowdL00wPxefLpUWut1Qlu2U8n3pXU2lvN3AQBPLeaq\n\tMjoA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=/xZ+xdxCmKjNGEQmfg98zrHbzr6GBRz/LJMbBzz29o0=;\n\tb=T4JSta2877XYAnPzQcs4oK/YcKSKhGVhJk/uoLB0l8aWXCTgYD8iLAv4mPl+B2IlsF\n\tspSmvjcdWEG9TeFebh0X4/LhnhY5HMzu695EfZIyOVkvEVriAm2qA2PL899KzAbVc3BM\n\tnoCoj14uKWM8JwOGDEzTqoxEnmAA8hX14gGQFWQGWPFW8o9eHv7DhoGmZBkvqyiBJ4m+\n\tgRV9TxV9SU3KeQH6J3ATAqEknkjADfSR4euGwHy9zglqJsm/GMuYHTx/3SKLHiDJTOhU\n\txqmr+5DMib4uRPVKQwEs9svCaGC6/HnVpKKXbNVMDKkrRG75X+H44lYFyLlXKUYUYebq\n\tIjsA==","X-Gm-Message-State":"AJaThX4V9p4uwoJzig3MclbBcQc2guJtMcecJhWqSv9n2ygqGmVTi44x\n\tKod5l3Y01CHz2S9kzNN/vtwigg==","X-Google-Smtp-Source":"ABhQp+Q/9Ep8KAcgmKnFFdFyCQkpOcW6NT2gM6qMZb+vpYCuzsZmuzHUMKaeDPsrIPSJmma867m4Og==","X-Received":"by 10.55.18.28 with SMTP id c28mr5014198qkh.297.1509633438364;\n\tThu, 02 Nov 2017 07:37:18 -0700 (PDT)","From":"Josef Bacik <josef@toxicpanda.com>","To":"rostedt@goodmis.org, mingo@redhat.com, davem@davemloft.net,\n\tnetdev@vger.kernel.org, linux-kernel@vger.kernel.org,\n\tast@kernel.org, kernel-team@fb.com, daniel@iogearbox.net","Cc":"Josef Bacik <jbacik@fb.com>","Subject":"[PATCH 2/2] samples/bpf: add a test for bpf_override_return","Date":"Thu,  2 Nov 2017 10:37:11 -0400","Message-Id":"<1509633431-2184-3-git-send-email-josef@toxicpanda.com>","X-Mailer":"git-send-email 2.7.5","In-Reply-To":"<1509633431-2184-1-git-send-email-josef@toxicpanda.com>","References":"<1509633431-2184-1-git-send-email-josef@toxicpanda.com>","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"From: Josef Bacik <jbacik@fb.com>\n\nThis adds a basic test for bpf_override_return to verify it works.  We\noverride the main function for mounting a btrfs fs so it'll return\n-ENOMEM and then make sure that trying to mount a btrfs fs will fail.\n\nAcked-by: Alexei Starovoitov <ast@kernel.org>\nSigned-off-by: Josef Bacik <jbacik@fb.com>\n---\n samples/bpf/Makefile                      |  4 ++++\n samples/bpf/test_override_return.sh       | 15 +++++++++++++++\n samples/bpf/tracex7_kern.c                | 16 ++++++++++++++++\n samples/bpf/tracex7_user.c                | 28 ++++++++++++++++++++++++++++\n tools/include/uapi/linux/bpf.h            |  7 ++++++-\n tools/testing/selftests/bpf/bpf_helpers.h |  3 ++-\n 6 files changed, 71 insertions(+), 2 deletions(-)\n create mode 100755 samples/bpf/test_override_return.sh\n create mode 100644 samples/bpf/tracex7_kern.c\n create mode 100644 samples/bpf/tracex7_user.c","diff":"diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile\nindex ea2b9e6135f3..83d06bc1f710 100644\n--- a/samples/bpf/Makefile\n+++ b/samples/bpf/Makefile\n@@ -14,6 +14,7 @@ hostprogs-y += tracex3\n hostprogs-y += tracex4\n hostprogs-y += tracex5\n hostprogs-y += tracex6\n+hostprogs-y += tracex7\n hostprogs-y += test_probe_write_user\n hostprogs-y += trace_output\n hostprogs-y += lathist\n@@ -58,6 +59,7 @@ tracex3-objs := bpf_load.o $(LIBBPF) tracex3_user.o\n tracex4-objs := bpf_load.o $(LIBBPF) tracex4_user.o\n tracex5-objs := bpf_load.o $(LIBBPF) tracex5_user.o\n tracex6-objs := bpf_load.o $(LIBBPF) tracex6_user.o\n+tracex7-objs := bpf_load.o $(LIBBPF) tracex7_user.o\n load_sock_ops-objs := bpf_load.o $(LIBBPF) load_sock_ops.o\n test_probe_write_user-objs := bpf_load.o $(LIBBPF) test_probe_write_user_user.o\n trace_output-objs := bpf_load.o $(LIBBPF) trace_output_user.o\n@@ -100,6 +102,7 @@ always += tracex3_kern.o\n always += tracex4_kern.o\n always += tracex5_kern.o\n always += tracex6_kern.o\n+always += tracex7_kern.o\n always += sock_flags_kern.o\n always += test_probe_write_user_kern.o\n always += trace_output_kern.o\n@@ -153,6 +156,7 @@ HOSTLOADLIBES_tracex3 += -lelf\n HOSTLOADLIBES_tracex4 += -lelf -lrt\n HOSTLOADLIBES_tracex5 += -lelf\n HOSTLOADLIBES_tracex6 += -lelf\n+HOSTLOADLIBES_tracex7 += -lelf\n HOSTLOADLIBES_test_cgrp2_sock2 += -lelf\n HOSTLOADLIBES_load_sock_ops += -lelf\n HOSTLOADLIBES_test_probe_write_user += -lelf\ndiff --git a/samples/bpf/test_override_return.sh b/samples/bpf/test_override_return.sh\nnew file mode 100755\nindex 000000000000..e68b9ee6814b\n--- /dev/null\n+++ b/samples/bpf/test_override_return.sh\n@@ -0,0 +1,15 @@\n+#!/bin/bash\n+\n+rm -f testfile.img\n+dd if=/dev/zero of=testfile.img bs=1M seek=1000 count=1\n+DEVICE=$(losetup --show -f testfile.img)\n+mkfs.btrfs -f $DEVICE\n+mkdir tmpmnt\n+./tracex7 $DEVICE\n+if [ $? -eq 0 ]\n+then\n+\techo \"SUCCESS!\"\n+else\n+\techo \"FAILED!\"\n+fi\n+losetup -d $DEVICE\ndiff --git a/samples/bpf/tracex7_kern.c b/samples/bpf/tracex7_kern.c\nnew file mode 100644\nindex 000000000000..1ab308a43e0f\n--- /dev/null\n+++ b/samples/bpf/tracex7_kern.c\n@@ -0,0 +1,16 @@\n+#include <uapi/linux/ptrace.h>\n+#include <uapi/linux/bpf.h>\n+#include <linux/version.h>\n+#include \"bpf_helpers.h\"\n+\n+SEC(\"kprobe/open_ctree\")\n+int bpf_prog1(struct pt_regs *ctx)\n+{\n+\tunsigned long rc = -12;\n+\n+\tbpf_override_return(ctx, rc);\n+\treturn 0;\n+}\n+\n+char _license[] SEC(\"license\") = \"GPL\";\n+u32 _version SEC(\"version\") = LINUX_VERSION_CODE;\ndiff --git a/samples/bpf/tracex7_user.c b/samples/bpf/tracex7_user.c\nnew file mode 100644\nindex 000000000000..8a52ac492e8b\n--- /dev/null\n+++ b/samples/bpf/tracex7_user.c\n@@ -0,0 +1,28 @@\n+#define _GNU_SOURCE\n+\n+#include <stdio.h>\n+#include <linux/bpf.h>\n+#include <unistd.h>\n+#include \"libbpf.h\"\n+#include \"bpf_load.h\"\n+\n+int main(int argc, char **argv)\n+{\n+\tFILE *f;\n+\tchar filename[256];\n+\tchar command[256];\n+\tint ret;\n+\n+\tsnprintf(filename, sizeof(filename), \"%s_kern.o\", argv[0]);\n+\n+\tif (load_bpf_file(filename)) {\n+\t\tprintf(\"%s\", bpf_log_buf);\n+\t\treturn 1;\n+\t}\n+\n+\tsnprintf(command, 256, \"mount %s tmpmnt/\", argv[1]);\n+\tf = popen(command, \"r\");\n+\tret = pclose(f);\n+\n+\treturn ret ? 0 : 1;\n+}\ndiff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h\nindex 4a4b6e78c977..3756dde69834 100644\n--- a/tools/include/uapi/linux/bpf.h\n+++ b/tools/include/uapi/linux/bpf.h\n@@ -673,6 +673,10 @@ union bpf_attr {\n  *     @buf: buf to fill\n  *     @buf_size: size of the buf\n  *     Return : 0 on success or negative error code\n+ *\n+ * int bpf_override_return(pt_regs, rc)\n+ *\t@pt_regs: pointer to struct pt_regs\n+ *\t@rc: the return value to set\n  */\n #define __BPF_FUNC_MAPPER(FN)\t\t\\\n \tFN(unspec),\t\t\t\\\n@@ -732,7 +736,8 @@ union bpf_attr {\n \tFN(xdp_adjust_meta),\t\t\\\n \tFN(perf_event_read_value),\t\\\n \tFN(perf_prog_read_value),\t\\\n-\tFN(getsockopt),\n+\tFN(getsockopt),\t\t\t\\\n+\tFN(override_return),\n \n /* integer value in 'imm' field of BPF_CALL instruction selects which helper\n  * function eBPF program intends to call\ndiff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h\nindex abfa4c5c8527..086733298d5e 100644\n--- a/tools/testing/selftests/bpf/bpf_helpers.h\n+++ b/tools/testing/selftests/bpf/bpf_helpers.h\n@@ -81,7 +81,8 @@ static int (*bpf_perf_event_read_value)(void *map, unsigned long long flags,\n static int (*bpf_perf_prog_read_value)(void *ctx, void *buf,\n \t\t\t\t       unsigned int buf_size) =\n \t(void *) BPF_FUNC_perf_prog_read_value;\n-\n+static int (*bpf_override_return)(void *ctx, unsigned long rc) =\n+\t(void *) BPF_FUNC_override_return;\n \n /* llvm builtin functions that eBPF C program may use to\n  * emit BPF_LD_ABS and BPF_LD_IND instructions\n","prefixes":["2/2"]}