5.4.108-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 5.4.108-rc1 review
This is the start of the stable review cycle for the 5.4.108 release. There are 60 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 Wed, 24 Mar 2021 12:19:09 +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.108-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.108-rc1
Johan Hovold <[email protected]>
x86/apic/of: Fix CPU devicetree-node lookups
Thomas Gleixner <[email protected]>
genirq: Disable interrupts for force threaded handlers
Lv Yunlong <[email protected]>
firmware/efi: Fix a use after bug in efi_mem_reserve_persistent
Ard Biesheuvel <[email protected]>
efi: use 32-bit alignment for efi_guid_t literals
Shijie Luo <[email protected]>
ext4: fix potential error in ext4_do_update_inode
zhangyi (F) <[email protected]>
ext4: do not try to set xattr into ea_inode if value is empty
zhangyi (F) <[email protected]>
ext4: find old entry again if failed to rename whiteout
Oleg Nesterov <[email protected]>
x86: Introduce TS_COMPAT_RESTART to fix get_nr_restart_syscall()
Oleg Nesterov <[email protected]>
x86: Move TS_COMPAT back to asm/thread_info.h
Oleg Nesterov <[email protected]>
kernel, fs: Introduce and use set_restart_fn() and arch_set_restart_data()
Thomas Gleixner <[email protected]>
x86/ioapic: Ignore IRQ2 again
Kan Liang <[email protected]>
perf/x86/intel: Fix a crash caused by zero PEBS status
Tyrel Datwyler <[email protected]>
PCI: rpadlpar: Fix potential drc_name corruption in store functions
Fabrice Gasnier <[email protected]>
counter: stm32-timer-cnt: fix ceiling write max value
Ye Xiang <[email protected]>
iio: hid-sensor-temperature: Fix issues of timestamp channel
Ye Xiang <[email protected]>
iio: hid-sensor-prox: Fix scale not correct issue
Ye Xiang <[email protected]>
iio: hid-sensor-humidity: Fix alignment issue of timestamp channel
Wilfried Wessner <[email protected]>
iio: adc: ad7949: fix wrong ADC result due to incorrect bit mask
Dinghao Liu <[email protected]>
iio: gyro: mpu3050: Fix error handling in mpu3050_trigger_handler
Dan Carpenter <[email protected]>
iio: adis16400: Fix an error code in adis16400_initial_setup()
Jonathan Albrieux <[email protected]>
iio:adc:qcom-spmi-vadc: add default scale to LR_MUX2_BAT_ID channel
Jonathan Cameron <[email protected]>
iio:adc:stm32-adc: Add HAS_IOMEM dependency
Badhri Jagan Sridharan <[email protected]>
usb: typec: tcpm: Invoke power_supply_changed for tcpm-source-psy-
Jim Lin <[email protected]>
usb: gadget: configfs: Fix KASAN use-after-free
Macpaul Lin <[email protected]>
USB: replace hardcode maximum usb string length by definition
Colin Ian King <[email protected]>
usbip: Fix incorrect double assignment to udc->ud.tcp_rx
Alan Stern <[email protected]>
usb-storage: Add quirk to defeat Kindle's automatic unload
Sagi Grimberg <[email protected]>
nvme-rdma: fix possible hang when failing to set io queues
William Breathitt Gray <[email protected]>
counter: stm32-timer-cnt: Report count function when SLAVE_MODE_DISABLED
Lv Yunlong <[email protected]>
scsi: myrs: Fix a double free in myrs_cleanup()
Dan Carpenter <[email protected]>
scsi: lpfc: Fix some error codes in debugfs
Kefeng Wang <[email protected]>
riscv: Correct SPARSEMEM configuration
Masahiro Yamada <[email protected]>
kbuild: Fix <linux/version.h> for empty SUBLEVEL or PATCHLEVEL again
Pavel Skripkin <[email protected]>
net/qrtr: fix __netdev_alloc_skb call
Daniel Kobras <[email protected]>
sunrpc: fix refcount leak for rpc auth modules
Jason Gunthorpe <[email protected]>
vfio: IOMMU_API should be selected
Timo Rothenpieler <[email protected]>
svcrdma: disable timeouts on rdma backchannel
Joe Korty <[email protected]>
NFSD: Repair misuse of sv_lock in 5.10.16-rt30.
Trond Myklebust <[email protected]>
nfsd: Don't keep looking up unhashed files in the nfsd file cache
Sagi Grimberg <[email protected]>
nvmet: don't check iosqes,iocqes for discovery controllers
Sagi Grimberg <[email protected]>
nvme-tcp: fix a NULL deref when receiving a 0-length r2t PDU
Sagi Grimberg <[email protected]>
nvme-tcp: fix possible hang when failing to set io queues
Christoph Hellwig <[email protected]>
nvme: fix Write Zeroes limitations
David Howells <[email protected]>
afs: Stop listxattr() from listing "afs.*" attributes
Sameer Pujar <[email protected]>
ASoC: simple-card-utils: Do not handle device clock
Pan Xiuli <[email protected]>
ASoC: SOF: intel: fix wrong poll bits in dsp power down
Pierre-Louis Bossart <[email protected]>
ASoC: SOF: Intel: unregister DMIC device on probe error
Alexander Shiyan <[email protected]>
ASoC: fsl_ssi: Fix TDM slot setup for I2S mode
David Sterba <[email protected]>
btrfs: fix slab cache flags for free space tree bitmap
Filipe Manana <[email protected]>
btrfs: fix race when cloning extent buffer during rewind of an old root
Ard Biesheuvel <[email protected]>
ARM: 9044/1: vfp: use undef hook for VFP support detection
Ard Biesheuvel <[email protected]>
ARM: 9030/1: entry: omit FP emulation for UND exceptions taken in kernel mode
Gerald Schaefer <[email protected]>
s390/vtime: fix increased steal time accounting
Rafael J. Wysocki <[email protected]>
Revert "PM: runtime: Update device status before letting suppliers suspend"
Xiaoliang Yu <[email protected]>
ALSA: hda/realtek: Apply headset-mic quirks for Xiaomi Redmibook Air
Hui Wang <[email protected]>
ALSA: hda: generic: Fix the micmute led init state
Xiaoliang Yu <[email protected]>
ALSA: hda/realtek: apply pin quirk for XiaomiNotebook Pro
Takashi Sakamoto <[email protected]>
ALSA: dice: fix null pointer dereference when node is disconnected
Shengjiu Wang <[email protected]>
ASoC: ak5558: Add MODULE_DEVICE_TABLE
Shengjiu Wang <[email protected]>
ASoC: ak4458: Add MODULE_DEVICE_TABLE
-------------
Diffstat:
Makefile | 10 ++-- arch/arm/kernel/entry-armv.S | 25 +------- arch/arm/vfp/entry.S | 17 ------ arch/arm/vfp/vfphw.S | 5 -- arch/arm/vfp/vfpmodule.c | 72 ++++++++++++++++++++++-- arch/riscv/Kconfig | 4 +- arch/s390/kernel/vtime.c | 2 +- arch/x86/events/intel/ds.c | 2 +- arch/x86/include/asm/processor.h | 9 --- arch/x86/include/asm/thread_info.h | 23 +++++++- arch/x86/kernel/apic/apic.c | 5 ++ arch/x86/kernel/apic/io_apic.c | 10 ++++ arch/x86/kernel/signal.c | 24 +------- drivers/base/power/runtime.c | 62 ++++++++------------ drivers/counter/stm32-timer-cnt.c | 44 ++++++++++----- drivers/firmware/efi/efi.c | 3 +- drivers/iio/adc/Kconfig | 1 + drivers/iio/adc/ad7949.c | 2 +- drivers/iio/adc/qcom-spmi-vadc.c | 2 +- drivers/iio/gyro/mpu3050-core.c | 2 + drivers/iio/humidity/hid-sensor-humidity.c | 12 ++-- drivers/iio/imu/adis16400.c | 3 +- drivers/iio/light/hid-sensor-prox.c | 13 ++++- drivers/iio/temperature/hid-sensor-temperature.c | 14 +++-- drivers/nvme/host/core.c | 36 ++++-------- drivers/nvme/host/rdma.c | 7 ++- drivers/nvme/host/tcp.c | 14 ++++- drivers/nvme/target/core.c | 17 +++++- drivers/pci/hotplug/rpadlpar_sysfs.c | 14 ++--- drivers/scsi/lpfc/lpfc_debugfs.c | 4 +- drivers/scsi/myrs.c | 2 +- drivers/usb/gadget/composite.c | 4 +- drivers/usb/gadget/configfs.c | 16 ++++-- drivers/usb/gadget/usbstring.c | 4 +- drivers/usb/storage/transport.c | 7 +++ drivers/usb/storage/unusual_devs.h | 12 ++++ drivers/usb/typec/tcpm/tcpm.c | 8 ++- drivers/usb/usbip/vudc_sysfs.c | 2 +- drivers/vfio/Kconfig | 2 +- fs/afs/dir.c | 1 - fs/afs/file.c | 1 - fs/afs/inode.c | 1 - fs/afs/internal.h | 1 - fs/afs/mntpt.c | 1 - fs/afs/xattr.c | 23 -------- fs/btrfs/ctree.c | 2 + fs/btrfs/inode.c | 2 +- fs/ext4/inode.c | 8 +-- fs/ext4/namei.c | 29 +++++++++- fs/ext4/xattr.c | 2 +- fs/nfsd/filecache.c | 2 + fs/select.c | 10 ++-- include/linux/efi.h | 6 +- include/linux/thread_info.h | 13 +++++ include/linux/usb_usual.h | 2 + include/uapi/linux/usb/ch9.h | 3 + kernel/futex.c | 3 +- kernel/irq/manage.c | 4 ++ kernel/time/alarmtimer.c | 2 +- kernel/time/hrtimer.c | 2 +- kernel/time/posix-cpu-timers.c | 2 +- net/qrtr/qrtr.c | 2 +- net/sunrpc/svc.c | 6 +- net/sunrpc/svc_xprt.c | 4 +- net/sunrpc/xprtrdma/svc_rdma_backchannel.c | 6 +- sound/firewire/dice/dice-stream.c | 5 +- sound/pci/hda/hda_generic.c | 2 +- sound/pci/hda/patch_realtek.c | 2 + sound/soc/codecs/ak4458.c | 1 + sound/soc/codecs/ak5558.c | 1 + sound/soc/fsl/fsl_ssi.c | 6 +- sound/soc/generic/simple-card-utils.c | 13 +++-- sound/soc/sof/intel/hda-dsp.c | 2 +- sound/soc/sof/intel/hda.c | 1 + 74 files changed, 401 insertions(+), 285 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/60 ASoC: ak4458: Add MODULE_DEVICE_TABLE
From: Shengjiu Wang <[email protected]>
commit 4ec5b96775a88dd9b1c3ba1d23c43c478cab95a2 upstream.
Add missed MODULE_DEVICE_TABLE for the driver can be loaded automatically at boot.
--- sound/soc/codecs/ak4458.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/codecs/ak4458.c +1 -0
@@ -707,6 +707,7 @@ static const struct of_device_id ak4458_ { .compatible = "asahi-kasei,ak4497", .data = &ak4497_drvdata}, { }, }; +MODULE_DEVICE_TABLE (of, ak4458_of_match);static struct i2c_driver ak4458_i2c_driver = { .driver = {
Greg Kroah-Hartman
maintainerPATCH 2/60 ASoC: ak5558: Add MODULE_DEVICE_TABLE
In reply to Greg Kroah-HartmanFrom: Shengjiu Wang <[email protected]>
commit 80cffd2468ddb850e678f17841fc356930b2304a upstream.
Add missed MODULE_DEVICE_TABLE for the driver can be loaded automatically at boot.
--- sound/soc/codecs/ak5558.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/codecs/ak5558.c +1 -0
@@ -389,6 +389,7 @@ static const struct of_device_id ak5558_ { .compatible = "asahi-kasei,ak5558"}, { } }; +MODULE_DEVICE_TABLE (of, ak5558_i2c_dt_ids);static struct i2c_driver ak5558_i2c_driver = { .driver = {
Greg Kroah-Hartman
maintainerPATCH 3/60 ALSA: dice: fix null pointer dereference when node is disconnected
In reply to Greg Kroah-HartmanFrom: Takashi Sakamoto <[email protected]>
commit dd7b836d6bc935df95c826f69ff4d051f5561604 upstream.
When node is removed from IEEE 1394 bus, any transaction fails to the node. In the case, ALSA dice driver doesn't stop isochronous contexts even if they are running. As a result, null pointer dereference occurs in callback from the running context.
This commit fixes the bug to release isochronous contexts always.
--- sound/firewire/dice/dice-stream.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
sound/firewire/dice/dice-stream.c +2 -3
@@ -489,11 +489,10 @@ void snd_dice_stream_stop_duplex(structstruct reg_params tx_params, rx_params;if (dice->substreams_counter ==0 ) { -if (get_register_params (dice, &tx_params, &rx_params) >=0 ) { -amdtp_domain_stop (&dice->domain); +if (get_register_params (dice, &tx_params, &rx_params) >=0 )finish_session (dice, &tx_params, &rx_params); - } +amdtp_domain_stop (&dice->domain);release_resources (dice); } }
Greg Kroah-Hartman
maintainerPATCH 4/60 ALSA: hda/realtek: apply pin quirk for XiaomiNotebook Pro
In reply to Greg Kroah-HartmanFrom: Xiaoliang Yu <[email protected]>
commit b95bc12e0412d14d5fc764f0b82631c7bcaf1959 upstream.
Built-in microphone and combojack on Xiaomi Notebook Pro (1d72:1701) needs to be fixed, the existing quirk for Dell works well on that machine.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -8102,6 +8102,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1b35 ,0x1237 ,"CZC L101" ,ALC269_FIXUP_CZC_L101 ),SND_PCI_QUIRK (0x1b7d ,0xa831 ,"Ordissimo EVE2 " ,ALC269VB_FIXUP_ORDISSIMO_EVE2 ),/* Also known as Malata PC-B1303 */ SND_PCI_QUIRK (0x1d72 ,0x1602 ,"RedmiBook" ,ALC255_FIXUP_XIAOMI_HEADSET_MIC ), +SND_PCI_QUIRK (0x1d72 ,0x1701 ,"XiaomiNotebook Pro" ,ALC298_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1d72 ,0x1901 ,"RedmiBook 14" ,ALC256_FIXUP_ASUS_HEADSET_MIC ),SND_PCI_QUIRK (0x10ec ,0x118c ,"Medion EE4254 MD62100" ,ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE ), SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
Greg Kroah-Hartman
maintainerPATCH 5/60 ALSA: hda: generic: Fix the micmute led init state
In reply to Greg Kroah-HartmanFrom: Hui Wang <[email protected]>
commit 2bf44e0ee95f39cc54ea1b942f0a027e0181ca4e upstream.
Recently we found the micmute led init state is not correct after freshly installing the ubuntu linux on a Lenovo AIO machine. The internal mic is not muted, but the micmute led is on and led mode is 'follow mute'. If we mute internal mic, the led is keeping on, then unmute the internal mic, the led is off. And from then on, the micmute led will work correctly.
So the micmute led init state is not correct. The led is controlled by codec gpio (ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), in the patch_realtek, the gpio data is set to 0x4 initially and the led is on with this data. In the hda_generic, the led_value is set to 0 initially, suppose users set the 'capture switch' to on from user space and the micmute led should change to be off with this operation, but the check "if (val == spec->micmute_led.led_value)" in the call_micmute_led_update() will skip the led setting.
To guarantee the led state will be set by the 1st time of changing "Capture Switch", set -1 to the init led_value.
--- sound/pci/hda/hda_generic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/hda_generic.c +1 -1
@@ -4017,7 +4017,7 @@ int snd_hda_gen_add_micmute_led(struct h spec->micmute_led.led_mode =MICMUTE_LED_FOLLOW_MUTE ; spec->micmute_led.capture =0 ; - spec->micmute_led.led_value =0 ; + spec->micmute_led.led_value =-1 ; spec->micmute_led.old_hook = spec->cap_sync_hook; spec->micmute_led.update = hook; spec->cap_sync_hook = update_micmute_led;
Greg Kroah-Hartman
maintainerPATCH 6/60 ALSA: hda/realtek: Apply headset-mic quirks for Xiaomi Redmibook Air
In reply to Greg Kroah-HartmanFrom: Xiaoliang Yu <[email protected]>
commit e1c86210fe27428399643861b81b080eccd79f87 upstream.
There is another fix for headset-mic problem on Redmibook (1d72:1602), it also works on Redmibook Air (1d72:1947), which has the same issue.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -8104,6 +8104,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1d72 ,0x1602 ,"RedmiBook" ,ALC255_FIXUP_XIAOMI_HEADSET_MIC ),SND_PCI_QUIRK (0x1d72 ,0x1701 ,"XiaomiNotebook Pro" ,ALC298_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1d72 ,0x1901 ,"RedmiBook 14" ,ALC256_FIXUP_ASUS_HEADSET_MIC ), +SND_PCI_QUIRK (0x1d72 ,0x1947 ,"RedmiBook Air" ,ALC255_FIXUP_XIAOMI_HEADSET_MIC ),SND_PCI_QUIRK (0x10ec ,0x118c ,"Medion EE4254 MD62100" ,ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE ),SND_PCI_QUIRK (0x1c06 ,0x2013 ,"Lemote A1802" ,ALC269_FIXUP_LEMOTE_A1802 ), SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
Greg Kroah-Hartman
maintainerPATCH 7/60 Revert "PM: runtime: Update device status before letting suppliers suspend"
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
commit 0cab893f409c53634d0d818fa414641cbcdb0dab upstream.
Revert commit 44cc89f76464 ("PM: runtime: Update device status before letting suppliers suspend") that introduced a race condition into __rpm_callback() which allowed a concurrent rpm_resume() to run and resume the device prematurely after its status had been changed to RPM_SUSPENDED by __rpm_callback().
--- drivers/base/power/runtime.c | 62 +++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 37 deletions(-)
drivers/base/power/runtime.c +25 -37
@@ -325,22 +325,22 @@ static void rpm_put_suppliers(struct devstatic int __rpm_callback (int (*cb)(struct device *),struct device *dev) __releases(&dev->power.lock) __acquires(&dev->power.lock) { -bool use_links = dev->power.links_count >0 ; -bool get = false;int retval, idx; -bool put; +bool use_links = dev->power.links_count >0 ;if (dev->power.irq_safe) {spin_unlock (&dev->power.lock); - }else if (!use_links) { -spin_unlock_irq (&dev->power.lock); }else { - get = dev->power.runtime_status ==RPM_RESUMING ; -spin_unlock_irq (&dev->power.lock); -/* Resume suppliers if necessary. */ -if (get) { +/* +* Resume suppliers if necessary. +* +* The device's runtime PM status cannot change until this +* routine returns, so it is safe to read the status outside of +* the lock. +*/ +if (use_links && dev->power.runtime_status ==RPM_RESUMING ) { idx =device_links_read_lock (); retval =rpm_get_suppliers (dev);
@@ -355,36 +355,24 @@ static int __rpm_callback(int (*cb)(struif (dev->power.irq_safe) {spin_lock (&dev->power.lock); -return retval; - } - -spin_lock_irq (&dev->power.lock); - -if (!use_links) -return retval; - -/* -* If the device is suspending and the callback has returned success, -* drop the usage counters of the suppliers that have been reference -* counted on its resume. -* -* Do that if the resume fails too. -*/ - put = dev->power.runtime_status ==RPM_SUSPENDING && !retval; -if (put) -__update_runtime_status (dev,RPM_SUSPENDED ); -else - put = get && retval; - -if (put) { -spin_unlock_irq (&dev->power.lock); - - idx =device_links_read_lock (); + }else { +/* +* If the device is suspending and the callback has returned +* success, drop the usage counters of the suppliers that have +* been reference counted on its resume. +* +* Do that if resume fails too. +*/ +if (use_links + && ((dev->power.runtime_status ==RPM_SUSPENDING && !retval) + || (dev->power.runtime_status ==RPM_RESUMING && retval))) { + idx =device_links_read_lock (); -fail: -rpm_put_suppliers (dev); + fail: +rpm_put_suppliers (dev); -device_links_read_unlock (idx); +device_links_read_unlock (idx); + }spin_lock_irq (&dev->power.lock); }
Greg Kroah-Hartman
maintainerPATCH 8/60 s390/vtime: fix increased steal time accounting
In reply to Greg Kroah-HartmanFrom: Gerald Schaefer <[email protected]>
commit d54cb7d54877d529bc1e0e1f47a3dd082f73add3 upstream.
Commit 152e9b8676c6e ("s390/vtime: steal time exponential moving average") inadvertently changed the input value for account_steal_time() from "cputime_to_nsecs(steal)" to just "steal", resulting in broken increased steal time accounting.
Fix this by changing it back to "cputime_to_nsecs(steal)".
--- arch/s390/kernel/vtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/kernel/vtime.c +1 -1
@@ -217,7 +217,7 @@ void vtime_flush(struct task_struct *tsk avg_steal = S390_lowcore.avg_steal_timer /2 ;if ((s64 ) steal >0 ) { S390_lowcore.steal_timer =0 ; -account_steal_time (steal); +account_steal_time (cputime_to_nsecs (steal)); avg_steal += steal; } S390_lowcore.avg_steal_timer = avg_steal;
Greg Kroah-Hartman
maintainerPATCH 9/60 ARM: 9030/1: entry: omit FP emulation for UND exceptions taken in kernel mode
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
commit f77ac2e378be9dd61eb88728f0840642f045d9d1 upstream.
There are a couple of problems with the exception entry code that deals with FP exceptions (which are reported as UND exceptions) when building the kernel in Thumb2 mode:
- the conditional branch to vfp_kmode_exception in vfp_support_entry() may be out of range for its target, depending on how the linker decides to arrange the sections;
- when the UND exception is taken in kernel mode, the emulation handling logic is entered via the 'call_fpe' label, which means we end up using the wrong value/mask pairs to match and detect the NEON opcodes.
Since UND exceptions in kernel mode are unlikely to occur on a hot path (as opposed to the user mode version which is invoked for VFP support code and lazy restore), we can use the existing undef hook machinery for any kernel mode instruction emulation that is needed, including calling the existing vfp_kmode_exception() routine for unexpected cases. So drop the call to call_fpe, and instead, install an undef hook that will get called for NEON and VFP instructions that trigger an UND exception in kernel mode.
While at it, make sure that the PC correction is accurate for the execution mode where the exception was taken, by checking the PSR Thumb bit.
[nd: fix conflict in arch/arm/vfp/vfphw.S due to missing
commit 2cbd1cc3dcd3 ("ARM: 8991/1: use VFP assembler mnemonics if available")]
--- arch/arm/kernel/entry-armv.S | 25 +-------------------- arch/arm/vfp/vfphw.S | 5 ---- arch/arm/vfp/vfpmodule.c | 49 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 30 deletions(-)
arch/arm/kernel/entry-armv.S +2 -23
@@ -252,31 +252,10 @@ __und_svc: #else svc_entry #endif - @ - @ call emulation code, which returns using r9 if it has emulated - @ the instruction, or the more conventional lr if we are to treat - @ this as a real undefined instruction - @ - @ r0 - instruction - @ -#ifndef CONFIG_THUMB2_KERNEL - ldr r0, [r4, #-4] -#else - mov r1, #2 - ldrh r0, [r4, #-2] @ Thumb instruction at LR - 2 - cmp r0, #0xe800 @ 32-bit instruction if xx >= 0 - blo __und_svc_fault - ldrh r9, [r4] @ bottom 16 bits - add r4, r4, #2 - str r4, [sp, #S_PC] - orr r0, r9, r0, lsl #16 -#endif - badr r9, __und_svc_finish - mov r2, r4 - bl call_fpe mov r1, #4 @ PC correction to apply -__und_svc_fault: + THUMB( tst r5, #PSR_T_BIT ) @ exception taken in Thumb mode? + THUMB( movne r1, #2 ) @ if so, fix up PC correction mov r0, sp @ struct pt_regs *regs bl __und_fault
arch/arm/vfp/vfphw.S +0 -5
@@ -78,11 +78,6 @@ ENTRY(vfp_support_entry) DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10 - ldr r3, [sp, #S_PSR] @ Neither lazy restore nor FP exceptions - and r3, r3, #MODE_MASK @ are supported in kernel mode - teq r3, #USR_MODE - bne vfp_kmode_exception @ Returns through lr - VFPFMRX r1, FPEXC @ Is the VFP enabled? DBGSTR1 "fpexc %08x", r1 tst r1, #FPEXC_EN
arch/arm/vfp/vfpmodule.c +47 -2
69 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 10/60 ARM: 9044/1: vfp: use undef hook for VFP support detection
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
commit 3cce9d44321e460e7c88cdec4e4537a6e9ad7c0d upstream.
Commit f77ac2e378be9dd6 ("ARM: 9030/1: entry: omit FP emulation for UND exceptions taken in kernel mode") failed to take into account that there is in fact a case where we relied on this code path: during boot, the VFP detection code issues a read of FPSID, which will trigger an undef exception on cores that lack VFP support.
So let's reinstate this logic using an undef hook which is registered only for the duration of the initcall to vpf_init(), and which sets VFP_arch to a non-zero value - as before - if no VFP support is present.
--- arch/arm/vfp/entry.S | 17 ----------------- arch/arm/vfp/vfpmodule.c | 25 ++++++++++++++++++++----- 2 files changed, 20 insertions(+), 22 deletions(-)
arch/arm/vfp/entry.S +0 -17
@@ -37,20 +37,3 @@ ENDPROC(vfp_null_entry) .align 2 .LCvfp: .word vfp_vector - -@ This code is called if the VFP does not exist. It needs to flag the -@ failure to the VFP initialisation code. - - __INIT -ENTRY(vfp_testing_entry) - dec_preempt_count_ti r10, r4 - ldr r0, VFP_arch_address - str r0, [r0] @ set to non-zero value - ret r9 @ we have handled the fault -ENDPROC(vfp_testing_entry) - - .align 2 -VFP_arch_address: - .word VFP_arch - - __FINIT
arch/arm/vfp/vfpmodule.c +20 -5
@@ -32,7 +32,6 @@/* * Our undef handlers (in entry.S) */ -asmlinkage void vfp_testing_entry(void); asmlinkage void vfp_support_entry(void); asmlinkage void vfp_null_entry(void);
@@ -43,7 +42,7 @@ asmlinkage void (*vfp_vector)(void) = vf* Used in startup: set to non-zero if VFP checks fail * After startup, holds VFP architecture */ -unsigned int VFP_arch; +static unsigned int __initdata VFP_arch;/* * The pointer to the vfpstate structure of the thread which currently
@@ -437,7 +436,7 @@ static void vfp_enable(void *unused)* present on all CPUs within a SMP complex. Needs to be called prior to * vfp_init(). */ -void vfp_disable (void ) +void __init vfp_disable (void ) {if (VFP_arch) {pr_debug ("%s: should be called prior to vfp_init\n" , __func__);
@@ -707,7 +706,7 @@ static int __init vfp_kmode_exception_horegister_undef_hook (&vfp_kmode_exception_hook[i]);return 0 ; } -core_initcall (vfp_kmode_exception_hook_init); +subsys_initcall (vfp_kmode_exception_hook_init);/* * Kernel-side NEON support functions
@@ -753,6 +752,21 @@ EXPORT_SYMBOL(kernel_neon_end);#endif /* CONFIG_KERNEL_MODE_NEON */ +static int __init vfp_detect (struct pt_regs *regs,unsigned int instr) +{ + VFP_arch =UINT_MAX ;/* mark as not present */ + regs->ARM_pc +=4 ; +return 0 ; +} + +static struct undef_hook vfp_detect_hook__initdata = { + .instr_mask =0x0c000e00 , + .instr_val =0x0c000a00 , + .cpsr_mask =MODE_MASK , + .cpsr_val =SVC_MODE , + .fn = vfp_detect, +}; +/* * VFP support code initialisation. */
@@ -773,10 +787,11 @@ static int __init vfp_init(void)* The handler is already setup to just log calls, so * we just need to read the VFPSID register. */ - vfp_vector = vfp_testing_entry; +register_undef_hook (&vfp_detect_hook);barrier (); vfpsid =fmrx (FPSID );barrier (); +unregister_undef_hook (&vfp_detect_hook); vfp_vector = vfp_null_entry;pr_info ("VFP support v0.3: " );
Greg Kroah-Hartman
maintainerPATCH 11/60 btrfs: fix race when cloning extent buffer during rewind of an old root
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit dbcc7d57bffc0c8cac9dac11bec548597d59a6a5 upstream.
While resolving backreferences, as part of a logical ino ioctl call or fiemap, we can end up hitting a BUG_ON() when replaying tree mod log operations of a root, triggering a stack trace like the following:
------------[ cut here ]------------ kernel BUG at fs/btrfs/ctree.c:1210! invalid opcode: 0000 [#1] SMP KASAN PTI CPU: 1 PID: 19054 Comm: crawl_335 Tainted: G W 5.11.0-2d11c0084b02-misc-next+ #89 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 RIP: 0010:__tree_mod_log_rewind+0x3b1/0x3c0 Code: 05 48 8d 74 10 (...) RSP: 0018:ffffc90001eb70b8 EFLAGS: 00010297 RAX: 0000000000000000 RBX: ffff88812344e400 RCX: ffffffffb28933b6 RDX: 0000000000000007 RSI: dffffc0000000000 RDI: ffff88812344e42c RBP: ffffc90001eb7108 R08: 1ffff11020b60a20 R09: ffffed1020b60a20 R10: ffff888105b050f9 R11: ffffed1020b60a1f R12: 00000000000000ee R13: ffff8880195520c0 R14: ffff8881bc958500 R15: ffff88812344e42c FS: 00007fd1955e8700(0000) GS:ffff8881f5600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007efdb7928718 CR3: 000000010103a006 CR4: 0000000000170ee0 Call Trace: btrfs_search_old_slot+0x265/0x10d0 ? lock_acquired+0xbb/0x600 ? btrfs_search_slot+0x1090/0x1090 ? free_extent_buffer.part.61+0xd7/0x140 ? free_extent_buffer+0x13/0x20 resolve_indirect_refs+0x3e9/0xfc0 ? lock_downgrade+0x3d0/0x3d0 ? __kasan_check_read+0x11/0x20 ? add_prelim_ref.part.11+0x150/0x150 ? lock_downgrade+0x3d0/0x3d0 ? __kasan_check_read+0x11/0x20 ? lock_acquired+0xbb/0x600 ? __kasan_check_write+0x14/0x20 ? do_raw_spin_unlock+0xa8/0x140 ? rb_insert_color+0x30/0x360 ? prelim_ref_insert+0x12d/0x430 find_parent_nodes+0x5c3/0x1830 ? resolve_indirect_refs+0xfc0/0xfc0 ? lock_release+0xc8/0x620 ? fs_reclaim_acquire+0x67/0xf0 ? lock_acquire+0xc7/0x510 ? lock_downgrade+0x3d0/0x3d0 ? lockdep_hardirqs_on_prepare+0x160/0x210 ? lock_release+0xc8/0x620 ? fs_reclaim_acquire+0x67/0xf0 ? lock_acquire+0xc7/0x510 ? poison_range+0x38/0x40 ? unpoison_range+0x14/0x40 ? trace_hardirqs_on+0x55/0x120 btrfs_find_all_roots_safe+0x142/0x1e0 ? find_parent_nodes+0x1830/0x1830 ? btrfs_inode_flags_to_xflags+0x50/0x50 iterate_extent_inodes+0x20e/0x580 ? tree_backref_for_extent+0x230/0x230 ? lock_downgrade+0x3d0/0x3d0 ? read_extent_buffer+0xdd/0x110 ? lock_downgrade+0x3d0/0x3d0 ? __kasan_check_read+0x11/0x20 ? lock_acquired+0xbb/0x600 ? __kasan_check_write+0x14/0x20 ? _raw_spin_unlock+0x22/0x30 ? __kasan_check_write+0x14/0x20 iterate_inodes_from_logical+0x129/0x170 ? iterate_inodes_from_logical+0x129/0x170 ? btrfs_inode_flags_to_xflags+0x50/0x50 ? iterate_extent_inodes+0x580/0x580 ? __vmalloc_node+0x92/0xb0 ? init_data_container+0x34/0xb0 ? init_data_container+0x34/0xb0 ? kvmalloc_node+0x60/0x80 btrfs_ioctl_logical_to_ino+0x158/0x230 btrfs_ioctl+0x205e/0x4040 ? __might_sleep+0x71/0xe0 ? btrfs_ioctl_get_supported_features+0x30/0x30 ? getrusage+0x4b6/0x9c0 ? __kasan_check_read+0x11/0x20 ? lock_release+0xc8/0x620 ? __might_fault+0x64/0xd0 ? lock_acquire+0xc7/0x510 ? lock_downgrade+0x3d0/0x3d0 ? lockdep_hardirqs_on_prepare+0x210/0x210 ? lockdep_hardirqs_on_prepare+0x210/0x210 ? __kasan_check_read+0x11/0x20 ? do_vfs_ioctl+0xfc/0x9d0 ? ioctl_file_clone+0xe0/0xe0 ? lock_downgrade+0x3d0/0x3d0 ? lockdep_hardirqs_on_prepare+0x210/0x210 ? __kasan_check_read+0x11/0x20 ? lock_release+0xc8/0x620 ? __task_pid_nr_ns+0xd3/0x250 ? lock_acquire+0xc7/0x510 ? __fget_files+0x160/0x230 ? __fget_light+0xf2/0x110 __x64_sys_ioctl+0xc3/0x100 do_syscall_64+0x37/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7fd1976e2427 Code: 00 00 90 48 8b 05 (...) RSP: 002b:00007fd1955e5cf8 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 RAX: ffffffffffffffda RBX: 00007fd1955e5f40 RCX: 00007fd1976e2427 RDX: 00007fd1955e5f48 RSI: 00000000c038943b RDI: 0000000000000004 RBP: 0000000001000000 R08: 0000000000000000 R09: 00007fd1955e6120 R10: 0000557835366b00 R11: 0000000000000246 R12: 0000000000000004 R13: 00007fd1955e5f48 R14: 00007fd1955e5f40 R15: 00007fd1955e5ef8 Modules linked in: ---[ end trace ec8931a1c36e57be ]---
(gdb) l *(__tree_mod_log_rewind+0x3b1)
0xffffffff81893521 is in __tree_mod_log_rewind (fs/btrfs/ctree.c:1210).
1205 * the modification. as we're going backwards, we do the 1206 * opposite of each operation here. 1207 */
1208 switch (tm->op) {
1209 case MOD_LOG_KEY_REMOVE_WHILE_FREEING:
1210 BUG_ON(tm->slot < n);
1211 fallthrough;
1212 case MOD_LOG_KEY_REMOVE_WHILE_MOVING:
1213 case MOD_LOG_KEY_REMOVE:
1214 btrfs_set_node_key(eb, &tm->key, tm->slot);
Here's what happens to hit that BUG_ON():
1) We have one tree mod log user (through fiemap or the logical ino ioctl), with a sequence number of 1, so we have fs_info->tree_mod_seq == 1;
2) Another task is at ctree.c:balance_level() and we have eb X currently as the root of the tree, and we promote its single child, eb Y, as the new root.
Then, at ctree.c:balance_level(), we call:
tree_mod_log_insert_root(eb X, eb Y, 1);
3) At tree_mod_log_insert_root() we create tree mod log elements for each slot of eb X, of operation type MOD_LOG_KEY_REMOVE_WHILE_FREEING each with a ->logical pointing to ebX->start. These are placed in an array named tm_list.
Lets assume there are N elements (N pointers in eb X);
4) Then, still at tree_mod_log_insert_root(), we create a tree mod log element of operation type MOD_LOG_ROOT_REPLACE, ->logical set to ebY->start, ->old_root.logical set to ebX->start, ->old_root.level set to the level of eb X and ->generation set to the generation of eb X;
5) Then tree_mod_log_insert_root() calls tree_mod_log_free_eb() with tm_list as argument. After that, tree_mod_log_free_eb() calls __tree_mod_log_insert() for each member of tm_list in reverse order, from highest slot in eb X, slot N - 1, to slot 0 of eb X;
6) __tree_mod_log_insert() sets the sequence number of each given tree mod log operation - it increments fs_info->tree_mod_seq and sets fs_info->tree_mod_seq as the sequence number of the given tree mod log operation.
This means that for the tm_list created at tree_mod_log_insert_root(), the element corresponding to slot 0 of eb X has the highest sequence number (1 + N), and the element corresponding to the last slot has the lowest sequence number (2);
7) Then, after inserting tm_list's elements into the tree mod log rbtree, the MOD_LOG_ROOT_REPLACE element is inserted, which gets the highest sequence number, which is N + 2;
8) Back to ctree.c:balance_level(), we free eb X by calling btrfs_free_tree_block() on it. Because eb X was created in the current transaction, has no other references and writeback did not happen for it, we add it back to the free space cache/tree;
9) Later some other task T allocates the metadata extent from eb X, since it is marked as free space in the space cache/tree, and uses it as a node for some other btree;
10) The tree mod log user task calls btrfs_search_old_slot(), which calls get_old_root(), and finally that calls __tree_mod_log_oldest_root() with time_seq == 1 and eb_root == eb Y;
11) First iteration of the while loop finds the tree mod log element with sequence number N + 2, for the logical address of eb Y and of type MOD_LOG_ROOT_REPLACE;
12) Because the operation type is MOD_LOG_ROOT_REPLACE, we don't break out
of the loop, and set root_logical to point to tm->old_root.logical
which corresponds to the logical address of eb X;13) On the next iteration of the while loop, the call to tree_mod_log_search_oldest() returns the smallest tree mod log element for the logical address of eb X, which has a sequence number of 2, an operation type of MOD_LOG_KEY_REMOVE_WHILE_FREEING and corresponds to the old slot N - 1 of eb X (eb X had N items in it before being freed);
14) We then break out of the while loop and return the tree mod log operation of type MOD_LOG_ROOT_REPLACE (eb Y), and not the one for slot N - 1 of eb X, to get_old_root();
15) At get_old_root(), we process the MOD_LOG_ROOT_REPLACE operation and set "logical" to the logical address of eb X, which was the old root. We then call tree_mod_log_search() passing it the logical address of eb X and time_seq == 1;
16) Then before calling tree_mod_log_search(), task T adds a key to eb X, which results in adding a tree mod log operation of type MOD_LOG_KEY_ADD to the tree mod log - this is done at ctree.c:insert_ptr() - but after adding the tree mod log operation and before updating the number of items in eb X from 0 to 1...
17) The task at get_old_root() calls tree_mod_log_search() and gets the tree mod log operation of type MOD_LOG_KEY_ADD just added by task T. Then it enters the following if branch:
if (old_root && tm && tm->op != MOD_LOG_KEY_REMOVE_WHILE_FREEING) {
(...)
} (...)
Calls read_tree_block() for eb X, which gets a reference on eb X but does not lock it - task T has it locked.
Then it clones eb X while it has nritems set to 0 in its header, before task T sets nritems to 1 in eb X's header. From hereupon we use the clone of eb X which no other task has access to;
18) Then we call __tree_mod_log_rewind(), passing it the MOD_LOG_KEY_ADD mod log operation we just got from tree_mod_log_search() in the previous step and the cloned version of eb X;
19) At __tree_mod_log_rewind(), we set the local variable "n" to the number of items set in eb X's clone, which is 0. Then we enter the while loop, and in its first iteration we process the MOD_LOG_KEY_ADD operation, which just decrements "n" from 0 to (u32)-1, since "n" is declared with a type of u32. At the end of this iteration we call rb_next() to find the next tree mod log operation for eb X, that gives us the mod log operation of type MOD_LOG_KEY_REMOVE_WHILE_FREEING, for slot 0, with a sequence number of N + 1 (steps 3 to 6);
20) Then we go back to the top of the while loop and trigger the following
BUG_ON():
(...)
switch (tm->op) {
case MOD_LOG_KEY_REMOVE_WHILE_FREEING:
BUG_ON(tm->slot < n);
fallthrough;
(...)
Because "n" has a value of (u32)-1 (4294967295) and tm->slot is 0.Fix this by taking a read lock on the extent buffer before cloning it at ctree.c:get_old_root(). This should be done regardless of the extent buffer having been freed and reused, as a concurrent task might be modifying it (while holding a write lock on it).
--- fs/btrfs/ctree.c | 2 ++ 1 file changed, 2 insertions(+)
fs/btrfs/ctree.c +2 -0
@@ -1406,7 +1406,9 @@ get_old_root(struct btrfs_root *root, u6"failed to read tree block %llu from get_old_root" , logical); }else { +btrfs_tree_read_lock (old); eb =btrfs_clone_extent_buffer (old); +btrfs_tree_read_unlock (old);free_extent_buffer (old); } }else if (old_root) {
Greg Kroah-Hartman
maintainerPATCH 12/60 btrfs: fix slab cache flags for free space tree bitmap
In reply to Greg Kroah-HartmanFrom: David Sterba <[email protected]>
commit 34e49994d0dcdb2d31d4d2908d04f4e9ce57e4d7 upstream.
The free space tree bitmap slab cache is created with SLAB_RED_ZONE but that's a debugging flag and not always enabled. Also the other slabs are created with at least SLAB_MEM_SPREAD that we want as well to average the memory placement cost.
--- fs/btrfs/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/inode.c +1 -1
@@ -9628,7 +9628,7 @@ int __init btrfs_init_cachep(void) btrfs_free_space_bitmap_cachep =kmem_cache_create ("btrfs_free_space_bitmap" ,PAGE_SIZE ,PAGE_SIZE , -SLAB_RED_ZONE ,NULL ); +SLAB_MEM_SPREAD ,NULL );if (!btrfs_free_space_bitmap_cachep) goto fail;
Greg Kroah-Hartman
maintainerPATCH 13/60 ASoC: fsl_ssi: Fix TDM slot setup for I2S mode
In reply to Greg Kroah-HartmanFrom: Alexander Shiyan <[email protected]>
commit 87263968516fb9507d6215d53f44052627fae8d8 upstream.
When using the driver in I2S TDM mode, the _fsl_ssi_set_dai_fmt() function rewrites the number of slots previously set by the fsl_ssi_set_dai_tdm_slot() function to 2 by default.
To fix this, let's use the saved slot count value or, if TDM is not used and the slot count is not set, proceed as before.
--- sound/soc/fsl/fsl_ssi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_ssi.c +4 -2
@@ -873,6 +873,7 @@ static int fsl_ssi_hw_free(struct snd_pcstatic int _fsl_ssi_set_dai_fmt (struct fsl_ssi *ssi,unsigned int fmt) {u32 strcr =0 , scr =0 , stcr, srcr, mask; +unsigned int slots; ssi->dai_fmt = fmt;
@@ -904,10 +905,11 @@ static int _fsl_ssi_set_dai_fmt(struct freturn -EINVAL ; } + slots = ssi->slots ? :2 ;regmap_update_bits (ssi->regs,REG_SSI_STCCR , - SSI_SxCCR_DC_MASK,SSI_SxCCR_DC (2 )); + SSI_SxCCR_DC_MASK,SSI_SxCCR_DC (slots));regmap_update_bits (ssi->regs,REG_SSI_SRCCR , - SSI_SxCCR_DC_MASK,SSI_SxCCR_DC (2 )); + SSI_SxCCR_DC_MASK,SSI_SxCCR_DC (slots));/* Data on rising edge of bclk, frame low, 1clk before data */ strcr |=SSI_STCR_TFSI |SSI_STCR_TSCKP |SSI_STCR_TEFS ;
Greg Kroah-Hartman
maintainerPATCH 14/60 ASoC: SOF: Intel: unregister DMIC device on probe error
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
commit 5bb0ecddb2a7f638d65e457f3da9fa334c967b14 upstream.
We only unregister the platform device during the .remove operation, but if the probe fails we will never reach this sequence.
--- sound/soc/sof/intel/hda.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/sof/intel/hda.c +1 -0
@@ -672,6 +672,7 @@ free_streams:/* dsp_unmap: not currently used */ iounmap (sdev->bar[HDA_DSP_BAR ]); hdac_bus_unmap: +platform_device_unregister (hdev->dmic_dev);iounmap (bus->remap_addr); err:return ret;
Greg Kroah-Hartman
maintainerPATCH 15/60 ASoC: SOF: intel: fix wrong poll bits in dsp power down
In reply to Greg Kroah-HartmanFrom: Pan Xiuli <[email protected]>
commit fd8299181995093948ec6ca75432e797b4a39143 upstream.
The ADSPCS_SPA is Set Power Active bit. To check if DSP is powered down, we need to check ADSPCS_CPA, the Current Power Active bit.
--- sound/soc/sof/intel/hda-dsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/sof/intel/hda-dsp.c +1 -1
@@ -179,7 +179,7 @@ int hda_dsp_core_power_down(struct snd_sreturn snd_sof_dsp_read_poll_timeout (sdev,HDA_DSP_BAR ,HDA_DSP_REG_ADSPCS , adspcs, - !(adspcs &HDA_DSP_ADSPCS_SPA_MASK (core_mask)), + !(adspcs &HDA_DSP_ADSPCS_CPA_MASK (core_mask)),HDA_DSP_REG_POLL_INTERVAL_US ,HDA_DSP_PD_TIMEOUT *USEC_PER_MSEC ); }
Greg Kroah-Hartman
maintainerPATCH 16/60 ASoC: simple-card-utils: Do not handle device clock
In reply to Greg Kroah-HartmanFrom: Sameer Pujar <[email protected]>
commit 8ca88d53351cc58d535b2bfc7386835378fb0db2 upstream.
This reverts commit 1e30f642cf29 ("ASoC: simple-card-utils: Fix device module clock"). The original patch ended up breaking following platform, which depends on set_sysclk() to configure internal PLL on wm8904 codec and expects simple-card-utils to not update the MCLK rate.
- "arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3-ads2.dts"
It would be best if codec takes care of setting MCLK clock via DAI set_sysclk() callback.
--- sound/soc/generic/simple-card-utils.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
sound/soc/generic/simple-card-utils.c +7 -6
@@ -172,15 +172,16 @@ int asoc_simple_parse_clk(struct device* or device's module clock. */ clk =devm_get_clk_from_child (dev, node,NULL ); -if (IS_ERR (clk)) - clk =devm_get_clk_from_child (dev, dlc->of_node,NULL ); -if (!IS_ERR (clk)) { - simple_dai->clk = clk; simple_dai->sysclk =clk_get_rate (clk); - }else if (!of_property_read_u32 (node,"system-clock-frequency" , - &val)) { + + simple_dai->clk = clk; + }else if (!of_property_read_u32 (node,"system-clock-frequency" , &val)) { simple_dai->sysclk = val; + }else { + clk =devm_get_clk_from_child (dev, dlc->of_node,NULL ); +if (!IS_ERR (clk)) + simple_dai->sysclk =clk_get_rate (clk); }if (of_property_read_bool (node,"system-clock-direction-out" ))
Greg Kroah-Hartman
maintainerPATCH 17/60 afs: Stop listxattr() from listing "afs.*" attributes
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
commit a7889c6320b9200e3fe415238f546db677310fa9 upstream.
afs_listxattr() lists all the available special afs xattrs (i.e. those in the "afs.*" space), no matter what type of server we're dealing with. But OpenAFS servers, for example, cannot deal with some of the extra-capable attributes that AuriStor (YFS) servers provide. Unfortunately, the presence of the afs.yfs.* attributes causes errors[1] for anything that tries to read them if the server is of the wrong type.
Fix the problem by removing afs_listxattr() so that none of the special xattrs are listed (AFS doesn't support xattrs). It does mean, however, that getfattr won't list them, though they can still be accessed with getxattr() and setxattr().
This can be tested with something like:
getfattr -d -m ".*" /afs/example.com/path/to/file
With this change, none of the afs.* attributes should be visible.
Changes:
ver #2:
- Hide all of the afs.* xattrs, not just the ACL ones.
--- fs/afs/dir.c | 1 - fs/afs/file.c | 1 - fs/afs/inode.c | 1 - fs/afs/internal.h | 1 - fs/afs/mntpt.c | 1 - fs/afs/xattr.c | 23 ----------------------- 6 files changed, 28 deletions(-)
fs/afs/dir.c +0 -1
@@ -69,7 +69,6 @@ const struct inode_operations afs_dir_in .permission = afs_permission, .getattr = afs_getattr, .setattr = afs_setattr, - .listxattr = afs_listxattr, };const struct address_space_operations afs_dir_aops = {
fs/afs/file.c +0 -1
@@ -42,7 +42,6 @@ const struct inode_operations afs_file_i .getattr = afs_getattr, .setattr = afs_setattr, .permission = afs_permission, - .listxattr = afs_listxattr, };const struct address_space_operations afs_fs_aops = {
fs/afs/inode.c +0 -1
@@ -27,7 +27,6 @@static const struct inode_operations afs_symlink_inode_operations = { .get_link = page_get_link, - .listxattr = afs_listxattr, }; static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *parent_vnode)
fs/afs/internal.h +0 -1
@@ -1354,7 +1354,6 @@ extern int afs_launder_page(struct page* xattr.c */ extern const struct xattr_handler *afs_xattr_handlers[]; -extern ssize_t afs_listxattr (struct dentry *,char *,size_t );/* * yfsclient.c
fs/afs/mntpt.c +0 -1
@@ -32,7 +32,6 @@ const struct inode_operations afs_mntpt_ .lookup = afs_mntpt_lookup, .readlink = page_readlink, .getattr = afs_getattr, - .listxattr = afs_listxattr, };const struct inode_operations afs_autocell_inode_operations = {
fs/afs/xattr.c +0 -23
@@ -11,29 +11,6 @@#include <linux/xattr.h> #include "internal.h" -static const char afs_xattr_list[] = -"afs.acl\0" -"afs.cell\0" -"afs.fid\0" -"afs.volume\0" -"afs.yfs.acl\0" -"afs.yfs.acl_inherited\0" -"afs.yfs.acl_num_cleaned\0" -"afs.yfs.vol_acl" ; - -/* -* Retrieve a list of the supported xattrs. -*/ -ssize_t afs_listxattr (struct dentry *dentry,char *buffer,size_t size) -{ -if (size ==0 ) -return sizeof (afs_xattr_list); -if (size <sizeof (afs_xattr_list)) -return -ERANGE ; -memcpy (buffer, afs_xattr_list,sizeof (afs_xattr_list)); -return sizeof (afs_xattr_list); -} -/* * Get a file's ACL. */
Greg Kroah-Hartman
maintainerPATCH 18/60 nvme: fix Write Zeroes limitations
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
commit b94e8cd2e6a94fc7563529ddc82726a7e77e04de upstream.
We voluntarily limit the Write Zeroes sizes to the MDTS value provided by the hardware, but currently get the units wrong, so fix that.
--- drivers/nvme/host/core.c | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-)
drivers/nvme/host/core.c +12 -24
@@ -1743,30 +1743,18 @@ static void nvme_config_discard(struct gblk_queue_max_write_zeroes_sectors (queue,UINT_MAX ); } -static void nvme_config_write_zeroes (struct gendisk *disk,struct nvme_ns *ns) +/* +* Even though NVMe spec explicitly states that MDTS is not applicable to the +* write-zeroes, we are cautious and limit the size to the controllers +* max_hw_sectors value, which is based on the MDTS field and possibly other +* limiting factors. +*/ +static void nvme_config_write_zeroes (struct request_queue *q, +struct nvme_ctrl *ctrl) { -u64 max_blocks; - -if (!(ns->ctrl->oncs &NVME_CTRL_ONCS_WRITE_ZEROES ) || - (ns->ctrl->quirks &NVME_QUIRK_DISABLE_WRITE_ZEROES )) -return ; -/* -* Even though NVMe spec explicitly states that MDTS is not -* applicable to the write-zeroes:- "The restriction does not apply to -* commands that do not transfer data between the host and the -* controller (e.g., Write Uncorrectable ro Write Zeroes command).". -* In order to be more cautious use controller's max_hw_sectors value -* to configure the maximum sectors for the write-zeroes which is -* configured based on the controller's MDTS field in the -* nvme_init_identify() if available. -*/ -if (ns->ctrl->max_hw_sectors ==UINT_MAX ) - max_blocks = (u64 )USHRT_MAX +1 ; -else - max_blocks = ns->ctrl->max_hw_sectors +1 ; - -blk_queue_max_write_zeroes_sectors (disk->queue, -nvme_lba_to_sect (ns, max_blocks)); +if ((ctrl->oncs &NVME_CTRL_ONCS_WRITE_ZEROES ) && + !(ctrl->quirks &NVME_QUIRK_DISABLE_WRITE_ZEROES )) +blk_queue_max_write_zeroes_sectors (q, ctrl->max_hw_sectors); } static int nvme_report_ns_ids(struct nvme_ctrl *ctrl, unsigned int nsid,
@@ -1853,7 +1841,7 @@ static void nvme_update_disk_info(structset_capacity (disk, capacity);nvme_config_discard (disk, ns); -nvme_config_write_zeroes (disk, ns); +nvme_config_write_zeroes (disk->queue, ns->ctrl);if (id->nsattr & (1 <<0 ))set_disk_ro (disk, true);
Greg Kroah-Hartman
maintainerPATCH 19/60 nvme-tcp: fix possible hang when failing to set io queues
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
commit 72f572428b83d0bc7028e7c4326d1a5f45205e44 upstream.
We only setup io queues for nvme controllers, and it makes absolutely no sense to allow a controller (re)connect without any I/O queues. If we happen to fail setting the queue count for any reason, we should not allow this to be a successful reconnect as I/O has no chance in going through. Instead just fail and schedule another reconnect.
--- drivers/nvme/host/tcp.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/nvme/host/tcp.c +5 -2
@@ -1643,8 +1643,11 @@ static int nvme_tcp_alloc_io_queues(strureturn ret; ctrl->queue_count = nr_io_queues +1 ; -if (ctrl->queue_count <2 ) -return 0 ; +if (ctrl->queue_count <2 ) { +dev_err (ctrl->device, +"unable to set any I/O queues\n" ); +return -ENOMEM ; + }dev_info (ctrl->device,"creating %d I/O queues.\n" , nr_io_queues);
Greg Kroah-Hartman
maintainerPATCH 20/60 nvme-tcp: fix a NULL deref when receiving a 0-length r2t PDU
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
commit fd0823f405090f9f410fc3e3ff7efb52e7b486fa upstream.
When the controller sends us a 0-length r2t PDU we should not attempt to try to set up a h2cdata PDU but rather conclude that this is a buggy controller (forward progress is not possible) and simply fail it immediately.
--- drivers/nvme/host/tcp.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/nvme/host/tcp.c +7 -0
@@ -512,6 +512,13 @@ static int nvme_tcp_setup_h2c_data_pdu(s req->pdu_len =le32_to_cpu (pdu->r2t_length); req->pdu_sent =0 ; +if (unlikely (!req->pdu_len)) { +dev_err (queue->ctrl->ctrl.device, +"req %d r2t len is %u, probably a bug...\n" , + rq->tag, req->pdu_len); +return -EPROTO ; + } +if (unlikely (req->data_sent + req->pdu_len > req->data_len)) { dev_err(queue->ctrl->ctrl.device, "req %d r2t len %u exceeded data len %u (%zu sent)\n",
Greg Kroah-Hartman
maintainerPATCH 21/60 nvmet: dont check iosqes,iocqes for discovery controllers
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
commit d218a8a3003e84ab136e69a4e30dd4ec7dab2d22 upstream.
Quoted 1 line
From the base spec, Figure 78:
"Controller Configuration, these fields are defined as parameters to
configure an "I/O Controller (IOC)" and not to configure a "Discovery Controller (DC).
...
If the controller does not support I/O queues, then this field shall be read-only with a value of 0h
Just perform this check for I/O controllers.
--- drivers/nvme/target/core.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/nvme/target/core.c +14 -3
@@ -1031,9 +1031,20 @@ static void nvmet_start_ctrl(struct nvme {lockdep_assert_held (&ctrl->lock); -if (nvmet_cc_iosqes (ctrl->cc) !=NVME_NVM_IOSQES || -nvmet_cc_iocqes (ctrl->cc) !=NVME_NVM_IOCQES || -nvmet_cc_mps (ctrl->cc) !=0 || +/* +* Only I/O controllers should verify iosqes,iocqes. +* Strictly speaking, the spec says a discovery controller +* should verify iosqes,iocqes are zeroed, however that +* would break backwards compatibility, so don't enforce it. +*/ +if (ctrl->subsys->type !=NVME_NQN_DISC && + (nvmet_cc_iosqes (ctrl->cc) !=NVME_NVM_IOSQES || +nvmet_cc_iocqes (ctrl->cc) !=NVME_NVM_IOCQES )) { + ctrl->csts =NVME_CSTS_CFS ; +return ; + } + +if (nvmet_cc_mps (ctrl->cc) !=0 ||nvmet_cc_ams (ctrl->cc) !=0 ||nvmet_cc_css (ctrl->cc) !=0 ) { ctrl->csts =NVME_CSTS_CFS ;
Greg Kroah-Hartman
maintainerPATCH 22/60 nfsd: Dont keep looking up unhashed files in the nfsd file cache
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit d30881f573e565ebb5dbb50b31ed6106b5c81328 upstream.
If a file is unhashed, then we're going to reject it anyway and retry, so make sure we skip it when we're doing the RCU lockless lookup. This avoids a number of unnecessary nfserr_jukebox returns from nfsd_file_acquire()
--- fs/nfsd/filecache.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfsd/filecache.c +2 -0
@@ -751,6 +751,8 @@ nfsd_file_find_locked(struct inode *inodcontinue ;if (!nfsd_match_cred (nf->nf_cred,current_cred ()))continue ; +if (!test_bit (NFSD_FILE_HASHED , &nf->nf_flags)) +continue ;if (nfsd_file_get (nf) !=NULL )return nf; }
Greg Kroah-Hartman
maintainerPATCH 23/60 NFSD: Repair misuse of sv_lock in 5.10.16-rt30.
In reply to Greg Kroah-HartmanFrom: Joe Korty <[email protected]>
commit c7de87ff9dac5f396f62d584f3908f80ddc0e07b upstream.
[ This problem is in mainline, but only rt has the chops to be able to detect it. ]
Lockdep reports a circular lock dependency between serv->sv_lock and softirq_ctl.lock on system shutdown, when using a kernel built with CONFIG_PREEMPT_RT=y, and a nfs mount exists.
This is due to the definition of spin_lock_bh on rt:
local_bh_disable(); rt_spin_lock(lock);
which forces a softirq_ctl.lock -> serv->sv_lock dependency. This is not a problem as long as _every_ lock of serv->sv_lock is a:
spin_lock_bh(&serv->sv_lock);
but there is one of the form:
spin_lock(&serv->sv_lock);
This is what is causing the circular dependency splat. The spin_lock() grabs the lock without first grabbing softirq_ctl.lock via local_bh_disable. If later on in the critical region, someone does a local_bh_disable, we get a serv->sv_lock -> softirq_ctrl.lock dependency established. Deadlock.
Fix is to make serv->sv_lock be locked with spin_lock_bh everywhere, no exceptions.
[ OK ] Stopped target NFS client services.
Stopping Logout off all iSCSI sessions on shutdown... Stopping NFS server and services...
[ 109.442380]
[ 109.442385] ======================================================
[ 109.442386] WARNING: possible circular locking dependency detected
[ 109.442387] 5.10.16-rt30 #1 Not tainted
[ 109.442389] ------------------------------------------------------
[ 109.442390] nfsd/1032 is trying to acquire lock:
[ 109.442392] ffff994237617f60 ((softirq_ctrl.lock).lock){+.+.}-{2:2}, at: __local_bh_disable_ip+0xd9/0x270
[ 109.442405]
[ 109.442405] but task is already holding lock:
[ 109.442406] ffff994245cb00b0 (&serv->sv_lock){+.+.}-{0:0}, at: svc_close_list+0x1f/0x90
[ 109.442415]
[ 109.442415] which lock already depends on the new lock.
[ 109.442415]
[ 109.442416]
[ 109.442416] the existing dependency chain (in reverse order) is:
[ 109.442417]
[ 109.442417] -> #1 (&serv->sv_lock){+.+.}-{0:0}:
[ 109.442421] rt_spin_lock+0x2b/0xc0
[ 109.442428] svc_add_new_perm_xprt+0x42/0xa0
[ 109.442430] svc_addsock+0x135/0x220
[ 109.442434] write_ports+0x4b3/0x620
[ 109.442438] nfsctl_transaction_write+0x45/0x80
[ 109.442440] vfs_write+0xff/0x420
[ 109.442444] ksys_write+0x4f/0xc0
[ 109.442446] do_syscall_64+0x33/0x40
[ 109.442450] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 109.442454]
[ 109.442454] -> #0 ((softirq_ctrl.lock).lock){+.+.}-{2:2}:
[ 109.442457] __lock_acquire+0x1264/0x20b0
[ 109.442463] lock_acquire+0xc2/0x400
[ 109.442466] rt_spin_lock+0x2b/0xc0
[ 109.442469] __local_bh_disable_ip+0xd9/0x270
[ 109.442471] svc_xprt_do_enqueue+0xc0/0x4d0
[ 109.442474] svc_close_list+0x60/0x90
[ 109.442476] svc_close_net+0x49/0x1a0
[ 109.442478] svc_shutdown_net+0x12/0x40
[ 109.442480] nfsd_destroy+0xc5/0x180
[ 109.442482] nfsd+0x1bc/0x270
[ 109.442483] kthread+0x194/0x1b0
[ 109.442487] ret_from_fork+0x22/0x30
[ 109.442492]
[ 109.442492] other info that might help us debug this:
[ 109.442492]
[ 109.442493] Possible unsafe locking scenario:
[ 109.442493]
[ 109.442493] CPU0 CPU1
[ 109.442494] ---- ----
[ 109.442495] lock(&serv->sv_lock);
[ 109.442496] lock((softirq_ctrl.lock).lock);
[ 109.442498] lock(&serv->sv_lock);
[ 109.442499] lock((softirq_ctrl.lock).lock);
[ 109.442501]
[ 109.442501] *** DEADLOCK ***
[ 109.442501]
[ 109.442501] 3 locks held by nfsd/1032:
[ 109.442503] #0: ffffffff93b49258 (nfsd_mutex){+.+.}-{3:3}, at: nfsd+0x19a/0x270
[ 109.442508] #1: ffff994245cb00b0 (&serv->sv_lock){+.+.}-{0:0}, at: svc_close_list+0x1f/0x90
[ 109.442512] #2: ffffffff93a81b20 (rcu_read_lock){....}-{1:2}, at: rt_spin_lock+0x5/0xc0
[ 109.442518]
[ 109.442518] stack backtrace:
[ 109.442519] CPU: 0 PID: 1032 Comm: nfsd Not tainted 5.10.16-rt30 #1
[ 109.442522] Hardware name: Supermicro X9DRL-3F/iF/X9DRL-3F/iF, BIOS 3.2 09/22/2015
[ 109.442524] Call Trace:
[ 109.442527] dump_stack+0x77/0x97
[ 109.442533] check_noncircular+0xdc/0xf0
[ 109.442546] __lock_acquire+0x1264/0x20b0
[ 109.442553] lock_acquire+0xc2/0x400
[ 109.442564] rt_spin_lock+0x2b/0xc0
[ 109.442570] __local_bh_disable_ip+0xd9/0x270
[ 109.442573] svc_xprt_do_enqueue+0xc0/0x4d0
[ 109.442577] svc_close_list+0x60/0x90
[ 109.442581] svc_close_net+0x49/0x1a0
[ 109.442585] svc_shutdown_net+0x12/0x40
[ 109.442588] nfsd_destroy+0xc5/0x180
[ 109.442590] nfsd+0x1bc/0x270
[ 109.442595] kthread+0x194/0x1b0
[ 109.442600] ret_from_fork+0x22/0x30
[ 109.518225] nfsd: last server has exited, flushing export cache
[ OK ] Stopped NFSv4 ID-name mapping service.
[ OK ] Stopped GSSAPI Proxy Daemon.
[ OK ] Stopped NFS Mount Daemon.
[ OK ] Stopped NFS status monitor for NFSv2/3 locking..--- net/sunrpc/svc_xprt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/sunrpc/svc_xprt.c +2 -2
@@ -1072,7 +1072,7 @@ static int svc_close_list(struct svc_serstruct svc_xprt *xprt;int ret =0 ; -spin_lock (&serv->sv_lock); +spin_lock_bh (&serv->sv_lock);list_for_each_entry (xprt, xprt_list, xpt_list) {if (xprt->xpt_net != net)continue ;
@@ -1080,7 +1080,7 @@ static int svc_close_list(struct svc_serset_bit (XPT_CLOSE , &xprt->xpt_flags);svc_xprt_enqueue (xprt); } -spin_unlock (&serv->sv_lock); +spin_unlock_bh (&serv->sv_lock);return ret; }
Greg Kroah-Hartman
maintainerPATCH 24/60 svcrdma: disable timeouts on rdma backchannel
In reply to Greg Kroah-HartmanFrom: Timo Rothenpieler <[email protected]>
commit 6820bf77864d5894ff67b5c00d7dba8f92011e3d upstream.
This brings it in line with the regular tcp backchannel, which also has all those timeouts disabled.
Prevents the backchannel from timing out, getting some async operations like server side copying getting stuck indefinitely on the client side.
--- net/sunrpc/xprtrdma/svc_rdma_backchannel.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/sunrpc/xprtrdma/svc_rdma_backchannel.c +3 -3
@@ -285,9 +285,9 @@ xprt_setup_rdma_bc(struct xprt_create *a xprt->timeout = &xprt_rdma_bc_timeout;xprt_set_bound (xprt);xprt_set_connected (xprt); - xprt->bind_timeout =RPCRDMA_BIND_TO ; - xprt->reestablish_timeout =RPCRDMA_INIT_REEST_TO ; - xprt->idle_timeout =RPCRDMA_IDLE_DISC_TO ; + xprt->bind_timeout =0 ; + xprt->reestablish_timeout =0 ; + xprt->idle_timeout =0 ; xprt->prot =XPRT_TRANSPORT_BC_RDMA ; xprt->ops = &xprt_rdma_bc_procs;
Greg Kroah-Hartman
maintainerPATCH 25/60 vfio: IOMMU_API should be selected
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
commit 179209fa12709a3df8888c323b37315da2683c24 upstream.
As IOMMU_API is a kconfig without a description (eg does not show in the menu) the correct operator is select not 'depends on'. Using 'depends on' for this kind of symbol means VFIO is not selectable unless some other random kconfig has already enabled IOMMU_API for it.
Message-Id: <[email protected]>
--- drivers/vfio/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/vfio/Kconfig +1 -1
@@ -21,7 +21,7 @@ config VFIO_VIRQFD menuconfig VFIO tristate "VFIO Non-Privileged userspace driver framework" - depends on IOMMU_API + select IOMMU_API select VFIO_IOMMU_TYPE1 if (X86 || S390 || ARM || ARM64) help VFIO provides a framework for secure userspace device drivers.
Greg Kroah-Hartman
maintainerPATCH 26/60 sunrpc: fix refcount leak for rpc auth modules
In reply to Greg Kroah-HartmanFrom: Daniel Kobras <[email protected]>
commit f1442d6349a2e7bb7a6134791bdc26cb776c79af upstream.
If an auth module's accept op returns SVC_CLOSE, svc_process_common() enters a call path that does not call svc_authorise() before leaving the function, and thus leaks a reference on the auth module's refcount. Hence, make sure calls to svc_authenticate() and svc_authorise() are paired for all call paths, to make sure rpc auth modules can be unloaded.
--- net/sunrpc/svc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/sunrpc/svc.c +4 -2
@@ -1417,7 +1417,7 @@ svc_process_common(struct svc_rqst *rqst sendit:if (svc_authorise (rqstp)) - goto close; + goto close_xprt;return 1 ;/* Caller can now send it */ release_dropit:
@@ -1429,6 +1429,8 @@ release_dropit:return 0 ; close: +svc_authorise (rqstp); +close_xprt:if (rqstp->rq_xprt &&test_bit (XPT_TEMP , &rqstp->rq_xprt->xpt_flags))svc_close_xprt (rqstp->rq_xprt);dprintk ("svc: svc_process close\n" );
@@ -1437,7 +1439,7 @@ release_dropit: err_short_len:svc_printk (rqstp,"short len %zd, dropping request\n" , argv->iov_len); - goto close; + goto close_xprt; err_bad_rpc: serv->sv_stats->rpcbadfmt++;
Greg Kroah-Hartman
maintainerPATCH 27/60 net/qrtr: fix __netdev_alloc_skb call
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
commit 093b036aa94e01a0bea31a38d7f0ee28a2749023 upstream.
syzbot found WARNING in __alloc_pages_nodemask()[1] when order >= MAX_ORDER. It was caused by a huge length value passed from userspace to qrtr_tun_write_iter(), which tries to allocate skb. Since the value comes from the untrusted source there is no need to raise a warning in __alloc_pages_nodemask().
[1] WARNING in __alloc_pages_nodemask+0x5f8/0x730 mm/page_alloc.c:5014
Call Trace: __alloc_pages include/linux/gfp.h:511 [inline] __alloc_pages_node include/linux/gfp.h:524 [inline] alloc_pages_node include/linux/gfp.h:538 [inline] kmalloc_large_node+0x60/0x110 mm/slub.c:3999 __kmalloc_node_track_caller+0x319/0x3f0 mm/slub.c:4496 __kmalloc_reserve net/core/skbuff.c:150 [inline] __alloc_skb+0x4e4/0x5a0 net/core/skbuff.c:210 __netdev_alloc_skb+0x70/0x400 net/core/skbuff.c:446 netdev_alloc_skb include/linux/skbuff.h:2832 [inline] qrtr_endpoint_post+0x84/0x11b0 net/qrtr/qrtr.c:442 qrtr_tun_write_iter+0x11f/0x1a0 net/qrtr/tun.c:98 call_write_iter include/linux/fs.h:1901 [inline] new_sync_write+0x426/0x650 fs/read_write.c:518 vfs_write+0x791/0xa30 fs/read_write.c:605 ksys_write+0x12d/0x250 fs/read_write.c:658 do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46 entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- net/qrtr/qrtr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/qrtr/qrtr.c +1 -1
@@ -264,7 +264,7 @@ int qrtr_endpoint_post(struct qrtr_endpoif (len ==0 || len &3 )return -EINVAL ; - skb =netdev_alloc_skb (NULL , len); + skb =__netdev_alloc_skb (NULL , len,GFP_ATOMIC | __GFP_NOWARN);if (!skb)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 28/60 kbuild: Fix <linux/version.h> for empty SUBLEVEL or PATCHLEVEL again
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
commit 207da4c82ade9a6d59f7e794d737ba0748613fa2 upstream.
Commit 78d3bb4483ba ("kbuild: Fix <linux/version.h> for empty SUBLEVEL or PATCHLEVEL") fixed the build error for empty SUBLEVEL or PATCHLEVEL by prepending a zero.
Commit 9b82f13e7ef3 ("kbuild: clamp SUBLEVEL to 255") re-introduced this issue.
This time, we cannot take the same approach because we have C code:
#define LINUX_VERSION_PATCHLEVEL $(PATCHLEVEL) #define LINUX_VERSION_SUBLEVEL $(SUBLEVEL)
Replace empty SUBLEVEL/PATCHLEVEL with a zero.
--- Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
Makefile +4 -2
@@ -1177,15 +1177,17 @@ endef define filechk_version.h if [ $(SUBLEVEL) -gt 255 ]; then \ echo \#define LINUX_VERSION_CODE $(shell \ - expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 255); \ + expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + 255); \ else \ echo \#define LINUX_VERSION_CODE $(shell \ - expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \ + expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \ fi; \ echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + \ ((c) > 255 ? 255 : (c)))' endef +$(version_h): PATCHLEVEL := $(if $(PATCHLEVEL), $(PATCHLEVEL), 0) +$(version_h): SUBLEVEL := $(if $(SUBLEVEL), $(SUBLEVEL), 0) $(version_h): FORCE $(call filechk,version.h) $(Q)rm -f $(old_version_h)
Greg Kroah-Hartman
maintainerPATCH 29/60 riscv: Correct SPARSEMEM configuration
In reply to Greg Kroah-HartmanFrom: Kefeng Wang <[email protected]>
commit a5406a7ff56e63376c210b06072aa0ef23473366 upstream.
There are two issues for RV32,
1) if use FLATMEM, it is useless to enable SPARSEMEM_STATIC.
2) if use SPARSMEM, both SPARSEMEM_VMEMMAP and SPARSEMEM_STATIC is enabled.
--- arch/riscv/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/Kconfig +2 -2
@@ -58,7 +58,6 @@ config RISCV select EDAC_SUPPORT select ARCH_HAS_GIGANTIC_PAGE select ARCH_WANT_HUGE_PMD_SHARE if 64BIT - select SPARSEMEM_STATIC if 32BIT select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU select HAVE_ARCH_MMAP_RND_BITS select HAVE_COPY_THREAD_TLS
@@ -102,7 +101,8 @@ config ARCH_FLATMEM_ENABLE config ARCH_SPARSEMEM_ENABLE def_bool y depends on MMU - select SPARSEMEM_VMEMMAP_ENABLE + select SPARSEMEM_STATIC if 32BIT && SPARSMEM + select SPARSEMEM_VMEMMAP_ENABLE if 64BIT config ARCH_SELECT_MEMORY_MODEL def_bool ARCH_SPARSEMEM_ENABLE
Greg Kroah-Hartman
maintainerPATCH 30/60 scsi: lpfc: Fix some error codes in debugfs
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 19f1bc7edf0f97186810e13a88f5b62069d89097 upstream.
If copy_from_user() or kstrtoull() fail then the correct behavior is to return a negative error code.
--- drivers/scsi/lpfc/lpfc_debugfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/lpfc/lpfc_debugfs.c +2 -2
@@ -2217,7 +2217,7 @@ lpfc_debugfs_dif_err_write(struct file *memset (dstbuf,0 ,33 ); size = (nbytes <32 ) ? nbytes :32 ;if (copy_from_user (dstbuf, buf, size)) -return 0 ; +return -EFAULT ;if (dent == phba->debug_InjErrLBA) {if ((buf[0 ] =='o' ) && (buf[1 ] =='f' ) && (buf[2 ] =='f' ))
@@ -2225,7 +2225,7 @@ lpfc_debugfs_dif_err_write(struct file * }if ((tmp ==0 ) && (kstrtoull (dstbuf,0 , &tmp))) -return 0 ; +return -EINVAL ;if (dent == phba->debug_writeGuard) phba->lpfc_injerr_wgrd_cnt = (uint32_t )tmp;
Greg Kroah-Hartman
maintainerPATCH 31/60 scsi: myrs: Fix a double free in myrs_cleanup()
In reply to Greg Kroah-HartmanFrom: Lv Yunlong <[email protected]>
commit 2bb817712e2f77486d6ee17e7efaf91997a685f8 upstream.
In myrs_cleanup(), cs->mmio_base will be freed twice by iounmap().
--- drivers/scsi/myrs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/myrs.c +1 -1
@@ -2274,12 +2274,12 @@ static void myrs_cleanup(struct myrs_hbaif (cs->mmio_base) { cs->disable_intr (cs);iounmap (cs->mmio_base); + cs->mmio_base =NULL ; }if (cs->irq)free_irq (cs->irq, cs);if (cs->io_addr)release_region (cs->io_addr,0x80 ); -iounmap (cs->mmio_base);pci_set_drvdata (pdev,NULL );pci_disable_device (pdev);scsi_host_put (cs->host);
Greg Kroah-Hartman
maintainerPATCH 32/60 counter: stm32-timer-cnt: Report count function when SLAVE_MODE_DISABLED
In reply to Greg Kroah-HartmanFrom: William Breathitt Gray <[email protected]>
[ Upstream commit fae6f62e6a580b663ecf42c2120a0898deae9137 ]
When in SLAVE_MODE_DISABLED mode, the count still increases if the counter is enabled because an internal clock is used. This patch fixes the stm32_count_function_get() and stm32_count_function_set() functions to properly handle this behavior.
--- drivers/counter/stm32-timer-cnt.c | 39 ++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 14 deletions(-)
drivers/counter/stm32-timer-cnt.c +25 -14
@@ -35,13 +35,14 @@ struct stm32_timer_cnt {* @STM32_COUNT_ENCODER_MODE_3: counts on both TI1FP1 and TI2FP2 edges */ enum stm32_count_function { -STM32_COUNT_SLAVE_MODE_DISABLED =-1 , +STM32_COUNT_SLAVE_MODE_DISABLED ,STM32_COUNT_ENCODER_MODE_1 ,STM32_COUNT_ENCODER_MODE_2 ,STM32_COUNT_ENCODER_MODE_3 , };static enum counter_count_function stm32_count_functions[] = { + [STM32_COUNT_SLAVE_MODE_DISABLED ] =COUNTER_COUNT_FUNCTION_INCREASE , [STM32_COUNT_ENCODER_MODE_1 ] =COUNTER_COUNT_FUNCTION_QUADRATURE_X2_A , [STM32_COUNT_ENCODER_MODE_2 ] =COUNTER_COUNT_FUNCTION_QUADRATURE_X2_B , [STM32_COUNT_ENCODER_MODE_3 ] =COUNTER_COUNT_FUNCTION_QUADRATURE_X4 ,
@@ -88,6 +89,9 @@ static int stm32_count_function_get(struct counter_device *counter,regmap_read (priv->regmap,TIM_SMCR , &smcr);switch (smcr &TIM_SMCR_SMS ) { +case 0 : + *function =STM32_COUNT_SLAVE_MODE_DISABLED ; +return 0 ;case 1 : *function =STM32_COUNT_ENCODER_MODE_1 ;return 0 ;
@@ -97,9 +101,9 @@ static int stm32_count_function_get(struct counter_device *counter,case 3 : *function =STM32_COUNT_ENCODER_MODE_3 ;return 0 ; +default : +return -EINVAL ; } - -return -EINVAL ; } static int stm32_count_function_set(struct counter_device *counter,
@@ -110,6 +114,9 @@ static int stm32_count_function_set(struct counter_device *counter,u32 cr1, sms;switch (function) { +case STM32_COUNT_SLAVE_MODE_DISABLED : + sms =0 ; +break ;case STM32_COUNT_ENCODER_MODE_1 : sms =1 ;break ;
@@ -120,8 +127,7 @@ static int stm32_count_function_set(struct counter_device *counter, sms =3 ;break ;default : - sms =0 ; -break ; +return -EINVAL ; }/* Store enable status */
@@ -269,31 +275,36 @@ static int stm32_action_get(struct counter_device *counter,size_t function;int err; -/* Default action mode (e.g. STM32_COUNT_SLAVE_MODE_DISABLED) */ - *action =STM32_SYNAPSE_ACTION_NONE ; - err =stm32_count_function_get (counter, count, &function);if (err) -return 0 ; +return err;switch (function) { +case STM32_COUNT_SLAVE_MODE_DISABLED : +/* counts on internal clock when CEN=1 */ + *action =STM32_SYNAPSE_ACTION_NONE ; +return 0 ;case STM32_COUNT_ENCODER_MODE_1 :/* counts up/down on TI1FP1 edge depending on TI2FP2 level */ if (synapse->signal->id == count->synapses[0 ].signal->id) *action =STM32_SYNAPSE_ACTION_BOTH_EDGES ; -break ; +else + *action =STM32_SYNAPSE_ACTION_NONE ; +return 0 ;case STM32_COUNT_ENCODER_MODE_2 :/* counts up/down on TI2FP2 edge depending on TI1FP1 level */ if (synapse->signal->id == count->synapses[1 ].signal->id) *action =STM32_SYNAPSE_ACTION_BOTH_EDGES ; -break ; +else + *action =STM32_SYNAPSE_ACTION_NONE ; +return 0 ;case STM32_COUNT_ENCODER_MODE_3 :/* counts up/down on both TI1FP1 and TI2FP2 edges */ *action =STM32_SYNAPSE_ACTION_BOTH_EDGES ; -break ; +return 0 ; +default : +return -EINVAL ; } - -return 0 ; }static const struct counter_ops stm32_timer_cnt_ops = {
Signature · 1 line
2.30.1
Greg Kroah-Hartman
maintainerPATCH 33/60 nvme-rdma: fix possible hang when failing to set io queues
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit c4c6df5fc84659690d4391d1fba155cd94185295 ]
We only setup io queues for nvme controllers, and it makes absolutely no sense to allow a controller (re)connect without any I/O queues. If we happen to fail setting the queue count for any reason, we should not allow this to be a successful reconnect as I/O has no chance in going through. Instead just fail and schedule another reconnect.
--- drivers/nvme/host/rdma.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/nvme/host/rdma.c +5 -2
@@ -666,8 +666,11 @@ static int nvme_rdma_alloc_io_queues(struct nvme_rdma_ctrl *ctrl)return ret; ctrl->ctrl.queue_count = nr_io_queues +1 ; -if (ctrl->ctrl.queue_count <2 ) -return 0 ; +if (ctrl->ctrl.queue_count <2 ) { +dev_err (ctrl->ctrl.device, +"unable to set any I/O queues\n" ); +return -ENOMEM ; + }dev_info (ctrl->ctrl.device,"creating %d I/O queues.\n" , nr_io_queues);
Signature · 1 line
2.30.1
Greg Kroah-Hartman
maintainerPATCH 34/60 usb-storage: Add quirk to defeat Kindles automatic unload
In reply to Greg Kroah-HartmanFrom: Alan Stern <[email protected]>
commit 546aa0e4ea6ed81b6c51baeebc4364542fa3f3a7 upstream.
Matthias reports that the Amazon Kindle automatically removes its emulated media if it doesn't receive another SCSI command within about one second after a SYNCHRONIZE CACHE. It does so even when the host has sent a PREVENT MEDIUM REMOVAL command. The reason for this behavior isn't clear, although it's not hard to make some guesses.
At any rate, the results can be unexpected for anyone who tries to access the Kindle in an unusual fashion, and in theory they can lead to data loss (for example, if one file is closed and synchronized while other files are still in the middle of being written).
To avoid such problems, this patch creates a new usb-storage quirks flag telling the driver always to issue a REQUEST SENSE following a SYNCHRONIZE CACHE command, and adds an unusual_devs entry for the Kindle with the flag set. This is sufficient to prevent the Kindle from doing its automatic unload, without interfering with proper operation.
Another possible way to deal with this would be to increase the frequency of TEST UNIT READY polling that the kernel normally carries out for removable-media storage devices. However that would increase the overall load on the system and it is not as reliable, because the user can override the polling interval. Changing the driver's behavior is safer and has minimal overhead.
--- drivers/usb/storage/transport.c | 7 +++++++ drivers/usb/storage/unusual_devs.h | 12 ++++++++++++ include/linux/usb_usual.h | 2 ++ 3 files changed, 21 insertions(+)
drivers/usb/storage/transport.c +7 -0
@@ -651,6 +651,13 @@ void usb_stor_invoke_transport(struct sc need_auto_sense =1 ; } +/* Some devices (Kindle) require another command after SYNC CACHE */ +if ((us->fflags &US_FL_SENSE_AFTER_SYNC ) && + srb->cmnd[0 ] ==SYNCHRONIZE_CACHE ) { +usb_stor_dbg (us,"-- sense after SYNC CACHE\n" ); + need_auto_sense =1 ; + } +/* * If we have a failure, we're going to do a REQUEST_SENSE * automatically. Note that we differentiate between a command
drivers/usb/storage/unusual_devs.h +12 -0
@@ -2212,6 +2212,18 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0 US_FL_NO_READ_DISC_INFO ),/* +* Reported by Matthias Schwarzott <[email protected]> +* The Amazon Kindle treats SYNCHRONIZE CACHE as an indication that +* the host may be finished with it, and automatically ejects its +* emulated media unless it receives another command within one second. +*/ +UNUSUAL_DEV (0x1949 ,0x0004 ,0x0000 ,0x9999 , +"Amazon" , +"Kindle" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , +US_FL_SENSE_AFTER_SYNC ), + +/* * Reported by Oliver Neukum <[email protected]> * This device morphes spontaneously into another device if the access * pattern of Windows isn't followed. Thus writable media would be dirty
include/linux/usb_usual.h +2 -0
@@ -86,6 +86,8 @@/* lies about caching, so always sync */ \US_FLAG (NO_SAME ,0x40000000 ) \ /* Cannot handle WRITE_SAME */ \ +US_FLAG (SENSE_AFTER_SYNC ,0x80000000 ) \ + /* Do REQUEST_SENSE after SYNCHRONIZE_CACHE */ \#define US_FLAG (name, value) US_FL_##name = value ,enum {US_DO_ALL_FLAGS };
Greg Kroah-Hartman
maintainerPATCH 35/60 usbip: Fix incorrect double assignment to udc->ud.tcp_rx
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
commit 9858af27e69247c5d04c3b093190a93ca365f33d upstream.
Currently udc->ud.tcp_rx is being assigned twice, the second assignment is incorrect, it should be to udc->ud.tcp_tx instead of rx. Fix this.
Addresses-Coverity: ("Unused value")
--- drivers/usb/usbip/vudc_sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/usbip/vudc_sysfs.c +1 -1
@@ -174,7 +174,7 @@ static ssize_t usbip_sockfd_store(struct udc->ud.tcp_socket = socket; udc->ud.tcp_rx = tcp_rx; - udc->ud.tcp_rx = tcp_tx; + udc->ud.tcp_tx = tcp_tx; udc->ud.status =SDEV_ST_USED ;spin_unlock_irq (&udc->ud.lock);
Greg Kroah-Hartman
maintainerPATCH 36/60 USB: replace hardcode maximum usb string length by definition
In reply to Greg Kroah-HartmanFrom: Macpaul Lin <[email protected]>
commit 81c7462883b0cc0a4eeef0687f80ad5b5baee5f6 upstream.
Replace hardcoded maximum USB string length (126 bytes) by definition "USB_MAX_STRING_LEN".
--- drivers/usb/gadget/composite.c | 4 ++-- drivers/usb/gadget/configfs.c | 2 +- drivers/usb/gadget/usbstring.c | 4 ++-- include/uapi/linux/usb/ch9.h | 3 +++ 4 files changed, 8 insertions(+), 5 deletions(-)
drivers/usb/gadget/composite.c +2 -2
@@ -1091,7 +1091,7 @@ static void collect_langs(struct usb_gadwhile (*sp) { s = *sp; language =cpu_to_le16 (s->language); -for (tmp = buf; *tmp && tmp < &buf[126 ]; tmp++) { +for (tmp = buf; *tmp && tmp < &buf[USB_MAX_STRING_LEN ]; tmp++) {if (*tmp == language) goto repeat; }
@@ -1166,7 +1166,7 @@ static int get_string(struct usb_composicollect_langs (sp, s->wData); } -for (len =0 ; len <=126 && s->wData[len]; len++) +for (len =0 ; len <=USB_MAX_STRING_LEN && s->wData[len]; len++)continue ;if (!len)return -EINVAL ;
drivers/usb/gadget/configfs.c +1 -1
@@ -115,7 +115,7 @@ static int usb_string_copy(const char *schar *str;char *copy = *s_copy; ret =strlen (s); -if (ret >126 ) +if (ret >USB_MAX_STRING_LEN )return -EOVERFLOW ; str =kstrdup (s,GFP_KERNEL );
drivers/usb/gadget/usbstring.c +2 -2
@@ -55,9 +55,9 @@ usb_gadget_get_string (const struct usb_return -EINVAL ;/* string descriptors have length, tag, then UTF16-LE text */ - len =min ((size_t )126 ,strlen (s->s)); + len =min ((size_t )USB_MAX_STRING_LEN ,strlen (s->s)); len =utf8s_to_utf16s (s->s, len,UTF16_LITTLE_ENDIAN , - (wchar_t *) &buf[2 ],126 ); + (wchar_t *) &buf[2 ],USB_MAX_STRING_LEN );if (len <0 )return -EINVAL ; buf [0 ] = (len +1 ) *2 ;
include/uapi/linux/usb/ch9.h +3 -0
@@ -364,6 +364,9 @@ struct usb_config_descriptor {/*-------------------------------------------------------------------------*/ +/* USB String descriptors can contain at most 126 characters. */ +#define USB_MAX_STRING_LEN 126 +/* USB_DT_STRING: String descriptor */ struct usb_string_descriptor {__u8 bLength;
Greg Kroah-Hartman
maintainerPATCH 37/60 usb: gadget: configfs: Fix KASAN use-after-free
In reply to Greg Kroah-HartmanFrom: Jim Lin <[email protected]>
commit 98f153a10da403ddd5e9d98a3c8c2bb54bb5a0b6 upstream.
When gadget is disconnected, running sequence is like this. . composite_disconnect
. Call trace:
usb_string_copy+0xd0/0x128 gadget_config_name_configuration_store+0x4 gadget_config_name_attr_store+0x40/0x50 configfs_write_file+0x198/0x1f4 vfs_write+0x100/0x220 SyS_write+0x58/0xa8
. configfs_composite_unbind
. configfs_composite_bind
In configfs_composite_bind, it has
"cn->strings.s = cn->configuration;"
When usb_string_copy is invoked. it would
allocate memory, copy input string, release previous pointed memory space, and use new allocated memory.
When gadget is connected, host sends down request to get information.
Call trace: usb_gadget_get_string+0xec/0x168 lookup_string+0x64/0x98 composite_setup+0xa34/0x1ee8
If gadget is disconnected and connected quickly, in the failed case, cn->configuration memory has been released by usb_string_copy kfree but configfs_composite_bind hasn't been run in time to assign new allocated "cn->configuration" pointer to "cn->strings.s".
When "strlen(s->s) of usb_gadget_get_string is being executed, the dangling memory is accessed, "BUG: KASAN: use-after-free" error occurs.
--- drivers/usb/gadget/configfs.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/usb/gadget/configfs.c +10 -4
@@ -109,6 +109,8 @@ struct gadget_config_name {struct list_head list; }; +#define USB_MAX_STRING_WITH_NULL_LEN (USB_MAX_STRING_LEN+1) +static int usb_string_copy (const char *s,char **s_copy) {int ret;
@@ -118,12 +120,16 @@ static int usb_string_copy(const char *sif (ret >USB_MAX_STRING_LEN )return -EOVERFLOW ; - str =kstrdup (s,GFP_KERNEL ); -if (!str) -return -ENOMEM ; +if (copy) { + str = copy; + }else { + str =kmalloc (USB_MAX_STRING_WITH_NULL_LEN ,GFP_KERNEL ); +if (!str) +return -ENOMEM ; + } +strcpy (str, s);if (str[ret -1 ] =='\n' ) str[ret -1 ] ='\0' ; -kfree (copy); *s_copy = str;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 38/60 usb: typec: tcpm: Invoke power_supply_changed for tcpm-source-psy-
In reply to Greg Kroah-HartmanFrom: Badhri Jagan Sridharan <[email protected]>
commit 86629e098a077922438efa98dc80917604dfd317 upstream.
tcpm-source-psy- does not invoke power_supply_changed API when one of the published power supply properties is changed. power_supply_changed needs to be called to notify userspace clients(uevents) and kernel clients.
--- drivers/usb/typec/tcpm/tcpm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/usb/typec/tcpm/tcpm.c +7 -1
@@ -739,6 +739,7 @@ static int tcpm_set_current_limit(struct port->supply_voltage = mv; port->current_limit = max_ma; +power_supply_changed (port->psy);if (port->tcpc->set_current_limit) ret = port->tcpc->set_current_limit (port->tcpc, max_ma, mv);
@@ -2138,6 +2139,7 @@ static int tcpm_pd_select_pdo(struct tcp port->pps_data.supported = false; port->usb_type =POWER_SUPPLY_USB_TYPE_PD ; +power_supply_changed (port->psy);/* * Select the source PDO providing the most power which has a
@@ -2162,6 +2164,7 @@ static int tcpm_pd_select_pdo(struct tcp port->pps_data.supported = true; port->usb_type =POWER_SUPPLY_USB_TYPE_PD_PPS ; +power_supply_changed (port->psy); }continue ;default :
@@ -2319,6 +2322,7 @@ static unsigned int tcpm_pd_select_pps_a port->pps_data.out_volt)); port->pps_data.op_curr =min (port->pps_data.max_curr, port->pps_data.op_curr); +power_supply_changed (port->psy); }return src_pdo;
@@ -2554,6 +2558,7 @@ static int tcpm_set_charge(struct tcpm_preturn ret; } port->vbus_charge = charge; +power_supply_changed (port->psy);return 0 ; }
@@ -4665,7 +4670,7 @@ static int tcpm_psy_set_prop(struct powe ret = -EINVAL ;break ; } - +power_supply_changed (port->psy);return ret; }
@@ -4816,6 +4821,7 @@ struct tcpm_port *tcpm_register_port(str err =devm_tcpm_psy_register (port);if (err) goto out_role_sw_put; +power_supply_changed (port->psy); port->typec_port =typec_register_port (port->dev, &port->typec_caps);if (IS_ERR (port->typec_port)) {
Greg Kroah-Hartman
maintainerPATCH 39/60 iio:adc:stm32-adc: Add HAS_IOMEM dependency
In reply to Greg Kroah-HartmanFrom: Jonathan Cameron <[email protected]>
commit 121875b28e3bd7519a675bf8ea2c2e793452c2bd upstream.
Seems that there are config combinations in which this driver gets enabled and hence selects the MFD, but with out HAS_IOMEM getting pulled in via some other route. MFD is entirely contained in an
if HAS_IOMEM block, leading to the build issue in this bugzilla.
https://bugzilla.kernel.org/show_bug.cgi?id=209889
--- drivers/iio/adc/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/iio/adc/Kconfig +1 -0
@@ -784,6 +784,7 @@ config STM32_ADC_CORE depends on ARCH_STM32 || COMPILE_TEST depends on OF depends on REGULATOR + depends on HAS_IOMEM select IIO_BUFFER select MFD_STM32_TIMERS select IIO_STM32_TIMER_TRIGGER
Greg Kroah-Hartman
maintainerPATCH 40/60 iio:adc:qcom-spmi-vadc: add default scale to LR_MUX2_BAT_ID channel
In reply to Greg Kroah-HartmanFrom: Jonathan Albrieux <[email protected]>
commit 7d200b283aa049fcda0d43dd6e03e9e783d2799c upstream.
Checking at both msm8909-pm8916.dtsi and msm8916.dtsi from downstream it is indicated that "batt_id" channel has to be scaled with the default function:
chan@31 {
label = "batt_id";
reg = <0x31>;
qcom,decimation = <0>;
qcom,pre-div-channel-scaling = <0>;
qcom,calibration-type = "ratiometric";
qcom,scale-function = <0>;
qcom,hw-settle-time = <0xb>;
qcom,fast-avg-setup = <0>;
};Change LR_MUX2_BAT_ID scaling accordingly.
--- drivers/iio/adc/qcom-spmi-vadc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/qcom-spmi-vadc.c +1 -1
@@ -598,7 +598,7 @@ static const struct vadc_channels vadc_c VADC_CHAN_NO_SCALE(P_MUX16_1_3, 1) VADC_CHAN_NO_SCALE(LR_MUX1_BAT_THERM, 0) - VADC_CHAN_NO_SCALE(LR_MUX2_BAT_ID, 0) + VADC_CHAN_VOLT(LR_MUX2_BAT_ID, 0, SCALE_DEFAULT) VADC_CHAN_NO_SCALE(LR_MUX3_XO_THERM, 0) VADC_CHAN_NO_SCALE(LR_MUX4_AMUX_THM1, 0)VADC_CHAN_NO_SCALE (LR_MUX5_AMUX_THM2 ,0 )
Greg Kroah-Hartman
maintainerPATCH 41/60 iio: adis16400: Fix an error code in adis16400_initial_setup()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit a71266e454b5df10d019b06f5ebacd579f76be28 upstream.
This is to silence a new Smatch warning:
drivers/iio/imu/adis16400.c:492 adis16400_initial_setup()
warn: sscanf doesn't return error codes
If the condition "if (st->variant->flags & ADIS16400_HAS_SLOW_MODE) {" is false then we return 1 instead of returning 0 and probe will fail.
--- drivers/iio/imu/adis16400.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/iio/imu/adis16400.c +1 -2
@@ -464,8 +464,7 @@ static int adis16400_initial_setup(strucif (ret) goto err_ret; - ret =sscanf (indio_dev->name,"adis%u\n" , &device_id); -if (ret !=1 ) { +if (sscanf (indio_dev->name,"adis%u\n" , &device_id) !=1 ) { ret = -EINVAL ; goto err_ret; }
Greg Kroah-Hartman
maintainerPATCH 42/60 iio: gyro: mpu3050: Fix error handling in mpu3050_trigger_handler
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
commit 6dbbbe4cfd398704b72b21c1d4a5d3807e909d60 upstream.
There is one regmap_bulk_read() call in mpu3050_trigger_handler that we have caught its return value bug lack further handling. Check and terminate the execution flow just like the other three regmap_bulk_read() calls in this function.
--- drivers/iio/gyro/mpu3050-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iio/gyro/mpu3050-core.c +2 -0
@@ -550,6 +550,8 @@ static irqreturn_t mpu3050_trigger_handlMPU3050_FIFO_R , &fifo_values[offset], toread); +if (ret) + goto out_trigger_unlock; dev_dbg(mpu3050->dev, "%04x %04x %04x %04x %04x\n",
Greg Kroah-Hartman
maintainerPATCH 43/60 iio: adc: ad7949: fix wrong ADC result due to incorrect bit mask
In reply to Greg Kroah-HartmanFrom: Wilfried Wessner <[email protected]>
commit f890987fac8153227258121740a9609668c427f3 upstream.
Fixes a wrong bit mask used for the ADC's result, which was caused by an improper usage of the GENMASK() macro. The bits higher than ADC's resolution are undefined and if not masked out correctly, a wrong result can be given. The GENMASK() macro indexing is zero based, so the mask has to go from [resolution - 1 , 0].
--- drivers/iio/adc/ad7949.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/ad7949.c +1 -1
@@ -91,7 +91,7 @@ static int ad7949_spi_read_channel(strucint ret;int i;int bits_per_word = ad7949_adc->resolution; -int mask =GENMASK (ad7949_adc->resolution,0 ); +int mask =GENMASK (ad7949_adc->resolution -1 ,0 );struct spi_message msg;struct spi_transfer tx[] = { {
Greg Kroah-Hartman
maintainerPATCH 44/60 iio: hid-sensor-humidity: Fix alignment issue of timestamp channel
In reply to Greg Kroah-HartmanFrom: Ye Xiang <[email protected]>
commit 37e89e574dc238a4ebe439543c5ab4fbb2f0311b upstream.
This patch ensures that, there is sufficient space and correct alignment for the timestamp.
--- drivers/iio/humidity/hid-sensor-humidity.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/iio/humidity/hid-sensor-humidity.c +7 -5
@@ -17,7 +17,10 @@struct hid_humidity_state {struct hid_sensor_common common_attributes;struct hid_sensor_hub_attribute_info humidity_attr; -s32 humidity_data; +struct { +s32 humidity_data; +u64 timestamp__aligned(8) ; + } scan;int scale_pre_decml;int scale_post_decml;int scale_precision;
@@ -127,9 +130,8 @@ static int humidity_proc_event(struct histruct hid_humidity_state *humid_st =iio_priv (indio_dev);if (atomic_read (&humid_st->common_attributes.data_ready)) -iio_push_to_buffers_with_timestamp (indio_dev, - &humid_st->humidity_data, -iio_get_time_ns (indio_dev)); +iio_push_to_buffers_with_timestamp (indio_dev, &humid_st->scan, +iio_get_time_ns (indio_dev));return 0 ; }
@@ -144,7 +146,7 @@ static int humidity_capture_sample(strucswitch (usage_id) {case HID_USAGE_SENSOR_ATMOSPHERIC_HUMIDITY : - humid_st->humidity_data = *(s32 *)raw_data; + humid_st->scan.humidity_data = *(s32 *)raw_data;return 0 ;default :
Greg Kroah-Hartman
maintainerPATCH 45/60 iio: hid-sensor-prox: Fix scale not correct issue
In reply to Greg Kroah-HartmanFrom: Ye Xiang <[email protected]>
commit d68c592e02f6f49a88e705f13dfc1883432cf300 upstream.
Currently, the proxy sensor scale is zero because it just return the exponent directly. To fix this issue, this patch use hid_sensor_format_scale to process the scale first then return the output.
--- drivers/iio/light/hid-sensor-prox.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/iio/light/hid-sensor-prox.c +11 -2
@@ -25,6 +25,9 @@ struct prox_state {struct hid_sensor_common common_attributes;struct hid_sensor_hub_attribute_info prox_attr;u32 human_presence; +int scale_pre_decml; +int scale_post_decml; +int scale_precision; };/* Channel definitions */
@@ -95,8 +98,9 @@ static int prox_read_raw(struct iio_dev ret_type =IIO_VAL_INT ;break ;case IIO_CHAN_INFO_SCALE : - *val = prox_state->prox_attr.units; - ret_type =IIO_VAL_INT ; + *val = prox_state->scale_pre_decml; + *val2 = prox_state->scale_post_decml; + ret_type = prox_state->scale_precision;break ;case IIO_CHAN_INFO_OFFSET : *val = hid_sensor_convert_exponent(
@@ -236,6 +240,11 @@ static int prox_parse_report(struct platHID_USAGE_SENSOR_HUMAN_PRESENCE , &st->common_attributes.sensitivity); + st->scale_precision =hid_sensor_format_scale ( + hsdev->usage, + &st->prox_attr, + &st->scale_pre_decml, &st->scale_post_decml); +return ret; }
Greg Kroah-Hartman
maintainerPATCH 46/60 iio: hid-sensor-temperature: Fix issues of timestamp channel
In reply to Greg Kroah-HartmanFrom: Ye Xiang <[email protected]>
commit 141e7633aa4d2838d1f6ad5c74cccc53547c16ac upstream.
This patch fixes 2 issues of timestamp channel:
1. This patch ensures that there is sufficient space and correct alignment for the timestamp.
2. Correct the timestamp channel scan index.
--- drivers/iio/temperature/hid-sensor-temperature.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/iio/temperature/hid-sensor-temperature.c +8 -6
@@ -17,7 +17,10 @@struct temperature_state {struct hid_sensor_common common_attributes;struct hid_sensor_hub_attribute_info temperature_attr; -s32 temperature_data; +struct { +s32 temperature_data; +u64 timestamp__aligned(8) ; + } scan;int scale_pre_decml;int scale_post_decml;int scale_precision;
@@ -34,7 +37,7 @@ static const struct iio_chan_spec temper BIT(IIO_CHAN_INFO_SAMP_FREQ) | BIT(IIO_CHAN_INFO_HYSTERESIS), }, - IIO_CHAN_SOFT_TIMESTAMP(3), + IIO_CHAN_SOFT_TIMESTAMP(1), };/* Adjust channel real bits based on report descriptor */
@@ -125,9 +128,8 @@ static int temperature_proc_event(structstruct temperature_state *temp_st =iio_priv (indio_dev);if (atomic_read (&temp_st->common_attributes.data_ready)) -iio_push_to_buffers_with_timestamp (indio_dev, - &temp_st->temperature_data, -iio_get_time_ns (indio_dev)); +iio_push_to_buffers_with_timestamp (indio_dev, &temp_st->scan, +iio_get_time_ns (indio_dev));return 0 ; }
@@ -142,7 +144,7 @@ static int temperature_capture_sample(stswitch (usage_id) {case HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE : - temp_st->temperature_data = *(s32 *)raw_data; + temp_st->scan.temperature_data = *(s32 *)raw_data;return 0 ;default :return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 47/60 counter: stm32-timer-cnt: fix ceiling write max value
In reply to Greg Kroah-HartmanFrom: Fabrice Gasnier <[email protected]>
commit e4c3e133294c0a292d21073899b05ebf530169bd upstream.
The ceiling value isn't checked before writing it into registers. The user could write a value higher than the counter resolution (e.g. 16 or 32 bits indicated by max_arr). This makes most significant bits to be truncated. Fix it by checking the max_arr to report a range error [1] to the user.
[1] https://lkml.org/lkml/2021/2/12/358
--- drivers/counter/stm32-timer-cnt.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/counter/stm32-timer-cnt.c +5 -0
@@ -25,6 +25,7 @@ struct stm32_timer_cnt {struct regmap *regmap;struct clk *clk;u32 ceiling; +u32 max_arr; };/**
@@ -189,6 +190,9 @@ static ssize_t stm32_count_ceiling_writeif (ret)return ret; +if (ceiling > priv->max_arr) +return -ERANGE ; +/* TIMx_ARR register shouldn't be buffered (ARPE=0) */ regmap_update_bits (priv->regmap,TIM_CR1 ,TIM_CR1_ARPE ,0 );regmap_write (priv->regmap,TIM_ARR , ceiling);
@@ -366,6 +370,7 @@ static int stm32_timer_cnt_probe(struct priv->regmap = ddata->regmap; priv->clk = ddata->clk; priv->ceiling = ddata->max_arr; + priv->max_arr = ddata->max_arr; priv->counter.name =dev_name (dev); priv->counter.parent = dev;
Greg Kroah-Hartman
maintainerPATCH 48/60 PCI: rpadlpar: Fix potential drc_name corruption in store functions
In reply to Greg Kroah-HartmanFrom: Tyrel Datwyler <[email protected]>
commit cc7a0bb058b85ea03db87169c60c7cfdd5d34678 upstream.
Both add_slot_store() and remove_slot_store() try to fix up the drc_name copied from the store buffer by placing a NUL terminator at nbyte + 1 or in place of a '\n' if present. However, the static buffer that we copy the drc_name data into is not zeroed and can contain anything past the n-th byte.
This is problematic if a '\n' byte appears in that buffer after nbytes and the string copied into the store buffer was not NUL terminated to start with as the strchr() search for a '\n' byte will mark this incorrectly as the end of the drc_name string resulting in a drc_name string that contains garbage data after the n-th byte.
Additionally it will cause us to overwrite that '\n' byte on the stack with NUL, potentially corrupting data on the stack.
The following debugging shows an example of the drmgr utility writing "PHB 4543" to the add_slot sysfs attribute, but add_slot_store() logging a corrupted string value.
drmgr: drmgr: -c phb -a -s PHB 4543 -d 1
add_slot_store: drc_name = PHB 4543°|<82>!, rc = -19
Fix this by using strscpy() instead of memcpy() to ensure the string is NUL terminated when copied into the static drc_name buffer. Further, since the string is now NUL terminated the code only needs to change '\n' to '\0' when present.
--- drivers/pci/hotplug/rpadlpar_sysfs.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
drivers/pci/hotplug/rpadlpar_sysfs.c +6 -8
@@ -34,12 +34,11 @@ static ssize_t add_slot_store(struct kobif (nbytes >=MAX_DRC_NAME_LEN )return 0 ; -memcpy (drc_name, buf, nbytes); +strscpy (drc_name, buf, nbytes +1 ); end =strchr (drc_name,'\n' ); -if (!end) - end = &drc_name[nbytes]; - *end ='\0' ; +if (end) + *end ='\0' ; rc =dlpar_add_slot (drc_name);if (rc)
@@ -65,12 +64,11 @@ static ssize_t remove_slot_store(structif (nbytes >=MAX_DRC_NAME_LEN )return 0 ; -memcpy (drc_name, buf, nbytes); +strscpy (drc_name, buf, nbytes +1 ); end =strchr (drc_name,'\n' ); -if (!end) - end = &drc_name[nbytes]; - *end ='\0' ; +if (end) + *end ='\0' ; rc =dlpar_remove_slot (drc_name);if (rc)
Greg Kroah-Hartman
maintainerPATCH 49/60 perf/x86/intel: Fix a crash caused by zero PEBS status
In reply to Greg Kroah-HartmanFrom: Kan Liang <[email protected]>
commit d88d05a9e0b6d9356e97129d4ff9942d765f46ea upstream.
A repeatable crash can be triggered by the perf_fuzzer on some Haswell system.
https://lore.kernel.org/lkml/[email protected]/
For some old CPUs (HSW and earlier), the PEBS status in a PEBS record may be mistakenly set to 0. To minimize the impact of the defect, the commit was introduced to try to avoid dropping the PEBS record for some cases. It adds a check in the intel_pmu_drain_pebs_nhm(), and updates the local pebs_status accordingly. However, it doesn't correct the PEBS status in the PEBS record, which may trigger the crash, especially for the large PEBS.
It's possible that all the PEBS records in a large PEBS have the PEBS status 0. If so, the first get_next_pebs_record_by_bit() in the __intel_pmu_pebs_event() returns NULL. The at = NULL. Since it's a large PEBS, the 'count' parameter must > 1. The second get_next_pebs_record_by_bit() will crash.
Besides the local pebs_status, correct the PEBS status in the PEBS record as well.
--- arch/x86/events/intel/ds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/events/intel/ds.c +1 -1
@@ -1890,7 +1890,7 @@ static void intel_pmu_drain_pebs_nhm(str*/ if (!pebs_status && cpuc->pebs_enabled && !(cpuc->pebs_enabled & (cpuc->pebs_enabled-1 ))) - pebs_status = cpuc->pebs_enabled; + pebs_status = p->status = cpuc->pebs_enabled; bit =find_first_bit ((unsigned long *)&pebs_status, x86_pmu.max_pebs_events);
Greg Kroah-Hartman
maintainerPATCH 50/60 x86/ioapic: Ignore IRQ2 again
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
commit a501b048a95b79e1e34f03cac3c87ff1e9f229ad upstream.
Vitaly ran into an issue with hotplugging CPU0 on an Amazon instance where the matrix allocator claimed to be out of vectors. He analyzed it down to the point that IRQ2, the PIC cascade interrupt, which is supposed to be not ever routed to the IO/APIC ended up having an interrupt vector assigned which got moved during unplug of CPU0.
The underlying issue is that IRQ2 for various reasons (see commit af174783b925 ("x86: I/O APIC: Never configure IRQ2" for details) is treated as a reserved system vector by the vector core code and is not accounted as a regular vector. The Amazon BIOS has an routing entry of pin2 to IRQ2 which causes the IO/APIC setup to claim that interrupt which is granted by the vector domain because there is no sanity check. As a consequence the allocation counter of CPU0 underflows which causes a subsequent unplug to fail with:
[ ... ] CPU 0 has 4294967295 vectors, 589 available. Cannot disable CPU
There is another sanity check missing in the matrix allocator, but the underlying root cause is that the IO/APIC code lost the IRQ2 ignore logic during the conversion to irqdomains.
For almost 6 years nobody complained about this wreckage, which might indicate that this requirement could be lifted, but for any system which actually has a PIC IRQ2 is unusable by design so any routing entry has no effect and the interrupt cannot be connected to a device anyway.
Due to that and due to history biased paranoia reasons restore the IRQ2 ignore logic and treat it as non existent despite a routing entry claiming otherwise.
--- arch/x86/kernel/apic/io_apic.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
arch/x86/kernel/apic/io_apic.c +10 -0
@@ -1046,6 +1046,16 @@ static int mp_map_pin_to_irq(u32 gsi, inif (idx >=0 &&test_bit (mp_irqs[idx].srcbus, mp_bus_not_pci)) { irq = mp_irqs[idx].srcbusirq; legacy =mp_is_legacy_irq (irq); +/* +* IRQ2 is unusable for historical reasons on systems which +* have a legacy PIC. See the comment vs. IRQ2 further down. +* +* If this gets removed at some point then the related code +* in lapic_assign_system_vectors() needs to be adjusted as +* well. +*/ +if (legacy && irq ==PIC_CASCADE_IR ) +return -EINVAL ; }mutex_lock (&ioapic_mutex);
Greg Kroah-Hartman
maintainerPATCH 51/60 kernel, fs: Introduce and use set_restart_fn() and arch_set_restart_data()
In reply to Greg Kroah-HartmanFrom: Oleg Nesterov <[email protected]>
commit 5abbe51a526253b9f003e9a0a195638dc882d660 upstream.
Preparation for fixing get_nr_restart_syscall() on X86 for COMPAT.
Add a new helper which sets restart_block->fn and calls a dummy arch_set_restart_data() helper.
--- fs/select.c | 10 ++++------ include/linux/thread_info.h | 13 +++++++++++++ kernel/futex.c | 3 +-- kernel/time/alarmtimer.c | 2 +- kernel/time/hrtimer.c | 2 +- kernel/time/posix-cpu-timers.c | 2 +- 6 files changed, 21 insertions(+), 11 deletions(-)
fs/select.c +4 -6
@@ -1037,10 +1037,9 @@ static long do_restart_poll(struct resta ret =do_sys_poll (ufds, nfds, to); -if (ret == -ERESTARTNOHAND ) { - restart_block->fn = do_restart_poll; - ret = -ERESTART_RESTARTBLOCK ; - } +if (ret == -ERESTARTNOHAND ) + ret =set_restart_fn (restart_block, do_restart_poll); +return ret; }
@@ -1062,7 +1061,6 @@ SYSCALL_DEFINE3(poll, struct pollfd __usstruct restart_block *restart_block; restart_block = ¤t->restart_block; - restart_block->fn = do_restart_poll; restart_block->poll.ufds = ufds; restart_block->poll.nfds = nfds;
@@ -1073,7 +1071,7 @@ SYSCALL_DEFINE3(poll, struct pollfd __us }else restart_block->poll.has_timeout =0 ; - ret = -ERESTART_RESTARTBLOCK ; + ret =set_restart_fn (restart_block, do_restart_poll); }return ret; }
include/linux/thread_info.h +13 -0
@@ -11,6 +11,7 @@#include <linux/types.h> #include <linux/bug.h> #include <linux/restart_block.h> +#include <linux/errno.h> #ifdef CONFIG_THREAD_INFO_IN_TASK /*
@@ -39,6 +40,18 @@ enum {#ifdef __KERNEL__ +#ifndef arch_set_restart_data +#define arch_set_restart_data (restart) do { } while (0) +#endif + +static inline long set_restart_fn (struct restart_block *restart, +long (*fn)(struct restart_block *)) +{ + restart->fn = fn; +arch_set_restart_data (restart); +return -ERESTART_RESTARTBLOCK ; +} +#ifndef THREAD_ALIGN #define THREAD_ALIGN THREAD_SIZE#endif
kernel/futex.c +1 -2
@@ -2865,14 +2865,13 @@ retry: goto out; restart = ¤t->restart_block; - restart->fn = futex_wait_restart; restart->futex.uaddr = uaddr; restart->futex.val = val; restart->futex.time = *abs_time; restart->futex.bitset = bitset; restart->futex.flags = flags |FLAGS_HAS_TIMEOUT ; - ret = -ERESTART_RESTARTBLOCK ; + ret =set_restart_fn (restart, futex_wait_restart); out:if (to) {
kernel/time/alarmtimer.c +1 -1
@@ -838,9 +838,9 @@ static int alarm_timer_nsleep(const clocif (flags ==TIMER_ABSTIME )return -ERESTARTNOHAND ; - restart->fn = alarm_timer_nsleep_restart; restart->nanosleep.clockid = type; restart->nanosleep.expires = exp; +set_restart_fn (restart, alarm_timer_nsleep_restart);return ret; }
kernel/time/hrtimer.c +1 -1
@@ -1953,9 +1953,9 @@ long hrtimer_nanosleep(const struct time } restart = ¤t->restart_block; - restart->fn = hrtimer_nanosleep_restart; restart->nanosleep.clockid = t.timer.base->clockid; restart->nanosleep.expires =hrtimer_get_expires_tv64 (&t.timer); +set_restart_fn (restart, hrtimer_nanosleep_restart); out:destroy_hrtimer_on_stack (&t.timer);return ret;
kernel/time/posix-cpu-timers.c +1 -1
@@ -1335,8 +1335,8 @@ static int posix_cpu_nsleep(const clockiif (flags &TIMER_ABSTIME )return -ERESTARTNOHAND ; - restart_block->fn = posix_cpu_nsleep_restart; restart_block->nanosleep.clockid = which_clock; +set_restart_fn (restart_block, posix_cpu_nsleep_restart); }return error; }
Greg Kroah-Hartman
maintainerPATCH 52/60 x86: Move TS_COMPAT back to asm/thread_info.h
In reply to Greg Kroah-HartmanFrom: Oleg Nesterov <[email protected]>
commit 66c1b6d74cd7035e85c426f0af4aede19e805c8a upstream.
Move TS_COMPAT back to asm/thread_info.h, close to TS_I386_REGS_POKED.
It was moved to asm/processor.h by b9d989c7218a ("x86/asm: Move the thread_info::status field to thread_struct"), then later 37a8f7c38339 ("x86/asm: Move 'status' from thread_struct to thread_info") moved the 'status' field back but TS_COMPAT was forgotten.
Preparatory patch to fix the COMPAT case for get_nr_restart_syscall()
--- arch/x86/include/asm/processor.h | 9 --------- arch/x86/include/asm/thread_info.h | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-)
arch/x86/include/asm/processor.h +0 -9
@@ -507,15 +507,6 @@ static inline void arch_thread_struct_wh }/* -* Thread-synchronous status. -* -* This is different from the flags in that nobody else -* ever touches our thread-synchronous status, so we don't -* have to worry about atomic accesses. -*/ -#define TS_COMPAT 0x0002/* 32bit syscall active (64BIT)*/ - -/* * Set IOPL bits in EFLAGS from given mask */ static inline void native_set_iopl_mask (unsigned mask)
arch/x86/include/asm/thread_info.h +9 -0
@@ -221,6 +221,15 @@ static inline int arch_within_stack_fram#endif +/* +* Thread-synchronous status. +* +* This is different from the flags in that nobody else +* ever touches our thread-synchronous status, so we don't +* have to worry about atomic accesses. +*/ +#define TS_COMPAT 0x0002/* 32bit syscall active (64BIT)*/ +#ifdef CONFIG_COMPAT #define TS_I386_REGS_POKED 0x0004/* regs poked by 32-bit ptracer */ #endif
Greg Kroah-Hartman
maintainerPATCH 53/60 x86: Introduce TS_COMPAT_RESTART to fix get_nr_restart_syscall()
In reply to Greg Kroah-HartmanFrom: Oleg Nesterov <[email protected]>
commit 8c150ba2fb5995c84a7a43848250d444a3329a7d upstream.
The comment in get_nr_restart_syscall() says:
* The problem is that we can get here when ptrace pokes
* syscall-like values into regs even if we're not in a syscall
* at all.
Yes, but if not in a syscall then the
status & (TS_COMPAT|TS_I386_REGS_POKED)
check below can't really help:
- TS_COMPAT can't be set
- TS_I386_REGS_POKED is only set if regs->orig_ax was changed by 32bit debugger; and even in this case get_nr_restart_syscall() is only correct if the tracee is 32bit too.
Suppose that a 64bit debugger plays with a 32bit tracee and
* Tracee calls sleep(2) // TS_COMPAT is set
* User interrupts the tracee by CTRL-C after 1 sec and does "(gdb) call func()"
* gdb saves the regs by PTRACE_GETREGS
* does PTRACE_SETREGS to set %rip='func' and %orig_rax=-1
* PTRACE_CONT // TS_COMPAT is cleared
* func() hits int3.
* Debugger catches SIGTRAP.
* Restore original regs by PTRACE_SETREGS.
* PTRACE_CONT
get_nr_restart_syscall() wrongly returns __NR_restart_syscall==219, the tracee calls ia32_sys_call_table[219] == sys_madvise.
Add the sticky TS_COMPAT_RESTART flag which survives after return to user mode. It's going to be removed in the next step again by storing the information in the restart block. As a further cleanup it might be possible to remove also TS_I386_REGS_POKED with that.
Test-case:
$ cvs -d :pserver:anoncvs:[email protected]:/cvs/systemtap co ptrace-tests $ gcc -o erestartsys-trap-debuggee ptrace-tests/tests/erestartsys-trap-debuggee.c --m32 $ gcc -o erestartsys-trap-debugger ptrace-tests/tests/erestartsys-trap-debugger.c -lutil $ ./erestartsys-trap-debugger Unexpected: retval 1, errno 22 erestartsys-trap-debugger: ptrace-tests/tests/erestartsys-trap-debugger.c:421
--- arch/x86/include/asm/thread_info.h | 14 +++++++++++++- arch/x86/kernel/signal.c | 24 +----------------------- 2 files changed, 14 insertions(+), 24 deletions(-)
arch/x86/include/asm/thread_info.h +13 -1
@@ -230,10 +230,22 @@ static inline int arch_within_stack_fram*/ #define TS_COMPAT 0x0002/* 32bit syscall active (64BIT)*/ +#ifndef __ASSEMBLY__#ifdef CONFIG_COMPAT #define TS_I386_REGS_POKED 0x0004/* regs poked by 32-bit ptracer */ +#define TS_COMPAT_RESTART 0x0008 + +#define arch_set_restart_data arch_set_restart_data + +static inline void arch_set_restart_data (struct restart_block *restart) +{ +struct thread_info *ti =current_thread_info (); +if (ti->status &TS_COMPAT ) + ti->status |=TS_COMPAT_RESTART ; +else + ti->status &= ~TS_COMPAT_RESTART ; +}#endif -#ifndef __ASSEMBLY__#ifdef CONFIG_X86_32 #define in_ia32_syscall () true
arch/x86/kernel/signal.c +1 -23
@@ -770,30 +770,8 @@ handle_signal(struct ksignal *ksig, strustatic inline unsigned long get_nr_restart_syscall (const struct pt_regs *regs) { -/* -* This function is fundamentally broken as currently -* implemented. -* -* The idea is that we want to trigger a call to the -* restart_block() syscall and that we want in_ia32_syscall(), -* in_x32_syscall(), etc. to match whatever they were in the -* syscall being restarted. We assume that the syscall -* instruction at (regs->ip - 2) matches whatever syscall -* instruction we used to enter in the first place. -* -* The problem is that we can get here when ptrace pokes -* syscall-like values into regs even if we're not in a syscall -* at all. -* -* For now, we maintain historical behavior and guess based on -* stored state. We could do better by saving the actual -* syscall arch in restart_block or (with caveats on x32) by -* checking if regs->ip points to 'int $0x80'. The current -* behavior is incorrect if a tracer has a different bitness -* than the tracee. -*/ #ifdef CONFIG_IA32_EMULATION -if (current_thread_info ()->status & (TS_COMPAT |TS_I386_REGS_POKED )) +if (current_thread_info ()->status &TS_COMPAT_RESTART )return __NR_ia32_restart_syscall;#endif #ifdef CONFIG_X86_X32_ABI
Greg Kroah-Hartman
maintainerPATCH 54/60 ext4: find old entry again if failed to rename whiteout
In reply to Greg Kroah-HartmanFrom: zhangyi (F) <[email protected]>
commit b7ff91fd030dc9d72ed91b1aab36e445a003af4f upstream.
If we failed to add new entry on rename whiteout, we cannot reset the old->de entry directly, because the old->de could have moved from under us during make indexed dir. So find the old entry again before reset is needed, otherwise it may corrupt the filesystem as below.
/dev/sda: Entry '00000001' in ??? (12) has deleted/unused inode 15. CLEARED. /dev/sda: Unattached inode 75
/dev/sda: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
--- fs/ext4/namei.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
fs/ext4/namei.c +27 -2
@@ -3547,6 +3547,31 @@ static int ext4_setent(handle_t *handle,return 0 ; } +static void ext4_resetent (handle_t *handle,struct ext4_renament *ent, +unsigned ino,unsigned file_type) +{ +struct ext4_renament old = *ent; +int retval =0 ; + +/* +* old->de could have moved from under us during make indexed dir, +* so the old->de may no longer valid and need to find it again +* before reset old inode info. +*/ + old.bh =ext4_find_entry (old.dir, &old.dentry->d_name, &old.de,NULL ); +if (IS_ERR (old.bh)) + retval =PTR_ERR (old.bh); +if (!old.bh) + retval = -ENOENT ; +if (retval) { +ext4_std_error (old.dir->i_sb, retval); +return ; + } + +ext4_setent (handle, &old, ino, file_type); +brelse (old.bh); +} +static int ext4_find_delete_entry (handle_t *handle,struct inode *dir,const struct qstr *d_name) {
@@ -3843,8 +3868,8 @@ static int ext4_rename(struct inode *old end_rename:if (whiteout) {if (retval) { -ext4_setent (handle, &old, - old.inode->i_ino, old_file_type); +ext4_resetent (handle, &old, + old.inode->i_ino, old_file_type);drop_nlink (whiteout); }unlock_new_inode (whiteout);
Greg Kroah-Hartman
maintainerPATCH 55/60 ext4: do not try to set xattr into ea_inode if value is empty
In reply to Greg Kroah-HartmanFrom: zhangyi (F) <[email protected]>
commit 6b22489911b726eebbf169caee52fea52013fbdd upstream.
Syzbot report a warning that ext4 may create an empty ea_inode if set an empty extent attribute to a file on the file system which is no free blocks left.
WARNING: CPU: 6 PID: 10667 at fs/ext4/xattr.c:1640 ext4_xattr_set_entry+0x10f8/0x1114 fs/ext4/xattr.c:1640 ... Call trace: ext4_xattr_set_entry+0x10f8/0x1114 fs/ext4/xattr.c:1640 ext4_xattr_block_set+0x1d0/0x1b1c fs/ext4/xattr.c:1942 ext4_xattr_set_handle+0x8a0/0xf1c fs/ext4/xattr.c:2390 ext4_xattr_set+0x120/0x1f0 fs/ext4/xattr.c:2491 ext4_xattr_trusted_set+0x48/0x5c fs/ext4/xattr_trusted.c:37 __vfs_setxattr+0x208/0x23c fs/xattr.c:177 ...
Now, ext4 try to store extent attribute into an external inode if ext4_xattr_block_set() return -ENOSPC, but for the case of store an empty extent attribute, store the extent entry into the extent attribute block is enough. A simple reproduce below.
fallocate test.img -l 1M
mkfs.ext4 -F -b 2048 -O ea_inode test.img
mount test.img /mnt
dd if=/dev/zero of=/mnt/foo bs=2048 count=500
setfattr -n "user.test" /mnt/foo
--- fs/ext4/xattr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/xattr.c +1 -1
@@ -2415,7 +2415,7 @@ retry_inode:* external inode if possible. */ if (ext4_has_feature_ea_inode (inode->i_sb) && - !i.in_inode) { + i.value_len && !i.in_inode) { i.in_inode =1 ; goto retry_inode; }
Greg Kroah-Hartman
maintainerPATCH 56/60 ext4: fix potential error in ext4_do_update_inode
In reply to Greg Kroah-HartmanFrom: Shijie Luo <[email protected]>
commit 7d8bd3c76da1d94b85e6c9b7007e20e980bfcfe6 upstream.
If set_large_file = 1 and errors occur in ext4_handle_dirty_metadata(), the error code will be overridden, go to out_brelse to avoid this situation.
--- fs/ext4/inode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
fs/ext4/inode.c +4 -4
@@ -5267,7 +5267,7 @@ static int ext4_do_update_inode(handle_tstruct ext4_inode_info *ei =EXT4_I (inode);struct buffer_head *bh = iloc->bh;struct super_block *sb = inode->i_sb; -int err =0 , rc, block; +int err =0 , block;int need_datasync =0 , set_large_file =0 ;uid_t i_uid;gid_t i_gid;
@@ -5379,9 +5379,9 @@ static int ext4_do_update_inode(handle_t bh->b_data);BUFFER_TRACE (bh,"call ext4_handle_dirty_metadata" ); - rc =ext4_handle_dirty_metadata (handle,NULL , bh); -if (!err) - err = rc; + err =ext4_handle_dirty_metadata (handle,NULL , bh); +if (err) + goto out_brelse;ext4_clear_inode_state (inode,EXT4_STATE_NEW );if (set_large_file) {BUFFER_TRACE (EXT4_SB (sb)->s_sbh,"get write access" );
Greg Kroah-Hartman
maintainerPATCH 57/60 efi: use 32-bit alignment for efi_guid_t literals
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
commit fb98cc0b3af2ba4d87301dff2b381b12eee35d7d upstream.
Commit 494c704f9af0 ("efi: Use 32-bit alignment for efi_guid_t") updated the type definition of efi_guid_t to ensure that it always appears sufficiently aligned (the UEFI spec is ambiguous about this, but given the fact that its EFI_GUID type is defined in terms of a struct carrying a uint32_t, the natural alignment is definitely >= 32 bits).
However, we missed the EFI_GUID() macro which is used to instantiate efi_guid_t literals: that macro is still based on the guid_t type, which does not have a minimum alignment at all. This results in warnings such as
In file included from drivers/firmware/efi/mokvar-table.c:35:
include/linux/efi.h:1093:34: warning: passing 1-byte aligned argument to
4-byte aligned parameter 2 of 'get_var' may result in an unaligned pointer access [-Walign-mismatch]
status = get_var(L"SecureBoot", &EFI_GLOBAL_VARIABLE_GUID, NULL, &size,
^
include/linux/efi.h:1101:24: warning: passing 1-byte aligned argument to
4-byte aligned parameter 2 of 'get_var' may result in an unaligned pointer access [-Walign-mismatch]
get_var(L"SetupMode", &EFI_GLOBAL_VARIABLE_GUID, NULL, &size, &setupmode);
The distinction only matters on CPUs that do not support misaligned loads fully, but 32-bit ARM's load-multiple instructions fall into that category, and these are likely to be emitted by the compiler that built the firmware for loading word-aligned 128-bit GUIDs from memory
So re-implement the initializer in terms of our own efi_guid_t type, so that the alignment becomes a property of the literal's type.
--- include/linux/efi.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
include/linux/efi.h +4 -2
@@ -63,8 +63,10 @@ typedef void *efi_handle_t;*/ typedef guid_t efi_guid_t __aligned(__alignof__(u32)) ; -#define EFI_GUID (a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \ - GUID_INIT(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) +#define EFI_GUID(a, b, c, d...) (efi_guid_t){ { \ + (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ + (b) & 0xff, ((b) >> 8) & 0xff, \ + (c) & 0xff, ((c) >> 8) & 0xff, d } }/* * Generic EFI table header
Greg Kroah-Hartman
maintainerPATCH 58/60 firmware/efi: Fix a use after bug in efi_mem_reserve_persistent
In reply to Greg Kroah-HartmanFrom: Lv Yunlong <[email protected]>
commit 9ceee7d0841a8f7d7644021ba7d4cc1fbc7966e3 upstream.
In the for loop in efi_mem_reserve_persistent(), prsv = rsv->next use the unmapped rsv. Use the unmapped pages will cause segment fault.
--- drivers/firmware/efi/efi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/firmware/efi/efi.c +2 -1
@@ -1006,7 +1006,7 @@ int __ref efi_mem_reserve_persistent(phy }/* first try to find a slot in an existing linked list entry */ -for (prsv = efi_memreserve_root->next; prsv; prsv = rsv->next) { +for (prsv = efi_memreserve_root->next; prsv; ) { rsv =memremap (prsv,sizeof (*rsv),MEMREMAP_WB ); index =atomic_fetch_add_unless (&rsv->count,1 , rsv->size);if (index < rsv->size) {
@@ -1016,6 +1016,7 @@ int __ref efi_mem_reserve_persistent(phymemunmap (rsv);return efi_mem_reserve_iomem (addr, size); } + prsv = rsv->next;memunmap (rsv); }
Greg Kroah-Hartman
maintainerPATCH 59/60 genirq: Disable interrupts for force threaded handlers
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
commit 81e2073c175b887398e5bca6c004efa89983f58d upstream.
With interrupt force threading all device interrupt handlers are invoked from kernel threads. Contrary to hard interrupt context the invocation only disables bottom halfs, but not interrupts. This was an oversight back then because any code like this will have an issue:
thread(irq_A)
irq_handler(A)
spin_lock(&foo->lock);
interrupt(irq_B)
irq_handler(B)
spin_lock(&foo->lock);
This has been triggered with networking (NAPI vs. hrtimers) and console drivers where printk() happens from an interrupt which interrupted the force threaded handler.
Now people noticed and started to change the spin_lock() in the handler to spin_lock_irqsave() which affects performance or add IRQF_NOTHREAD to the interrupt request which in turn breaks RT.
Fix the root cause and not the symptom and disable interrupts before invoking the force threaded handler which preserves the regular semantics and the usefulness of the interrupt force threading as a general debugging tool.
For not RT this is not changing much, except that during the execution of the threaded handler interrupts are delayed until the handler returns. Vs. scheduling and softirq processing there is no difference.
For RT kernels there is no issue.
--- kernel/irq/manage.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/irq/manage.c +4 -0
@@ -1026,11 +1026,15 @@ irq_forced_thread_fn(struct irq_desc *deirqreturn_t ret;local_bh_disable (); +if (!IS_ENABLED (CONFIG_PREEMPT_RT )) +local_irq_disable (); ret = action->thread_fn (action->irq, action->dev_id);if (ret ==IRQ_HANDLED )atomic_inc (&desc->threads_handled);irq_finalize_oneshot (desc, action); +if (!IS_ENABLED (CONFIG_PREEMPT_RT )) +local_irq_enable ();local_bh_enable ();return ret; }
Greg Kroah-Hartman
maintainerPATCH 60/60 x86/apic/of: Fix CPU devicetree-node lookups
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit dd926880da8dbbe409e709c1d3c1620729a94732 upstream.
Architectures that describe the CPU topology in devicetree and do not have an identity mapping between physical and logical CPU ids must override the default implementation of arch_match_cpu_phys_id().
Failing to do so breaks CPU devicetree-node lookups using of_get_cpu_node() and of_cpu_device_node_get() which several drivers rely on. It also causes the CPU struct devices exported through sysfs to point to the wrong devicetree nodes.
On x86, CPUs are described in devicetree using their APIC ids and those do not generally coincide with the logical ids, even if CPU0 typically uses APIC id 0.
Add the missing implementation of arch_match_cpu_phys_id() so that CPU-node lookups work also with SMP.
Apart from fixing the broken sysfs devicetree-node links this likely does not affect current users of mainline kernels on x86.
--- arch/x86/kernel/apic/apic.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/x86/kernel/apic/apic.c +5 -0
@@ -2354,6 +2354,11 @@ static int cpuid_to_apicid[] = { [0 ... NR_CPUS - 1] = -1, }; +bool arch_match_cpu_phys_id (int cpu,u64 phys_id) +{ +return phys_id == cpuid_to_apicid[cpu]; +} +#ifdef CONFIG_SMP /** * apic_id_is_primary_thread - Check whether APIC ID belongs to a primary thread
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.108 release. There are 60 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 Wed, 24 Mar 2021 12:19:09 +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.108-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 passing for Tegra ...
Test results for stable-v5.4:
12 builds: 12 pass, 0 fail
26 boots: 26 pass, 0 fail
66 tests: 66 pass, 0 failLinux version: 5.4.108-rc1-g5094cb203da7
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.108 release. There are 60 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 Wed, 24 Mar 2021 12:19:09 +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.108-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
On ARCH_BRCMSTB, using 32-bit and 64-bit ARM kernels:
Signature · 1 line
Florian
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.108 release. There are 60 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 Wed, 24 Mar 2021 12:19:09 +0000. Anything received after that time might be too late.
Build results:
total: 157 pass: 157 fail: 0 Qemu test results: total: 431 pass: 431 fail: 0
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.108 release. There are 60 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 Wed, 24 Mar 2021 12:19:09 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.108-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
Tested on arm64 and x86 for 5.4.107-rc1,
Kernel repo:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Branch: linux-5.4.y
Version: 5.4.107-rc1
Commit: 5094cb203da71ac5da8f1715dec97fe69fbfb326
Compiler: gcc version 7.3.0 (GCC)
arm64:
--------------------------------------------------------------------
Testcase Result Summary:
total: 4729
passed: 4729
failed: 0
timeout: 0
--------------------------------------------------------------------
x86:
--------------------------------------------------------------------
Testcase Result Summary:
total: 4729
passed: 4729
failed: 0
timeout: 0
--------------------------------------------------------------------
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.108 release. There are 60 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 Wed, 24 Mar 2021 12:19:09 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.108-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
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
Summary
------------------------------------------------------------------------
kernel: 5.4.108-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-5.4.y
git commit: 5094cb203da71ac5da8f1715dec97fe69fbfb326
git describe: v5.4.107-61-g5094cb203da7
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.4.y/build/v5.4.107-61-g5094cb203da7
No regressions (compared to build v5.4.107)
No fixes (compared to build v5.4.107)
Ran 60075 total tests in the following environments and test suites.
Environments
--------------
- arc
- arm
- arm64
- dragonboard-410c
- hi6220-hikey
- i386
- juno-r2
- juno-r2-compat
- juno-r2-kasan
- mips
- nxp-ls2088
- nxp-ls2088-64k_page_size
- parisc
- powerpc
- qemu-arm-clang
- qemu-arm-debug
- qemu-arm64-clang
- qemu-arm64-debug
- qemu-arm64-kasan
- qemu-i386-debug
- qemu-x86_64-clang
- qemu-x86_64-debug
- qemu-x86_64-kasan
- qemu-x86_64-kcsan
- qemu_arm
- qemu_arm64
- qemu_arm64-compat
- qemu_i386
- qemu_x86_64
- qemu_x86_64-compat
- riscv
- s390
- sh
- sparc
- x15
- x86
- x86-kasan
- x86_64
Test Suites
-----------
* build
* linux-log-parser
* install-android-platform-tools-r2600
* kselftest-android
* kselftest-bpf
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-lkdtm
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-zram
* libhugetlbfs
* ltp-cap_bounds-tests
* ltp-containers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-hugetlb-tests
* ltp-ipc-tests
* ltp-mm-tests
* ltp-sched-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* perf
* perf/Zstd-perf.data-compression
* v4l2-compliance
* fwts
* kselftest-net
* kselftest-netfilter
* kselftest-nsfs
* kselftest-rseq
* kselftest-tc-testing
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-io-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-securebits-tests
* network-basic-tests
* kselftest-kexec
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-vm
* kselftest-x86
* ltp-commands-tests
* ltp-controllers-tests
* ltp-cve-tests
* ltp-math-tests
* ltp-open-posix-tests
* kvm-unit-tests
* rcutorture
* igt-gpu-tools
* ssuite
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org