Netdev List
 help / color / mirror / Atom feed
* Re: [PATCH 3/3] iwlwifi: Load firmware exclusively for Intel WiFi
From: João Paulo Rechi Vita @ 2018-11-10  0:36 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: Kai-Heng Feng, Luca Coelho, Kalle Valo, Emmanuel Grumbach,
	Johannes Berg, David S. Miller, Intel Linux Wireless,
	linux-wireless, Network Development, LKML, linux,
	João Paulo Rechi Vita
In-Reply-To: <83CA40B2-1AF3-49FA-9F94-C84A3C916583@holtmann.org>

[-- Attachment #1: Type: text/plain, Size: 4395 bytes --]

Hello Marcel,

On Thu, Nov 8, 2018 at 11:49 PM Marcel Holtmann <marcel@holtmann.org> wrote:
>
> Hi Joao Paulo,
>
> >>>> I think Canonical were facing some wifi fw load error from some 8260
> >>>> earlier module during the BT still loading the fw.
> >>>> I believe we had later 8260 sku that fixed this issue.
> >>>
> >>> But there are already 8260 that is affected by this bug in the wild.
> >>>
> >>> Search "Bluetooth: hci0: Failed to send firmware data (-38)” and there are lots of user are affected.
> >>
> >> which SKUs are these actually. What are the initial details about the boot loader. For the Bluetooth side, you should be able to grab them from dmesg or by running btmon.
> >>
> >> So I am not in favor of this kind of hack and creating dependencies between drivers. If you only have a hammer, then everything looks like a nail. And this is a massive hammer trying to squash everything. This problem needs to be debugged. And this starts by providing affected SKU information and firmware information. So get the details about the SKU and its Bluetooth and WiFi boot loaders.
> >>
> >
> > I have a Lenovo Yoga 900 which presents this problem and has the same bootloader / firmware information as Kai-Heng already posted:
> >
> > [    5.992426] Bluetooth: Core ver 2.22
> > [    5.992438] Bluetooth: HCI device and connection manager initialized
> > [    5.992442] Bluetooth: HCI socket layer initialized
> > [    5.992444] Bluetooth: L2CAP socket layer initialized
> > [    5.992450] Bluetooth: SCO socket layer initialized
> > [    6.004941] Bluetooth: hci0: Bootloader revision 0.0 build 2 week 52 2014
> > [    6.010922] Bluetooth: hci0: Device revision is 5
> > [    6.010923] Bluetooth: hci0: Secure boot is enabled
> > [    6.010924] Bluetooth: hci0: OTP lock is enabled
> > [    6.010925] Bluetooth: hci0: API lock is enabled
> > [    6.010926] Bluetooth: hci0: Debug lock is disabled
> > [    6.010927] Bluetooth: hci0: Minimum firmware build 1 week 10 2014
> > [    6.014253] bluetooth hci0: firmware: direct-loading firmware intel/ibt-11-5.sfi
> > [    6.014256] Bluetooth: hci0: Found device firmware: intel/ibt-11-5.sfi
> > [    6.613961] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
> > [    6.613966] Bluetooth: BNEP filters: protocol multicast
> > [    6.613974] Bluetooth: BNEP socket layer initialized
> > [    6.983804] Bluetooth: hci0: Failed to send firmware data (-38)
> >
> > And the following product id and revision, from usb-devices:
> >
> > T:  Bus=01 Lev=01 Prnt=01 Port=06 Cnt=02 Dev#=  3 Spd=12  MxCh= 0
> > D:  Ver= 2.00 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs=  1
> > P:  Vendor=8087 ProdID=0a2b Rev=00.01
> > C:  #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
> > I:  If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
> > I:  If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
> >
> > I understand the drawbacks with the approach presented here and lack of clear explanation of the problem, but I can confirm these patches work around the problem on my machine. Is there any extra info or test result I can provide to help debug this? I can also dedicate time to help write a different solution if some guidance is provided.
> >
> > Kai-Heng, did you end up filling a Bugzilla entry for this?
> >
> > Please CC-me on the replies as I'm not receiving emails from linux-bluetooth or linux-wireless anymore.
>
> our hardware teams from the Bluetooth and WiFi side really need to look at this. An inter-dependency between the firmware loading of two otherwise independent drivers is really not what I want to see upstream. However I have no idea which boot loaders are affected or if this is something that might be even possible to be fixed in operational firmware. If you can create a binary btmon trace file with the error happening and getting really every single message from the boot we might get a bit further to understand where it goes wrong.
>

After blacklisting iwlwifi and btusb so they don't get automatically
loaded I started btmon and was able to reproduce the problem by
manually loading the modules with "sudo modprobe iwlwifi & sudo
modprobe btusb". I'm sending the full kernel logs and btsnoop trace
from btmon attached. Let me know if I can provide anything else to
help debug this.

Thanks,

--
João Paulo Rechi Vita
http://about.me/jprvita

[-- Attachment #2: iwlwifi-btusb-firmware-load-concurrency.log --]
[-- Type: text/x-log, Size: 78884 bytes --]

[    0.000000] microcode: microcode updated early to revision 0xc6, date = 2018-04-17
[    0.000000] Linux version 4.19.0+ (jprvita@kiddo) (gcc version 8.2.0 (Debian 8.2.0-8)) #4 SMP Fri Nov 9 14:39:55 PST 2018 ()
[    0.000000] Command line: BOOT_IMAGE=(hd0,gpt3)/boot/vmlinuz-4.19.0+ root=UUID=521e8cd5-f7b4-435d-a68a-40ff1af81d77 rw splash plymouth.ignore-serial-consoles quiet loglevel=2 ostree=/ostree/boot.1/eos/edef2daa2997a53735578d6a840f7a79d32c9cc4bb770e2d62ce8f23f6b58390/0
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x008: 'MPX bounds registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x010: 'MPX CSR'
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: xstate_offset[3]:  832, xstate_sizes[3]:   64
[    0.000000] x86/fpu: xstate_offset[4]:  896, xstate_sizes[4]:   64
[    0.000000] x86/fpu: Enabled xstate features 0x1f, context size is 960 bytes, using 'compacted' format.
[    0.000000] BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x0000000000057fff] usable
[    0.000000] BIOS-e820: [mem 0x0000000000058000-0x0000000000058fff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000059000-0x0000000000085fff] usable
[    0.000000] BIOS-e820: [mem 0x0000000000086000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000707a0fff] usable
[    0.000000] BIOS-e820: [mem 0x00000000707a1000-0x00000000707a1fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000707a2000-0x00000000707cbfff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000707cc000-0x0000000070878fff] usable
[    0.000000] BIOS-e820: [mem 0x0000000070879000-0x0000000071178fff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000071179000-0x000000008738dfff] usable
[    0.000000] BIOS-e820: [mem 0x000000008738e000-0x0000000087d7dfff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000087d7e000-0x0000000087f7dfff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x0000000087f7e000-0x0000000087ffdfff] ACPI data
[    0.000000] BIOS-e820: [mem 0x0000000087ffe000-0x0000000087ffefff] usable
[    0.000000] BIOS-e820: [mem 0x0000000087fff000-0x00000000880fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000088800000-0x000000008b7fffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fd000000-0x00000000fe7fffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000feb00000-0x00000000feb03fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed00000-0x00000000fed00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed10000-0x00000000fed19fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed84000-0x00000000fed84fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffa00000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000002737fffff] usable
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] e820: update [mem 0x6e2b3018-0x6e2c3057] usable ==> usable
[    0.000000] e820: update [mem 0x6e2b3018-0x6e2c3057] usable ==> usable
[    0.000000] extended physical RAM map:
[    0.000000] reserve setup_data: [mem 0x0000000000000000-0x0000000000057fff] usable
[    0.000000] reserve setup_data: [mem 0x0000000000058000-0x0000000000058fff] reserved
[    0.000000] reserve setup_data: [mem 0x0000000000059000-0x0000000000085fff] usable
[    0.000000] reserve setup_data: [mem 0x0000000000086000-0x00000000000fffff] reserved
[    0.000000] reserve setup_data: [mem 0x0000000000100000-0x000000006e2b3017] usable
[    0.000000] reserve setup_data: [mem 0x000000006e2b3018-0x000000006e2c3057] usable
[    0.000000] reserve setup_data: [mem 0x000000006e2c3058-0x00000000707a0fff] usable
[    0.000000] reserve setup_data: [mem 0x00000000707a1000-0x00000000707a1fff] ACPI NVS
[    0.000000] reserve setup_data: [mem 0x00000000707a2000-0x00000000707cbfff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000707cc000-0x0000000070878fff] usable
[    0.000000] reserve setup_data: [mem 0x0000000070879000-0x0000000071178fff] reserved
[    0.000000] reserve setup_data: [mem 0x0000000071179000-0x000000008738dfff] usable
[    0.000000] reserve setup_data: [mem 0x000000008738e000-0x0000000087d7dfff] reserved
[    0.000000] reserve setup_data: [mem 0x0000000087d7e000-0x0000000087f7dfff] ACPI NVS
[    0.000000] reserve setup_data: [mem 0x0000000087f7e000-0x0000000087ffdfff] ACPI data
[    0.000000] reserve setup_data: [mem 0x0000000087ffe000-0x0000000087ffefff] usable
[    0.000000] reserve setup_data: [mem 0x0000000087fff000-0x00000000880fffff] reserved
[    0.000000] reserve setup_data: [mem 0x0000000088800000-0x000000008b7fffff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000fd000000-0x00000000fe7fffff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000feb00000-0x00000000feb03fff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000fed00000-0x00000000fed00fff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000fed10000-0x00000000fed19fff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000fed84000-0x00000000fed84fff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] reserve setup_data: [mem 0x00000000ffa00000-0x00000000ffffffff] reserved
[    0.000000] reserve setup_data: [mem 0x0000000100000000-0x00000002737fffff] usable
[    0.000000] efi: EFI v2.40 by INSYDE Corp.
[    0.000000] efi:  SMBIOS=0x87600000  ESRT=0x87601c18  ACPI 2.0=0x87ffd014  TPMEventLog=0x7118b018 
[    0.000000] secureboot: Secure boot disabled
[    0.000000] SMBIOS 2.8 present.
[    0.000000] DMI: LENOVO 80MK/VIUU4, BIOS C6CN35WW 12/17/2015
[    0.000000] tsc: Detected 2600.000 MHz processor
[    0.000731] tsc: Detected 2592.000 MHz TSC
[    0.000731] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[    0.000733] e820: remove [mem 0x000a0000-0x000fffff] usable
[    0.000740] last_pfn = 0x273800 max_arch_pfn = 0x400000000
[    0.000743] MTRR default type: uncachable
[    0.000744] MTRR fixed ranges enabled:
[    0.000745]   00000-9FFFF write-back
[    0.000745]   A0000-BFFFF uncachable
[    0.000746]   C0000-FFFFF write-protect
[    0.000746] MTRR variable ranges enabled:
[    0.000747]   0 base 0000000000 mask 7C00000000 write-back
[    0.000748]   1 base 0087FFF000 mask 7FFFFFF000 uncachable
[    0.000749]   2 base 0088000000 mask 7FF8000000 uncachable
[    0.000749]   3 base 0090000000 mask 7FF0000000 uncachable
[    0.000750]   4 base 00A0000000 mask 7FE0000000 uncachable
[    0.000750]   5 base 00C0000000 mask 7FC0000000 uncachable
[    0.000751]   6 disabled
[    0.000751]   7 disabled
[    0.000752]   8 disabled
[    0.000752]   9 disabled
[    0.001641] x86/PAT: Configuration [0-7]: WB  WC  UC- UC  WB  WP  UC- WT  
[    0.001798] total RAM covered: 14463M
[    0.001894]  gran_size: 64K 	chunk_size: 64K 	num_reg: 10  	lose cover RAM: 12583164K
[    0.001896]  gran_size: 64K 	chunk_size: 128K 	num_reg: 5  	lose cover RAM: 60K
[    0.001897]  gran_size: 64K 	chunk_size: 256K 	num_reg: 5  	lose cover RAM: 60K
[    0.001897]  gran_size: 64K 	chunk_size: 512K 	num_reg: 5  	lose cover RAM: 60K
[    0.001898]  gran_size: 64K 	chunk_size: 1M 	num_reg: 5  	lose cover RAM: 60K
[    0.001899]  gran_size: 64K 	chunk_size: 2M 	num_reg: 5  	lose cover RAM: 60K
[    0.001900]  gran_size: 64K 	chunk_size: 4M 	num_reg: 5  	lose cover RAM: 60K
[    0.001901]  gran_size: 64K 	chunk_size: 8M 	num_reg: 5  	lose cover RAM: 60K
[    0.001901]  gran_size: 64K 	chunk_size: 16M 	num_reg: 5  	lose cover RAM: 60K
[    0.001902]  gran_size: 64K 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 60K
[    0.001903]  gran_size: 64K 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 60K
[    0.001904]  gran_size: 64K 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 60K
[    0.001904]  gran_size: 64K 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 60K
[    0.001905]  gran_size: 64K 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 60K
[    0.001906]  gran_size: 64K 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 60K
[    0.001907]  gran_size: 64K 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 60K
[    0.001908]  gran_size: 128K 	chunk_size: 128K 	num_reg: 10  	lose cover RAM: 12583164K
[    0.001908]  gran_size: 128K 	chunk_size: 256K 	num_reg: 5  	lose cover RAM: 124K
[    0.001909]  gran_size: 128K 	chunk_size: 512K 	num_reg: 5  	lose cover RAM: 124K
[    0.001910]  gran_size: 128K 	chunk_size: 1M 	num_reg: 5  	lose cover RAM: 124K
[    0.001911]  gran_size: 128K 	chunk_size: 2M 	num_reg: 5  	lose cover RAM: 124K
[    0.001912]  gran_size: 128K 	chunk_size: 4M 	num_reg: 5  	lose cover RAM: 124K
[    0.001912]  gran_size: 128K 	chunk_size: 8M 	num_reg: 5  	lose cover RAM: 124K
[    0.001913]  gran_size: 128K 	chunk_size: 16M 	num_reg: 5  	lose cover RAM: 124K
[    0.001914]  gran_size: 128K 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 124K
[    0.001915]  gran_size: 128K 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 124K
[    0.001915]  gran_size: 128K 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 124K
[    0.001916]  gran_size: 128K 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 124K
[    0.001917]  gran_size: 128K 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 124K
[    0.001918]  gran_size: 128K 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 124K
[    0.001918]  gran_size: 128K 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 124K
[    0.001919]  gran_size: 256K 	chunk_size: 256K 	num_reg: 10  	lose cover RAM: 12583164K
[    0.001920]  gran_size: 256K 	chunk_size: 512K 	num_reg: 5  	lose cover RAM: 252K
[    0.001921]  gran_size: 256K 	chunk_size: 1M 	num_reg: 5  	lose cover RAM: 252K
[    0.001921]  gran_size: 256K 	chunk_size: 2M 	num_reg: 5  	lose cover RAM: 252K
[    0.001922]  gran_size: 256K 	chunk_size: 4M 	num_reg: 5  	lose cover RAM: 252K
[    0.001923]  gran_size: 256K 	chunk_size: 8M 	num_reg: 5  	lose cover RAM: 252K
[    0.001924]  gran_size: 256K 	chunk_size: 16M 	num_reg: 5  	lose cover RAM: 252K
[    0.001924]  gran_size: 256K 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 252K
[    0.001925]  gran_size: 256K 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 252K
[    0.001926]  gran_size: 256K 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 252K
[    0.001927]  gran_size: 256K 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 252K
[    0.001927]  gran_size: 256K 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 252K
[    0.001928]  gran_size: 256K 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 252K
[    0.001929]  gran_size: 256K 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 252K
[    0.001930]  gran_size: 512K 	chunk_size: 512K 	num_reg: 10  	lose cover RAM: 8389116K
[    0.001930]  gran_size: 512K 	chunk_size: 1M 	num_reg: 5  	lose cover RAM: 508K
[    0.001931]  gran_size: 512K 	chunk_size: 2M 	num_reg: 5  	lose cover RAM: 508K
[    0.001932]  gran_size: 512K 	chunk_size: 4M 	num_reg: 5  	lose cover RAM: 508K
[    0.001933]  gran_size: 512K 	chunk_size: 8M 	num_reg: 5  	lose cover RAM: 508K
[    0.001933]  gran_size: 512K 	chunk_size: 16M 	num_reg: 5  	lose cover RAM: 508K
[    0.001934]  gran_size: 512K 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 508K
[    0.001935]  gran_size: 512K 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 508K
[    0.001936]  gran_size: 512K 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 508K
[    0.001936]  gran_size: 512K 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 508K
[    0.001937]  gran_size: 512K 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 508K
[    0.001938]  gran_size: 512K 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 508K
[    0.001939]  gran_size: 512K 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 508K
[    0.001940]  gran_size: 1M 	chunk_size: 1M 	num_reg: 10  	lose cover RAM: 1020K
[    0.001940]  gran_size: 1M 	chunk_size: 2M 	num_reg: 5  	lose cover RAM: 1020K
[    0.001941]  gran_size: 1M 	chunk_size: 4M 	num_reg: 5  	lose cover RAM: 1020K
[    0.001942]  gran_size: 1M 	chunk_size: 8M 	num_reg: 5  	lose cover RAM: 1020K
[    0.001943]  gran_size: 1M 	chunk_size: 16M 	num_reg: 5  	lose cover RAM: 1020K
[    0.001943]  gran_size: 1M 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 1020K
[    0.001944]  gran_size: 1M 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 1020K
[    0.001945]  gran_size: 1M 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 1020K
[    0.001946]  gran_size: 1M 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 1020K
[    0.001946]  gran_size: 1M 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 1020K
[    0.001947]  gran_size: 1M 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 1020K
[    0.001948]  gran_size: 1M 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 1020K
[    0.001949]  gran_size: 2M 	chunk_size: 2M 	num_reg: 9  	lose cover RAM: 2044K
[    0.001949]  gran_size: 2M 	chunk_size: 4M 	num_reg: 5  	lose cover RAM: 2044K
[    0.001950]  gran_size: 2M 	chunk_size: 8M 	num_reg: 5  	lose cover RAM: 2044K
[    0.001951]  gran_size: 2M 	chunk_size: 16M 	num_reg: 5  	lose cover RAM: 2044K
[    0.001952]  gran_size: 2M 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 2044K
[    0.001952]  gran_size: 2M 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 2044K
[    0.001953]  gran_size: 2M 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 2044K
[    0.001954]  gran_size: 2M 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 2044K
[    0.001954]  gran_size: 2M 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 2044K
[    0.001955]  gran_size: 2M 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 2044K
[    0.001956]  gran_size: 2M 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 2044K
[    0.001957]  gran_size: 4M 	chunk_size: 4M 	num_reg: 8  	lose cover RAM: 4092K
[    0.001957]  gran_size: 4M 	chunk_size: 8M 	num_reg: 5  	lose cover RAM: 4092K
[    0.001958]  gran_size: 4M 	chunk_size: 16M 	num_reg: 5  	lose cover RAM: 4092K
[    0.001959]  gran_size: 4M 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 4092K
[    0.001960]  gran_size: 4M 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 4092K
[    0.001960]  gran_size: 4M 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 4092K
[    0.001961]  gran_size: 4M 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 4092K
[    0.001962]  gran_size: 4M 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 4092K
[    0.001963]  gran_size: 4M 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 4092K
[    0.001963]  gran_size: 4M 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 4092K
[    0.001964]  gran_size: 8M 	chunk_size: 8M 	num_reg: 7  	lose cover RAM: 8188K
[    0.001965]  gran_size: 8M 	chunk_size: 16M 	num_reg: 5  	lose cover RAM: 8188K
[    0.001966]  gran_size: 8M 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 8188K
[    0.001966]  gran_size: 8M 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 8188K
[    0.001967]  gran_size: 8M 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 8188K
[    0.001968]  gran_size: 8M 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 8188K
[    0.001969]  gran_size: 8M 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 8188K
[    0.001969]  gran_size: 8M 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 8188K
[    0.001970]  gran_size: 8M 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 8188K
[    0.001971]  gran_size: 16M 	chunk_size: 16M 	num_reg: 6  	lose cover RAM: 16380K
[    0.001972]  gran_size: 16M 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 16380K
[    0.001972]  gran_size: 16M 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 16380K
[    0.001973]  gran_size: 16M 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 16380K
[    0.001974]  gran_size: 16M 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 16380K
[    0.001975]  gran_size: 16M 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 16380K
[    0.001975]  gran_size: 16M 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 16380K
[    0.001976]  gran_size: 16M 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 16380K
[    0.001977]  gran_size: 32M 	chunk_size: 32M 	num_reg: 5  	lose cover RAM: 32764K
[    0.001978]  gran_size: 32M 	chunk_size: 64M 	num_reg: 5  	lose cover RAM: 32764K
[    0.001978]  gran_size: 32M 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 32764K
[    0.001979]  gran_size: 32M 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 32764K
[    0.001980]  gran_size: 32M 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 32764K
[    0.001981]  gran_size: 32M 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 32764K
[    0.001981]  gran_size: 32M 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 32764K
[    0.001982]  gran_size: 64M 	chunk_size: 64M 	num_reg: 4  	lose cover RAM: 65532K
[    0.001983]  gran_size: 64M 	chunk_size: 128M 	num_reg: 5  	lose cover RAM: 65532K
[    0.001984]  gran_size: 64M 	chunk_size: 256M 	num_reg: 6  	lose cover RAM: 65532K
[    0.001984]  gran_size: 64M 	chunk_size: 512M 	num_reg: 7  	lose cover RAM: 65532K
[    0.001985]  gran_size: 64M 	chunk_size: 1G 	num_reg: 8  	lose cover RAM: 65532K
[    0.001986]  gran_size: 64M 	chunk_size: 2G 	num_reg: 8  	lose cover RAM: 65532K
[    0.001987]  gran_size: 128M 	chunk_size: 128M 	num_reg: 3  	lose cover RAM: 131068K
[    0.001987]  gran_size: 128M 	chunk_size: 256M 	num_reg: 3  	lose cover RAM: 131068K
[    0.001988]  gran_size: 128M 	chunk_size: 512M 	num_reg: 3  	lose cover RAM: 131068K
[    0.001989]  gran_size: 128M 	chunk_size: 1G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001990]  gran_size: 128M 	chunk_size: 2G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001990]  gran_size: 256M 	chunk_size: 256M 	num_reg: 3  	lose cover RAM: 131068K
[    0.001991]  gran_size: 256M 	chunk_size: 512M 	num_reg: 3  	lose cover RAM: 131068K
[    0.001992]  gran_size: 256M 	chunk_size: 1G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001993]  gran_size: 256M 	chunk_size: 2G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001994]  gran_size: 512M 	chunk_size: 512M 	num_reg: 3  	lose cover RAM: 131068K
[    0.001994]  gran_size: 512M 	chunk_size: 1G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001995]  gran_size: 512M 	chunk_size: 2G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001996]  gran_size: 1G 	chunk_size: 1G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001997]  gran_size: 1G 	chunk_size: 2G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001997]  gran_size: 2G 	chunk_size: 2G 	num_reg: 3  	lose cover RAM: 131068K
[    0.001998] mtrr_cleanup: can not find optimal value
[    0.001998] please specify mtrr_gran_size/mtrr_chunk_size
[    0.002001] e820: update [mem 0x87fff000-0xffffffff] usable ==> reserved
[    0.002005] last_pfn = 0x87fff max_arch_pfn = 0x400000000
[    0.008972] esrt: Reserving ESRT space from 0x0000000087601c18 to 0x0000000087601c50.
[    0.008979] Scanning 1 areas for low memory corruption
[    0.008981] Base memory trampoline at [(____ptrval____)] 80000 size 24576
[    0.008984] Using GB pages for direct mapping
[    0.008986] BRK [0x1d3401000, 0x1d3401fff] PGTABLE
[    0.008987] BRK [0x1d3402000, 0x1d3402fff] PGTABLE
[    0.008988] BRK [0x1d3403000, 0x1d3403fff] PGTABLE
[    0.009014] BRK [0x1d3404000, 0x1d3404fff] PGTABLE
[    0.009015] BRK [0x1d3405000, 0x1d3405fff] PGTABLE
[    0.009103] BRK [0x1d3406000, 0x1d3406fff] PGTABLE
[    0.009121] BRK [0x1d3407000, 0x1d3407fff] PGTABLE
[    0.009142] BRK [0x1d3408000, 0x1d3408fff] PGTABLE
[    0.009182] BRK [0x1d3409000, 0x1d3409fff] PGTABLE
[    0.009196] BRK [0x1d340a000, 0x1d340afff] PGTABLE
[    0.009234] BRK [0x1d340b000, 0x1d340bfff] PGTABLE
[    0.009284] BRK [0x1d340c000, 0x1d340cfff] PGTABLE
[    0.009335] RAMDISK: [mem 0x3b130000-0x3fffdfff]
[    0.009347] ACPI: Early table checksum verification disabled
[    0.009350] ACPI: RSDP 0x0000000087FFD014 000024 (v02 LENOVO)
[    0.009353] ACPI: XSDT 0x0000000087FE0188 00011C (v01 LENOVO CB-01    00000001      01000013)
[    0.009358] ACPI: FACP 0x0000000087FE5000 0000F4 (v05 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009362] ACPI: DSDT 0x0000000087FBC000 023015 (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009365] ACPI: FACS 0x0000000087F4E000 000040
[    0.009367] ACPI: TCPA 0x0000000087FFC000 000032 (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009370] ACPI: UEFI 0x0000000087FFB000 000236 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009375] ACPI: UEFI 0x0000000087FFA000 000042 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009380] ACPI: SSDT 0x0000000087FF9000 0004B7 (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009382] ACPI: SSDT 0x0000000087FF8000 00004B (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009385] ACPI: TPM2 0x0000000087FF7000 000034 (v03 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009387] ACPI: MSDM 0x0000000087FF6000 000055 (v03 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009389] ACPI: SSDT 0x0000000087FF0000 0052EE (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009392] ACPI: SSDT 0x0000000087FED000 002C4A (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009394] ACPI: DBGP 0x0000000087FEC000 000034 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009396] ACPI: DBG2 0x0000000087FEB000 000054 (v00 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009399] ACPI: SSDT 0x0000000087FEA000 0004C8 (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009401] ACPI: ASF! 0x0000000087FE9000 0000A5 (v32 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009403] ACPI: ASPT 0x0000000087FE8000 000034 (v07 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009406] ACPI: BOOT 0x0000000087FE7000 000028 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009408] ACPI: DBGP 0x0000000087FE6000 000034 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009410] ACPI: HPET 0x0000000087FE4000 000038 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009412] ACPI: LPIT 0x0000000087FE3000 000094 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009415] ACPI: APIC 0x0000000087FE2000 0000BC (v03 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009417] ACPI: MCFG 0x0000000087FE1000 00003C (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009419] ACPI: SSDT 0x0000000087FBB000 0002D4 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009422] ACPI: SSDT 0x0000000087FB8000 002BAE (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009424] ACPI: SSDT 0x0000000087FB7000 00019A (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009426] ACPI: SSDT 0x0000000087FB6000 0006DC (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009429] ACPI: SSDT 0x0000000087FB5000 000B49 (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009431] ACPI: SSDT 0x0000000087FB4000 0004A3 (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009433] ACPI: SSDT 0x0000000087FB3000 000E58 (v02 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009435] ACPI: DMAR 0x0000000087FB2000 000114 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009438] ACPI: FPDT 0x0000000087FB1000 000044 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009440] ACPI: BGRT 0x0000000087FB0000 000038 (v01 LENOVO CB-01    00000001 ACPI 00040000)
[    0.009447] ACPI: Local APIC address 0xfee00000
[    0.009617] No NUMA configuration found
[    0.009618] Faking a node at [mem 0x0000000000000000-0x00000002737fffff]
[    0.009626] NODE_DATA(0) allocated [mem 0x2737d5000-0x2737fffff]
[    0.009779] Zone ranges:
[    0.009780]   DMA      [mem 0x0000000000001000-0x0000000000ffffff]
[    0.009781]   DMA32    [mem 0x0000000001000000-0x00000000ffffffff]
[    0.009782]   Normal   [mem 0x0000000100000000-0x00000002737fffff]
[    0.009783]   Device   empty
[    0.009784] Movable zone start for each node
[    0.009786] Early memory node ranges
[    0.009787]   node   0: [mem 0x0000000000001000-0x0000000000057fff]
[    0.009788]   node   0: [mem 0x0000000000059000-0x0000000000085fff]
[    0.009788]   node   0: [mem 0x0000000000100000-0x00000000707a0fff]
[    0.009789]   node   0: [mem 0x00000000707cc000-0x0000000070878fff]
[    0.009789]   node   0: [mem 0x0000000071179000-0x000000008738dfff]
[    0.009789]   node   0: [mem 0x0000000087ffe000-0x0000000087ffefff]
[    0.009790]   node   0: [mem 0x0000000100000000-0x00000002737fffff]
[    0.009867] Reserved but unavailable: 5656 pages
[    0.009868] Initmem setup node 0 [mem 0x0000000000001000-0x00000002737fffff]
[    0.009869] On node 0 totalpages: 2073064
[    0.009870]   DMA zone: 64 pages used for memmap
[    0.009870]   DMA zone: 21 pages reserved
[    0.009871]   DMA zone: 3972 pages, LIFO batch:0
[    0.009954]   DMA32 zone: 8554 pages used for memmap
[    0.009954]   DMA32 zone: 547428 pages, LIFO batch:63
[    0.021552]   Normal zone: 23776 pages used for memmap
[    0.021552]   Normal zone: 1521664 pages, LIFO batch:63
[    0.050219] Reserving Intel graphics memory at [mem 0x89800000-0x8b7fffff]
[    0.050688] ACPI: PM-Timer IO Port: 0x1808
[    0.050689] ACPI: Local APIC address 0xfee00000
[    0.050695] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[    0.050695] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
[    0.050696] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
[    0.050696] ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1])
[    0.050697] ACPI: LAPIC_NMI (acpi_id[0x05] high edge lint[0x1])
[    0.050697] ACPI: LAPIC_NMI (acpi_id[0x06] high edge lint[0x1])
[    0.050697] ACPI: LAPIC_NMI (acpi_id[0x07] high edge lint[0x1])
[    0.050698] ACPI: LAPIC_NMI (acpi_id[0x08] high edge lint[0x1])
[    0.050730] IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-119
[    0.050731] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[    0.050732] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[    0.050733] ACPI: IRQ0 used by override.
[    0.050734] ACPI: IRQ9 used by override.
[    0.050736] Using ACPI (MADT) for SMP configuration information
[    0.050737] ACPI: HPET id: 0x8086a201 base: 0xfed00000
[    0.050744] smpboot: Allowing 4 CPUs, 0 hotplug CPUs
[    0.050761] PM: Registered nosave memory: [mem 0x00000000-0x00000fff]
[    0.050762] PM: Registered nosave memory: [mem 0x00058000-0x00058fff]
[    0.050763] PM: Registered nosave memory: [mem 0x00086000-0x000fffff]
[    0.050765] PM: Registered nosave memory: [mem 0x6e2b3000-0x6e2b3fff]
[    0.050766] PM: Registered nosave memory: [mem 0x6e2c3000-0x6e2c3fff]
[    0.050767] PM: Registered nosave memory: [mem 0x707a1000-0x707a1fff]
[    0.050767] PM: Registered nosave memory: [mem 0x707a2000-0x707cbfff]
[    0.050768] PM: Registered nosave memory: [mem 0x70879000-0x71178fff]
[    0.050769] PM: Registered nosave memory: [mem 0x8738e000-0x87d7dfff]
[    0.050770] PM: Registered nosave memory: [mem 0x87d7e000-0x87f7dfff]
[    0.050770] PM: Registered nosave memory: [mem 0x87f7e000-0x87ffdfff]
[    0.050771] PM: Registered nosave memory: [mem 0x87fff000-0x880fffff]
[    0.050772] PM: Registered nosave memory: [mem 0x88100000-0x887fffff]
[    0.050772] PM: Registered nosave memory: [mem 0x88800000-0x8b7fffff]
[    0.050773] PM: Registered nosave memory: [mem 0x8b800000-0xdfffffff]
[    0.050773] PM: Registered nosave memory: [mem 0xe0000000-0xefffffff]
[    0.050773] PM: Registered nosave memory: [mem 0xf0000000-0xfcffffff]
[    0.050774] PM: Registered nosave memory: [mem 0xfd000000-0xfe7fffff]
[    0.050774] PM: Registered nosave memory: [mem 0xfe800000-0xfeafffff]
[    0.050775] PM: Registered nosave memory: [mem 0xfeb00000-0xfeb03fff]
[    0.050775] PM: Registered nosave memory: [mem 0xfeb04000-0xfebfffff]
[    0.050775] PM: Registered nosave memory: [mem 0xfec00000-0xfec00fff]
[    0.050776] PM: Registered nosave memory: [mem 0xfec01000-0xfecfffff]
[    0.050776] PM: Registered nosave memory: [mem 0xfed00000-0xfed00fff]
[    0.050776] PM: Registered nosave memory: [mem 0xfed01000-0xfed0ffff]
[    0.050777] PM: Registered nosave memory: [mem 0xfed10000-0xfed19fff]
[    0.050777] PM: Registered nosave memory: [mem 0xfed1a000-0xfed83fff]
[    0.050778] PM: Registered nosave memory: [mem 0xfed84000-0xfed84fff]
[    0.050778] PM: Registered nosave memory: [mem 0xfed85000-0xfedfffff]
[    0.050778] PM: Registered nosave memory: [mem 0xfee00000-0xfee00fff]
[    0.050779] PM: Registered nosave memory: [mem 0xfee01000-0xff9fffff]
[    0.050779] PM: Registered nosave memory: [mem 0xffa00000-0xffffffff]
[    0.050781] [mem 0x8b800000-0xdfffffff] available for PCI devices
[    0.050782] Booting paravirtualized kernel on bare hardware
[    0.050784] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645519600211568 ns
[    0.050793] random: get_random_bytes called from start_kernel+0x99/0x542 with crng_init=0
[    0.050799] setup_percpu: NR_CPUS:8192 nr_cpumask_bits:4 nr_cpu_ids:4 nr_node_ids:1
[    0.050931] percpu: Embedded 47 pages/cpu @(____ptrval____) s155648 r8192 d28672 u524288
[    0.050936] pcpu-alloc: s155648 r8192 d28672 u524288 alloc=1*2097152
[    0.050937] pcpu-alloc: [0] 0 1 2 3 
[    0.050958] Built 1 zonelists, mobility grouping on.  Total pages: 2040649
[    0.050958] Policy zone: Normal
[    0.050959] Kernel command line: BOOT_IMAGE=(hd0,gpt3)/boot/vmlinuz-4.19.0+ root=UUID=521e8cd5-f7b4-435d-a68a-40ff1af81d77 rw splash plymouth.ignore-serial-consoles quiet loglevel=2 ostree=/ostree/boot.1/eos/edef2daa2997a53735578d6a840f7a79d32c9cc4bb770e2d62ce8f23f6b58390/0
[    0.054035] Calgary: detecting Calgary via BIOS EBDA area
[    0.054036] Calgary: Unable to locate Rio Grande table in EBDA - bailing!
[    0.072716] Memory: 7912248K/8292256K available (12300K kernel code, 2676K rwdata, 4316K rodata, 2440K init, 5000K bss, 380008K reserved, 0K cma-reserved)
[    0.072794] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.072798] Kernel/User page tables isolation: enabled
[    0.079834] ftrace: allocating 41001 entries in 161 pages
[    0.093119] rcu: Hierarchical RCU implementation.
[    0.093120] rcu: 	RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=4.
[    0.093120] 	Tasks RCU enabled.
[    0.093121] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.095549] NR_IRQS: 524544, nr_irqs: 1024, preallocated irqs: 16
[    0.095842] Console: colour dummy device 80x25
[    0.095846] console [tty0] enabled
[    0.095862] ACPI: Core revision 20180810
[    0.096235] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635855245 ns
[    0.096265] hpet clockevent registered
[    0.096311] APIC: Switch to symmetric I/O mode setup
[    0.096313] DMAR: Host address width 39
[    0.096314] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.096318] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 7e3ff0505e
[    0.096319] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.096322] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da
[    0.096322] DMAR: RMRR base: 0x00000087c79000 end: 0x00000087c98fff
[    0.096323] DMAR: RMRR base: 0x00000089000000 end: 0x0000008b7fffff
[    0.096324] DMAR: ANDD device: 1 name: \_SB.PCI0.I2C0
[    0.096324] DMAR: ANDD device: 2 name: \_SB.PCI0.I2C1
[    0.096325] DMAR: ANDD device: 4 name: \_SB.PCI0.I2C3
[    0.096326] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.096327] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.096327] DMAR-IR: x2apic is disabled because BIOS sets x2apic opt out bit.
[    0.096328] DMAR-IR: Use 'intremap=no_x2apic_optout' to override the BIOS setting.
[    0.097886] DMAR-IR: Enabled IRQ remapping in xapic mode
[    0.097887] x2apic: IRQ remapping doesn't support X2APIC mode
[    0.101927] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1
[    0.120280] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x255cb6cc5db, max_idle_ns: 440795203504 ns
[    0.120291] Calibrating delay loop (skipped), value calculated using timer frequency.. 5184.00 BogoMIPS (lpj=10368000)
[    0.120292] pid_max: default: 32768 minimum: 301
[    0.123540] Security Framework initialized
[    0.123542] Yama: becoming mindful.
[    0.123571] AppArmor: AppArmor initialized
[    0.124471] Dentry cache hash table entries: 1048576 (order: 11, 8388608 bytes)
[    0.124938] Inode-cache hash table entries: 524288 (order: 10, 4194304 bytes)
[    0.124962] Mount-cache hash table entries: 16384 (order: 5, 131072 bytes)
[    0.124976] Mountpoint-cache hash table entries: 16384 (order: 5, 131072 bytes)
[    0.125167] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
[    0.125168] ENERGY_PERF_BIAS: View and update with x86_energy_perf_policy(8)
[    0.125172] mce: CPU supports 8 MCE banks
[    0.125179] CPU0: Thermal monitoring enabled (TM1)
[    0.125196] process: using mwait in idle threads
[    0.125199] Last level iTLB entries: 4KB 64, 2MB 8, 4MB 8
[    0.125199] Last level dTLB entries: 4KB 64, 2MB 0, 4MB 0, 1GB 4
[    0.125201] Spectre V2 : Spectre mitigation: kernel not compiled with retpoline; no mitigation available!
[    0.125202] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl and seccomp
[    0.129366] Freeing SMP alternatives memory: 36K
[    0.133749] TSC deadline timer enabled
[    0.133753] smpboot: CPU0: Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz (family: 0x6, model: 0x4e, stepping: 0x3)
[    0.133829] Performance Events: PEBS fmt3+, Skylake events, 32-deep LBR, full-width counters, Intel PMU driver.
[    0.133854] ... version:                4
[    0.133855] ... bit width:              48
[    0.133855] ... generic registers:      4
[    0.133856] ... value mask:             0000ffffffffffff
[    0.133856] ... max period:             00007fffffffffff
[    0.133857] ... fixed-purpose events:   3
[    0.133857] ... event mask:             000000070000000f
[    0.133887] rcu: Hierarchical SRCU implementation.
[    0.134675] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter.
[    0.134710] smp: Bringing up secondary CPUs ...
[    0.134766] x86: Booting SMP configuration:
[    0.134767] .... node  #0, CPUs:      #1 #2 #3
[    0.136281] smp: Brought up 1 node, 4 CPUs
[    0.136286] smpboot: Max logical packages: 1
[    0.136287] smpboot: Total of 4 processors activated (20736.00 BogoMIPS)
[    0.140285] devtmpfs: initialized
[    0.140336] x86/mm: Memory block size: 128MB
[    0.140905] PM: Registering ACPI NVS region [mem 0x707a1000-0x707a1fff] (4096 bytes)
[    0.140905] PM: Registering ACPI NVS region [mem 0x87d7e000-0x87f7dfff] (2097152 bytes)
[    0.140905] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.140905] futex hash table entries: 1024 (order: 4, 65536 bytes)
[    0.140905] pinctrl core: initialized pinctrl subsystem
[    0.140905] RTC time: 23:43:00, date: 11/09/18
[    0.140905] NET: Registered protocol family 16
[    0.140905] audit: initializing netlink subsys (disabled)
[    0.140905] audit: type=2000 audit(1541806980.048:1): state=initialized audit_enabled=0 res=1
[    0.140905] cpuidle: using governor ladder
[    0.140905] cpuidle: using governor menu
[    0.140905] Simple Boot Flag at 0x44 set to 0x1
[    0.140905] KVM setup pv remote TLB flush
[    0.140905] ACPI: bus type PCI registered
[    0.140905] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[    0.140905] PCI: MMCONFIG for domain 0000 [bus 00-ff] at [mem 0xe0000000-0xefffffff] (base 0xe0000000)
[    0.140905] PCI: MMCONFIG at [mem 0xe0000000-0xefffffff] reserved in E820
[    0.140905] pmd_set_huge: Cannot satisfy [mem 0xe0000000-0xe0200000] with a huge-page mapping due to MTRR override.
[    0.140905] PCI: Using configuration type 1 for base access
[    0.141225] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.141225] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.141225] ACPI: Added _OSI(Module Device)
[    0.141225] ACPI: Added _OSI(Processor Device)
[    0.141225] ACPI: Added _OSI(3.0 _SCP Extensions)
[    0.141225] ACPI: Added _OSI(Processor Aggregator Device)
[    0.141225] ACPI: Added _OSI(Linux-Dell-Video)
[    0.141225] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
[    0.172607] ACPI: 13 ACPI AML tables successfully acquired and loaded
[    0.181362] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored
[    0.184584] ACPI: Dynamic OEM Table Load:
[    0.184602] ACPI: SSDT 0xFFFF8DE72947D000 000660 (v02 PmRef  Cpu0Ist  00003000 INTL 20121220)
[    0.185064] ACPI: \_PR_.CPU0: _OSC native thermal LVT Acked
[    0.188527] ACPI: Dynamic OEM Table Load:
[    0.188534] ACPI: SSDT 0xFFFF8DE729573400 00037F (v02 PmRef  Cpu0Cst  00003001 INTL 20121220)
[    0.188887] ACPI: Dynamic OEM Table Load:
[    0.188892] ACPI: SSDT 0xFFFF8DE7295C3900 00008E (v02 PmRef  Cpu0Hwp  00003000 INTL 20121220)
[    0.189135] ACPI: Dynamic OEM Table Load:
[    0.189141] ACPI: SSDT 0xFFFF8DE729674C00 000130 (v02 PmRef  HwpLvt   00003000 INTL 20121220)
[    0.192013] ACPI: Dynamic OEM Table Load:
[    0.192020] ACPI: SSDT 0xFFFF8DE729479000 0005AA (v02 PmRef  ApIst    00003000 INTL 20121220)
[    0.192654] ACPI: Dynamic OEM Table Load:
[    0.192660] ACPI: SSDT 0xFFFF8DE729675A00 000119 (v02 PmRef  ApHwp    00003000 INTL 20121220)
[    0.192984] ACPI: Dynamic OEM Table Load:
[    0.192989] ACPI: SSDT 0xFFFF8DE729675800 000119 (v02 PmRef  ApCst    00003000 INTL 20121220)
[    0.197826] ACPI: EC: EC started
[    0.197827] ACPI: EC: interrupt blocked
[    0.200457] ACPI: \_SB_.PCI0.LPCB.H_EC: Used as first EC
[    0.200461] ACPI: \_SB_.PCI0.LPCB.H_EC: GPE=0x50, EC_CMD/EC_SC=0x66, EC_DATA=0x62
[    0.200464] ACPI: \_SB_.PCI0.LPCB.H_EC: Used as boot DSDT EC to handle transactions
[    0.200465] ACPI: Interpreter enabled
[    0.200503] ACPI: (supports S0 S3 S4 S5)
[    0.200503] ACPI: Using IOAPIC for interrupt routing
[    0.200536] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[    0.201454] ACPI: Enabled 9 GPEs in block 00 to 7F
[    0.205342] ACPI: Power Resource [PG00] (on)
[    0.205342] ACPI: Power Resource [PG01] (on)
[    0.205342] ACPI: Power Resource [PG02] (on)
[    0.226117] ACPI: Power Resource [FN00] (off)
[    0.226183] ACPI: Power Resource [FN01] (off)
[    0.226246] ACPI: Power Resource [FN02] (off)
[    0.226313] ACPI: Power Resource [FN03] (off)
[    0.226376] ACPI: Power Resource [FN04] (off)
[    0.227397] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-fe])
[    0.227411] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI]
[    0.230282] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug SHPCHotplug PME AER PCIeCapability LTR]
[    0.232243] PCI host bridge to bus 0000:00
[    0.232245] pci_bus 0000:00: root bus resource [io  0x0000-0x0cf7 window]
[    0.232245] pci_bus 0000:00: root bus resource [io  0x0d00-0xffff window]
[    0.232246] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
[    0.232247] pci_bus 0000:00: root bus resource [mem 0x000c0000-0x000c3fff window]
[    0.232248] pci_bus 0000:00: root bus resource [mem 0x000c4000-0x000c7fff window]
[    0.232248] pci_bus 0000:00: root bus resource [mem 0x000c8000-0x000cbfff window]
[    0.232249] pci_bus 0000:00: root bus resource [mem 0x000cc000-0x000cffff window]
[    0.232250] pci_bus 0000:00: root bus resource [mem 0x000d0000-0x000d3fff window]
[    0.232250] pci_bus 0000:00: root bus resource [mem 0x000d4000-0x000d7fff window]
[    0.232251] pci_bus 0000:00: root bus resource [mem 0x000d8000-0x000dbfff window]
[    0.232252] pci_bus 0000:00: root bus resource [mem 0x000dc000-0x000dffff window]
[    0.232252] pci_bus 0000:00: root bus resource [mem 0x8b800000-0xdfffffff window]
[    0.232253] pci_bus 0000:00: root bus resource [mem 0xfd000000-0xfe7fffff window]
[    0.232254] pci_bus 0000:00: root bus resource [bus 00-fe]
[    0.232262] pci 0000:00:00.0: [8086:1904] type 00 class 0x060000
[    0.233192] pci 0000:00:02.0: [8086:1916] type 00 class 0x030000
[    0.233200] pci 0000:00:02.0: reg 0x10: [mem 0xa0000000-0xa0ffffff 64bit]
[    0.233205] pci 0000:00:02.0: reg 0x18: [mem 0x90000000-0x9fffffff 64bit pref]
[    0.233208] pci 0000:00:02.0: reg 0x20: [io  0x3000-0x303f]
[    0.233220] pci 0000:00:02.0: BAR 2: assigned to efifb
[    0.233919] pci 0000:00:04.0: [8086:1903] type 00 class 0x118000
[    0.233930] pci 0000:00:04.0: reg 0x10: [mem 0xa1220000-0xa1227fff 64bit]
[    0.234712] pci 0000:00:14.0: [8086:9d2f] type 00 class 0x0c0330
[    0.234733] pci 0000:00:14.0: reg 0x10: [mem 0xa1200000-0xa120ffff 64bit]
[    0.234802] pci 0000:00:14.0: PME# supported from D3hot D3cold
[    0.235515] pci 0000:00:14.2: [8086:9d31] type 00 class 0x118000
[    0.235536] pci 0000:00:14.2: reg 0x10: [mem 0xa1232000-0xa1232fff 64bit]
[    0.236365] pci 0000:00:15.0: [8086:9d60] type 00 class 0x118000
[    0.236628] pci 0000:00:15.0: reg 0x10: [mem 0xa1233000-0xa1233fff 64bit]
[    0.238247] pci 0000:00:15.1: [8086:9d61] type 00 class 0x118000
[    0.238510] pci 0000:00:15.1: reg 0x10: [mem 0xa1234000-0xa1234fff 64bit]
[    0.240115] pci 0000:00:15.3: [8086:9d63] type 00 class 0x118000
[    0.244365] pci 0000:00:15.3: reg 0x10: [mem 0xa1235000-0xa1235fff 64bit]
[    0.245899] pci 0000:00:16.0: [8086:9d3a] type 00 class 0x078000
[    0.245925] pci 0000:00:16.0: reg 0x10: [mem 0xa1236000-0xa1236fff 64bit]
[    0.246001] pci 0000:00:16.0: PME# supported from D3hot
[    0.246732] pci 0000:00:17.0: [8086:9d03] type 00 class 0x010601
[    0.246749] pci 0000:00:17.0: reg 0x10: [mem 0xa1230000-0xa1231fff]
[    0.246756] pci 0000:00:17.0: reg 0x14: [mem 0xa1239000-0xa12390ff]
[    0.246763] pci 0000:00:17.0: reg 0x18: [io  0x3080-0x3087]
[    0.246770] pci 0000:00:17.0: reg 0x1c: [io  0x3088-0x308b]
[    0.246777] pci 0000:00:17.0: reg 0x20: [io  0x3060-0x307f]
[    0.246784] pci 0000:00:17.0: reg 0x24: [mem 0xa1237000-0xa12377ff]
[    0.246828] pci 0000:00:17.0: PME# supported from D3hot
[    0.247550] pci 0000:00:1c.0: [8086:9d14] type 01 class 0x060400
[    0.247636] pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold
[    0.248410] pci 0000:00:1c.5: [8086:9d15] type 01 class 0x060400
[    0.248496] pci 0000:00:1c.5: PME# supported from D0 D3hot D3cold
[    0.249260] pci 0000:00:1f.0: [8086:9d48] type 00 class 0x060100
[    0.250073] pci 0000:00:1f.2: [8086:9d21] type 00 class 0x058000
[    0.250088] pci 0000:00:1f.2: reg 0x10: [mem 0xa122c000-0xa122ffff]
[    0.250850] pci 0000:00:1f.3: [8086:9d70] type 00 class 0x040300
[    0.250878] pci 0000:00:1f.3: reg 0x10: [mem 0xa1228000-0xa122bfff 64bit]
[    0.250910] pci 0000:00:1f.3: reg 0x20: [mem 0xa1210000-0xa121ffff 64bit]
[    0.250963] pci 0000:00:1f.3: PME# supported from D3hot D3cold
[    0.251714] pci 0000:00:1f.4: [8086:9d23] type 00 class 0x0c0500
[    0.251774] pci 0000:00:1f.4: reg 0x10: [mem 0xa1238000-0xa12380ff 64bit]
[    0.251845] pci 0000:00:1f.4: reg 0x20: [io  0x3040-0x305f]
[    0.252916] pci 0000:01:00.0: [8086:24f3] type 00 class 0x028000
[    0.253015] pci 0000:01:00.0: reg 0x10: [mem 0xa1100000-0xa1101fff 64bit]
[    0.253302] pci 0000:01:00.0: PME# supported from D0 D3hot D3cold
[    0.253419] pci 0000:01:00.0: 2.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x1 link at 0000:00:1c.0 (capable of 7.876 Gb/s with 8 GT/s x1 link)
[    0.253951] pci 0000:00:1c.0: PCI bridge to [bus 01]
[    0.253955] pci 0000:00:1c.0:   bridge window [mem 0xa1100000-0xa11fffff]
[    0.255833] pci 0000:02:00.0: [1217:8620] type 00 class 0x080501
[    0.255862] pci 0000:02:00.0: reg 0x10: [mem 0xa1001000-0xa1001fff]
[    0.255873] pci 0000:02:00.0: reg 0x14: [mem 0xa1000000-0xa10007ff]
[    0.256003] pci 0000:02:00.0: PME# supported from D3hot D3cold
[    0.256052] pci 0000:02:00.0: 2.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x1 link at 0000:00:1c.5 (capable of 7.876 Gb/s with 8 GT/s x1 link)
[    0.266132] pci 0000:00:1c.5: PCI bridge to [bus 02]
[    0.266136] pci 0000:00:1c.5:   bridge window [mem 0xa1000000-0xa10fffff]
[    0.269532] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 10 *11 12 14 15)
[    0.269605] ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 6 *10 11 12 14 15)
[    0.269675] ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 6 10 *11 12 14 15)
[    0.269746] ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 10 *11 12 14 15)
[    0.269816] ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 10 *11 12 14 15)
[    0.269886] ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 10 *11 12 14 15)
[    0.269956] ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 10 *11 12 14 15)
[    0.270026] ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 10 *11 12 14 15)
[    0.270324] platform MSFT0101:00: failed to claim resource 1: [mem 0xfed40000-0xfed40fff]
[    0.270325] acpi MSFT0101:00: platform device creation failed: -16
[    0.271016] ACPI Warning: GPE type mismatch (level/edge) (20180810/evxface-792)
[    0.271018] ACPI: EC: interrupt unblocked
[    0.271035] ACPI: EC: event unblocked
[    0.271070] ACPI: \_SB_.PCI0.LPCB.H_EC: GPE=0x50, EC_CMD/EC_SC=0x66, EC_DATA=0x62
[    0.271071] ACPI: \_SB_.PCI0.LPCB.H_EC: Used as boot DSDT EC to handle transactions and events
[    0.271367] SCSI subsystem initialized
[    0.271376] libata version 3.00 loaded.
[    0.271376] pci 0000:00:02.0: vgaarb: setting as boot VGA device
[    0.271376] pci 0000:00:02.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none
[    0.271376] pci 0000:00:02.0: vgaarb: bridge control possible
[    0.271376] vgaarb: loaded
[    0.271376] ACPI: bus type USB registered
[    0.271376] usbcore: registered new interface driver usbfs
[    0.271376] usbcore: registered new interface driver hub
[    0.271376] usbcore: registered new device driver usb
[    0.271376] pps_core: LinuxPPS API ver. 1 registered
[    0.271376] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.271376] PTP clock support registered
[    0.271376] EDAC MC: Ver: 3.0.0
[    0.272318] Registered efivars operations
[    0.320696] PCI: Using ACPI for IRQ routing
[    0.346140] PCI: pci_cache_line_size set to 64 bytes
[    0.350316] e820: reserve RAM buffer [mem 0x00058000-0x0005ffff]
[    0.350317] e820: reserve RAM buffer [mem 0x00086000-0x0008ffff]
[    0.350318] e820: reserve RAM buffer [mem 0x6e2b3018-0x6fffffff]
[    0.350318] e820: reserve RAM buffer [mem 0x707a1000-0x73ffffff]
[    0.350319] e820: reserve RAM buffer [mem 0x70879000-0x73ffffff]
[    0.350320] e820: reserve RAM buffer [mem 0x8738e000-0x87ffffff]
[    0.350320] e820: reserve RAM buffer [mem 0x87fff000-0x87ffffff]
[    0.350321] e820: reserve RAM buffer [mem 0x273800000-0x273ffffff]
[    0.352282] NetLabel: Initializing
[    0.352282] NetLabel:  domain hash size = 128
[    0.352282] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
[    0.352282] NetLabel:  unlabeled traffic allowed by default
[    0.352391] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0, 0, 0, 0, 0, 0
[    0.352395] hpet0: 8 comparators, 64-bit 24.000000 MHz counter
[    0.356286] clocksource: Switched to clocksource tsc-early
[    0.366161] VFS: Disk quotas dquot_6.6.0
[    0.366194] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    0.366287] AppArmor: AppArmor Filesystem Enabled
[    0.366312] pnp: PnP ACPI init
[    0.366531] system 00:00: [mem 0xfd000000-0xfdabffff] has been reserved
[    0.366532] system 00:00: [mem 0xfdad0000-0xfdadffff] has been reserved
[    0.366533] system 00:00: [mem 0xfdb00000-0xfdffffff] has been reserved
[    0.366534] system 00:00: [mem 0xfe000000-0xfe01ffff] has been reserved
[    0.366535] system 00:00: [mem 0xfe036000-0xfe03bfff] has been reserved
[    0.366536] system 00:00: [mem 0xfe03d000-0xfe3fffff] has been reserved
[    0.366537] system 00:00: [mem 0xfe410000-0xfe7fffff] has been reserved
[    0.366540] system 00:00: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.366823] system 00:01: [io  0x2000-0x20fe] has been reserved
[    0.366825] system 00:01: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.366935] system 00:02: [io  0x06a4] has been reserved
[    0.366936] system 00:02: [io  0x06a0] has been reserved
[    0.366938] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.367123] system 00:03: [io  0x0680-0x069f] has been reserved
[    0.367124] system 00:03: [io  0xffff] has been reserved
[    0.367125] system 00:03: [io  0xffff] has been reserved
[    0.367125] system 00:03: [io  0xffff] has been reserved
[    0.367126] system 00:03: [io  0x1800-0x18fe] has been reserved
[    0.367127] system 00:03: [io  0x164e-0x164f] has been reserved
[    0.367129] system 00:03: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.367216] pnp 00:04: Plug and Play ACPI device, IDs PNP0b00 (active)
[    0.367246] system 00:05: [io  0x1854-0x1857] has been reserved
[    0.367248] system 00:05: Plug and Play ACPI device, IDs INT3f0d PNP0c02 (active)
[    0.367269] pnp 00:06: Plug and Play ACPI device, IDs PNP0303 (active)
[    0.368378] system 00:07: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.368848] system 00:08: [mem 0xfed10000-0xfed17fff] has been reserved
[    0.368849] system 00:08: [mem 0xfed18000-0xfed18fff] has been reserved
[    0.368850] system 00:08: [mem 0xfed19000-0xfed19fff] has been reserved
[    0.368851] system 00:08: [mem 0xe0000000-0xefffffff] has been reserved
[    0.368852] system 00:08: [mem 0xfed20000-0xfed3ffff] has been reserved
[    0.368853] system 00:08: [mem 0xfed90000-0xfed93fff] could not be reserved
[    0.368854] system 00:08: [mem 0xfed45000-0xfed8ffff] could not be reserved
[    0.368855] system 00:08: [mem 0xff000000-0xffffffff] could not be reserved
[    0.368856] system 00:08: [mem 0xfee00000-0xfeefffff] could not be reserved
[    0.368857] system 00:08: [mem 0x8b800000-0x8b81ffff] has been reserved
[    0.368859] system 00:08: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.369536] pnp: PnP ACPI: found 9 devices
[    0.375078] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.375100] pci 0000:00:1c.0: PCI bridge to [bus 01]
[    0.375112] pci 0000:00:1c.0:   bridge window [mem 0xa1100000-0xa11fffff]
[    0.375118] pci 0000:00:1c.5: PCI bridge to [bus 02]
[    0.375121] pci 0000:00:1c.5:   bridge window [mem 0xa1000000-0xa10fffff]
[    0.375128] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7 window]
[    0.375129] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff window]
[    0.375129] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
[    0.375130] pci_bus 0000:00: resource 7 [mem 0x000c0000-0x000c3fff window]
[    0.375131] pci_bus 0000:00: resource 8 [mem 0x000c4000-0x000c7fff window]
[    0.375131] pci_bus 0000:00: resource 9 [mem 0x000c8000-0x000cbfff window]
[    0.375132] pci_bus 0000:00: resource 10 [mem 0x000cc000-0x000cffff window]
[    0.375133] pci_bus 0000:00: resource 11 [mem 0x000d0000-0x000d3fff window]
[    0.375134] pci_bus 0000:00: resource 12 [mem 0x000d4000-0x000d7fff window]
[    0.375134] pci_bus 0000:00: resource 13 [mem 0x000d8000-0x000dbfff window]
[    0.375135] pci_bus 0000:00: resource 14 [mem 0x000dc000-0x000dffff window]
[    0.375136] pci_bus 0000:00: resource 15 [mem 0x8b800000-0xdfffffff window]
[    0.375137] pci_bus 0000:00: resource 16 [mem 0xfd000000-0xfe7fffff window]
[    0.375138] pci_bus 0000:01: resource 1 [mem 0xa1100000-0xa11fffff]
[    0.375138] pci_bus 0000:02: resource 1 [mem 0xa1000000-0xa10fffff]
[    0.375284] NET: Registered protocol family 2
[    0.375395] tcp_listen_portaddr_hash hash table entries: 4096 (order: 4, 65536 bytes)
[    0.375415] TCP established hash table entries: 65536 (order: 7, 524288 bytes)
[    0.375487] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[    0.375593] TCP: Hash tables configured (established 65536 bind 65536)
[    0.375618] UDP hash table entries: 4096 (order: 5, 131072 bytes)
[    0.375635] UDP-Lite hash table entries: 4096 (order: 5, 131072 bytes)
[    0.375695] NET: Registered protocol family 1
[    0.375699] NET: Registered protocol family 44
[    0.375707] pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff]
[    0.381296] PCI: CLS 64 bytes, default 64
[    0.381323] Unpacking initramfs...
[    1.456491] Freeing initrd memory: 80696K
[    1.456546] DMAR: ACPI device "device:6b" under DMAR at fed91000 as 00:15.0
[    1.456549] DMAR: ACPI device "device:6c" under DMAR at fed91000 as 00:15.1
[    1.456551] DMAR: ACPI device "device:6d" under DMAR at fed91000 as 00:15.3
[    1.476332] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
[    1.476334] software IO TLB: mapped [mem 0x82eac000-0x86eac000] (64MB)
[    1.476472] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x255cb6cc5db, max_idle_ns: 440795203504 ns
[    1.476482] clocksource: Switched to clocksource tsc
[    1.476549] Scanning for low memory corruption every 60 seconds
[    1.477126] Initialise system trusted keyrings
[    1.477132] Key type blacklist registered
[    1.477155] workingset: timestamp_bits=35 max_order=21 bucket_order=0
[    1.478255] zbud: loaded
[    1.478552] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    1.478712] fuse init (API version 7.27)
[    1.478762] pstore: using deflate compression
[    1.479670] Key type asymmetric registered
[    1.479671] Asymmetric key parser 'x509' registered
[    1.479677] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 243)
[    1.479701] io scheduler noop registered
[    1.479702] io scheduler deadline registered
[    1.479723] io scheduler cfq registered (default)
[    1.480334] pcieport 0000:00:1c.0: Signaling PME with IRQ 122
[    1.480353] pcieport 0000:00:1c.5: Signaling PME with IRQ 123
[    1.480380] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[    1.480424] efifb: probing for efifb
[    1.480457] efifb: framebuffer at 0x90000000, using 22500k, total 22500k
[    1.480458] efifb: mode is 3200x1800x32, linelength=12800, pages=1
[    1.480458] efifb: scrolling: redraw
[    1.480459] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
[    1.489536] Console: switching to colour frame buffer device 400x112
[    1.498178] fb0: EFI VGA frame buffer device
[    1.498184] intel_idle: MWAIT substates: 0x11142120
[    1.498185] intel_idle: v0.4.1 model 0x4E
[    1.498355] intel_idle: lapic_timer_reliable_states 0xffffffff
[    1.498460] ACPI: AC Adapter [ADP1] (on-line)
[    1.498509] input: Lid Switch as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:18/PNP0C09:00/PNP0C0D:00/input/input0
[    1.498514] ACPI: Lid Switch [LID0]
[    1.498545] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
[    1.498553] ACPI: Power Button [PWRB]
[    1.498576] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
[    1.498580] ACPI: Power Button [PWRF]
[    1.499841] thermal LNXTHERM:00: registered as thermal_zone0
[    1.499842] ACPI: Thermal Zone [TZ00] (28 C)
[    1.499974] thermal LNXTHERM:01: registered as thermal_zone1
[    1.499974] ACPI: Thermal Zone [TZ01] (30 C)
[    1.500114] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
[    1.506877] Linux agpgart interface v0.103
[    1.517072] battery: ACPI: Battery Slot [BAT1] (battery present)
[    1.533298] loop: module loaded
[    1.533417] libphy: Fixed MDIO Bus: probed
[    1.533418] tun: Universal TUN/TAP device driver, 1.6
[    1.533435] PPP generic driver version 2.4.2
[    1.533459] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.533460] ehci-pci: EHCI PCI platform driver
[    1.533466] ehci-platform: EHCI generic platform driver
[    1.533472] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    1.533473] ohci-pci: OHCI PCI platform driver
[    1.533478] ohci-platform: OHCI generic platform driver
[    1.533482] uhci_hcd: USB Universal Host Controller Interface driver
[    1.533631] xhci_hcd 0000:00:14.0: xHCI Host Controller
[    1.533635] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 1
[    1.534704] xhci_hcd 0000:00:14.0: hcc params 0x200077c1 hci version 0x100 quirks 0x0000000001109810
[    1.534709] xhci_hcd 0000:00:14.0: cache line size of 64 is not supported
[    1.534864] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19
[    1.534865] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.534865] usb usb1: Product: xHCI Host Controller
[    1.534866] usb usb1: Manufacturer: Linux 4.19.0+ xhci-hcd
[    1.534867] usb usb1: SerialNumber: 0000:00:14.0
[    1.534936] hub 1-0:1.0: USB hub found
[    1.534954] hub 1-0:1.0: 12 ports detected
[    1.535898] xhci_hcd 0000:00:14.0: xHCI Host Controller
[    1.535901] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 2
[    1.535908] xhci_hcd 0000:00:14.0: Host supports USB 3.0  SuperSpeed
[    1.535933] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 4.19
[    1.535934] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.535935] usb usb2: Product: xHCI Host Controller
[    1.535935] usb usb2: Manufacturer: Linux 4.19.0+ xhci-hcd
[    1.535936] usb usb2: SerialNumber: 0000:00:14.0
[    1.535991] hub 2-0:1.0: USB hub found
[    1.536005] hub 2-0:1.0: 6 ports detected
[    1.536426] usb: port power management may be unreliable
[    1.536623] i8042: PNP: PS/2 Controller [PNP0303:PS2K] at 0x60,0x64 irq 1
[    1.536623] i8042: PNP: PS/2 appears to have AUX port disabled, if this is incorrect please boot with i8042.nopnp
[    1.537820] serio: i8042 KBD port at 0x60,0x64 irq 1
[    1.537874] mousedev: PS/2 mouse device common for all mice
[    1.538223] rtc_cmos 00:04: RTC can wake from S4
[    1.538696] rtc_cmos 00:04: registered as rtc0
[    1.538705] rtc_cmos 00:04: alarms up to one month, y3k, 242 bytes nvram, hpet irqs
[    1.538709] i2c /dev entries driver
[    1.538711] pcie_mp2_amd: AMD(R) PCI-E MP2 Communication Driver Version: 1.0
[    1.538755] device-mapper: uevent: version 1.0.3
[    1.538793] device-mapper: ioctl: 4.39.0-ioctl (2018-04-03) initialised: dm-devel@redhat.com
[    1.538795] intel_pstate: Intel P-state driver initializing
[    1.539194] intel_pstate: HWP enabled
[    1.539248] ledtrig-cpu: registered to indicate activity on CPUs
[    1.539249] EFI Variables Facility v0.08 2004-May-17
[    1.544121] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input3
[    1.592207] intel_pmc_core:  initialized
[    1.592399] NET: Registered protocol family 10
[    1.595246] Segment Routing with IPv6
[    1.595260] NET: Registered protocol family 17
[    1.595283] Key type dns_resolver registered
[    1.595469] RAS: Correctable Errors collector initialized.
[    1.595496] microcode: sig=0x406e3, pf=0x80, revision=0xc6
[    1.595554] microcode: Microcode Update Driver: v2.2.
[    1.595561] sched_clock: Marking stable (1599092352, -3540415)->(1604066537, -8514600)
[    1.595738] registered taskstats version 1
[    1.595754] Loading compiled-in X.509 certificates
[    1.596303] Loaded X.509 cert 'Build time autogenerated kernel key: 4fc05165812af47c01c7f445c9f9dc3e351572bf'
[    1.597990] Loaded UEFI:db cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53' linked to secondary sys keyring
[    1.598003] Loaded UEFI:db cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4' linked to secondary sys keyring
[    1.598015] Loaded UEFI:db cert 'C6Yoga4Pro: 8107c1c2cff21084453dd65a8bd9cec3' linked to secondary sys keyring
[    1.599102] zswap: loaded using pool lzo/zbud
[    1.601395] Key type big_key registered
[    1.601397] Key type trusted registered
[    1.602369] Key type encrypted registered
[    1.602371] AppArmor: AppArmor sha1 policy hashing enabled
[    1.602380] ima: Allocated hash algorithm: sha1
[    1.644733] evm: Initialising EVM extended attributes:
[    1.644733] evm: security.selinux
[    1.644734] evm: security.SMACK64
[    1.644734] evm: security.SMACK64EXEC
[    1.644734] evm: security.SMACK64TRANSMUTE
[    1.644735] evm: security.SMACK64MMAP
[    1.644735] evm: security.apparmor
[    1.644735] evm: security.ima
[    1.644736] evm: security.capability
[    1.644736] evm: HMAC attrs: 0x1
[    1.645606]   Magic number: 10:831:756
[    1.645620] tty ttyS7: hash matches
[    1.645808] rtc_cmos 00:04: setting system clock to 2018-11-09 23:43:02 UTC (1541806982)
[    1.864490] Freeing unused decrypted memory: 2040K
[    1.868325] usb 1-6: new high-speed USB device number 2 using xhci_hcd
[    2.049373] usb 1-6: New USB device found, idVendor=0bda, idProduct=57e1, bcdDevice= 0.07
[    2.049374] usb 1-6: New USB device strings: Mfr=3, Product=1, SerialNumber=2
[    2.049375] usb 1-6: Product: Lenovo EasyCamera
[    2.049376] usb 1-6: Manufacturer: J9ZFC96XD
[    2.049376] usb 1-6: SerialNumber: 200901010001
[    2.125788] Freeing unused kernel image memory: 2440K
[    2.132291] Write protecting the kernel read-only data: 20480k
[    2.133315] Freeing unused kernel image memory: 2008K
[    2.133625] Freeing unused kernel image memory: 1828K
[    2.141619] x86/mm: Checked W+X mappings: passed, no W+X pages found.
[    2.141620] x86/mm: Checking user space page tables
[    2.144621] usb 2-2: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd
[    2.148744] x86/mm: Checked W+X mappings: passed, no W+X pages found.
[    2.148745] Run /init as init process
[    2.173078] usb 2-2: New USB device found, idVendor=8564, idProduct=1000, bcdDevice=11.00
[    2.173093] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    2.173094] usb 2-2: Product: Mass Storage Device
[    2.173095] usb 2-2: Manufacturer: JetFlash
[    2.173096] usb 2-2: SerialNumber: 03BBD3F40H4B4KS2
[    2.236867] systemd[1]: systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid)
[    2.256670] systemd[1]: Detected architecture x86-64.
[    2.256673] systemd[1]: Running in initial RAM disk.
[    2.259151] systemd[1]: Set hostname to <endless>.
[    2.274720] random: systemd: uninitialized urandom read (16 bytes read)
[    2.274728] systemd[1]: Reached target Slices.
[    2.274770] random: systemd: uninitialized urandom read (16 bytes read)
[    2.274775] systemd[1]: Reached target Local File Systems.
[    2.274780] random: systemd: uninitialized urandom read (16 bytes read)
[    2.274784] systemd[1]: Reached target Timers.
[    2.274850] systemd[1]: Listening on udev Control Socket.
[    2.274909] systemd[1]: Listening on Journal Socket (/dev/log).
[    2.274974] systemd[1]: Listening on Journal Audit Socket.
[    2.292298] usb 1-7: new full-speed USB device number 3 using xhci_hcd
[    2.365539] hidraw: raw HID events driver (C) Jiri Kosina
[    2.376902] sdhci: Secure Digital Host Controller Interface driver
[    2.376904] sdhci: Copyright(c) Pierre Ossman
[    2.382351] ahci 0000:00:17.0: version 3.0
[    2.382622] ahci 0000:00:17.0: AHCI 0001.0301 32 slots 1 ports 6 Gbps 0x4 impl SATA mode
[    2.382624] ahci 0000:00:17.0: flags: 64bit ncq pm led clo only pio slum part deso sadm sds apst 
[    2.388304] scsi host0: ahci
[    2.388444] scsi host1: ahci
[    2.388541] scsi host2: ahci
[    2.388589] ata1: DUMMY
[    2.388589] ata2: DUMMY
[    2.388596] ata3: SATA max UDMA/133 abar m2048@0xa1237000 port 0xa1237200 irq 125
[    2.393105] sdhci-pci 0000:02:00.0: SDHCI controller found [1217:8620] (rev 1)
[    2.395129] mmc0: Unknown controller version (3). You may experience problems.
[    2.396314] usb-storage 2-2:1.0: USB Mass Storage device detected
[    2.396395] scsi host3: usb-storage 2-2:1.0
[    2.396468] usbcore: registered new interface driver usb-storage
[    2.400031] usbcore: registered new interface driver uas
[    2.402543] mmc0: SDHCI controller on PCI [0000:02:00.0] using ADMA
[    2.453228] usb 1-7: New USB device found, idVendor=8087, idProduct=0a2b, bcdDevice= 0.01
[    2.453230] usb 1-7: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    2.702552] ata3: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[    2.703157] ata3.00: ATA-8: HFS256G39MND-3310A, 20002P00, max UDMA/133
[    2.703158] ata3.00: 500118192 sectors, multi 0: LBA48 NCQ (depth 32), AA
[    2.704094] ata3.00: configured for UDMA/133
[    2.704308] scsi 2:0:0:0: Direct-Access     ATA      HFS256G39MND-331 2P00 PQ: 0 ANSI: 5
[    2.704475] sd 2:0:0:0: Attached scsi generic sg0 type 0
[    2.704534] sd 2:0:0:0: [sda] 500118192 512-byte logical blocks: (256 GB/238 GiB)
[    2.704538] sd 2:0:0:0: [sda] Write Protect is off
[    2.704539] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
[    2.704544] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    2.707047]  sda: sda1 sda2 sda3 sda4 sda5 sda6 sda7 sda8 sda9
[    2.707344] sd 2:0:0:0: [sda] Attached SCSI disk
[    2.727628] random: fast init done
[    2.877697] checking generic (90000000 15f9000) vs hw (90000000 10000000)
[    2.877698] fb: switching to inteldrmfb from EFI VGA
[    2.877711] Console: switching to colour dummy device 80x25
[    2.877980] [drm] Replacing VGA console driver
[    2.879206] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[    2.879206] [drm] Driver supports precise vblank timestamp query.
[    2.879666] i915 0000:00:02.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[    2.880031] [drm] Finished loading DMC firmware i915/skl_dmc_ver1_27.bin (v1.27)
[    3.166147] [drm] Initialized i915 1.6.0 20180719 for 0000:00:02.0 on minor 0
[    3.167741] ACPI: Video Device [GFX0] (multi-head: yes  rom: no  post: no)
[    3.168043] input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input4
[    3.178233] fbcon: inteldrmfb (fb0) is primary device
[    3.743371] scsi 3:0:0:0: Direct-Access     JetFlash Transcend 32GB   1100 PQ: 0 ANSI: 6
[    3.743659] sd 3:0:0:0: Attached scsi generic sg1 type 0
[    3.744165] sd 3:0:0:0: [sdb] 61702144 512-byte logical blocks: (31.6 GB/29.4 GiB)
[    3.744652] sd 3:0:0:0: [sdb] Write Protect is off
[    3.744653] sd 3:0:0:0: [sdb] Mode Sense: 43 00 00 00
[    3.745071] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    3.752414]  sdb: sdb1 sdb2 sdb3
[    3.754127] sd 3:0:0:0: [sdb] Attached SCSI removable disk
[    4.007915] EXT4-fs (sdb3): mounted filesystem with ordered data mode. Opts: (null)
[    4.283749] Console: switching to colour frame buffer device 400x112
[    4.308919] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
[    4.526223] systemd-journald[154]: Received SIGTERM from PID 1 (systemd).
[    4.594317] systemd: 15 output lines suppressed due to ratelimiting
[    4.996433] systemd[1]: systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid)
[    5.016461] systemd[1]: Detected architecture x86-64.
[    5.017645] systemd[1]: Set hostname to <endless>.
[    5.067841] random: crng init done
[    5.067842] random: 7 urandom warning(s) missed due to ratelimiting
[    6.916299] systemd[1]: Stopped Switch Root.
[    6.916387] systemd[1]: systemd-journald.service: Service has no hold-off time (RestartSec=0), scheduling restart.
[    6.916438] systemd[1]: systemd-journald.service: Scheduled restart job, restart counter is at 1.
[    6.916445] systemd[1]: Stopped Journal Service.
[    6.917067] systemd[1]: Starting Journal Service...
[    6.917102] systemd[1]: Reached target Remote Encrypted Volumes.
[    6.917138] systemd[1]: Reached target endless-extra SD card mounted (if expected).
[    7.023936] EXT4-fs (sdb3): re-mounted. Opts: errors=remount-ro
[    7.159763] systemd-journald[288]: Received request to flush runtime journal from PID 1
[   34.086446] io scheduler bfq registered
[   34.301437] media: Linux media interface: v0.10
[   34.387463] zram: Added device: zram0
[   34.394518] zram0: detected capacity change from 0 to 12397015040
[   34.402195] Adding 12106456k swap on /dev/zram0.  Priority:-2 extents:1 across:12106456k SSFS
[   34.476344] intel-lpss 0000:00:15.0: enabling device (0000 -> 0002)
[   34.483681] idma64 idma64.0: Found Intel integrated DMA 64-bit
[   34.488253] i2c_hid i2c-ITE8396:00: i2c-ITE8396:00 supply vdd not found, using dummy regulator
[   34.488273] i2c_hid i2c-ITE8396:00: Linked as a consumer to regulator.0
[   34.488274] i2c_hid i2c-ITE8396:00: i2c-ITE8396:00 supply vddl not found, using dummy regulator
[   34.502946] input: Ideapad extra buttons as /devices/pci0000:00/0000:00:1f.0/PNP0C09:00/VPC2004:00/input/input5
[   34.592345] intel-lpss 0000:00:15.1: enabling device (0000 -> 0002)
[   34.592662] idma64 idma64.1: Found Intel integrated DMA 64-bit
[   34.596422] i2c_hid i2c-SYNA2B29:00: i2c-SYNA2B29:00 supply vdd not found, using dummy regulator
[   34.596434] i2c_hid i2c-SYNA2B29:00: Linked as a consumer to regulator.0
[   34.596435] i2c_hid i2c-SYNA2B29:00: i2c-SYNA2B29:00 supply vddl not found, using dummy regulator
[   34.624385] intel-lpss 0000:00:15.3: enabling device (0000 -> 0002)
[   34.625255] idma64 idma64.2: Found Intel integrated DMA 64-bit
[   34.631254] i2c_hid i2c-ELAN21EF:00: i2c-ELAN21EF:00 supply vdd not found, using dummy regulator
[   34.631267] i2c_hid i2c-ELAN21EF:00: Linked as a consumer to regulator.0
[   34.631268] i2c_hid i2c-ELAN21EF:00: i2c-ELAN21EF:00 supply vddl not found, using dummy regulator
[   34.639646] videodev: Linux video capture interface: v2.00
[   34.796288] raid6: sse2x1   gen()  9732 MB/s
[   34.844295] raid6: sse2x1   xor()  6752 MB/s
[   34.892291] raid6: sse2x2   gen()  8883 MB/s
[   34.940292] raid6: sse2x2   xor()  5277 MB/s
[   34.988295] raid6: sse2x4   gen() 10137 MB/s
[   35.013276] mei_me 0000:00:16.0: enabling device (0000 -> 0002)
[   35.036287] raid6: sse2x4   xor()  8791 MB/s
[   35.084288] raid6: avx2x1   gen() 16919 MB/s
[   35.132293] raid6: avx2x1   xor() 13328 MB/s
[   35.173879] uvcvideo: Found UVC 1.00 device Lenovo EasyCamera (0bda:57e1)
[   35.176798] uvcvideo: Failed to initialize entity for entity 6
[   35.176799] uvcvideo: Failed to register entites (-22).
[   35.176858] input: Lenovo EasyCamera: Lenovo EasyC as /devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0/input/input6
[   35.176918] usbcore: registered new interface driver uvcvideo
[   35.176919] USB Video Class driver (1.1.1)
[   35.180290] raid6: avx2x2   gen() 18423 MB/s
[   35.228291] raid6: avx2x2   xor() 14402 MB/s
[   35.276292] raid6: avx2x4   gen() 17777 MB/s
[   35.324289] raid6: avx2x4   xor()  9912 MB/s
[   35.324292] raid6: using algorithm avx2x2 gen() 18423 MB/s
[   35.324292] raid6: .... xor() 14402 MB/s, rmw enabled
[   35.324293] raid6: using avx2x2 recovery algorithm
[   35.327276] xor: automatically using best checksumming function   avx       
[   35.346301] RAPL PMU: API unit is 2^-32 Joules, 5 fixed counters, 655360 ms ovfl timer
[   35.346302] RAPL PMU: hw unit of domain pp0-core 2^-14 Joules
[   35.346302] RAPL PMU: hw unit of domain package 2^-14 Joules
[   35.346302] RAPL PMU: hw unit of domain dram 2^-14 Joules
[   35.346303] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules
[   35.346303] RAPL PMU: hw unit of domain psys 2^-14 Joules
[   35.459915] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[   35.494910] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC298: line_outs=1 (0x14/0x0/0x0/0x0/0x0) type:speaker
[   35.494913] snd_hda_codec_realtek hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
[   35.494914] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=1 (0x21/0x0/0x0/0x0/0x0)
[   35.494915] snd_hda_codec_realtek hdaudioC0D0:    mono: mono_out=0x0
[   35.494916] snd_hda_codec_realtek hdaudioC0D0:    inputs:
[   35.494917] snd_hda_codec_realtek hdaudioC0D0:      Mic=0x18
[   35.494918] snd_hda_codec_realtek hdaudioC0D0:      Internal Mic=0x12
[   35.554771] input: HDA Intel PCH Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input7
[   35.554831] input: HDA Intel PCH Headphone as /devices/pci0000:00/0000:00:1f.3/sound/card0/input8
[   35.554882] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input9
[   35.554926] input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input10
[   35.554974] input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input11
[   35.555014] input: HDA Intel PCH HDMI/DP,pcm=9 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input12
[   35.555059] input: HDA Intel PCH HDMI/DP,pcm=10 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input13
[   35.574740] cryptd: max_cpu_qlen set to 1000
[   35.830486] hid-generic 0018:048D:8396.0001: hidraw0: I2C HID v1.00 Device [ITE8396:00 048D:8396] on i2c-ITE8396:00
[   35.830774] input: SYNA2B29:00 06CB:77C6 Mouse as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-6/i2c-SYNA2B29:00/0018:06CB:77C6.0002/input/input14
[   35.830842] hid-generic 0018:06CB:77C6.0002: input,hidraw1: I2C HID v1.00 Mouse [SYNA2B29:00 06CB:77C6] on i2c-SYNA2B29:00
[   35.831423] input: ELAN21EF:00 04F3:21EF Touchscreen as /devices/pci0000:00/0000:00:15.3/i2c_designware.2/i2c-7/i2c-ELAN21EF:00/0018:04F3:21EF.0003/input/input16
[   35.831493] input: ELAN21EF:00 04F3:21EF as /devices/pci0000:00/0000:00:15.3/i2c_designware.2/i2c-7/i2c-ELAN21EF:00/0018:04F3:21EF.0003/input/input17
[   35.831526] input: ELAN21EF:00 04F3:21EF as /devices/pci0000:00/0000:00:15.3/i2c_designware.2/i2c-7/i2c-ELAN21EF:00/0018:04F3:21EF.0003/input/input18
[   35.831561] hid-generic 0018:04F3:21EF.0003: input,hidraw2: I2C HID v1.00 Device [ELAN21EF:00 04F3:21EF] on i2c-ELAN21EF:00
[   35.925818] AVX2 version of gcm_enc/dec engaged.
[   35.925819] AES CTR mode by8 optimization enabled
[   35.932587] i2c_hid i2c-ELAN21EF:00: failed to change power setting.
[   35.933041] i2c_hid i2c-ELAN21EF:00: failed to retrieve report from device.
[   35.933043] hid-multitouch 0018:04F3:21EF.0003: failed to fetch feature 10
[   35.933103] i2c_hid i2c-ELAN21EF:00: failed to retrieve report from device.
[   35.933103] hid-multitouch 0018:04F3:21EF.0003: failed to fetch feature 14
[   35.933148] input: ELAN21EF:00 04F3:21EF as /devices/pci0000:00/0000:00:15.3/i2c_designware.2/i2c-7/i2c-ELAN21EF:00/0018:04F3:21EF.0003/input/input20
[   35.933231] hid-multitouch 0018:04F3:21EF.0003: input,hidraw0: I2C HID v1.00 Device [ELAN21EF:00 04F3:21EF] on i2c-ELAN21EF:00
[   35.933394] i2c_hid i2c-ELAN21EF:00: failed to change power setting.
[   36.001536] i2c_hid i2c-ELAN21EF:00: failed to change power setting.
[   36.024435] i2c_hid i2c-ELAN21EF:00: failed to change power setting.
[   36.076099] i2c_hid i2c-ELAN21EF:00: failed to change power setting.
[   36.088462] i2c_hid i2c-ELAN21EF:00: failed to change power setting.
[   36.400435] rmi4_f01 rmi4-00.fn01: found RMI device, manufacturer: Synaptics, product: TM3066-002, fw id: 2024144
[   36.487177] input: Synaptics TM3066-002 as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-6/i2c-SYNA2B29:00/0018:06CB:77C6.0002/input/input24
[   36.487272] hid-rmi 0018:06CB:77C6.0002: input,hidraw1: I2C HID v1.00 Mouse [SYNA2B29:00 06CB:77C6] on i2c-SYNA2B29:00
[   36.692916] Btrfs loaded, crc32c=crc32c-intel
[   36.694174] BTRFS: device label Debian devid 1 transid 2524470 /dev/sda8
[   37.539729] intel_rapl: Found RAPL domain package
[   37.539730] intel_rapl: Found RAPL domain core
[   37.539731] intel_rapl: Found RAPL domain uncore
[   37.539732] intel_rapl: Found RAPL domain dram
[   45.487919] rfkill: input handler disabled
[  297.784823] NET: Registered protocol family 38
[  297.997757] Bluetooth: Core ver 2.22
[  297.997776] NET: Registered protocol family 31
[  297.997777] Bluetooth: HCI device and connection manager initialized
[  297.997779] Bluetooth: HCI socket layer initialized
[  297.997781] Bluetooth: L2CAP socket layer initialized
[  297.997785] Bluetooth: SCO socket layer initialized
[  330.201340] usbcore: registered new interface driver btusb
[  330.210009] Bluetooth: hci0: Bootloader revision 0.0 build 2 week 52 2014
[  330.215016] Bluetooth: hci0: Device revision is 5
[  330.215018] Bluetooth: hci0: Secure boot is enabled
[  330.215018] Bluetooth: hci0: OTP lock is enabled
[  330.215019] Bluetooth: hci0: API lock is enabled
[  330.215019] Bluetooth: hci0: Debug lock is disabled
[  330.215020] Bluetooth: hci0: Minimum firmware build 1 week 10 2014
[  330.318833] Bluetooth: hci0: Found device firmware: intel/ibt-11-5.sfi
[  330.439088] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[  330.439089] Bluetooth: BNEP filters: protocol multicast
[  330.439093] Bluetooth: BNEP socket layer initialized
[  330.439517] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[  330.444572] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[  330.444619] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[  330.444621] cfg80211: failed to load regulatory.db
[  330.661796] Intel(R) Wireless WiFi driver for Linux
[  330.661797] Copyright(c) 2003- 2015 Intel Corporation
[  330.687342] iwlwifi 0000:01:00.0: loaded firmware version 36.e91976c0.0 op_mode iwlmvm
[  331.401893] iwlwifi 0000:01:00.0: Detected Intel(R) Dual Band Wireless AC 8260, REV=0x208
[  331.419532] Bluetooth: hci0: Failed to send firmware data (-38)
[  331.493662] iwlwifi 0000:01:00.0: base HW address: a4:34:d9:81:bf:a5
[  331.571067] ieee80211 phy0: Selected rate control algorithm 'iwl-mvm-rs'
[  331.571335] thermal thermal_zone6: failed to read out thermal zone (-61)
[  331.572960] iwlwifi 0000:01:00.0 wlp1s0: renamed from wlan0
[  331.594228] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[  331.862275] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[  331.919540] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[  335.403983] wlp1s0: authenticate with 16:91:82:37:a9:ea
[  335.412995] wlp1s0: send auth to 16:91:82:37:a9:ea (try 1/3)
[  335.421529] wlp1s0: authenticated
[  335.424364] wlp1s0: associate with 16:91:82:37:a9:ea (try 1/3)
[  335.446619] wlp1s0: RX AssocResp from 16:91:82:37:a9:ea (capab=0x431 status=0 aid=1)
[  335.463429] wlp1s0: associated
[  335.478937] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
[  338.536883] usb 1-7: reset full-speed USB device number 3 using xhci_hcd

