From patchwork Fri Jan 12 04:29:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 859486 X-Patchwork-Delegate: bpf@iogearbox.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="fmw0Vka1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zHqXg09jqz9sQm for ; Fri, 12 Jan 2018 15:29:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933119AbeALE3x (ORCPT ); Thu, 11 Jan 2018 23:29:53 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:37682 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932751AbeALE3u (ORCPT ); Thu, 11 Jan 2018 23:29:50 -0500 Received: by mail-pg0-f65.google.com with SMTP id z17so3818361pgc.4 for ; Thu, 11 Jan 2018 20:29:50 -0800 (PST) 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=zGHHDDAVegvngvePbSX4ZbG1R7HCKtnFykW5EKppWrQ=; b=fmw0Vka1sgvWDI8/m+v2pJETI5tKcTfI6aufTO4FCZeMn9/32wPcJoYDW5sXFKlg6p HAjKFb3gK23XI6BVbmkIXyEsQDPog6l9C+kovlZLntuRHYsDxR/GFWdFyz+TP4dWTJUU EUWFspNudMEt5bGjHQALgQfvR7LxqgYKYJtCrgb4VuDIm0MBVbUoFHh4Tvx7B7DlDtYN T35wQZei1Z1tW4CXXoMj5l+Vp1we2ejI11yrHtxbB/d1kV/PgXDxbKNtOqp6NU6ZbPJc JvFmt47ax3Ysu6beUaRUrOMTMMyg2s8eTPHpDgCS5fVjBM3Dg4VpIHk8KBaze0qJ0DIx Il+w== 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=zGHHDDAVegvngvePbSX4ZbG1R7HCKtnFykW5EKppWrQ=; b=NSeUZztIXbtIyEp7rCcq0JO32RrE4LFph6IpyJDb7bEOOMDLFze4LX3Z6aUeF33B3w bcX+vceQET+yXtzM9t2f9XQwrNoAHWOJyJ/mHGCPxhQHtdxQ4T+m6JY23YDW/p+4wtRg WQxMUJLfbu5PQZaeZTGgFETN+8NT5WAr8PnL+NUs65NLlIknxL8RocSgUrs7/ZvOmr8L qbjjooitmo20ky7FnbFYgWxUsGoEaiRIgORPpPLWOFOCdI9U0a0vSyaG0GrD3KUpIOUk 6nGlCrA/wOwNUVCsNWG+jTYqOqdmcTw0iv+CEQtLhr4M7dMlgTkfo/CvNQZruokULYmU 5NRw== X-Gm-Message-State: AKGB3mLJFhE9/NM/7qXodZZruwDIwmd3mJULybYkSx0MUfaSO+QbOGQS L66AwBrll5J5A+15lVCYjuMrjocq X-Google-Smtp-Source: ACJfBosSEo1TgTlzUiieW6m3H74yeIGyUC4B559wySLfccGiES8GuSwaI5s+eEIarUu3wXfME6rlkw== X-Received: by 10.159.247.6 with SMTP id d6mr25260063pls.196.1515731389772; Thu, 11 Jan 2018 20:29:49 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id e8sm45863875pfk.6.2018.01.11.20.29.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 11 Jan 2018 20:29:49 -0800 (PST) From: Jakub Kicinski To: alexei.starovoitov@gmail.com, daniel@iogearbox.net, davem@davemloft.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, tehnerd@fb.com, Jakub Kicinski Subject: [PATCH bpf-next v2 06/15] bpf: offload: factor out netdev checking at allocation time Date: Thu, 11 Jan 2018 20:29:08 -0800 Message-Id: <20180112042917.10348-7-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180112042917.10348-1-jakub.kicinski@netronome.com> References: <20180112042917.10348-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add a helper to check if netdev could be found and whether it has .ndo_bpf callback. There is no need to check the callback every time it's invoked, ndos can't reasonably be swapped for a set without .ndp_bpf while program is loaded. bpf_dev_offload_check() will also be used by map offload. Signed-off-by: Jakub Kicinski Reviewed-by: Quentin Monnet --- kernel/bpf/offload.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c index 001ddfde7874..cdd1e19a668b 100644 --- a/kernel/bpf/offload.c +++ b/kernel/bpf/offload.c @@ -30,9 +30,19 @@ static DECLARE_RWSEM(bpf_devs_lock); static LIST_HEAD(bpf_prog_offload_devs); +static int bpf_dev_offload_check(struct net_device *netdev) +{ + if (!netdev) + return -EINVAL; + if (!netdev->netdev_ops->ndo_bpf) + return -EOPNOTSUPP; + return 0; +} + int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr) { struct bpf_prog_offload *offload; + int err; if (attr->prog_type != BPF_PROG_TYPE_SCHED_CLS && attr->prog_type != BPF_PROG_TYPE_XDP) @@ -49,12 +59,15 @@ int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr) offload->netdev = dev_get_by_index(current->nsproxy->net_ns, attr->prog_ifindex); - if (!offload->netdev) - goto err_free; + err = bpf_dev_offload_check(offload->netdev); + if (err) + goto err_maybe_put; down_write(&bpf_devs_lock); - if (offload->netdev->reg_state != NETREG_REGISTERED) + if (offload->netdev->reg_state != NETREG_REGISTERED) { + err = -EINVAL; goto err_unlock; + } prog->aux->offload = offload; list_add_tail(&offload->offloads, &bpf_prog_offload_devs); dev_put(offload->netdev); @@ -63,10 +76,11 @@ int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr) return 0; err_unlock: up_write(&bpf_devs_lock); - dev_put(offload->netdev); -err_free: +err_maybe_put: + if (offload->netdev) + dev_put(offload->netdev); kfree(offload); - return -EINVAL; + return err; } static int __bpf_offload_ndo(struct bpf_prog *prog, enum bpf_netdev_command cmd, @@ -80,8 +94,6 @@ static int __bpf_offload_ndo(struct bpf_prog *prog, enum bpf_netdev_command cmd, if (!offload) return -ENODEV; netdev = offload->netdev; - if (!netdev->netdev_ops->ndo_bpf) - return -EOPNOTSUPP; data->command = cmd;