From patchwork Fri Jul 1 14:05:10 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 643081 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rh0Cj1VsCz9s9c for ; Sat, 2 Jul 2016 01:08:17 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b=zCNZiCvf; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752255AbcGAPIN (ORCPT ); Fri, 1 Jul 2016 11:08:13 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:33523 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751699AbcGAPIL (ORCPT ); Fri, 1 Jul 2016 11:08:11 -0400 Received: by mail-wm0-f67.google.com with SMTP id r201so5985475wme.0 for ; Fri, 01 Jul 2016 08:08:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wVlAvHi4dFYuwJ05S2Bc1t1ni/UmOtMXJq1jLPv2KN4=; b=zCNZiCvfYCM8UR7Y6J7yF8bSwllWPMp+yitEeFBd98+5s871bIzFe/eWgHFjUzUHrg 6GJSwm7qaZFxv1IxYesqixbvve2FNEFICmwnf5mMvZwb61b58HOz28u2zOWuIOrshXUj stS5sw4ceSkcqgi4ZaCo7E7k3Tv39HS1At7vyfpiadvgltd4rqo4j+zDx9GzKQGrC7W9 wxjNoOqrWI7GMc9FDnUjBm+oLrXvEO+tYYZYN4YCDHpmqtuM9bNZ43y//KZvNq5z53Xl d/ACL6VtQuBiKjmyNA6u9FALTaaFfE7S9BO5OSkboK00kKuovn06jAm/6UPrbBuzFcea g8FA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wVlAvHi4dFYuwJ05S2Bc1t1ni/UmOtMXJq1jLPv2KN4=; b=KTKY3nUewvjf3KTeJxNYa/xqkIzuutbx4D3qwRjCgyUoDfFQTjlHxCbPnErMNyfKCN O3JneitLsrSW2QtaskhOxVMi4OXKs2Z76h68b7ka48cy8YqVRCJlSfGQIjZcq4VbpTBU 74thL4nUdbVUKtYIldUd43r1yRFJBjnmjm5qsDbULuPsjgc2AQ/86AidFrCmjfbAa78o O9v+iYO/nh5x3RhBixO9hEmMoJKXP7gGbOwyjEOC2aX2ehDBun+5AHlIixgpaebO30Kt j7Au6xyK8dQ4SW0ofkS1gHd3EeOtmGhhFl1EncIjo6Zz2UEBVQ9wYVCtz5RkNYumsGrM tJbQ== X-Gm-Message-State: ALyK8tKI/kAa8T2Fh0PMBOVIoyIPeNEZcBpKBlJAqrMP/5gmGG3O8sFXB3pzDSGOoNiX9w== X-Received: by 10.28.13.211 with SMTP id 202mr19891492wmn.47.1467381975480; Fri, 01 Jul 2016 07:06:15 -0700 (PDT) Received: from localhost (jirka.pirko.cz. [84.16.102.26]) by smtp.gmail.com with ESMTPSA id i6sm2940836wjk.3.2016.07.01.07.06.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 01 Jul 2016 07:06:15 -0700 (PDT) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, idosch@mellanox.com, yotamg@mellanox.com, eladr@mellanox.com, nogahf@mellanox.com, ogerlitz@mellanox.com, sfeldma@gmail.com, roopa@cumulusnetworks.com, andy@greyhouse.net, dsa@cumulusnetworks.com, tgraf@suug.ch, jhs@mojatatu.com, linville@tuxdriver.com, ivecera@redhat.com Subject: [patch net-next 42/42] mlxsw: Add the unresolved next-hops probes Date: Fri, 1 Jul 2016 16:05:10 +0200 Message-Id: <1467381910-3445-43-git-send-email-jiri@resnulli.us> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1467381910-3445-1-git-send-email-jiri@resnulli.us> References: <1467381910-3445-1-git-send-email-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Yotam Gigi Now, the driver sends arp probes for all unresolved neighbours that are currently a nexthop for some route on the system. The job is set periodically every 5 seconds. Signed-off-by: Yotam Gigi Signed-off-by: Ido Schimmel Signed-off-by: Jiri Pirko --- drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 2 ++ .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 33 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h index ff5b859..ef4ac89 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h @@ -222,6 +222,8 @@ struct mlxsw_sp_router { struct delayed_work dw; unsigned long interval; /* ms */ } neighs_update; + struct delayed_work nexthop_probe_dw; +#define MLXSW_SP_UNRESOLVED_NH_PROBE_INTERVAL 5000 /* ms */ struct list_head nexthop_group_list; struct list_head nexthop_neighs_list; }; diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 2b20279..e084ea5 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -845,6 +845,33 @@ static void mlxsw_sp_router_neighs_update_work(struct work_struct *work) mlxsw_sp_router_neighs_update_work_schedule(mlxsw_sp); } +static void mlxsw_sp_router_probe_unresolved_nexthops(struct work_struct *work) +{ + struct mlxsw_sp_neigh_entry *neigh_entry; + struct mlxsw_sp *mlxsw_sp = container_of(work, struct mlxsw_sp, + router.nexthop_probe_dw.work); + + /* Iterate over nexthop neighbours, find those who are unresolved and + * send arp on them. This solves the chicken-egg problem when + * the nexthop wouldn't get offloaded until the neighbor is resolved + * but it wouldn't get resolved ever in case traffic is flowing in HW + * using different nexthop. + * + * Take RTNL mutex here to prevent lists from changes. + */ + rtnl_lock(); + list_for_each_entry(neigh_entry, &mlxsw_sp->router.nexthop_neighs_list, + nexthop_neighs_list_node) { + if (!(neigh_entry->n->nud_state & NUD_VALID) && + !list_empty(&neigh_entry->nexthop_list)) + neigh_event_send(neigh_entry->n, NULL); + } + rtnl_unlock(); + + mlxsw_core_schedule_dw(&mlxsw_sp->router.nexthop_probe_dw, + MLXSW_SP_UNRESOLVED_NH_PROBE_INTERVAL); +} + static void mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_neigh_entry *neigh_entry, @@ -1004,10 +1031,13 @@ static int mlxsw_sp_neigh_init(struct mlxsw_sp *mlxsw_sp) if (err) goto err_register_netevent_notifier; + /* Create the delayed works for the activity_update */ INIT_DELAYED_WORK(&mlxsw_sp->router.neighs_update.dw, mlxsw_sp_router_neighs_update_work); + INIT_DELAYED_WORK(&mlxsw_sp->router.nexthop_probe_dw, + mlxsw_sp_router_probe_unresolved_nexthops); mlxsw_core_schedule_dw(&mlxsw_sp->router.neighs_update.dw, 0); - + mlxsw_core_schedule_dw(&mlxsw_sp->router.nexthop_probe_dw, 0); return 0; err_register_netevent_notifier: @@ -1018,6 +1048,7 @@ err_register_netevent_notifier: static void mlxsw_sp_neigh_fini(struct mlxsw_sp *mlxsw_sp) { cancel_delayed_work_sync(&mlxsw_sp->router.neighs_update.dw); + cancel_delayed_work_sync(&mlxsw_sp->router.nexthop_probe_dw); unregister_netevent_notifier(&mlxsw_sp_router_netevent_nb); rhashtable_destroy(&mlxsw_sp->router.neigh_ht); }