[-- Attachment #3: iwlwifi-btusb-firmware-load-concurrency.btsnoop --]
[-- Type: application/octet-stream, Size: 588326 bytes --]

^ permalink raw reply

* [PATCH net] flow_dissector: do not dissect l4 ports for fragments
From: Eric Dumazet @ 2018-11-10  0:53 UTC (permalink / raw)
  To: David S . Miller
  Cc: netdev, Eric Dumazet, Eric Dumazet, 배석진

From: 배석진 <soukjin.bae@samsung.com>

Only first fragment has the sport/dport information,
not the following ones.

If we want consistent hash for all fragments, we need to
ignore ports even for first fragment.

This bug is visible for IPv6 traffic, if incoming fragments
do not have a flow label, since skb_get_hash() will give
different results for first fragment and following ones.

It is also visible if any routing rule wants dissection
and sport or dport.

See commit 5e5d6fed3741 ("ipv6: route: dissect flow
in input path if fib rules need it") for details.

[edumazet] rewrote the changelog completely.

Fixes: 06635a35d13d ("flow_dissect: use programable dissector in skb_flow_dissect and friends")
Signed-off-by: 배석진 <soukjin.bae@samsung.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/core/flow_dissector.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index 676f3ad629f95625422aa55f0f54157001ac477c..588f475019d47c9d6bae8883acebab48aaf63b48 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -1166,8 +1166,8 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
 		break;
 	}
 
-	if (dissector_uses_key(flow_dissector,
-			       FLOW_DISSECTOR_KEY_PORTS)) {
+	if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS) &&
+	    !(key_control->flags & FLOW_DIS_IS_FRAGMENT)) {
 		key_ports = skb_flow_dissector_target(flow_dissector,
 						      FLOW_DISSECTOR_KEY_PORTS,
 						      target_container);
-- 
2.19.1.930.g4563a0d9d0-goog

^ permalink raw reply related

* Re: [PATCH net-next 0/8] More accurate PHC<->system clock synchronization
From: David Miller @ 2018-11-10  0:55 UTC (permalink / raw)
  To: jeffrey.t.kirsher
  Cc: mlichvar, netdev, richardcochran, jacob.e.keller, mtosatti,
	michael.chan
In-Reply-To: <e1f25878c0b0b7d1f7f19a949376091e0b076d45.camel@intel.com>

From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Fri, 09 Nov 2018 15:33:10 -0800

> On Fri, 2018-11-09 at 15:28 -0800, David Miller wrote:
>> From: Miroslav Lichvar <mlichvar@redhat.com>
>> Date: Fri,  9 Nov 2018 11:14:41 +0100
>> 
>> > RFC->v1:
>> > - added new patches
>> > - separated PHC timestamp from ptp_system_timestamp
>> > - fixed memory leak in PTP_SYS_OFFSET_EXTENDED
>> > - changed PTP_SYS_OFFSET_EXTENDED to work with array of arrays
>> > - fixed PTP_SYS_OFFSET_EXTENDED to break correctly from loop
>> > - fixed timecounter updates in drivers
>> > - split gettimex in igb driver
>> > - fixed ptp_read_* functions to be available without
>> >   CONFIG_PTP_1588_CLOCK
>> > 
>> > This series enables a more accurate synchronization between PTP
>> > hardware
>> > clocks and the system clock.
>>  ...
>> 
>> This series looks good to me but I want to give Richard an opportunity to
>> review it first.
> 
> Dave, I also do not want to hold this series up by picking up patches 5, 6
> and 7 (Intel drivers) so please apply the entire series after Richard
> provides his review.

Ok, will do.

^ permalink raw reply

* [PATCH] mt76: fix uninitialized mutex access setting rts threshold
From: Lorenzo Bianconi @ 2018-11-10 11:03 UTC (permalink / raw)
  To: kvalo-sgV2jX0FEOL9JmXXK+q4OQ
  Cc: nbd-Vt+b4OUoWG0, sgruszka-H+wXaHxf7aLQT0dZR+AlfA,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA,
	netdev-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <cover.1541847014.git.lorenzo.bianconi-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

Fix following crash due to a leftover uninitialized mutex access
in mt76x2_set_rts_threshold routine.

[   31.018059] Call Trace:
[   31.018341]  register_lock_class+0x51f/0x530
[   31.018828]  __lock_acquire+0x6c/0x1580
[   31.019247]  lock_acquire+0x88/0x120
[   31.021089]  __mutex_lock+0x4a/0x4f0
[   31.023343]  mt76x2_set_rts_threshold+0x28/0x50
[   31.023831]  ieee80211_set_wiphy_params+0x16d/0x4e0
[   31.024344]  nl80211_set_wiphy+0x72b/0xbc0
[   31.024781]  genl_family_rcv_msg+0x192/0x3a0
[   31.025233]  genl_rcv_msg+0x42/0x89
[   31.026079]  netlink_rcv_skb+0x38/0x100
[   31.026475]  genl_rcv+0x1f/0x30
[   31.026804]  netlink_unicast+0x19c/0x250
[   31.027212]  netlink_sendmsg+0x1ed/0x390
[   31.027615]  sock_sendmsg+0x31/0x40
[   31.027973]  ___sys_sendmsg+0x23c/0x280
[   31.030414]  __sys_sendmsg+0x42/0x80
[   31.030783]  do_syscall_64+0x4a/0x170
[   31.031160]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
[   31.031677] RIP: 0033:0x7f3498b39ba7
[   31.033953] RSP: 002b:00007fffe19675b8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
[   31.034883] RAX: ffffffffffffffda RBX: 00000000012d5350 RCX: 00007f3498b39ba7
[   31.035756] RDX: 0000000000000000 RSI: 00007fffe19675f0 RDI: 0000000000000003
[   31.036587] RBP: 00000000012da740 R08: 0000000000000002 R09: 0000000000000000
[   31.037422] R10: 0000000000000006 R11: 0000000000000246 R12: 00000000012da880
[   31.038252] R13: 00007fffe19675f0 R14: 00007fffe19678c0 R15: 00000000012da880

Fixes: 108a4861ef19 ("mt76: create new mt76x02-lib module for common
mt76x{0,2} code")
Reported-by: lorenzo.trisolini-0PBfK6shWdK1Z/+hSey0Gg@public.gmane.org
Reported-by: luca.bisti-0PBfK6shWdK1Z/+hSey0Gg@public.gmane.org
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
---
This patch is for 4.20
---
 drivers/net/wireless/mediatek/mt76/mt76x02.h         | 1 -
 drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c | 4 ++--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02.h b/drivers/net/wireless/mediatek/mt76/mt76x02.h
index 47c42c607964..7806963b1905 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02.h
@@ -71,7 +71,6 @@ struct mt76x02_dev {
 	struct mac_address macaddr_list[8];
 
 	struct mutex phy_mutex;
-	struct mutex mutex;
 
 	u8 txdone_seq;
 	DECLARE_KFIFO_PTR(txstatus_fifo, struct mt76x02_tx_status);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
index 034a06295668..3f001bd6806c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
@@ -272,9 +272,9 @@ mt76x2_set_rts_threshold(struct ieee80211_hw *hw, u32 val)
 	if (val != ~0 && val > 0xffff)
 		return -EINVAL;
 
-	mutex_lock(&dev->mutex);
+	mutex_lock(&dev->mt76.mutex);
 	mt76x2_mac_set_tx_protection(dev, val);
-	mutex_unlock(&dev->mutex);
+	mutex_unlock(&dev->mt76.mutex);
 
 	return 0;
 }
-- 
2.19.1

^ permalink raw reply related

* Re: [Patch net-next] net: dump more useful information in netdev_rx_csum_fault()
From: Yunsheng Lin @ 2018-11-10  1:39 UTC (permalink / raw)
  To: Cong Wang, netdev
In-Reply-To: <20181109194333.19949-1-xiyou.wangcong@gmail.com>

On 2018/11/10 3:43, Cong Wang wrote:
> Currently netdev_rx_csum_fault() only shows a device name,
> we need more information about the skb for debugging.
> 
> Sample output:
> 
>  ens3: hw csum failure
>  dev features: 0x0000000000014b89
>  skb len=84 data_len=0 gso_size=0 gso_type=0 ip_summed=0 csum=0, csum_complete_sw=0, csum_valid=0
> 
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
> ---
>  include/linux/netdevice.h |  5 +++--
>  net/core/datagram.c       |  6 +++---
>  net/core/dev.c            | 10 ++++++++--
>  net/sunrpc/socklib.c      |  2 +-
>  4 files changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index 857f8abf7b91..fabcd9fa6cf7 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -4332,9 +4332,10 @@ static inline bool can_checksum_protocol(netdev_features_t features,
>  }
>  
>  #ifdef CONFIG_BUG
> -void netdev_rx_csum_fault(struct net_device *dev);
> +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb);
>  #else
> -static inline void netdev_rx_csum_fault(struct net_device *dev)
> +static inline void netdev_rx_csum_fault(struct net_device *dev,
> +					struct sk_buff *skb)
>  {
>  }
>  #endif
> diff --git a/net/core/datagram.c b/net/core/datagram.c
> index 57f3a6fcfc1e..d8f4d55cd6c5 100644
> --- a/net/core/datagram.c
> +++ b/net/core/datagram.c
> @@ -736,7 +736,7 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len)
>  	if (likely(!sum)) {
>  		if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>  		    !skb->csum_complete_sw)
> -			netdev_rx_csum_fault(skb->dev);
> +			netdev_rx_csum_fault(skb->dev, skb);
>  	}
>  	if (!skb_shared(skb))
>  		skb->csum_valid = !sum;
> @@ -756,7 +756,7 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb)
>  	if (likely(!sum)) {
>  		if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>  		    !skb->csum_complete_sw)
> -			netdev_rx_csum_fault(skb->dev);
> +			netdev_rx_csum_fault(skb->dev, skb);
>  	}
>  
>  	if (!skb_shared(skb)) {
> @@ -810,7 +810,7 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
>  
>  		if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>  		    !skb->csum_complete_sw)
> -			netdev_rx_csum_fault(NULL);
> +			netdev_rx_csum_fault(NULL, skb);
>  	}
>  	return 0;
>  fault:
> diff --git a/net/core/dev.c b/net/core/dev.c
> index 0ffcbdd55fa9..2b337df26117 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -3091,10 +3091,16 @@ EXPORT_SYMBOL(__skb_gso_segment);
>  
>  /* Take action when hardware reception checksum errors are detected. */
>  #ifdef CONFIG_BUG
> -void netdev_rx_csum_fault(struct net_device *dev)
> +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb)
>  {
>  	if (net_ratelimit()) {
>  		pr_err("%s: hw csum failure\n", dev ? dev->name : "<unknown>");
> +		if (dev)
> +			pr_err("dev features: %pNF\n", &dev->features);
> +		pr_err("skb len=%d data_len=%d gso_size=%d gso_type=%d ip_summed=%d csum=%x, csum_complete_sw=%d, csum_valid=%d\n",
> +		       skb->len, skb->data_len, skb_shinfo(skb)->gso_size,
> +		       skb_shinfo(skb)->gso_type, skb->ip_summed, skb->csum,
> +		       skb->csum_complete_sw, skb->csum_valid);


This function also have the netdev available, use netdev_err to log the error?

Also, dev->features was dumped before this patch, why remove it?


>  		dump_stack();
>  	}
>  }
> @@ -5779,7 +5785,7 @@ __sum16 __skb_gro_checksum_complete(struct sk_buff *skb)
>  	if (likely(!sum)) {
>  		if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>  		    !skb->csum_complete_sw)
> -			netdev_rx_csum_fault(skb->dev);
> +			netdev_rx_csum_fault(skb->dev, skb);
>  	}
>  
>  	NAPI_GRO_CB(skb)->csum = wsum;
> diff --git a/net/sunrpc/socklib.c b/net/sunrpc/socklib.c
> index 9062967575c4..7e55cfc69697 100644
> --- a/net/sunrpc/socklib.c
> +++ b/net/sunrpc/socklib.c
> @@ -175,7 +175,7 @@ int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb)
>  		return -1;
>  	if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>  	    !skb->csum_complete_sw)
> -		netdev_rx_csum_fault(skb->dev);
> +		netdev_rx_csum_fault(skb->dev, skb);
>  	return 0;
>  no_checksum:
>  	if (xdr_partial_copy_from_skb(xdr, 0, &desc, xdr_skb_read_bits) < 0)
> 

