From patchwork Wed Feb 11 13:58:37 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ron Mercer X-Patchwork-Id: 22922 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.176.167]) by ozlabs.org (Postfix) with ESMTP id 6D8D8DDDCA for ; Thu, 12 Feb 2009 01:01:44 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755112AbZBKOB3 (ORCPT ); Wed, 11 Feb 2009 09:01:29 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755080AbZBKOB2 (ORCPT ); Wed, 11 Feb 2009 09:01:28 -0500 Received: from avexch1.qlogic.com ([198.70.193.115]:50248 "EHLO avexch1.qlogic.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754886AbZBKOBU (ORCPT ); Wed, 11 Feb 2009 09:01:20 -0500 Received: from linux-ox1b.qlogic.com ([172.17.161.157]) by avexch1.qlogic.com with Microsoft SMTPSVC(6.0.3790.1830); Wed, 11 Feb 2009 06:00:08 -0800 Received: by linux-ox1b.qlogic.com (Postfix, from userid 1000) id 00C082C6C6; Wed, 11 Feb 2009 05:58:37 -0800 (PST) From: Ron Mercer To: davem@davemloft.net Cc: netdev@vger.kernel.org, linux-driver@qlogic.com, ron.mercer@qlogic.com Subject: [PATCH 7/7] qlge: bugfix: Add missing rx buf clean index on early exit. Date: Wed, 11 Feb 2009 05:58:37 -0800 Message-Id: <1234360717-32194-7-git-send-email-ron.mercer@qlogic.com> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: <1234360717-32194-1-git-send-email-ron.mercer@qlogic.com> References: <1234360717-32194-1-git-send-email-ron.mercer@qlogic.com> X-OriginalArrivalTime: 11 Feb 2009 14:00:08.0773 (UTC) FILETIME=[0C8F5750:01C98C51] Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The large receive buffer queue is not properly tracking the current index in the case where an early exit occurs. This can happen when a page alloc or dma mapping fails. If this occurs the queue will get out of sync and invalid indexes can be written to the hardware. Signed-off-by: Ron Mercer --- drivers/net/qlge/qlge_main.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 3ab0369..8ea72dc 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -898,6 +898,7 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring) lbq_desc->index); lbq_desc->p.lbq_page = alloc_page(GFP_ATOMIC); if (lbq_desc->p.lbq_page == NULL) { + rx_ring->lbq_clean_idx = clean_idx; QPRINTK(qdev, RX_STATUS, ERR, "Couldn't get a page.\n"); return; @@ -907,6 +908,7 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring) 0, PAGE_SIZE, PCI_DMA_FROMDEVICE); if (pci_dma_mapping_error(qdev->pdev, map)) { + rx_ring->lbq_clean_idx = clean_idx; put_page(lbq_desc->p.lbq_page); lbq_desc->p.lbq_page = NULL; QPRINTK(qdev, RX_STATUS, ERR,