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 7BDA1A0C53; Fri, 3 Sep 2021 11:34:45 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EC81E40DF7; Fri, 3 Sep 2021 11:34:44 +0200 (CEST) Received: from mail-io1-f52.google.com (mail-io1-f52.google.com [209.85.166.52]) by mails.dpdk.org (Postfix) with ESMTP id D48B440DF4 for ; Fri, 3 Sep 2021 11:34:42 +0200 (CEST) Received: by mail-io1-f52.google.com with SMTP id e186so5970913iof.12 for ; Fri, 03 Sep 2021 02:34:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=NzMFE1sRVS6jQcVpE/aSAooINybr/KF2W1I6LwP11f8=; b=VE347TO5hpUHxGkWM7chpOETquHwyOeQE+AR70VNoajUQoJf7V1sLT801S5ToGutV/ SYprH7UBcfP9ZiWdmM3Q1CVnRf6RfsXTssIofIidZJ2gNqDC2Q+4L/bswrM2bMRHJnnT Q20dB0py+CF2xCej1gJ+PkI8JChu15JIQ+xaZw1G5f/PgLJ9lSDAC2VaV24HoEl72Rr/ j2lM4NYWCR1X4HdY1MiJhxZo8WthJjmwFTJMrU8mNW0Ihb8ecRIEO+HB7/LbnQYdGykh TxgFjglwEk492HGnJFNDclyUhWtPY2DiUBv/yixVZwDZ1s0I9JXQsr6gI7uj41+4Xmjd lCiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=NzMFE1sRVS6jQcVpE/aSAooINybr/KF2W1I6LwP11f8=; b=AIsCew2NptI/lPZzU6eEfM2FPnUHCcSfS/vrmNVg1BF400dER7/i2mCvl/Od45NBVx R3XzKA4BvXduEd250EUHJk6ehJzy58NjlS8iVMYulCamCboMFdWGgQmIkIa5FXLxYr5g jaCMdOtWwi4nAEwTngNAQS+dZ3LLwVjpxX2f8UcQwCV70k57TX4Up7wXbB0URDKISW2z 6pMfduP9O4r5bsNQ520oHJLdXbY7INIhTcJFxHG4MgiDTPU3q/j09j7JpmbsAHkOGcGa fHqFPZFzozN0i+hHaaa0Qa1ICir7Z+EzHGFHhVA1EkJjHLstrneQEbxyVsYrdJxkAcQu /JSQ== X-Gm-Message-State: AOAM5311azAxrN+jnVtEIvRCP2bUPhe0GTQpdZQZahG8ETpb8Isb2K7Y HbN7EbEFG0YEssnVpyLjzyo0lCDwbnmL+gK0L/ltmtVtBRYg1w== X-Google-Smtp-Source: ABdhPJxhyq2YEKHi7C1nHonWhb08/SUM7mTLyGTKpTE7mEDDZE//pAW2Kp+GMfTCV2mDZV4x0JJ8yU4lOQRHVPO6eoE= X-Received: by 2002:a05:6638:3898:: with SMTP id b24mr1903750jav.126.1630661681938; Fri, 03 Sep 2021 02:34:41 -0700 (PDT) MIME-Version: 1.0 References: <20210902142359.28138-1-ivan.malov@oktetlabs.ru> <20210902142359.28138-2-ivan.malov@oktetlabs.ru> In-Reply-To: <20210902142359.28138-2-ivan.malov@oktetlabs.ru> From: Jerin Jacob Date: Fri, 3 Sep 2021 15:04:15 +0530 Message-ID: To: Ivan Malov Cc: dpdk-dev , Andrew Rybchenko , Thomas Monjalon , Ferruh Yigit , Ray Kinsella Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH 1/5] ethdev: add API to negotiate support for Rx meta information 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 Sender: "dev" On Thu, Sep 2, 2021 at 7:54 PM Ivan Malov wrote: > > Per-packet meta information (flag, mark and the likes) might > be expensive to deliver in terms of small packet performance. > If the features are not enabled by default, enabling them at > short notice (for example, when a flow rule with action MARK > gets created) without traffic disruption may not be possible. > > Letting applications request delivery of Rx meta information > during initialisation can solve the said problem efficiently. > > Technically, that could be accomplished by defining new bits > in DEV_RX_OFFLOAD namespace, but the ability to extract meta > data cannot be considered an offload on its own. For example, > Rx checksumming is an offload, while mark delivery is not as > it needs an external party, a flow rule with action MARK, to > hold the value and trigger mark insertion in the first place. > > With this in mind, add a means to let applications negotiate > adapter support for the very delivery of Rx meta information. > > Signed-off-by: Ivan Malov > Reviewed-by: Andrew Rybchenko Acked-by: Jerin Jacob > --- > lib/ethdev/ethdev_driver.h | 19 +++++++++++ > lib/ethdev/rte_ethdev.c | 25 +++++++++++++++ > lib/ethdev/rte_ethdev.h | 66 ++++++++++++++++++++++++++++++++++++++ > lib/ethdev/version.map | 3 ++ > 4 files changed, 113 insertions(+) > > diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > index 40e474aa7e..3e29555fc7 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -789,6 +789,22 @@ typedef int (*eth_get_monitor_addr_t)(void *rxq, > typedef int (*eth_representor_info_get_t)(struct rte_eth_dev *dev, > struct rte_eth_representor_info *info); > > +/** > + * @internal > + * Negotiate support for specific fractions of Rx meta information. > + * > + * @param[in] dev > + * Port (ethdev) handle > + * > + * @param[inout] features > + * Feature selection buffer > + * > + * @return > + * Negative errno value on error, zero otherwise > + */ > +typedef int (*eth_negotiate_rx_meta_t)(struct rte_eth_dev *dev, > + uint64_t *features); > + > /** > * @internal A structure containing the functions exported by an Ethernet driver. > */ > @@ -949,6 +965,9 @@ struct eth_dev_ops { > > eth_representor_info_get_t representor_info_get; > /**< Get representor info. */ > + > + eth_negotiate_rx_meta_t negotiate_rx_meta; > + /**< Negotiate support for specific fractions of Rx meta information. */ > }; > > /** > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index 9d95cd11e1..821450cbf9 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -6311,6 +6311,31 @@ rte_eth_representor_info_get(uint16_t port_id, > return eth_err(port_id, (*dev->dev_ops->representor_info_get)(dev, info)); > } > > +int > +rte_eth_negotiate_rx_meta(uint16_t port_id, uint64_t *features) > +{ > + struct rte_eth_dev *dev; > + > + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > + dev = &rte_eth_devices[port_id]; > + > + if (dev->data->dev_configured != 0) { > + RTE_ETHDEV_LOG(ERR, > + "The port (id=%"PRIu16") is already configured\n", > + port_id); > + return -EBUSY; > + } > + > + if (features == NULL) { > + RTE_ETHDEV_LOG(ERR, "Invalid features (NULL)\n"); > + return -EINVAL; > + } > + > + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->negotiate_rx_meta, -ENOTSUP); > + return eth_err(port_id, > + (*dev->dev_ops->negotiate_rx_meta)(dev, features)); > +} > + > RTE_LOG_REGISTER_DEFAULT(rte_eth_dev_logtype, INFO); > > RTE_INIT(ethdev_init_telemetry) > diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h > index d2b27c351f..ac4d164aa8 100644 > --- a/lib/ethdev/rte_ethdev.h > +++ b/lib/ethdev/rte_ethdev.h > @@ -4888,6 +4888,72 @@ __rte_experimental > int rte_eth_representor_info_get(uint16_t port_id, > struct rte_eth_representor_info *info); > > +/** > + * The ethdev will be able to detect flagged packets provided that > + * there are active flow rules comprising the corresponding action. > + */ > +#define RTE_ETH_RX_META_USER_FLAG (UINT64_C(1) << 0) > + > +/** > + * The ethdev will manage to see mark IDs in packets provided that > + * there are active flow rules comprising the corresponding action. > + */ > +#define RTE_ETH_RX_META_USER_MARK (UINT64_C(1) << 1) > + > +/** > + * The ethdev will be able to identify partially offloaded packets > + * and process rte_flow_get_restore_info() invocations accordingly > + * provided that there're so-called "tunnel_set" flow rules in use. > + */ > +#define RTE_ETH_RX_META_TUNNEL_ID (UINT64_C(1) << 2) > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice > + * > + * Negotiate support for specific fractions of Rx meta information. > + * > + * This function has to be invoked as early as possible, precisely, > + * before the first rte_eth_dev_configure() invocation, to let the > + * PMD make preparations which might be hard to do on later stages. > + * > + * The negotiation process is assumed to be carried out as follows: > + * > + * - the application composes a mask of preferred Rx meta features > + * intending to enable at least some of them and invokes the API; > + * > + * - the ethdev driver reports back the optimal (from its point of > + * view) subset of the initial feature set thus agreeing to make > + * those comprising the subset simultaneously available to users; > + * > + * - should the application find the result unsatisfactory, it may > + * come up with another pick of preferred features and try again; > + * > + * - the application can pass zero to clear the negotiation result; > + * > + * - the last negotiated result takes effect upon the ethdev start. > + * > + * If the method itself is unsupported by the PMD, the application > + * may just ignore that and proceed with the rest of configuration > + * procedure intending to simply try using the features it prefers. > + * > + * @param[in] port_id > + * Port (ethdev) identifier > + * > + * @param[inout] features > + * Feature selection buffer > + * > + * @return > + * - (-EBUSY) if the port can't handle this in its current state; > + * - (-ENOTSUP) if the method itself is not supported by the PMD; > + * - (-ENODEV) if *port_id* is invalid; > + * - (-EINVAL) if *features* is NULL; > + * - (-EIO) if the device is removed; > + * - (0) on success > + */ > +__rte_experimental > +int rte_eth_negotiate_rx_meta(uint16_t port_id, uint64_t *features); > + > #include > > /** > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map > index 3eece75b72..e390e5718c 100644 > --- a/lib/ethdev/version.map > +++ b/lib/ethdev/version.map > @@ -249,6 +249,9 @@ EXPERIMENTAL { > rte_mtr_meter_policy_delete; > rte_mtr_meter_policy_update; > rte_mtr_meter_policy_validate; > + > + # added in 21.11 > + rte_eth_negotiate_rx_meta; > }; > > INTERNAL { > -- > 2.20.1 >