^ permalink raw reply

* Re: [Patch net-next] net: dump more useful information in netdev_rx_csum_fault()
From: Cong Wang @ 2018-11-10  1:42 UTC (permalink / raw)
  To: linyunsheng; +Cc: Linux Kernel Network Developers
In-Reply-To: <2fe5fbef-ece4-1c0a-189b-514074a7f46b@huawei.com>

On Fri, Nov 9, 2018 at 5:39 PM Yunsheng Lin <linyunsheng@huawei.com> wrote:
>
> On 2018/11/10 3:43, Cong Wang wrote:
> > Currently netdev_rx_csum_fault() only shows a device name,
> > we need more information about the skb for debugging.
> >
> > Sample output:
> >
> >  ens3: hw csum failure
> >  dev features: 0x0000000000014b89
> >  skb len=84 data_len=0 gso_size=0 gso_type=0 ip_summed=0 csum=0, csum_complete_sw=0, csum_valid=0
> >
> > Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
> > ---
> >  include/linux/netdevice.h |  5 +++--
> >  net/core/datagram.c       |  6 +++---
> >  net/core/dev.c            | 10 ++++++++--
> >  net/sunrpc/socklib.c      |  2 +-
> >  4 files changed, 15 insertions(+), 8 deletions(-)
> >
> > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> > index 857f8abf7b91..fabcd9fa6cf7 100644
> > --- a/include/linux/netdevice.h
> > +++ b/include/linux/netdevice.h
> > @@ -4332,9 +4332,10 @@ static inline bool can_checksum_protocol(netdev_features_t features,
> >  }
> >
> >  #ifdef CONFIG_BUG
> > -void netdev_rx_csum_fault(struct net_device *dev);
> > +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb);
> >  #else
> > -static inline void netdev_rx_csum_fault(struct net_device *dev)
> > +static inline void netdev_rx_csum_fault(struct net_device *dev,
> > +                                     struct sk_buff *skb)
> >  {
> >  }
> >  #endif
> > diff --git a/net/core/datagram.c b/net/core/datagram.c
> > index 57f3a6fcfc1e..d8f4d55cd6c5 100644
> > --- a/net/core/datagram.c
> > +++ b/net/core/datagram.c
> > @@ -736,7 +736,7 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len)
> >       if (likely(!sum)) {
> >               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
> >                   !skb->csum_complete_sw)
> > -                     netdev_rx_csum_fault(skb->dev);
> > +                     netdev_rx_csum_fault(skb->dev, skb);
> >       }
> >       if (!skb_shared(skb))
> >               skb->csum_valid = !sum;
> > @@ -756,7 +756,7 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb)
> >       if (likely(!sum)) {
> >               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
> >                   !skb->csum_complete_sw)
> > -                     netdev_rx_csum_fault(skb->dev);
> > +                     netdev_rx_csum_fault(skb->dev, skb);
> >       }
> >
> >       if (!skb_shared(skb)) {
> > @@ -810,7 +810,7 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
> >
> >               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
> >                   !skb->csum_complete_sw)
> > -                     netdev_rx_csum_fault(NULL);
> > +                     netdev_rx_csum_fault(NULL, skb);
> >       }
> >       return 0;
> >  fault:
> > diff --git a/net/core/dev.c b/net/core/dev.c
> > index 0ffcbdd55fa9..2b337df26117 100644
> > --- a/net/core/dev.c
> > +++ b/net/core/dev.c
> > @@ -3091,10 +3091,16 @@ EXPORT_SYMBOL(__skb_gso_segment);
> >
> >  /* Take action when hardware reception checksum errors are detected. */
> >  #ifdef CONFIG_BUG
> > -void netdev_rx_csum_fault(struct net_device *dev)
> > +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb)
> >  {
> >       if (net_ratelimit()) {
> >               pr_err("%s: hw csum failure\n", dev ? dev->name : "<unknown>");
> > +             if (dev)
> > +                     pr_err("dev features: %pNF\n", &dev->features);
> > +             pr_err("skb len=%d data_len=%d gso_size=%d gso_type=%d ip_summed=%d csum=%x, csum_complete_sw=%d, csum_valid=%d\n",
> > +                    skb->len, skb->data_len, skb_shinfo(skb)->gso_size,
> > +                    skb_shinfo(skb)->gso_type, skb->ip_summed, skb->csum,
> > +                    skb->csum_complete_sw, skb->csum_valid);
>
>
> This function also have the netdev available, use netdev_err to log the error?

It is apparently not me who picked pr_err() from the beginning,
I just follow that pr_err(). If you are not happy with it, please send
a followup.


>
> Also, dev->features was dumped before this patch, why remove it?

Seriously? Where do I remove it? Please be specific. :)

^ permalink raw reply

* Re: [PATCH net-next 0/8] More accurate PHC<->system clock synchronization
From: Richard Cochran @ 2018-11-10  1:44 UTC (permalink / raw)
  To: David Miller
  Cc: mlichvar, netdev, jacob.e.keller, mtosatti, jeffrey.t.kirsher,
	michael.chan
In-Reply-To: <20181109.152846.1637823960719852604.davem@davemloft.net>

On Fri, Nov 09, 2018 at 03:28:46PM -0800, David Miller wrote:
> This series looks good to me but I want to give Richard an opportunity to
> review it first.

The series is good to go.

Acked-by: Richard Cochran <richardcochran@gmail.com>

^ permalink raw reply

* Re: [PATCH net-next 7/8] ixgbe: extend PTP gettime function to read system clock
From: Jeff Kirsher @ 2018-11-10  1:52 UTC (permalink / raw)
  To: Miroslav Lichvar, netdev; +Cc: Richard Cochran, Jacob Keller
In-Reply-To: <20181109101449.15398-8-mlichvar@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 520 bytes --]

