From patchwork Thu Dec 3 14:20:51 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcin Wojtas X-Patchwork-Id: 552323 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id CB10A14029C for ; Fri, 4 Dec 2015 01:21:00 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=semihalf-com.20150623.gappssmtp.com header.i=@semihalf-com.20150623.gappssmtp.com header.b=w2HkcCJj; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760303AbbLCOUn (ORCPT ); Thu, 3 Dec 2015 09:20:43 -0500 Received: from mail-lf0-f54.google.com ([209.85.215.54]:35906 "EHLO mail-lf0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756202AbbLCOUc (ORCPT ); Thu, 3 Dec 2015 09:20:32 -0500 Received: by lfs39 with SMTP id 39so87863197lfs.3 for ; Thu, 03 Dec 2015 06:20:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=8J/6J5mpmjAm0coMopXy5UknUC3qtgJzwM5Lm9YKLL4=; b=w2HkcCJjlCRrqEtJXT+T4PMj/OW/jBg6NCEQvB03zR4lFIh9RFraZJoJUe2YWxU0O6 asaJqx1fWitzjDIHVJ9L38A7L2ZASzjuJI7/hsMlLPqifP8f87N7NB1HGMuuTD2kXI5p 65UU2IY48RE1AdyhTb5B1q5GOoSifUfWfxGn3Tx1JU8ezyFJzlZUPyhGhcct4QXvIElf 4pwa58XEIEVfiqTliV7Y+LA7Lckx3WxMQ6rjK7TDjAXOHCGFuovoYstskCx+xROq/e/y FjaYwsLrdFOy42AkUA0qiOqkvvS97dxTPPXlnvrPGdD6UrbASV2alJsRtImIhusdkS55 qjew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=8J/6J5mpmjAm0coMopXy5UknUC3qtgJzwM5Lm9YKLL4=; b=bqyJpJPKl5Ynn98GpiAGpbLoal4peUsGkSL5XWWn6KQOAAaYjf2iE7+/jYfzDNo/BT CnJ4ooAakJRPnvMy/rKSZBv4O09USj82Q9/N2NKDBaUe0MvZx3L7l9feUJzsEtXlWa2T dyGEYB7hen14+lH8kNQE/8vQYm6oA7850qQLcuR5tC3o6ztobdI0A7NQyCF+PO/smm77 DslwBQVl64gZZDzYMhCvfUjfNsk0Cd8MAUeID0k/Sfnp7EugIRhH+G66kF4iH9IaeKmY Zh+LtKBDEpSEcCyUQ1IkqYvqxAnv9Mu0tyBbscWOZV6Xk8IwHfuxY63zNplUnG1ajhwl NrSQ== X-Gm-Message-State: ALoCoQkYQDFDGFoMGPRVUGD3CNcpyljcFsQNz215mSMD4psIEPC45KZhagYZkDB86tiDEgaZXNaj X-Received: by 10.25.136.193 with SMTP id k184mr5825971lfd.88.1449152431020; Thu, 03 Dec 2015 06:20:31 -0800 (PST) Received: from enkidu.semihalf.local (cardhu.semihalf.com. [213.17.239.108]) by smtp.gmail.com with ESMTPSA id a75sm1446399lfe.34.2015.12.03.06.20.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Dec 2015 06:20:30 -0800 (PST) From: Marcin Wojtas To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org Cc: davem@davemloft.net, linux@arm.linux.org.uk, sebastian.hesselbarth@gmail.com, andrew@lunn.ch, jason@lakedaemon.net, thomas.petazzoni@free-electrons.com, gregory.clement@free-electrons.com, ezequiel.garcia@free-electrons.com, nadavh@marvell.com, alior@marvell.com, mw@semihalf.com, jaz@semihalf.com, tn@semihalf.com, Subject: [PATCH net 3/3] net: mvpp2: fix refilling BM pools in RX path Date: Thu, 3 Dec 2015 15:20:51 +0100 Message-Id: <1449152451-2939-4-git-send-email-mw@semihalf.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1449152451-2939-1-git-send-email-mw@semihalf.com> References: <1449152451-2939-1-git-send-email-mw@semihalf.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In hitherto code in case of RX buffer allocation error during refill, original buffer is pushed to the network stack, but the amount of available buffer pointers in BM pool is decreased. This commit fixes the situation by moving refill call before skb_put(), and returning original buffer pointer to the pool in case of an error. Signed-off-by: Marcin Wojtas Fixes: 3f518509dedc ("ethernet: Add new driver for Marvell Armada 375 network unit") Cc: # v3.18+ --- drivers/net/ethernet/marvell/mvpp2.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c index eaef461..a4beccf 100644 --- a/drivers/net/ethernet/marvell/mvpp2.c +++ b/drivers/net/ethernet/marvell/mvpp2.c @@ -5099,7 +5099,8 @@ static int mvpp2_rx(struct mvpp2_port *port, int rx_todo, struct mvpp2_rx_queue *rxq) { struct net_device *dev = port->dev; - int rx_received, rx_filled, i; + int rx_received; + int rx_done = 0; u32 rcvd_pkts = 0; u32 rcvd_bytes = 0; @@ -5108,17 +5109,18 @@ static int mvpp2_rx(struct mvpp2_port *port, int rx_todo, if (rx_todo > rx_received) rx_todo = rx_received; - rx_filled = 0; - for (i = 0; i < rx_todo; i++) { + while (rx_done < rx_todo) { struct mvpp2_rx_desc *rx_desc = mvpp2_rxq_next_desc_get(rxq); struct mvpp2_bm_pool *bm_pool; struct sk_buff *skb; + dma_addr_t phys_addr; u32 bm, rx_status; int pool, rx_bytes, err; - rx_filled++; + rx_done++; rx_status = rx_desc->status; rx_bytes = rx_desc->data_size - MVPP2_MH_SIZE; + phys_addr = rx_desc->buf_phys_addr; bm = mvpp2_bm_cookie_build(rx_desc); pool = mvpp2_bm_cookie_pool_get(bm); @@ -5135,8 +5137,10 @@ static int mvpp2_rx(struct mvpp2_port *port, int rx_todo, * comprised by the RX descriptor. */ if (rx_status & MVPP2_RXD_ERR_SUMMARY) { + err_drop_frame: dev->stats.rx_errors++; mvpp2_rx_error(port, rx_desc); + /* Return the buffer to the pool */ mvpp2_pool_refill(port, bm, rx_desc->buf_phys_addr, rx_desc->buf_cookie); continue; @@ -5144,7 +5148,13 @@ static int mvpp2_rx(struct mvpp2_port *port, int rx_todo, skb = (struct sk_buff *)rx_desc->buf_cookie; - dma_unmap_single(dev->dev.parent, rx_desc->buf_phys_addr, + err = mvpp2_rx_refill(port, bm_pool, bm, 0); + if (err) { + netdev_err(port->dev, "failed to refill BM pools\n"); + goto err_drop_frame; + } + + dma_unmap_single(dev->dev.parent, phys_addr, bm_pool->buf_size, DMA_FROM_DEVICE); rcvd_pkts++; @@ -5157,12 +5167,6 @@ static int mvpp2_rx(struct mvpp2_port *port, int rx_todo, mvpp2_rx_csum(port, rx_status, skb); napi_gro_receive(&port->napi, skb); - - err = mvpp2_rx_refill(port, bm_pool, bm, 0); - if (err) { - netdev_err(port->dev, "failed to refill BM pools\n"); - rx_filled--; - } } if (rcvd_pkts) { @@ -5176,7 +5180,7 @@ static int mvpp2_rx(struct mvpp2_port *port, int rx_todo, /* Update Rx queue management counters */ wmb(); - mvpp2_rxq_status_update(port, rxq->id, rx_todo, rx_filled); + mvpp2_rxq_status_update(port, rxq->id, rx_done, rx_done); return rx_todo; }