From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Rybchenko Subject: [PATCH 51/56] net/sfc: discard scattered packet on Rx correctly Date: Mon, 21 Nov 2016 15:01:05 +0000 Message-ID: <1479740470-6723-52-git-send-email-arybchenko@solarflare.com> References: <1479740470-6723-1-git-send-email-arybchenko@solarflare.com> Mime-Version: 1.0 Content-Type: text/plain To: Return-path: Received: from nbfkord-smmo02.seg.att.com (nbfkord-smmo02.seg.att.com [209.65.160.78]) by dpdk.org (Postfix) with ESMTP id 12D38377A for ; Mon, 21 Nov 2016 16:01:47 +0100 (CET) Received: from uklogin.uk.solarflarecom.com (uklogin.uk.solarflarecom.com [10.17.10.10]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id uALF1Lt9007251 for ; Mon, 21 Nov 2016 15:01:21 GMT Received: from uklogin.uk.solarflarecom.com (localhost.localdomain [127.0.0.1]) by uklogin.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id uALF1J3g006765 for ; Mon, 21 Nov 2016 15:01:21 GMT In-Reply-To: <1479740470-6723-1-git-send-email-arybchenko@solarflare.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Since Rx scatter is not supported, all scattered packets are discarded. It is not always possible to disable scatter on Huntington, so we should handle scattered packets correctly in any case. Reviewed-by: Andy Moreton Signed-off-by: Andrew Rybchenko --- drivers/net/sfc/efx/sfc_ev.c | 22 +++++++++++++++++++++- drivers/net/sfc/efx/sfc_rx.c | 8 ++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/drivers/net/sfc/efx/sfc_ev.c b/drivers/net/sfc/efx/sfc_ev.c index ae966fc..8f260e7 100644 --- a/drivers/net/sfc/efx/sfc_ev.c +++ b/drivers/net/sfc/efx/sfc_ev.c @@ -90,7 +90,27 @@ sfc_ev_rx(void *arg, uint32_t label, uint32_t id, uint32_t size, uint16_t flags) delta = (stop >= pending_id) ? (stop - pending_id) : (rxq->ptr_mask + 1 - pending_id + stop); - if (unlikely(delta > rxq->batch_max)) { + if (delta == 0) { + /* + * Rx event with no new descriptors done and zero length + * is used to abort scattered packet when there is no room + * for the tail. + */ + if (unlikely(size != 0)) { + evq->exception = B_TRUE; + sfc_err(evq->sa, + "EVQ %u RxQ %u invalid RX abort " + "(id=%#x size=%u flags=%#x); needs restart\n", + evq->evq_index, sfc_rxq_sw_index(rxq), + id, size, flags); + goto done; + } + + /* Add discard flag to the first fragment */ + rxq->sw_desc[pending_id].flags |= EFX_DISCARD; + /* Remove continue flag from the last fragment */ + rxq->sw_desc[id].flags &= ~EFX_PKT_CONT; + } else if (unlikely(delta > rxq->batch_max)) { evq->exception = B_TRUE; sfc_err(evq->sa, diff --git a/drivers/net/sfc/efx/sfc_rx.c b/drivers/net/sfc/efx/sfc_rx.c index 307734e..ec4cbd4 100644 --- a/drivers/net/sfc/efx/sfc_rx.c +++ b/drivers/net/sfc/efx/sfc_rx.c @@ -137,6 +137,7 @@ sfc_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) unsigned int completed; unsigned int prefix_size = rxq->prefix_size; unsigned int done_pkts = 0; + boolean_t discard_next = B_FALSE; if (unlikely((rxq->state & SFC_RXQ_RUNNING) == 0)) return 0; @@ -156,9 +157,15 @@ sfc_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) m = rxd->mbuf; desc_flags = rxd->flags; + if (discard_next) + goto discard; + if (desc_flags & (EFX_ADDR_MISMATCH | EFX_DISCARD)) goto discard; + if (desc_flags & EFX_PKT_CONT) + goto discard; + if (desc_flags & EFX_PKT_PREFIX_LEN) { uint16_t tmp_size; int rc; @@ -182,6 +189,7 @@ sfc_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) continue; discard: + discard_next = ((desc_flags & EFX_PKT_CONT) != 0); rte_mempool_put(rxq->refill_mb_pool, m); rxd->mbuf = NULL; } -- 2.5.5