On Fri, 2018-11-09 at 11:14 +0100, Miroslav Lichvar wrote:
> This adds support for the PTP_SYS_OFFSET_EXTENDED ioctl.
> 
> Cc: Richard Cochran <richardcochran@gmail.com>
> Cc: Jacob Keller <jacob.e.keller@intel.com>
> Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
> ---
>  drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 54 ++++++++++++++++----
>  1 file changed, 44 insertions(+), 10 deletions(-)

Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* Re: [PATCH net-next 6/8] igb: extend PTP gettime function to read system clock
From: Jeff Kirsher @ 2018-11-10  1:53 UTC (permalink / raw)
  To: Miroslav Lichvar, netdev; +Cc: Richard Cochran, Jacob Keller
In-Reply-To: <20181109101449.15398-7-mlichvar@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 520 bytes --]

On Fri, 2018-11-09 at 11:14 +0100, Miroslav Lichvar wrote:
> This adds support for the PTP_SYS_OFFSET_EXTENDED ioctl.
> 
> Cc: Richard Cochran <richardcochran@gmail.com>
> Cc: Jacob Keller <jacob.e.keller@intel.com>
> Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
> ---
>  drivers/net/ethernet/intel/igb/igb_ptp.c | 65 ++++++++++++++++++++----
>  1 file changed, 55 insertions(+), 10 deletions(-)

Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* Re: [PATCH net-next 5/8] e1000e: extend PTP gettime function to read system clock
From: Jeff Kirsher @ 2018-11-10  1:53 UTC (permalink / raw)
  To: Miroslav Lichvar, netdev; +Cc: Richard Cochran, Jacob Keller
