DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Michał Krawczyk" <mk@semihalf.com>
To: Andrew Rybchenko <arybchenko@solarflare.com>
Cc: dev@dpdk.org, Marcin Wojtas <mw@semihalf.com>,
	Maciej Bielski <mba@semihalf.com>,
	 "Tzalik, Guy" <gtzalik@amazon.com>,
	"Schmeilin, Evgeny" <evgenys@amazon.com>,
	 "Chauskin, Igor" <igorch@amazon.com>
Subject: Re: [dpdk-dev] [PATCH 26/29] net/ena: reuse 0 length Rx descriptor
Date: Tue, 31 Mar 2020 11:45:03 +0200	[thread overview]
Message-ID: <CAJMMOfPZn=-XG6ODatH7OSDq9wdWX7Ab2tcKog3Sk9VMX7=8ig@mail.gmail.com> (raw)
In-Reply-To: <ce07cd6a-ca2f-71ad-68a1-ecc6fc2a87f2@solarflare.com>

pt., 27 mar 2020 o 12:30 Andrew Rybchenko <arybchenko@solarflare.com>
napisał(a):
>
> On 3/27/20 1:18 PM, Michal Krawczyk wrote:
> > Some ENA devices can pass to the driver descriptor with length 0. To
> > avoid extra allocation, the descriptor can be reused by simply putting
> > it back to the device.
> >
> > Signed-off-by: Michal Krawczyk <mk@semihalf.com>
> > Reviewed-by: Igor Chauskin <igorch@amazon.com>
> > Reviewed-by: Guy Tzalik <gtzalik@amazon.com>
> > ---
> >  drivers/net/ena/ena_ethdev.c | 74 ++++++++++++++++++++++++++++--------
> >  1 file changed, 59 insertions(+), 15 deletions(-)
> >
> > diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
> > index 54bd2760e5..9b95772e9e 100644
> > --- a/drivers/net/ena/ena_ethdev.c
> > +++ b/drivers/net/ena/ena_ethdev.c
> > @@ -191,6 +191,8 @@ static struct rte_mbuf *ena_rx_mbuf(struct ena_ring
*rx_ring,
> >                                   uint8_t offset);
> >  static uint16_t eth_ena_recv_pkts(void *rx_queue,
> >                                 struct rte_mbuf **rx_pkts, uint16_t
nb_pkts);
> > +static int ena_add_single_rx_desc(struct ena_com_io_sq *io_sq,
> > +                               struct rte_mbuf *mbuf, uint16_t id);
> >  static int ena_populate_rx_queue(struct ena_ring *rxq, unsigned int
count);
> >  static void ena_init_rings(struct ena_adapter *adapter,
> >                          bool disable_meta_caching);
> > @@ -1403,6 +1405,24 @@ static int ena_rx_queue_setup(struct rte_eth_dev
*dev,
> >       return 0;
> >  }
> >
> > +static int ena_add_single_rx_desc(struct ena_com_io_sq *io_sq,
> > +                               struct rte_mbuf *mbuf, uint16_t id)
> > +{
> > +     struct ena_com_buf ebuf;
> > +     int rc;
> > +
> > +     /* prepare physical address for DMA transaction */
> > +     ebuf.paddr = mbuf->buf_iova + RTE_PKTMBUF_HEADROOM;
> > +     ebuf.len = mbuf->buf_len - RTE_PKTMBUF_HEADROOM;
> > +
> > +     /* pass resource to device */
> > +     rc = ena_com_add_single_rx_desc(io_sq, &ebuf, id);
> > +     if (unlikely(rc))
>
> DPDK style says to compare to 0 [1] and [2].
>
> [1] https://doc.dpdk.org/guides/contributing
> /coding_style.html#function-calls
> [2]
https://doc.dpdk.org/guides/contributing/coding_style.html#null-pointer
>

I will fix that. I can see that the whole driver is using invalid style for
checking rc. However, I'll fix the style of the conditional checks that are
touched by this patch and fix the rest of them in the future, in the
separate patch.

> > +             PMD_DRV_LOG(WARNING, "failed adding rx desc\n");
> > +
> > +     return rc;
> > +}
> > +
> >  static int ena_populate_rx_queue(struct ena_ring *rxq, unsigned int
count)
> >  {
> >       unsigned int i;
> > @@ -1430,7 +1450,6 @@ static int ena_populate_rx_queue(struct ena_ring
*rxq, unsigned int count)
> >
> >       for (i = 0; i < count; i++) {
> >               struct rte_mbuf *mbuf = mbufs[i];
> > -             struct ena_com_buf ebuf;
> >               struct ena_rx_buffer *rx_info;
> >
> >               if (likely((i + 4) < count))
> > @@ -1443,16 +1462,10 @@ static int ena_populate_rx_queue(struct
ena_ring *rxq, unsigned int count)
> >
> >               rx_info = &rxq->rx_buffer_info[req_id];
> >
> > -             /* prepare physical address for DMA transaction */
> > -             ebuf.paddr = mbuf->buf_iova + RTE_PKTMBUF_HEADROOM;
> > -             ebuf.len = mbuf->buf_len - RTE_PKTMBUF_HEADROOM;
> > -             /* pass resource to device */
> > -             rc = ena_com_add_single_rx_desc(rxq->ena_com_io_sq,
> > -                                             &ebuf, req_id);
> > -             if (unlikely(rc)) {
> > -                     PMD_DRV_LOG(WARNING, "failed adding rx desc\n");
> > +             rc = ena_add_single_rx_desc(rxq->ena_com_io_sq, mbuf,
req_id);
> > +             if (unlikely(rc))
>
> same here
>
> >                       break;
> > -             }
> > +
> >               rx_info->mbuf = mbuf;
> >               next_to_use = ENA_IDX_NEXT_MASKED(next_to_use,
rxq->size_mask);
> >       }
> > @@ -2105,13 +2118,44 @@ static struct rte_mbuf *ena_rx_mbuf(struct
ena_ring *rx_ring,
> >               rx_info = &rx_ring->rx_buffer_info[req_id];
> >               RTE_ASSERT(rx_info->mbuf != NULL);
> >
> > -             /* Create an mbuf chain. */
> > -             mbuf->next = rx_info->mbuf;
> > -             mbuf = mbuf->next;
> > +             if (unlikely(len == 0)) {
> > +                     /*
> > +                      * Some devices can pass descriptor with the
length 0.
> > +                      * To avoid confusion, the PMD is simply putting
the
> > +                      * descriptor back, as it was never used. We'll
avoid
> > +                      * mbuf allocation that way.
> > +                      */
> > +                     int rc =
ena_add_single_rx_desc(rx_ring->ena_com_io_sq,
> > +                             rx_info->mbuf, req_id);
> > +                     if (unlikely(rc)) {
>
> same here
>
> > +                             /* Free the mbuf in case of an error. */
> > +                             rte_mbuf_raw_free(rx_info->mbuf);
> > +                     } else {
> > +                             /*
> > +                              * If there was no error, just exit the
loop as
> > +                              * 0 length descriptor is always the last
one.
> > +                              */
> > +                             break;
> > +                     }
> > +             } else {
> > +                     /* Create an mbuf chain. */
> > +                     mbuf->next = rx_info->mbuf;
> > +                     mbuf = mbuf->next;
> >
> > -             ena_init_rx_mbuf(mbuf, len);
> > -             mbuf_head->pkt_len += len;
> > +                     ena_init_rx_mbuf(mbuf, len);
> > +                     mbuf_head->pkt_len += len;
> > +             }
> >
> > +             /*
> > +              * Mark the descriptor as depleted and perform necessary
> > +              * cleanup.
> > +              * This code will execute in two cases:
> > +              *  1. Descriptor len was greater than 0 - normal
situation.
> > +              *  2. Descriptor len was 0 and we failed to add the
descriptor
> > +              *     to the device. In that situation, we should try to
add
> > +              *     the mbuf again in the populate routine and mark the
> > +              *     descriptor as used up by the device.
> > +              */
> >               rx_info->mbuf = NULL;
> >               rx_ring->empty_rx_reqs[ntc] = req_id;
> >               ntc = ENA_IDX_NEXT_MASKED(ntc, rx_ring->size_mask);
> >
>

  reply	other threads:[~2020-03-31  9:45 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-27 10:17 [dpdk-dev] [PATCH 00/29] Update ENA driver to v2.1.0 Michal Krawczyk
2020-03-27 10:17 ` [dpdk-dev] [PATCH 01/29] net/ena: check if size of buffer is at least 1400B Michal Krawczyk
2020-03-27 10:55   ` Andrew Rybchenko
2020-03-31  9:47     ` Michał Krawczyk
2020-03-27 14:51   ` Stephen Hemminger
2020-03-31  9:48     ` Michał Krawczyk
2020-03-27 10:17 ` [dpdk-dev] [PATCH 02/29] net/ena/base: make allocation macros thread-safe Michal Krawczyk
2020-03-27 14:54   ` Stephen Hemminger
2020-03-31  9:47     ` Michał Krawczyk
2020-03-27 10:17 ` [dpdk-dev] [PATCH 03/29] net/ena/base: prevent allocation of 0-sized memory Michal Krawczyk
2020-03-27 10:17 ` [dpdk-dev] [PATCH 04/29] net/ena/base: set default hash key Michal Krawczyk
2020-03-27 11:12   ` Andrew Rybchenko
2020-03-31  9:40     ` Michał Krawczyk
2020-03-31  9:51       ` Michał Krawczyk
2020-03-27 10:17 ` [dpdk-dev] [PATCH 05/29] net/ena/base: rework interrupt moderation Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 06/29] net/ena/base: remove extra properties strings Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 07/29] net/ena/base: add accelerated LLQ mode Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 08/29] net/ena/base: fix documentation of the functions Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 09/29] net/ena/base: fix indentation in cq polling Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 10/29] net/ena/base: add error logs when preparing Tx Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 11/29] net/ena/base: use 48-bit memory addresses in ena_com Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 12/29] net/ena/base: fix types for printing timestamps Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 13/29] net/ena/base: fix indentation of multiple defines Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 14/29] net/ena/base: update gen date and commit Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 15/29] net/ena: set IO ring size to the valid value Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 16/29] net/ena: refactor getting IO queues capabilities Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 17/29] net/ena: add support for large LLQ headers Michal Krawczyk
2020-03-27 11:20   ` Andrew Rybchenko
2020-03-31  9:42     ` Michał Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 18/29] net/ena: remove memory barriers before doorbells Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 19/29] net/ena: add Tx drops statistic Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 20/29] net/ena: disable meta caching Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 21/29] net/ena: refactor Rx path Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 22/29] net/ena: rework getting number of available descs Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 23/29] net/ena: limit refill threshold by fixed value Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 24/29] net/ena: use macros for ring idx operations Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 25/29] net/ena: refactor Tx path Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 26/29] net/ena: reuse 0 length Rx descriptor Michal Krawczyk
2020-03-27 11:29   ` Andrew Rybchenko
2020-03-31  9:45     ` Michał Krawczyk [this message]
2020-03-27 10:18 ` [dpdk-dev] [PATCH 27/29] doc: add notes on ENA usage on metal instances Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 28/29] net/ena: update copyright date Michal Krawczyk
2020-03-27 10:18 ` [dpdk-dev] [PATCH 29/29] net/ena: update version of the driver to v2.1.0 Michal Krawczyk

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='CAJMMOfPZn=-XG6ODatH7OSDq9wdWX7Ab2tcKog3Sk9VMX7=8ig@mail.gmail.com' \
    --to=mk@semihalf.com \
    --cc=arybchenko@solarflare.com \
    --cc=dev@dpdk.org \
    --cc=evgenys@amazon.com \
    --cc=gtzalik@amazon.com \
    --cc=igorch@amazon.com \
    --cc=mba@semihalf.com \
    --cc=mw@semihalf.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).