5.4.31-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainercover 5.4.31-rc1 review
This is the start of the stable review cycle for the 5.4.31 release. There are 36 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Apr 2020 10:13:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.31-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.4.31-rc1
Daniel Jordan <[email protected]>
padata: always acquire cpu_hotplug_lock before pinst->lock
Amritha Nambiar <[email protected]>
net: Fix Tx hash bound checking
Mika Westerberg <[email protected]>
i2c: i801: Do not add ICH_RES_IO_SMI for the iTCO_wdt device
Neal Cardwell <[email protected]>
tcp: fix TFO SYNACK undo to avoid double-timestamp-undo
Mike Marciniszyn <[email protected]>
IB/hfi1: Ensure pq is not left on waitlist
David Howells <[email protected]>
rxrpc: Fix sendmsg(MSG_WAITALL) handling
Luca Coelho <[email protected]>
iwlwifi: dbg: don't abort if sending DBGC_SUSPEND_RESUME fails
Mordechay Goodstein <[email protected]>
iwlwifi: yoyo: don't add TLV offset when reading FIFOs
Mordechay Goodstein <[email protected]>
iwlwifi: consider HE capability when setting LDPC
Tariq Toukan <[email protected]>
net/mlx5e: kTLS, Fix wrong value in record tracker enum
Bibby Hsieh <[email protected]>
soc: mediatek: knows_txdone needs to be set in Mediatek CMDQ helper
Geoffrey Allott <[email protected]>
ALSA: hda/ca0132 - Add Recon3Di quirk to handle integrated sound on EVGA X99 Classified motherboard
Mike Snitzer <[email protected]>
Revert "dm: always call blk_queue_split() in dm_process_bio()"
Hans de Goede <[email protected]>
power: supply: axp288_charger: Add special handling for HP Pavilion x2 10
Hans de Goede <[email protected]>
extcon: axp288: Add wakeup support
Nicholas Johnson <[email protected]>
nvmem: check for NULL reg_read and reg_write before dereferencing
Alexander Usyskin <[email protected]>
mei: me: add cedar fork device ids
Eugene Syromiatnikov <[email protected]>
coresight: do not use the BIT() macro in the UAPI header
Kelsey Skunberg <[email protected]>
PCI: sysfs: Revert "rescan" file renames
Kishon Vijay Abraham I <[email protected]>
misc: pci_endpoint_test: Avoid using module parameter to determine irqtype
Kishon Vijay Abraham I <[email protected]>
misc: pci_endpoint_test: Fix to support > 10 pci-endpoint-test devices
YueHaibing <[email protected]>
misc: rtsx: set correct pcr_ops for rts522A
Guenter Roeck <[email protected]>
brcmfmac: abort and release host after error
Daniel Jordan <[email protected]>
padata: fix uninitialized return value in padata_replace()
Matthew Wilcox (Oracle) <[email protected]>
XArray: Fix xa_find_next for large multi-index entries
Tariq Toukan <[email protected]>
net/mlx5e: kTLS, Fix TCP seq off-by-1 issue in TX resync flow
Jann Horn <[email protected]>
bpf: Fix tnum constraints for 32-bit comparisons
Len Brown <[email protected]>
tools/power turbostat: Fix 32-bit capabilities warning
Len Brown <[email protected]>
tools/power turbostat: Fix missing SYS_LPI counter on some Chromebooks
Len Brown <[email protected]>
tools/power turbostat: Fix gcc build warnings
James Zhu <[email protected]>
drm/amdgpu: fix typo for vcn1 idle check
Eugeniy Paltsev <[email protected]>
initramfs: restore default compression behavior
Gerd Hoffmann <[email protected]>
drm/bochs: downgrade pci_request_region failure from error to warning
Mario Kleiner <[email protected]>
drm/amd/display: Add link_rate quirk for Apple 15" MBP 2017
Masahiro Yamada <[email protected]>
kconfig: introduce m32-flag and m64-flag
Prabhath Sajeepa <[email protected]>
nvme-rdma: Avoid double freeing of async event data
-------------
Diffstat:
Makefile | 4 +- drivers/extcon/extcon-axp288.c | 32 ++++++ drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 2 +- drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 11 +++ drivers/gpu/drm/bochs/bochs_hw.c | 6 +- drivers/i2c/busses/i2c-i801.c | 45 +++------ drivers/infiniband/hw/hfi1/user_sdma.c | 25 ++++- drivers/md/dm.c | 5 +- drivers/misc/cardreader/rts5227.c | 1 + drivers/misc/mei/hw-me-regs.h | 2 + drivers/misc/mei/pci-me.c | 2 + drivers/misc/pci_endpoint_test.c | 14 ++- .../ethernet/mellanox/mlx5/core/en_accel/ktls.h | 4 +- .../ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c | 2 +- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 + drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 25 ++--- drivers/net/wireless/intel/iwlwifi/fw/dbg.h | 6 +- drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c | 6 +- drivers/nvme/host/rdma.c | 8 +- drivers/nvmem/nvmem-sysfs.c | 6 ++ drivers/pci/pci-sysfs.c | 6 +- drivers/power/supply/axp288_charger.c | 57 ++++++++++- drivers/soc/mediatek/mtk-cmdq-helper.c | 1 + include/uapi/linux/coresight-stm.h | 6 +- kernel/bpf/verifier.c | 108 ++++++++++++++------- kernel/padata.c | 6 +- lib/test_xarray.c | 18 ++++ lib/xarray.c | 3 +- net/core/dev.c | 2 + net/ipv4/tcp_input.c | 6 +- net/rxrpc/sendmsg.c | 4 +- scripts/Kconfig.include | 7 ++ sound/pci/hda/patch_ca0132.c | 1 + tools/power/x86/turbostat/Makefile | 2 +- tools/power/x86/turbostat/turbostat.c | 73 ++++++++------ usr/Kconfig | 22 ++--- 36 files changed, 367 insertions(+), 163 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/36 nvme-rdma: Avoid double freeing of async event data
From: Prabhath Sajeepa <[email protected]>
[ Upstream commit 9134ae2a2546cb96abddcd4469a79c77ee3a4480 ]
The timeout of identify cmd, which is invoked as part of admin queue creation, can result in freeing of async event data both in nvme_rdma_timeout handler and error handling path of nvme_rdma_configure_admin queue thus causing NULL pointer reference.
Call Trace: ? nvme_rdma_setup_ctrl+0x223/0x800 [nvme_rdma] nvme_rdma_create_ctrl+0x2ba/0x3f7 [nvme_rdma] nvmf_dev_write+0xa54/0xcc6 [nvme_fabrics] __vfs_write+0x1b/0x40 vfs_write+0xb2/0x1b0 ksys_write+0x61/0xd0 __x64_sys_write+0x1a/0x20 do_syscall_64+0x60/0x1e0 entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- drivers/nvme/host/rdma.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/nvme/host/rdma.c +5 -3
@@ -850,9 +850,11 @@ out_free_tagset:if (new)blk_mq_free_tag_set (ctrl->ctrl.admin_tagset); out_free_async_qe: -nvme_rdma_free_qe (ctrl->device->dev, &ctrl->async_event_sqe, -sizeof (struct nvme_command ),DMA_TO_DEVICE ); - ctrl->async_event_sqe.data =NULL ; +if (ctrl->async_event_sqe.data) { +nvme_rdma_free_qe (ctrl->device->dev, &ctrl->async_event_sqe, +sizeof (struct nvme_command ),DMA_TO_DEVICE ); + ctrl->async_event_sqe.data =NULL ; + } out_free_queue:nvme_rdma_free_queue (&ctrl->queues[0 ]);return error;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 2/36 kconfig: introduce m32-flag and m64-flag
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 8cc4fd73501d9f1370c3eebb70cfe8cc9e24062b ]
When a compiler supports multiple architectures, some compiler features can be dependent on the target architecture.
This is typical for Clang, which supports multiple LLVM backends. Even for GCC, we need to take care of biarch compiler cases.
It is not a problem when we evaluate cc-option in Makefiles because cc-option is tested against the flag in question + $(KBUILD_CFLAGS).
The cc-option in Kconfig, on the other hand, does not accumulate tested flags. Due to this simplification, it could potentially test cc-option against a different target.
At first, Kconfig always evaluated cc-option against the host architecture.
Since commit e8de12fb7cde ("kbuild: Check for unknown options with cc-option usage in Kconfig and clang"), in case of cross-compiling with Clang, the target triple is correctly passed to Kconfig.
The case with biarch GCC (and native build with Clang) is still not handled properly. We need to pass some flags to specify the target machine bit.
Due to the design, all the macros in Kconfig are expanded in the parse stage, where we do not know the target bit size yet.
For example, arch/x86/Kconfig allows a user to toggle CONFIG_64BIT. If a compiler flag -foo depends on the machine bit, it must be tested twice, one with -m32 and the other with -m64.
However, -m32/-m64 are not always recognized. So, this commits adds m64-flag and m32-flag macros. They expand to -m32, -m64, respectively if supported. Or, they expand to an empty string if unsupported.
The typical usage is like this:
config FOO
bool
default $(cc-option,$(m64-flag) -foo) if 64BIT
default $(cc-option,$(m32-flag) -foo)This is clumsy, but there is no elegant way to handle this in the current static macro expansion.
There was discussion for static functions vs dynamic functions. The consensus was to go as far as possible with the static functions.
(https://lkml.org/lkml/2018/3/2/22)
--- scripts/Kconfig.include | 7 +++++++ 1 file changed, 7 insertions(+)
scripts/Kconfig.include +7 -0
@@ -40,3 +40,10 @@ $(error-if,$(success, $(LD) -v | grep -q gold), gold linker '$(LD)' not supporte # gcc version including patch level gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh $(CC)) + +# machine bit flags +# $(m32-flag): -m32 if the compiler supports it, or an empty string otherwise. +# $(m64-flag): -m64 if the compiler supports it, or an empty string otherwise. +cc-option-bit = $(if-success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null,$(1)) +m32-flag := $(cc-option-bit,-m32) +m64-flag := $(cc-option-bit,-m64)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 3/36 drm/amd/display: Add link_rate quirk for Apple 15" MBP 2017
In reply to Greg Kroah-HartmanFrom: Mario Kleiner <[email protected]>
[ Upstream commit dec9de2ada523b344eb2428abfedf9d6cd0a0029 ]
This fixes a problem found on the MacBookPro 2017 Retina panel:
The panel reports 10 bpc color depth in its EDID, and the firmware chooses link settings at boot which support enough bandwidth for 10 bpc (324000 kbit/sec aka LINK_RATE_RBR2 aka 0xc), but the DP_MAX_LINK_RATE dpcd register only reports 2.7 Gbps (multiplier value 0xa) as possible, in direct contradiction of what the firmware successfully set up.
This restricts the panel to 8 bpc, not providing the full color depth of the panel on Linux <= 5.5. Additionally, commit '4a8ca46bae8a ("drm/amd/display: Default max bpc to 16 for eDP")' introduced into Linux 5.6-rc1 will unclamp panel depth to its full 10 bpc, thereby requiring a eDP bandwidth for all modes that exceeds the bandwidth available and causes all modes to fail validation -> No modes for the laptop panel -> failure to set any mode -> Panel goes dark.
This patch adds a quirk specific to the MBP 2017 15" Retina panel to override reported max link rate to the correct maximum of 0xc = LINK_RATE_RBR2 to fix the darkness and reduced display precision.
Please apply for Linux 5.6+ to avoid regressing Apple MBP panel support.
--- drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +11 -0
@@ -2879,6 +2879,17 @@ static bool retrieve_link_cap(struct dc_link *link) sink_id.ieee_device_id, sizeof(sink_id.ieee_device_id)); +/* Quirk Apple MBP 2017 15" Retina panel: Wrong DP_MAX_LINK_RATE */ + { +uint8_t str_mbp_2017[] = {101 ,68 ,21 ,101 ,98 ,97 }; + +if ((link->dpcd_caps.sink_dev_id ==0x0010fa ) && + !memcmp (link->dpcd_caps.sink_dev_id_str, str_mbp_2017, +sizeof (str_mbp_2017))) { + link->reported_link_cap.link_rate =0x0c ; + } + } + core_link_read_dpcd( link, DP_SINK_HW_REVISION_START,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 4/36 drm/bochs: downgrade pci_request_region failure from error to warning
In reply to Greg Kroah-HartmanFrom: Gerd Hoffmann <[email protected]>
[ Upstream commit 8c34cd1a7f089dc03933289c5d4a4d1489549828 ]
Shutdown of firmware framebuffer has a bunch of problems. Because of this the framebuffer region might still be reserved even after drm_fb_helper_remove_conflicting_pci_framebuffers() returned.
Don't consider pci_request_region() failure for the framebuffer region as fatal error to workaround this issue.
--- drivers/gpu/drm/bochs/bochs_hw.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/gpu/drm/bochs/bochs_hw.c +2 -4
@@ -156,10 +156,8 @@ int bochs_hw_init(struct drm_device *dev) size =min (size, mem); } -if (pci_request_region (pdev,0 ,"bochs-drm" ) !=0 ) { -DRM_ERROR ("Cannot request framebuffer\n" ); -return -EBUSY ; - } +if (pci_request_region (pdev,0 ,"bochs-drm" ) !=0 ) +DRM_WARN ("Cannot request framebuffer, boot fb still active?\n" ); bochs->fb_map =ioremap (addr, size);if (bochs->fb_map ==NULL ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 5/36 initramfs: restore default compression behavior
In reply to Greg Kroah-HartmanFrom: Eugeniy Paltsev <[email protected]>
[ Upstream commit 785d74ec3bbf26ac7f6e92e6e96a259aec0f107a ]
Even though INITRAMFS_SOURCE kconfig option isn't set in most of defconfigs it is used (set) extensively by various build systems. Commit f26661e12765 ("initramfs: make initramfs compression choice non-optional") has changed default compression mode. Previously we compress initramfs using available compression algorithm. Now we don't use any compression at all by default.
It significantly increases the image size in case of build system chooses embedded initramfs. Initially I faced with this issue while using buildroot.
As of today it's not possible to set preferred compression mode in target defconfig as this option depends on INITRAMFS_SOURCE being set. Modification of all build systems either doesn't look like good option.
Let's instead rewrite initramfs compression mode choices list the way that "INITRAMFS_COMPRESSION_NONE" will be the last option in the list. In that case it will be chosen only if all other options (which implements any compression) are not available.
--- usr/Kconfig | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
usr/Kconfig +11 -11
@@ -131,17 +131,6 @@ choice If in doubt, select 'None' -config INITRAMFS_COMPRESSION_NONE - bool "None" - help - Do not compress the built-in initramfs at all. This may sound wasteful - in space, but, you should be aware that the built-in initramfs will be - compressed at a later stage anyways along with the rest of the kernel, - on those architectures that support this. However, not compressing the - initramfs may lead to slightly higher memory consumption during a - short time at boot, while both the cpio image and the unpacked - filesystem image will be present in memory simultaneously - config INITRAMFS_COMPRESSION_GZIP bool "Gzip" depends on RD_GZIP
@@ -214,6 +203,17 @@ config INITRAMFS_COMPRESSION_LZ4 If you choose this, keep in mind that most distros don't provide lz4 by default which could cause a build failure. +config INITRAMFS_COMPRESSION_NONE + bool "None" + help + Do not compress the built-in initramfs at all. This may sound wasteful + in space, but, you should be aware that the built-in initramfs will be + compressed at a later stage anyways along with the rest of the kernel, + on those architectures that support this. However, not compressing the + initramfs may lead to slightly higher memory consumption during a + short time at boot, while both the cpio image and the unpacked + filesystem image will be present in memory simultaneously + endchoice config INITRAMFS_COMPRESSION
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 6/36 drm/amdgpu: fix typo for vcn1 idle check
In reply to Greg Kroah-HartmanFrom: James Zhu <[email protected]>
[ Upstream commit acfc62dc68770aa665cc606891f6df7d6d1e52c0 ]
fix typo for vcn1 idle check
--- drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +1 -1
@@ -1375,7 +1375,7 @@ static int vcn_v1_0_set_clockgating_state(void *handle,if (enable) {/* wait for STATUS to clear */ -if (vcn_v1_0_is_idle (handle)) +if (!vcn_v1_0_is_idle (handle))return -EBUSY ;vcn_v1_0_enable_clock_gating (adev); }else {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 7/36 tools/power turbostat: Fix gcc build warnings
In reply to Greg Kroah-HartmanFrom: Len Brown <[email protected]>
[ Upstream commit d8d005ba6afa502ca37ced5782f672c4d2fc1515 ]
Warning: ‘__builtin_strncpy’ specified bound 20 equals destination size
[-Wstringop-truncation]
reduce param to strncpy, to guarantee that a null byte is always copied into destination buffer.
--- tools/power/x86/turbostat/turbostat.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/power/x86/turbostat/turbostat.c +2 -2
@@ -5323,9 +5323,9 @@ int add_counter(unsigned int msr_num, char *path, char *name, } msrp->msr_num = msr_num; -strncpy (msrp->name, name,NAME_BYTES ); +strncpy (msrp->name, name,NAME_BYTES -1 );if (path) -strncpy (msrp->path, path,PATH_BYTES ); +strncpy (msrp->path, path,PATH_BYTES -1 ); msrp->width = width; msrp->type = type; msrp->format = format;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 8/36 tools/power turbostat: Fix missing SYS_LPI counter on some Chromebooks
In reply to Greg Kroah-HartmanFrom: Len Brown <[email protected]>
[ Upstream commit 1f81c5efc020314b2db30d77efe228b7e117750d ]
Some Chromebook BIOS' do not export an ACPI LPIT, which is how Linux finds the residency counter for CPU and SYSTEM low power states, that is exports in /sys/devices/system/cpu/cpuidle/*residency_us
When these sysfs attributes are missing, check the debugfs attrubte from the pmc_core driver, which accesses the same counter value.
--- tools/power/x86/turbostat/turbostat.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
tools/power/x86/turbostat/turbostat.c +14 -9
@@ -304,6 +304,10 @@ int *irqs_per_cpu; /* indexed by cpu_num */void setup_all_buffers (void ); +char *sys_lpi_file; +char *sys_lpi_file_sysfs ="/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us" ; +char *sys_lpi_file_debugfs ="/sys/kernel/debug/pmc_core/slp_s0_residency_usec" ; +int cpu_is_not_present (int cpu) {return !CPU_ISSET_S (cpu, cpu_present_setsize, cpu_present_set);
@@ -2916,8 +2920,6 @@ int snapshot_gfx_mhz(void)* * record snapshot of * /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us -* -* return 1 if config change requires a restart, else return 0 */ int snapshot_cpu_lpi_us (void ) {
@@ -2941,17 +2943,14 @@ int snapshot_cpu_lpi_us(void)/* * snapshot_sys_lpi() * -* record snapshot of -* /sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us -* -* return 1 if config change requires a restart, else return 0 +* record snapshot of sys_lpi_file */ int snapshot_sys_lpi_us (void ) {FILE *fp;int retval; - fp =fopen_or_die ("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us" ,"r" ); + fp =fopen_or_die (sys_lpi_file,"r" ); retval =fscanf (fp,"%lld" , &cpuidle_cur_sys_lpi_us);if (retval !=1 ) {
@@ -4907,10 +4906,16 @@ void process_cpuid()else BIC_NOT_PRESENT (BIC_CPU_LPI ); -if (!access ("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us" ,R_OK )) +if (!access (sys_lpi_file_sysfs,R_OK )) { + sys_lpi_file = sys_lpi_file_sysfs;BIC_PRESENT (BIC_SYS_LPI ); -else + }else if (!access (sys_lpi_file_debugfs,R_OK )) { + sys_lpi_file = sys_lpi_file_debugfs; +BIC_PRESENT (BIC_SYS_LPI ); + }else { + sys_lpi_file_sysfs =NULL ;BIC_NOT_PRESENT (BIC_SYS_LPI ); + }if (!quiet)decode_misc_feature_control ();
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 9/36 tools/power turbostat: Fix 32-bit capabilities warning
In reply to Greg Kroah-HartmanFrom: Len Brown <[email protected]>
[ Upstream commit fcaa681c03ea82193e60d7f2cdfd94fbbcd4cae9 ]
warning: `turbostat' uses 32-bit capabilities (legacy support in use)
--- tools/power/x86/turbostat/Makefile | 2 +- tools/power/x86/turbostat/turbostat.c | 46 +++++++++++++++++---------- 2 files changed, 31 insertions(+), 17 deletions(-)
tools/power/x86/turbostat/Makefile +1 -1
@@ -16,7 +16,7 @@ override CFLAGS += -D_FORTIFY_SOURCE=2 %: %.c @mkdir -p $(BUILD_OUTPUT) - $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) + $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap .PHONY : clean clean :
tools/power/x86/turbostat/turbostat.c +30 -16
65 lines not on this page · raw message
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 10/36 bpf: Fix tnum constraints for 32-bit comparisons
In reply to Greg Kroah-HartmanFrom: Jann Horn <[email protected]>
[ Upstream commit 604dca5e3af1db98bd123b7bfc02b017af99e3a0 ]
The BPF verifier tried to track values based on 32-bit comparisons by (ab)using the tnum state via 581738a681b6 ("bpf: Provide better register bounds after jmp32 instructions"). The idea is that after a check like this:
if ((u32)r0 > 3)
exitWe can't meaningfully constrain the arithmetic-range-based tracking, but we can update the tnum state to (value=0,mask=0xffff'ffff'0000'0003). However, the implementation from 581738a681b6 didn't compute the tnum constraint based on the fixed operand, but instead derives it from the arithmetic-range-based tracking. This means that after the following sequence of operations:
if (r0 >= 0x1'0000'0001)
exit
if ((u32)r0 > 7)
exitThe verifier assumed that the lower half of r0 is in the range (0, 0) and apply the tnum constraint (value=0,mask=0xffff'ffff'0000'0000) thus causing the overall tnum to be (value=0,mask=0x1'0000'0000), which was incorrect. Provide a fixed implementation.
--- kernel/bpf/verifier.c | 108 ++++++++++++++++++++++++++++-------------- 1 file changed, 72 insertions(+), 36 deletions(-)
kernel/bpf/verifier.c +72 -36
@@ -5325,6 +5325,70 @@ static bool cmp_val_with_extended_s64(s64 sval, struct bpf_reg_state *reg) reg->smax_value <= 0 && reg->smin_value >= S32_MIN); } +/* Constrain the possible values of @reg with unsigned upper bound @bound. +* If @is_exclusive, @bound is an exclusive limit, otherwise it is inclusive. +* If @is_jmp32, @bound is a 32-bit value that only constrains the low 32 bits +* of @reg. +*/ +static void set_upper_bound (struct bpf_reg_state *reg,u64 bound,bool is_jmp32, +bool is_exclusive) +{ +if (is_exclusive) { +/* There are no values for `reg` that make `reg<0` true. */ +if (bound ==0 ) +return ; + bound--; + } +if (is_jmp32) { +/* Constrain the register's value in the tnum representation. +* For 64-bit comparisons this happens later in +* __reg_bound_offset(), but for 32-bit comparisons, we can be +* more precise than what can be derived from the updated +* numeric bounds. +*/ +struct tnum t =tnum_range (0 , bound); + + t.mask |= ~0xffffffffULL ;/* upper half is unknown */ + reg->var_off =tnum_intersect (reg->var_off, t); + +/* Compute the 64-bit bound from the 32-bit bound. */ + bound +=gen_hi_max (reg->var_off); + } + reg->umax_value =min (reg->umax_value, bound); +} + +/* Constrain the possible values of @reg with unsigned lower bound @bound. +* If @is_exclusive, @bound is an exclusive limit, otherwise it is inclusive. +* If @is_jmp32, @bound is a 32-bit value that only constrains the low 32 bits +* of @reg. +*/ +static void set_lower_bound (struct bpf_reg_state *reg,u64 bound,bool is_jmp32, +bool is_exclusive) +{ +if (is_exclusive) { +/* There are no values for `reg` that make `reg>MAX` true. */ +if (bound == (is_jmp32 ?U32_MAX :U64_MAX )) +return ; + bound++; + } +if (is_jmp32) { +/* Constrain the register's value in the tnum representation. +* For 64-bit comparisons this happens later in +* __reg_bound_offset(), but for 32-bit comparisons, we can be +* more precise than what can be derived from the updated +* numeric bounds. +*/ +struct tnum t =tnum_range (bound,U32_MAX ); + + t.mask |= ~0xffffffffULL ;/* upper half is unknown */ + reg->var_off =tnum_intersect (reg->var_off, t); + +/* Compute the 64-bit bound from the 32-bit bound. */ + bound +=gen_hi_min (reg->var_off); + } + reg->umin_value =max (reg->umin_value, bound); +} +/* Adjusts the register min/max values in the case that the dst_reg is the * variable register that we are working on, and src_reg is a constant or we're * simply doing a BPF_K check.
@@ -5380,15 +5444,8 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,case BPF_JGE :case BPF_JGT : { -u64 false_umax = opcode ==BPF_JGT ? val : val -1 ; -u64 true_umin = opcode ==BPF_JGT ? val +1 : val; - -if (is_jmp32) { - false_umax +=gen_hi_max (false_reg->var_off); - true_umin +=gen_hi_min (true_reg->var_off); - } - false_reg->umax_value =min (false_reg->umax_value, false_umax); - true_reg->umin_value =max (true_reg->umin_value, true_umin); +set_upper_bound (false_reg, val, is_jmp32, opcode ==BPF_JGE ); +set_lower_bound (true_reg, val, is_jmp32, opcode ==BPF_JGT );break ; }case BPF_JSGE :
@@ -5409,15 +5466,8 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,case BPF_JLE :case BPF_JLT : { -u64 false_umin = opcode ==BPF_JLT ? val : val +1 ; -u64 true_umax = opcode ==BPF_JLT ? val -1 : val; - -if (is_jmp32) { - false_umin +=gen_hi_min (false_reg->var_off); - true_umax +=gen_hi_max (true_reg->var_off); - } - false_reg->umin_value =max (false_reg->umin_value, false_umin); - true_reg->umax_value =min (true_reg->umax_value, true_umax); +set_lower_bound (false_reg, val, is_jmp32, opcode ==BPF_JLE ); +set_upper_bound (true_reg, val, is_jmp32, opcode ==BPF_JLT );break ; }case BPF_JSLE :
@@ -5492,15 +5542,8 @@ static void reg_set_min_max_inv(struct bpf_reg_state *true_reg,case BPF_JGE :case BPF_JGT : { -u64 false_umin = opcode ==BPF_JGT ? val : val +1 ; -u64 true_umax = opcode ==BPF_JGT ? val -1 : val; - -if (is_jmp32) { - false_umin +=gen_hi_min (false_reg->var_off); - true_umax +=gen_hi_max (true_reg->var_off); - } - false_reg->umin_value =max (false_reg->umin_value, false_umin); - true_reg->umax_value =min (true_reg->umax_value, true_umax); +set_lower_bound (false_reg, val, is_jmp32, opcode ==BPF_JGE ); +set_upper_bound (true_reg, val, is_jmp32, opcode ==BPF_JGT );break ; }case BPF_JSGE :
@@ -5518,15 +5561,8 @@ static void reg_set_min_max_inv(struct bpf_reg_state *true_reg,case BPF_JLE :case BPF_JLT : { -u64 false_umax = opcode ==BPF_JLT ? val : val -1 ; -u64 true_umin = opcode ==BPF_JLT ? val +1 : val; - -if (is_jmp32) { - false_umax +=gen_hi_max (false_reg->var_off); - true_umin +=gen_hi_min (true_reg->var_off); - } - false_reg->umax_value =min (false_reg->umax_value, false_umax); - true_reg->umin_value =max (true_reg->umin_value, true_umin); +set_upper_bound (false_reg, val, is_jmp32, opcode ==BPF_JLE ); +set_lower_bound (true_reg, val, is_jmp32, opcode ==BPF_JLT );break ; }case BPF_JSLE :
Signature · 1 line
2.20.1
Daniel Borkmann
maintainerRe: [PATCH 5.4 10/36] bpf: Fix tnum constraints for 32-bit comparisons
Hey Sasha, hey Greg,
Quoted 29 lines · Greg Kroah-Hartman
From: Jann Horn <[email protected]>
[ Upstream commit
604dca5e3af1db98bd123b7bfc02b017af99e3a0]The BPF verifier tried to track values based on 32-bit comparisons by (ab)using the tnum state via
581738a681b6("bpf: Provide better register bounds after jmp32 instructions"). The idea is that after a check like this:if ((u32)r0 > 3) exitWe can't meaningfully constrain the arithmetic-range-based tracking, but we can update the tnum state to (value=0,mask=0xffff'ffff'0000'0003). However, the implementation from
581738a681b6didn't compute the tnum constraint based on the fixed operand, but instead derives it from the arithmetic-range-based tracking. This means that after the following sequence of operations:if (r0 >= 0x1'0000'0001) exit if ((u32)r0 > 7) exitThe verifier assumed that the lower half of r0 is in the range (0, 0) and apply the tnum constraint (value=0,mask=0xffff'ffff'0000'0000) thus causing the overall tnum to be (value=0,mask=0x1'0000'0000), which was incorrect. Provide a fixed implementation.
Quoted 6 lines
Fixes 581738a681b6 ("bpf: Provide better register bounds after jmp32 instructions")Signed-off-by Jann Horn <[email protected]>Signed-off-by Daniel Borkmann <[email protected]>Signed-off-by Alexei Starovoitov <[email protected]>Signed-off-by Sasha Levin <[email protected]>
We've already addressed this issue (CVE-2020-8835) on 5.4/5.5/5.6 kernels through the following backports:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.4.y&id=8d62a8c7489a68b5738390b008134a644aa9b383
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.5.y&id=0ebc01466d98d016eb6a3780ec8edb0c86fa48bc
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.6.y&id=6797143df51c8ae259aa4bfe4e99c832b20bde8a
Given the severity of the issue, we concluded that revert-only is the best and most straight forward way to address it for stable.
Was this selected via Sasha's ML mechanism? Should there be a commit tag to opt-out for some commits being selected? E.g. this one 581738a681b6 ("bpf: Provide better register bounds after jmp32 instructions") already fell through our radar and wrongly made its way into 5.4 where it should have never landed. :/
Thanks,
Daniel
Greg Kroah-Hartman
maintainerRe: [PATCH 5.4 10/36] bpf: Fix tnum constraints for 32-bit comparisons
Quoted 46 lines · Daniel Borkmann
Hey Sasha, hey Greg,
Quoted 29 lines · Greg Kroah-Hartman
From: Jann Horn <[email protected]>
[ Upstream commit
604dca5e3af1db98bd123b7bfc02b017af99e3a0]The BPF verifier tried to track values based on 32-bit comparisons by (ab)using the tnum state via
581738a681b6("bpf: Provide better register bounds after jmp32 instructions"). The idea is that after a check like this:if ((u32)r0 > 3) exitWe can't meaningfully constrain the arithmetic-range-based tracking, but we can update the tnum state to (value=0,mask=0xffff'ffff'0000'0003). However, the implementation from
581738a681b6didn't compute the tnum constraint based on the fixed operand, but instead derives it from the arithmetic-range-based tracking. This means that after the following sequence of operations:if (r0 >= 0x1'0000'0001) exit if ((u32)r0 > 7) exitThe verifier assumed that the lower half of r0 is in the range (0, 0) and apply the tnum constraint (value=0,mask=0xffff'ffff'0000'0000) thus causing the overall tnum to be (value=0,mask=0x1'0000'0000), which was incorrect. Provide a fixed implementation.
Quoted 6 lines
Fixes 581738a681b6 ("bpf: Provide better register bounds after jmp32 instructions")Signed-off-by Jann Horn <[email protected]>Signed-off-by Daniel Borkmann <[email protected]>Signed-off-by Alexei Starovoitov <[email protected]>Signed-off-by Sasha Levin <[email protected]>We've already addressed this issue (CVE-2020-8835) on 5.4/5.5/5.6 kernels through the following backports:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.4.y&id=8d62a8c7489a68b5738390b008134a644aa9b383
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.5.y&id=0ebc01466d98d016eb6a3780ec8edb0c86fa48bc
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.6.y&id=6797143df51c8ae259aa4bfe4e99c832b20bde8a
Quoted 7 lines
Given the severity of the issue, we concluded that revert-only is the best and most straight forward way to address it for stable.
Was this selected via Sasha's ML mechanism? Should there be a commit tag to opt-out for some commits being selected? E.g. this one
581738a681b6("bpf: Provide better register bounds after jmp32 instructions") already fell through our radar and wrongly made its way into 5.4 where it should have never landed. :/
Oops, yeah, I think this came from Sasha's simple "Fixes:" script, and wasn't aware that it was already resolved. I'll go drop these patches now, thanks for catching this.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 11/36 net/mlx5e: kTLS, Fix TCP seq off-by-1 issue in TX resync flow
In reply to Greg Kroah-HartmanFrom: Tariq Toukan <[email protected]>
[ Upstream commit 56917766def72f5afdf4235adb91b6897ff26d9d ]
We have an off-by-1 issue in the TCP seq comparison. The last sequence number that belongs to the TCP packet's payload is not "start_seq + len", but one byte before it.
Fix it so the 'ends_before' is evaluated properly.
This fixes a bug that results in error completions in the kTLS HW offload flows.
--- drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c +1 -1
@@ -218,7 +218,7 @@ tx_sync_info_get(struct mlx5e_ktls_offload_context_tx *priv_tx,* this packet was already acknowledged and its record info * was released. */ - ends_before =before (tcp_seq + datalen,tls_record_start_seq (record)); + ends_before =before (tcp_seq + datalen -1 ,tls_record_start_seq (record));if (unlikely (tls_record_is_start_marker (record))) { ret = ends_before ?MLX5E_KTLS_SYNC_SKIP_NO_DATA :MLX5E_KTLS_SYNC_FAIL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 12/36 XArray: Fix xa_find_next for large multi-index entries
In reply to Greg Kroah-HartmanFrom: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit bd40b17ca49d7d110adf456e647701ce74de2241 ]
Coverity pointed out that xas_sibling() was shifting xa_offset without promoting it to an unsigned long first, so the shift could cause an overflow and we'd get the wrong answer. The fix is obvious, and the new test-case provokes UBSAN to report an error:
runtime error: shift exponent 60 is too large for 32-bit type 'int'
--- lib/test_xarray.c | 18 ++++++++++++++++++ lib/xarray.c | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-)
lib/test_xarray.c +18 -0
@@ -12,6 +12,9 @@static unsigned int tests_run;static unsigned int tests_passed; +static const unsigned int order_limit = +IS_ENABLED (CONFIG_XARRAY_MULTI ) ?BITS_PER_LONG :1 ; +#ifndef XA_DEBUG # ifdef __KERNEL__void xa_dump (const struct xarray *xa) { }
@@ -959,6 +962,20 @@ static noinline void check_multi_find_2(struct xarray *xa) } } +static noinline void check_multi_find_3(struct xarray *xa) +{ +unsigned int order; + +for (order =5 ; order < order_limit; order++) { +unsigned long index =1UL << (order -5 ); + +XA_BUG_ON (xa, !xa_empty (xa)); +xa_store_order (xa,0 , order -4 ,xa_mk_index (0 ),GFP_KERNEL ); +XA_BUG_ON (xa,xa_find_after (xa, &index,ULONG_MAX ,XA_PRESENT )); +xa_erase_index (xa,0 ); + } +} + static noinline void check_find_1(struct xarray *xa) {unsigned long i, j, k;
@@ -1081,6 +1098,7 @@ static noinline void check_find(struct xarray *xa)for (i =2 ; i <10 ; i++)check_multi_find_1 (xa, i);check_multi_find_2 (xa); +check_multi_find_3 (xa); }/* See find_swap_entry() in mm/shmem.c */
lib/xarray.c +2 -1
@@ -1839,7 +1839,8 @@ static bool xas_sibling(struct xa_state *xas)if (!node)return false; mask = (XA_CHUNK_SIZE << node->shift) -1 ; -return (xas->xa_index & mask) > (xas->xa_offset << node->shift); +return (xas->xa_index & mask) > + ((unsigned long )xas->xa_offset << node->shift); }/**
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 13/36 padata: fix uninitialized return value in padata_replace()
In reply to Greg Kroah-HartmanFrom: Daniel Jordan <[email protected]>
[ Upstream commit 41ccdbfd5427bbbf3ed58b16750113b38fad1780 ]
According to Geert's report[0],
kernel/padata.c: warning: 'err' may be used uninitialized in this
function [-Wuninitialized]: => 539:2
Warning is seen only with older compilers on certain archs. The runtime effect is potentially returning garbage down the stack when padata's cpumasks are modified before any pcrypt requests have run.
Simplest fix is to initialize err to the success value.
[0] http://lkml.kernel.org/r/[email protected]
--- kernel/padata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/padata.c +1 -1
@@ -516,7 +516,7 @@ static int padata_replace(struct padata_instance *pinst) {int notification_mask =0 ;struct padata_shell *ps; -int err; +int err =0 ; pinst->flags |=PADATA_RESET ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 14/36 brcmfmac: abort and release host after error
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
[ Upstream commit 863844ee3bd38219c88e82966d1df36a77716f3e ]
With commit 216b44000ada ("brcmfmac: Fix use after free in brcmf_sdio_readframes()") applied, we see locking timeouts in brcmf_sdio_watchdog_thread().
brcmfmac: brcmf_escan_timeout: timer expired
INFO: task brcmf_wdog/mmc1:621 blocked for more than 120 seconds.
Not tainted 4.19.94-07984-g24ff99a0f713 #1
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
brcmf_wdog/mmc1 D 0 621 2 0x00000000 last_sleep: 2440793077. last_runnable: 2440766827
[<c0aa1e60>] (__schedule) from [<c0aa2100>] (schedule+0x98/0xc4)
[<c0aa2100>] (schedule) from [<c0853830>] (__mmc_claim_host+0x154/0x274)
[<c0853830>] (__mmc_claim_host) from [<bf10c5b8>] (brcmf_sdio_watchdog_thread+0x1b0/0x1f8 [brcmfmac]) [<bf10c5b8>] (brcmf_sdio_watchdog_thread [brcmfmac]) from [<c02570b8>] (kthread+0x178/0x180)
In addition to restarting or exiting the loop, it is also necessary to abort the command and to release the host.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +2 -0
@@ -1934,6 +1934,8 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)if (brcmf_sdio_hdparse (bus, bus->rxhdr, &rd_new,BRCMF_SDIO_FT_NORMAL )) { rd->len =0 ; +brcmf_sdio_rxfail (bus, true, true); +sdio_release_host (bus->sdiodev->func1);brcmu_pkt_buf_free_skb (pkt);continue ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 15/36 misc: rtsx: set correct pcr_ops for rts522A
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
commit 10cea23b6aae15e8324f4101d785687f2c514fe5 upstream.
rts522a should use rts522a_pcr_ops, which is
diffrent with rts5227 in phy/hw init setting.
--- drivers/misc/cardreader/rts5227.c | 1 + 1 file changed, 1 insertion(+)
drivers/misc/cardreader/rts5227.c +1 -0
@@ -394,6 +394,7 @@ static const struct pcr_ops rts522a_pcr_void rts522a_init_params (struct rtsx_pcr *pcr) {rts5227_init_params (pcr); + pcr->ops = &rts522a_pcr_ops; pcr->tx_initial_phase =SET_CLOCK_PHASE (20 ,20 ,11 ); pcr->reg_pm_ctrl3 =RTS522A_PM_CTRL3 ;
Greg Kroah-Hartman
maintainerPATCH 16/36 misc: pci_endpoint_test: Fix to support > 10 pci-endpoint-test devices
In reply to Greg Kroah-HartmanFrom: Kishon Vijay Abraham I <[email protected]>
commit 6b443e5c80b67a7b8a85b33d052d655ef9064e90 upstream.
Adding more than 10 pci-endpoint-test devices results in "kobject_add_internal failed for pci-endpoint-test.1 with -EEXIST, don't try to register things with the same name in the same directory". This is because commit 2c156ac71c6b ("misc: Add host side PCI driver for PCI test function device") limited the length of the "name" to 20 characters. Change the length of the name to 24 in order to support upto 10000 pci-endpoint-test devices.
--- drivers/misc/pci_endpoint_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/pci_endpoint_test.c +1 -1
@@ -633,7 +633,7 @@ static int pci_endpoint_test_probe(struc {int err;int id; -char name[20 ]; +char name[24 ];enum pci_barno bar;void __iomem *base;struct device *dev = &pdev->dev;
Greg Kroah-Hartman
maintainerPATCH 17/36 misc: pci_endpoint_test: Avoid using module parameter to determine irqtype
In reply to Greg Kroah-HartmanFrom: Kishon Vijay Abraham I <[email protected]>
commit b2ba9225e0313b1de631a44b7b48c109032bffec upstream.
commit e03327122e2c ("pci_endpoint_test: Add 2 ioctl commands") uses module parameter 'irqtype' in pci_endpoint_test_set_irq() to check if IRQ vectors of a particular type (MSI or MSI-X or LEGACY) is already allocated. However with multi-function devices, 'irqtype' will not correctly reflect the IRQ type of the PCI device.
Fix it here by adding 'irqtype' for each PCI device to show the IRQ type of a particular PCI device.
--- drivers/misc/pci_endpoint_test.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/misc/pci_endpoint_test.c +9 -3
@@ -98,6 +98,7 @@ struct pci_endpoint_test {struct completion irq_raised;int last_irq;int num_irqs; +int irq_type;/* mutex to protect the ioctls */ struct mutex mutex;struct miscdevice miscdev;
@@ -157,6 +158,7 @@ static void pci_endpoint_test_free_irq_vstruct pci_dev *pdev = test->pdev;pci_free_irq_vectors (pdev); + test->irq_type =IRQ_TYPE_UNDEFINED ; } static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test,
@@ -191,6 +193,8 @@ static bool pci_endpoint_test_alloc_irq_ irq =0 ; res = false; } + + test->irq_type = type; test->num_irqs = irq;return res;
@@ -330,6 +334,7 @@ static bool pci_endpoint_test_copy(strucdma_addr_t orig_dst_phys_addr;size_t offset;size_t alignment = test->alignment; +int irq_type = test->irq_type;u32 src_crc32;u32 dst_crc32;
@@ -426,6 +431,7 @@ static bool pci_endpoint_test_write(strudma_addr_t orig_phys_addr;size_t offset;size_t alignment = test->alignment; +int irq_type = test->irq_type;u32 crc32;if (size >SIZE_MAX - alignment)
@@ -494,6 +500,7 @@ static bool pci_endpoint_test_read(strucdma_addr_t orig_phys_addr;size_t offset;size_t alignment = test->alignment; +int irq_type = test->irq_type;u32 crc32;if (size >SIZE_MAX - alignment)
@@ -555,7 +562,7 @@ static bool pci_endpoint_test_set_irq(streturn false; } -if (irq_type == req_irq_type) +if (test->irq_type == req_irq_type)return true;pci_endpoint_test_release_irq (test);
@@ -567,12 +574,10 @@ static bool pci_endpoint_test_set_irq(stif (!pci_endpoint_test_request_irq (test)) goto err; - irq_type = req_irq_type;return true; err:pci_endpoint_test_free_irq_vectors (test); - irq_type =IRQ_TYPE_UNDEFINED ;return false; }
@@ -652,6 +657,7 @@ static int pci_endpoint_test_probe(struc test->test_reg_bar =0 ; test->alignment =0 ; test->pdev = pdev; + test->irq_type =IRQ_TYPE_UNDEFINED ;if (no_msi) irq_type =IRQ_TYPE_LEGACY ;
Greg Kroah-Hartman
maintainerPATCH 18/36 PCI: sysfs: Revert "rescan" file renames
In reply to Greg Kroah-HartmanFrom: Kelsey Skunberg <[email protected]>
commit bd641fd8303a371e789e924291086268256766b0 upstream.
We changed these sysfs filenames:
.../pci_bus/<domain:bus>/rescan -> .../pci_bus/<domain:bus>/bus_rescan .../<domain:bus:dev.fn>/rescan -> .../<domain:bus:dev.fn>/dev_rescan
and Ruslan reported [1] that this broke a userspace application.
Revert these name changes so both files are named "rescan" again.
Note that we have to use __ATTR() to assign custom C symbols, i.e., "struct device_attribute <symbol>".
[1] https://lore.kernel.org/r/CAB=otbSYozS-ZfxB0nCiNnxcbqxwrHOSYxJJtDKa63KzXbXgpw@mail.gmail.com
[bhelgaas: commit log, use __ATTR() both places so we don't have to rename the attributes]
--- drivers/pci/pci-sysfs.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/pci/pci-sysfs.c +4 -2
@@ -464,7 +464,8 @@ static ssize_t dev_rescan_store(struct d }return count; } -static DEVICE_ATTR_WO (dev_rescan); +static struct device_attribute dev_attr_dev_rescan =__ATTR (rescan,0200 ,NULL , + dev_rescan_store);static ssize_t remove_store (struct device *dev,struct device_attribute *attr,const char *buf,size_t count)
@@ -501,7 +502,8 @@ static ssize_t bus_rescan_store(struct d }return count; } -static DEVICE_ATTR_WO (bus_rescan); +static struct device_attribute dev_attr_bus_rescan =__ATTR (rescan,0200 ,NULL , + bus_rescan_store);#if defined(CONFIG_PM ) && defined(CONFIG_ACPI ) static ssize_t d3cold_allowed_store(struct device *dev,
Greg Kroah-Hartman
maintainerPATCH 19/36 coresight: do not use the BIT() macro in the UAPI header
In reply to Greg Kroah-HartmanFrom: Eugene Syromiatnikov <[email protected]>
commit 9b6eaaf3db5e5888df7bca7fed7752a90f7fd871 upstream.
The BIT() macro definition is not available for the UAPI headers (moreover, it can be defined differently in the user space); replace its usage with the _BITUL() macro that is defined in <linux/const.h>.
--- include/uapi/linux/coresight-stm.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
include/uapi/linux/coresight-stm.h +4 -2
@@ -2,8 +2,10 @@#ifndef __UAPI_CORESIGHT_STM_H_#define __UAPI_CORESIGHT_STM_H_ -#define STM_FLAG_TIMESTAMPED BIT(3) -#define STM_FLAG_GUARANTEED BIT(7) +#include <linux/const.h> + +#define STM_FLAG_TIMESTAMPED _BITUL(3) +#define STM_FLAG_GUARANTEED _BITUL(7)/* * The CoreSight STM supports guaranteed and invariant timing
Greg Kroah-Hartman
maintainerPATCH 20/36 mei: me: add cedar fork device ids
In reply to Greg Kroah-HartmanFrom: Alexander Usyskin <[email protected]>
commit 99397d33b763dc554d118aaa38cc5abc6ce985de upstream.
Add Cedar Fork (CDF) device ids, those belongs to the cannon point family.
--- drivers/misc/mei/hw-me-regs.h | 2 ++ drivers/misc/mei/pci-me.c | 2 ++ 2 files changed, 4 insertions(+)
drivers/misc/mei/hw-me-regs.h +2 -0
@@ -87,6 +87,8 @@#define MEI_DEV_ID_CMP_H 0x06e0/* Comet Lake H */ #define MEI_DEV_ID_CMP_H_3 0x06e4/* Comet Lake H 3 (iTouch) */ +#define MEI_DEV_ID_CDF 0x18D3/* Cedar Fork */ +#define MEI_DEV_ID_ICP_LP 0x34E0/* Ice Lake Point LP */ #define MEI_DEV_ID_TGP_LP 0xA0E0/* Tiger Lake Point LP */
drivers/misc/mei/pci-me.c +2 -0
@@ -109,6 +109,8 @@ static const struct pci_device_id mei_me {MEI_PCI_DEVICE(MEI_DEV_ID_MCC, MEI_ME_PCH12_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_MCC_4, MEI_ME_PCH8_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_CDF, MEI_ME_PCH8_CFG)}, +/* required last entry */ {0, } };
Greg Kroah-Hartman
maintainerPATCH 21/36 nvmem: check for NULL reg_read and reg_write before dereferencing
In reply to Greg Kroah-HartmanFrom: Nicholas Johnson <[email protected]>
commit 3c91ef69a3e94f78546b246225ed573fbf1735b4 upstream.
Return -EPERM if reg_read is NULL in bin_attr_nvmem_read() or if reg_write is NULL in bin_attr_nvmem_write().
This prevents NULL dereferences such as the one described in 03cd45d2e219 ("thunderbolt: Prevent crash if non-active NVMem file is read")
--- drivers/nvmem/nvmem-sysfs.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/nvmem/nvmem-sysfs.c +6 -0
@@ -56,6 +56,9 @@ static ssize_t bin_attr_nvmem_read(struc count =round_down (count, nvmem->word_size); +if (!nvmem->reg_read) +return -EPERM ; + rc = nvmem->reg_read (nvmem->priv, pos, buf, count);if (rc)
@@ -90,6 +93,9 @@ static ssize_t bin_attr_nvmem_write(stru count =round_down (count, nvmem->word_size); +if (!nvmem->reg_write) +return -EPERM ; + rc = nvmem->reg_write (nvmem->priv, pos, buf, count);if (rc)
Greg Kroah-Hartman
maintainerPATCH 22/36 extcon: axp288: Add wakeup support
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 9c94553099efb2ba873cbdddfd416a8a09d0e5f1 upstream.
On devices with an AXP288, we need to wakeup from suspend when a charger is plugged in, so that we can do charger-type detection and so that the axp288-charger driver, which listens for our extcon events, can configure the input-current-limit accordingly.
--- drivers/extcon/extcon-axp288.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
drivers/extcon/extcon-axp288.c +32 -0
@@ -423,9 +423,40 @@ static int axp288_extcon_probe(struct pl/* Start charger cable type detection */ axp288_extcon_enable (info); +device_init_wakeup (dev, true); +platform_set_drvdata (pdev, info); + +return 0 ; +} + +static int __maybe_unused axp288_extcon_suspend (struct device *dev) +{ +struct axp288_extcon_info *info =dev_get_drvdata (dev); + +if (device_may_wakeup (dev)) +enable_irq_wake (info->irq[VBUS_RISING_IRQ ]); +return 0 ; } +static int __maybe_unused axp288_extcon_resume (struct device *dev) +{ +struct axp288_extcon_info *info =dev_get_drvdata (dev); + +/* +* Wakeup when a charger is connected to do charger-type +* connection and generate an extcon event which makes the +* axp288 charger driver set the input current limit. +*/ +if (device_may_wakeup (dev)) +disable_irq_wake (info->irq[VBUS_RISING_IRQ ]); + +return 0 ; +} + +static SIMPLE_DEV_PM_OPS(axp288_extcon_pm_ops, axp288_extcon_suspend, + axp288_extcon_resume); +static const struct platform_device_id axp288_extcon_table[] = { { .name ="axp288_extcon" }, {},
@@ -437,6 +468,7 @@ static struct platform_driver axp288_ext .id_table = axp288_extcon_table, .driver = { .name = "axp288_extcon", + .pm = &axp288_extcon_pm_ops, }, };
Greg Kroah-Hartman
maintainerPATCH 23/36 power: supply: axp288_charger: Add special handling for HP Pavilion x2 10
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 9c80662a74cd2a5d1113f5c69d027face963a556 upstream.
Some HP Pavilion x2 10 models use an AXP288 for charging and fuel-gauge. We use a native power_supply / PMIC driver in this case, because on most models with an AXP288 the ACPI AC / Battery code is either completely missing or relies on custom / proprietary ACPI OpRegions which Linux does not implement.
The native drivers mostly work fine, but there are 2 problems:
1. These model uses a Type-C connector for charging which the AXP288 does not support. As long as a Type-A charger (which uses the USB data pins for charger type detection) is used everything is fine. But if a Type-C charger is used (such as the charger shipped with the device) then the charger is not recognized.
So we end up slowly discharging the device even though a charger is connected, because we are limiting the current from the charger to 500mA. To make things worse this happens with the device's official charger.
Looking at the ACPI tables HP has "solved" the problem of the AXP288 not being able to recognize Type-C chargers by simply always programming the input-current-limit at 3000mA and relying on a Vhold setting of 4.7V (normally 4.4V) to limit the current intake if the charger cannot handle this.
2. If no charger is connected when the machine boots then it boots with the vbus-path disabled. On other devices this is done when a 5V boost converter is active to avoid the PMIC trying to charge from the 5V boost output. This is done when an OTG host cable is inserted and the ID pin on the micro-B receptacle is pulled low, the ID pin has an ACPI event handler associated with it which re-enables the vbus-path when the ID pin is pulled high when the OTG cable is removed. The Type-C connector has no ID pin, there is no ID pin handler and there appears to be no 5V boost converter, so we end up not charging because the vbus-path is disabled, until we unplug the charger which automatically clears the vbus-path disable bit and then on the second plug-in of the adapter we start charging.
The HP Pavilion x2 10 models with an AXP288 do have mostly working ACPI AC / Battery code which does not rely on custom / proprietary ACPI OpRegions. So one possible solution would be to blacklist the AXP288 native power_supply drivers and add the HP Pavilion x2 10 with AXP288 DMI ids to the list of devices which should use the ACPI AC / Battery code even though they have an AXP288 PMIC. This would require changes to 4 files: drivers/acpi/ac.c, drivers/power/supply/axp288_charger.c, drivers/acpi/battery.c and drivers/power/supply/axp288_fuel_gauge.c.
Beside needing adding the same DMI matches to 4 different files, this approach also triggers problem 2. from above, but then when suspended, during suspend the machine will not wakeup because the vbus path is disabled by the AML code when not charging, so the Vbus low-to-high IRQ is not triggered, the CPU never wakes up and the device does not charge even though the user likely things it is charging, esp. since the charge status LED is directly coupled to an adapter being plugged in and does not reflect actual charging.
This could be worked by enabling vbus-path explicitly from say the axp288_charger driver's suspend handler.
So neither situation is ideal, in both cased we need to explicitly enable the vbus-path to work around different variants of problem 2 above, this requires a quirk in the axp288_charger code.
If we go the route of using the ACPI AC / Battery drivers then we need modifications to 3 other drivers; and we need to partially disable the axp288_charger code, while at the same time keeping it around to enable vbus-path on suspend.
OTOH we can copy the hardcoding of 3A input-current-limit (we never touch Vhold, so that would stay at 4.7V) to the axp288_charger code, which needs changes regardless, then we concentrate all special handling of this interesting device model in the axp288_charger code. That is what this commit does.
--- drivers/power/supply/axp288_charger.c | 57 +++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-)
drivers/power/supply/axp288_charger.c +56 -1
@@ -21,6 +21,7 @@#include <linux/property.h> #include <linux/mfd/axp20x.h> #include <linux/extcon.h> +#include <linux/dmi.h> #define PS_STAT_VBUS_TRIGGER BIT(0)#define PS_STAT_BAT_CHRG_DIR BIT(2)
@@ -545,6 +546,49 @@ out:return IRQ_HANDLED ; } +/* +* The HP Pavilion x2 10 series comes in a number of variants: +* Bay Trail SoC + AXP288 PMIC, DMI_BOARD_NAME: "815D" +* Cherry Trail SoC + AXP288 PMIC, DMI_BOARD_NAME: "813E" +* Cherry Trail SoC + TI PMIC, DMI_BOARD_NAME: "827C" or "82F4" +* +* The variants with the AXP288 PMIC are all kinds of special: +* +* 1. All variants use a Type-C connector which the AXP288 does not support, so +* when using a Type-C charger it is not recognized. Unlike most AXP288 devices, +* this model actually has mostly working ACPI AC / Battery code, the ACPI code +* "solves" this by simply setting the input_current_limit to 3A. +* There are still some issues with the ACPI code, so we use this native driver, +* and to solve the charging not working (500mA is not enough) issue we hardcode +* the 3A input_current_limit like the ACPI code does. +* +* 2. If no charger is connected the machine boots with the vbus-path disabled. +* Normally this is done when a 5V boost converter is active to avoid the PMIC +* trying to charge from the 5V boost converter's output. This is done when +* an OTG host cable is inserted and the ID pin on the micro-B receptacle is +* pulled low and the ID pin has an ACPI event handler associated with it +* which re-enables the vbus-path when the ID pin is pulled high when the +* OTG host cable is removed. The Type-C connector has no ID pin, there is +* no ID pin handler and there appears to be no 5V boost converter, so we +* end up not charging because the vbus-path is disabled, until we unplug +* the charger which automatically clears the vbus-path disable bit and then +* on the second plug-in of the adapter we start charging. To solve the not +* charging on first charger plugin we unconditionally enable the vbus-path at +* probe on this model, which is safe since there is no 5V boost converter. +*/ +static const struct dmi_system_id axp288_hp_x2_dmi_ids[] = { + { +/* +* Bay Trail model has "Hewlett-Packard" as sys_vendor, Cherry +* Trail model has "HP", so we only match on product_name. +*/ + .matches = { +DMI_MATCH (DMI_PRODUCT_NAME ,"HP Pavilion x2 Detachable" ), + }, + }, + {}/* Terminating entry */ +}; +static void axp288_charger_extcon_evt_worker (struct work_struct *work) { struct axp288_chrg_info *info =
@@ -568,7 +612,11 @@ static void axp288_charger_extcon_evt_wo }/* Determine cable/charger type */ -if (extcon_get_state (edev,EXTCON_CHG_USB_SDP ) >0 ) { +if (dmi_check_system (axp288_hp_x2_dmi_ids)) { +/* See comment above axp288_hp_x2_dmi_ids declaration */ +dev_dbg (&info->pdev->dev,"HP X2 with Type-C, setting inlmt to 3A\n" ); + current_limit =3000000 ; + }else if (extcon_get_state (edev,EXTCON_CHG_USB_SDP ) >0 ) {dev_dbg (&info->pdev->dev,"USB SDP charger is connected\n" ); current_limit =500000 ; }else if (extcon_get_state (edev,EXTCON_CHG_USB_CDP ) >0 ) {
@@ -685,6 +733,13 @@ static int charger_init_hw_regs(struct areturn ret; } +if (dmi_check_system (axp288_hp_x2_dmi_ids)) { +/* See comment above axp288_hp_x2_dmi_ids declaration */ + ret =axp288_charger_vbus_path_select (info, true); +if (ret <0 ) +return ret; + } +/* Read current charge voltage and current limit */ ret =regmap_read (info->regmap,AXP20X_CHRG_CTRL1 , &val);if (ret <0 ) {
Greg Kroah-Hartman
maintainerPATCH 24/36 Revert "dm: always call blk_queue_split() in dm_process_bio()"
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit 120c9257f5f19e5d1e87efcbb5531b7cd81b7d74 upstream.
This reverts commit effd58c95f277744f75d6e08819ac859dbcbd351.
blk_queue_split() is causing excessive IO splitting -- because blk_max_size_offset() depends on 'chunk_sectors' limit being set and if it isn't (as is the case for DM targets!) it falls back to splitting on a 'max_sectors' boundary regardless of offset.
"Fix" this by reverting back to _not_ using blk_queue_split() in dm_process_bio() for normal IO (reads and writes). Long-term fix is still TBD but it should focus on training blk_max_size_offset() to call into a DM provided hook (to call DM's max_io_len()).
Test results from simple misaligned IO test on 4-way dm-striped device with chunksize of 128K and stripesize of 512K:
xfs_io -d -c 'pread -b 2m 224s 4072s' /dev/mapper/stripe_dev
before this revert:
253,0 21 1 0.000000000 2206 Q R 224 + 4072 [xfs_io] 253,0 21 2 0.000008267 2206 X R 224 / 480 [xfs_io] 253,0 21 3 0.000010530 2206 X R 224 / 256 [xfs_io] 253,0 21 4 0.000027022 2206 X R 480 / 736 [xfs_io] 253,0 21 5 0.000028751 2206 X R 480 / 512 [xfs_io] 253,0 21 6 0.000033323 2206 X R 736 / 992 [xfs_io] 253,0 21 7 0.000035130 2206 X R 736 / 768 [xfs_io] 253,0 21 8 0.000039146 2206 X R 992 / 1248 [xfs_io] 253,0 21 9 0.000040734 2206 X R 992 / 1024 [xfs_io] 253,0 21 10 0.000044694 2206 X R 1248 / 1504 [xfs_io] 253,0 21 11 0.000046422 2206 X R 1248 / 1280 [xfs_io] 253,0 21 12 0.000050376 2206 X R 1504 / 1760 [xfs_io] 253,0 21 13 0.000051974 2206 X R 1504 / 1536 [xfs_io] 253,0 21 14 0.000055881 2206 X R 1760 / 2016 [xfs_io] 253,0 21 15 0.000057462 2206 X R 1760 / 1792 [xfs_io] 253,0 21 16 0.000060999 2206 X R 2016 / 2272 [xfs_io] 253,0 21 17 0.000062489 2206 X R 2016 / 2048 [xfs_io] 253,0 21 18 0.000066133 2206 X R 2272 / 2528 [xfs_io] 253,0 21 19 0.000067507 2206 X R 2272 / 2304 [xfs_io] 253,0 21 20 0.000071136 2206 X R 2528 / 2784 [xfs_io] 253,0 21 21 0.000072764 2206 X R 2528 / 2560 [xfs_io] 253,0 21 22 0.000076185 2206 X R 2784 / 3040 [xfs_io] 253,0 21 23 0.000077486 2206 X R 2784 / 2816 [xfs_io] 253,0 21 24 0.000080885 2206 X R 3040 / 3296 [xfs_io] 253,0 21 25 0.000082316 2206 X R 3040 / 3072 [xfs_io] 253,0 21 26 0.000085788 2206 X R 3296 / 3552 [xfs_io] 253,0 21 27 0.000087096 2206 X R 3296 / 3328 [xfs_io] 253,0 21 28 0.000093469 2206 X R 3552 / 3808 [xfs_io] 253,0 21 29 0.000095186 2206 X R 3552 / 3584 [xfs_io] 253,0 21 30 0.000099228 2206 X R 3808 / 4064 [xfs_io] 253,0 21 31 0.000101062 2206 X R 3808 / 3840 [xfs_io] 253,0 21 32 0.000104956 2206 X R 4064 / 4096 [xfs_io] 253,0 21 33 0.001138823 0 C R 4096 + 200 [0]
after this revert:
253,0 18 1 0.000000000 4430 Q R 224 + 3896 [xfs_io] 253,0 18 2 0.000018359 4430 X R 224 / 256 [xfs_io] 253,0 18 3 0.000028898 4430 X R 256 / 512 [xfs_io] 253,0 18 4 0.000033535 4430 X R 512 / 768 [xfs_io] 253,0 18 5 0.000065684 4430 X R 768 / 1024 [xfs_io] 253,0 18 6 0.000091695 4430 X R 1024 / 1280 [xfs_io] 253,0 18 7 0.000098494 4430 X R 1280 / 1536 [xfs_io] 253,0 18 8 0.000114069 4430 X R 1536 / 1792 [xfs_io] 253,0 18 9 0.000129483 4430 X R 1792 / 2048 [xfs_io] 253,0 18 10 0.000136759 4430 X R 2048 / 2304 [xfs_io] 253,0 18 11 0.000152412 4430 X R 2304 / 2560 [xfs_io] 253,0 18 12 0.000160758 4430 X R 2560 / 2816 [xfs_io] 253,0 18 13 0.000183385 4430 X R 2816 / 3072 [xfs_io] 253,0 18 14 0.000190797 4430 X R 3072 / 3328 [xfs_io] 253,0 18 15 0.000197667 4430 X R 3328 / 3584 [xfs_io] 253,0 18 16 0.000218751 4430 X R 3584 / 3840 [xfs_io] 253,0 18 17 0.000226005 4430 X R 3840 / 4096 [xfs_io] 253,0 18 18 0.000250404 4430 Q R 4120 + 176 [xfs_io] 253,0 18 19 0.000847708 0 C R 4096 + 24 [0] 253,0 18 20 0.000855783 0 C R 4120 + 176 [0]
--- drivers/md/dm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/md/dm.c +3 -2
@@ -1760,8 +1760,9 @@ static blk_qc_t dm_process_bio(struct ma* won't be imposed. */ if (current->bio_list) { -blk_queue_split (md->queue, &bio); -if (!is_abnormal_io (bio)) +if (is_abnormal_io (bio)) +blk_queue_split (md->queue, &bio); +else dm_queue_split (md, ti, &bio); }
Greg Kroah-Hartman
maintainerPATCH 25/36 ALSA: hda/ca0132 - Add Recon3Di quirk to handle integrated sound on EVGA X99 Classified motherboard
In reply to Greg Kroah-HartmanFrom: Geoffrey Allott <[email protected]>
commit e9097e47e349b747dee50f935216de0ffb662962 upstream.
I have a system which has an EVGA X99 Classified motherboard. The pin assignments for the HD Audio controller are not correct under Linux. Windows 10 works fine and informs me that it's using the Recon3Di driver, and on Linux, cat /sys/class/sound/card0/device/subsystem_{vendor,device} yields
0x38420x1038
This patch adds a corresponding entry to the quirk list.
--- sound/pci/hda/patch_ca0132.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_ca0132.c +1 -0
@@ -1180,6 +1180,7 @@ static const struct snd_pci_quirk ca0132SND_PCI_QUIRK (0x1458 ,0xA016 ,"Recon3Di" ,QUIRK_R3DI ),SND_PCI_QUIRK (0x1458 ,0xA026 ,"Gigabyte G1.Sniper Z97" ,QUIRK_R3DI ),SND_PCI_QUIRK (0x1458 ,0xA036 ,"Gigabyte GA-Z170X-Gaming 7" ,QUIRK_R3DI ), +SND_PCI_QUIRK (0x3842 ,0x1038 ,"EVGA X99 Classified" ,QUIRK_R3DI ),SND_PCI_QUIRK (0x1102 ,0x0013 ,"Recon3D" ,QUIRK_R3D ), SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5), {}
Greg Kroah-Hartman
maintainerPATCH 26/36 soc: mediatek: knows_txdone needs to be set in Mediatek CMDQ helper
In reply to Greg Kroah-HartmanFrom: Bibby Hsieh <[email protected]>
commit ce35e21d82bcac8b3fd5128888f9e233f8444293 upstream.
Mediatek CMDQ driver have a mechanism to do TXDONE_BY_ACK, so we should set knows_txdone.
--- drivers/soc/mediatek/mtk-cmdq-helper.c | 1 + 1 file changed, 1 insertion(+)
drivers/soc/mediatek/mtk-cmdq-helper.c +1 -0
@@ -38,6 +38,7 @@ struct cmdq_client *cmdq_mbox_create(str client->pkt_cnt =0 ; client->client.dev = dev; client->client.tx_block = false; + client->client.knows_txdone = true; client->chan =mbox_request_channel (&client->client, index);if (IS_ERR (client->chan)) {
Greg Kroah-Hartman
maintainerPATCH 27/36 net/mlx5e: kTLS, Fix wrong value in record tracker enum
In reply to Greg Kroah-HartmanFrom: Tariq Toukan <[email protected]>
commit f28ca65efa87b3fb8da3d69ca7cb1ebc0448de66 upstream.
Fix to match the HW spec: TRACKING state is 1, SEARCHING is 2. No real issue for now, as these values are not currently used.
--- drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h +2 -2
@@ -38,8 +38,8 @@ enum {enum {MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_START =0 , -MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_SEARCHING =1 , -MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_TRACKING =2 , +MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_TRACKING =1 , +MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_SEARCHING =2 , };struct mlx5e_ktls_offload_context_tx {
Greg Kroah-Hartman
maintainerPATCH 28/36 iwlwifi: consider HE capability when setting LDPC
In reply to Greg Kroah-HartmanFrom: Mordechay Goodstein <[email protected]>
commit cb377dfda1755b3bc01436755d866c8e5336a762 upstream.
The AP may set the LDPC capability only in HE (IEEE80211_HE_PHY_CAP1), but we were checking it only in the HT capabilities.
If we don't use this capability when required, the DSP gets the wrong configuration in HE and doesn't work properly.
--- drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c +5 -1
@@ -147,7 +147,11 @@ static u16 rs_fw_get_config_flags(struct (vht_ena && (vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC)))) flags |=IWL_TLC_MNG_CFG_FLAGS_LDPC_MSK ; -/* consider our LDPC support in case of HE */ +/* consider LDPC support in case of HE */ +if (he_cap->has_he && (he_cap->he_cap_elem.phy_cap_info[1 ] & +IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD )) + flags |=IWL_TLC_MNG_CFG_FLAGS_LDPC_MSK ; +if (sband->iftype_data && sband->iftype_data->he_cap.has_he && !(sband->iftype_data->he_cap.he_cap_elem.phy_cap_info[1 ] &IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD ))
Greg Kroah-Hartman
maintainerPATCH 29/36 iwlwifi: yoyo: dont add TLV offset when reading FIFOs
In reply to Greg Kroah-HartmanFrom: Mordechay Goodstein <[email protected]>
commit a5688e600e78f9fc68102bf0fe5c797fc2826abe upstream.
The TLV offset is only used to read registers, while the offset used for the FIFO addresses are hard coded in the driver and not given by the TLV.
If we try to apply the TLV offset when reading the FIFOs, we'll read from invalid addresses, causing the driver to hang.
--- drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/dbg.c +3 -7
@@ -8,7 +8,7 @@* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH * Copyright(c) 2015 - 2017 Intel Deutschland GmbH -* Copyright(c) 2018 - 2019 Intel Corporation +* Copyright(c) 2018 - 2020 Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as
@@ -31,7 +31,7 @@* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH * Copyright(c) 2015 - 2017 Intel Deutschland GmbH -* Copyright(c) 2018 - 2019 Intel Corporation +* Copyright(c) 2018 - 2020 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without
@@ -1373,11 +1373,7 @@ static int iwl_dump_ini_rxf_iter(struct goto out; } -/* -* region register have absolute value so apply rxf offset after -* reading the registers -*/ - offs += rxf_data.offset; + offs = rxf_data.offset;/* Lock fence */ iwl_write_prph_no_grab (fwrt->trans,RXF_SET_FENCE_MODE + offs,0x1 );
Greg Kroah-Hartman
maintainerPATCH 30/36 iwlwifi: dbg: dont abort if sending DBGC_SUSPEND_RESUME fails
In reply to Greg Kroah-HartmanFrom: Luca Coelho <[email protected]>
commit 699b760bd29edba736590fffef7654cb079c753e upstream.
If the firmware is in a bad state or not initialized fully, sending the DBGC_SUSPEND_RESUME command fails but we can still collect logs.
Instead of aborting the entire dump process, simply ignore the error. By removing the last callpoint that was checking the return value, we can also convert the function to return void.
--- drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 15 +++++---------- drivers/net/wireless/intel/iwlwifi/fw/dbg.h | 6 +++--- 2 files changed, 8 insertions(+), 13 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/dbg.c +5 -10
@@ -2311,10 +2311,7 @@ static void iwl_fw_dbg_collect_sync(stru goto out; } -if (iwl_fw_dbg_stop_restart_recording (fwrt, ¶ms, true)) { -IWL_ERR (fwrt,"Failed to stop DBGC recording, aborting dump\n" ); - goto out; - } +iwl_fw_dbg_stop_restart_recording (fwrt, ¶ms, true);IWL_DEBUG_FW_INFO (fwrt,"WRT: Data collection start\n" );if (iwl_trans_dbg_ini_valid (fwrt->trans))
@@ -2480,14 +2477,14 @@ static int iwl_fw_dbg_restart_recording(return 0 ; } -int iwl_fw_dbg_stop_restart_recording (struct iwl_fw_runtime *fwrt, -struct iwl_fw_dbg_params *params, -bool stop) +void iwl_fw_dbg_stop_restart_recording (struct iwl_fw_runtime *fwrt, +struct iwl_fw_dbg_params *params, +bool stop) {int ret =0 ;if (test_bit (STATUS_FW_ERROR , &fwrt->trans->status)) -return 0 ; +return ;if (fw_has_capa (&fwrt->fw->ucode_capa,IWL_UCODE_TLV_CAPA_DBG_SUSPEND_RESUME_CMD_SUPP ))
@@ -2504,7 +2501,5 @@ int iwl_fw_dbg_stop_restart_recording(st iwl_fw_set_dbg_rec_on(fwrt); }#endif - -return ret; }IWL_EXPORT_SYMBOL (iwl_fw_dbg_stop_restart_recording);
drivers/net/wireless/intel/iwlwifi/fw/dbg.h +3 -3
@@ -263,9 +263,9 @@ _iwl_fw_dbg_trigger_simple_stop(struct i_iwl_fw_dbg_trigger_simple_stop ((fwrt), (wdev), \iwl_fw_dbg_get_trigger ((fwrt)->fw,\ (trig))) -int iwl_fw_dbg_stop_restart_recording (struct iwl_fw_runtime *fwrt, -struct iwl_fw_dbg_params *params, -bool stop); +void iwl_fw_dbg_stop_restart_recording (struct iwl_fw_runtime *fwrt, +struct iwl_fw_dbg_params *params, +bool stop);#ifdef CONFIG_IWLWIFI_DEBUGFS static inline void iwl_fw_set_dbg_rec_on (struct iwl_fw_runtime *fwrt)
Greg Kroah-Hartman
maintainerPATCH 31/36 rxrpc: Fix sendmsg(MSG_WAITALL) handling
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
commit 498b577660f08cef5d9e78e0ed6dcd4c0939e98c upstream.
Fix the handling of sendmsg() with MSG_WAITALL for userspace to round the timeout for when a signal occurs up to at least two jiffies as a 1 jiffy timeout may end up being effectively 0 if jiffies wraps at the wrong time.
--- net/rxrpc/sendmsg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/rxrpc/sendmsg.c +2 -2
@@ -58,8 +58,8 @@ static int rxrpc_wait_for_tx_window_wait rtt =READ_ONCE (call->peer->rtt); rtt2 =nsecs_to_jiffies64 (rtt) *2 ; -if (rtt2 <1 ) - rtt2 =1 ; +if (rtt2 <2 ) + rtt2 =2 ; timeout = rtt2; tx_start =READ_ONCE (call->tx_hard_ack);
Greg Kroah-Hartman
maintainerPATCH 32/36 IB/hfi1: Ensure pq is not left on waitlist
In reply to Greg Kroah-HartmanFrom: Mike Marciniszyn <[email protected]>
commit 9a293d1e21a6461a11b4217b155bf445e57f4131 upstream.
The following warning can occur when a pq is left on the dmawait list and the pq is then freed:
WARNING: CPU: 47 PID: 3546 at lib/list_debug.c:29 __list_add+0x65/0xc0 list_add corruption. next->prev should be prev (ffff939228da1880), but was ffff939cabb52230. (next=ffff939cabb52230). Modules linked in: mmfs26(OE) mmfslinux(OE) tracedev(OE) 8021q garp mrp ib_isert iscsi_target_mod target_core_mod crc_t10dif crct10dif_generic opa_vnic rpcrdma ib_iser libiscsi scsi_transport_iscsi ib_ipoib(OE) bridge stp llc iTCO_wdt iTCO_vendor_support intel_powerclamp coretemp intel_rapl iosf_mbi kvm_intel kvm irqbypass crct10dif_pclmul crct10dif_common crc32_pclmul ghash_clmulni_intel aesni_intel lrw gf128mul glue_helper ablk_helper cryptd ast ttm drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm pcspkr joydev drm_panel_orientation_quirks i2c_i801 mei_me lpc_ich mei wmi ipmi_si ipmi_devintf ipmi_msghandler nfit libnvdimm acpi_power_meter acpi_pad hfi1(OE) rdmavt(OE) rdma_ucm ib_ucm ib_uverbs ib_umad rdma_cm ib_cm iw_cm ib_core binfmt_misc numatools(OE) xpmem(OE) ip_tables nfsv3 nfs_acl nfs lockd grace sunrpc fscache igb ahci libahci i2c_algo_bit dca libata ptp pps_core crc32c_intel [last unloaded: i2c_algo_bit] CPU: 47 PID: 3546 Comm: wrf.exe Kdump: loaded Tainted: G W OE ------------ 3.10.0-957.41.1.el7.x86_64 #1 Hardware name: HPE.COM HPE SGI 8600-XA730i Gen10/X11DPT-SB-SG007, BIOS SBED1229 01/22/2019 Call Trace: [<ffffffff91f65ac0>] dump_stack+0x19/0x1b [<ffffffff91898b78>] __warn+0xd8/0x100 [<ffffffff91898bff>] warn_slowpath_fmt+0x5f/0x80 [<ffffffff91a1dabe>] ? ___slab_alloc+0x24e/0x4f0 [<ffffffff91b97025>] __list_add+0x65/0xc0 [<ffffffffc03926a5>] defer_packet_queue+0x145/0x1a0 [hfi1] [<ffffffffc0372987>] sdma_check_progress+0x67/0xa0 [hfi1] [<ffffffffc03779d2>] sdma_send_txlist+0x432/0x550 [hfi1] [<ffffffff91a20009>] ? kmem_cache_alloc+0x179/0x1f0 [<ffffffffc0392973>] ? user_sdma_send_pkts+0xc3/0x1990 [hfi1] [<ffffffffc0393e3a>] user_sdma_send_pkts+0x158a/0x1990 [hfi1] [<ffffffff918ab65e>] ? try_to_del_timer_sync+0x5e/0x90 [<ffffffff91a3fe1a>] ? __check_object_size+0x1ca/0x250 [<ffffffffc0395546>] hfi1_user_sdma_process_request+0xd66/0x1280 [hfi1] [<ffffffffc034e0da>] hfi1_aio_write+0xca/0x120 [hfi1] [<ffffffff91a4245b>] do_sync_readv_writev+0x7b/0xd0 [<ffffffff91a4409e>] do_readv_writev+0xce/0x260 [<ffffffff918df69f>] ? pick_next_task_fair+0x5f/0x1b0 [<ffffffff918db535>] ? sched_clock_cpu+0x85/0xc0 [<ffffffff91f6b16a>] ? __schedule+0x13a/0x860 [<ffffffff91a442c5>] vfs_writev+0x35/0x60 [<ffffffff91a4447f>] SyS_writev+0x7f/0x110 [<ffffffff91f78ddb>] system_call_fastpath+0x22/0x27
The issue happens when wait_event_interruptible_timeout() returns a value <= 0.
In that case, the pq is left on the list. The code continues sending packets and potentially can complete the current request with the pq still on the dmawait list provided no descriptor shortage is seen.
If the pq is torn down in that state, the sdma interrupt handler could find the now freed pq on the list with list corruption or memory corruption resulting.
Fix by adding a flush routine to ensure that the pq is never on a list after processing a request.
A follow-up patch series will address issues with seqlock surfaced in:
https://lore.kernel.org/r/[email protected]
The seqlock use for sdma will then be converted to a spin lock since the list_empty() doesn't need the protection afforded by the sequence lock currently in use.
--- drivers/infiniband/hw/hfi1/user_sdma.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
drivers/infiniband/hw/hfi1/user_sdma.c +22 -3
@@ -141,6 +141,7 @@ static int defer_packet_queue(*/ xchg (&pq->state,SDMA_PKT_Q_DEFERRED );if (list_empty (&pq->busy.list)) { + pq->busy.lock = &sde->waitlock;iowait_get_priority (&pq->busy);iowait_queue (pkts_sent, &pq->busy, &sde->dmawait); }
@@ -155,6 +156,7 @@ static void activate_packet_queue(struct {struct hfi1_user_sdma_pkt_q *pq = container_of(wait, struct hfi1_user_sdma_pkt_q, busy); + pq->busy.lock =NULL ;xchg (&pq->state,SDMA_PKT_Q_ACTIVE );wake_up (&wait->wait_dma); };
@@ -256,6 +258,21 @@ pq_reqs_nomem:return ret; } +static void flush_pq_iowait (struct hfi1_user_sdma_pkt_q *pq) +{ +unsigned long flags; +seqlock_t *lock = pq->busy.lock; + +if (!lock) +return ; +write_seqlock_irqsave (lock, flags); +if (!list_empty (&pq->busy.list)) { +list_del_init (&pq->busy.list); + pq->busy.lock =NULL ; + } +write_sequnlock_irqrestore (lock, flags); +} +int hfi1_user_sdma_free_queues (struct hfi1_filedata *fd,struct hfi1_ctxtdata *uctxt) {
@@ -281,6 +298,7 @@ int hfi1_user_sdma_free_queues(struct hfkfree (pq->reqs);kfree (pq->req_in_use);kmem_cache_destroy (pq->txreq_cache); +flush_pq_iowait (pq);kfree (pq); }else {spin_unlock (&fd->pq_rcu_lock);
@@ -587,11 +605,12 @@ int hfi1_user_sdma_process_request(strucif (ret <0 ) {if (ret != -EBUSY ) goto free_req; -wait_event_interruptible_timeout ( +if (wait_event_interruptible_timeout ( pq->busy.wait_dma, - (pq->state ==SDMA_PKT_Q_ACTIVE ), + pq->state ==SDMA_PKT_Q_ACTIVE ,msecs_to_jiffies ( -SDMA_IOWAIT_TIMEOUT )); +SDMA_IOWAIT_TIMEOUT )) <=0 ) +flush_pq_iowait (pq); } } *count += idx;
Greg Kroah-Hartman
maintainerPATCH 33/36 tcp: fix TFO SYNACK undo to avoid double-timestamp-undo
In reply to Greg Kroah-HartmanFrom: Neal Cardwell <[email protected]>
commit dad8cea7add96a353fa1898b5ccefbb72da66f29 upstream.
In a rare corner case the new logic for undo of SYNACK RTO could result in triggering the warning in tcp_fastretrans_alert() that says:
WARN_ON(tp->retrans_out != 0);
The warning looked like:
WARNING: CPU: 1 PID: 1 at net/ipv4/tcp_input.c:2818 tcp_ack+0x13e0/0x3270
The sequence that tickles this bug is:
- Fast Open server receives TFO SYN with data, sends SYNACK
- (client receives SYNACK and sends ACK, but ACK is lost)
- server app sends some data packets
- (N of the first data packets are lost)
- server receives client ACK that has a TS ECR matching first SYNACK, and also SACKs suggesting the first N data packets were lost
- server performs TS undo of SYNACK RTO, then immediately enters recovery
- buggy behavior then performed a *second* undo that caused the connection to be in CA_Open with retrans_out != 0
Basically, the incoming ACK packet with SACK blocks causes us to first undo the cwnd reduction from the SYNACK RTO, but then immediately enters fast recovery, which then makes us eligible for undo again. And then tcp_rcv_synrecv_state_fastopen() accidentally performs an undo using a "mash-up" of state from two different loss recovery phases: it uses the timestamp info from the ACK of the original SYNACK, and the undo_marker from the fast recovery.
This fix refines the logic to only invoke the tcp_try_undo_loss() inside tcp_rcv_synrecv_state_fastopen() if the connection is still in CA_Loss. If peer SACKs triggered fast recovery, then tcp_rcv_synrecv_state_fastopen() can't safely undo.
--- net/ipv4/tcp_input.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/ipv4/tcp_input.c +5 -1
@@ -6096,7 +6096,11 @@ static void tcp_rcv_synrecv_state_fastop {struct request_sock *req; -tcp_try_undo_loss (sk, false); +/* If we are still handling the SYNACK RTO, see if timestamp ECR allows +* undo. If peer SACKs triggered fast recovery, we can't undo here. +*/ +if (inet_csk (sk)->icsk_ca_state == TCP_CA_Loss) +tcp_try_undo_loss (sk, false);/* Reset rtx states to prevent spurious retransmits_timed_out() */ tcp_sk (sk)->retrans_stamp =0 ;
Greg Kroah-Hartman
maintainerPATCH 34/36 i2c: i801: Do not add ICH_RES_IO_SMI for the iTCO_wdt device
In reply to Greg Kroah-HartmanFrom: Mika Westerberg <[email protected]>
commit 04bbb97d1b732b2d197f103c5818f5c214a4cf81 upstream.
Martin noticed that nct6775 driver does not load properly on his system in v5.4+ kernels. The issue was bisected to commit b84398d6d7f9 ("i2c:
i801: Use iTCO version 6 in Cannon Lake PCH and beyond") but it is likely not the culprit because the faulty code has been in the driver already since commit 9424693035a5 ("i2c: i801: Create iTCO device on newer Intel PCHs"). So more likely some commit that added PCI IDs of recent chipsets made the driver to create the iTCO_wdt device on Martins system.
The issue was debugged to be PCI configuration access to the PMC device that is not present. This returns all 1's when read and this caused the iTCO_wdt driver to accidentally request resourses used by nct6775.
It turns out that the SMI resource is only required for some ancient systems, not the ones supported by this driver. For this reason do not populate the SMI resource at all and drop all the related code. The driver now always populates the main I/O resource and only in case of SPT (Intel Sunrisepoint) compatible devices it adds another resource for the NO_REBOOT bit. These two resources are of different types so platform_get_resource() used by the iTCO_wdt driver continues to find the both resources at index 0.
--- drivers/i2c/busses/i2c-i801.c | 45 +++++++++++------------------------------- 1 file changed, 12 insertions(+), 33 deletions(-)
drivers/i2c/busses/i2c-i801.c +12 -33
@@ -129,11 +129,6 @@#define TCOBASE 0x050#define TCOCTL 0x054 -#define ACPIBASE 0x040 -#define ACPIBASE_SMI_OFF 0x030 -#define ACPICTRL 0x044 -#define ACPICTRL_EN 0x080 -#define SBREG_BAR 0x10#define SBREG_SMBCTRL 0xc6000c#define SBREG_SMBCTRL_DNV 0xcf000c
@@ -1544,7 +1539,7 @@ i801_add_tco_spt(struct i801_priv *priv,pci_bus_write_config_byte (pci_dev->bus, devfn,0xe1 , hidden);spin_unlock (&p2sb_spinlock); - res = &tco_res[ICH_RES_MEM_OFF ]; + res = &tco_res[1 ];if (pci_dev->device ==PCI_DEVICE_ID_INTEL_DNV_SMBUS ) res->start = (resource_size_t )base64_addr +SBREG_SMBCTRL_DNV ;else
@@ -1554,7 +1549,7 @@ i801_add_tco_spt(struct i801_priv *priv, res->flags =IORESOURCE_MEM ;return platform_device_register_resndata (&pci_dev->dev,"iTCO_wdt" ,-1 , - tco_res,3 , &spt_tco_platform_data, + tco_res,2 , &spt_tco_platform_data,sizeof (spt_tco_platform_data)); }
@@ -1567,17 +1562,16 @@ static struct platform_device * i801_add_tco_cnl(struct i801_priv *priv, struct pci_dev *pci_dev, struct resource *tco_res) { - return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, - tco_res, 2, &cnl_tco_platform_data, - sizeof(cnl_tco_platform_data )); + return platform_device_register_resndata(&pci_dev->dev, + "iTCO_wdt", -1, tco_res, 1, &cnl_tco_platform_data, + sizeof(cnl_tco_platform_data)); }static void i801_add_tco (struct i801_priv *priv) { -u32 base_addr, tco_base, tco_ctl, ctrl_val;struct pci_dev *pci_dev = priv->pci_dev; -struct resource tco_res[3 ], *res; -unsigned int devfn; +struct resource tco_res[2 ], *res; +u32 tco_base, tco_ctl;/* If we have ACPI based watchdog use that instead */ if (acpi_has_watchdog ())
@@ -1592,30 +1586,15 @@ static void i801_add_tco(struct i801_prireturn ;memset (tco_res,0 ,sizeof (tco_res)); - - res = &tco_res[ICH_RES_IO_TCO ]; - res->start = tco_base & ~1 ; - res->end = res->start +32 -1 ; - res->flags =IORESOURCE_IO ; -/* -* Power Management registers. +* Always populate the main iTCO IO resource here. The second entry +* for NO_REBOOT MMIO is filled by the SPT specific function. */ - devfn =PCI_DEVFN (PCI_SLOT (pci_dev->devfn),2 ); -pci_bus_read_config_dword (pci_dev->bus, devfn,ACPIBASE , &base_addr); - - res = &tco_res[ICH_RES_IO_SMI ]; - res->start = (base_addr & ~1 ) +ACPIBASE_SMI_OFF ; - res->end = res->start +3 ; + res = &tco_res[0 ]; + res->start = tco_base & ~1 ; + res->end = res->start +32 -1 ; res->flags =IORESOURCE_IO ; -/* -* Enable the ACPI I/O space. -*/ -pci_bus_read_config_dword (pci_dev->bus, devfn,ACPICTRL , &ctrl_val); - ctrl_val |=ACPICTRL_EN ; -pci_bus_write_config_dword (pci_dev->bus, devfn,ACPICTRL , ctrl_val); -if (priv->features &FEATURE_TCO_CNL ) priv->tco_pdev =i801_add_tco_cnl (priv, pci_dev, tco_res);else
Greg Kroah-Hartman
maintainerPATCH 35/36 net: Fix Tx hash bound checking
In reply to Greg Kroah-HartmanFrom: Amritha Nambiar <[email protected]>
commit 6e11d1578fba8d09d03a286740ffcf336d53928c upstream.
Fixes the lower and upper bounds when there are multiple TCs and traffic is on the the same TC on the same device.
The lower bound is represented by 'qoffset' and the upper limit for hash value is 'qcount + qoffset'. This gives a clean Rx to Tx queue mapping when there are multiple TCs, as the queue indices for upper TCs will be offset by 'qoffset'.
v2: Fixed commit description based on comments.
--- net/core/dev.c | 2 ++ 1 file changed, 2 insertions(+)
net/core/dev.c +2 -0
@@ -2795,6 +2795,8 @@ static u16 skb_tx_hash(const struct net_if (skb_rx_queue_recorded (skb)) { hash =skb_get_rx_queue (skb); +if (hash >= qoffset) + hash -= qoffset;while (unlikely (hash >= qcount)) hash -= qcount;return hash + qoffset;
Greg Kroah-Hartman
maintainerPATCH 36/36 padata: always acquire cpu_hotplug_lock before pinst->lock
In reply to Greg Kroah-HartmanFrom: Daniel Jordan <[email protected]>
commit 38228e8848cd7dd86ccb90406af32de0cad24be3 upstream.
lockdep complains when padata's paths to update cpumasks via CPU hotplug and sysfs are both taken:
# echo 0 > /sys/devices/system/cpu/cpu1/online # echo ff > /sys/kernel/pcrypt/pencrypt/parallel_cpumask
======================================================
WARNING: possible circular locking dependency detected 5.4.0-rc8-padata-cpuhp-v3+ #1 Not tainted
------------------------------------------------------
bash/205 is trying to acquire lock:
ffffffff8286bcd0 (cpu_hotplug_lock.rw_sem){++++}, at: padata_set_cpumask+0x2b/0x120
but task is already holding lock:
ffff8880001abfa0 (&pinst->lock){+.+.}, at: padata_set_cpumask+0x26/0x120
which lock already depends on the new lock.
padata doesn't take cpu_hotplug_lock and pinst->lock in a consistent order. Which should be first? CPU hotplug calls into padata with cpu_hotplug_lock already held, so it should have priority.
--- kernel/padata.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/padata.c +2 -2
@@ -643,8 +643,8 @@ int padata_set_cpumask(struct padata_insstruct cpumask *serial_mask, *parallel_mask;int err = -EINVAL ; -mutex_lock (&pinst->lock);get_online_cpus (); +mutex_lock (&pinst->lock);switch (cpumask_type) {case PADATA_CPU_PARALLEL :
@@ -662,8 +662,8 @@ int padata_set_cpumask(struct padata_ins err =__padata_set_cpumasks (pinst, parallel_mask, serial_mask); out: -put_online_cpus ();mutex_unlock (&pinst->lock); +put_online_cpus ();return err; }
Jon Hunter
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.31 release. There are 36 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Apr 2020 10:13:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.31-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v5.4:
13 builds: 13 pass, 0 fail
24 boots: 24 pass, 0 fail
40 tests: 40 pass, 0 failLinux version: 5.4.31-rc1-g40da5db79b55
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Cheers
Jon
Signature · 1 line
nvpublic