In-Reply-To: <20181109101449.15398-6-mlichvar@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 638 bytes --]

On Fri, 2018-11-09 at 11:14 +0100, Miroslav Lichvar wrote:
> This adds support for the PTP_SYS_OFFSET_EXTENDED ioctl.
> 
> Cc: Richard Cochran <richardcochran@gmail.com>
> Cc: Jacob Keller <jacob.e.keller@intel.com>
> Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
> ---
>  drivers/net/ethernet/intel/e1000e/e1000.h  |  3 ++
>  drivers/net/ethernet/intel/e1000e/netdev.c | 42 ++++++++++++++++------
>  drivers/net/ethernet/intel/e1000e/ptp.c    | 16 +++++----
>  3 files changed, 45 insertions(+), 16 deletions(-)

Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* [PATCH net] net: qualcomm: rmnet: Fix incorrect assignment of real_dev
From: Subash Abhinov Kasiviswanathan @ 2018-11-10  1:56 UTC (permalink / raw)
  To: davem, netdev; +Cc: Subash Abhinov Kasiviswanathan, Sean Tranchetti

A null dereference was observed when a sysctl was being set
from userspace and rmnet was stuck trying to complete some actions
in the NETDEV_REGISTER callback. This is because the real_dev is set
only after the device registration handler completes.

sysctl call stack -

<6> Unable to handle kernel NULL pointer dereference at
    virtual address 00000108
<2> pc : rmnet_vnd_get_iflink+0x1c/0x28
<2> lr : dev_get_iflink+0x2c/0x40
<2>  rmnet_vnd_get_iflink+0x1c/0x28
<2>  inet6_fill_ifinfo+0x15c/0x234
<2>  inet6_ifinfo_notify+0x68/0xd4
<2>  ndisc_ifinfo_sysctl_change+0x1b8/0x234
<2>  proc_sys_call_handler+0xac/0x100
<2>  proc_sys_write+0x3c/0x4c
<2>  __vfs_write+0x54/0x14c
<2>  vfs_write+0xcc/0x188
<2>  SyS_write+0x60/0xc0
<2>  el0_svc_naked+0x34/0x38

device register call stack -

<2>  notifier_call_chain+0x84/0xbc
<2>  raw_notifier_call_chain+0x38/0x48
<2>  call_netdevice_notifiers_info+0x40/0x70
<2>  call_netdevice_notifiers+0x38/0x60
<2>  register_netdevice+0x29c/0x3d8
<2>  rmnet_vnd_newlink+0x68/0xe8
<2>  rmnet_newlink+0xa0/0x160
<2>  rtnl_newlink+0x57c/0x6c8
<2>  rtnetlink_rcv_msg+0x1dc/0x328
<2>  netlink_rcv_skb+0xac/0x118
<2>  rtnetlink_rcv+0x24/0x30
<2>  netlink_unicast+0x158/0x1f0
<2>  netlink_sendmsg+0x32c/0x338
<2>  sock_sendmsg+0x44/0x60
<2>  SyS_sendto+0x150/0x1ac
<2>  el0_svc_naked+0x34/0x38

Fixes: b752eff5be24 ("net: qualcomm: rmnet: Implement ndo_get_iflink")
Signed-off-by: Sean Tranchetti <stranche@codeaurora.org>
Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
---
 drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c
