All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael Chan" <mchan@broadcom.com>
To: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Matt Carlson <mcarlson@broadcom.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Kernel Testers List <kernel-testers@vger.kernel.org>,
	Maciej Rutecki <maciej.rutecki@gmail.com>,
	Florian Mickler <florian@mickler.org>,
	Ben Hutchings <bhutchings@solarflare.com>,
	"David S. Miller" <davem@davemloft.net>,
	netdev@vger.kernel.org
Subject: Re: [Bug #42707] Hang deconfiguring network interface (in shutdown) on 3.3-rc1
Date: Wed, 29 Feb 2012 01:33:37 -0800	[thread overview]
Message-ID: <1330508017.7993.3.camel@HP1> (raw)
In-Reply-To: <1330477116.2822.191.camel@dabdike.int.hansenpartnership.com>


On Tue, 2012-02-28 at 18:58 -0600, James Bottomley wrote:
> Well, the patch needs some attention:
> 
>   CC [M]  drivers/net/ethernet/broadcom/tg3.o
> drivers/net/ethernet/broadcom/tg3.c: In function 'tg3_get_estats':
> drivers/net/ethernet/broadcom/tg3.c:9882: warning: 'return' with a
> value, in function returning void
> 
> It also didn't apply incredibly well (the fuzz factors and line
> offsets
> are a lot higher than they should be):
> 
> patching file drivers/net/ethernet/broadcom/tg3.c
> Hunk #1 succeeded at 7886 (offset -115 lines).
> Hunk #2 succeeded at 7908 (offset -115 lines).
> Hunk #3 succeeded at 9845 (offset -278 lines).
> Hunk #4 succeeded at 9854 (offset -278 lines).
> Hunk #5 succeeded at 9873 (offset -278 lines).
> Hunk #6 succeeded at 9958 (offset -275 lines).
> Hunk #7 succeeded at 10007 with fuzz 1 (offset -275 lines).
> Hunk #8 succeeded at 10103 with fuzz 2 (offset -2096 lines).
> 
> but it seems to work.

I think Matt did the patch for the net-next tree.  Here's the same patch
for the net tree which is the correct tree for this patch.  Thanks.


Subject: [PATCH net] tg3: Fix tg3_get_stats64 for 5700 / 5701 devs

From: Matt Carlson <mcarlson@broadcom.com>

tg3_get_stats64() takes tp->lock when dealing with non-serdes bcm5700
and bcm5701 devices.  However, functions that call tg3_halt() have
already acquired tp->lock.  When tg3_get_stats64() is called in
tg3_halt(), deadlock will occur.

This patch fixes the problem by separating the stat gathering code into
a new tg3_get_nstats() function.  tg3_get_stats64() is recoded to call
this function and take tp->lock.  The code that takes tp->lock in
tg3_calc_crc_errors() has been removed.  Function signatures have been
cleaned up too.

Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
---
 drivers/net/ethernet/broadcom/tg3.c |   45 ++++++++++++++++++-----------------
 1 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index a1f2e0f..423d023 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -7886,10 +7886,8 @@ static int tg3_chip_reset(struct tg3 *tp)
 	return 0;
 }
 
-static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *,
-						 struct rtnl_link_stats64 *);
-static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *,
-						struct tg3_ethtool_stats *);
+static void tg3_get_nstats(struct tg3 *, struct rtnl_link_stats64 *);
+static void tg3_get_estats(struct tg3 *, struct tg3_ethtool_stats *);
 
 /* tp->lock is held. */
 static int tg3_halt(struct tg3 *tp, int kind, int silent)
@@ -7910,7 +7908,7 @@ static int tg3_halt(struct tg3 *tp, int kind, int silent)
 
 	if (tp->hw_stats) {
 		/* Save the stats across chip resets... */
-		tg3_get_stats64(tp->dev, &tp->net_stats_prev),
+		tg3_get_nstats(tp, &tp->net_stats_prev),
 		tg3_get_estats(tp, &tp->estats_prev);
 
 		/* And make sure the next sample is new data */
@@ -9847,7 +9845,7 @@ static inline u64 get_stat64(tg3_stat64_t *val)
        return ((u64)val->high << 32) | ((u64)val->low);
 }
 
