From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f66.google.com ([74.125.82.66]:34668 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750790AbcERO7H (ORCPT ); Wed, 18 May 2016 10:59:07 -0400 Received: by mail-wm0-f66.google.com with SMTP id n129so13637736wmn.1 for ; Wed, 18 May 2016 07:59:06 -0700 (PDT) Subject: Re: [patch added to 3.12-stable] netem: Segment GSO packets on enqueue To: Eric Dumazet References: <1463582671-14713-1-git-send-email-jslaby@suse.cz> <1463582671-14713-19-git-send-email-jslaby@suse.cz> <1463583286.18194.116.camel@edumazet-glaptop3.roam.corp.google.com> Cc: stable@vger.kernel.org, Neil Horman , Jamal Hadi Salim , "David S. Miller" , netem@lists.linux-foundation.org, stephen@networkplumber.org From: Jiri Slaby Message-ID: <573C8336.9020507@suse.cz> Date: Wed, 18 May 2016 16:59:02 +0200 MIME-Version: 1.0 In-Reply-To: <1463583286.18194.116.camel@edumazet-glaptop3.roam.corp.google.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: stable-owner@vger.kernel.org List-ID: On 05/18/2016, 04:54 PM, Eric Dumazet wrote: > On Wed, 2016-05-18 at 16:44 +0200, Jiri Slaby wrote: >> From: Neil Horman >> >> This patch has been added to the 3.12 stable tree. If you have any >> objections, please let us know. >> >> =============== >> >> [ Upstream commit 6071bd1aa13ed9e41824bafad845b7b7f4df5cfd ] >> >> This was recently reported to me, and reproduced on the latest net kernel, >> when attempting to run netperf from a host that had a netem qdisc attached >> to the egress interface: >> >> [ 788.073771] ---------------------[ cut here ]--------------------------- >> [ 788.096716] WARNING: at net/core/dev.c:2253 skb_warn_bad_offload+0xcd/0xda() >> [ 788.129521] bnx2: caps=(0x00000001801949b3, 0x0000000000000000) len=2962 >> data_len=0 gso_size=1448 gso_type=1 ip_summed=3 >> [ 788.182150] Modules linked in: sch_netem kvm_amd kvm crc32_pclmul ipmi_ssif >> ghash_clmulni_intel sp5100_tco amd64_edac_mod aesni_intel lrw gf128mul >> glue_helper ablk_helper edac_mce_amd cryptd pcspkr sg edac_core hpilo ipmi_si >> i2c_piix4 k10temp fam15h_power hpwdt ipmi_msghandler shpchp acpi_power_meter >> pcc_cpufreq nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c >> sd_mod crc_t10dif crct10dif_generic mgag200 syscopyarea sysfillrect sysimgblt >> i2c_algo_bit drm_kms_helper ahci ata_generic pata_acpi ttm libahci >> crct10dif_pclmul pata_atiixp tg3 libata crct10dif_common drm crc32c_intel ptp >> serio_raw bnx2 r8169 hpsa pps_core i2c_core mii dm_mirror dm_region_hash dm_log >> dm_mod >> [ 788.465294] CPU: 16 PID: 0 Comm: swapper/16 Tainted: G W >> ------------ 3.10.0-327.el7.x86_64 #1 >> [ 788.511521] Hardware name: HP ProLiant DL385p Gen8, BIOS A28 12/17/2012 >> [ 788.542260] ffff880437c036b8 f7afc56532a53db9 ffff880437c03670 >> ffffffff816351f1 >> [ 788.576332] ffff880437c036a8 ffffffff8107b200 ffff880633e74200 >> ffff880231674000 >> [ 788.611943] 0000000000000001 0000000000000003 0000000000000000 >> ffff880437c03710 >> [ 788.647241] Call Trace: >> [ 788.658817] [] dump_stack+0x19/0x1b >> [ 788.686193] [] warn_slowpath_common+0x70/0xb0 >> [ 788.713803] [] warn_slowpath_fmt+0x5c/0x80 >> [ 788.741314] [] ? ___ratelimit+0x93/0x100 >> [ 788.767018] [] skb_warn_bad_offload+0xcd/0xda >> [ 788.796117] [] skb_checksum_help+0x17c/0x190 >> [ 788.823392] [] netem_enqueue+0x741/0x7c0 [sch_netem] >> [ 788.854487] [] dev_queue_xmit+0x2a8/0x570 >> [ 788.880870] [] ip_finish_output+0x53d/0x7d0 >> ... >> >> The problem occurs because netem is not prepared to handle GSO packets (as it >> uses skb_checksum_help in its enqueue path, which cannot manipulate these >> frames). >> >> The solution I think is to simply segment the skb in a simmilar fashion to the >> way we do in __dev_queue_xmit (via validate_xmit_skb), with some minor changes. >> When we decide to corrupt an skb, if the frame is GSO, we segment it, corrupt >> the first segment, and enqueue the remaining ones. >> >> tested successfully by myself on the latest net kernel, to which this applies >> >> [js] backport to 3.12: no qdisc_qstats_drop yet, update directly > > ... But qdisc_tree_reduce_backlog() was not there in 3.12 Yeah, but I pulled the series from net_41 including the qdisc_tree_reduce_backlog backport. >> + if (nb > 1) >> + qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len); >> + } >> return NET_XMIT_SUCCESS; >> } thanks, -- js suse labs