index 0afc3d3..d11c16a 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c
@@ -234,7 +234,7 @@ int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev,
 		      struct net_device *real_dev,
 		      struct rmnet_endpoint *ep)
 {
-	struct rmnet_priv *priv;
+	struct rmnet_priv *priv = netdev_priv(rmnet_dev);
 	int rc;
 
 	if (ep->egress_dev)
@@ -247,6 +247,8 @@ int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev,
 	rmnet_dev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
 	rmnet_dev->hw_features |= NETIF_F_SG;
 
+	priv->real_dev = real_dev;
+
 	rc = register_netdevice(rmnet_dev);
 	if (!rc) {
 		ep->egress_dev = rmnet_dev;
@@ -255,9 +257,7 @@ int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev,
 
 		rmnet_dev->rtnl_link_ops = &rmnet_link_ops;
 
-		priv = netdev_priv(rmnet_dev);
 		priv->mux_id = id;
-		priv->real_dev = real_dev;
 
 		netdev_dbg(rmnet_dev, "rmnet dev created\n");
 	}
-- 
1.9.1

^ permalink raw reply related

* Re: [Patch net-next] net: dump more useful information in netdev_rx_csum_fault()
From: Yunsheng Lin @ 2018-11-10  2:02 UTC (permalink / raw)
  To: Cong Wang; +Cc: Linux Kernel Network Developers
In-Reply-To: <CAM_iQpXeudFkHrJdCe3FCyNTxBO_YyvSb1rvSsbHBg1Yuy9m8g@mail.gmail.com>

On 2018/11/10 9:42, Cong Wang wrote:
> On Fri, Nov 9, 2018 at 5:39 PM Yunsheng Lin <linyunsheng@huawei.com> wrote:
>>
>> On 2018/11/10 3:43, Cong Wang wrote:
>>> Currently netdev_rx_csum_fault() only shows a device name,
>>> we need more information about the skb for debugging.
>>>
>>> Sample output:
>>>
>>>  ens3: hw csum failure
>>>  dev features: 0x0000000000014b89
>>>  skb len=84 data_len=0 gso_size=0 gso_type=0 ip_summed=0 csum=0, csum_complete_sw=0, csum_valid=0
>>>
>>> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
>>> ---
>>>  include/linux/netdevice.h |  5 +++--
>>>  net/core/datagram.c       |  6 +++---
>>>  net/core/dev.c            | 10 ++++++++--
>>>  net/sunrpc/socklib.c      |  2 +-
>>>  4 files changed, 15 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
>>> index 857f8abf7b91..fabcd9fa6cf7 100644
>>> --- a/include/linux/netdevice.h
>>> +++ b/include/linux/netdevice.h
>>> @@ -4332,9 +4332,10 @@ static inline bool can_checksum_protocol(netdev_features_t features,
>>>  }
>>>
>>>  #ifdef CONFIG_BUG
>>> -void netdev_rx_csum_fault(struct net_device *dev);
>>> +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb);
>>>  #else
>>> -static inline void netdev_rx_csum_fault(struct net_device *dev)
>>> +static inline void netdev_rx_csum_fault(struct net_device *dev,
>>> +                                     struct sk_buff *skb)
>>>  {
>>>  }
>>>  #endif
>>> diff --git a/net/core/datagram.c b/net/core/datagram.c
>>> index 57f3a6fcfc1e..d8f4d55cd6c5 100644
>>> --- a/net/core/datagram.c
>>> +++ b/net/core/datagram.c
>>> @@ -736,7 +736,7 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len)
>>>       if (likely(!sum)) {
>>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>>>                   !skb->csum_complete_sw)
>>> -                     netdev_rx_csum_fault(skb->dev);
>>> +                     netdev_rx_csum_fault(skb->dev, skb);
>>>       }
>>>       if (!skb_shared(skb))
>>>               skb->csum_valid = !sum;
>>> @@ -756,7 +756,7 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb)
>>>       if (likely(!sum)) {
>>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>>>                   !skb->csum_complete_sw)
>>> -                     netdev_rx_csum_fault(skb->dev);
>>> +                     netdev_rx_csum_fault(skb->dev, skb);
>>>       }
>>>
>>>       if (!skb_shared(skb)) {
>>> @@ -810,7 +810,7 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
>>>
>>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>>>                   !skb->csum_complete_sw)
>>> -                     netdev_rx_csum_fault(NULL);
>>> +                     netdev_rx_csum_fault(NULL, skb);
>>>       }
>>>       return 0;
>>>  fault:
>>> diff --git a/net/core/dev.c b/net/core/dev.c
>>> index 0ffcbdd55fa9..2b337df26117 100644
>>> --- a/net/core/dev.c
>>> +++ b/net/core/dev.c
>>> @@ -3091,10 +3091,16 @@ EXPORT_SYMBOL(__skb_gso_segment);
>>>
>>>  /* Take action when hardware reception checksum errors are detected. */
>>>  #ifdef CONFIG_BUG
>>> -void netdev_rx_csum_fault(struct net_device *dev)
>>> +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb)
>>>  {
>>>       if (net_ratelimit()) {
>>>               pr_err("%s: hw csum failure\n", dev ? dev->name : "<unknown>");
>>> +             if (dev)
>>> +                     pr_err("dev features: %pNF\n", &dev->features);
>>> +             pr_err("skb len=%d data_len=%d gso_size=%d gso_type=%d ip_summed=%d csum=%x, csum_complete_sw=%d, csum_valid=%d\n",
>>> +                    skb->len, skb->data_len, skb_shinfo(skb)->gso_size,
>>> +                    skb_shinfo(skb)->gso_type, skb->ip_summed, skb->csum,
>>> +                    skb->csum_complete_sw, skb->csum_valid);
>>
>>
>> This function also have the netdev available, use netdev_err to log the error?
> 
> It is apparently not me who picked pr_err() from the beginning,
> I just follow that pr_err(). If you are not happy with it, please send
> a followup.

Yes, but perhaps it is something to improve.
When using the netdev, then maybe it does not have to check if dev is null, because
netdev_err has handled the netdev being NULL case.
Maybe I missed something that netdev can not be used here?
If not, maybe I can send a followup.

> 
> 
>>
>> Also, dev->features was dumped before this patch, why remove it?
> 
> Seriously? Where do I remove it? Please be specific. :)

Sorry, I missed that, I thought it was removed when adding the new log.

> 
> .
> 

^ permalink raw reply

* Re: [Patch net-next] net: dump more useful information in netdev_rx_csum_fault()
From: Cong Wang @ 2018-11-10  2:09 UTC (permalink / raw)
  To: linyunsheng; +Cc: Linux Kernel Network Developers
In-Reply-To: <17be1af6-9aaf-593c-a68f-932d63aefbd5@huawei.com>

On Fri, Nov 9, 2018 at 6:02 PM Yunsheng Lin <linyunsheng@huawei.com> wrote:
>
> On 2018/11/10 9:42, Cong Wang wrote:
> > On Fri, Nov 9, 2018 at 5:39 PM Yunsheng Lin <linyunsheng@huawei.com> wrote:
> >>
> >> On 2018/11/10 3:43, Cong Wang wrote:
> >>> Currently netdev_rx_csum_fault() only shows a device name,
> >>> we need more information about the skb for debugging.
> >>>
> >>> Sample output:
> >>>
> >>>  ens3: hw csum failure
> >>>  dev features: 0x0000000000014b89
> >>>  skb len=84 data_len=0 gso_size=0 gso_type=0 ip_summed=0 csum=0, csum_complete_sw=0, csum_valid=0
> >>>
> >>> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
> >>> ---
> >>>  include/linux/netdevice.h |  5 +++--
> >>>  net/core/datagram.c       |  6 +++---
> >>>  net/core/dev.c            | 10 ++++++++--
> >>>  net/sunrpc/socklib.c      |  2 +-
> >>>  4 files changed, 15 insertions(+), 8 deletions(-)
> >>>
> >>> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> >>> index 857f8abf7b91..fabcd9fa6cf7 100644
> >>> --- a/include/linux/netdevice.h
> >>> +++ b/include/linux/netdevice.h
> >>> @@ -4332,9 +4332,10 @@ static inline bool can_checksum_protocol(netdev_features_t features,
> >>>  }
> >>>
> >>>  #ifdef CONFIG_BUG
> >>> -void netdev_rx_csum_fault(struct net_device *dev);
> >>> +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb);
> >>>  #else
> >>> -static inline void netdev_rx_csum_fault(struct net_device *dev)
> >>> +static inline void netdev_rx_csum_fault(struct net_device *dev,
> >>> +                                     struct sk_buff *skb)
> >>>  {
> >>>  }
> >>>  #endif
> >>> diff --git a/net/core/datagram.c b/net/core/datagram.c
> >>> index 57f3a6fcfc1e..d8f4d55cd6c5 100644
> >>> --- a/net/core/datagram.c
> >>> +++ b/net/core/datagram.c
> >>> @@ -736,7 +736,7 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len)
> >>>       if (likely(!sum)) {
> >>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
> >>>                   !skb->csum_complete_sw)
> >>> -                     netdev_rx_csum_fault(skb->dev);
> >>> +                     netdev_rx_csum_fault(skb->dev, skb);
> >>>       }
> >>>       if (!skb_shared(skb))
> >>>               skb->csum_valid = !sum;
> >>> @@ -756,7 +756,7 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb)
> >>>       if (likely(!sum)) {
> >>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
> >>>                   !skb->csum_complete_sw)
> >>> -                     netdev_rx_csum_fault(skb->dev);
> >>> +                     netdev_rx_csum_fault(skb->dev, skb);
> >>>       }
> >>>
> >>>       if (!skb_shared(skb)) {
> >>> @@ -810,7 +810,7 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
> >>>
> >>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
> >>>                   !skb->csum_complete_sw)
> >>> -                     netdev_rx_csum_fault(NULL);
> >>> +                     netdev_rx_csum_fault(NULL, skb);
> >>>       }
> >>>       return 0;
> >>>  fault:
> >>> diff --git a/net/core/dev.c b/net/core/dev.c
> >>> index 0ffcbdd55fa9..2b337df26117 100644
> >>> --- a/net/core/dev.c
> >>> +++ b/net/core/dev.c
> >>> @@ -3091,10 +3091,16 @@ EXPORT_SYMBOL(__skb_gso_segment);
> >>>
> >>>  /* Take action when hardware reception checksum errors are detected. */
> >>>  #ifdef CONFIG_BUG
> >>> -void netdev_rx_csum_fault(struct net_device *dev)
> >>> +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb)
> >>>  {
> >>>       if (net_ratelimit()) {
> >>>               pr_err("%s: hw csum failure\n", dev ? dev->name : "<unknown>");
> >>> +             if (dev)
> >>> +                     pr_err("dev features: %pNF\n", &dev->features);
> >>> +             pr_err("skb len=%d data_len=%d gso_size=%d gso_type=%d ip_summed=%d csum=%x, csum_complete_sw=%d, csum_valid=%d\n",
> >>> +                    skb->len, skb->data_len, skb_shinfo(skb)->gso_size,
> >>> +                    skb_shinfo(skb)->gso_type, skb->ip_summed, skb->csum,
> >>> +                    skb->csum_complete_sw, skb->csum_valid);
> >>
> >>
> >> This function also have the netdev available, use netdev_err to log the error?
> >
> > It is apparently not me who picked pr_err() from the beginning,
> > I just follow that pr_err(). If you are not happy with it, please send
> > a followup.
>
> Yes, but perhaps it is something to improve.


Sure, no one stops you from improving it in a followup patch. :)


> When using the netdev, then maybe it does not have to check if dev is null, because
> netdev_err has handled the netdev being NULL case.
> Maybe I missed something that netdev can not be used here?
> If not, maybe I can send a followup.
>

Maybe. Again, my patch intends to add a few debugging logs,
not to convert pr_err() to whatever else, they are totally different
goals. I choose pr_err() only because I follow the existing one,
not to say which one is better than the other.

Thanks.

^ permalink raw reply

* Re: [PATCH] add an initial version of snmp_counter.rst
From: Cong Wang @ 2018-11-10  2:20 UTC (permalink / raw)
  To: peng yu; +Cc: Linux Kernel Network Developers, Randy Dunlap
In-Reply-To: <20181109181309.5541-1-yupeng0921@gmail.com>

(Cc Randy)

On Fri, Nov 9, 2018 at 10:13 AM yupeng <yupeng0921@gmail.com> wrote:
>
> The snmp_counter.rst run a set of simple experiments, explains the
> meaning of snmp counters depend on the experiments' results. This is
> an initial version, only covers a small part of the snmp counters.


I don't look into much details, so just a few high-level reviews:

1. Please try to group those counters by protocol, it would be easier
to search.

2. For many counters you provide a link to RFC, do you just copy
and paste them? Please try to expand.

3. _I think_ you don't need to show, for example, how to run a ping
command. It's safe to assume readers already know this. Therefore,
just explaining those counters is okay.


Thanks.

>
> Signed-off-by: yupeng <yupeng0921@gmail.com>
> ---
>  Documentation/networking/index.rst        |   1 +
>  Documentation/networking/snmp_counter.rst | 963 ++++++++++++++++++++++
>  2 files changed, 964 insertions(+)
>  create mode 100644 Documentation/networking/snmp_counter.rst
>
> diff --git a/Documentation/networking/index.rst b/Documentation/networking/index.rst
> index bd89dae8d578..6a47629ef8ed 100644
> --- a/Documentation/networking/index.rst
> +++ b/Documentation/networking/index.rst
> @@ -31,6 +31,7 @@ Contents:
>     net_failover
>     alias
>     bridge
> +   snmp_counter
>
>  .. only::  subproject
>
> diff --git a/Documentation/networking/snmp_counter.rst b/Documentation/networking/snmp_counter.rst
> new file mode 100644
> index 000000000000..2939c5acf675
> --- /dev/null
> +++ b/Documentation/networking/snmp_counter.rst
> @@ -0,0 +1,963 @@
> +====================
> +snmp counter tutorial
> +====================
> +
> +This document explains the meaning of snmp counters. For understanding
> +their meanings better, this document doesn't explain the counters one
> +by one, but creates a set of experiments, and explains the counters
> +depend on the experiments' results. The experiments are on one or two
> +virtual machines. Except for the test commands we use in the experiments,
> +the virtual machines have no other network traffic. We use the 'nstat'
> +command to get the values of snmp counters, before every test, we run
> +'nstat -n' to update the history, so the 'nstat' output would only
> +show the changes of the snmp counters. For more information about
> +nstat, please refer:
> +
> +http://man7.org/linux/man-pages/man8/nstat.8.html
> +
> +icmp ping
> +========
> +
> +Run the ping command against the public dns server 8.8.8.8::
> +
> +  nstatuser@nstat-a:~$ ping 8.8.8.8 -c 1
> +  PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
> +  64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=17.8 ms
> +
> +  --- 8.8.8.8 ping statistics ---
> +  1 packets transmitted, 1 received, 0% packet loss, time 0ms
> +  rtt min/avg/max/mdev = 17.875/17.875/17.875/0.000 ms
> +
> +The nstayt result::
> +
> +  nstatuser@nstat-a:~$ nstat
> +  #kernel
> +  IpInReceives                    1                  0.0
> +  IpInDelivers                    1                  0.0
> +  IpOutRequests                   1                  0.0
> +  IcmpInMsgs                      1                  0.0
> +  IcmpInEchoReps                  1                  0.0
> +  IcmpOutMsgs                     1                  0.0
> +  IcmpOutEchos                    1                  0.0
> +  IcmpMsgInType0                  1                  0.0
> +  IcmpMsgOutType8                 1                  0.0
> +  IpExtInOctets                   84                 0.0
> +  IpExtOutOctets                  84                 0.0
> +  IpExtInNoECTPkts                1                  0.0
> +
> +The nstat output could be divided into two part: one with the 'Ext'
> +keyword, another without the 'Ext' keyword. If the counter name
> +doesn't have 'Ext', it is defined by one of snmp rfc, if it has 'Ext',
> +it is a kernel extent counter. Below we explain them one by one.
> +
> +The rfc defined counters
> +----------------------
> +
> +* IpInReceives
> +The total number of input datagrams received from interfaces,
> +including those received in error.
> +
> +https://tools.ietf.org/html/rfc1213#page-26
> +
> +* IpInDelivers
> +The total number of input datagrams successfully delivered to IP
> +user-protocols (including ICMP).
> +
> +https://tools.ietf.org/html/rfc1213#page-28
> +
> +* IpOutRequests
> +The total number of IP datagrams which local IP user-protocols
> +(including ICMP) supplied to IP in requests for transmission.  Note
> +that this counter does not include any datagrams counted in
> +ipForwDatagrams.
> +
> +https://tools.ietf.org/html/rfc1213#page-28
> +
> +* IcmpInMsgs
> +The total number of ICMP messages which the entity received.  Note
> +that this counter includes all those counted by icmpInErrors.
> +
> +https://tools.ietf.org/html/rfc1213#page-41
> +
> +* IcmpInEchoReps
> +The number of ICMP Echo Reply messages received.
> +
> +https://tools.ietf.org/html/rfc1213#page-42
> +
> +* IcmpOutMsgs
> +The total number of ICMP messages which this entity attempted to send.
> +Note that this counter includes all those counted by icmpOutErrors.
> +
> +https://tools.ietf.org/html/rfc1213#page-43
> +
> +* IcmpOutEchos
> +The number of ICMP Echo (request) messages sent.
> +
> +https://tools.ietf.org/html/rfc1213#page-45
> +
> +IcmpMsgInType0 and IcmpMsgOutType8 are not defined by any snmp related
> +RFCs, but their meaning are quite straightforward, they count the
> +packet number of specific icmp packet types. We could find the icmp
> +types here:
> +
> +https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml
> +
> +Type 8 is echo, type 0 is echo reply.
> +
> +Until now, we can easily explain these items of the nstat: We sent an
> +icmp echo request, so IpOutRequests, IcmpOutMsgs, IcmpOutEchos and
> +IcmpMsgOutType8 were increased 1. We got icmp echo reply from 8.8.8.8,
> +so IpInReceives, IcmpInMsgs, IcmpInEchoReps, IcmpMsgInType0 were
> +increased 1. The icmp echo reply was passed to icmp layer via ip
> +layer, so IpInDelivers was increased 1.
> +
> +Please note, these metrics don't aware LRO/GRO, e.g., IpOutRequests
> +might count 1 packet, but hardware splits it to 2, and sends them
> +separately.
> +
> +IpExtInOctets and IpExtOutOctets
> +------------------------------
> +They are linux kernel extensions, no rfc definitions. Please note,
> +rfc1213 indeed defines ifInOctets  and ifOutOctets, but they
> +are different things. The ifInOctets and ifOutOctets are packets
> +size which includes the mac layer. But IpExtInOctets and IpExtOutOctets
> +are only ip layer sizes.
> +
> +In our example, an ICMP echo request has four parts:
> +* 14 bytes mac header
> +* 20 bytes ip header
> +* 16 bytes icmp header
> +* 48 bytes data (default value of the ping command)
> +
> +So IpExtInOctets value is 20+16+48=84. The IpExtOutOctets is similar.
> +
> +IpExtInNoECTPkts
> +---------------
> +We could find IpExtInNoECTPkts in the nstat output, but kernel provide
> +four similar counters, we explain them together, they are:
> +* IpExtInNoECTPkts
> +* IpExtInECT1Pkts
> +* IpExtInECT0Pkts
> +* IpExtInCEPkts
> +
> +They indicate four kinds of ECN IP packets, they are defined here:
> +
> +https://tools.ietf.org/html/rfc3168#page-6
> +
> +These 4 counters calculate how many packets received per ECN
> +status. They count the real frame number regardless the LRO/GRO. So
> +for the same packet, you might find that IpInReceives count 1, but
> +IpExtInNoECTPkts counts 2 or more.
> +
> +additional explain
> +-----------------
> +The ip layer counters are recorded by the ip layer code in the kernel. I mean, if you send a packet to a lower layer directly, Linux
> +kernel won't record it. For example, tcpreplay will open an
> +AF_PACKET socket, and send the packet to layer 2, although it could send
> +an IP packet, you can't find it from the nstat output. Here is an
> +example:
> +
> +We capture the ping packet by tcpdump::
> +
> +  nstatuser@nstat-a:~$ sudo tcpdump -w /tmp/ping.pcap dst 8.8.8.8
> +
> +Then run ping command::
> +
> +  nstatuser@nstat-a:~$ ping 8.8.8.8 -c 1
> +
> +Terminate tcpdump by Ctrl-C, and run 'nstat -n' to update the nstat
> +history. Then run tcpreplay::
> +
> +  nstatuser@nstat-a:~$ sudo tcpreplay --intf1=ens3 /tmp/ping.pcap
> +  Actual: 1 packets (98 bytes) sent in 0.000278 seconds
> +  Rated: 352517.9 Bps, 2.82 Mbps, 3597.12 pps
> +  Flows: 1 flows, 3597.12 fps, 1 flow packets, 0 non-flow
> +  Statistics for network device: ens3
> +          Successful packets:        1
> +          Failed packets:            0
> +          Truncated packets:         0
> +          Retried packets (ENOBUFS): 0
> +          Retried packets (EAGAIN):  0
> +
> +Check the nstat output::
> +
> +  nstatuser@nstat-a:~$ nstat
> +  #kernel
> +  IpInReceives                    1                  0.0
> +  IpInDelivers                    1                  0.0
> +  IcmpInMsgs                      1                  0.0
> +  IcmpInEchoReps                  1                  0.0
> +  IcmpMsgInType0                  1                  0.0
> +  IpExtInOctets                   84                 0.0
> +  IpExtInNoECTPkts                1                  0.0
> +
> +We can see, nstat only show the received packet, because the IP layer
> +of kernel only know the reply of 8.8.8.8, it doesn't know what
> +tcpreplay sent.
> +
> +At the same time, when you use AF_INET socket, even you use the
> +SOCK_RAW option, the IP layer will still try to verify whether the
> +packet is an ICMP packet, if it is, kernel will still count it to its
> +counters and you can find it in the output of nstat.
> +
> +tcp 3 way handshake
> +==================
> +
> +On server side, we run::
> +
> +  nstatuser@nstat-b:~$ nc -lknv 0.0.0.0 9000
> +  Listening on [0.0.0.0] (family 0, port 9000)
> +
> +On client side, we run::
> +
> +  nstatuser@nstat-a:~$ nc -nv 192.168.122.251 9000
> +  Connection to 192.168.122.251 9000 port [tcp/*] succeeded!
> +
> +The server listened on tcp 9000 port, the client connected to it, they
> +completed the 3-way handshake.
> +
> +On server side, we can find below nstat output::
> +
> +  nstatuser@nstat-b:~$ nstat | grep -i tcp
> +  TcpPassiveOpens                 1                  0.0
> +  TcpInSegs                       2                  0.0
> +  TcpOutSegs                      1                  0.0
> +  TcpExtTCPPureAcks               1                  0.0
> +
> +On client side, we can find below nstat output::
> +
> +  nstatuser@nstat-a:~$ nstat | grep -i tcp
> +  TcpActiveOpens                  1                  0.0
> +  TcpInSegs                       1                  0.0
> +  TcpOutSegs                      2                  0.0
> +
> +Except for TcpExtTCPPureAcks, all other counters are defined by rfc1213
> +
> +* TcpActiveOpens
> +The number of times TCP connections have made a direct transition to
> +the SYN-SENT state from the CLOSED state.
> +
> +https://tools.ietf.org/html/rfc1213#page-47
> +
> +* TcpPassiveOpens
> +The number of times TCP connections have made a direct transition to
> +the SYN-RCVD state from the LISTEN state.
> +
> +https://tools.ietf.org/html/rfc1213#page-47
> +
> +* TcpInSegs
> +The total number of segments received, including those received in
> +error.  This count includes segments received on currently established
> +connections.
> +
> +https://tools.ietf.org/html/rfc1213#page-48
> +
> +* TcpOutSegs
> +The total number of segments sent, including those on current
> +connections but excluding those containing only retransmitted octets.
> +
> +https://tools.ietf.org/html/rfc1213#page-48
> +
> +
> +The TcpExtTCPPureAcks is an extension in linux kernel. When kernel
> +receives a TCP packet which set ACK flag and with no data, either
> +TcpExtTCPPureAcks or TcpExtTCPHPAcks will increase 1. We will discuss
> +it in a later section.
> +
> +Now we can easily explain the nstat outputs on the server side and client
> +side.
> +
> +When the server received the first syn, it replied a syn+ack, and came into
> +SYN-RCVD state, so TcpPassiveOpens increased 1. The server received
> +syn, sent syn+ack, received ack, so server sent 1 packet, received 2
> +packets, TcpInSegs increased 2, TcpOutSegs increased 1. The last ack
> +of the 3-way handshake is a pure ack without data, so
> +TcpExtTCPPureAcks increased 1.
> +
> +When the client sent syn, the client came into the SYN-SENT state, so
> +TcpActiveOpens increased 1, client sent syn, received syn+ack, sent
> +ack, so client sent 2 packets, received 1 packet, TcpInSegs increased
> +1, TcpOutSegs increased 2.
> +
> +Note: about TcpInSegs and TcpOutSegs, rfc1213 doesn't define the
> +behaviors when gso/gro/tso are enabled on the NIC (network interface
> +card). On current linux implementation, TcpOutSegs awares gso/tso, but
> +TcpInSegs doesn't aware gro. So TcpOutSegs will count the actual
> +packet number even only 1 packet is sent via tcp layer. If multiple
> +packets arrived at a NIC, and they are merged into 1 packet, TcpInSegs
> +will only count 1.
> +
> +tcp disconnect
> +=============
> +
> +Continue our previous example, on the server side, we have run::
> +
> +  nstatuser@nstat-b:~$ nc -lknv 0.0.0.0 9000
> +  Listening on [0.0.0.0] (family 0, port 9000)
> +
> +On client side, we have run::
> +
> +  nstatuser@nstat-a:~$ nc -nv 192.168.122.251 9000
> +  Connection to 192.168.122.251 9000 port [tcp/*] succeeded!
> +
> +Now we type Ctrl-C on the client side, stop the tcp connection between the
> +two nc command. Then we check the nstat output.
> +
> +On server side::
> +
> +  nstatuser@nstat-b:~$ nstat | grep -i tcp
> +  TcpInSegs                       2                  0.0
> +  TcpOutSegs                      1                  0.0
> +  TcpExtTCPPureAcks               1                  0.0
> +  TcpExtTCPOrigDataSent           1                  0.0
> +
> +On client side::
> +
> +  nstatuser@nstat-b:~$ nstat | grep -i tcp
> +  TcpInSegs                       2                  0.0
> +  TcpOutSegs                      1                  0.0
> +  TcpExtTCPPureAcks               1                  0.0
> +  TcpExtTCPOrigDataSent           1                  0.0
> +
> +Wait for more than 1 minute, run nstat on client again::
> +
> +  nstatuser@nstat-a:~$ nstat | grep -i tcp
> +  TcpExtTW                        1                  0.0
> +
> +Most of the counters are explained in the previous section except
> +two: TcpExtTCPOrigDataSent and TcpExtTW. Both of them are linux kernel
> +extensions.
> +
> +TcpExtTW means a tcp connection is closed normally via
> +time wait stage, not via tcp reuse process.
> +
> +About TcpExtTCPOrigDataSent, Below kernel patch has a good explanation:
> +
> +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f19c29e3e391a66a273e9afebaf01917245148cd
> +
> +I pasted it here::
> +
> +  TCPOrigDataSent: number of outgoing packets with original data
> +  (excluding retransmission but including data-in-SYN). This counter is
> +  different from TcpOutSegs because TcpOutSegs also tracks pure
> +  ACKs. TCPOrigDataSent is more useful to track the TCP retransmission rate.
> +
> +the effect of gso and gro
> +=======================
> +
> +The Generic Segmentation Offload (GSO) and Generic Receive Offload
> +would affect the metrics of the packet in/out on both ip and tcp
> +layer. Here is an iperf example. Before the test, run below command to
> +make sure both gso and gro are enabled on the NIC::
> +
> +  $ sudo ethtool -k ens3 | egrep '(generic-segmentation-offload|generic-receive-offload)'
> +  generic-segmentation-offload: on
> +  generic-receive-offload: on
> +
> +On server side, run::
> +
> +  iperf3 -s -p 9000
> +
> +On client side, run::
> +
> +  iperf3 -c 192.168.122.251 -p 9000 -t 5 -P 10
> +
> +The server listened on tcp port 9000, the client connected to the server,
> +created 10 threads parallel, run 5 seconds. After the pierf3 stopped, we
> +run nstat on both the server and client.
> +
> +On server side::
> +
> +  nstatuser@nstat-b:~$ nstat
> +  #kernel
> +  IpInReceives                    36346              0.0
> +  IpInDelivers                    36346              0.0
> +  IpOutRequests                   33836              0.0
> +  TcpPassiveOpens                 11                 0.0
> +  TcpEstabResets                  2                  0.0
> +  TcpInSegs                       36346              0.0
> +  TcpOutSegs                      33836              0.0
> +  TcpOutRsts                      20                 0.0
> +  TcpExtDelayedACKs               26                 0.0
> +  TcpExtTCPHPHits                 32120              0.0
> +  TcpExtTCPPureAcks               16                 0.0
> +  TcpExtTCPHPAcks                 5                  0.0
> +  TcpExtTCPAbortOnData            5                  0.0
> +  TcpExtTCPAbortOnClose           2                  0.0
> +  TcpExtTCPRcvCoalesce            7306               0.0
> +  TcpExtTCPOFOQueue               1354               0.0
> +  TcpExtTCPOrigDataSent           15                 0.0
> +  IpExtInOctets                   311732432          0.0
> +  IpExtOutOctets                  1785119            0.0
> +  IpExtInNoECTPkts                214032             0.0
> +
> +Client side::
> +
> +  nstatuser@nstat-a:~$ nstat
> +  #kernel
> +  IpInReceives                    33836              0.0
> +  IpInDelivers                    33836              0.0
> +  IpOutRequests                   43786              0.0
> +  TcpActiveOpens                  11                 0.0
> +  TcpEstabResets                  10                 0.0
> +  TcpInSegs                       33836              0.0
> +  TcpOutSegs                      214072             0.0
> +  TcpRetransSegs                  3876               0.0
> +  TcpExtDelayedACKs               7                  0.0
> +  TcpExtTCPHPHits                 5                  0.0
> +  TcpExtTCPPureAcks               2719               0.0
> +  TcpExtTCPHPAcks                 31071              0.0
> +  TcpExtTCPSackRecovery           607                0.0
> +  TcpExtTCPSACKReorder            61                 0.0
> +  TcpExtTCPLostRetransmit         90                 0.0
> +  TcpExtTCPFastRetrans            3806               0.0
> +  TcpExtTCPSlowStartRetrans       62                 0.0
> +  TcpExtTCPLossProbes             38                 0.0
> +  TcpExtTCPSackRecoveryFail       8                  0.0
> +  TcpExtTCPSackShifted            203                0.0
> +  TcpExtTCPSackMerged             778                0.0
> +  TcpExtTCPSackShiftFallback      700                0.0
> +  TcpExtTCPSpuriousRtxHostQueues  4                  0.0
> +  TcpExtTCPAutoCorking            14                 0.0
> +  TcpExtTCPOrigDataSent           214038             0.0
> +  TcpExtTCPHystartTrainDetect     8                  0.0
> +  TcpExtTCPHystartTrainCwnd       172                0.0
> +  IpExtInOctets                   1785227            0.0
> +  IpExtOutOctets                  317789680          0.0
> +  IpExtInNoECTPkts                33836              0.0
> +
> +The TcpOutSegs and IpOutRequests on the server are 33836, exactly the
> +same as IpExtInNoECTPkts, IpInReceives, IpInDelivers and TcpInSegs on
> +the client side. During iperf3 test, the server only reply very short
> +packets, so gso and gro has no effect on the server's reply.
> +
> +On the client side, TcpOutSegs is 214072, IpOutRequests is 43786, the
> +tcp layer packet out is larger than ip layer packet out, because
> +TcpOutSegs count the packet number after gso, but IpOutRequests
> +doesn't. On the server side, IpExtInNoECTPkts is 214032, this number
> +is smaller a little than the TcpOutSegs on the client side (214072), it
> +might cause by the packet loss. The IpInReceives, IpInDelivers and
> +TcpInSegs are obviously smaller than the TcpOutSegs on the client side,
> +because these counters calculate the packet after gro.
> +
> +tcp counters in established state
> +================================
> +
> +Run nc on server::
> +
> +  nstatuser@nstat-b:~$ nc -lkv 0.0.0.0 9000
> +  Listening on [0.0.0.0] (family 0, port 9000)
> +
> +Run nc on client:
> +
> +  nstatuser@nstat-a:~$ nc -v nstat-b 9000
> +  Connection to nstat-b 9000 port [tcp/*] succeeded!
> +
> +Input a string in the nc client ('hello' in our example):
> +
> +  nstatuser@nstat-a:~$ nc -v nstat-b 9000
> +  Connection to nstat-b 9000 port [tcp/*] succeeded!
> +  hello
> +
> +The client side nstat output:
> +
> +  nstatuser@nstat-a:~$ nstat
> +  #kernel
> +  IpInReceives                    1                  0.0
> +  IpInDelivers                    1                  0.0
> +  IpOutRequests                   1                  0.0
> +  TcpInSegs                       1                  0.0
> +  TcpOutSegs                      1                  0.0
> +  TcpExtTCPPureAcks               1                  0.0
> +  TcpExtTCPOrigDataSent           1                  0.0
> +  IpExtInOctets                   52                 0.0
> +  IpExtOutOctets                  58                 0.0
> +  IpExtInNoECTPkts                1                  0.0
> +
> +The server side nstat output:
> +
> +  nstatuser@nstat-b:~$ nstat
> +  #kernel
> +  IpInReceives                    1                  0.0
> +  IpInDelivers                    1                  0.0
> +  IpOutRequests                   1                  0.0
> +  TcpInSegs                       1                  0.0
> +  TcpOutSegs                      1                  0.0
> +  IpExtInOctets                   58                 0.0
> +  IpExtOutOctets                  52                 0.0
> +  IpExtInNoECTPkts                1                  0.0
> +
> +Input a string in nc client side again ('world' in our exmaple):
> +
> +  nstatuser@nstat-a:~$ nc -v nstat-b 9000
> +  Connection to nstat-b 9000 port [tcp/*] succeeded!
> +  hello
> +  world
> +
> +Client side nstat output:
> +
> +  nstatuser@nstat-a:~$ nstat
> +  #kernel
> +  IpInReceives                    1                  0.0
> +  IpInDelivers                    1                  0.0
> +  IpOutRequests                   1                  0.0
> +  TcpInSegs                       1                  0.0
> +  TcpOutSegs                      1                  0.0
> +  TcpExtTCPHPAcks                 1                  0.0
> +  TcpExtTCPOrigDataSent           1                  0.0
> +  IpExtInOctets                   52                 0.0
> +  IpExtOutOctets                  58                 0.0
> +  IpExtInNoECTPkts                1                  0.0
> +
> +
> +Server side nstat output:
> +
> +  nstatuser@nstat-b:~$ nstat
> +  #kernel
> +  IpInReceives                    1                  0.0
> +  IpInDelivers                    1                  0.0
> +  IpOutRequests                   1                  0.0
> +  TcpInSegs                       1                  0.0
> +  TcpOutSegs                      1                  0.0
> +  TcpExtTCPHPHits                 1                  0.0
> +  IpExtInOctets                   58                 0.0
> +  IpExtOutOctets                  52                 0.0
> +  IpExtInNoECTPkts                1                  0.0
> +
> +Compare the first client side output and the second client side
> +output, we could find one difference: the first one had a
> +'TcpExtTCPPureAcks', but the second one had a
> +'TcpExtTCPHPAcks'. The first server side output and the second server
> +side output had a difference too: the second server side output had a
> +TcpExtTCPHPHits, but the first server side output didn't have it. The
> +network traffic patterns were exactly the same: the client sent a packet to the server, the server replied an ack. But kernel handled them in different
> +ways. When kernel receives a tpc packet in the established status,
> +kernel has two paths to handle the packet, one is fast path, another
> +is slow path. The comment in kernel code provides a good explanation of
> +them, I paste them below:
> +
> +  It is split into a fast path and a slow path. The fast path is
> +  disabled when:
> +  - A zero window was announced from us - zero window probing
> +    is only handled properly on the slow path.
> +  - Out of order segments arrived.
> +  - Urgent data is expected.
> +  - There is no buffer space left
> +  - Unexpected TCP flags/window values/header lengths are received
> +    (detected by checking the TCP header against pred_flags)
> +  - Data is sent in both directions. The fast path only supports pure senders
> +    or pure receivers (this means either the sequence number or the ack
> +    value must stay constant)
> +  - Unexpected TCP option.
> +
> +Kernel will try to use fast path unless any of the above conditions
> +are satisfied. If the packets are out of order, kernel will handle
> +them in slow path, which means the performance might be not very
> +good. Kernel would also come into slow path if the "Delayed ack" is
> +used, because when using "Delayed ack", the data is sent in both
> +directions. When the tcp window scale option is not used, kernel will
> +try to enable fast path immediately when the connection comes into the established
> +state, but if the tcp window scale option is used, kernel will disable
> +the fast path at first, and try to enable it after kerenl receives
> +packets. We could use the 'ss' command to verify whether the window
> +scale option is used. e.g. run below command on either server or
> +client:
> +
> +  nstatuser@nstat-a:~$ ss -o state established -i '( dport = :9000 or sport = :9000 )
> +  Netid    Recv-Q     Send-Q            Local Address:Port             Peer Address:Port
> +  tcp      0          0               192.168.122.250:40654         192.168.122.251:9000
> +             ts sack cubic wscale:7,7 rto:204 rtt:0.98/0.49 mss:1448 pmtu:1500 rcvmss:536 advmss:1448 cwnd:10 bytes_acked:1 segs_out:2 segs_in:1 send 118.2Mbps lastsnd:46572 lastrcv:46572 lastack:46572 pacing_rate 236.4Mbps rcv_space:29200 rcv_ssthresh:29200 minrtt:0.98
> +
> +The 'wscale:7,7' means both server and client set the window scale
> +option to 7. Now we could explain the nstat output in our test:
> +
> +In the first nstat output of client side, the client sent a packet, server
> +reply an ack, when kernel handled this ack, the fast path was not
> +enabled, so the ack was counted into 'TcpExtTCPPureAcks'.
> +In the second nstat output of client side, the client sent a packet again,
> +and received another ack from the server, this time, the fast path is
> +enabled, and the ack was qualified for fast path, so it was handled by
> +the fast path, so this ack was counted into TcpExtTCPHPAcks.
> +In the first nstat output of server side, the fast path was not enabled,
> +so there was no 'TcpExtTCPHPHits'.
> +In the second nstat output of server side, the fast path was enabled,
> +and the packet received from client qualified for fast path, so it
> +was counted into 'TcpExtTCPHPHits'.
> +
> +tcp abort
> +========
> +
> +Some counters indicate the reaons why tcp layer want to send a rst,
> +they are:
> +* TcpExtTCPAbortOnData
> +* TcpExtTCPAbortOnClose
> +* TcpExtTCPAbortOnMemory
> +* TcpExtTCPAbortOnTimeout
> +* TcpExtTCPAbortOnLinger
> +* TcpExtTCPAbortFailed
> +
> +TcpExtTCPAbortOnData
> +-------------------
> +
> +It means tcp layer has data in flight, but need to close the
> +connection. So tcp layer sends a rst to the other side, indicate the
> +connection is not closed very graceful. An easy way to increase this
> +counter is using the SO_LINGER option. Please refer to the SO_LINGER
> +section of the socket man page:
> +
> +http://man7.org/linux/man-pages/man7/socket.7.html).
> +
> +By default, when an application closes a connection, the close function
> +will return immediately and kernel will try to send the in-flight data
> +async. If you use the SO_LINGER option, set l_onoff to 1, and l_linger
> +to a positive number, the close function won't return immediately, but
> +wait for the in-flight data are acked by the other side, the max wait
> +time is l_linger seconds. If set l_onoff to 1 and set l_linger to 0,
> +when the application closes a connection, kernel will send an rst
> +immediately, and increase the TcpExtTCPAbortOnData counter.
> +
> +We run nc on the server side::
> +
> +  nstatuser@nstat-b:~$ nc -lkv 0.0.0.0 9000
> +  Listening on [0.0.0.0] (family 0, port 9000)
> +
> +Run below python code on the client side::
> +
> +  import socket
> +  import struct
> +
> +  server = 'nstat-b' # server address
> +  port = 9000
> +
> +  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> +  s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
> +  s.connect((server, port))
> +  s.close()
> +
> +On client side, we could see TcpExtTCPAbortOnData increased::
> +
> +  nstatuser@nstat-a:~$ nstat | grep -i abort
> +  TcpExtTCPAbortOnData            1                  0.0
> +
> +If we capture packet by tcpdump, we could see the client send rst
> +instead of fin.
> +
> +
> +TcpExtTCPAbortOnClose
> +--------------------
> +
> +This counter means the tcp layer has unread data when an application
> +want to close a connection.
> +
> +On the server side, we run below python script:
> +
> +  import socket
> +  import time
> +
> +  port = 9000
> +
> +  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> +  s.bind(('0.0.0.0', port))
> +  s.listen(1)
> +  sock, addr = s.accept()
> +  while True:
> +      time.sleep(9999999)
> +
> +This python script listen on 9000 port, but doesn't read anything from
> +the connection.
> +
> +On the client side, we send the string "hello" by nc:
> +
> +  nstatuser@nstat-a:~$ echo "hello" | nc nstat-b 9000
> +
> +Then, we come back to the server side, the server has received the "hello"
> +packet, and tcp layer has acked this packet, but the application didn't
> +read it yet. We type Ctrl-C to terminate the server script. Then we
> +could find TcpExtTCPAbortOnClose increased 1 on the server side:
> +
> +  nstatuser@nstat-b:~$ nstat | grep -i abort
> +  TcpExtTCPAbortOnClose           1                  0.0
> +
> +If we run tcpdump on the server side, we could find the server sent a
> +rst after we type Ctrl-C.
> +
> +TcpExtTCPAbortOnMemory
> +--------------------
> +
> +When an application closes a tcp connection, kernel still need to track
> +the connection, let it complete the tcp disconnect process. E.g. an
> +app calls the close method of a socket, kernel sends fin to the other
> +side of the connection, then the app has no relationship with the
> +socket any more, but kernel need to keep the socket, this socket
> +becomes an orphan socket, kernel waits for the reply of the other side,
> +and would come to the TIME_WAIT state finally. When kernel has no
> +enough memory to keep the orphan socket, kernel would send an rst to
> +the other side, and delete the socket, in such situation, kernel will
> +increase 1 to the TcpExtTCPAbortOnMemory. Two conditions would trigger
> +TcpExtTCPAbortOnMemory:
> +
> +* the memory used by tcp protocol is higher than the third value of
> +the tcp_mem. Please refer the tcp_mem section in the tcp man page:
> +
> +http://man7.org/linux/man-pages/man7/tcp.7.html
> +
> +* the orphan socket count is higher than net.ipv4.tcp_max_orphans
> +
> +Below is an example which let the orphan socket count be higher than
> +net.ipv4.tcp_max_orphans.
> +
> +Change tcp_max_orphans to a smaller value on client::
> +
> +  sudo bash -c "echo 10 > /proc/sys/net/ipv4/tcp_max_orphans"
> +
> +Client code (create 64 connection to server)::
> +
> +  nstatuser@nstat-a:~$ cat client_orphan.py
> +  import socket
> +  import time
> +
> +  server = 'nstat-b' # server address
> +  port = 9000
> +
> +  count = 64
> +
> +  connection_list = []
> +
> +  for i in range(64):
> +      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> +      s.connect((server, port))
> +      connection_list.append(s)
> +      print("connection_count: %d" % len(connection_list))
> +
> +  while True:
> +      time.sleep(99999)
> +
> +Server code (accept 64 connection from client)::
> +
> +  nstatuser@nstat-b:~$ cat server_orphan.py
> +  import socket
> +  import time
> +
> +  port = 9000
> +  count = 64
> +
> +  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> +  s.bind(('0.0.0.0', port))
> +  s.listen(count)
> +  connection_list = []
> +  while True:
> +      sock, addr = s.accept()
> +      connection_list.append((sock, addr))
> +      print("connection_count: %d" % len(connection_list))
> +
> +Run the python scripts on server and client.
> +
> +On server::
> +
> +  python3 server_orphan.py
> +
> +On client::
> +
> +  python3 client_orphan.py
> +
> +Run iptables on server::
> +
> +  sudo iptables -A INPUT -i ens3 -p tcp --destination-port 9000 -j DROP
> +
> +Type Ctrl-C on client, stop client_orphan.py.
> +
> +Check TcpExtTCPAbortOnMemory on client::
> +
> +  nstatuser@nstat-a:~$ nstat | grep -i abort
> +  TcpExtTCPAbortOnMemory          54                 0.0
> +
> +Check orphane socket count on client::
> +
> +  nstatuser@nstat-a:~$ ss -s
> +  Total: 131 (kernel 0)
> +  TCP:   14 (estab 1, closed 0, orphaned 10, synrecv 0, timewait 0/0), ports 0
> +
> +  Transport Total     IP        IPv6
> +  *         0         -         -
> +  RAW       1         0         1
> +  UDP       1         1         0
> +  TCP       14        13        1
> +  INET      16        14        2
> +  FRAG      0         0         0
> +
> +The explanation of the test: after run server_orphan.py and
> +client_orphan.py, we set up 64 connections between server and
> +client. Run the iptables command, the server will drop all packets from
> +the client, type Ctrl-C on client_orphan.py, the system of the client
> +would try to close these connections, and before they are closed
> +gracefully, these connections became orphan sockets. As the iptables
> +of the server blocked packets from the client, the server won't receive fin
> +from the client, so all connection on clients would be stuck on FIN_WAIT_1
> +stage, so they will keep as orphan sockets until timeout. We have echo
> +10 to /proc/sys/net/ipv4/tcp_max_orphans, so the client system would
> +only keep 10 orphan sockets, for all other orphan sockets, the client
> +system sent rst for them and delete them. We have 64 connections, so
> +the 'ss -s' command shows the system has 10 orphan sockets, and the
> +value of TcpExtTCPAbortOnMemory was 54.
> +
> +An additional explanation about orphan socket count: You could find the
> +exactly orphan socket count by the 'ss -s' command, but when kernel
> +decide whither increases TcpExtTCPAbortOnMemory and sends rst, kernel
> +doesn't always check the exactly orphan socket count. For increasing
> +performance, kernel checks an approximate count firstly, if the
> +approximate count is more than tcp_max_orphans, kernel checks the
> +exact count again. So if the approximate count is less than
> +tcp_max_orphans, but exactly count is more than tcp_max_orphans, you
> +would find TcpExtTCPAbortOnMemory is not increased at all. If
> +tcp_max_orphans is large enough, it won't occur, but if you decrease
> +tcp_max_orphans to a small value like our test, you might find this
> +issue. So in our test, the client set up 64 connections although the
> +tcp_max_orphans is 10. If the client only set up 11 connections, we
> +can't find the change of TcpExtTCPAbortOnMemory.
> +
> +TcpExtTCPAbortOnTimeout
> +----------------------
> +This counter will increase when any of the tcp timers expire. In this
> +situation, kernel won't send rst, just give up the connection.
> +Continue the previous test, we wait for several minutes, because the
> +iptables on the server blocked the traffic, the server wouldn't receive
> +fin, and all the client's orphan sockets would timeout on the
> +FIN_WAIT_1 state finally. So we wait for a few minutes, we could find
> +10 timeout on the client::
> +
> +  nstatuser@nstat-a:~$ nstat | grep -i abort
> +  TcpExtTCPAbortOnTimeout         10                 0.0
> +
> +TcpExtTCPAbortOnLinger
> +---------------------
> +When a tcp connection comes into FIN_WAIT_2 state, instead of waiting
> +for the fin packet from the other side, kernel could send a rst and
> +delete the socket immediately. This is not the default behavior of
> +linux kernel tcp stack, but after configuring socket option, you could
> +let kernel follow this behavior. Below is an example.
> +
> +The server side code::
> +
> +  nstatuser@nstat-b:~$ cat server_linger.py
> +  import socket
> +  import time
> +
> +  port = 9000
> +
> +  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> +  s.bind(('0.0.0.0', port))
> +  s.listen(1)
> +  sock, addr = s.accept()
> +  while True:
> +      time.sleep(9999999)
> +
> +The client side code::
> +
> +  nstatuser@nstat-a:~$ cat client_linger.py
> +  import socket
> +  import struct
> +
> +  server = 'nstat-b' # server address
> +  port = 9000
> +
> +  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> +  s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 10))
> +  s.setsockopt(socket.SOL_TCP, socket.TCP_LINGER2, struct.pack('i', -1))
> +  s.connect((server, port))
> +  s.close()
> +
> +Run server_linger.py on server::
> +
> +  nstatuser@nstat-b:~$ python3 server_linger.py
> +
> +Run client_linger.py on client::
> +
> +  nstatuser@nstat-a:~$ python3 client_linger.py
> +
> +After run client_linger.py, check the output of nstat::
> +
> +  nstatuser@nstat-a:~$ nstat | grep -i abort
> +  TcpExtTCPAbortOnLinger          1                  0.0
> +
> +TcpExtTCPAbortFailed
> +-------------------
> +The kernel tcp layer will send rst if the RFC 2525 2.17 section is satisfied:
> +
> +https://tools.ietf.org/html/rfc2525#page-50
> +
> +If an internal error occurs during this process, TcpExtTCPAbortFailed
> +will be increased.
> +
> +TcpExtListenOverflows and TcpExtListenDrops
> +========================================
> +When kernel receive a syn from a client, and if the tcp accept queue
> +is full, kernel will drop the syn and add 1 to TcpExtListenOverflows.
> +At the same time kernel will also add 1 to TcpExtListenDrops. When
> +a tcp socket is in LISTEN state, and kernel need to drop a packet,
> +kernel would always add 1 to TcpExtListenDrops. So increase
> +TcpExtListenOverflows would let TcpExtListenDrops increasing at the
> +same time, but TcpExtListenDrops would also increase without
> +TcpExtListenOverflows increasing, e.g. a memory allocation fail would
> +also let TcpExtListenDrops increase.
> +
> +Note: The above explain bases on kernel 4.15 or above version, on an
> +old kernel, the tcp stack has different behavior when tcp accept queue
> +is full. On the old kernel, tcp stack won't drop the syn, it would
> +complete the 3-way handshake, but as the accept queue is full, tcp
> +stack will keep the socket in the tcp half-open queue. As it is in the
> +half open queue, tcp stack will send syn+ack on an exponential backoff
> +timer, after client replies ack, tcp stack checks whether the accept
> +queue is still full, if it is not full, move the socket to accept
> +queue, if it is full, keeps the socket in the half-open queue, at next
> +time client replies ack, this socket will get another chance to move
> +to the accept queue.
> +
> +Here is an example:
> +
> +On server, run the nc command, listen on port 9000::
> +
> +  nstatuser@nstat-b:~$ nc -lkv 0.0.0.0 9000
> +  Listening on [0.0.0.0] (family 0, port 9000)
> +
> +On client, run 3 nc commands in different terminals::
> +
> +  nstatuser@nstat-a:~$ nc -v nstat-b 9000
> +  Connection to nstat-b 9000 port [tcp/*] succeeded!
> +
> +The nc command only accepts 1 connection, and the accept queue length
> +is 1. On current linux implementation, set queue length to n means the
> +actual queue length is n+1. Now we create 3 connections, 1 is accepted
> +by nc, 2 in accepted queue, so the accept queue is full.
> +
> +Before running the 4th nc, we clean the nstat history on the server:
> +
> +  nstatuser@nstat-b:~$ nstat -n
> +
> +Run the 4th nc on the client:
> +
> +  nstatuser@nstat-a:~$ nc -v nstat-b 9000
> +
> +If the nc server is running on kernel 4.15 or higher version, you
> +won't see the "Connection to ... succeeded!" string, because kernel
> +will drop the syn if the accept queue is full. If the nc client is running
> +on an old kernel, you could see that the connection is succeeded,
> +because kernel would complete the 3-way handshake and keep the socket
> +on the half-open queue.
> +
> +Our test is on kernel 4.15, run nstat on the server:
> +
> +  nstatuser@nstat-b:~$ nstat
> +  #kernel
> +  IpInReceives                    4                  0.0
> +  IpInDelivers                    4                  0.0
> +  TcpInSegs                       4                  0.0
> +  TcpExtListenOverflows           4                  0.0
> +  TcpExtListenDrops               4                  0.0
> +  IpExtInOctets                   240                0.0
> +  IpExtInNoECTPkts                4                  0.0
> +
> +We can see both TcpExtListenOverflows and TcpExtListenDrops are 4. If
> +the time between the 4th nc and the nstat is longer, the value of
> +TcpExtListenOverflows and TcpExtListenDrops will be larger, because
> +the syn of the 4th nc is dropped, it keeps retrying.
> +
> --
> 2.17.1
>

^ permalink raw reply

* Re: [Patch net-next] net: dump more useful information in netdev_rx_csum_fault()
From: Yunsheng Lin @ 2018-11-10  2:44 UTC (permalink / raw)
  To: Cong Wang; +Cc: Linux Kernel Network Developers
In-Reply-To: <CAM_iQpWryiOQg23fZ2iveM25Rc-V8i5uvph4ezsD2dimqF4doA@mail.gmail.com>

On 2018/11/10 10:09, Cong Wang wrote:
> On Fri, Nov 9, 2018 at 6:02 PM Yunsheng Lin <linyunsheng@huawei.com> wrote:
>>
>> On 2018/11/10 9:42, Cong Wang wrote:
>>> On Fri, Nov 9, 2018 at 5:39 PM Yunsheng Lin <linyunsheng@huawei.com> wrote:
>>>>
>>>> On 2018/11/10 3:43, Cong Wang wrote:
>>>>> Currently netdev_rx_csum_fault() only shows a device name,
>>>>> we need more information about the skb for debugging.
>>>>>
>>>>> Sample output:
>>>>>
>>>>>  ens3: hw csum failure
>>>>>  dev features: 0x0000000000014b89
>>>>>  skb len=84 data_len=0 gso_size=0 gso_type=0 ip_summed=0 csum=0, csum_complete_sw=0, csum_valid=0
>>>>>
>>>>> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
>>>>> ---
>>>>>  include/linux/netdevice.h |  5 +++--
>>>>>  net/core/datagram.c       |  6 +++---
>>>>>  net/core/dev.c            | 10 ++++++++--
>>>>>  net/sunrpc/socklib.c      |  2 +-
>>>>>  4 files changed, 15 insertions(+), 8 deletions(-)
>>>>>
>>>>> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
>>>>> index 857f8abf7b91..fabcd9fa6cf7 100644
>>>>> --- a/include/linux/netdevice.h
>>>>> +++ b/include/linux/netdevice.h
>>>>> @@ -4332,9 +4332,10 @@ static inline bool can_checksum_protocol(netdev_features_t features,
>>>>>  }
>>>>>
>>>>>  #ifdef CONFIG_BUG
>>>>> -void netdev_rx_csum_fault(struct net_device *dev);
>>>>> +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb);
>>>>>  #else
>>>>> -static inline void netdev_rx_csum_fault(struct net_device *dev)
>>>>> +static inline void netdev_rx_csum_fault(struct net_device *dev,
>>>>> +                                     struct sk_buff *skb)
>>>>>  {
>>>>>  }
>>>>>  #endif
>>>>> diff --git a/net/core/datagram.c b/net/core/datagram.c
>>>>> index 57f3a6fcfc1e..d8f4d55cd6c5 100644
>>>>> --- a/net/core/datagram.c
>>>>> +++ b/net/core/datagram.c
>>>>> @@ -736,7 +736,7 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len)
>>>>>       if (likely(!sum)) {
>>>>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>>>>>                   !skb->csum_complete_sw)
>>>>> -                     netdev_rx_csum_fault(skb->dev);
>>>>> +                     netdev_rx_csum_fault(skb->dev, skb);
>>>>>       }
>>>>>       if (!skb_shared(skb))
>>>>>               skb->csum_valid = !sum;
>>>>> @@ -756,7 +756,7 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb)
>>>>>       if (likely(!sum)) {
>>>>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>>>>>                   !skb->csum_complete_sw)
>>>>> -                     netdev_rx_csum_fault(skb->dev);
>>>>> +                     netdev_rx_csum_fault(skb->dev, skb);
>>>>>       }
>>>>>
>>>>>       if (!skb_shared(skb)) {
>>>>> @@ -810,7 +810,7 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
>>>>>
>>>>>               if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>>>>>                   !skb->csum_complete_sw)
>>>>> -                     netdev_rx_csum_fault(NULL);
>>>>> +                     netdev_rx_csum_fault(NULL, skb);
>>>>>       }
>>>>>       return 0;
>>>>>  fault:
>>>>> diff --git a/net/core/dev.c b/net/core/dev.c
>>>>> index 0ffcbdd55fa9..2b337df26117 100644
>>>>> --- a/net/core/dev.c
>>>>> +++ b/net/core/dev.c
>>>>> @@ -3091,10 +3091,16 @@ EXPORT_SYMBOL(__skb_gso_segment);
>>>>>
>>>>>  /* Take action when hardware reception checksum errors are detected. */
>>>>>  #ifdef CONFIG_BUG
>>>>> -void netdev_rx_csum_fault(struct net_device *dev)
>>>>> +void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb)
>>>>>  {
>>>>>       if (net_ratelimit()) {
>>>>>               pr_err("%s: hw csum failure\n", dev ? dev->name : "<unknown>");
>>>>> +             if (dev)
>>>>> +                     pr_err("dev features: %pNF\n", &dev->features);
>>>>> +             pr_err("skb len=%d data_len=%d gso_size=%d gso_type=%d ip_summed=%d csum=%x, csum_complete_sw=%d, csum_valid=%d\n",
>>>>> +                    skb->len, skb->data_len, skb_shinfo(skb)->gso_size,
>>>>> +                    skb_shinfo(skb)->gso_type, skb->ip_summed, skb->csum,
>>>>> +                    skb->csum_complete_sw, skb->csum_valid);
>>>>
>>>>
>>>> This function also have the netdev available, use netdev_err to log the error?
>>>
>>> It is apparently not me who picked pr_err() from the beginning,
>>> I just follow that pr_err(). If you are not happy with it, please send
>>> a followup.
>>
>> Yes, but perhaps it is something to improve.
> 
> 
> Sure, no one stops you from improving it in a followup patch. :)
> 
> 
>> When using the netdev, then maybe it does not have to check if dev is null, because
>> netdev_err has handled the netdev being NULL case.
>> Maybe I missed something that netdev can not be used here?
>> If not, maybe I can send a followup.
>>
> 
> Maybe. Again, my patch intends to add a few debugging logs,
> not to convert pr_err() to whatever else, they are totally different
> goals. I choose pr_err() only because I follow the existing one,
> not to say which one is better than the other.

Ok. :)

> 
> Thanks.
> 
> .
> 

^ permalink raw reply

* [PATCH net-next] nfp: use the new __netdev_tx_sent_queue() BQL optimisation
From: Jakub Kicinski @ 2018-11-10  2:50 UTC (permalink / raw)
  To: davem; +Cc: netdev, oss-drivers, Jakub Kicinski

__netdev_tx_sent_queue() was added in commit e59020abf0f
("net: bql: add __netdev_tx_sent_queue()") and allows for
better GSO performance.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
---
 drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index b55c91818a67..9aa6265bf4de 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -890,8 +890,6 @@ static int nfp_net_tx(struct sk_buff *skb, struct net_device *netdev)
 		u64_stats_update_end(&r_vec->tx_sync);
 	}
 
