From patchwork Wed Sep 23 18:00:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Ivanov X-Patchwork-Id: 1370010 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=hemlock.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=cambridgegreys.com Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BxQvZ0f3Sz9sPB for ; Thu, 24 Sep 2020 04:00:42 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id AEDFE87385; Wed, 23 Sep 2020 18:00:32 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id OInGa1Km9J8P; Wed, 23 Sep 2020 18:00:31 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 5289D87397; Wed, 23 Sep 2020 18:00:31 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4151AC0889; Wed, 23 Sep 2020 18:00:31 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 3660CC0891 for ; Wed, 23 Sep 2020 18:00:29 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 76692272AB for ; Wed, 23 Sep 2020 18:00:28 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WOs12WdQU1iK for ; Wed, 23 Sep 2020 18:00:26 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from www.kot-begemot.co.uk (ivanoab7.miniserver.com [37.128.132.42]) by silver.osuosl.org (Postfix) with ESMTPS id AFFE9228E7 for ; Wed, 23 Sep 2020 18:00:25 +0000 (UTC) Received: from tun252.jain.kot-begemot.co.uk ([192.168.18.6] helo=jain.kot-begemot.co.uk) by www.kot-begemot.co.uk with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kL943-00025V-Ai; Wed, 23 Sep 2020 18:00:23 +0000 Received: from jain.kot-begemot.co.uk ([192.168.3.3]) by jain.kot-begemot.co.uk with esmtp (Exim 4.92) (envelope-from ) id 1kL940-0005wQ-Cn; Wed, 23 Sep 2020 19:00:22 +0100 From: anton.ivanov@cambridgegreys.com To: dev@openvswitch.org Date: Wed, 23 Sep 2020 19:00:12 +0100 Message-Id: <20200923180017.22380-2-anton.ivanov@cambridgegreys.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200923180017.22380-1-anton.ivanov@cambridgegreys.com> References: <20200923180017.22380-1-anton.ivanov@cambridgegreys.com> MIME-Version: 1.0 X-Clacks-Overhead: GNU Terry Pratchett Cc: i.maximets@ovn.org, Anton Ivanov Subject: [ovs-dev] [PATCH ovn v3 1/6] ovn-northd: reorganize processing of lflows X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Anton Ivanov 1. Merge lrouter and lswitch processing. 2. Move lrouter and lswitch lflow generation which uses the same iterator variables into common helpers 3. Set up structures to be used in parallel and sequential mode Signed-off-by: Anton Ivanov --- northd/ovn-northd.c | 199 +++++++++++++++++++++++++++----------------- 1 file changed, 123 insertions(+), 76 deletions(-) diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c index 3324c9e81..5faa6cee6 100644 --- a/northd/ovn-northd.c +++ b/northd/ovn-northd.c @@ -8874,24 +8874,7 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports, struct ds actions = DS_EMPTY_INITIALIZER; struct ovn_datapath *od; - HMAP_FOR_EACH (od, key_node, datapaths) { - build_adm_ctrl_flows_for_lrouter(od, lflows); - } - struct ovn_port *op; - HMAP_FOR_EACH (op, key_node, ports) { - build_adm_ctrl_flows_for_lrouter_port(op, lflows, &match, &actions); - } - - HMAP_FOR_EACH (od, key_node, datapaths) { - build_neigh_learning_flows_for_lrouter( - od, lflows, &match, &actions); - } - - HMAP_FOR_EACH (op, key_node, ports) { - build_neigh_learning_flows_for_lrouter_port( - op, lflows, &match, &actions); - } /* Drop IP traffic destined to router owned IPs. Part of it is dropped * in stage "lr_in_ip_input" but traffic that could have been unSNATed @@ -9935,63 +9918,6 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports, sset_destroy(&nat_entries); } - HMAP_FOR_EACH (op, key_node, ports) { - build_ND_RA_flows_for_lrouter_port(op, lflows, &match, &actions); - } - - /* Logical router ingress table ND_RA_OPTIONS & ND_RA_RESPONSE: RS - * responder, by default goto next. (priority 0). */ - HMAP_FOR_EACH (od, key_node, datapaths) { - build_ND_RA_flows_for_lrouter(od, lflows); - } - - HMAP_FOR_EACH (op, key_node, ports) { - build_ip_routing_flows_for_lrouter_port(op, lflows); - } - - /* Convert the static routes to flows. */ - HMAP_FOR_EACH (od, key_node, datapaths) { - build_static_route_flows_for_lrouter(od, lflows, ports); - } - - HMAP_FOR_EACH (od, key_node, datapaths) { - build_mcast_lookup_flows_for_lrouter(od, lflows, &match, &actions); - } - - HMAP_FOR_EACH (od, key_node, datapaths) { - build_ingress_policy_flows_for_lrouter(od, lflows, ports); - } - - /* XXX destination unreachable */ - - HMAP_FOR_EACH (od, key_node, datapaths) { - build_arp_resolve_flows_for_lrouter(od, lflows); - } - - HMAP_FOR_EACH (op, key_node, ports) { - build_arp_resolve_flows_for_lrouter_port( - op, lflows, ports, &match, &actions); - } - - HMAP_FOR_EACH (od, key_node, datapaths) { - build_check_pkt_len_flows_for_lrouter( - od, lflows, ports, &match, &actions); - } - - HMAP_FOR_EACH (od, key_node, datapaths) { - build_gateway_redirect_flows_for_lrouter( - od, lflows, &match, &actions); - } - - HMAP_FOR_EACH (od, key_node, datapaths) { - build_arp_request_flows_for_lrouter(od, lflows, &match, &actions); - } - - HMAP_FOR_EACH (op, key_node, ports) { - build_egress_delivery_flows_for_lrouter_port( - op, lflows, &match, &actions); - } - ds_destroy(&match); ds_destroy(&actions); } @@ -11389,6 +11315,128 @@ build_ipv6_input_flows_for_lrouter_port( } +struct lswitch_flow_build_info { + struct hmap *datapaths; + struct hmap *ports; + struct hmap *port_groups; + struct hmap *lflows; + struct hmap *mcgroups; + struct hmap *igmp_groups; + struct shash *meter_groups; + struct hmap *lbs; + char *svc_check_match; + struct ds match; + struct ds actions; +}; + +/* Helper function to combine all lflow generation which is iterated by + * datapath. It can be invoked with a lsi argument containing "all work" + * in single threaded mode or an lsi argument containing a "chunk of work" + * in parallel. + */ + +static void + build_converged_iterate_by_od( + struct ovn_datapath *od, struct lswitch_flow_build_info *lsi) +{ + + /* Build Logical Router Flows */ + build_adm_ctrl_flows_for_lrouter(od, lsi->lflows); + build_neigh_learning_flows_for_lrouter( + od, lsi->lflows, &lsi->match, &lsi->actions); + build_ND_RA_flows_for_lrouter(od, lsi->lflows); + build_static_route_flows_for_lrouter(od, lsi->lflows, lsi->ports); + build_mcast_lookup_flows_for_lrouter( + od, lsi->lflows, &lsi->match, &lsi->actions); + build_ingress_policy_flows_for_lrouter(od, lsi->lflows, lsi->ports); + build_arp_resolve_flows_for_lrouter(od, lsi->lflows); + build_check_pkt_len_flows_for_lrouter( + od, lsi->lflows, lsi->ports, &lsi->match, &lsi->actions); + build_gateway_redirect_flows_for_lrouter( + od, lsi->lflows, &lsi->match, &lsi->actions); + build_arp_request_flows_for_lrouter( + od, lsi->lflows, &lsi->match, &lsi->actions); +} + +/* Helper function to combine all lflow generation which is iterated by port. + * It can be invoked with a lsi argument containing "all work" in single + * threaded mode or an lsi argument containing a "chunk of work" in parallel. + */ + +static void + build_converged_iterate_by_op( + struct ovn_port *op, + struct lswitch_flow_build_info *lsi) +{ + /* Build Logical Router Flows */ + + build_adm_ctrl_flows_for_lrouter_port( + op, lsi->lflows, &lsi->match, &lsi->actions); + build_neigh_learning_flows_for_lrouter_port( + op, lsi->lflows, &lsi->match, &lsi->actions); + build_ip_routing_flows_for_lrouter_port(op, lsi->lflows); + build_ND_RA_flows_for_lrouter_port( + op, lsi->lflows, &lsi->match, &lsi->actions); + build_arp_resolve_flows_for_lrouter_port( + op, lsi->lflows, lsi->ports, &lsi->match, &lsi->actions); + build_egress_delivery_flows_for_lrouter_port( + op, lsi->lflows, &lsi->match, &lsi->actions); +} + +/* + * Combined LFLOW processing function. Intended to iterate over + * datapaths, ports, lbs and igmp_groups in single threaded mode + * or prepare and invoke a thread pool in multi-threaded mode. + * Must not contain any direct flow ops - all actual flow ops + * should be invoked out the per-iterable helper functions. + */ + +static void +build_converged_flows(struct hmap *datapaths, struct hmap *ports, + struct hmap *port_groups, struct hmap *lflows, + struct hmap *mcgroups, struct hmap *igmp_groups, + struct shash *meter_groups, + struct hmap *lbs) +{ + struct lswitch_flow_build_info lsi; + + struct ovn_datapath *od; + struct ovn_port *op; + + char *svc_check_match = xasprintf("eth.dst == %s", svc_monitor_mac); + + lsi.datapaths = datapaths; + lsi.ports = ports; + lsi.port_groups = port_groups; + lsi.lflows = lflows; + lsi.mcgroups = mcgroups; + lsi.igmp_groups = igmp_groups; + lsi.meter_groups = meter_groups; + lsi.lbs = lbs; + lsi.svc_check_match = svc_check_match; + lsi.match = (struct ds) DS_EMPTY_INITIALIZER; + lsi.actions = (struct ds) DS_EMPTY_INITIALIZER; + + /* Converged build - all lflow generation from lswitch and lrouter + * will move here and will be reogranized by iterator type. + * This allows it to be run (optionally) in parallel */ + HMAP_FOR_EACH (od, key_node, datapaths) { + build_converged_iterate_by_od(od, &lsi); + } + HMAP_FOR_EACH (op, key_node, ports) { + build_converged_iterate_by_op(op, &lsi); + } + free(svc_check_match); + + /* Legacy lswitch build */ + build_lswitch_flows(datapaths, ports, port_groups, lflows, mcgroups, + igmp_groups, meter_groups, lbs); + + /* Legacy lrouter build */ + build_lrouter_flows(datapaths, ports, lflows, meter_groups, lbs); +} + + /* Updates the Logical_Flow and Multicast_Group tables in the OVN_SB database, * constructing their contents based on the OVN_NB database. */ static void @@ -11400,9 +11448,8 @@ build_lflows(struct northd_context *ctx, struct hmap *datapaths, { struct hmap lflows = HMAP_INITIALIZER(&lflows); - build_lswitch_flows(datapaths, ports, port_groups, &lflows, mcgroups, + build_converged_flows(datapaths, ports, port_groups, &lflows, mcgroups, igmp_groups, meter_groups, lbs); - build_lrouter_flows(datapaths, ports, &lflows, meter_groups, lbs); /* Push changes to the Logical_Flow table to database. */ const struct sbrec_logical_flow *sbflow, *next_sbflow;