From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id AA363A09F0 for ; Wed, 16 Dec 2020 16:06:28 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 60BA6C9CE; Wed, 16 Dec 2020 16:06:27 +0100 (CET) Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) by dpdk.org (Postfix) with ESMTP id F3C3FC9BC; Wed, 16 Dec 2020 16:06:22 +0100 (CET) Received: by mail-ot1-f48.google.com with SMTP id q25so23181877otn.10; Wed, 16 Dec 2020 07:06:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=+XIFtlmAJjwQKYEWKLyq/ATGPLlTJA/uOu6YtHiDhlA=; b=Ya5KhhWPpX11l6rWqmsVddD9uL0MMMtcZeoxU7XdpuzZ+bJlrsfSrqGkQRbafZITF7 q44WpidDD6ekiwMq8DxccB53mBRg59upOV1qfSzoD4F4ZYJHGjkIZ0jWlIKI7kDHBkkF S42pS3dzOEeKPceGfF+8tL1e2/0Y8qtiuSqwCGrMucIl5HrMmx9G/jTGkt5hD09pPOPM lAs6FWegnR8jpYysdr95VSRG+xPdfDSkqrvGh2ZFHumw8uC1qf9qJLXY/N132KAby2Of 1vGV71x17RsX56Sf2hfg+F/4OUBToQ9MxFvzp7O8jeqL2091YqQ5wiY0G1YL5kt0gtCL JUGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=+XIFtlmAJjwQKYEWKLyq/ATGPLlTJA/uOu6YtHiDhlA=; b=X8Vc9ymxMaJQ/zo8PgcwfB8sn4r1/VM5o1qTCUMWz1tq+PSGho3E5GLiVNHAn5Qlgz U3xoeiRDrVMKkjSabARN4McvhoaZJ6FI1WJOqvev6mBka0geqxS0/SxINHB9ywx5LT9V L9LY7sIYkWq8XrBhspZnUPbcrk1V2XTGt8F9LA1ZaHjduTYkajVFiVnfrAp/5DVoLCtC snQfWc87+Un5no6IyTZeDJ5CiJ3iDnIth8q6z6OTG1VU3fEv39e8pWsV5m9OI6nVh9om Pl2PU6y2HZoXRmoJEGwzLjZWjS22rELrS3uGqkfAa6wdIflTh61FAS3uijC3YBFqNvwo JPvw== X-Gm-Message-State: AOAM533z1GY9oedpNoDOIXhgt+D3RBUoepbjDuaxKqBLY8RypAreltvP TXcJNjlXFx1uNpBXbf4IcSo= X-Google-Smtp-Source: ABdhPJxN3NJIFTnPsq3VQh9hPxvzvvw2/SkMMRR+L4uHHDKNSnFJg942glaO+hJUYXTRWFVgzBI9zQ== X-Received: by 2002:a05:6830:1252:: with SMTP id s18mr26269981otp.4.1608131182288; Wed, 16 Dec 2020 07:06:22 -0800 (PST) Received: from CoffeeLake.attlocal.net ([2600:1700:f91:f630:65fa:398c:7454:12a9]) by smtp.gmail.com with ESMTPSA id k3sm528740oor.19.2020.12.16.07.06.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Dec 2020 07:06:21 -0800 (PST) From: Lance Richardson X-Google-Original-From: Lance Richardson To: Ajit Khaparde , Somnath Kotur Cc: dev@dpdk.org, Lance Richardson , stable@dpdk.org Date: Wed, 16 Dec 2020 10:06:18 -0500 Message-Id: <20201216150618.1829951-1-lance604@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] [PATCH] net/bnxt: fix fallback mbuf allocation logic X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" From: Lance Richardson Fixes for fallback mbuf allocation logic. - Preserve raw (unmasked) producer index. - Iterate over all processed descriptors (representor and non-representor) when checking allocation status. - Invoke fallback allocation logic when an allocation failure has occurred for any received packet, not just the last. Fixes: 6dc83230b43b ("net/bnxt: support port representor data path") Fixes: d9dd0b29ed31 ("net/bnxt: fix Rx handling and buffer allocation logic") Fixes: 8b8dc3f783ff ("net/bnxt: modify ring index logic") Cc: stable@dpdk.org Signed-off-by: Lance Richardson --- drivers/net/bnxt/bnxt_rxr.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c index ffdeeecc3a..288b403bf0 100644 --- a/drivers/net/bnxt/bnxt_rxr.c +++ b/drivers/net/bnxt/bnxt_rxr.c @@ -839,6 +839,7 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t rx_raw_prod = rxr->rx_raw_prod; uint16_t ag_raw_prod = rxr->ag_raw_prod; uint32_t raw_cons = cpr->cp_raw_cons; + bool alloc_failed = false; uint32_t cons; int nb_rx_pkts = 0; int nb_rep_rx_pkts = 0; @@ -885,12 +886,16 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, /* TODO: Avoid magic numbers... */ if ((CMP_TYPE(rxcmp) & 0x30) == 0x10) { rc = bnxt_rx_pkt(&rx_pkts[nb_rx_pkts], rxq, &raw_cons); - if (likely(!rc) || rc == -ENOMEM) + if (!rc) nb_rx_pkts++; - if (rc == -EBUSY) /* partial completion */ + else if (rc == -EBUSY) /* partial completion */ break; - if (rc == -ENODEV) /* completion for representor */ + else if (rc == -ENODEV) /* completion for representor */ nb_rep_rx_pkts++; + else if (rc == -ENOMEM) { + nb_rx_pkts++; + alloc_failed = true; + } } else if (!BNXT_NUM_ASYNC_CPR(rxq->bp)) { evt = bnxt_event_hwrm_resp_handler(rxq->bp, @@ -929,23 +934,24 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, bnxt_db_write(&rxr->ag_db, rxr->ag_raw_prod); /* Attempt to alloc Rx buf in case of a previous allocation failure. */ - if (rc == -ENOMEM) { - int i = RING_NEXT(rx_raw_prod); - int cnt = nb_rx_pkts; + if (alloc_failed) { + uint16_t cnt; - for (; nb_rx_pkts; i = RING_NEXT(i), cnt--) { + rx_raw_prod = RING_NEXT(rx_raw_prod); + for (cnt = 0; cnt < nb_rx_pkts + nb_rep_rx_pkts; cnt++) { struct rte_mbuf **rx_buf; - uint16_t rx_raw_prod = RING_IDX(rxr->rx_ring_struct, i); + uint16_t ndx; - rx_buf = &rxr->rx_buf_ring[rx_raw_prod]; + ndx = RING_IDX(rxr->rx_ring_struct, rx_raw_prod + cnt); + rx_buf = &rxr->rx_buf_ring[ndx]; /* Buffer already allocated for this index. */ if (*rx_buf != NULL && *rx_buf != &rxq->fake_mbuf) continue; /* This slot is empty. Alloc buffer for Rx */ - if (!bnxt_alloc_rx_data(rxq, rxr, i)) { - rxr->rx_raw_prod = i; + if (!bnxt_alloc_rx_data(rxq, rxr, rx_raw_prod + cnt)) { + rxr->rx_raw_prod = rx_raw_prod + cnt; bnxt_db_write(&rxr->rx_db, rxr->rx_raw_prod); } else { PMD_DRV_LOG(ERR, "Alloc mbuf failed\n"); -- 2.25.1