From patchwork Sat Jan 1 15:02:12 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "J. K. Cliburn" X-Patchwork-Id: 77144 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 640731007D1 for ; Sun, 2 Jan 2011 02:02:20 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752834Ab1AAPCQ (ORCPT ); Sat, 1 Jan 2011 10:02:16 -0500 Received: from mail-gw0-f46.google.com ([74.125.83.46]:44076 "EHLO mail-gw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752752Ab1AAPCP convert rfc822-to-8bit (ORCPT ); Sat, 1 Jan 2011 10:02:15 -0500 Received: by gwj20 with SMTP id 20so5822094gwj.19 for ; Sat, 01 Jan 2011 07:02:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:from:to:cc:subject :message-id:x-mailer:mime-version:content-type :content-transfer-encoding; bh=6pHF3detUGcwPXt+wg/H3H+T5DtN9mV7Vt1kYi9sfF0=; b=NPP8mPZ99RdzFwnbQcmHIC/mIsCKrd2+bwU7JDiF87n0WJmvUGMjZKbsDV1VaqLl/U IcKlw0/I356TLR+dC+iOpaQrZlX37G4s7iI6qME5jRNhHl6ZmhYhWX4jTC44vWAg/6dp OJ4BEz5RK7Yv1vnEOk7qeeFRC8L9v4rb437bA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:from:to:cc:subject:message-id:x-mailer:mime-version :content-type:content-transfer-encoding; b=NXXkqBA3sER5z8OywA97q31Oey9E/FkTI8awfRQBxE45AOT4j8FS2iBRDim81cGW8m 7Ah0rWfuOliwJJgg7dvhClBbU8y4Rh8NIk+qolJ6zFOZNaj4jtstGyzh6JK5Gh+zZhml 76138w1uN91hYHXSplPPrO7bCVcHINPnqpZbA= Received: by 10.100.124.15 with SMTP id w15mr10691079anc.95.1293894134451; Sat, 01 Jan 2011 07:02:14 -0800 (PST) Received: from osprey.hogchain.net (adsl-95-136-203.jan.bellsouth.net [98.95.136.203]) by mx.google.com with ESMTPS id 35sm25189093ano.11.2011.01.01.07.02.13 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 01 Jan 2011 07:02:13 -0800 (PST) Date: Sat, 1 Jan 2011 09:02:12 -0600 From: "J. K. Cliburn" To: David Miller Cc: netdev@vger.kernel.org, stable@kernel.org, jussuf@linux.ee, chris.snook@gmail.com, kronos.it@gmail.com, Xiong.Huang@Atheros.com Subject: [PATCH] atl1: fix oops when changing tx/rx ring params Message-ID: <20110101090212.7149010d@osprey.hogchain.net> X-Mailer: Claws Mail 3.7.8 (GTK+ 2.20.1; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Commit 3f5a2a713aad28480d86b0add00c68484b54febc zeroes out the statistics message block (SMB) and coalescing message block (CMB) when adapter ring resources are freed. This is desirable behavior, but, as a side effect, the commit leads to an oops when atl1_set_ringparam() attempts to alter the number of rx or tx elements in the ring buffer (by using ethtool -G, for example). We don't want SMB or CMB to change during this operation. Modify atl1_set_ringparam() to preserve SMB and CMB when changing ring parameters. Cc: stable@kernel.org Signed-off-by: Jay Cliburn Reported-by: Tõnu Raitviir --- drivers/net/atlx/atl1.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 5336310..3acf512 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c @@ -3504,6 +3504,8 @@ static int atl1_set_ringparam(struct net_device *netdev, struct atl1_rfd_ring rfd_old, rfd_new; struct atl1_rrd_ring rrd_old, rrd_new; struct atl1_ring_header rhdr_old, rhdr_new; + struct atl1_smb smb; + struct atl1_cmb cmb; int err; tpd_old = adapter->tpd_ring; @@ -3544,11 +3546,19 @@ static int atl1_set_ringparam(struct net_device *netdev, adapter->rrd_ring = rrd_old; adapter->tpd_ring = tpd_old; adapter->ring_header = rhdr_old; + /* + * Save SMB and CMB, since atl1_free_ring_resources + * will clear them. + */ + smb = adapter->smb; + cmb = adapter->cmb; atl1_free_ring_resources(adapter); adapter->rfd_ring = rfd_new; adapter->rrd_ring = rrd_new; adapter->tpd_ring = tpd_new; adapter->ring_header = rhdr_new; + adapter->smb = smb; + adapter->cmb = cmb; err = atl1_up(adapter); if (err)