From patchwork Mon Jan 17 13:39:33 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexey Orishko X-Patchwork-Id: 79172 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 7AC36B70CC for ; Tue, 18 Jan 2011 00:40:25 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752716Ab1AQNkT (ORCPT ); Mon, 17 Jan 2011 08:40:19 -0500 Received: from mail-ew0-f46.google.com ([209.85.215.46]:48852 "EHLO mail-ew0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752029Ab1AQNkQ (ORCPT ); Mon, 17 Jan 2011 08:40:16 -0500 Received: by ewy5 with SMTP id 5so2570061ewy.19 for ; Mon, 17 Jan 2011 05:40:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer; bh=w0Az2hbgOJ9XMWVB6y85vxum5EFHmwHPi3k6KzSN7Tg=; b=d0Z3lMMW7e+ewf/O0PunUEpgX4/hTyMWP/Uur/M+JEr0DBvKmw15q5inUhbjHBLiS7 zfgUIRpg5OxThJyRcH7IK+8sVq+0s4In0By/GxYZRjOvwigpT+zJHc7UoFEkZu95KwM1 WefVVGNebwjmyPvdUbMQYiD9IEP3YojASmJnk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=eJZ/s6zhWgTzCoFZBnfiZ9u6mvJ7FJbTasA50QSv41T1A+CTlhEnu4ydB+fm3ofxAm w4DjDMV8kQ2ktNhHWOnpyFmqi33iRnn0Xi5oQe88+COLYqPEl3X/ROiObNHVf2q6laue Lk3dIBNy/i6MVUHyqszGzsrESttXrt6T6nRVU= Received: by 10.213.33.77 with SMTP id g13mr3645473ebd.86.1295271615068; Mon, 17 Jan 2011 05:40:15 -0800 (PST) Received: from localhost.localdomain ([212.4.57.94]) by mx.google.com with ESMTPS id x54sm3618305eeh.17.2011.01.17.05.40.13 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 17 Jan 2011 05:40:14 -0800 (PST) From: Alexey Orishko To: linux-usb@vger.kernel.org Cc: netdev@vger.kernel.org, davem@davemloft.net, gregkh@suse.de, yauheni.kaliuta@nokia.com, Alexey Orishko Subject: [PATCH] USB CDC NCM: tx_fixup() race condition fix Date: Mon, 17 Jan 2011 14:39:33 +0100 Message-Id: <1295271573-8890-1-git-send-email-alexey.orishko@stericsson.com> X-Mailer: git-send-email 1.7.3.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org - tx_fixup() call be called from either timer callback or from xmit() in usbnet, so spinlock is added to avoid concurrency-related problem. - minor correction due checkpatch warning for some line over 80 chars after previous patch was applied. Signed-off-by: Alexey Orishko --- drivers/net/usb/cdc_ncm.c | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index d776c4a..bf13fa6 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -54,7 +54,7 @@ #include #include -#define DRIVER_VERSION "30-Nov-2010" +#define DRIVER_VERSION "17-Jan-2011" /* CDC NCM subclass 3.2.1 */ #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 @@ -873,9 +873,11 @@ static void cdc_ncm_tx_timeout(unsigned long arg) spin_unlock(&ctx->mtx); - if (restart) + if (restart) { + spin_lock(&ctx->mtx); cdc_ncm_tx_timeout_start(ctx); - else if (ctx->netdev != NULL) + spin_unlock(&ctx->mtx); + } else if (ctx->netdev != NULL) usbnet_start_xmit(NULL, ctx->netdev); } @@ -900,7 +902,6 @@ cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) skb_out = cdc_ncm_fill_tx_frame(ctx, skb); if (ctx->tx_curr_skb != NULL) need_timer = 1; - spin_unlock(&ctx->mtx); /* Start timer, if there is a remaining skb */ if (need_timer) @@ -908,6 +909,8 @@ cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) if (skb_out) dev->net->stats.tx_packets += ctx->tx_curr_frame_num; + + spin_unlock(&ctx->mtx); return skb_out; error: @@ -1021,7 +1024,7 @@ static int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in) (temp > CDC_NCM_MAX_DATAGRAM_SIZE) || (temp < ETH_HLEN)) { pr_debug("invalid frame detected (ignored)" "offset[%u]=%u, length=%u, skb=%p\n", - x, offset, temp, skb_in); + x, offset, temp, skb_in); if (!x) goto error; break;