> From: Konstantin Ananyev [mailto:konstantin.anan...@huawei.com]
> Sent: Wednesday, 30 October 2024 22.23

> +.. code-block:: c
> +
> +    /*
> +     * use pointer to mbuf as soring element, while tx_state
> +     * as a metadata.
> +     * In this example we use a soring with just one stage.
> +     */
> +     union tx_state {
> +         /* negative values for error */
> +         int32_t rc;
> +         /* otherwise contain valid TX port and queue IDs*/
> +         struct {
> +             uint16_t port_id;
> +             uint16_t queue_id;
> +          } tx;

One space too much in indentation before "} tx;".

> +     };
> +     struct rte_soring *soring;
> +
> +
> +producer/consumer part:
> +
> +.. code-block:: c
> +
> +     struct rte_mbuf *pkts[MAX_PKT_BURST];
> +     union tx_state txst[MAX_PKT_BURST];
> +     ...
> +     /* enqueue - writes to soring objects array no need to update
> metadata */
> +     uint32_t num = MAX_PKT_BURST;
> +     num = rte_soring_enqueue_burst(soring, pkts, num, NULL);
> +     ....
> +     /* dequeux - reads both packets and related tx_state */
> +     uint32_t num = MAX_PKT_BURST;
> +     num = rte_soring_dequeux_burst(soring, pkts, txst, num, NULL);
> +
> +     /*
> +      * TX packets out, or drop in case of error.
> +      * Note that we don't need to dereference the soring objects
> itself
> +      * to make a decision.
> +      */
> +     uint32_t i, j, k, n;
> +     struct rte_mbuf *dr[MAX_PKT_BURST];
> +
> +     k = 0;
> +     for (i = 0; i != num; i++) {
> +         /* packet processing reports an error */
> +         if (txst[i].rc < 0)
> +             dr[k++] = pkts[i];
> +         /* valid packet, send it out */
> +         else {
> +             /* group consequitive packets with the same port and
> queue IDs */
> +             for (j = i + 1; j < num; j++)
> +                 if (txst[j].rc != txst[i].rc)
> +                     break;
> +
> +             n = rte_eth_tx_burst(txst[i].tx.port_id,
> txst[i].tx.queue_id,
> +                             pkts + i, j - i);
> +             if (i + n != j) {
> +                 /* decide with unsent packets if any */

Indentation is off in the next few lines.

> +              }
> +         }
> +      }
> +      /* drop errorneous packets */
> +      if (k != 0)
> +          rte_pktmbuf_free_bulk(dr, k);


> +++ b/lib/ring/rte_soring.c
> @@ -0,0 +1,198 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2024 Huawei Technologies Co., Ltd
> + */
> +
> +#include <inttypes.h>
> +
> +#include "soring.h"
> +#include <rte_string_fns.h>
> +
> +RTE_LOG_REGISTER_DEFAULT(soring_logtype, INFO);
> +
> +static uint32_t
> +soring_calc_elem_num(uint32_t count)
> +{
> +     return rte_align32pow2(count + 1);
> +}
> +
> +static int
> +soring_check_param(uint32_t esize, uint32_t stsize, uint32_t count,

stsize -> msize or meta_size
Throughout the code, where stsize is used.

> +     uint32_t stages)
> +{
> +     if (stages == 0) {
> +             SORING_LOG(ERR, "invalid number of stages: %u", stages);
> +             return -EINVAL;
> +     }
> +
> +     /* Check if element size is a multiple of 4B */
> +     if (esize == 0 || esize % 4 != 0) {
> +             SORING_LOG(ERR, "invalid element size: %u", esize);
> +             return -EINVAL;
> +     }
> +
> +     /* Check if ret-code size is a multiple of 4B */

ret-code -> meta

> +     if (stsize % 4 != 0) {
> +             SORING_LOG(ERR, "invalid retcode size: %u", stsize);

retcode -> meta

> +             return -EINVAL;
> +     }
> +
> +      /* count must be a power of 2 */
> +     if (rte_is_power_of_2(count) == 0 ||
> +                     (count > RTE_SORING_ELEM_MAX + 1)) {
> +             SORING_LOG(ERR, "invalid number of elements: %u", count);
> +             return -EINVAL;
> +     }
> +
> +     return 0;
> +}

For the next version with above fixes,
Acked-by: Morten Brørup <m...@smartsharesystems.com>

Reply via email to