From patchwork Thu Jul 24 15:39:11 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kravkov X-Patchwork-Id: 373449 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 8DA581400A3 for ; Fri, 25 Jul 2014 01:40:18 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759425AbaGXPjg (ORCPT ); Thu, 24 Jul 2014 11:39:36 -0400 Received: from mail-wi0-f177.google.com ([209.85.212.177]:38789 "EHLO mail-wi0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759390AbaGXPje (ORCPT ); Thu, 24 Jul 2014 11:39:34 -0400 Received: by mail-wi0-f177.google.com with SMTP id ho1so4192795wib.10 for ; Thu, 24 Jul 2014 08:39:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=DkWdYu3LFO1/z/odtpathGTH588Zqe2Pq4nZXGoMcFA=; b=Zo78mAxo8vpWDuzIVWHtd1Houk+m2T6Y1/tSpyD/n21t29e9hFm5VueB0YfoiFXgjo tzpF9jXsqtIGMpykRxdsHy+imIpSUKyYkjQGkGd7PM2G5sdxatoQ4TCi9PRSTxxzJ0iC z2Q/Ey4LEjaPOLAvQ5wu2ROaYZ/Je3VQHyc8rFd0Xj5Ov5IXmuvlpcbj7VU+6YV0OO2x hHV49fOwY/mLF2KqWxHCO0WS7V8NkGf3BqxpaWs3YdT5k9NaTVVsfwa4C0+lWrtVYEpl TSEeQk1yEVnj+gapFYzcmcoIMJTAkdngrsKOhY1w+R8CjtJLDq9iQYgp+WA5/b8eiB+5 LfhA== X-Received: by 10.194.103.38 with SMTP id ft6mr13301129wjb.18.1406216370206; Thu, 24 Jul 2014 08:39:30 -0700 (PDT) Received: from lb-tlvb-dmitry.il.qlogic.com.com (bzq-140-168-31-228.red.bezeqint.net. [31.168.140.228]) by mx.google.com with ESMTPSA id je3sm3501692wic.11.2014.07.24.08.39.28 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 Jul 2014 08:39:29 -0700 (PDT) From: Dmitry Kravkov X-Google-Original-From: Dmitry Kravkov To: netdev@vger.kernel.org, davem@davemloft.net Cc: ypei@redhat.com, mschmidt@redhat.com, Dmitry Kravkov Subject: [PATCH] bnx2x: fix crash during TSO tunneling Date: Thu, 24 Jul 2014 18:39:11 +0300 Message-Id: <1406216351-3230-1-git-send-email-Dmitry.Kravkov@qlogic.com> X-Mailer: git-send-email 1.9.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When TSO packet is transmitted additional BD w/o mapping is used to describe the packed. The BD needs special handling in tx completion. kernel: Call Trace: kernel: [] dump_stack+0x19/0x1b kernel: [] warn_slowpath_common+0x61/0x80 kernel: [] warn_slowpath_fmt+0x5c/0x80 kernel: [] ? find_iova+0x4d/0x90 kernel: [] intel_unmap_page.part.36+0x142/0x160 kernel: [] intel_unmap_page+0x26/0x30 kernel: [] bnx2x_free_tx_pkt+0x157/0x2b0 [bnx2x] kernel: [] bnx2x_tx_int+0xac/0x220 [bnx2x] kernel: [] ? read_tsc+0x9/0x20 kernel: [] bnx2x_poll+0xbb/0x3c0 [bnx2x] kernel: [] net_rx_action+0x15a/0x250 kernel: [] __do_softirq+0xf7/0x290 kernel: [] call_softirq+0x1c/0x30 kernel: [] do_softirq+0x55/0x90 kernel: [] irq_exit+0x115/0x120 kernel: [] do_IRQ+0x58/0xf0 kernel: [] common_interrupt+0x6d/0x6d kernel: [] ? clockevents_notify+0x127/0x140 kernel: [] ? cpuidle_enter_state+0x4f/0xc0 kernel: [] cpuidle_idle_call+0xc5/0x200 kernel: [] arch_cpu_idle+0xe/0x30 kernel: [] cpu_startup_entry+0xf5/0x290 kernel: [] start_secondary+0x265/0x27b kernel: ---[ end trace 11aa7726f18d7e80 ]--- Reported-by: Yulong Pei Cc: Michal Schmidt Signed-off-by: Dmitry Kravkov --- drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 1 + drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 4cab09d..8206a29 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h @@ -346,6 +346,7 @@ struct sw_tx_bd { u8 flags; /* Set on the first BD descriptor when there is a split BD */ #define BNX2X_TSO_SPLIT_BD (1<<0) +#define BNX2X_HAS_SECOND_PBD (1<<1) }; struct sw_rx_page { diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 4b875da..c43e723 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c @@ -227,6 +227,12 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata, --nbd; bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); + if (tx_buf->flags & BNX2X_HAS_SECOND_PBD) { + /* Skip second parse bd... */ + --nbd; + bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); + } + /* TSO headers+data bds share a common mapping. See bnx2x_tx_split() */ if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) { tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd; @@ -3889,6 +3895,9 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) /* set encapsulation flag in start BD */ SET_FLAG(tx_start_bd->general_data, ETH_TX_START_BD_TUNNEL_EXIST, 1); + + tx_buf->flags |= BNX2X_HAS_SECOND_PBD; + nbd++; } else if (xmit_type & XMIT_CSUM) { /* Set PBD in checksum offload case w/o encapsulation */