-	netdev_tx_sent_queue(nd_q, txbuf->real_len);
-
 	skb_tx_timestamp(skb);
 
 	tx_ring->wr_p += nr_frags + 1;
@@ -899,7 +897,7 @@ static int nfp_net_tx(struct sk_buff *skb, struct net_device *netdev)
 		nfp_net_tx_ring_stop(nd_q, tx_ring);
 
 	tx_ring->wr_ptr_add += nr_frags + 1;
-	if (!skb->xmit_more || netif_xmit_stopped(nd_q))
+	if (__netdev_tx_sent_queue(nd_q, txbuf->real_len, skb->xmit_more))
 		nfp_net_tx_xmit_more_flush(tx_ring);
 
 	return NETDEV_TX_OK;
-- 
2.17.1

^ permalink raw reply related

* Re: [PATCH net-next 0/8] More accurate PHC<->system clock synchronization
From: David Miller @ 2018-11-10  3:44 UTC (permalink / raw)
  To: richardcochran
  Cc: mlichvar, netdev, jacob.e.keller, mtosatti, jeffrey.t.kirsher,
	michael.chan
In-Reply-To: <20181110014431.gc3yqjujsnjib2ue@localhost>

From: Richard Cochran <richardcochran@gmail.com>
Date: Fri, 9 Nov 2018 17:44:31 -0800

> On Fri, Nov 09, 2018 at 03:28:46PM -0800, David Miller wrote:
>> This series looks good to me but I want to give Richard an opportunity to
>> review it first.
> 
> The series is good to go.
> 
> Acked-by: Richard Cochran <richardcochran@gmail.com>

Great, series applied to net-next, thanks everyone.

^ permalink raw reply

* Re: [PATCH net] net: qualcomm: rmnet: Fix incorrect assignment of real_dev
From: David Miller @ 2018-11-10  3:46 UTC (permalink / raw)
  To: subashab; +Cc: netdev, stranche
In-Reply-To: <1541814987-28403-1-git-send-email-subashab@codeaurora.org>

From: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Date: Fri,  9 Nov 2018 18:56:27 -0700

> A null dereference was observed when a sysctl was being set
> from userspace and rmnet was stuck trying to complete some actions
> in the NETDEV_REGISTER callback. This is because the real_dev is set
> only after the device registration handler completes.
 ...
> Fixes: b752eff5be24 ("net: qualcomm: rmnet: Implement ndo_get_iflink")
> Signed-off-by: Sean Tranchetti <stranche@codeaurora.org>
> Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>

Applied and queued up for -stable, thanks.

^ permalink raw reply

* Re: [PATCH net-next] nfp: use the new __netdev_tx_sent_queue() BQL optimisation
From: David Miller @ 2018-11-10  3:49 UTC (permalink / raw)
  To: jakub.kicinski; +Cc: netdev, oss-drivers
In-Reply-To: <20181110025000.25793-1-jakub.kicinski@netronome.com>

From: Jakub Kicinski <jakub.kicinski@netronome.com>
Date: Fri,  9 Nov 2018 18:50:00 -0800

> __netdev_tx_sent_queue() was added in commit e59020abf0f
> ("net: bql: add __netdev_tx_sent_queue()") and allows for
> better GSO performance.
> 
> Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
> Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
> Reviewed-by: Simon Horman <simon.horman@netronome.com>

Applied.

^ permalink raw reply

* [PATCH net-next 2/6] nfp: flower: allow non repr netdev offload
From: Jakub Kicinski @ 2018-11-10  5:21 UTC (permalink / raw)
  To: davem
  Cc: oss-drivers, netdev, jiri, xiyou.wangcong, jhs, gerlitz.or, ozsh,
	vladbu, John Hurley
In-Reply-To: <20181110052131.3306-1-jakub.kicinski@netronome.com>

From: John Hurley <john.hurley@netronome.com>

Previously the offload functions in NFP assumed that the ingress (or
egress) netdev passed to them was an nfp repr.

Modify the driver to permit the passing of non repr netdevs as the ingress
device for an offload rule candidate. This may include devices such as
tunnels. The driver should then base its offload decision on a combination
of ingress device and egress port for a rule.

Signed-off-by: John Hurley <john.hurley@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 .../ethernet/netronome/nfp/flower/action.c    | 14 +++----
 .../net/ethernet/netronome/nfp/flower/main.h  |  3 +-
 .../net/ethernet/netronome/nfp/flower/match.c | 38 ++++++++++---------
 .../ethernet/netronome/nfp/flower/offload.c   | 33 +++++++++-------
 4 files changed, 49 insertions(+), 39 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c b/drivers/net/ethernet/netronome/nfp/flower/action.c
index fbc052d5bb47..2e64fe878da6 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/action.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/action.c
@@ -149,11 +149,12 @@ nfp_fl_output(struct nfp_app *app, struct nfp_fl_output *output,
 		/* Set action output parameters. */
 		output->flags = cpu_to_be16(tmp_flags);
 
-		/* Only offload if egress ports are on the same device as the
-		 * ingress port.
-		 */
-		if (!switchdev_port_same_parent_id(in_dev, out_dev))
-			return -EOPNOTSUPP;
+		if (nfp_netdev_is_nfp_repr(in_dev)) {
+			/* Confirm ingress and egress are on same device. */
+			if (!switchdev_port_same_parent_id(in_dev, out_dev))
+				return -EOPNOTSUPP;
+		}
+
 		if (!nfp_netdev_is_nfp_repr(out_dev))
 			return -EOPNOTSUPP;
 
@@ -840,9 +841,8 @@ nfp_flower_loop_action(struct nfp_app *app, const struct tc_action *a,
 		*a_len += sizeof(struct nfp_fl_push_vlan);
 	} else if (is_tcf_tunnel_set(a)) {
 		struct ip_tunnel_info *ip_tun = tcf_tunnel_info(a);
-		struct nfp_repr *repr = netdev_priv(netdev);
 
-		*tun_type = nfp_fl_get_tun_from_act_l4_port(repr->app, a);
+		*tun_type = nfp_fl_get_tun_from_act_l4_port(app, a);
 		if (*tun_type == NFP_FL_TUNNEL_NONE)
 			return -EOPNOTSUPP;
 
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.h b/drivers/net/ethernet/netronome/nfp/flower/main.h
index 0f6f1675f6f1..4a2b1a915131 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/main.h
+++ b/drivers/net/ethernet/netronome/nfp/flower/main.h
@@ -222,7 +222,8 @@ void nfp_flower_metadata_cleanup(struct nfp_app *app);
 
 int nfp_flower_setup_tc(struct nfp_app *app, struct net_device *netdev,
 			enum tc_setup_type type, void *type_data);
-int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,
+int nfp_flower_compile_flow_match(struct nfp_app *app,
+				  struct tc_cls_flower_offload *flow,
 				  struct nfp_fl_key_ls *key_ls,
 				  struct net_device *netdev,
 				  struct nfp_fl_payload *nfp_flow,
diff --git a/drivers/net/ethernet/netronome/nfp/flower/match.c b/drivers/net/ethernet/netronome/nfp/flower/match.c
index e54fb6034326..cdf75595f627 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/match.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/match.c
@@ -52,10 +52,13 @@ nfp_flower_compile_port(struct nfp_flower_in_port *frame, u32 cmsg_port,
 		return 0;
 	}
 
-	if (tun_type)
+	if (tun_type) {
 		frame->in_port = cpu_to_be32(NFP_FL_PORT_TYPE_TUN | tun_type);
-	else
+	} else {
+		if (!cmsg_port)
+			return -EOPNOTSUPP;
 		frame->in_port = cpu_to_be32(cmsg_port);
+	}
 
 	return 0;
 }
@@ -289,17 +292,21 @@ nfp_flower_compile_ipv4_udp_tun(struct nfp_flower_ipv4_udp_tun *frame,
 	}
 }
 
-int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,
+int nfp_flower_compile_flow_match(struct nfp_app *app,
+				  struct tc_cls_flower_offload *flow,
 				  struct nfp_fl_key_ls *key_ls,
 				  struct net_device *netdev,
 				  struct nfp_fl_payload *nfp_flow,
 				  enum nfp_flower_tun_type tun_type)
 {
-	struct nfp_repr *netdev_repr;
+	u32 cmsg_port = 0;
 	int err;
 	u8 *ext;
 	u8 *msk;
 
+	if (nfp_netdev_is_nfp_repr(netdev))
+		cmsg_port = nfp_repr_get_port_id(netdev);
+
 	memset(nfp_flow->unmasked_data, 0, key_ls->key_size);
 	memset(nfp_flow->mask_data, 0, key_ls->key_size);
 
@@ -327,15 +334,13 @@ int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,
 
 	/* Populate Exact Port data. */
 	err = nfp_flower_compile_port((struct nfp_flower_in_port *)ext,
-				      nfp_repr_get_port_id(netdev),
-				      false, tun_type);
+				      cmsg_port, false, tun_type);
 	if (err)
 		return err;
 
 	/* Populate Mask Port Data. */
 	err = nfp_flower_compile_port((struct nfp_flower_in_port *)msk,
-				      nfp_repr_get_port_id(netdev),
-				      true, tun_type);
+				      cmsg_port, true, tun_type);
 	if (err)
 		return err;
 
@@ -399,16 +404,13 @@ int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,
 		msk += sizeof(struct nfp_flower_ipv4_udp_tun);
 
 		/* Configure tunnel end point MAC. */
-		if (nfp_netdev_is_nfp_repr(netdev)) {
-			netdev_repr = netdev_priv(netdev);
-			nfp_tunnel_write_macs(netdev_repr->app);
-
-			/* Store the tunnel destination in the rule data.
-			 * This must be present and be an exact match.
-			 */
-			nfp_flow->nfp_tun_ipv4_addr = tun_dst;
-			nfp_tunnel_add_ipv4_off(netdev_repr->app, tun_dst);
-		}
+		nfp_tunnel_write_macs(app);
+
+		/* Store the tunnel destination in the rule data.
+		 * This must be present and be an exact match.
+		 */
+		nfp_flow->nfp_tun_ipv4_addr = tun_dst;
+		nfp_tunnel_add_ipv4_off(app, tun_dst);
 
 		if (key_ls->key_layer_two & NFP_FLOWER_LAYER2_GENEVE_OP) {
 			err = nfp_flower_compile_geneve_opt(ext, flow, false);
diff --git a/drivers/net/ethernet/netronome/nfp/flower/offload.c b/drivers/net/ethernet/netronome/nfp/flower/offload.c
index 29c95423ab64..2c32edfc1a9d 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/offload.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/offload.c
@@ -56,11 +56,10 @@
 	 BIT(FLOW_DISSECTOR_KEY_ENC_PORTS))
 
 static int
