From patchwork Wed Nov 28 21:20:56 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Gallatin X-Patchwork-Id: 202551 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 BCFC82C0085 for ; Thu, 29 Nov 2012 08:21:23 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932445Ab2K1VVT (ORCPT ); Wed, 28 Nov 2012 16:21:19 -0500 Received: from mail-qc0-f174.google.com ([209.85.216.174]:36839 "EHLO mail-qc0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932388Ab2K1VU7 (ORCPT ); Wed, 28 Nov 2012 16:20:59 -0500 Received: by mail-qc0-f174.google.com with SMTP id o22so10089890qcr.19 for ; Wed, 28 Nov 2012 13:20:59 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :content-type:content-transfer-encoding:x-gm-message-state; bh=B+rDWF9iaVGQPsRmDfIWQ6XJSyLndsLSmRCk/ZIsegA=; b=XddJV+OpdZSHhP0yFzrzO/YkNI7sq4x+cRU1ex0i0RYgbXoxdQlfMTzORCqXtf8s8f OQyItwxxIsPehiHQydOM3tRFfc02DGXSXTjxhcbRP5b59W8k3KwHqOIWrPwS5m50Zvwd HC+vjUnrc0wJVrKC2cnVHgsBpghDeAteMNQqJKiM1y2a4aGOkR93+cP4xF8CssEyfpT4 My6i1JDzx5WOkwRgjDq3BB9H+whL7rvi10aR0mcui9ekR7Xa/bwHmB5GyLq8xFv5vWn4 MD3rDBosVJtYRZaPgrcZ/EqiAIPkOa/fIn/zeyTxiWCt2KfMKHbaFBIvjDctn8htPwMX /haA== Received: by 10.49.29.135 with SMTP id k7mr26218814qeh.39.1354137659242; Wed, 28 Nov 2012 13:20:59 -0800 (PST) Received: from [192.168.200.2] (c-24-125-204-77.hsd1.va.comcast.net. [24.125.204.77]) by mx.google.com with ESMTPS id ga9sm13189138qab.22.2012.11.28.13.20.57 (version=SSLv3 cipher=OTHER); Wed, 28 Nov 2012 13:20:58 -0800 (PST) Message-ID: <50B68038.5000304@myri.com> Date: Wed, 28 Nov 2012 16:20:56 -0500 From: Andrew Gallatin User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: David Miller CC: netdev Subject: [PATCH resend net-next 2/3] myri10ge: Add vlan rx for better GRO perf. X-Gm-Message-State: ALoCoQnArVdmAT4jD2k5ssj0pqUqiRbYNUXcZLwxo7a4yvM4OD8pZHDuCozfYvnACH5E2QVUjuf+ Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Unlike LRO, GRO requires that vlan tags be removed before aggregation can occur. Since the myri10ge NIC does not support hardware vlan tag offload, we must remove the tag in the driver to achieve performance comparable to LRO for vlan tagged frames. Thanks to Eric Duzamet for his help simplifying the original patch. Signed-off-by: Andrew Gallatin --- drivers/net/ethernet/myricom/myri10ge/myri10ge.c | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) napi_gro_frags(&ss->napi); @@ -3854,6 +3890,10 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) netdev->netdev_ops = &myri10ge_netdev_ops; netdev->mtu = myri10ge_initial_mtu; netdev->hw_features = mgp->features | NETIF_F_RXCSUM; + + /* fake NETIF_F_HW_VLAN_RX for good GRO performance */ + netdev->hw_features |= NETIF_F_HW_VLAN_RX; + netdev->features = netdev->hw_features; if (dac_enabled) diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c index a5ab2f2..93ed089 100644 --- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c +++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c @@ -1264,6 +1264,41 @@ myri10ge_unmap_rx_page(struct pci_dev *pdev, } } +/* + * GRO does not support acceleration of tagged vlan frames, and + * this NIC does not support vlan tag offload, so we must pop + * the tag ourselves to be able to achieve GRO performance that + * is comparable to LRO. + */ + +static inline void +myri10ge_vlan_rx(struct net_device *dev, void *addr, struct sk_buff *skb) +{ + u8 *va; + struct vlan_ethhdr *veh; + struct skb_frag_struct *frag; + + va = addr; + va += MXGEFW_PAD; + veh = (struct vlan_ethhdr *) va; + if ((dev->features & (NETIF_F_HW_VLAN_RX)) == NETIF_F_HW_VLAN_RX && + (veh->h_vlan_proto == ntohs(ETH_P_8021Q))) { + /* fixup csum if needed */ + if (skb->ip_summed == CHECKSUM_COMPLETE) + skb->csum = csum_sub(skb->csum, + csum_partial(va + ETH_HLEN, + VLAN_HLEN, 0)); + /* pop tag */ + __vlan_hwaccel_put_tag(skb, ntohs(veh->h_vlan_TCI)); + memmove(va + VLAN_HLEN, va, 2 * ETH_ALEN); + skb->len -= VLAN_HLEN; + skb->data_len -= VLAN_HLEN; + frag = skb_shinfo(skb)->frags; + frag->page_offset += VLAN_HLEN; + skb_frag_size_set(frag, skb_frag_size(frag) - VLAN_HLEN); + } +} + static inline int myri10ge_rx_done(struct myri10ge_slice_state *ss, int len, __wsum csum) { @@ -1329,6 +1364,7 @@ myri10ge_rx_done(struct myri10ge_slice_state *ss, int len, __wsum csum) skb->ip_summed = CHECKSUM_COMPLETE; skb->csum = csum; } + myri10ge_vlan_rx(mgp->dev, va, skb); skb_record_rx_queue(skb, ss - &mgp->ss[0]);