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 8A1CDA0C4C; Thu, 2 Sep 2021 16:48:27 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 17B5640140; Thu, 2 Sep 2021 16:48:27 +0200 (CEST) Received: from mail-il1-f179.google.com (mail-il1-f179.google.com [209.85.166.179]) by mails.dpdk.org (Postfix) with ESMTP id A0FC84003C for ; Thu, 2 Sep 2021 16:48:25 +0200 (CEST) Received: by mail-il1-f179.google.com with SMTP id u7so2059765ilk.7 for ; Thu, 02 Sep 2021 07:48:25 -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=WULSMUnTXPUrUZxETPwcvo+dX6K+BkvR6rjTDXCZp9U=; b=QwbvvuiYlhIcO1L1Bit7IBdGtSan+qaXXa/5uXz/ffXqeP2DO4fRBlhrdvew2KPX+U PEnoZkZ/TsuJVVBIcD0XtqwLrbDxNR5KVd6/F0JjsdnoP/a1XL0sccRnlPtzNMI1egLv XvosHZdDM57cv8C5YYJoxX5jqfnnqGnDNHWnlcY0UNweW8RXGZjBZdFEbmYtJMHcWawD 72ntqabyWHKE/x9n04IGXxWmK7SsBkO7gZ6VtrITxEhCKS08scURmTR4R8QIRE3Hd+sg WALIUl2h5iOLPxrOFRsiQoX09O8f++LRGb3HNjdtWTc/BgpLAS6lIa5TvHwOpf6nkL2/ ubEg== 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=WULSMUnTXPUrUZxETPwcvo+dX6K+BkvR6rjTDXCZp9U=; b=qtQOWDhyRYku7ia+BjT8LKYG9cgCS4xqlsXj3dhe45FRRGal/6SPsDhmNtI5nj8WIR hPtX4nh3gZFUTVyM8KdvpKoJcfCpg+E24gwVcux5nXcLenmsUODZBYH2e3IrMix6mb1n C4X3KHzGUANcwOY07TbGycZ3/qPZQH/4FELyVUtd5wDmV2oEPLW/84KUQ74OkjGYqERA oO3koByGZBK96MPSpmCaBFgUS1A39IWMvfLLZ7f69WhYlmPUFYsujUGuyPeMVRpDkXPR UbhUov6QDhfJMYL7r7UZnvBIPeY2jz7fynuzs9coPeuFMGuuxni24ZtVtrdT2+ZCPW6q An5w== X-Gm-Message-State: AOAM530QRUPq0qqQkOmwshMJiWH4JYdBA/8n6Gk3eTfzHrt/5fcMjKEO ryYxSH2hVGIsf/aBCrFbRuUso/fJwWOdjr737tPJ/9W17M1x9A== X-Google-Smtp-Source: ABdhPJwF5gvp1cixEhbsFTR6MmIfUO0Mz1nI9tn7XlebXtLQGAjiYfoQiJG9A9NYk9JQ4f4PL/5EM8J57K7wiTusmBw= X-Received: by 2002:a92:cb04:: with SMTP id s4mr2602838ilo.130.1630594104862; Thu, 02 Sep 2021 07:48:24 -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: Thu, 2 Sep 2021 20:17:58 +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. Good stuff. > > Signed-off-by: Ivan Malov > Reviewed-by: Andrew Rybchenko > --- > 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 All the params are in by default, I think, only [out] only needed. > + * 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) I think, we need to add @see note in rte_flow API where this is requested. > + > +/** > + * 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) Same as above > + > +/** > + * 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) Same as above > + > +/** > + * @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 See above comment. > + * > + * @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); # I would prefer to call it as rte_eth_rx_meta_negotiate as action/verb can come the last API to to have a proper namespace. # IMO, We need to update the release notes for this behavior change. # Is any of the in-tree examples or test application needs to update to adaptor this behavior change > + > #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 >