-static u64 calc_crc_errors(struct tg3 *tp)
+static u64 tg3_calc_crc_errors(struct tg3 *tp)
 {
 	struct tg3_hw_stats *hw_stats = tp->hw_stats;
 
@@ -9856,14 +9854,12 @@ static u64 calc_crc_errors(struct tg3 *tp)
 	     GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
 		u32 val;
 
-		spin_lock_bh(&tp->lock);
 		if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) {
 			tg3_writephy(tp, MII_TG3_TEST1,
 				     val | MII_TG3_TEST1_CRC_EN);
 			tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val);
 		} else
 			val = 0;
-		spin_unlock_bh(&tp->lock);
 
 		tp->phy_crc_errors += val;
 
@@ -9877,14 +9873,13 @@ static u64 calc_crc_errors(struct tg3 *tp)
 	estats->member =	old_estats->member + \
 				get_stat64(&hw_stats->member)
 
-static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp,
-					       struct tg3_ethtool_stats *estats)
+static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats)
 {
 	struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
 	struct tg3_hw_stats *hw_stats = tp->hw_stats;
 
 	if (!hw_stats)
-		return old_estats;
+		return;
 
 	ESTAT_ADD(rx_octets);
 	ESTAT_ADD(rx_fragments);
@@ -9963,20 +9958,13 @@ static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp,
 	ESTAT_ADD(nic_tx_threshold_hit);
 
 	ESTAT_ADD(mbuf_lwm_thresh_hit);
-
-	return estats;
 }
 
-static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
-						 struct rtnl_link_stats64 *stats)
+static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats)
 {
-	struct tg3 *tp = netdev_priv(dev);
 	struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev;
 	struct tg3_hw_stats *hw_stats = tp->hw_stats;
 
-	if (!hw_stats)
-		return old_stats;
-
 	stats->rx_packets = old_stats->rx_packets +
 		get_stat64(&hw_stats->rx_ucast_packets) +
 		get_stat64(&hw_stats->rx_mcast_packets) +
@@ -10019,15 +10007,13 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
 		get_stat64(&hw_stats->tx_carrier_sense_errors);
 
 	stats->rx_crc_errors = old_stats->rx_crc_errors +
-		calc_crc_errors(tp);
+		tg3_calc_crc_errors(tp);
 
 	stats->rx_missed_errors = old_stats->rx_missed_errors +
 		get_stat64(&hw_stats->rx_discards);
 
 	stats->rx_dropped = tp->rx_dropped;
 	stats->tx_dropped = tp->tx_dropped;
-
-	return stats;
 }
 
 static inline u32 calc_crc(unsigned char *buf, int len)
@@ -15409,6 +15395,21 @@ static void __devinit tg3_init_coal(struct tg3 *tp)
 	}
 }
 
