From patchwork Thu Mar 22 22:57:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 889717 X-Patchwork-Delegate: davem@davemloft.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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="AEuLUia+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 406hsh6vmBz9s0x for ; Fri, 23 Mar 2018 09:58:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751863AbeCVW6P (ORCPT ); Thu, 22 Mar 2018 18:58:15 -0400 Received: from mail-pg0-f67.google.com ([74.125.83.67]:33973 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751841AbeCVW6N (ORCPT ); Thu, 22 Mar 2018 18:58:13 -0400 Received: by mail-pg0-f67.google.com with SMTP id m15so3870480pgc.1 for ; Thu, 22 Mar 2018 15:58:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=241uDjhYuiVkHAOQpX/wkL/kLKKM3vqWLulXS44GbQY=; b=AEuLUia+wZ1XeLCl5xdaY8hhpPsRnTLsDTxAdEdCZkx9CybUwKjPD3agAElfn1mMLI e6pQpFxRM8Z5bXtA8dgh+53s8Zpn/LmKtyXrFbBRg+ev5kObAIjpd0AH8BhLQlxJ4UF9 bdGOOtAVNVAGjF9T44ei9Xq+epguBrhKnN1TA= 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=241uDjhYuiVkHAOQpX/wkL/kLKKM3vqWLulXS44GbQY=; b=OVtQKnP4uERqLRu84LOmzHWw4AcmkOmRuUuYspXbwHAZFc4gF4xhTg0DwWeVXwKTWQ KvU4KDuxFStd6dhYMj/2yHT5jJnDSHNHXsEvfd6ohKiFwX6qcl8bgRAsI+Cvox0LP9yH c5zJhALYKwh76Ee62ViYe9Axz19I4llhNkJKFEcFhotTGOMOGLWxjwOW2LgJPwcqZN0O j/pEXYGe/nuhAh2qUFDUlcrvHS10WBJ413IwgjE2UIBSrfGthz4BMlR7uttrzSIfzg3/ NSD9UyTF3NO8M2+a9BJoJobZbKTWU5BruP3XpmyXQhNW4K1bRmNwt9aGv8A2E5e/z7DG Wy3w== X-Gm-Message-State: AElRT7E3iUNv091nj1NmHEZuzESV1GfZCXNTJimetKVJHS4WvSVTODLW GHzeoP2Ph1JF/09qGgR+JVXXSsHz X-Google-Smtp-Source: AG47ELvqfSOI1porhcIgw7Ljg/cKOx6lePOwBS6wyTgoX2tJULjS+XcPoEMPzZsr0cFRlN2wf1dOXQ== X-Received: by 10.98.51.129 with SMTP id z123mr22049063pfz.132.1521759492409; Thu, 22 Mar 2018 15:58:12 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b78sm15807767pfe.88.2018.03.22.15.58.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Mar 2018 15:58:11 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, roopa@cumulusnetworks.com, shm@cumulusnetworks.com, jiri@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, David Ahern Subject: [PATCH RFC net-next 1/7] net: Fix fib notifer to return errno Date: Thu, 22 Mar 2018 15:57:51 -0700 Message-Id: <20180322225757.10377-2-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180322225757.10377-1-dsa@cumulusnetworks.com> References: <20180322225757.10377-1-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Notifier handlers use notifier_from_errno to convert any potential error to an encoded format. As a consequence the other side, call_fib_notifiers in this case, needs to use notifier_to_errno to return the error from the handler back to its caller. Signed-off-by: David Ahern --- net/core/fib_notifier.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/net/core/fib_notifier.c b/net/core/fib_notifier.c index 5ace0705a3f9..14ba52ebe8c9 100644 --- a/net/core/fib_notifier.c +++ b/net/core/fib_notifier.c @@ -21,8 +21,11 @@ EXPORT_SYMBOL(call_fib_notifier); int call_fib_notifiers(struct net *net, enum fib_event_type event_type, struct fib_notifier_info *info) { + int err; + info->net = net; - return atomic_notifier_call_chain(&fib_chain, event_type, info); + err = atomic_notifier_call_chain(&fib_chain, event_type, info); + return notifier_to_errno(err); } EXPORT_SYMBOL(call_fib_notifiers); From patchwork Thu Mar 22 22:57:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 889723 X-Patchwork-Delegate: davem@davemloft.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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="ZW142Ysj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 406htK02W4z9s0x for ; Fri, 23 Mar 2018 09:58:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752006AbeCVW6q (ORCPT ); Thu, 22 Mar 2018 18:58:46 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:38181 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751825AbeCVW6O (ORCPT ); Thu, 22 Mar 2018 18:58:14 -0400 Received: by mail-pf0-f196.google.com with SMTP id d26so3972464pfn.5 for ; Thu, 22 Mar 2018 15:58:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=rPu/fl7mbQvZCoxEAnEwfBnsjpJG+sd3pUSzUPrMffM=; b=ZW142Ysjzc6zqhrXdg6nj63Rjt8d2fAoAD2a5+3n9uHavmw8TH1/qH2tdLy4HAMaHv zHwMERhlG4Ibukuoknqy8FYVV5cmp/szTGfoU5KPnZbw60hqzySBWHqcScF0iVw+DvlH 1Rc+FWjBsSS3F3lN2ZFUtWde4eWf81bsHS+Sw= 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=rPu/fl7mbQvZCoxEAnEwfBnsjpJG+sd3pUSzUPrMffM=; b=oqDL71UhHZvYWYGR/OAHsWrxfJsXrRs021Iynp1+3y4pQJXhtVo6liJyNF1oSZLBdP sRq235q1/Xi8YFCartxjkG17wWSo9FcBzEBjHJz1sSWhfrxWImWB2kwVnr7J0Ca38Lb/ Vi2B5jCzu3GRH293gbtYM3KNMNQMvdRpreXFi/iYdX+JoGsHpY4SliGmJ6zQKeW3Gw2F SWELXnrRoudAqMFn3fVSIDPP/nx21uY2ZNmbAhWYtBxZsFGxFs+NdVN0/LRMZGWopx9c 8+qLj4trvD0fuc2O/AIRm8PWnOd8kNn7nNbyZUtwinvlv4OwaFCsimzi2sW5rLpz/XXN EO7Q== X-Gm-Message-State: AElRT7HJYx9mbdcBTzMtWD9gEhtWWfcPWJ7ZnpaMFnAlLe5G8K6ASJZf 1GJyA6SgemyI6L2pLC8jm/V45cHB X-Google-Smtp-Source: AG47ELu2lLoRLMg/FRhOMqOyiKjAbpwNCo9ZYIlLFtpxM9KPMPvht3VgSn6zoVBbNbmQfwQHNPBfCw== X-Received: by 10.98.42.71 with SMTP id q68mr21668644pfq.155.1521759493860; Thu, 22 Mar 2018 15:58:13 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b78sm15807767pfe.88.2018.03.22.15.58.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Mar 2018 15:58:13 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, roopa@cumulusnetworks.com, shm@cumulusnetworks.com, jiri@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, David Ahern Subject: [PATCH RFC net-next 2/7] net: Move call_fib_rule_notifiers up in fib_nl_newrule Date: Thu, 22 Mar 2018 15:57:52 -0700 Message-Id: <20180322225757.10377-3-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180322225757.10377-1-dsa@cumulusnetworks.com> References: <20180322225757.10377-1-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Move call_fib_rule_notifiers up in fib_nl_newrule to the point right before the rule is inserted into the list. At this point there are no more failure paths within the core rule code, so if the notifier does not fail then the rule will be inserted into the list. Signed-off-by: David Ahern --- net/core/fib_rules.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index f6f04fc0f629..84c427a0c984 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c @@ -631,6 +631,11 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, if (err < 0) goto errout_free; + err = call_fib_rule_notifiers(net, FIB_EVENT_RULE_ADD, rule, ops, + extack); + if (err < 0) + goto errout_free; + list_for_each_entry(r, &ops->rules_list, list) { if (r->pref > rule->pref) break; @@ -667,7 +672,6 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, if (rule->tun_id) ip_tunnel_need_metadata(); - call_fib_rule_notifiers(net, FIB_EVENT_RULE_ADD, rule, ops, extack); notify_rule_change(RTM_NEWRULE, rule, ops, nlh, NETLINK_CB(skb).portid); flush_route_cache(ops); rules_ops_put(ops); From patchwork Thu Mar 22 22:57:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 889718 X-Patchwork-Delegate: davem@davemloft.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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="Jt/YJqxc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 406hsp0Gk3z9s0q for ; Fri, 23 Mar 2018 09:58:22 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751879AbeCVW6T (ORCPT ); Thu, 22 Mar 2018 18:58:19 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:42713 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751841AbeCVW6Q (ORCPT ); Thu, 22 Mar 2018 18:58:16 -0400 Received: by mail-pf0-f196.google.com with SMTP id a16so3970298pfn.9 for ; Thu, 22 Mar 2018 15:58:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0zznXGfFotp/Rp7YwyF9NZp5zk/m3mItoF6rO9OZ/SA=; b=Jt/YJqxcbxlx93F8LHohzwhDEvSK0YqfW62Nn+MYyVUbjdETN1WZBiJQIbK1qpU1N0 H/uXgNMJ1dhhPYzcPSFC0gEXWxC8i/gegPNDHNx5t5+QCI9EzjHOZhXXYkEHgGZ81ZTr OQWgsRyp/duYIyFgNHDeiltTTEfb3Tzv5lwrA= 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=0zznXGfFotp/Rp7YwyF9NZp5zk/m3mItoF6rO9OZ/SA=; b=NfJqjFXGVJ7ap+adKYJmuj+i7m2KvXZfWwLa3NZiAxEiAt/7yCNLnGoBZcxe8EpP58 j/fl09BJZqMMI5DawQUqCZC3g4UEIiuHeDI7lJYXJtKIJBctcs/aAD+RUram7CyTmFM8 jkD/PNhxWTE4hIzQXQlXNAsI8HCysUoNZqTETNRXM98PT0olNYagpvKT0ghVHhRkKQBE LN2SPni+IyNvtMglFSIM3UG+yxYpq1CbfNJKGfxBEvMfN+I8DDxs3Z8GTlTiWz8p45Sk i4H5I7TSVE7PSRTJMTmCZQYWVZNVp4yVYSQgdMF+3Q6cXkA5Ip1DRUMbIA8lOq0kZX0z IZ0g== X-Gm-Message-State: AElRT7GrNMo5xsGRl6JhZ6H0qHS/s2IwA9tBTVVjzpbPPMFNNllET8tF vsMC47bkach5aIcNtq13y9SZ/6zG X-Google-Smtp-Source: AG47ELs8t0p6wEEhPBfFT1v8JtB7Ys2MK5ZuyipnreTpJVxykIicDgA/IOmxOi/L2J7sAYvpQn1G6w== X-Received: by 10.98.204.12 with SMTP id a12mr21307752pfg.3.1521759495206; Thu, 22 Mar 2018 15:58:15 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b78sm15807767pfe.88.2018.03.22.15.58.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Mar 2018 15:58:14 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, roopa@cumulusnetworks.com, shm@cumulusnetworks.com, jiri@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, David Ahern Subject: [PATCH RFC net-next 3/7] net/ipv4: Move call_fib_entry_notifiers up for new routes Date: Thu, 22 Mar 2018 15:57:53 -0700 Message-Id: <20180322225757.10377-4-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180322225757.10377-1-dsa@cumulusnetworks.com> References: <20180322225757.10377-1-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Move call to call_fib_entry_notifiers for new IPv4 routes to right before the call to fib_insert_alias. At this point the only remaining failure path is memory allocations in fib_insert_node. Handle that very unlikely failure with a call to call_fib_entry_notifiers to tell drivers about it. At this point notifier handlers can decide the fate of the new route with a clean path to delete the potential new entry if the notifier returns non-0. Signed-off-by: David Ahern --- net/ipv4/fib_trie.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 62243a8abf92..d0f70a16f8de 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -1065,6 +1065,9 @@ static int fib_insert_node(struct trie *t, struct key_vector *tp, return -ENOMEM; } +/* fib notifier for ADD is sent before calling fib_insert_alias with + * the expectation that the only possible failure ENOMEM + */ static int fib_insert_alias(struct trie *t, struct key_vector *tp, struct key_vector *l, struct fib_alias *new, struct fib_alias *fa, t_key key) @@ -1263,21 +1266,32 @@ int fib_table_insert(struct net *net, struct fib_table *tb, new_fa->tb_id = tb->tb_id; new_fa->fa_default = -1; + err = call_fib_entry_notifiers(net, event, key, plen, new_fa, extack); + if (err) + goto out_free_new_fa; + /* Insert new entry to the list. */ err = fib_insert_alias(t, tp, l, new_fa, fa, key); if (err) - goto out_free_new_fa; + goto out_fib_notif; if (!plen) tb->tb_num_default++; rt_cache_flush(cfg->fc_nlinfo.nl_net); - call_fib_entry_notifiers(net, event, key, plen, new_fa, extack); rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, new_fa->tb_id, &cfg->fc_nlinfo, nlflags); succeeded: return 0; +out_fib_notif: + /* notifier was sent that entry would be added to trie, but + * the add failed and need to recover. Only failure for + * fib_insert_alias is ENOMEM. + */ + NL_SET_ERR_MSG(extack, "Failed to insert route into trie"); + call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, key, + plen, new_fa, NULL); out_free_new_fa: kmem_cache_free(fn_alias_kmem, new_fa); out: From patchwork Thu Mar 22 22:57:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 889722 X-Patchwork-Delegate: davem@davemloft.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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="fbZM3HC7"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 406htB142kz9s0x for ; Fri, 23 Mar 2018 09:58:42 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751980AbeCVW6k (ORCPT ); Thu, 22 Mar 2018 18:58:40 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:35273 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751872AbeCVW6R (ORCPT ); Thu, 22 Mar 2018 18:58:17 -0400 Received: by mail-pf0-f195.google.com with SMTP id y186so3980620pfb.2 for ; Thu, 22 Mar 2018 15:58:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kGgkXeb8wtXfrRktcp+19MWqvGz4Wm05AP77zzsrrFU=; b=fbZM3HC72xzpuwHQMDTO/TNMmScQUKy5DHYZTvObZiErhR+TBKlKbEMzseq3wY34bW MAXztyd6VWaDFOD3WrGMYrL+zbXJbReox2IbyYXHeC+kyv3152untkWq2IcL3+7/1P+O 2W1gsTjtdjCP6XAyQbJmL0keB7gBXKzlc/kDE= 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=kGgkXeb8wtXfrRktcp+19MWqvGz4Wm05AP77zzsrrFU=; b=uaZTh1J6l9swNpzgFrJy+q8raZrsyIfPlMYyzlh4+xv4fXGoj8AcQAh/XIk2fn9Xc5 DJ0TbXszwLQHN7INfKFoYXmnUlETsy2e/dlcwdmt5e9Tsa3Kl14D7v+5xM53GhMxaGv1 irg027GLfDKu8B8zHD53ZZSdPgpAYcqKOzDu6q97pGhCsIBN9itn+ayjfBEv3ox29zUR umz6MPmDKh/ZBQJlFyb2dFSJKGsCKWRddWsDu/6Kfa0HCeiSTktK5GF9sgiW3w51HKD0 kyGcAHRQO0NJbZDU6u7q0yaCbyYmOxMlG296IH1FSbn272d4OpbZ4xBXr/TwgZyuy9eL KsiQ== X-Gm-Message-State: AElRT7FHMtunpTIrLI7FgkpngqA7Lt1Ws8zZyV50rdbaVUQ2jCFzIUiO a/zNMsMJnCZFuUc7YcRXffISDgiw X-Google-Smtp-Source: AG47ELtX8rsiVXJ1aG1pslxqw/yQeNfx/tpAAtIxicDhqAmXOyj8aSiOziYAEb18IRCqVrGY5LDc+A== X-Received: by 10.98.14.215 with SMTP id 84mr17614151pfo.168.1521759496668; Thu, 22 Mar 2018 15:58:16 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b78sm15807767pfe.88.2018.03.22.15.58.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Mar 2018 15:58:15 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, roopa@cumulusnetworks.com, shm@cumulusnetworks.com, jiri@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, David Ahern Subject: [PATCH RFC net-next 4/7] net/ipv4: Allow notifier to fail route repolace Date: Thu, 22 Mar 2018 15:57:54 -0700 Message-Id: <20180322225757.10377-5-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180322225757.10377-1-dsa@cumulusnetworks.com> References: <20180322225757.10377-1-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add checking to call to call_fib_entry_notifiers for IPv4 route replace. Allows a notifier handler to fail the replace. Signed-off-by: David Ahern --- net/ipv4/fib_trie.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index d0f70a16f8de..113822aa9ea7 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -1219,8 +1219,13 @@ int fib_table_insert(struct net *net, struct fib_table *tb, new_fa->tb_id = tb->tb_id; new_fa->fa_default = -1; - call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_REPLACE, - key, plen, new_fa, extack); + err = call_fib_entry_notifiers(net, + FIB_EVENT_ENTRY_REPLACE, + key, plen, new_fa, + extack); + if (err) + goto out_free_new_fa; + rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, &cfg->fc_nlinfo, nlflags); From patchwork Thu Mar 22 22:57:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 889719 X-Patchwork-Delegate: davem@davemloft.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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="Pj2EyocB"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 406hsr3x5Wz9s0q for ; Fri, 23 Mar 2018 09:58:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751909AbeCVW6V (ORCPT ); Thu, 22 Mar 2018 18:58:21 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:46950 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751880AbeCVW6T (ORCPT ); Thu, 22 Mar 2018 18:58:19 -0400 Received: by mail-pf0-f193.google.com with SMTP id z10so3963953pfh.13 for ; Thu, 22 Mar 2018 15:58:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2kV3FWkuXH8OSns/sQ79Q4nk0L4MSp7c44zS11/6SI0=; b=Pj2EyocBo+od37u0dfW5pjziCYKpItZosq0rW91om4qXRbbBwtIkcEQ3OFdcdd2siQ KnAzarYocH8IdBzjb2BYqG0JmUjEfCFi+qaRU/yQwat+yjNL1NViCVzOVTzJjxdaDIeh kQbCVEVGnHFXRbe0ij+tyoEtNUOb+quR9Wua4= 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=2kV3FWkuXH8OSns/sQ79Q4nk0L4MSp7c44zS11/6SI0=; b=By6cWpTY7EB/McenPKpehCyYeaVq/cSS6OERSiyh8+ioqJRx9sqLbMIWjTczHcXCQ+ nSPyLT4Xrro9ScAVizibGiQiflDK2EBXITVPOxNFVLDeHb+QbfSgVmGfaRc8uY4jfkUd UTc3es6R46iSYrVMn6cP+7IHm/VfoZecVy9H8zjzS7NKsr7QxnDYv27TY6Z5ACyH5GXN sfqgLCxk/TGOuqVspNPO1Hltocf94wTtRyqYIBUx7SfMCcIdYsuR1h4YZT/kj/V8IQsO L8m+rRstjYZd/d3swba+r1Nagj07MALSbeWsQcTgObbTWiSPqwSw1yowSifZkuqEAoiA zj5w== X-Gm-Message-State: AElRT7EuKUlIQGRJRUJ9jl62XujFyohmCG74Ljzk74XHAytzuaJehC6r F3RWV64SJ+CgckOTcl61eatmbljb X-Google-Smtp-Source: AG47ELsHEwH0k/YXydoQL7ziUGv86UJaCPYiXuvG3El6kMkkOvvljPjEfm+StszEW2teFMNsI4Le6g== X-Received: by 10.98.78.21 with SMTP id c21mr10051158pfb.107.1521759498071; Thu, 22 Mar 2018 15:58:18 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b78sm15807767pfe.88.2018.03.22.15.58.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Mar 2018 15:58:17 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, roopa@cumulusnetworks.com, shm@cumulusnetworks.com, jiri@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, David Ahern Subject: [PATCH RFC net-next 5/7] net/ipv6: Move call_fib6_entry_notifiers up for route adds Date: Thu, 22 Mar 2018 15:57:55 -0700 Message-Id: <20180322225757.10377-6-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180322225757.10377-1-dsa@cumulusnetworks.com> References: <20180322225757.10377-1-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Move call to call_fib6_entry_notifiers for new IPv6 routes to right before the insertion into the FIB. At this point notifier handlers can decide the fate of the new route with a clean path to delete the potential new entry if the notifier returns non-0. Signed-off-by: David Ahern --- net/ipv6/ip6_fib.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 2f995e9e3050..041c0603841f 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c @@ -1007,12 +1007,16 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, if (err) return err; + err = call_fib6_entry_notifiers(info->nl_net, + FIB_EVENT_ENTRY_ADD, + rt, extack); + if (err) + return err; + rcu_assign_pointer(rt->rt6_next, iter); atomic_inc(&rt->rt6i_ref); rcu_assign_pointer(rt->rt6i_node, fn); rcu_assign_pointer(*ins, rt); - call_fib6_entry_notifiers(info->nl_net, FIB_EVENT_ENTRY_ADD, - rt, extack); if (!info->skip_notify) inet6_rt_notify(RTM_NEWROUTE, rt, info, nlflags); info->nl_net->ipv6.rt6_stats->fib_rt_entries++; @@ -1036,12 +1040,16 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, if (err) return err; + err = call_fib6_entry_notifiers(info->nl_net, + FIB_EVENT_ENTRY_REPLACE, + rt, extack); + if (err) + return err; + atomic_inc(&rt->rt6i_ref); rcu_assign_pointer(rt->rt6i_node, fn); rt->rt6_next = iter->rt6_next; rcu_assign_pointer(*ins, rt); - call_fib6_entry_notifiers(info->nl_net, FIB_EVENT_ENTRY_REPLACE, - rt, extack); if (!info->skip_notify) inet6_rt_notify(RTM_NEWROUTE, rt, info, NLM_F_REPLACE); if (!(fn->fn_flags & RTN_RTINFO)) { From patchwork Thu Mar 22 22:57:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 889721 X-Patchwork-Delegate: davem@davemloft.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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="CAPq4NTE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 406ht32hzHz9s0x for ; Fri, 23 Mar 2018 09:58:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751976AbeCVW6c (ORCPT ); Thu, 22 Mar 2018 18:58:32 -0400 Received: from mail-pl0-f65.google.com ([209.85.160.65]:45013 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751841AbeCVW6U (ORCPT ); Thu, 22 Mar 2018 18:58:20 -0400 Received: by mail-pl0-f65.google.com with SMTP id 9-v6so6275343ple.11 for ; Thu, 22 Mar 2018 15:58:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mtwwDQhrq/ELQDZbRe0glfevp32g0ML/6iLZXXS35CA=; b=CAPq4NTEtm2+pKQTyVuzdUO5zVSET1Ber/B/T9c6UJRnh4adDHCIj5ErCE9g4JPGki KrbAPIyPzdP3Y04//nkOTRuYcw7akPUVy1W5NeOmVGEnHAYzIUAK9c+o96nU7K42UhXt CPphsBL6Zh0A6GodY3VimNN3Zb8j+p+0Ct8Lc= 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=mtwwDQhrq/ELQDZbRe0glfevp32g0ML/6iLZXXS35CA=; b=qMVHfaRvvBYaLK/KzGiSEk8+tliUIuKjTU/RLcqnmcr+/WMnpJdYJ4+J6ZCSX2y00A qx9kCn0f4DuW0CKNhVp29sbeUt4vf94vFTkTr9cNfWqrkMMoate2DTIFTO7d1GnD8DQR GoryLQ+Pkjobxr8XwebIiCzDdGZtHuo2XSqSweK0OTwPSLrifVQm4oBP7Q6itZ8YizbW i8yUT8rMZJvt2IlaB+iBm0M23iC0Qf2wM+HqDq9fvIrpSeHi4FcjGUOmTRuylEcwIg3l koOcKAUaS9x62WzNVpe7+Cqw7yXcanbH70N3OSR/F7GSxhhAWkHhKwqub/2BeMPB/YrL +kAA== X-Gm-Message-State: AElRT7ELREj4ZOcQgVuYYzC788jPgD30WgGuWFpXB+3CkN+z7OdK76kR rQTtk7hZT/EaVQWhgsiMLAA24Abt X-Google-Smtp-Source: AG47ELtbcEoJOqrR6ioOcWS5wwHFEoI64Io6+7HcMh4L384ilrptXZ5HprLZ8R7CudMxeH9k08rl5Q== X-Received: by 2002:a17:902:4222:: with SMTP id g31-v6mr27617081pld.335.1521759499504; Thu, 22 Mar 2018 15:58:19 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b78sm15807767pfe.88.2018.03.22.15.58.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Mar 2018 15:58:18 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, roopa@cumulusnetworks.com, shm@cumulusnetworks.com, jiri@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, David Ahern Subject: [PATCH RFC net-next 6/7] devlink: Export methods to get and set namespace Date: Thu, 22 Mar 2018 15:57:56 -0700 Message-Id: <20180322225757.10377-7-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180322225757.10377-1-dsa@cumulusnetworks.com> References: <20180322225757.10377-1-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Export devlink_net and devlink_net_set for modules to be able to set the network namespace for a devlink instance and retrieve it later. Signed-off-by: David Ahern --- include/net/devlink.h | 2 ++ net/core/devlink.c | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index d5b707375e48..e6f7d0f674a5 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -361,6 +361,8 @@ struct ib_device; #if IS_ENABLED(CONFIG_NET_DEVLINK) struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size); +struct net *devlink_net(const struct devlink *devlink); +void devlink_net_set(struct devlink *devlink, struct net *net); int devlink_register(struct devlink *devlink, struct device *dev); void devlink_unregister(struct devlink *devlink); void devlink_free(struct devlink *devlink); diff --git a/net/core/devlink.c b/net/core/devlink.c index d03b96f87c25..53cddffe97fc 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -92,15 +92,17 @@ static LIST_HEAD(devlink_list); */ static DEFINE_MUTEX(devlink_mutex); -static struct net *devlink_net(const struct devlink *devlink) +struct net *devlink_net(const struct devlink *devlink) { return read_pnet(&devlink->_net); } +EXPORT_SYMBOL_GPL(devlink_net); -static void devlink_net_set(struct devlink *devlink, struct net *net) +void devlink_net_set(struct devlink *devlink, struct net *net) { write_pnet(&devlink->_net, net); } +EXPORT_SYMBOL_GPL(devlink_net_set); static struct devlink *devlink_get_from_attrs(struct net *net, struct nlattr **attrs) From patchwork Thu Mar 22 22:57:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 889720 X-Patchwork-Delegate: davem@davemloft.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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="d2S3zYzf"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 406hst6Xgdz9s0q for ; Fri, 23 Mar 2018 09:58:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751923AbeCVW6Y (ORCPT ); Thu, 22 Mar 2018 18:58:24 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:37383 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751880AbeCVW6W (ORCPT ); Thu, 22 Mar 2018 18:58:22 -0400 Received: by mail-pl0-f68.google.com with SMTP id w12-v6so6276887plp.4 for ; Thu, 22 Mar 2018 15:58:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JAYbUEuQsrWIZAnBVlKpbX1XTygkSEjNtZe0C0kfcwc=; b=d2S3zYzfNyt7xL+LFDtWWtL/9w9LSAPybio4UC1a8rj43JZzSZ4xbtbBA4dZjWIPl3 lqbw3SvXOzn7sNuLIhQR6ZYJp59BfyT2q+BCDzXBJy2a3+IxfrhgPRzK72z2ponD1Qn2 pjrChjDTpwq/2L4U/kyZdce75umBtctSRX6Ao= 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=JAYbUEuQsrWIZAnBVlKpbX1XTygkSEjNtZe0C0kfcwc=; b=R8FmMnLbOFOat6vVkxuhLIj9LRESA/PI5OYjkTGSl+5LqV4YM8lTDqApvC1Z72fdSe t+r4jUBGal/eNmozOuo6aRu3MtWvkdVzLBWcfOIcJgZ43iV8xl6cS7jpzNgTSx/9ESXW DxzNGkngOsJmta+VgpaMeJYwLrXX4/i/AnoNNyRIKEz7RIHlxAdDhceBhuFXFUUDBqEs 8Jiw4k6e3xfg7eDpn2Lmat7PiWx09aH4XKoHUe64oLaHAytRaajt4GNv2jlQt+FraCSE V0IxsL7/nIDXJAVPRv2CrrxFhCAeoewFYJzJN+6CYpvX+sD7k/VLIvxqfPmtpaBgcikX NiFQ== X-Gm-Message-State: AElRT7GXF7ZUgkt9/h0p5aPsNjqaBkeYu2YevsZ0I/lwuLk9+kfG3Yh6 53TGqIJRElIzBQFcWIVWwlSvsVm1 X-Google-Smtp-Source: AG47ELuVOU27d2/1GozZ8eZjHExXIZ5W7dmrA7jV5HLVqm+7nbXrIxcx+pEk2FgBSFLbB0IQOhq2Jw== X-Received: by 2002:a17:902:a709:: with SMTP id w9-v6mr23664320plq.378.1521759501008; Thu, 22 Mar 2018 15:58:21 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b78sm15807767pfe.88.2018.03.22.15.58.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Mar 2018 15:58:20 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, roopa@cumulusnetworks.com, shm@cumulusnetworks.com, jiri@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, David Ahern Subject: [PATCH RFC net-next 7/7] netdevsim: Add simple FIB resource controller via devlink Date: Thu, 22 Mar 2018 15:57:57 -0700 Message-Id: <20180322225757.10377-8-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180322225757.10377-1-dsa@cumulusnetworks.com> References: <20180322225757.10377-1-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add devlink support to netdevsim and use it to implement a simple, profile based resource controller. Only one controller is needed per namespace, so the first netdevsim netdevice in a namespace registers with devlink. If that device is deleted, the resource settings are deleted. The resource controller allows a user to limit the number of IPv4 and IPv6 FIB entries and FIB rules. The resource paths are: /IPv4 /IPv4/fib /IPv4/fib-rules /IPv6 /IPv6/fib /IPv6/fib-rules The IPv4 and IPv6 top level resources are unlimited in size and can not be changed. From there, the number of FIB entries and FIB rule entries are unlimited by default. A user can specify a limit for the fib and fib-rules resources: $ devlink resource set netdevsim/netdevsim0 path /IPv4/fib size 96 $ devlink resource set netdevsim/netdevsim0 path /IPv4/fib-rules size 16 $ devlink resource set netdevsim/netdevsim0 path /IPv6/fib size 64 $ devlink resource set netdevsim/netdevsim0 path /IPv6/fib-rules size 16 $ devlink dev reload netdevsim/netdevsim0 such that the number of rules or routes is limited: $ for n in $(seq 1 32); do ip ro add 10.99.$n.0/24 dev eth1; done Error: netdevsim: Exceeded number of supported fib entries. $ devlink resource show netdevsim/netdevsim0 netdevsim/netdevsim0: name IPv4 size unlimited unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables non resources: name fib size 96 occ 96 unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables ... The resource limits for one namespace have no bearing on another: $ ip netns add foobar $ ip -netns foobar link add bar type netdevsim $ ip netns exec foobar devlink resource show netdevsim/netdevsim1 netdevsim/netdevsim1: name IPv4 size unlimited unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables non resources: name fib size unlimited occ 0 unit entry size_min 0 size_max unlimited size_gran 1 dpipe_t name fib-rules size unlimited occ 0 unit entry size_min 0 size_max unlimited size_gran 1 d ... With this template in place for resource management, it is fairly trivial to extend and shows one way to implement a simple counter based resource controller typical of network profiles. Signed-off-by: David Ahern --- drivers/net/netdevsim/Makefile | 4 + drivers/net/netdevsim/devlink.c | 281 ++++++++++++++++++++++++++++++++++++++ drivers/net/netdevsim/fib.c | 264 +++++++++++++++++++++++++++++++++++ drivers/net/netdevsim/netdev.c | 12 +- drivers/net/netdevsim/netdevsim.h | 42 ++++++ 5 files changed, 602 insertions(+), 1 deletion(-) create mode 100644 drivers/net/netdevsim/devlink.c create mode 100644 drivers/net/netdevsim/fib.c diff --git a/drivers/net/netdevsim/Makefile b/drivers/net/netdevsim/Makefile index 09388c06171d..449b2a1a1800 100644 --- a/drivers/net/netdevsim/Makefile +++ b/drivers/net/netdevsim/Makefile @@ -9,3 +9,7 @@ ifeq ($(CONFIG_BPF_SYSCALL),y) netdevsim-objs += \ bpf.o endif + +ifneq ($(CONFIG_NET_DEVLINK),) +netdevsim-objs += devlink.o fib.o +endif diff --git a/drivers/net/netdevsim/devlink.c b/drivers/net/netdevsim/devlink.c new file mode 100644 index 000000000000..d10558e1b022 --- /dev/null +++ b/drivers/net/netdevsim/devlink.c @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2018 Cumulus Networks. All rights reserved. + * Copyright (c) 2018 David Ahern + * + * This software is licensed under the GNU General License Version 2, + * June 1991 as shown in the file COPYING in the top-level directory of this + * source tree. + * + * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE + * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME + * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + */ + +#include +#include +#include + +#include "netdevsim.h" + +static unsigned int nsim_devlink_id; + +/* IPv4 + */ +static u64 nsim_ipv4_fib_resource_occ_get(struct devlink *devlink) +{ + struct net *net = devlink_net(devlink); + + return nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB, false); +} + +static struct devlink_resource_ops nsim_ipv4_fib_res_ops = { + .occ_get = nsim_ipv4_fib_resource_occ_get, +}; + +static u64 nsim_ipv4_fib_rules_res_occ_get(struct devlink *devlink) +{ + struct net *net = devlink_net(devlink); + + return nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB_RULES, false); +} + +static struct devlink_resource_ops nsim_ipv4_fib_rules_res_ops = { + .occ_get = nsim_ipv4_fib_rules_res_occ_get, +}; + +/* IPv6 + */ +static u64 nsim_ipv6_fib_resource_occ_get(struct devlink *devlink) +{ + struct net *net = devlink_net(devlink); + + return nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB, false); +} + +static struct devlink_resource_ops nsim_ipv6_fib_res_ops = { + .occ_get = nsim_ipv6_fib_resource_occ_get, +}; + +static u64 nsim_ipv6_fib_rules_res_occ_get(struct devlink *devlink) +{ + struct net *net = devlink_net(devlink); + + return nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB_RULES, false); +} + +static struct devlink_resource_ops nsim_ipv6_fib_rules_res_ops = { + .occ_get = nsim_ipv6_fib_rules_res_occ_get, +}; + +static int devlink_resources_register(struct devlink *devlink) +{ + struct devlink_resource_size_params params = { + .size_max = (u64)-1, + .size_granularity = 1, + .unit = DEVLINK_RESOURCE_UNIT_ENTRY + }; + struct net *net = devlink_net(devlink); + int err; + u64 n; + + /* Resources for IPv4 */ + err = devlink_resource_register(devlink, "IPv4", (u64)-1, + NSIM_RESOURCE_IPV4, + DEVLINK_RESOURCE_ID_PARENT_TOP, + ¶ms, NULL); + if (err) { + pr_err("Failed to register IPv4 top resource\n"); + goto out; + } + + n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB, true); + err = devlink_resource_register(devlink, "fib", n, + NSIM_RESOURCE_IPV4_FIB, + NSIM_RESOURCE_IPV4, + ¶ms, &nsim_ipv4_fib_res_ops); + if (err) { + pr_err("Failed to register IPv4 FIB resource\n"); + return err; + } + + n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB_RULES, true); + err = devlink_resource_register(devlink, "fib-rules", n, + NSIM_RESOURCE_IPV4_FIB_RULES, + NSIM_RESOURCE_IPV4, + ¶ms, &nsim_ipv4_fib_rules_res_ops); + if (err) { + pr_err("Failed to register IPv4 FIB rules resource\n"); + return err; + } + + /* Resources for IPv6 */ + err = devlink_resource_register(devlink, "IPv6", (u64)-1, + NSIM_RESOURCE_IPV6, + DEVLINK_RESOURCE_ID_PARENT_TOP, + ¶ms, NULL); + if (err) { + pr_err("Failed to register IPv6 top resource\n"); + goto out; + } + + n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB, true); + err = devlink_resource_register(devlink, "fib", n, + NSIM_RESOURCE_IPV6_FIB, + NSIM_RESOURCE_IPV6, + ¶ms, &nsim_ipv6_fib_res_ops); + if (err) { + pr_err("Failed to register IPv6 FIB resource\n"); + return err; + } + + n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB_RULES, true); + err = devlink_resource_register(devlink, "fib-rules", n, + NSIM_RESOURCE_IPV6_FIB_RULES, + NSIM_RESOURCE_IPV6, + ¶ms, &nsim_ipv6_fib_rules_res_ops); + if (err) { + pr_err("Failed to register IPv6 FIB rules resource\n"); + return err; + } +out: + return err; +} + +static int nsim_devlink_reload(struct devlink *devlink) +{ + enum nsim_resource_id res_ids[] = { + NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES, + NSIM_RESOURCE_IPV6_FIB, NSIM_RESOURCE_IPV6_FIB_RULES + }; + struct net *net = devlink_net(devlink); + int i; + + for (i = 0; i < ARRAY_SIZE(res_ids); ++i) { + int err; + u64 val; + + err = devlink_resource_size_get(devlink, res_ids[i], &val); + if (!err) { + err = nsim_fib_set_max(net, res_ids[i], val); + if (err) + return err; + } + } + + return 0; +} + +static void nsim_devlink_net_reset(struct net *net) +{ + enum nsim_resource_id res_ids[] = { + NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES, + NSIM_RESOURCE_IPV6_FIB, NSIM_RESOURCE_IPV6_FIB_RULES + }; + int i; + + for (i = 0; i < ARRAY_SIZE(res_ids); ++i) { + if (nsim_fib_set_max(net, res_ids[i], (u64)-1)) { + pr_err("Failed to reset limit for resource %u\n", + res_ids[i]); + } + } +} + +static const struct devlink_ops nsim_devlink_ops = { + .reload = nsim_devlink_reload, +}; + +void nsim_devlink_teardown(struct netdevsim *ns) +{ + if (ns->devlink) { + struct net *net = dev_net(ns->netdev); + bool *reg_devlink = net_generic(net, nsim_devlink_id); + + devlink_unregister(ns->devlink); + devlink_free(ns->devlink); + ns->devlink = NULL; + + nsim_devlink_net_reset(net); + *reg_devlink = true; + } +} + +void nsim_devlink_setup(struct netdevsim *ns) +{ + struct net *net = dev_net(ns->netdev); + bool *reg_devlink = net_generic(net, nsim_devlink_id); + struct devlink *devlink; + int err = -ENOMEM; + + /* only one device per namespace controls devlink */ + if (!*reg_devlink) { + ns->devlink = NULL; + return; + } + + devlink = devlink_alloc(&nsim_devlink_ops, 0); + if (!devlink) + return; + + devlink_net_set(devlink, net); + err = devlink_register(devlink, &ns->dev); + if (err) + goto err_devlink_free; + + err = devlink_resources_register(devlink); + if (err) + goto err_dl_unregister; + + ns->devlink = devlink; + + *reg_devlink = false; + + return; + +err_dl_unregister: + devlink_unregister(devlink); +err_devlink_free: + devlink_free(devlink); +} + +/* Initialize per network namespace state */ +static int __net_init nsim_devlink_netns_init(struct net *net) +{ + bool *reg_devlink = net_generic(net, nsim_devlink_id); + + *reg_devlink = true; + + return 0; +} + +static struct pernet_operations nsim_devlink_net_ops __net_initdata = { + .init = nsim_devlink_netns_init, + .id = &nsim_devlink_id, + .size = sizeof(bool), + .async = true, +}; + +void nsim_devlink_exit(void) +{ + unregister_pernet_subsys(&nsim_devlink_net_ops); + nsim_fib_exit(); +} + +int nsim_devlink_init(void) +{ + int err; + + err = nsim_fib_init(); + if (err) + goto err_out; + + err = register_pernet_subsys(&nsim_devlink_net_ops); + if (err) + nsim_fib_exit(); + +err_out: + return err; +} diff --git a/drivers/net/netdevsim/fib.c b/drivers/net/netdevsim/fib.c new file mode 100644 index 000000000000..b77dcafc7158 --- /dev/null +++ b/drivers/net/netdevsim/fib.c @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2018 Cumulus Networks. All rights reserved. + * Copyright (c) 2018 David Ahern + * + * This software is licensed under the GNU General License Version 2, + * June 1991 as shown in the file COPYING in the top-level directory of this + * source tree. + * + * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE + * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME + * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + */ + +#include +#include +#include +#include +#include + +#include "netdevsim.h" + +struct nsim_fib_entry { + u64 max; + u64 num; +}; + +struct nsim_per_fib_data { + struct nsim_fib_entry fib; + struct nsim_fib_entry rules; +}; + +struct nsim_fib_data { + struct nsim_per_fib_data ipv4; + struct nsim_per_fib_data ipv6; +}; + +static unsigned int nsim_fib_net_id; + +u64 nsim_fib_get_val(struct net *net, enum nsim_resource_id res_id, bool max) +{ + struct nsim_fib_data *fib_data = net_generic(net, nsim_fib_net_id); + struct nsim_fib_entry *entry; + + switch (res_id) { + case NSIM_RESOURCE_IPV4_FIB: + entry = &fib_data->ipv4.fib; + break; + case NSIM_RESOURCE_IPV4_FIB_RULES: + entry = &fib_data->ipv4.rules; + break; + case NSIM_RESOURCE_IPV6_FIB: + entry = &fib_data->ipv6.fib; + break; + case NSIM_RESOURCE_IPV6_FIB_RULES: + entry = &fib_data->ipv6.rules; + break; + default: + return 0; + } + + return max ? entry->max : entry->num; +} + +int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val) +{ + struct nsim_fib_data *fib_data = net_generic(net, nsim_fib_net_id); + struct nsim_fib_entry *entry; + int err = 0; + + switch (res_id) { + case NSIM_RESOURCE_IPV4_FIB: + entry = &fib_data->ipv4.fib; + break; + case NSIM_RESOURCE_IPV4_FIB_RULES: + entry = &fib_data->ipv4.rules; + break; + case NSIM_RESOURCE_IPV6_FIB: + entry = &fib_data->ipv6.fib; + break; + case NSIM_RESOURCE_IPV6_FIB_RULES: + entry = &fib_data->ipv6.rules; + break; + default: + return 0; + } + + /* not allowing a new max to be less than curren occupancy + * --> no means of evicting entries + */ + if (val < entry->num) + err = -EINVAL; + else + entry->max = val; + + return err; +} + +static int nsim_fib_rule_account(struct nsim_fib_entry *entry, bool add, + struct netlink_ext_ack *extack) +{ + int err = 0; + + if (add) { + if (entry->num < entry->max) { + entry->num++; + } else { + err = -ENOSPC; + NL_SET_ERR_MSG_MOD(extack, "Exceeded number of supported fib rule entries"); + } + } else { + entry->num--; + } + + return err; +} + +static int nsim_fib_rule_event(struct fib_notifier_info *info, bool add) +{ + struct nsim_fib_data *data = net_generic(info->net, nsim_fib_net_id); + struct netlink_ext_ack *extack = info->extack; + int err = 0; + + switch (info->family) { + case AF_INET: + err = nsim_fib_rule_account(&data->ipv4.rules, add, extack); + break; + case AF_INET6: + err = nsim_fib_rule_account(&data->ipv6.rules, add, extack); + break; + } + + return err; +} + +static int nsim_fib_account(struct nsim_fib_entry *entry, bool add, + struct netlink_ext_ack *extack) +{ + int err = 0; + + if (add) { + if (entry->num < entry->max) { + entry->num++; + } else { + err = -ENOSPC; + NL_SET_ERR_MSG_MOD(extack, "Exceeded number of supported fib entries"); + } + } else { + entry->num--; + } + + return err; +} + +static int nsim_fib_event(struct fib_notifier_info *info, bool add) +{ + struct nsim_fib_data *data = net_generic(info->net, nsim_fib_net_id); + struct netlink_ext_ack *extack = info->extack; + int err = 0; + + switch (info->family) { + case AF_INET: + err = nsim_fib_account(&data->ipv4.fib, add, extack); + break; + case AF_INET6: + err = nsim_fib_account(&data->ipv6.fib, add, extack); + break; + } + + return err; +} + +static int nsim_fib_event_nb(struct notifier_block *nb, unsigned long event, + void *ptr) +{ + struct fib_notifier_info *info = ptr; + int err; + + switch (event) { + case FIB_EVENT_RULE_ADD: /* fall through */ + case FIB_EVENT_RULE_DEL: + err = nsim_fib_rule_event(info, event == FIB_EVENT_RULE_ADD); + break; + + case FIB_EVENT_ENTRY_ADD: /* fall through */ + case FIB_EVENT_ENTRY_DEL: + err = nsim_fib_event(info, event == FIB_EVENT_ENTRY_ADD); + break; + } + + return notifier_from_errno(err); +} + +/* inconsistent dump, trying again */ +static void nsim_fib_dump_inconsistent(struct notifier_block *nb) +{ + struct nsim_fib_data *data; + struct net *net; + + rcu_read_lock(); + for_each_net_rcu(net) { + data = net_generic(net, nsim_fib_net_id); + + data->ipv4.fib.num = 0ULL; + data->ipv4.rules.num = 0ULL; + + data->ipv6.fib.num = 0ULL; + data->ipv6.rules.num = 0ULL; + } + rcu_read_unlock(); +} + +static struct notifier_block nsim_fib_nb = { + .notifier_call = nsim_fib_event_nb, +}; + +/* Initialize per network namespace state */ +static int __net_init nsim_fib_netns_init(struct net *net) +{ + struct nsim_fib_data *data = net_generic(net, nsim_fib_net_id); + + data->ipv4.fib.max = (u64)-1; + data->ipv4.rules.max = (u64)-1; + + data->ipv6.fib.max = (u64)-1; + data->ipv6.rules.max = (u64)-1; + + return 0; +} + +static struct pernet_operations nsim_fib_net_ops __net_initdata = { + .init = nsim_fib_netns_init, + .id = &nsim_fib_net_id, + .size = sizeof(struct nsim_fib_data), + .async = true, +}; + +void nsim_fib_exit(void) +{ + unregister_pernet_subsys(&nsim_fib_net_ops); + unregister_fib_notifier(&nsim_fib_nb); +} + +int nsim_fib_init(void) +{ + int err; + + err = register_pernet_subsys(&nsim_fib_net_ops); + if (err < 0) { + pr_err("Failed to register pernet subsystem\n"); + goto err_out; + } + + err = register_fib_notifier(&nsim_fib_nb, nsim_fib_dump_inconsistent); + if (err < 0) { + pr_err("Failed to register fib notifier\n"); + goto err_out; + } + +err_out: + return err; +} diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index 3fd567928f3d..8b30ab3ea2c2 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -167,6 +167,8 @@ static int nsim_init(struct net_device *dev) SET_NETDEV_DEV(dev, &ns->dev); + nsim_devlink_setup(ns); + return 0; err_bpf_uninit: @@ -180,6 +182,7 @@ static void nsim_uninit(struct net_device *dev) { struct netdevsim *ns = netdev_priv(dev); + nsim_devlink_teardown(ns); debugfs_remove_recursive(ns->ddir); nsim_bpf_uninit(ns); } @@ -478,12 +481,18 @@ static int __init nsim_module_init(void) if (err) goto err_debugfs_destroy; - err = rtnl_link_register(&nsim_link_ops); + err = nsim_devlink_init(); if (err) goto err_unreg_bus; + err = rtnl_link_register(&nsim_link_ops); + if (err) + goto err_dl_fini; + return 0; +err_dl_fini: + nsim_devlink_exit(); err_unreg_bus: bus_unregister(&nsim_bus); err_debugfs_destroy: @@ -494,6 +503,7 @@ static int __init nsim_module_init(void) static void __exit nsim_module_exit(void) { rtnl_link_unregister(&nsim_link_ops); + nsim_devlink_exit(); bus_unregister(&nsim_bus); debugfs_remove_recursive(nsim_ddir); } diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index ea081c10efb8..37dd5f312913 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -64,6 +64,9 @@ struct netdevsim { bool bpf_map_accept; struct list_head bpf_bound_maps; +#if IS_ENABLED(CONFIG_NET_DEVLINK) + struct devlink *devlink; +#endif }; extern struct dentry *nsim_ddir; @@ -103,6 +106,45 @@ nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, void *type_data, } #endif +#if IS_ENABLED(CONFIG_NET_DEVLINK) +enum nsim_resource_id { + NSIM_RESOURCE_IPV4, + NSIM_RESOURCE_IPV4_FIB, + NSIM_RESOURCE_IPV4_FIB_RULES, + NSIM_RESOURCE_IPV6, + NSIM_RESOURCE_IPV6_FIB, + NSIM_RESOURCE_IPV6_FIB_RULES, +}; + +void nsim_devlink_setup(struct netdevsim *ns); +void nsim_devlink_teardown(struct netdevsim *ns); + +int nsim_devlink_init(void); +void nsim_devlink_exit(void); + +int nsim_fib_init(void); +void nsim_fib_exit(void); +u64 nsim_fib_get_val(struct net *net, enum nsim_resource_id res_id, bool max); +int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val); +#else +static inline void nsim_devlink_setup(struct netdevsim *ns) +{ +} + +static inline void nsim_devlink_teardown(struct netdevsim *ns) +{ +} + +static inline int nsim_devlink_init(void) +{ + return 0; +} + +static inline void nsim_devlink_exit(void) +{ +} +#endif + static inline struct netdevsim *to_nsim(struct device *ptr) { return container_of(ptr, struct netdevsim, dev);