From patchwork Mon Dec 27 15:54:02 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "J. K. Cliburn" X-Patchwork-Id: 76795 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 E8D8BB70DA for ; Tue, 28 Dec 2010 02:54:14 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754292Ab0L0PyI (ORCPT ); Mon, 27 Dec 2010 10:54:08 -0500 Received: from mail-gy0-f174.google.com ([209.85.160.174]:33995 "EHLO mail-gy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754254Ab0L0PyH convert rfc822-to-8bit (ORCPT ); Mon, 27 Dec 2010 10:54:07 -0500 Received: by gyb11 with SMTP id 11so3501608gyb.19 for ; Mon, 27 Dec 2010 07:54:06 -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=hFUfNRQZs8XzgzO0+Ue+0OGlVHbdQIqb8MtChuy8yhQ=; b=J2HZC952Y5vMdMdF43jzt7eVd1xZY8QnpIrQl9QAn8PpLWCUrh99N6J+DGu9KC7O8D Ch833SaTRMxHiGPNTuW0yoAYix8wP44b8RBMHqsmAo+Xd2hqqgRY+IEYt7RtoeybfGgE 2KYyBStDDB6CIl1DUlbgn2eN/0CswbUaKZLxA= 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=dPswj67F95/hSmEv5Nnk8a8RBSlwoaVoZUHTIx7mEYW5v5cgYCxtbHhjz9FaNYKAS5 9cAX4PtduyHv/ME6w0B6HnR0a+PWC7R5kR7PX6o/yZz2gVGGlQwRgwIsPVw4H5ltEcJ7 az4JGjuT3qQvIujSoBoIgOjmVJglGU60zMhRU= Received: by 10.151.78.11 with SMTP id f11mr16844529ybl.305.1293465245884; Mon, 27 Dec 2010 07:54:05 -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 r18sm8812369yba.3.2010.12.27.07.54.04 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 27 Dec 2010 07:54:05 -0800 (PST) Date: Mon, 27 Dec 2010 09:54:02 -0600 From: "J. K. Cliburn" To: David Miller Cc: =?ISO-8859-1?B?VPVudQ==?= Raitviir , Luca Tettamanti , Chris Snook , netdev@vger.kernel.org, Xiong Huang , stable@kernel.org Subject: [PATCH] atl1: fix oops when changing tx/rx ring params Message-ID: <20101227095402.76f98027@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 descriptors 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 | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index def8df8..6d4f051 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,20 @@ 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 as a result of commit + * 3f5a2a713aad28480d86b0add00c68484b54febc + */ + 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)