From patchwork Thu Nov 22 22:14:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Daniel T. Lee" X-Patchwork-Id: 1002032 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="oJfckUl9"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 431DJR29FFz9s1c for ; Fri, 23 Nov 2018 09:14:47 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2407812AbeKWI4G (ORCPT ); Fri, 23 Nov 2018 03:56:06 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:42997 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733200AbeKWI4G (ORCPT ); Fri, 23 Nov 2018 03:56:06 -0500 Received: by mail-pl1-f195.google.com with SMTP id x21-v6so9739877pln.9 for ; Thu, 22 Nov 2018 14:14:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=Ia5OgHhVj6wAXgtu+kTllTjnZPX9NyVx2OFwAN1BLKI=; b=oJfckUl9HdI0l7mwUxhukf8I1jhUP4SZV2VK+0sinKM3d+vIXNoV+RAN+QEFGbYxNp obuuHoZTIdqbTCKuTAbfUOjZkc7NSW5RcDJrzvxJb1WdDk9G9pFOhgiNYcn5dPSerjT9 HWXE9WwDMXPV932k8WmB4RZbZif5FJtiZZRNxUifRSCBTNM+5WjuL1IWqkRvfoLm3r62 65727fM+oexziojQZl7sf9b5YXFMY0b4L2Ev03Xvb8zDUfmlgKLvR5ItuQ4gS52CkivD fI9guiUiuX7tLfAqaW/DD4dpAiNK5LNnb1tQZInADsRQV2TArBvZldcR/aat4yry16Fi WMhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Ia5OgHhVj6wAXgtu+kTllTjnZPX9NyVx2OFwAN1BLKI=; b=eu4ZiuByat3XpkTkl6p8+kE8UyjBzxG274vNl/xFk84B4KiIGfi04DJVFaiSKre6/n XCFPTvNkHTVCSg8sFg+atIUDo0VvWk5ewSraSN4XZ/NOZTwzah4zzBsUx5Fw3ycTiPHJ GXEeg8yVFwdxChNqopVsLjX7U+L0D11jd1WYqjoahzVmhsLG/5INpLLUhA3XKmCKt69G PZeItAkufPKpXu5ck02dnzP9m+0a13hgLaOQgg7/4jdjW197pBWgaTccMYyLY5g1rqvF wVDYBD4thWWGrIHHMj9qCH4Vj5AT7uCpZ1jTQN32KQKYxGtn1CPWMnRYWYnAtknM188q 70Rg== X-Gm-Message-State: AA+aEWaaho3KvE1uyBT/NSpFilS1QIbbfF+N89Q0UehmmPJxdYigWG3k /YaMhWO4GNnkDNkxJpTbKg== X-Google-Smtp-Source: AFSGD/XBY6hX3kfm1ucDgm/bz/D18lkhkvDDMgQra88iBYScOybMGp8do4zo/Hu6oLxC2AMIU58Euw== X-Received: by 2002:a17:902:380c:: with SMTP id l12mr12686186plc.326.1542924884154; Thu, 22 Nov 2018 14:14:44 -0800 (PST) Received: from localhost.localdomain ([111.118.56.180]) by smtp.gmail.com with ESMTPSA id 34sm83545177pgp.90.2018.11.22.14.14.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Nov 2018 14:14:43 -0800 (PST) From: "Daniel T. Lee" To: Daniel Borkmann , Alexei Starovoitov Cc: netdev@vger.kernel.org Subject: [PATCH v2] samples: bpf: fix: error handling regarding kprobe_events Date: Fri, 23 Nov 2018 07:14:32 +0900 Message-Id: <20181122221432.3671-1-danieltimlee@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Currently, kprobe_events failure won't be handled properly. Due to calling system() indirectly to write to kprobe_events, it can't be identified whether an error is derived from kprobe or system. // buf = "echo '%c:%s %s' >> /s/k/d/t/kprobe_events" err = system(buf); if (err < 0) { printf("failed to create kprobe .."); return -1; } For example, running ./tracex7 sample in ext4 partition, "echo p:open_ctree open_ctree >> /s/k/d/t/kprobe_events" gets 256 error code system() failure. => The error comes from kprobe, but it's not handled correctly. According to man of system(3), it's return value just passes the termination status of the child shell rather than treating the error as -1. (don't care success) Which means, currently it's not working as desired. (According to the upper code snippet) ex) running ./tracex7 with ext4 env. # Current Output sh: echo: I/O error failed to open event open_ctree # Desired Output failed to create kprobe 'open_ctree' error 'No such file or directory' The problem is, error can't be verified whether from child ps or system. But using write() directly can verify the command failure, and it will treat all error as -1. So I suggest using write() directly to 'kprobe_events' rather than calling system(). Signed-off-by: Daniel T. Lee --- Changes in v2: - Fix code style at variable declaration. samples/bpf/bpf_load.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c index e6d7e0fe155b..96783207de4a 100644 --- a/samples/bpf/bpf_load.c +++ b/samples/bpf/bpf_load.c @@ -54,6 +54,23 @@ static int populate_prog_array(const char *event, int prog_fd) return 0; } +static int write_kprobe_events(const char *val) +{ + int fd, ret, flags; + + if ((val != NULL) && (val[0] == '\0')) + flags = O_WRONLY | O_TRUNC; + else + flags = O_WRONLY | O_APPEND; + + fd = open("/sys/kernel/debug/tracing/kprobe_events", flags); + + ret = write(fd, val, strlen(val)); + close(fd); + + return ret; +} + static int load_and_attach(const char *event, struct bpf_insn *prog, int size) { bool is_socket = strncmp(event, "socket", 6) == 0; @@ -165,10 +182,9 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) #ifdef __x86_64__ if (strncmp(event, "sys_", 4) == 0) { - snprintf(buf, sizeof(buf), - "echo '%c:__x64_%s __x64_%s' >> /sys/kernel/debug/tracing/kprobe_events", - is_kprobe ? 'p' : 'r', event, event); - err = system(buf); + snprintf(buf, sizeof(buf), "%c:__x64_%s __x64_%s", + is_kprobe ? 'p' : 'r', event, event); + err = write_kprobe_events(buf); if (err >= 0) { need_normal_check = false; event_prefix = "__x64_"; @@ -176,10 +192,9 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) } #endif if (need_normal_check) { - snprintf(buf, sizeof(buf), - "echo '%c:%s %s' >> /sys/kernel/debug/tracing/kprobe_events", - is_kprobe ? 'p' : 'r', event, event); - err = system(buf); + snprintf(buf, sizeof(buf), "%c:%s %s", + is_kprobe ? 'p' : 'r', event, event); + err = write_kprobe_events(buf); if (err < 0) { printf("failed to create kprobe '%s' error '%s'\n", event, strerror(errno)); @@ -519,7 +534,7 @@ static int do_load_bpf_file(const char *path, fixup_map_cb fixup_map) return 1; /* clear all kprobes */ - i = system("echo \"\" > /sys/kernel/debug/tracing/kprobe_events"); + i = write_kprobe_events(""); /* scan over all elf sections to get license and map info */ for (i = 1; i < ehdr.e_shnum; i++) {