+static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
+						struct rtnl_link_stats64 *stats)
+{
+	struct tg3 *tp = netdev_priv(dev);
+
+	if (!tp->hw_stats)
+		return &tp->net_stats_prev;
+
+	spin_lock_bh(&tp->lock);
+	tg3_get_nstats(tp, stats);
+	spin_unlock_bh(&tp->lock);
+
+	return stats;
+}
+
 static const struct net_device_ops tg3_netdev_ops = {
 	.ndo_open		= tg3_open,
 	.ndo_stop		= tg3_close,
-- 
1.7.1




  reply	other threads:[~2012-02-29  9:33 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-23 22:51 3.3-rc4+: Reported regressions from 3.2 Rafael J. Wysocki
2012-02-23 22:51 ` Rafael J. Wysocki
2012-02-23 22:51 ` [Bug #42669] 3.3-rc1: compiling problems nvme , l2cap_sock , mc13892-regulator , and snd-pcsp don't work Rafael J. Wysocki
2012-02-23 23:19   ` David Miller
2012-02-23 23:19     ` David Miller
     [not found]     ` <20120223.181904.501214130038312055.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2012-02-23 23:30       ` Rafael J. Wysocki
2012-02-23 23:30         ` Rafael J. Wysocki
2012-02-24 10:48     ` werner
     [not found]       ` <web-701709481-zcyLqNHFQq3Ee+7He9zlJw@public.gmane.org>
2012-02-24 19:57         ` David Miller
2012-02-24 19:57           ` David Miller
     [not found]           ` <20120224.145737.662334352795127267.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2012-02-24 21:55             ` werner
2012-02-24 21:55               ` werner
2012-02-25 22:48               ` Florian Mickler
2012-02-23 22:55 ` [Bug #42707] Hang deconfiguring network interface (in shutdown) on 3.3-rc1 Rafael J. Wysocki
2012-02-27 23:44   ` James Bottomley
2012-02-28  1:24     ` Matt Carlson
     [not found]       ` <20120228012408.GA29622-+O+RPeR0w/SWJtbYL5oUVDJtLkR7yuzc@public.gmane.org>
2012-02-28 21:07         ` David Miller
2012-02-28 21:07           ` David Miller
     [not found]     ` <1330386274.2822.105.camel-sFMDBYUN5F8GjUHQrlYNx2Wm91YjaHnnhRte9Li2A+AAvxtiuMwx3w@public.gmane.org>
2012-02-28 23:32       ` Matt Carlson
2012-02-28 23:32         ` Matt Carlson
     [not found]         ` <20120228233225.GA1322-+O+RPeR0w/SWJtbYL5oUVDJtLkR7yuzc@public.gmane.org>
2012-02-29  0:58           ` James Bottomley
2012-02-29  0:58             ` James Bottomley
2012-02-29  9:33             ` Michael Chan [this message]
2012-02-29 18:46               ` David Miller
2012-02-29 18:46                 ` David Miller
2012-02-23 22:55 ` [Bug #42683] WARN... Device 'cpu1' does not have a release() function, it is broken and must be fixed. when doing 'xl vcpu-set <guest_id> 1' Rafael J. Wysocki
2012-02-23 22:55   ` Rafael J. Wysocki
2012-02-24  4:33   ` Konrad Rzeszutek Wilk
2012-02-24  4:33     ` Konrad Rzeszutek Wilk
2012-02-23 22:55 ` [Bug #42678] [3.3-rc1] radeon stuck in kernel after lockup Rafael J. Wysocki
2012-02-24  9:14   ` Torsten Kaiser
2012-02-24  9:14     ` Torsten Kaiser
2012-02-23 22:55 ` [Bug #42686] iwlagn is getting even worse with 3.3-rc1 Rafael J. Wysocki
2012-02-23 22:55   ` Rafael J. Wysocki
2012-02-23 22:55 ` [Bug #42733] Regression 3.2 -> 3.3-rc1 10 sec hang at boot and resume, COMRESET failed Rafael J. Wysocki
2012-02-23 22:55 ` [Bug #42734] dosemu graphics broken in v3.3-rc1 Rafael J. Wysocki
2012-02-23 22:55   ` Rafael J. Wysocki
2012-02-23 22:55 ` [Bug #42713] Regression in skge that started around acb42a3 (so past v3.3-rc1) Rafael J. Wysocki
2012-02-23 22:55 ` [Bug #42735] kobject (ffff88003ffbb4b8): tried to init an initialized object, something is seriously wrong Rafael J. Wysocki
2012-02-23 22:55 ` [Bug #42746] 3.3-rc2 snd_pcm lockdep backtrace Rafael J. Wysocki
2012-02-23 22:55 ` [Bug #42761] Possible circular locking dependency (3.3-rc2) Rafael J. Wysocki
2012-02-23 22:55   ` Rafael J. Wysocki
2012-02-23 22:55 ` [Bug #42776] OF-related boot crash in 3.3.0-rc3-00188-g3ec1e88 Rafael J. Wysocki
2012-02-23 22:55 ` [Bug #42798] i915 regression with 3.3-rc3+git Rafael J. Wysocki
2012-02-23 23:28 ` 3.3-rc4+: Reported regressions from 3.2 David Miller
2012-02-23 23:28   ` David Miller
2012-02-24  0:13   ` Rafael J. Wysocki
  -- strict thread matches above, loose matches on Subject: below --
2012-03-04 20:29 3.3-rc6: " Rafael J. Wysocki
2012-03-04 20:31 ` [Bug #42707] Hang deconfiguring network interface (in shutdown) on 3.3-rc1 Rafael J. Wysocki
2012-03-04 20:31   ` Rafael J. Wysocki

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=1330508017.7993.3.camel@HP1 \
    --to=mchan@broadcom.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=bhutchings@solarflare.com \
    --cc=davem@davemloft.net \
    --cc=florian@mickler.org \
    --cc=kernel-testers@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maciej.rutecki@gmail.com \
    --cc=mcarlson@broadcom.com \
    --cc=netdev@vger.kernel.org \
    --cc=rjw@sisk.pl \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.