From patchwork Fri Nov 3 06:30:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 833681 X-Patchwork-Delegate: davem@davemloft.net 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=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="GN9/rrvS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3ySskw2hkbz9sBd for ; Fri, 3 Nov 2017 17:39:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754512AbdKCGjv (ORCPT ); Fri, 3 Nov 2017 02:39:51 -0400 Received: from mail-pg0-f67.google.com ([74.125.83.67]:47874 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752102AbdKCGiq (ORCPT ); Fri, 3 Nov 2017 02:38:46 -0400 Received: by mail-pg0-f67.google.com with SMTP id r25so1705956pgn.4 for ; Thu, 02 Nov 2017 23:38:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dKsoy6hBfgSLClxDFoTi79Yg6RptNL1BiOe3P8V4m9U=; b=GN9/rrvSQkJ933lEb/xo4kyZ5ed5UVj5CfDFJBDdfAlcjK3lsfY4yNPEBAHhN+jEXp EgM0wpHkUvI2uFkZpTAmNb+0Gh/EAtoUo9N3kT7s/o96hRENxGNl8E+a+by6psbkDA0X SZ89bvEhLoS0/wT9Hog4GC51dgYIo1WI/2jky/xRw6Z3jwFMQKjdrp6DOjZm/bHJh48R nUAK2SwAEkrH9ivs6eQ16lTw83C5diKE48Vkp37dT0QmI9JK418W1ToKVfubZrnEcAsT bgvs/bKe/CMi0VMivMFYG5TojlL5uM5oSlDOT4ZOFp2Bsl71YegM/lw9xg8RrPURigFW jQLg== 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:in-reply-to :references; bh=dKsoy6hBfgSLClxDFoTi79Yg6RptNL1BiOe3P8V4m9U=; b=HaKCYT6mnvRVj1/I7wqVBOiw+Rku8wU0T7u6SQtmA3POlbTm71NwhPVlgsnwc+Bcvv lN+lFpbYeef49MHqxdglbaduAJB8cDLKVArirxh05RO6l7bBh2G2sZS/l8YUSdMmnyra QRWiC3tKZlY30N/pxKv+cIo6Im6+LI44IR/t49YvaSMRwxipNgyHDXtA1BtAkoTNawCJ xfDURSdA98gGOSiePqq5dDpsCk7x0J+e11YxofMnsz1/L26eeEXW/XjedU+eB/jO3OvJ pdD+zj8XHuqTGYiDU0ruGpH0Ll5cncFmN9DwcO3XUQ7OFKZ6PPpQ6KyiN+W3oW6m9GK1 uV+g== X-Gm-Message-State: AMCzsaXsckLQak2+42tax/wwqCgxf9Rxi7rEmENn7ToVJdfGyvCqpAKr q+Loa1uVsiOyhhDJK2qAZG0er5R5 X-Google-Smtp-Source: ABhQp+QEAkPfdp4P3q8+fC1xIFKKHGepqZQmyOFDfYwzYk9fdn05IW3M0agkrx3B+oltT6BXKGZezA== X-Received: by 10.98.245.21 with SMTP id n21mr6612048pfh.68.1509691125269; Thu, 02 Nov 2017 23:38:45 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id 62sm8456357pfw.129.2017.11.02.23.38.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 02 Nov 2017 23:38:44 -0700 (PDT) From: Jakub Kicinski To: netdev@vger.kernel.org Cc: oss-drivers@netronome.com, alexei.starovoitov@gmail.com, daniel@iogearbox.net, Jakub Kicinski Subject: [PATCH net-next 03/15] bpf: report offload info to user space Date: Thu, 2 Nov 2017 23:30:57 -0700 Message-Id: <20171103063109.9441-4-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171103063109.9441-1-jakub.kicinski@netronome.com> References: <20171103063109.9441-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Extend struct bpf_prog_info to contain information about program being bound to a device. Since the netdev may get destroyed while program still exists we need a flag to indicate the program is loaded for a device, even if the device is gone. Signed-off-by: Jakub Kicinski Reviewed-by: Simon Horman Reviewed-by: Quentin Monnet --- include/linux/bpf.h | 1 + include/uapi/linux/bpf.h | 6 ++++++ kernel/bpf/offload.c | 12 ++++++++++++ kernel/bpf/syscall.c | 5 +++++ 4 files changed, 24 insertions(+) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index e45d43f9ec92..98bacd0fa5cc 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -506,6 +506,7 @@ static inline int cpu_map_enqueue(struct bpf_cpu_map_entry *rcpu, int bpf_prog_offload_compile(struct bpf_prog *prog); void bpf_prog_offload_destroy(struct bpf_prog *prog); +u32 bpf_prog_offload_ifindex(struct bpf_prog *prog); #if defined(CONFIG_NET) && defined(CONFIG_BPF_SYSCALL) int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr); diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 727a3dba13e6..e92f62cf933a 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -894,6 +894,10 @@ enum sk_action { #define BPF_TAG_SIZE 8 +enum bpf_prog_status { + BPF_PROG_STATUS_DEV_BOUND = (1 << 0), +}; + struct bpf_prog_info { __u32 type; __u32 id; @@ -907,6 +911,8 @@ struct bpf_prog_info { __u32 nr_map_ids; __aligned_u64 map_ids; char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 status; } __attribute__((aligned(8))); struct bpf_map_info { diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c index 47436ece9b1d..25307894a287 100644 --- a/kernel/bpf/offload.c +++ b/kernel/bpf/offload.c @@ -144,6 +144,18 @@ int bpf_prog_offload_compile(struct bpf_prog *prog) return bpf_prog_offload_translate(prog); } +u32 bpf_prog_offload_ifindex(struct bpf_prog *prog) +{ + struct bpf_dev_offload *offload = prog->aux->offload; + u32 ifindex; + + rtnl_lock(); + ifindex = offload->netdev ? offload->netdev->ifindex : 0; + rtnl_unlock(); + + return ifindex; +} + const struct bpf_prog_ops bpf_offload_prog_ops = { }; diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 1574b9f0f24e..3217c20ea91b 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -1592,6 +1592,11 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog, return -EFAULT; } + if (bpf_prog_is_dev_bound(prog->aux)) { + info.status |= BPF_PROG_STATUS_DEV_BOUND; + info.ifindex = bpf_prog_offload_ifindex(prog); + } + done: if (copy_to_user(uinfo, &info, info_len) || put_user(info_len, &uattr->info.info_len))