patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Jerin Jacob <jerinjacobk@gmail.com>
To: Timothy McDaniel <timothy.mcdaniel@intel.com>
Cc: Jerin Jacob <jerinj@marvell.com>, dpdk-dev <dev@dpdk.org>,
	dpdk stable <stable@dpdk.org>
Subject: Re: [PATCH] event/dlb2: improve enqueue efficiency
Date: Thu, 9 Jun 2022 22:06:26 +0530	[thread overview]
Message-ID: <CALBAE1Pb8qPfX9ATYKOwhxx_n6hSf-SCQUGPc8Oha00jx423hQ@mail.gmail.com> (raw)
In-Reply-To: <20220606152840.733080-1-timothy.mcdaniel@intel.com>

On Mon, Jun 6, 2022 at 9:15 PM Timothy McDaniel
<timothy.mcdaniel@intel.com> wrote:
>
> Validate credit configuration.

Remove the above line on applying.

Applied to dpdk-next-net-eventdev/for-main. Thanks


>
> If user tried to send 64 events, it will take 64 credits. Enqueue API
> only gets 32 credits each time. If it does not have sufficient credits,
> it just fails and returns. Enqueue API does not retry. On next enqueue,
> it will get 32 more and send will work. This results in alternate
> enqueues failing.
>
> Add check to make sure DLB2_MAX_ENQUEUE_DEPTH <=
> both DLB2_SW_CREDIT_QUANTA_DEFAULT and DLB2_SW_CREDIT_BATCH_SZ.
>
> Add enough retires in the driver to satisfy max enqueue depth credits
> based on set quanta. Note the credit quanta size is different for each
> port. Retry count = Max enqueue depth / credit quanta in driver before
> returning no credit.
>
> Fixes: 3a6d0c04e7fb ("event/dlb2: add port setup")
> Cc: stable@dpdk.org
>
> Signed-off-by: Timothy McDaniel <timothy.mcdaniel@intel.com>
> ---
>  drivers/event/dlb2/dlb2.c      | 78 +++++++++++++++++++++++++---------
>  drivers/event/dlb2/dlb2_priv.h |  3 +-
>  2 files changed, 60 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/event/dlb2/dlb2.c b/drivers/event/dlb2/dlb2.c
> index 36f07d0061..3641ed2942 100644
> --- a/drivers/event/dlb2/dlb2.c
> +++ b/drivers/event/dlb2/dlb2.c
> @@ -387,6 +387,11 @@ set_sw_credit_quanta(const char *key __rte_unused,
>         if (ret < 0)
>                 return ret;
>
> +       if (*sw_credit_quanta <= 0) {
> +               DLB2_LOG_ERR("sw_credit_quanta must be > 0\n");
> +               return -EINVAL;
> +       }
> +
>         return 0;
>  }
>
> @@ -1773,9 +1778,48 @@ dlb2_eventdev_port_setup(struct rte_eventdev *dev,
>                 return -EINVAL;
>         }
>
> +       /* Default for worker ports */
> +       sw_credit_quanta = dlb2->sw_credit_quanta;
> +       hw_credit_quanta = dlb2->hw_credit_quanta;
> +
>         ev_port->qm_port.is_directed = port_conf->event_port_cfg &
>                 RTE_EVENT_PORT_CFG_SINGLE_LINK;
>
> +       /*
> +        * Validate credit config before creating port
> +        */
> +
> +       /* Default for worker ports */
> +       sw_credit_quanta = dlb2->sw_credit_quanta;
> +       hw_credit_quanta = dlb2->hw_credit_quanta;
> +
> +       if (port_conf->event_port_cfg & RTE_EVENT_PORT_CFG_HINT_PRODUCER) {
> +               /* Producer type ports. Mostly enqueue */
> +               sw_credit_quanta = DLB2_SW_CREDIT_P_QUANTA_DEFAULT;
> +               hw_credit_quanta = DLB2_SW_CREDIT_P_BATCH_SZ;
> +       }
> +       if (port_conf->event_port_cfg & RTE_EVENT_PORT_CFG_HINT_CONSUMER) {
> +               /* Consumer type ports. Mostly dequeue */
> +               sw_credit_quanta = DLB2_SW_CREDIT_C_QUANTA_DEFAULT;
> +               hw_credit_quanta = DLB2_SW_CREDIT_C_BATCH_SZ;
> +       }
> +       ev_port->credit_update_quanta = sw_credit_quanta;
> +       ev_port->qm_port.hw_credit_quanta = hw_credit_quanta;
> +
> +       if (port_conf->enqueue_depth > sw_credit_quanta ||
> +           port_conf->enqueue_depth > hw_credit_quanta) {
> +               DLB2_LOG_ERR("Invalid port config. Enqueue depth %d must be <= credit quanta %d and batch size %d\n",
> +                            port_conf->enqueue_depth,
> +                            sw_credit_quanta,
> +                            hw_credit_quanta);
> +               return -EINVAL;
> +       }
> +       ev_port->enq_retries = port_conf->enqueue_depth / sw_credit_quanta;
> +
> +       /*
> +        * Create port
> +        */
> +
>         if (!ev_port->qm_port.is_directed) {
>                 ret = dlb2_hw_create_ldb_port(dlb2,
>                                               ev_port,
> @@ -1811,23 +1855,6 @@ dlb2_eventdev_port_setup(struct rte_eventdev *dev,
>         ev_port->inflight_credits = 0;
>         ev_port->dlb2 = dlb2; /* reverse link */
>
> -       /* Default for worker ports */
> -       sw_credit_quanta = dlb2->sw_credit_quanta;
> -       hw_credit_quanta = dlb2->hw_credit_quanta;
> -
> -       if (port_conf->event_port_cfg & RTE_EVENT_PORT_CFG_HINT_PRODUCER) {
> -               /* Producer type ports. Mostly enqueue */
> -               sw_credit_quanta = DLB2_SW_CREDIT_P_QUANTA_DEFAULT;
> -               hw_credit_quanta = DLB2_SW_CREDIT_P_BATCH_SZ;
> -       }
> -       if (port_conf->event_port_cfg & RTE_EVENT_PORT_CFG_HINT_CONSUMER) {
> -               /* Consumer type ports. Mostly dequeue */
> -               sw_credit_quanta = DLB2_SW_CREDIT_C_QUANTA_DEFAULT;
> -               hw_credit_quanta = DLB2_SW_CREDIT_C_BATCH_SZ;
> -       }
> -       ev_port->credit_update_quanta = sw_credit_quanta;
> -       ev_port->qm_port.hw_credit_quanta = hw_credit_quanta;
> -
>         /* Tear down pre-existing port->queue links */
>         if (dlb2->run_state == DLB2_RUN_STATE_STOPPED)
>                 dlb2_port_link_teardown(dlb2, &dlb2->ev_ports[ev_port_id]);
> @@ -2970,6 +2997,7 @@ __dlb2_event_enqueue_burst(void *event_port,
>         struct dlb2_eventdev_port *ev_port = event_port;
>         struct dlb2_port *qm_port = &ev_port->qm_port;
>         struct process_local_port_data *port_data;
> +       int retries = ev_port->enq_retries;
>         int i;
>
>         RTE_ASSERT(ev_port->enq_configured);
> @@ -2993,6 +3021,7 @@ __dlb2_event_enqueue_burst(void *event_port,
>                 for (; j < DLB2_NUM_QES_PER_CACHE_LINE && (i + j) < num; j++) {
>                         const struct rte_event *ev = &events[i + j];
>                         int16_t thresh = qm_port->token_pop_thresh;
> +                       int ret;
>
>                         if (use_delayed &&
>                             qm_port->token_pop_mode == DELAYED_POP &&
> @@ -3014,9 +3043,18 @@ __dlb2_event_enqueue_burst(void *event_port,
>                                 break;
>                         }
>
> -                       if (dlb2_event_enqueue_prep(ev_port, qm_port, ev,
> -                                                   &sched_types[j],
> -                                                   &queue_ids[j]))
> +                       /*
> +                        * Retry if insufficient credits
> +                        */
> +                       do {
> +                               ret = dlb2_event_enqueue_prep(ev_port,
> +                                                             qm_port,
> +                                                             ev,
> +                                                             &sched_types[j],
> +                                                             &queue_ids[j]);
> +                       } while ((ret == -ENOSPC) && (retries-- > 0));
> +
> +                       if (ret != 0)
>                                 break;
>                 }
>
> diff --git a/drivers/event/dlb2/dlb2_priv.h b/drivers/event/dlb2/dlb2_priv.h
> index 3e47e4776b..4a06d649ab 100644
> --- a/drivers/event/dlb2/dlb2_priv.h
> +++ b/drivers/event/dlb2/dlb2_priv.h
> @@ -114,7 +114,7 @@
>
>  #define DLB2_NUM_QES_PER_CACHE_LINE 4
>
> -#define DLB2_MAX_ENQUEUE_DEPTH 64
> +#define DLB2_MAX_ENQUEUE_DEPTH 32
>  #define DLB2_MIN_ENQUEUE_DEPTH 4
>
>  #define DLB2_NAME_SIZE 64
> @@ -519,6 +519,7 @@ struct dlb2_eventdev_port {
>          */
>         uint16_t outstanding_releases;
>         uint16_t inflight_max; /* app requested max inflights for this port */
> +       int enq_retries; /* Number of attempts before ret ENOSPC */
>         /* setup_done is set when the event port is setup */
>         bool setup_done;
>         /* enq_configured is set when the qm port is created */
> --
> 2.25.1
>

  reply	other threads:[~2022-06-09 16:36 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-06 15:28 Timothy McDaniel
2022-06-09 16:36 ` Jerin Jacob [this message]
  -- strict thread matches above, loose matches on Subject: below --
2022-06-06 15:29 Timothy McDaniel
2022-06-06 15:19 Timothy McDaniel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CALBAE1Pb8qPfX9ATYKOwhxx_n6hSf-SCQUGPc8Oha00jx423hQ@mail.gmail.com \
    --to=jerinjacobk@gmail.com \
    --cc=dev@dpdk.org \
    --cc=jerinj@marvell.com \
    --cc=stable@dpdk.org \
    --cc=timothy.mcdaniel@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).