From patchwork Tue Nov 30 13:46:26 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Alexander V. Lukyanov" X-Patchwork-Id: 73601 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 468D41007D5 for ; Wed, 1 Dec 2010 00:46:35 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751991Ab0K3Nq3 (ORCPT ); Tue, 30 Nov 2010 08:46:29 -0500 Received: from lav-w.yar.ru ([193.233.48.101]:35389 "EHLO localhost.localdomain" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751657Ab0K3Nq2 (ORCPT ); Tue, 30 Nov 2010 08:46:28 -0500 X-Greylist: delayed 496 seconds by postgrey-1.27 at vger.kernel.org; Tue, 30 Nov 2010 08:46:28 EST Received: from localhost.localdomain (lw [127.0.0.1]) by localhost.localdomain (8.14.4/8.14.4) with ESMTP id oAUDkQcV001865; Tue, 30 Nov 2010 16:46:26 +0300 Received: (from lav@localhost) by localhost.localdomain (8.14.4/8.14.4/Submit) id oAUDkQ9c001860; Tue, 30 Nov 2010 16:46:26 +0300 X-Authentication-Warning: localhost.localdomain: lav set sender to lav@netis.ru using -f Date: Tue, 30 Nov 2010 16:46:26 +0300 From: "Alexander V. Lukyanov" To: netdev@vger.kernel.org, tori@unhappy.mine.nu Subject: [PATCH] fix hang in dmfe driver on sending of big packet (linux-2.6.35) Message-ID: <20101130134626.GA1856@lw.yar.ru> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Hello! This patch fixes hang in dmfe driver on attempt of sending a big packet. Without this patch the code stops the queue and never wakes it again. Signed-off-by: Alexander V. Lukyanov --- dmfe.c.1 2010-11-30 16:21:52.758465207 +0300 +++ dmfe.c 2010-11-30 16:24:45.301468601 +0300 @@ -687,18 +687,18 @@ unsigned long flags; DMFE_DBUG(0, "dmfe_start_xmit", 0); - /* Resource flag check */ - netif_stop_queue(dev); - /* Too large packet check */ if (skb->len > MAX_PACKET_SIZE) { pr_err("big packet = %d\n", (u16)skb->len); dev_kfree_skb(skb); return NETDEV_TX_OK; } + /* Resource flag check */ + netif_stop_queue(dev); + spin_lock_irqsave(&db->lock, flags); /* No Tx resource check, it never happen nromally */ if (db->tx_queue_cnt >= TX_FREE_DESC_CNT) {