From patchwork Thu Aug 1 05:04:21 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 263918 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 A1EA32C0084 for ; Thu, 1 Aug 2013 15:04:28 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751475Ab3HAFEZ (ORCPT ); Thu, 1 Aug 2013 01:04:25 -0400 Received: from mail-pa0-f47.google.com ([209.85.220.47]:40971 "EHLO mail-pa0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751039Ab3HAFEX (ORCPT ); Thu, 1 Aug 2013 01:04:23 -0400 Received: by mail-pa0-f47.google.com with SMTP id kl13so1695750pab.6 for ; Wed, 31 Jul 2013 22:04:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:subject:from:to:cc:date:in-reply-to:references :content-type:x-mailer:content-transfer-encoding:mime-version; bh=vkrxl9bGSGDfiVYI/6PTijPuhyD0jBurcOKraHdLgWk=; b=Qq3cFT68AnrfZkta98SWR5+l4SY+Ubcrt+P33vBDonYxKhhlgQzJNUwY7sfmV2rfWT xt1SEq57Aq8sWz78pQSlCEfRyPxRsO37vyU3lJ1y1VPo2+pJXuqmBCyg3gg2xXLxwNVi i7yb/jflETFqJZDTldA+H+t6QnaA2A5K8ApkdJVMimxwYk2Yg29A+zQOQIRcuMQ7kN/V zBgTvt1vZtSoC7BIjWtNSoIYGPDEEPtZABt8s21ePE7kVEnNuGXM4qWT7HDjPtiBiKLu pkR+EAxl80QUvUzomNb2qkpzrHeYKzaqJUXOQMCbCRLjXVsK3mR6NokfytxwP3iPUvFj Q8dQ== X-Received: by 10.66.149.198 with SMTP id uc6mr1840194pab.61.1375333463220; Wed, 31 Jul 2013 22:04:23 -0700 (PDT) Received: from [172.26.53.147] ([172.26.53.147]) by mx.google.com with ESMTPSA id ep4sm1535183pbd.35.2013.07.31.22.04.21 for (version=SSLv3 cipher=RC4-SHA bits=128/128); Wed, 31 Jul 2013 22:04:22 -0700 (PDT) Message-ID: <1375333461.10515.133.camel@edumazet-glaptop> Subject: Re: [PATCH 4/4] USBNET: ax88179_178a: enable tso if host supports sg dma From: Eric Dumazet To: Ming Lei Cc: "David S. Miller" , Greg Kroah-Hartman , Oliver Neukum , Freddy Xin , Ben Hutchings , Grant Grundler , netdev@vger.kernel.org, linux-usb@vger.kernel.org Date: Wed, 31 Jul 2013 22:04:21 -0700 In-Reply-To: References: <1375267909-30373-1-git-send-email-ming.lei@canonical.com> <1375267909-30373-5-git-send-email-ming.lei@canonical.com> <1375329066.10515.125.camel@edumazet-glaptop> X-Mailer: Evolution 3.2.3-0ubuntu6 Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Thu, 2013-08-01 at 12:41 +0800, Ming Lei wrote: > From my trace result, lots of linear SKBs are cloned or header-cloned, so > it needs skb copy too. > > Is it normal in xmit path to see cloned SKBs for driver? If not, I can add check > to avoid allocation of 8 bytes header for non-cloned skb. Existing code is not very friendly and very complex. Sure TCP stack does a clone for every skb from socket write queue, but header should be available for pushing 8 bytes. The !skb_cloned(skb) test should be removed if the memmove() is not needed. Could you try following patch ? drivers/net/usb/ax88179_178a.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) Tested-by: Ming Lei --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c index 2bc87e3..e2120d6 100644 --- a/drivers/net/usb/ax88179_178a.c +++ b/drivers/net/usb/ax88179_178a.c @@ -1166,31 +1166,18 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) int frame_size = dev->maxpacket; int mss = skb_shinfo(skb)->gso_size; int headroom; - int tailroom; tx_hdr1 = skb->len; tx_hdr2 = mss; if (((skb->len + 8) % frame_size) == 0) tx_hdr2 |= 0x80008000; /* Enable padding */ - headroom = skb_headroom(skb); - tailroom = skb_tailroom(skb); + headroom = skb_headroom(skb) - 8; - if (!skb_header_cloned(skb) && - !skb_cloned(skb) && - (headroom + tailroom) >= 8) { - if (headroom < 8) { - skb->data = memmove(skb->head + 8, skb->data, skb->len); - skb_set_tail_pointer(skb, skb->len); - } - } else { - struct sk_buff *skb2; - - skb2 = skb_copy_expand(skb, 8, 0, flags); + if ((skb_header_cloned(skb) || headroom < 0) && + pskb_expand_head(skb, headroom < 0 ? 8 : 0, 0, GFP_ATOMIC)) { dev_kfree_skb_any(skb); - skb = skb2; - if (!skb) - return NULL; + return NULL; } skb_push(skb, 4);