From patchwork Tue Jul 10 00:16:08 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Herring X-Patchwork-Id: 170001 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 E0F7B2C0205 for ; Tue, 10 Jul 2012 10:17:44 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755313Ab2GJARQ (ORCPT ); Mon, 9 Jul 2012 20:17:16 -0400 Received: from mail-ob0-f174.google.com ([209.85.214.174]:64343 "EHLO mail-ob0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755264Ab2GJAQX (ORCPT ); Mon, 9 Jul 2012 20:16:23 -0400 Received: by mail-ob0-f174.google.com with SMTP id uo13so21306033obb.19 for ; Mon, 09 Jul 2012 17:16:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=BatrxCYAn9cP5wAc52Y8h2Ye6cTVI36ux/DySsQMprw=; b=UaTid4rZ9KZbqL3wsaIaOOSL654ozH2Uw3VryoafpOZZhTxn7ZQxxGDLErwx7s1w4Y qDks5MdgvK2qPQWOiM6KJ94s4wBjsZkAHw41DLZttajvP8PkdkV1IzE3xInOBWvyd3Ml tb3OLymI2sGTa/JzHdQ5OhS3FZrPiCUA2T8VQuJLtxJR5h4J5MQw+KDqnEWH3sYucfZm ttdarV6EJUcomD4DOtH8tnhv/64RqewF8hYRUpwfelNNruO3+jl3CtyGdNlM3G0VlUb+ zVuIjtN6sFTfKTdJxA7xkIeElk2xTPhlR4BuvFD8n8c6KUxBzATnMDYF3fq/5HLdsbTp cCMA== Received: by 10.182.110.102 with SMTP id hz6mr38179992obb.79.1341879383273; Mon, 09 Jul 2012 17:16:23 -0700 (PDT) Received: from rob-laptop.grandecom.net (65-36-72-55.dyn.grandenetworks.net. [65.36.72.55]) by mx.google.com with ESMTPS id sr3sm31562473obb.23.2012.07.09.17.16.21 (version=SSLv3 cipher=OTHER); Mon, 09 Jul 2012 17:16:22 -0700 (PDT) From: Rob Herring To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: "David S. Miller" , Rob Herring Subject: [PATCH 2/4] net: calxedaxgmac: fix hang on rx refill Date: Mon, 9 Jul 2012 19:16:08 -0500 Message-Id: <1341879370-23385-3-git-send-email-robherring2@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1341879370-23385-1-git-send-email-robherring2@gmail.com> References: <1341879370-23385-1-git-send-email-robherring2@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Rob Herring Fix intermittent hangs in xgmac_rx_refill. If a ring buffer entry already had an skb allocated, then xgmac_rx_refill would get stuck in a loop. This can happen on a rx error when we just leave the skb allocated to the entry. [ 7884.510000] INFO: rcu_preempt detected stall on CPU 0 (t=727315 jiffies) [ 7884.510000] [] (unwind_backtrace+0x1/0x98) from [] (__rcu_pending+0x11b/0x2c4) [ 7884.510000] [] (__rcu_pending+0x11b/0x2c4) from [] (rcu_check_callbacks+0xed/0x1a8) [ 7884.510000] [] (rcu_check_callbacks+0xed/0x1a8) from [] (update_process_times+0x2b/0x48) [ 7884.510000] [] (update_process_times+0x2b/0x48) from [] (tick_sched_timer+0x51/0x94) [ 7884.510000] [] (tick_sched_timer+0x51/0x94) from [] (__run_hrtimer+0x4f/0x1e8) [ 7884.510000] [] (__run_hrtimer+0x4f/0x1e8) from [] (hrtimer_interrupt+0xd7/0x1e4) [ 7884.510000] [] (hrtimer_interrupt+0xd7/0x1e4) from [] (twd_handler+0x17/0x24) [ 7884.510000] [] (twd_handler+0x17/0x24) from [] (handle_percpu_devid_irq+0x59/0x114) [ 7884.510000] [] (handle_percpu_devid_irq+0x59/0x114) from [] (generic_handle_irq+0x17/0x2c) [ 7884.510000] [] (generic_handle_irq+0x17/0x2c) from [] (handle_IRQ+0x35/0x7c) [ 7884.510000] [] (handle_IRQ+0x35/0x7c) from [] (__irq_svc+0x33/0xb8) [ 7884.510000] [] (__irq_svc+0x33/0xb8) from [] (xgmac_rx_refill+0x3a/0x140) [ 7884.510000] [] (xgmac_rx_refill+0x3a/0x140) from [] (xgmac_poll+0x265/0x3bc) [ 7884.510000] [] (xgmac_poll+0x265/0x3bc) from [] (net_rx_action+0xc3/0x200) [ 7884.510000] [] (net_rx_action+0xc3/0x200) from [] (__do_softirq+0xa3/0x1bc) Signed-off-by: Rob Herring --- drivers/net/ethernet/calxeda/xgmac.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c index c4fd2e3..3ca1d79 100644 --- a/drivers/net/ethernet/calxeda/xgmac.c +++ b/drivers/net/ethernet/calxeda/xgmac.c @@ -671,26 +671,23 @@ static void xgmac_rx_refill(struct xgmac_priv *priv) p = priv->dma_rx + entry; - if (priv->rx_skbuff[entry] != NULL) - continue; - - skb = __skb_dequeue(&priv->rx_recycle); - if (skb == NULL) - skb = netdev_alloc_skb(priv->dev, priv->dma_buf_sz); - if (unlikely(skb == NULL)) - break; - - priv->rx_skbuff[entry] = skb; - paddr = dma_map_single(priv->device, skb->data, - priv->dma_buf_sz, DMA_FROM_DEVICE); - desc_set_buf_addr(p, paddr, priv->dma_buf_sz); + if (priv->rx_skbuff[entry] == NULL) { + skb = __skb_dequeue(&priv->rx_recycle); + if (skb == NULL) + skb = netdev_alloc_skb(priv->dev, priv->dma_buf_sz); + if (unlikely(skb == NULL)) + break; + + priv->rx_skbuff[entry] = skb; + paddr = dma_map_single(priv->device, skb->data, + priv->dma_buf_sz, DMA_FROM_DEVICE); + desc_set_buf_addr(p, paddr, priv->dma_buf_sz); + } netdev_dbg(priv->dev, "rx ring: head %d, tail %d\n", priv->rx_head, priv->rx_tail); priv->rx_head = dma_ring_incr(priv->rx_head, DMA_RX_RING_SZ); - /* Ensure descriptor is in memory before handing to h/w */ - wmb(); desc_set_rx_owner(p); } }