From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4C7B3A00C3; Tue, 20 Sep 2022 01:02:42 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E38374069B; Tue, 20 Sep 2022 01:02:41 +0200 (CEST) Received: from mail-qv1-f41.google.com (mail-qv1-f41.google.com [209.85.219.41]) by mails.dpdk.org (Postfix) with ESMTP id A6EE34021D for ; Tue, 20 Sep 2022 01:02:39 +0200 (CEST) Received: by mail-qv1-f41.google.com with SMTP id d1so904942qvs.0 for ; Mon, 19 Sep 2022 16:02:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date; bh=WhgdwAYYbS1vB71yVC1dQOdX2052+EY5Om3JaGkGgBw=; b=olEj63nDh9kDdpGqYjjI50admmX7cwp8nqQCYiZ0BdVVqYItg0EHRNS38U2/ctrgkp OMyKVHUAQKuz6+1tbqjJkO/P4xFk3hX0EQ+Lqc5UsDqh7/fWaJzqw4YNuUNL4QNU+RFf uqJ15LKrkmo903c4kkkEsUqdotmzQgeBPiP0iqH969+2/wEcRkTqYDodTckHoCxuCI1s fEqaoz7ziHBaQJAkYDjqUZ+awyhheMq8YioTCrH4/Xayf/6lSdBa5OCVNg0mfatEobgu b6W1oWhcukBJ0+xX5GB0J2udS/BdQ21IXuamUsc1u1lA+GfoW4I3EdDJzQY6z4BidBiP 7bhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date; bh=WhgdwAYYbS1vB71yVC1dQOdX2052+EY5Om3JaGkGgBw=; b=SJqGLyJKMdXBuAsP1g9KpYFspjjXOL17dAZpmVYci/yMBX/hHIfzI5v593AHzOLqsq QiriJ4Vp9+V2zhu7Hk/pQRdwLo34pVHLmCc1OgGwEv+mypOCQYBpXEoVhhmUiJXKlzJq R+4GPmQqVxoPCRF6rH2DC9qUe2/zk7h/CTelJMQxQxb9eMe6+dU+upDFJIgfmeVlljeJ Y1vg04TNVQgbKmuicIr9bRcyAirOcwFc5+y/Zj54NHAqmh0mCyH1LSpiTaHy3+I9Pr+p 1F96XRfEr8lvcLj2LpJAw6lIpUQ+5Y3OI3d5OYc1ieDq4x8Otd3Mf7uIYUAjgMYMefdm MKoQ== X-Gm-Message-State: ACrzQf0yidL6Tc8EzYm6WZV7HdYOVqv3yX3ryuKbAb1aNssPg1eQIYMY 23ja8f1qJoKx4Ys4yL9OVsk= X-Google-Smtp-Source: AMsMyM5F1WxS8oVjiw7AIKxTTLuMDlF99vEX0WTPDnTe/7YTMuSL/GEp3jWqSNNcYDCXey+PV6SSZw== X-Received: by 2002:a05:6214:d6f:b0:4ac:7748:2e5c with SMTP id 15-20020a0562140d6f00b004ac77482e5cmr16518386qvs.97.1663628558900; Mon, 19 Sep 2022 16:02:38 -0700 (PDT) Received: from ?IPV6:2600:4040:225b:ea00:6063:8c9b:774a:6cf4? ([2600:4040:225b:ea00:6063:8c9b:774a:6cf4]) by smtp.googlemail.com with ESMTPSA id t24-20020a37ea18000000b006ced196a73fsm8038401qkj.135.2022.09.19.16.02.38 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 19 Sep 2022 16:02:38 -0700 (PDT) Message-ID: <4a978f38-4f38-4630-ca91-fb96a5789d6f@gmail.com> Date: Mon, 19 Sep 2022 19:02:37 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.12.0 Subject: Re: [PATCH v2 1/3] net/bonding: support Tx prepare Content-Language: en-US To: Konstantin Ananyev , Fengchengwen , Ferruh Yigit , "thomas@monjalon.net" , "andrew.rybchenko@oktetlabs.ru" , "konstantin.ananyev@intel.com" Cc: "dev@dpdk.org" , "chas3@att.com" , "humin (Q)" References: <1619171202-28486-2-git-send-email-tangchengchang@huawei.com> <20220725040842.35027-1-fengchengwen@huawei.com> <20220725040842.35027-2-fengchengwen@huawei.com> <495fb2f0-60c2-f1c9-2985-0d08bb463ad0@xilinx.com> <4b4af3e8-710a-ae75-8171-331ebfe4e4f7@huawei.com> <6c91f993-b11d-987c-6d20-38ee11f9f9db@gmail.com> <509a1984-841a-e42c-05c1-707b024ef7a8@huawei.com> <863016bd-a20b-8a9f-8edc-cfddc0593546@gmail.com> From: Chas Williams <3chas3@gmail.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On 9/19/22 10:07, Konstantin Ananyev wrote: > >> >> On 9/16/22 22:35, fengchengwen wrote: >>> Hi Chas, >>> >>> On 2022/9/15 0:59, Chas Williams wrote: >>>> On 9/13/22 20:46, fengchengwen wrote: >>>>> >>>>> The main problem is hard to design a tx_prepare for bonding device: >>>>> 1. as Chas Williams said, there maybe twice hash calc to get target slave >>>>>     devices. >>>>> 2. also more important, if the slave devices have changes(e.g. slave device >>>>>     link down or remove), and if the changes happens between bond-tx-prepare and >>>>>     bond-tx-burst, the output slave will changes, and this may lead to checksum >>>>>     failed. (Note: a bond device with slave devices may from different vendors, >>>>>     and slave devices may have different requirements, e.g. slave-A support calc >>>>>     IPv4 pseudo-head automatic (no need driver pre-calc), but slave-B need driver >>>>>     pre-calc). >>>>> >>>>> Current design cover the above two scenarios by using in-place tx-prepare. and >>>>> in addition, bond devices are not transparent to applications, I think it's a >>>>> practical method to provide tx-prepare support in this way. >>>>> >>>> >>>> >>>> I don't think you need to export an enable/disable routine for the use of >>>> rte_eth_tx_prepare. It's safe to just call that routine, even if it isn't >>>> implemented. You are just trading one branch in DPDK librte_eth_dev for a >>>> branch in drivers/net/bonding. >>> >>> Our first patch was just like yours (just add tx-prepare default), but community >>> is concerned about impacting performance. >>> >>> As a trade-off, I think we can add the enable/disable API. >> >> IMHO, that's a bad idea. If the rte_eth_dev_tx_prepare API affects >> performance adversly, that is not a bonding problem. All applications >> should be calling rte_eth_dev_tx_prepare. There's no defined API >> to determine if rte_eth_dev_tx_prepare should be called. Therefore, >> applications should always call rte_eth_dev_tx_prepare. Regardless, >> as I previously mentioned, you are just trading the location of >> the branch, especially in the bonding case. >> >> If rte_eth_dev_tx_prepare is causing a performance drop, then that API >> should be improved or rewritten. There are PMD that require you to use >> that API. Locally, we had maintained a patch to eliminate the use of >> rte_eth_dev_tx_prepare. However, that has been getting harder and harder >> to maintain. The performance lost by just calling rte_eth_dev_tx_prepare >> was marginal. >> >>> >>>> >>>> I think you missed fixing tx_machine in 802.3ad support. We have been using >>>> the following patch locally which I never got around to submitting. >>> >>> You are right, I will send V3 fix it. >>> >>>> >>>> >>>> From a458654d68ff5144266807ef136ac3dd2adfcd98 Mon Sep 17 00:00:00 2001 >>>> From: "Charles (Chas) Williams" >>>> Date: Tue, 3 May 2022 16:52:37 -0400 >>>> Subject: [PATCH] net/bonding: call rte_eth_tx_prepare before rte_eth_tx_burst >>>> >>>> Some PMDs might require a call to rte_eth_tx_prepare before sending the >>>> packets for transmission. Typically, the prepare step handles the VLAN >>>> headers, but it may need to do other things. >>>> >>>> Signed-off-by: Chas Williams >>> >>> ... >>> >>>>               * ring if transmission fails so the packet isn't lost. >>>> @@ -1322,8 +1350,12 @@ bond_ethdev_tx_burst_broadcast(void *queue, struct rte_mbuf **bufs, >>>> >>>>      /* Transmit burst on each active slave */ >>>>      for (i = 0; i < num_of_slaves; i++) { >>>> -        slave_tx_total[i] = rte_eth_tx_burst(slaves[i], bd_tx_q->queue_id, >>>> +        uint16_t nb_prep; >>>> + >>>> +        nb_prep = rte_eth_tx_prepare(slaves[i], bd_tx_q->queue_id, >>>>                      bufs, nb_pkts); >>>> +        slave_tx_total[i] = rte_eth_tx_burst(slaves[i], bd_tx_q->queue_id, >>>> +                    bufs, nb_prep); >>> >>> The tx-prepare may edit packet data, and the broadcast mode will send a packet to all slaves, >>> the packet data is sent and edited at the same time. Is this likely to cause problems ? >> >> This routine is already broken. You can't just increment the refcount >> and send the packet into a PMD's transmit routine. Nothing guarantees >> that a transmit routine will not modify the packet. Many PMDs perform an >> rte_vlan_insert. > > Hmm interesting.... > My uderstanding was quite opposite - tx_burst() can't modify packet data and metadata > (except when refcnt==1 and tx_burst() going to free the mbuf and put it back to the mempool). > While tx_prepare() can - actually as I remember that was one of the reasons why a separate routine > was introduced. Is that documented anywhere? It's been my experience that the device PMD can do practically anything and you need to protect yourself. Currently, the af_packet, dpaa2, and vhost driver call rte_vlan_insert. Before 2019, the virtio driver also used to call rte_vlan_insert during its transmit path. Of course, rte_vlan_insert modifies the packet data and the mbuf header. Regardless, it looks like rte_eth_dev_tx_prepare should always be called. Handling that correctly in broadcast mode probably means always make a deep copy of the packet, or check to see if all the members are the same PMD type. If so, you can just call prepare once. You could track the mismatched nature during additional/removal of the members. Or just assume people aren't going to mismatch bonding members. >> You should at least perform a clone of the packet so >> that the mbuf headers aren't mangled by each PMD. Just to be safe you >> should perform a partial deep copy of the packet headers in case some >> PMD does an rte_vlan_insert and the other PMDs in the bonding group do >> not need an rte_vlan_insert. >> >> So doing a blind rte_eth_dev_tx_preprare isn't making anything much >> worse. >> >>> >>>> >>>>          if (unlikely(slave_tx_total[i] < nb_pkts)) >>>>              tx_failed_flag = 1;