From patchwork Thu Aug 12 15:53:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Pfaff X-Patchwork-Id: 1516364 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=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Glrpz40Lmz9sX1 for ; Fri, 13 Aug 2021 01:54:35 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id ECBA24077E; Thu, 12 Aug 2021 15:54:32 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 9-2wzt8QcIES; Thu, 12 Aug 2021 15:54:29 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id 2287D40773; Thu, 12 Aug 2021 15:54:27 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2BF69C0029; Thu, 12 Aug 2021 15:54:24 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5A003C001D for ; Thu, 12 Aug 2021 15:54:22 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 67C1C4075B for ; Thu, 12 Aug 2021 15:54:21 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id OEOqBSR_DN3a for ; Thu, 12 Aug 2021 15:54:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from relay11.mail.gandi.net (relay11.mail.gandi.net [217.70.178.231]) by smtp2.osuosl.org (Postfix) with ESMTPS id E35D8402A1 for ; Thu, 12 Aug 2021 15:54:16 +0000 (UTC) Received: (Authenticated sender: blp@ovn.org) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 375C810000A; Thu, 12 Aug 2021 15:54:13 +0000 (UTC) From: Ben Pfaff To: dev@openvswitch.org Date: Thu, 12 Aug 2021 08:53:54 -0700 Message-Id: <20210812155358.3141517-4-blp@ovn.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210812155358.3141517-1-blp@ovn.org> References: <20210812155358.3141517-1-blp@ovn.org> MIME-Version: 1.0 Cc: Ben Pfaff , Ben Pfaff Subject: [ovs-dev] [PATCH 3/7] ovn-northd-ddlog: Intern Stage. 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: Ben Pfaff With the benchmark at https://mail.openvswitch.org/pipermail/ovs-dev/2021-July/385333.html, this reduces memory consumption from 72 GB to 66 GB and elapsed time by a few seconds. Signed-off-by: Ben Pfaff Signed-off-by: Ben Pfaff --- northd/ovn_northd.dl | 140 +++++++++++++++++++++---------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/northd/ovn_northd.dl b/northd/ovn_northd.dl index 2365372fb..f1b7471f2 100644 --- a/northd/ovn_northd.dl +++ b/northd/ovn_northd.dl @@ -1434,77 +1434,77 @@ nb::Out_Logical_Router_Port(._uuid = _uuid, typedef Pipeline = Ingress | Egress -typedef Stage = Stage{ +typedef Stage = Stage { pipeline : Pipeline, - table_id : integer, + table_id : bit<8>, table_name : string } /* Logical switch ingress stages. */ -function s_SWITCH_IN_PORT_SEC_L2(): Stage { Stage{Ingress, 0, "ls_in_port_sec_l2"} } -function s_SWITCH_IN_PORT_SEC_IP(): Stage { Stage{Ingress, 1, "ls_in_port_sec_ip"} } -function s_SWITCH_IN_PORT_SEC_ND(): Stage { Stage{Ingress, 2, "ls_in_port_sec_nd"} } -function s_SWITCH_IN_LOOKUP_FDB(): Stage { Stage{Ingress, 3, "ls_in_lookup_fdb"} } -function s_SWITCH_IN_PUT_FDB(): Stage { Stage{Ingress, 4, "ls_in_put_fdb"} } -function s_SWITCH_IN_PRE_ACL(): Stage { Stage{Ingress, 5, "ls_in_pre_acl"} } -function s_SWITCH_IN_PRE_LB(): Stage { Stage{Ingress, 6, "ls_in_pre_lb"} } -function s_SWITCH_IN_PRE_STATEFUL(): Stage { Stage{Ingress, 7, "ls_in_pre_stateful"} } -function s_SWITCH_IN_ACL_HINT(): Stage { Stage{Ingress, 8, "ls_in_acl_hint"} } -function s_SWITCH_IN_ACL(): Stage { Stage{Ingress, 9, "ls_in_acl"} } -function s_SWITCH_IN_QOS_MARK(): Stage { Stage{Ingress, 10, "ls_in_qos_mark"} } -function s_SWITCH_IN_QOS_METER(): Stage { Stage{Ingress, 11, "ls_in_qos_meter"} } -function s_SWITCH_IN_STATEFUL(): Stage { Stage{Ingress, 12, "ls_in_stateful"} } -function s_SWITCH_IN_PRE_HAIRPIN(): Stage { Stage{Ingress, 13, "ls_in_pre_hairpin"} } -function s_SWITCH_IN_NAT_HAIRPIN(): Stage { Stage{Ingress, 14, "ls_in_nat_hairpin"} } -function s_SWITCH_IN_HAIRPIN(): Stage { Stage{Ingress, 15, "ls_in_hairpin"} } -function s_SWITCH_IN_ARP_ND_RSP(): Stage { Stage{Ingress, 16, "ls_in_arp_rsp"} } -function s_SWITCH_IN_DHCP_OPTIONS(): Stage { Stage{Ingress, 17, "ls_in_dhcp_options"} } -function s_SWITCH_IN_DHCP_RESPONSE(): Stage { Stage{Ingress, 18, "ls_in_dhcp_response"} } -function s_SWITCH_IN_DNS_LOOKUP(): Stage { Stage{Ingress, 19, "ls_in_dns_lookup"} } -function s_SWITCH_IN_DNS_RESPONSE(): Stage { Stage{Ingress, 20, "ls_in_dns_response"} } -function s_SWITCH_IN_EXTERNAL_PORT(): Stage { Stage{Ingress, 21, "ls_in_external_port"} } -function s_SWITCH_IN_L2_LKUP(): Stage { Stage{Ingress, 22, "ls_in_l2_lkup"} } -function s_SWITCH_IN_L2_UNKNOWN(): Stage { Stage{Ingress, 23, "ls_in_l2_unknown"} } +function s_SWITCH_IN_PORT_SEC_L2(): Intern { Stage{Ingress, 0, "ls_in_port_sec_l2"}.intern() } +function s_SWITCH_IN_PORT_SEC_IP(): Intern { Stage{Ingress, 1, "ls_in_port_sec_ip"}.intern() } +function s_SWITCH_IN_PORT_SEC_ND(): Intern { Stage{Ingress, 2, "ls_in_port_sec_nd"}.intern() } +function s_SWITCH_IN_LOOKUP_FDB(): Intern { Stage{Ingress, 3, "ls_in_lookup_fdb"}.intern() } +function s_SWITCH_IN_PUT_FDB(): Intern { Stage{Ingress, 4, "ls_in_put_fdb"}.intern() } +function s_SWITCH_IN_PRE_ACL(): Intern { Stage{Ingress, 5, "ls_in_pre_acl"}.intern() } +function s_SWITCH_IN_PRE_LB(): Intern { Stage{Ingress, 6, "ls_in_pre_lb"}.intern() } +function s_SWITCH_IN_PRE_STATEFUL(): Intern { Stage{Ingress, 7, "ls_in_pre_stateful"}.intern() } +function s_SWITCH_IN_ACL_HINT(): Intern { Stage{Ingress, 8, "ls_in_acl_hint"}.intern() } +function s_SWITCH_IN_ACL(): Intern { Stage{Ingress, 9, "ls_in_acl"}.intern() } +function s_SWITCH_IN_QOS_MARK(): Intern { Stage{Ingress, 10, "ls_in_qos_mark"}.intern() } +function s_SWITCH_IN_QOS_METER(): Intern { Stage{Ingress, 11, "ls_in_qos_meter"}.intern() } +function s_SWITCH_IN_STATEFUL(): Intern { Stage{Ingress, 12, "ls_in_stateful"}.intern() } +function s_SWITCH_IN_PRE_HAIRPIN(): Intern { Stage{Ingress, 13, "ls_in_pre_hairpin"}.intern() } +function s_SWITCH_IN_NAT_HAIRPIN(): Intern { Stage{Ingress, 14, "ls_in_nat_hairpin"}.intern() } +function s_SWITCH_IN_HAIRPIN(): Intern { Stage{Ingress, 15, "ls_in_hairpin"}.intern() } +function s_SWITCH_IN_ARP_ND_RSP(): Intern { Stage{Ingress, 16, "ls_in_arp_rsp"}.intern() } +function s_SWITCH_IN_DHCP_OPTIONS(): Intern { Stage{Ingress, 17, "ls_in_dhcp_options"}.intern() } +function s_SWITCH_IN_DHCP_RESPONSE(): Intern { Stage{Ingress, 18, "ls_in_dhcp_response"}.intern() } +function s_SWITCH_IN_DNS_LOOKUP(): Intern { Stage{Ingress, 19, "ls_in_dns_lookup"}.intern() } +function s_SWITCH_IN_DNS_RESPONSE(): Intern { Stage{Ingress, 20, "ls_in_dns_response"}.intern() } +function s_SWITCH_IN_EXTERNAL_PORT(): Intern { Stage{Ingress, 21, "ls_in_external_port"}.intern() } +function s_SWITCH_IN_L2_LKUP(): Intern { Stage{Ingress, 22, "ls_in_l2_lkup"}.intern() } +function s_SWITCH_IN_L2_UNKNOWN(): Intern { Stage{Ingress, 23, "ls_in_l2_unknown"}.intern() } /* Logical switch egress stages. */ -function s_SWITCH_OUT_PRE_LB(): Stage { Stage{ Egress, 0, "ls_out_pre_lb"} } -function s_SWITCH_OUT_PRE_ACL(): Stage { Stage{ Egress, 1, "ls_out_pre_acl"} } -function s_SWITCH_OUT_PRE_STATEFUL(): Stage { Stage{ Egress, 2, "ls_out_pre_stateful"} } -function s_SWITCH_OUT_ACL_HINT(): Stage { Stage{ Egress, 3, "ls_out_acl_hint"} } -function s_SWITCH_OUT_ACL(): Stage { Stage{ Egress, 4, "ls_out_acl"} } -function s_SWITCH_OUT_QOS_MARK(): Stage { Stage{ Egress, 5, "ls_out_qos_mark"} } -function s_SWITCH_OUT_QOS_METER(): Stage { Stage{ Egress, 6, "ls_out_qos_meter"} } -function s_SWITCH_OUT_STATEFUL(): Stage { Stage{ Egress, 7, "ls_out_stateful"} } -function s_SWITCH_OUT_PORT_SEC_IP(): Stage { Stage{ Egress, 8, "ls_out_port_sec_ip"} } -function s_SWITCH_OUT_PORT_SEC_L2(): Stage { Stage{ Egress, 9, "ls_out_port_sec_l2"} } +function s_SWITCH_OUT_PRE_LB(): Intern { Stage{ Egress, 0, "ls_out_pre_lb"}.intern() } +function s_SWITCH_OUT_PRE_ACL(): Intern { Stage{ Egress, 1, "ls_out_pre_acl"}.intern() } +function s_SWITCH_OUT_PRE_STATEFUL(): Intern { Stage{ Egress, 2, "ls_out_pre_stateful"}.intern() } +function s_SWITCH_OUT_ACL_HINT(): Intern { Stage{ Egress, 3, "ls_out_acl_hint"}.intern() } +function s_SWITCH_OUT_ACL(): Intern { Stage{ Egress, 4, "ls_out_acl"}.intern() } +function s_SWITCH_OUT_QOS_MARK(): Intern { Stage{ Egress, 5, "ls_out_qos_mark"}.intern() } +function s_SWITCH_OUT_QOS_METER(): Intern { Stage{ Egress, 6, "ls_out_qos_meter"}.intern() } +function s_SWITCH_OUT_STATEFUL(): Intern { Stage{ Egress, 7, "ls_out_stateful"}.intern() } +function s_SWITCH_OUT_PORT_SEC_IP(): Intern { Stage{ Egress, 8, "ls_out_port_sec_ip"}.intern() } +function s_SWITCH_OUT_PORT_SEC_L2(): Intern { Stage{ Egress, 9, "ls_out_port_sec_l2"}.intern() } /* Logical router ingress stages. */ -function s_ROUTER_IN_ADMISSION(): Stage { Stage{Ingress, 0, "lr_in_admission"} } -function s_ROUTER_IN_LOOKUP_NEIGHBOR(): Stage { Stage{Ingress, 1, "lr_in_lookup_neighbor"} } -function s_ROUTER_IN_LEARN_NEIGHBOR(): Stage { Stage{Ingress, 2, "lr_in_learn_neighbor"} } -function s_ROUTER_IN_IP_INPUT(): Stage { Stage{Ingress, 3, "lr_in_ip_input"} } -function s_ROUTER_IN_UNSNAT(): Stage { Stage{Ingress, 4, "lr_in_unsnat"} } -function s_ROUTER_IN_DEFRAG(): Stage { Stage{Ingress, 5, "lr_in_defrag"} } -function s_ROUTER_IN_DNAT(): Stage { Stage{Ingress, 6, "lr_in_dnat"} } -function s_ROUTER_IN_ECMP_STATEFUL(): Stage { Stage{Ingress, 7, "lr_in_ecmp_stateful"} } -function s_ROUTER_IN_ND_RA_OPTIONS(): Stage { Stage{Ingress, 8, "lr_in_nd_ra_options"} } -function s_ROUTER_IN_ND_RA_RESPONSE(): Stage { Stage{Ingress, 9, "lr_in_nd_ra_response"} } -function s_ROUTER_IN_IP_ROUTING(): Stage { Stage{Ingress, 10, "lr_in_ip_routing"} } -function s_ROUTER_IN_IP_ROUTING_ECMP(): Stage { Stage{Ingress, 11, "lr_in_ip_routing_ecmp"} } -function s_ROUTER_IN_POLICY(): Stage { Stage{Ingress, 12, "lr_in_policy"} } -function s_ROUTER_IN_POLICY_ECMP(): Stage { Stage{Ingress, 13, "lr_in_policy_ecmp"} } -function s_ROUTER_IN_ARP_RESOLVE(): Stage { Stage{Ingress, 14, "lr_in_arp_resolve"} } -function s_ROUTER_IN_CHK_PKT_LEN(): Stage { Stage{Ingress, 15, "lr_in_chk_pkt_len"} } -function s_ROUTER_IN_LARGER_PKTS(): Stage { Stage{Ingress, 16, "lr_in_larger_pkts"} } -function s_ROUTER_IN_GW_REDIRECT(): Stage { Stage{Ingress, 17, "lr_in_gw_redirect"} } -function s_ROUTER_IN_ARP_REQUEST(): Stage { Stage{Ingress, 18, "lr_in_arp_request"} } +function s_ROUTER_IN_ADMISSION(): Intern { Stage{Ingress, 0, "lr_in_admission"}.intern() } +function s_ROUTER_IN_LOOKUP_NEIGHBOR(): Intern { Stage{Ingress, 1, "lr_in_lookup_neighbor"}.intern() } +function s_ROUTER_IN_LEARN_NEIGHBOR(): Intern { Stage{Ingress, 2, "lr_in_learn_neighbor"}.intern() } +function s_ROUTER_IN_IP_INPUT(): Intern { Stage{Ingress, 3, "lr_in_ip_input"}.intern() } +function s_ROUTER_IN_UNSNAT(): Intern { Stage{Ingress, 4, "lr_in_unsnat"}.intern() } +function s_ROUTER_IN_DEFRAG(): Intern { Stage{Ingress, 5, "lr_in_defrag"}.intern() } +function s_ROUTER_IN_DNAT(): Intern { Stage{Ingress, 6, "lr_in_dnat"}.intern() } +function s_ROUTER_IN_ECMP_STATEFUL(): Intern { Stage{Ingress, 7, "lr_in_ecmp_stateful"}.intern() } +function s_ROUTER_IN_ND_RA_OPTIONS(): Intern { Stage{Ingress, 8, "lr_in_nd_ra_options"}.intern() } +function s_ROUTER_IN_ND_RA_RESPONSE(): Intern { Stage{Ingress, 9, "lr_in_nd_ra_response"}.intern() } +function s_ROUTER_IN_IP_ROUTING(): Intern { Stage{Ingress, 10, "lr_in_ip_routing"}.intern() } +function s_ROUTER_IN_IP_ROUTING_ECMP(): Intern { Stage{Ingress, 11, "lr_in_ip_routing_ecmp"}.intern() } +function s_ROUTER_IN_POLICY(): Intern { Stage{Ingress, 12, "lr_in_policy"}.intern() } +function s_ROUTER_IN_POLICY_ECMP(): Intern { Stage{Ingress, 13, "lr_in_policy_ecmp"}.intern() } +function s_ROUTER_IN_ARP_RESOLVE(): Intern { Stage{Ingress, 14, "lr_in_arp_resolve"}.intern() } +function s_ROUTER_IN_CHK_PKT_LEN(): Intern { Stage{Ingress, 15, "lr_in_chk_pkt_len"}.intern() } +function s_ROUTER_IN_LARGER_PKTS(): Intern { Stage{Ingress, 16, "lr_in_larger_pkts"}.intern() } +function s_ROUTER_IN_GW_REDIRECT(): Intern { Stage{Ingress, 17, "lr_in_gw_redirect"}.intern() } +function s_ROUTER_IN_ARP_REQUEST(): Intern { Stage{Ingress, 18, "lr_in_arp_request"}.intern() } /* Logical router egress stages. */ -function s_ROUTER_OUT_UNDNAT(): Stage { Stage{ Egress, 0, "lr_out_undnat"} } -function s_ROUTER_OUT_POST_UNDNAT(): Stage { Stage{ Egress, 1, "lr_out_post_undnat"} } -function s_ROUTER_OUT_SNAT(): Stage { Stage{ Egress, 2, "lr_out_snat"} } -function s_ROUTER_OUT_EGR_LOOP(): Stage { Stage{ Egress, 3, "lr_out_egr_loop"} } -function s_ROUTER_OUT_DELIVERY(): Stage { Stage{ Egress, 4, "lr_out_delivery"} } +function s_ROUTER_OUT_UNDNAT(): Intern { Stage{ Egress, 0, "lr_out_undnat"}.intern() } +function s_ROUTER_OUT_POST_UNDNAT(): Intern { Stage{ Egress, 1, "lr_out_post_undnat"}.intern() } +function s_ROUTER_OUT_SNAT(): Intern { Stage{ Egress, 2, "lr_out_snat"}.intern() } +function s_ROUTER_OUT_EGR_LOOP(): Intern { Stage{ Egress, 3, "lr_out_egr_loop"}.intern() } +function s_ROUTER_OUT_DELIVERY(): Intern { Stage{ Egress, 4, "lr_out_delivery"}.intern() } /* * OVS register usage: @@ -1638,7 +1638,7 @@ function mFF_N_LOG_REGS() : bit<32> = 10 relation Flow( logical_datapath: uuid, - stage: Stage, + stage: Intern, priority: integer, __match: string, actions: string, @@ -1663,7 +1663,7 @@ UseLogicalDatapathGroups[false] :- relation AggregatedFlow ( logical_datapaths: Set, - stage: Stage, + stage: Intern, priority: integer, __match: string, actions: string, @@ -1677,7 +1677,7 @@ function make_flow_tags(io_port: Option): Map { Some{s} -> [ "in_out_port" -> s ] } } -function make_flow_external_ids(stage_hint: bit<32>, stage: Stage): Map { +function make_flow_external_ids(stage_hint: bit<32>, stage: Intern): Map { if (stage_hint == 0) { ["stage-name" -> stage.table_name] } else { @@ -1717,7 +1717,7 @@ for (f in AggregatedFlow()) { .logical_datapath = Some{dp}, .logical_dp_group = None, .pipeline = pipeline, - .table_id = f.stage.table_id, + .table_id = f.stage.table_id as integer, .priority = f.priority, .controller_meter = f.controller_meter, .__match = f.__match, @@ -1731,7 +1731,7 @@ for (f in AggregatedFlow()) { .logical_datapath = None, .logical_dp_group = Some{group_uuid}, .pipeline = pipeline, - .table_id = f.stage.table_id, + .table_id = f.stage.table_id as integer, .priority = f.priority, .controller_meter = f.controller_meter, .__match = f.__match, @@ -2390,7 +2390,7 @@ function oVN_ACL_PRI_OFFSET(): integer = 1000 relation Reject( lsuuid: uuid, pipeline: Pipeline, - stage: Stage, + stage: Intern, acl: Intern, fair_meter: bool, controller_meter: Option, @@ -2398,7 +2398,7 @@ relation Reject( extra_actions: string) /* build_reject_acl_rules() */ -function next_to_stage(stage: Stage): string { +function next_to_stage(stage: Intern): string { var pipeline = match (stage.pipeline) { Ingress -> "ingress", Egress -> "egress" @@ -2663,7 +2663,7 @@ for (UseCtInvMatch[use_ct_inv_match]) { * types of ACL logical flows (e.g., allow/drop). In such cases hints * corresponding to all potential matches are set. */ -input relation AclHintStages[Stage] +input relation AclHintStages[Intern] AclHintStages[s_SWITCH_IN_ACL_HINT()]. AclHintStages[s_SWITCH_OUT_ACL_HINT()]. for (sw in &Switch(._uuid = ls_uuid)) { @@ -3125,7 +3125,7 @@ function ct_lb(backends: string, "ct_lb(" ++ args.join("; ") ++ ");" } function build_lb_vip_actions(lbvip: Intern, - stage: Stage, + stage: Intern, actions0: string): (string, bool) { var up_backends = set_empty(); for (pair in lbvip.backends) { @@ -5916,7 +5916,7 @@ for (RouterPortNetworksIPv6Addr(.port = &RouterPort{.router = router, /* NAT, Defrag and load balancing. */ -function default_allow_flow(datapath: uuid, stage: Stage): Flow { +function default_allow_flow(datapath: uuid, stage: Intern): Flow { Flow{.logical_datapath = datapath, .stage = stage, .priority = 0,