From patchwork Wed Sep 23 22:02:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Woodhouse X-Patchwork-Id: 521878 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 D10491401DE for ; Thu, 24 Sep 2015 08:02:28 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755689AbbIWWCZ (ORCPT ); Wed, 23 Sep 2015 18:02:25 -0400 Received: from bombadil.infradead.org ([198.137.202.9]:35046 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754112AbbIWWCY (ORCPT ); Wed, 23 Sep 2015 18:02:24 -0400 Received: from i7.infradead.org ([2001:8b0:10b:1:21e:67ff:fecb:7a92]) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1Zes7K-0005Or-Tz; Wed, 23 Sep 2015 22:02:23 +0000 Message-ID: <1443045739.74600.35.camel@infradead.org> Subject: [PATCH] 8139cp: Set GSO max size and enforce it From: David Woodhouse To: David Miller Cc: netdev@vger.kernel.org, romieu@fr.zoreil.com Date: Wed, 23 Sep 2015 23:02:19 +0100 In-Reply-To: <20150923.144808.886375927698238398.davem@davemloft.net> References: <1442996049.36485.32.camel@infradead.org> <20150923.105812.149257816141624869.davem@davemloft.net> <1443037530.74600.29.camel@infradead.org> <20150923.144808.886375927698238398.davem@davemloft.net> X-Mailer: Evolution 3.16.5 (3.16.5-1.fc22) Mime-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The maximum MSS value we can set is 0xFFF. When fixing the TSO code I noticed we just mask the gso_size value to the hardware's maximum and don't care about the consequences. That seems... unsagacious. Instead of masking, WARN and drop the packet if it's too large. And use netif_set_gso_max_size() so it shouldn't happen in the first place. Signed-off-by: David Woodhouse --- drivers/net/ethernet/realtek/8139cp.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c index e5173f3..fa8f850 100644 --- a/drivers/net/ethernet/realtek/8139cp.c +++ b/drivers/net/ethernet/realtek/8139cp.c @@ -754,10 +754,16 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; mss = skb_shinfo(skb)->gso_size; + if (mss > MSSMask) { + WARN_ONCE(1, "Net bug: GSO size %d too large for 8139CP\n", + mss); + goto out_dma_error; + } + opts2 = cpu_to_le32(cp_tx_vlan_tag(skb)); opts1 = DescOwn; if (mss) - opts1 |= LargeSend | ((mss & MSSMask) << MSSShift); + opts1 |= LargeSend | (mss << MSSShift); else if (skb->ip_summed == CHECKSUM_PARTIAL) { const struct iphdr *ip = ip_hdr(skb); if (ip->protocol == IPPROTO_TCP) @@ -1994,6 +2000,8 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO | NETIF_F_HIGHDMA; + netif_set_gso_max_size(dev, MSSMask); + rc = register_netdev(dev); if (rc) goto err_out_iomap;