-nfp_flower_xmit_flow(struct net_device *netdev,
-		     struct nfp_fl_payload *nfp_flow, u8 mtype)
+nfp_flower_xmit_flow(struct nfp_app *app, struct nfp_fl_payload *nfp_flow,
+		     u8 mtype)
 {
 	u32 meta_len, key_len, mask_len, act_len, tot_len;
-	struct nfp_repr *priv = netdev_priv(netdev);
 	struct sk_buff *skb;
 	unsigned char *msg;
 
@@ -78,7 +77,7 @@ nfp_flower_xmit_flow(struct net_device *netdev,
 	nfp_flow->meta.mask_len >>= NFP_FL_LW_SIZ;
 	nfp_flow->meta.act_len >>= NFP_FL_LW_SIZ;
 
-	skb = nfp_flower_cmsg_alloc(priv->app, tot_len, mtype, GFP_KERNEL);
+	skb = nfp_flower_cmsg_alloc(app, tot_len, mtype, GFP_KERNEL);
 	if (!skb)
 		return -ENOMEM;
 
@@ -96,7 +95,7 @@ nfp_flower_xmit_flow(struct net_device *netdev,
 	nfp_flow->meta.mask_len <<= NFP_FL_LW_SIZ;
 	nfp_flow->meta.act_len <<= NFP_FL_LW_SIZ;
 
-	nfp_ctrl_tx(priv->app->ctrl, skb);
+	nfp_ctrl_tx(app->ctrl, skb);
 
 	return 0;
 }
@@ -427,13 +426,16 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
 		       struct tc_cls_flower_offload *flow, bool egress)
 {
 	enum nfp_flower_tun_type tun_type = NFP_FL_TUNNEL_NONE;
-	struct nfp_port *port = nfp_port_from_netdev(netdev);
 	struct nfp_flower_priv *priv = app->priv;
 	struct nfp_fl_payload *flow_pay;
 	struct nfp_fl_key_ls *key_layer;
+	struct nfp_port *port = NULL;
 	struct net_device *ingr_dev;
 	int err;
 
+	if (nfp_netdev_is_nfp_repr(netdev))
+		port = nfp_port_from_netdev(netdev);
+
 	ingr_dev = egress ? NULL : netdev;
 	flow_pay = nfp_flower_search_fl_table(app, flow->cookie, ingr_dev,
 					      NFP_FL_STATS_CTX_DONT_CARE);
@@ -462,8 +464,8 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
 
 	flow_pay->ingress_dev = egress ? NULL : netdev;
 
-	err = nfp_flower_compile_flow_match(flow, key_layer, netdev, flow_pay,
-					    tun_type);
+	err = nfp_flower_compile_flow_match(app, flow, key_layer, netdev,
+					    flow_pay, tun_type);
 	if (err)
 		goto err_destroy_flow;
 
@@ -476,7 +478,7 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
 	if (err)
 		goto err_destroy_flow;
 
-	err = nfp_flower_xmit_flow(netdev, flow_pay,
+	err = nfp_flower_xmit_flow(app, flow_pay,
 				   NFP_FLOWER_CMSG_TYPE_FLOW_ADD);
 	if (err)
 		goto err_destroy_flow;
@@ -487,7 +489,8 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
 	if (err)
 		goto err_destroy_flow;
 
-	port->tc_offload_cnt++;
+	if (port)
+		port->tc_offload_cnt++;
 
 	/* Deallocate flow payload when flower rule has been destroyed. */
 	kfree(key_layer);
@@ -520,12 +523,15 @@ static int
 nfp_flower_del_offload(struct nfp_app *app, struct net_device *netdev,
 		       struct tc_cls_flower_offload *flow, bool egress)
 {
-	struct nfp_port *port = nfp_port_from_netdev(netdev);
 	struct nfp_flower_priv *priv = app->priv;
 	struct nfp_fl_payload *nfp_flow;
+	struct nfp_port *port = NULL;
 	struct net_device *ingr_dev;
 	int err;
 
+	if (nfp_netdev_is_nfp_repr(netdev))
+		port = nfp_port_from_netdev(netdev);
+
 	ingr_dev = egress ? NULL : netdev;
 	nfp_flow = nfp_flower_search_fl_table(app, flow->cookie, ingr_dev,
 					      NFP_FL_STATS_CTX_DONT_CARE);
@@ -539,13 +545,14 @@ nfp_flower_del_offload(struct nfp_app *app, struct net_device *netdev,
 	if (nfp_flow->nfp_tun_ipv4_addr)
 		nfp_tunnel_del_ipv4_off(app, nfp_flow->nfp_tun_ipv4_addr);
 
-	err = nfp_flower_xmit_flow(netdev, nfp_flow,
+	err = nfp_flower_xmit_flow(app, nfp_flow,
 				   NFP_FLOWER_CMSG_TYPE_FLOW_DEL);
 	if (err)
 		goto err_free_flow;
 
 err_free_flow:
-	port->tc_offload_cnt--;
+	if (port)
+		port->tc_offload_cnt--;
 	kfree(nfp_flow->action_data);
 	kfree(nfp_flow->mask_data);
 	kfree(nfp_flow->unmasked_data);
-- 
2.17.1

^ permalink raw reply related

* [PATCH net-next 3/6] nfp: flower: increase scope of netdev checking functions
From: Jakub Kicinski @ 2018-11-10  5:21 UTC (permalink / raw)
  To: davem
  Cc: oss-drivers, netdev, jiri, xiyou.wangcong, jhs, gerlitz.or, ozsh,
	vladbu, John Hurley
In-Reply-To: <20181110052131.3306-1-jakub.kicinski@netronome.com>

From: John Hurley <john.hurley@netronome.com>

Both the actions and tunnel_conf files contain local functions that check
the type of an input netdev. In preparation for re-use with tunnel offload
via indirect blocks, move these to static inline functions in a header
file.

Signed-off-by: John Hurley <john.hurley@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 .../ethernet/netronome/nfp/flower/action.c    | 14 ----------
 .../net/ethernet/netronome/nfp/flower/cmsg.h  | 27 +++++++++++++++++++
 .../netronome/nfp/flower/tunnel_conf.c        | 19 ++-----------
 3 files changed, 29 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c b/drivers/net/ethernet/netronome/nfp/flower/action.c
index 2e64fe878da6..8d54b36afee8 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/action.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/action.c
@@ -2,7 +2,6 @@
 /* Copyright (C) 2017-2018 Netronome Systems, Inc. */
 
 #include <linux/bitfield.h>
-#include <net/geneve.h>
 #include <net/pkt_cls.h>
 #include <net/switchdev.h>
 #include <net/tc_act/tc_csum.h>
@@ -11,7 +10,6 @@
 #include <net/tc_act/tc_pedit.h>
 #include <net/tc_act/tc_vlan.h>
 #include <net/tc_act/tc_tunnel_key.h>
-#include <net/vxlan.h>
 
 #include "cmsg.h"
 #include "main.h"
@@ -92,18 +90,6 @@ nfp_fl_pre_lag(struct nfp_app *app, const struct tc_action *action,
 	return act_size;
 }
 
-static bool nfp_fl_netdev_is_tunnel_type(struct net_device *out_dev,
-					 enum nfp_flower_tun_type tun_type)
-{
-	if (netif_is_vxlan(out_dev))
-		return tun_type == NFP_FL_TUNNEL_VXLAN;
-
-	if (netif_is_geneve(out_dev))
-		return tun_type == NFP_FL_TUNNEL_GENEVE;
-
-	return false;
-}
-
 static int
 nfp_fl_output(struct nfp_app *app, struct nfp_fl_output *output,
 	      const struct tc_action *action, struct nfp_fl_payload *nfp_flow,
diff --git a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h
index 3e391555e191..15f41cfef9f1 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h
+++ b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h
@@ -8,6 +8,7 @@
 #include <linux/skbuff.h>
 #include <linux/types.h>
 #include <net/geneve.h>
+#include <net/vxlan.h>
 
 #include "../nfp_app.h"
 #include "../nfpcore/nfp_cpp.h"
@@ -499,6 +500,32 @@ static inline int nfp_flower_cmsg_get_data_len(struct sk_buff *skb)
 	return skb->len - NFP_FLOWER_CMSG_HLEN;
 }
 
+static inline bool
+nfp_fl_netdev_is_tunnel_type(struct net_device *netdev,
+			     enum nfp_flower_tun_type tun_type)
+{
+	if (netif_is_vxlan(netdev))
+		return tun_type == NFP_FL_TUNNEL_VXLAN;
+	if (netif_is_geneve(netdev))
+		return tun_type == NFP_FL_TUNNEL_GENEVE;
+
+	return false;
+}
+
+static inline bool nfp_fl_is_netdev_to_offload(struct net_device *netdev)
+{
+	if (!netdev->rtnl_link_ops)
+		return false;
+	if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch"))
+		return true;
+	if (netif_is_vxlan(netdev))
+		return true;
+	if (netif_is_geneve(netdev))
+		return true;
+
+	return false;
+}
+
 struct sk_buff *
 nfp_flower_cmsg_mac_repr_start(struct nfp_app *app, unsigned int num_ports);
 void
diff --git a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
index 5d641d7dabff..2d9f26a725c2 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
@@ -4,7 +4,6 @@
 #include <linux/etherdevice.h>
 #include <linux/inetdevice.h>
 #include <net/netevent.h>
-#include <net/vxlan.h>
 #include <linux/idr.h>
 #include <net/dst_metadata.h>
 #include <net/arp.h>
@@ -182,20 +181,6 @@ void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb)
 	}
 }
 
-static bool nfp_tun_is_netdev_to_offload(struct net_device *netdev)
-{
-	if (!netdev->rtnl_link_ops)
-		return false;
-	if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch"))
-		return true;
-	if (netif_is_vxlan(netdev))
-		return true;
-	if (netif_is_geneve(netdev))
-		return true;
-
-	return false;
-}
-
 static int
 nfp_flower_xmit_tun_conf(struct nfp_app *app, u8 mtype, u16 plen, void *pdata,
 			 gfp_t flag)
@@ -617,7 +602,7 @@ static void nfp_tun_add_to_mac_offload_list(struct net_device *netdev,
 
 	if (nfp_netdev_is_nfp_repr(netdev))
 		port = nfp_repr_get_port_id(netdev);
-	else if (!nfp_tun_is_netdev_to_offload(netdev))
+	else if (!nfp_fl_is_netdev_to_offload(netdev))
 		return;
 
 	entry = kmalloc(sizeof(*entry), GFP_KERNEL);
@@ -660,7 +645,7 @@ int nfp_tunnel_mac_event_handler(struct nfp_app *app,
 {
 	if (event == NETDEV_DOWN || event == NETDEV_UNREGISTER) {
 		/* If non-nfp netdev then free its offload index. */
-		if (nfp_tun_is_netdev_to_offload(netdev))
+		if (nfp_fl_is_netdev_to_offload(netdev))
 			nfp_tun_del_mac_idx(app, netdev->ifindex);
 	} else if (event == NETDEV_UP || event == NETDEV_CHANGEADDR ||
 		   event == NETDEV_REGISTER) {
-- 
2.17.1

^ permalink raw reply related

* [PATCH net-next 1/6] net: sched: register callbacks for indirect tc block binds
From: Jakub Kicinski @ 2018-11-10  5:21 UTC (permalink / raw)
  To: davem
  Cc: oss-drivers, netdev, jiri, xiyou.wangcong, jhs, gerlitz.or, ozsh,
	vladbu, John Hurley, Jakub Kicinski
In-Reply-To: <20181110052131.3306-1-jakub.kicinski@netronome.com>

From: John Hurley <john.hurley@netronome.com>

Currently drivers can register to receive TC block bind/unbind callbacks
by implementing the setup_tc ndo in any of their given netdevs. However,
drivers may also be interested in binds to higher level devices (e.g.
tunnel drivers) to potentially offload filters applied to them.

Introduce indirect block devs which allows drivers to register callbacks
for block binds on other devices. The callback is triggered when the
device is bound to a block, allowing the driver to register for rules
applied to that block using already available functions.

Freeing an indirect block callback will trigger an unbind event (if
necessary) to direct the driver to remove any offloaded rules and unreg
any block rule callbacks. It is the responsibility of the implementing
driver to clean any registered indirect block callbacks before exiting,
if the block it still active at such a time.

Allow registering an indirect block dev callback for a device that is
already bound to a block. In this case (if it is an ingress block),
register and also trigger the callback meaning that any already installed
rules can be replayed to the calling driver.

Signed-off-by: John Hurley <john.hurley@netronome.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 include/net/pkt_cls.h     |  34 +++++
 include/net/sch_generic.h |   3 +
 net/sched/cls_api.c       | 256 +++++++++++++++++++++++++++++++++++++-
 3 files changed, 292 insertions(+), 1 deletion(-)

diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h
index 00f71644fbcd..f6c0cd29dea4 100644
--- a/include/net/pkt_cls.h
+++ b/include/net/pkt_cls.h
@@ -81,6 +81,14 @@ void __tcf_block_cb_unregister(struct tcf_block *block,
 			       struct tcf_block_cb *block_cb);
 void tcf_block_cb_unregister(struct tcf_block *block,
 			     tc_setup_cb_t *cb, void *cb_ident);
+int __tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
+				tc_indr_block_bind_cb_t *cb, void *cb_ident);
+int tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
+			      tc_indr_block_bind_cb_t *cb, void *cb_ident);
+void __tc_indr_block_cb_unregister(struct net_device *dev,
+				   tc_indr_block_bind_cb_t *cb, void *cb_ident);
+void tc_indr_block_cb_unregister(struct net_device *dev,
+				 tc_indr_block_bind_cb_t *cb, void *cb_ident);
 
 int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
 		 struct tcf_result *res, bool compat_mode);
@@ -183,6 +191,32 @@ void tcf_block_cb_unregister(struct tcf_block *block,
 {
 }
 
+static inline
+int __tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
+				tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+	return 0;
+}
+
+static inline
+int tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
+			      tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+	return 0;
+}
+
+static inline
+void __tc_indr_block_cb_unregister(struct net_device *dev,
+				   tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+}
+
+static inline
+void tc_indr_block_cb_unregister(struct net_device *dev,
+				 tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+}
+
 static inline int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
 			       struct tcf_result *res, bool compat_mode)
 {
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index a8dd1fc141b6..9481f2c142e2 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -24,6 +24,9 @@ struct bpf_flow_keys;
 typedef int tc_setup_cb_t(enum tc_setup_type type,
 			  void *type_data, void *cb_priv);
 
+typedef int tc_indr_block_bind_cb_t(struct net_device *dev, void *cb_priv,
+				    enum tc_setup_type type, void *type_data);
+
 struct qdisc_rate_table {
 	struct tc_ratespec rate;
 	u32		data[256];
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index f427a1e00e7e..d92f44ac4c39 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -25,6 +25,7 @@
 #include <linux/kmod.h>
 #include <linux/slab.h>
 #include <linux/idr.h>
+#include <linux/rhashtable.h>
 #include <net/net_namespace.h>
 #include <net/sock.h>
 #include <net/netlink.h>
@@ -365,6 +366,245 @@ static void tcf_chain_flush(struct tcf_chain *chain)
 	}
 }
 
+static struct tcf_block *tc_dev_ingress_block(struct net_device *dev)
+{
+	const struct Qdisc_class_ops *cops;
+	struct Qdisc *qdisc;
+
+	if (!dev_ingress_queue(dev))
+		return NULL;
+
+	qdisc = dev_ingress_queue(dev)->qdisc_sleeping;
+	if (!qdisc)
+		return NULL;
+
+	cops = qdisc->ops->cl_ops;
+	if (!cops)
+		return NULL;
+
+	if (!cops->tcf_block)
+		return NULL;
+
+	return cops->tcf_block(qdisc, TC_H_MIN_INGRESS, NULL);
+}
+
+static struct rhashtable indr_setup_block_ht;
+
+struct tc_indr_block_dev {
+	struct rhash_head ht_node;
+	struct net_device *dev;
+	unsigned int refcnt;
+	struct list_head cb_list;
+	struct tcf_block *block;
+};
+
+struct tc_indr_block_cb {
+	struct list_head list;
+	void *cb_priv;
+	tc_indr_block_bind_cb_t *cb;
+	void *cb_ident;
+};
+
+static const struct rhashtable_params tc_indr_setup_block_ht_params = {
+	.key_offset	= offsetof(struct tc_indr_block_dev, dev),
+	.head_offset	= offsetof(struct tc_indr_block_dev, ht_node),
+	.key_len	= sizeof(struct net_device *),
+};
+
+static struct tc_indr_block_dev *
+tc_indr_block_dev_lookup(struct net_device *dev)
+{
+	return rhashtable_lookup_fast(&indr_setup_block_ht, &dev,
+				      tc_indr_setup_block_ht_params);
+}
+
+static struct tc_indr_block_dev *tc_indr_block_dev_get(struct net_device *dev)
+{
+	struct tc_indr_block_dev *indr_dev;
+
+	indr_dev = tc_indr_block_dev_lookup(dev);
+	if (indr_dev)
+		goto inc_ref;
+
+	indr_dev = kzalloc(sizeof(*indr_dev), GFP_KERNEL);
+	if (!indr_dev)
+		return NULL;
+
+	INIT_LIST_HEAD(&indr_dev->cb_list);
+	indr_dev->dev = dev;
+	indr_dev->block = tc_dev_ingress_block(dev);
+	if (rhashtable_insert_fast(&indr_setup_block_ht, &indr_dev->ht_node,
+				   tc_indr_setup_block_ht_params)) {
+		kfree(indr_dev);
+		return NULL;
+	}
+
+inc_ref:
+	indr_dev->refcnt++;
+	return indr_dev;
+}
+
+static void tc_indr_block_dev_put(struct tc_indr_block_dev *indr_dev)
+{
+	if (--indr_dev->refcnt)
+		return;
+
+	rhashtable_remove_fast(&indr_setup_block_ht, &indr_dev->ht_node,
+			       tc_indr_setup_block_ht_params);
+	kfree(indr_dev);
+}
+
+static struct tc_indr_block_cb *
+tc_indr_block_cb_lookup(struct tc_indr_block_dev *indr_dev,
+			tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+	struct tc_indr_block_cb *indr_block_cb;
+
+	list_for_each_entry(indr_block_cb, &indr_dev->cb_list, list)
+		if (indr_block_cb->cb == cb &&
+		    indr_block_cb->cb_ident == cb_ident)
+			return indr_block_cb;
+	return NULL;
+}
+
+static struct tc_indr_block_cb *
+tc_indr_block_cb_add(struct tc_indr_block_dev *indr_dev, void *cb_priv,
+		     tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+	struct tc_indr_block_cb *indr_block_cb;
+
+	indr_block_cb = tc_indr_block_cb_lookup(indr_dev, cb, cb_ident);
+	if (indr_block_cb)
+		return ERR_PTR(-EEXIST);
+
+	indr_block_cb = kzalloc(sizeof(*indr_block_cb), GFP_KERNEL);
+	if (!indr_block_cb)
+		return ERR_PTR(-ENOMEM);
+
+	indr_block_cb->cb_priv = cb_priv;
+	indr_block_cb->cb = cb;
+	indr_block_cb->cb_ident = cb_ident;
+	list_add(&indr_block_cb->list, &indr_dev->cb_list);
+
+	return indr_block_cb;
+}
+
+static void tc_indr_block_cb_del(struct tc_indr_block_cb *indr_block_cb)
+{
+	list_del(&indr_block_cb->list);
+	kfree(indr_block_cb);
+}
+
+static void tc_indr_block_ing_cmd(struct tc_indr_block_dev *indr_dev,
+				  struct tc_indr_block_cb *indr_block_cb,
+				  enum tc_block_command command)
+{
+	struct tc_block_offload bo = {
+		.command	= command,
+		.binder_type	= TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS,
+		.block		= indr_dev->block,
+	};
+
+	if (!indr_dev->block)
+		return;
+
+	indr_block_cb->cb(indr_dev->dev, indr_block_cb->cb_priv, TC_SETUP_BLOCK,
+			  &bo);
+}
+
+int __tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
+				tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+	struct tc_indr_block_cb *indr_block_cb;
+	struct tc_indr_block_dev *indr_dev;
+	int err;
+
+	indr_dev = tc_indr_block_dev_get(dev);
+	if (!indr_dev)
+		return -ENOMEM;
+
+	indr_block_cb = tc_indr_block_cb_add(indr_dev, cb_priv, cb, cb_ident);
+	err = PTR_ERR_OR_ZERO(indr_block_cb);
+	if (err)
+		goto err_dev_put;
+
+	tc_indr_block_ing_cmd(indr_dev, indr_block_cb, TC_BLOCK_BIND);
+	return 0;
+
+err_dev_put:
+	tc_indr_block_dev_put(indr_dev);
+	return err;
+}
+EXPORT_SYMBOL_GPL(__tc_indr_block_cb_register);
+
+int tc_indr_block_cb_register(struct net_device *dev, void *cb_priv,
+			      tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+	int err;
+
+	rtnl_lock();
+	err = __tc_indr_block_cb_register(dev, cb_priv, cb, cb_ident);
+	rtnl_unlock();
+
+	return err;
+}
+EXPORT_SYMBOL_GPL(tc_indr_block_cb_register);
+
+void __tc_indr_block_cb_unregister(struct net_device *dev,
+				   tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+	struct tc_indr_block_cb *indr_block_cb;
+	struct tc_indr_block_dev *indr_dev;
+
+	indr_dev = tc_indr_block_dev_lookup(dev);
+	if (!indr_dev)
+		return;
+
+	indr_block_cb = tc_indr_block_cb_lookup(indr_dev, cb, cb_ident);
+	if (!indr_block_cb)
+		return;
+
+	/* Send unbind message if required to free any block cbs. */
+	tc_indr_block_ing_cmd(indr_dev, indr_block_cb, TC_BLOCK_UNBIND);
+	tc_indr_block_cb_del(indr_block_cb);
+	tc_indr_block_dev_put(indr_dev);
+}
+EXPORT_SYMBOL_GPL(__tc_indr_block_cb_unregister);
+
+void tc_indr_block_cb_unregister(struct net_device *dev,
+				 tc_indr_block_bind_cb_t *cb, void *cb_ident)
+{
+	rtnl_lock();
+	__tc_indr_block_cb_unregister(dev, cb, cb_ident);
+	rtnl_unlock();
+}
+EXPORT_SYMBOL_GPL(tc_indr_block_cb_unregister);
+
+static void tc_indr_block_call(struct tcf_block *block, struct net_device *dev,
+			       struct tcf_block_ext_info *ei,
+			       enum tc_block_command command,
+			       struct netlink_ext_ack *extack)
+{
+	struct tc_indr_block_cb *indr_block_cb;
+	struct tc_indr_block_dev *indr_dev;
+	struct tc_block_offload bo = {
+		.command	= command,
+		.binder_type	= ei->binder_type,
+		.block		= block,
+		.extack		= extack,
+	};
+
+	indr_dev = tc_indr_block_dev_lookup(dev);
+	if (!indr_dev)
+		return;
+
+	indr_dev->block = command == TC_BLOCK_BIND ? block : NULL;
+
+	list_for_each_entry(indr_block_cb, &indr_dev->cb_list, list)
+		indr_block_cb->cb(dev, indr_block_cb->cb_priv, TC_SETUP_BLOCK,
+				  &bo);
+}
+
 static bool tcf_block_offload_in_use(struct tcf_block *block)
 {
 	return block->offloadcnt;
@@ -406,12 +646,17 @@ static int tcf_block_offload_bind(struct tcf_block *block, struct Qdisc *q,
 	err = tcf_block_offload_cmd(block, dev, ei, TC_BLOCK_BIND, extack);
 	if (err == -EOPNOTSUPP)
 		goto no_offload_dev_inc;
-	return err;
+	if (err)
+		return err;
+
+	tc_indr_block_call(block, dev, ei, TC_BLOCK_BIND, extack);
+	return 0;
 
 no_offload_dev_inc:
 	if (tcf_block_offload_in_use(block))
 		return -EOPNOTSUPP;
 	block->nooffloaddevcnt++;
+	tc_indr_block_call(block, dev, ei, TC_BLOCK_BIND, extack);
 	return 0;
 }
 
@@ -421,6 +666,8 @@ static void tcf_block_offload_unbind(struct tcf_block *block, struct Qdisc *q,
 	struct net_device *dev = q->dev_queue->dev;
 	int err;
 
+	tc_indr_block_call(block, dev, ei, TC_BLOCK_UNBIND, NULL);
+
 	if (!dev->netdev_ops->ndo_setup_tc)
 		goto no_offload_dev_dec;
 	err = tcf_block_offload_cmd(block, dev, ei, TC_BLOCK_UNBIND, NULL);
@@ -2355,6 +2602,11 @@ static int __init tc_filter_init(void)
 	if (err)
 		goto err_register_pernet_subsys;
 
+	err = rhashtable_init(&indr_setup_block_ht,
+			      &tc_indr_setup_block_ht_params);
+	if (err)
+		goto err_rhash_setup_block_ht;
+
 	rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_new_tfilter, NULL, 0);
 	rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_del_tfilter, NULL, 0);
 	rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_get_tfilter,
@@ -2366,6 +2618,8 @@ static int __init tc_filter_init(void)
 
 	return 0;
 
+err_rhash_setup_block_ht:
+	unregister_pernet_subsys(&tcf_net_ops);
 err_register_pernet_subsys:
 	destroy_workqueue(tc_filter_wq);
 	return err;
-- 
2.17.1

^ permalink raw reply related

* Re: [PATCH v2 net-next] net: phy: improve struct phy_device member interrupts handling
From: David Miller @ 2018-11-10  4:12 UTC (permalink / raw)
  To: hkallweit1; +Cc: andrew, f.fainelli, netdev
In-Reply-To: <63a44097-c37d-eb0f-98c8-2c1fefd1f246@gmail.com>

From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Fri, 9 Nov 2018 18:35:52 +0100

> As a heritage from the very early days of phylib member interrupts is
> defined as u32 even though it's just a flag whether interrupts are
> enabled. So we can change it to a bitfield member. In addition change
> the code dealing with this member in a way that it's clear we're
> dealing with a bool value.
> 
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> ---
> v2:
> - use false/true instead of 0/1 for the constants

Applied.

^ permalink raw reply

* [PATCH net v2] net: sched: cls_flower: validate nested enc_opts_policy to avoid warning
From: Jakub Kicinski @ 2018-11-10  5:06 UTC (permalink / raw)
  To: davem; +Cc: oss-drivers, netdev, Jakub Kicinski

TCA_FLOWER_KEY_ENC_OPTS and TCA_FLOWER_KEY_ENC_OPTS_MASK can only
currently contain further nested attributes, which are parsed by
hand, so the policy is never actually used resulting in a W=1
build warning:

net/sched/cls_flower.c:492:1: warning: ‘enc_opts_policy’ defined but not used [-Wunused-const-variable=]
 enc_opts_policy[TCA_FLOWER_KEY_ENC_OPTS_MAX + 1] = {

Add the validation anyway to avoid potential bugs when other
attributes are added and to make the attribute structure slightly
more clear.  Validation will also set extact to point to bad
attribute on error.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Acked-by: Simon Horman <simon.horman@netronome.com>
---
 net/sched/cls_flower.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
index 9aada2d0ef06..c6c327874abc 100644
--- a/net/sched/cls_flower.c
+++ b/net/sched/cls_flower.c
@@ -709,11 +709,23 @@ static int fl_set_enc_opt(struct nlattr **tb, struct fl_flow_key *key,
 			  struct netlink_ext_ack *extack)
 {
 	const struct nlattr *nla_enc_key, *nla_opt_key, *nla_opt_msk = NULL;
-	int option_len, key_depth, msk_depth = 0;
+	int err, option_len, key_depth, msk_depth = 0;
+
+	err = nla_validate_nested(tb[TCA_FLOWER_KEY_ENC_OPTS],
+				  TCA_FLOWER_KEY_ENC_OPTS_MAX,
+				  enc_opts_policy, extack);
+	if (err)
+		return err;
 
 	nla_enc_key = nla_data(tb[TCA_FLOWER_KEY_ENC_OPTS]);
 
 	if (tb[TCA_FLOWER_KEY_ENC_OPTS_MASK]) {
+		err = nla_validate_nested(tb[TCA_FLOWER_KEY_ENC_OPTS_MASK],
+					  TCA_FLOWER_KEY_ENC_OPTS_MAX,
+					  enc_opts_policy, extack);
+		if (err)
+			return err;
+
 		nla_opt_msk = nla_data(tb[TCA_FLOWER_KEY_ENC_OPTS_MASK]);
 		msk_depth = nla_len(tb[TCA_FLOWER_KEY_ENC_OPTS_MASK]);
 	}
-- 
2.17.1

^ permalink raw reply related

* Re: [Patch net-next] net: dump more useful information in netdev_rx_csum_fault()
From: David Miller @ 2018-11-10  4:16 UTC (permalink / raw)
  To: xiyou.wangcong; +Cc: netdev
In-Reply-To: <20181109194333.19949-1-xiyou.wangcong@gmail.com>

From: Cong Wang <xiyou.wangcong@gmail.com>
Date: Fri,  9 Nov 2018 11:43:33 -0800

> diff --git a/net/core/datagram.c b/net/core/datagram.c
> index 57f3a6fcfc1e..d8f4d55cd6c5 100644
> --- a/net/core/datagram.c
> +++ b/net/core/datagram.c
> @@ -736,7 +736,7 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len)
>  	if (likely(!sum)) {
>  		if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
>  		    !skb->csum_complete_sw)
> -			netdev_rx_csum_fault(skb->dev);
> +			netdev_rx_csum_fault(skb->dev, skb);
>  	}
>  	if (!skb_shared(skb))
>  		skb->csum_valid = !sum;

Didn't you move this function into net/core/skbuff.c? :-)

Please respin.

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox