From patchwork Mon Jul 2 09:07:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roi Dayan X-Patchwork-Id: 937757 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=mellanox.com Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41K1wG6YxXz9s1b for ; Mon, 2 Jul 2018 19:21:34 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 5663BBAE; Mon, 2 Jul 2018 09:21:31 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 8F0CFB9E for ; Mon, 2 Jul 2018 09:21:30 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by smtp1.linuxfoundation.org (Postfix) with ESMTP id D6365334 for ; Mon, 2 Jul 2018 09:21:28 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from roid@mellanox.com) with ESMTPS (AES256-SHA encrypted); 2 Jul 2018 12:11:18 +0300 Received: from r-vnc11.mtr.labs.mlnx (r-vnc11.mtr.labs.mlnx [10.208.0.123]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id w6298Wq3015072; Mon, 2 Jul 2018 12:08:32 +0300 From: Roi Dayan To: Simon Horman Date: Mon, 2 Jul 2018 12:07:58 +0300 Message-Id: <1530522478-30378-1-git-send-email-roid@mellanox.com> X-Mailer: git-send-email 2.7.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: dev@openvswitch.org Subject: [ovs-dev] [PATCH] netdev-tc-offloads: Fix probing multi mask per prio X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org When adding TC rules we save the prio so can reuse same prio for same mask since different mask will have to use different prio. The multi mask per prio probe broke this by using a prio but get_prio_for_tc_flower() didn't know about it. Also multi mask per prio support changes the hash calculation. It's best the probe will add and del the ingress qdisc to have a clean start after it. Signed-off-by: Roi Dayan Acked-by: Paul Blakey --- lib/netdev-tc-offloads.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c index 86dbeeccb33b..bdf288c0622c 100644 --- a/lib/netdev-tc-offloads.c +++ b/lib/netdev-tc-offloads.c @@ -1235,11 +1235,17 @@ netdev_tc_flow_del(struct netdev *netdev OVS_UNUSED, } static void -probe_multi_mask_per_prio(int ifindex, uint32_t block_id) +probe_multi_mask_per_prio(int ifindex) { struct tc_flower flower; + int block_id = 0; int error; + error = tc_add_del_ingress_qdisc(ifindex, true, block_id); + if (error) { + return; + } + memset(&flower, 0, sizeof flower); flower.key.eth_type = htons(ETH_P_IP); @@ -1249,7 +1255,7 @@ probe_multi_mask_per_prio(int ifindex, uint32_t block_id) error = tc_replace_flower(ifindex, 1, 1, &flower, block_id); if (error) { - return; + goto out; } memset(&flower.key.src_mac, 0x11, sizeof flower.key.src_mac); @@ -1259,13 +1265,16 @@ probe_multi_mask_per_prio(int ifindex, uint32_t block_id) tc_del_filter(ifindex, 1, 1, block_id); if (error) { - return; + goto out; } tc_del_filter(ifindex, 1, 2, block_id); multi_mask_per_prio = true; VLOG_INFO("probe tc: multiple masks on single tc prio is supported."); + +out: + tc_add_del_ingress_qdisc(ifindex, false, block_id); } static void @@ -1306,6 +1315,11 @@ netdev_tc_init_flow_api(struct netdev *netdev) ovsthread_once_done(&block_once); } + if (ovsthread_once_start(&multi_mask_once)) { + probe_multi_mask_per_prio(ifindex); + ovsthread_once_done(&multi_mask_once); + } + block_id = get_block_id_from_netdev(netdev); error = tc_add_del_ingress_qdisc(ifindex, true, block_id); @@ -1317,10 +1331,5 @@ netdev_tc_init_flow_api(struct netdev *netdev) VLOG_INFO("added ingress qdisc to %s", netdev_get_name(netdev)); - if (ovsthread_once_start(&multi_mask_once)) { - probe_multi_mask_per_prio(ifindex, block_id); - ovsthread_once_done(&multi_mask_once); - } - return 0; }