4.4.95-stable review
Greg Kroah-Hartman
maintainercover 4.4.95-stable review
This is the start of the stable review cycle for the 4.4.95 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Oct 26 12:57:00 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.95-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-4.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.95-rc1
Oleg Nesterov <[email protected]>
sched/autogroup: Fix autogroup_move_group() to never skip sched_move_task()
John David Anglin <[email protected]>
parisc: Fix double-word compare and exchange in LWS code on 32-bit kernels
John David Anglin <[email protected]>
parisc: Avoid trashing sr2 and sr3 in LWS code
Eric Sesterhenn <[email protected]>
pkcs7: Prevent NULL pointer dereference, since sinfo is not always set.
David Howells <[email protected]>
KEYS: don't let add_key() update an uninstantiated key
Eric Biggers <[email protected]>
lib/digsig: fix dereference of NULL user_key_payload
Eric Biggers <[email protected]>
KEYS: encrypted: fix dereference of NULL user_key_payload
Larry Finger <[email protected]>
rtlwifi: rtl8821ae: Fix connection lost problem
David Kozub <[email protected]>
clockevents/drivers/cs5535: Improve resilience to spurious interrupts
Jan Luebbe <[email protected]>
bus: mbus: fix window size calculation for 4GB windows
Arnd Bergmann <[email protected]>
brcmsmac: make some local variables 'static const' to reduce stack size
Pontus Andersson <[email protected]>
i2c: ismt: Separate I2C block read from SMBus block read
Takashi Iwai <[email protected]>
ALSA: hda: Remove superfluous '-' added by printk conversion
Ben Hutchings <[email protected]>
ALSA: seq: Enable 'use' locking in all configurations
Ben Skeggs <[email protected]>
drm/nouveau/mmu: flush tlbs before deleting page tables
Ilia Mirkin <[email protected]>
drm/nouveau/bsp/g92: disable by default
Stefan Mätje <[email protected]>
can: esd_usb2: Fix can_dlc value for received RTR, frames
Jonathan Liu <[email protected]>
usb: musb: Check for host-mode using is_host_active() on reset interrupt
Jonathan Liu <[email protected]>
usb: musb: sunxi: Explicitly release USB PHY on exit
Wolfgang Grandegger <[email protected]>
can: gs_usb: fix busy loop if no more TX context is available
Jussi Laako <[email protected]>
ALSA: usb-audio: Add native DSD support for Pro-Ject Pre Box S2 Digital
Mathias Nyman <[email protected]>
usb: hub: Allow reset retry for USB2 devices on connect bounce
Felipe Balbi <[email protected]>
usb: quirks: add quirk for WORLDE MINI MIDI keyboard
Maksim Salau <[email protected]>
usb: cdc_acm: Add quirk for Elatec TWN3
Johan Hovold <[email protected]>
USB: serial: metro-usb: add MS7820 device id
Alan Stern <[email protected]>
USB: core: fix out-of-bounds access bug in usb_get_bos_descriptor()
Hans de Goede <[email protected]>
USB: devio: Revert "USB: devio: Don't corrupt user memory"
-------------
Diffstat:
Makefile | 4 +- arch/parisc/kernel/syscall.S | 55 +++--- crypto/asymmetric_keys/pkcs7_parser.c | 3 + drivers/bus/mvebu-mbus.c | 2 +- drivers/clocksource/cs5535-clockevt.c | 3 +- drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c | 2 + drivers/i2c/busses/i2c-ismt.c | 5 +- drivers/net/can/usb/esd_usb2.c | 2 +- drivers/net/can/usb/gs_usb.c | 10 +- .../net/wireless/brcm80211/brcmsmac/phy/phy_n.c | 197 ++++++++++----------- .../net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 2 +- drivers/usb/class/cdc-acm.c | 3 + drivers/usb/core/config.c | 6 +- drivers/usb/core/devio.c | 6 +- drivers/usb/core/hub.c | 11 +- drivers/usb/core/quirks.c | 4 + drivers/usb/musb/musb_core.c | 6 +- drivers/usb/musb/sunxi.c | 2 + drivers/usb/serial/metro-usb.c | 1 + include/linux/mbus.h | 4 +- kernel/sched/auto_group.c | 23 +-- lib/digsig.c | 6 + security/keys/encrypted-keys/encrypted.c | 7 + security/keys/key.c | 10 ++ sound/core/seq/seq_lock.c | 4 - sound/core/seq/seq_lock.h | 12 -- sound/pci/hda/hda_codec.c | 2 +- sound/usb/quirks.c | 1 + 29 files changed, 204 insertions(+), 191 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/27 USB: devio: Revert "USB: devio: Dont corrupt user memory"
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 845d584f41eac3475c21e4a7d5e88d0f6e410cf7 upstream.
Taking the uurb->buffer_length userspace passes in as a maximum for the actual urbs transfer_buffer_length causes 2 serious issues:
1) It breaks isochronous support for all userspace apps using libusb, as existing libusb versions pass in 0 for uurb->buffer_length, relying on the kernel using the lenghts of the usbdevfs_iso_packet_desc descriptors passed in added together as buffer length.
This for example causes redirection of USB audio and Webcam's into virtual machines using qemu-kvm to no longer work. This is a userspace ABI break and as such must be reverted.
Note that the original commit does not protect other users / the kernels memory, it only stops the userspace process making the call from shooting itself in the foot.
2) It may cause the kernel to program host controllers to DMA over random memory. Just as the devio code used to only look at the iso_packet_desc lenghts, the host drivers do the same, relying on the submitter of the urbs to make sure the entire buffer is large enough and not checking transfer_buffer_length.
But the "USB: devio: Don't corrupt user memory" commit now takes the userspace provided uurb->buffer_length for the buffer-size while copying over the user-provided iso_packet_desc lengths 1:1, allowing the user to specify a small buffer size while programming the host controller to dma a lot more data.
(Atleast the ohci, uhci, xhci and fhci drivers do not check
transfer_buffer_length for isoc transfers.)
This reverts commit fa1ed74eb1c2 ("USB: devio: Don't corrupt user memory") fixing both these issues.
--- drivers/usb/core/devio.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
drivers/usb/core/devio.c +1 -5
@@ -1417,11 +1417,7 @@ static int proc_do_submiturb(struct usb_ totlen += isopkt[u].length; } u *=sizeof (struct usb_iso_packet_descriptor ); -if (totlen <= uurb->buffer_length) - uurb->buffer_length = totlen; -else -WARN_ONCE (1 ,"uurb->buffer_length is too short %d vs %d" , - totlen, uurb->buffer_length); + uurb->buffer_length = totlen;break ;default :
Greg Kroah-Hartman
maintainerPATCH 2/27 USB: core: fix out-of-bounds access bug in usb_get_bos_descriptor()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Stern <[email protected]>
commit 1c0edc3633b56000e18d82fc241e3995ca18a69e upstream.
Andrey used the syzkaller fuzzer to find an out-of-bounds memory access in usb_get_bos_descriptor(). The code wasn't checking that the next usb_dev_cap_header structure could fit into the remaining buffer space.
This patch fixes the error and also reduces the bNumDeviceCaps field in the header to match the actual number of capabilities found, in cases where there are fewer than expected.
--- drivers/usb/core/config.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/usb/core/config.c +4 -2
@@ -926,10 +926,12 @@ int usb_get_bos_descriptor(struct usb_defor (i =0 ; i < num; i++) { buffer += length; cap = (struct usb_dev_cap_header *)buffer; - length = cap->bLength; -if (total_len < length) +if (total_len <sizeof (*cap) || total_len < cap->bLength) { + dev->bos->desc->bNumDeviceCaps = i;break ; + } + length = cap->bLength; total_len -= length;if (cap->bDescriptorType !=USB_DT_DEVICE_CAPABILITY ) {
Greg Kroah-Hartman
maintainerPATCH 3/27 USB: serial: metro-usb: add MS7820 device id
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 31dc3f819bac28a0990b36510197560258ab7421 upstream.
Add device-id entry for (Honeywell) Metrologic MS7820 bar code scanner.
The device has two interfaces (in this mode?); a vendor-specific interface with two interrupt endpoints and a second HID interface, which we do not bind to.
--- drivers/usb/serial/metro-usb.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/metro-usb.c +1 -0
@@ -45,6 +45,7 @@ struct metrousb_private {static const struct usb_device_id id_table[] = { {USB_DEVICE (FOCUS_VENDOR_ID ,FOCUS_PRODUCT_ID_BI ) }, {USB_DEVICE (FOCUS_VENDOR_ID ,FOCUS_PRODUCT_ID_UNI ) }, + {USB_DEVICE_INTERFACE_CLASS (0x0c2e ,0x0730 ,0xff ) },/* MS7820 */ { },/* Terminating entry. */ };MODULE_DEVICE_TABLE (usb, id_table);
Greg Kroah-Hartman
maintainerPATCH 4/27 usb: cdc_acm: Add quirk for Elatec TWN3
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maksim Salau <[email protected]>
commit 765fb2f181cad669f2beb87842a05d8071f2be85 upstream.
Elatec TWN3 has the union descriptor on data interface. This results in failure to bind the device to the driver with the following log:
usb 1-1.2: new full speed USB device using streamplug-ehci and address 4 usb 1-1.2: New USB device found, idVendor=09d8, idProduct=0320 usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 1-1.2: Product: RFID Device (COM)
usb 1-1.2: Manufacturer: OEM
cdc_acm 1-1.2:1.0: Zero length descriptor references
cdc_acm: probe of 1-1.2:1.0 failed with error -22
Adding the NO_UNION_NORMAL quirk for the device fixes the issue.
lsusb -v of the device:
Bus 001 Device 003: ID 09d8:0320
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 32 idVendor 0x09d8 idProduct 0x0320 bcdDevice 3.00 iManufacturer 1 OEM iProduct 2 RFID Device (COM) iSerial 0 bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 250mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 2
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 0
CDC Header:
bcdCDC 1.10
CDC Call Management:
bmCapabilities 0x03
call management
use DataInterface
bDataInterface 1
CDC ACM:
bmCapabilities 0x06
sends break
line coding and serial state
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Device Status: 0x0000
(Bus Powered)
--- drivers/usb/class/cdc-acm.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/class/cdc-acm.c +3 -0
@@ -1762,6 +1762,9 @@ static const struct usb_device_id acm_id { USB_DEVICE(0xfff0, 0x0100), /* DATECS FP-2000 */ .driver_info =NO_UNION_NORMAL ,/* reports zero length descriptor */ }, + { USB_DEVICE(0x09d8, 0x0320), /* Elatec GmbH TWN3 */ + .driver_info = NO_UNION_NORMAL, /* has misplaced union descriptor */ + }, { USB_DEVICE(0x2912, 0x0001), /* ATOL FPrint */ .driver_info = CLEAR_HALT_CONDITIONS,
Greg Kroah-Hartman
maintainerPATCH 6/27 usb: hub: Allow reset retry for USB2 devices on connect bounce
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit 1ac7db63333db1eeff901bfd6bbcd502b4634fa4 upstream.
If the connect status change is set during reset signaling, but the status remains connected just retry port reset.
This solves an issue with connecting a 90W HP Thunderbolt 3 dock with a Lenovo Carbon x1 (5th generation) which causes a 30min loop of a high speed device being re-discovererd before usb ports starts working.
[...]
[ 389.023845] usb 3-1: new high-speed USB device number 55 using xhci_hcd [ 389.491841] usb 3-1: new high-speed USB device number 56 using xhci_hcd [ 389.959928] usb 3-1: new high-speed USB device number 57 using xhci_hcd
[...]
This is caused by a high speed device that doesn't successfully go to the enabled state after the second port reset. Instead the connection bounces (connected, with connect status change), bailing out completely from enumeration just to restart from scratch.
--- drivers/usb/core/hub.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/usb/core/hub.c +7 -4
@@ -2656,13 +2656,16 @@ static int hub_port_wait_reset(struct usif (!(portstatus &USB_PORT_STAT_CONNECTION ))return -ENOTCONN ; -/* bomb out completely if the connection bounced. A USB 3.0 -* connection may bounce if multiple warm resets were issued, +/* Retry if connect change is set but status is still connected. +* A USB 3.0 connection may bounce if multiple warm resets were issued, * but the device may have successfully re-connected. Ignore it. */ if (!hub_is_superspeed (hub->hdev) && - (portchange &USB_PORT_STAT_C_CONNECTION )) -return -ENOTCONN ; + (portchange &USB_PORT_STAT_C_CONNECTION )) { +usb_clear_port_feature (hub->hdev, port1, +USB_PORT_FEAT_C_CONNECTION ); +return -EAGAIN ; + }if (!(portstatus &USB_PORT_STAT_ENABLE ))return -EBUSY ;
Greg Kroah-Hartman
maintainerPATCH 7/27 ALSA: usb-audio: Add native DSD support for Pro-Ject Pre Box S2 Digital
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jussi Laako <[email protected]>
commit 9bb201a5d5acc733943e8af7151cceab9d976a69 upstream.
Add native DSD support quirk for Pro-Ject Pre Box S2 Digital USB id 2772:0230.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1305,6 +1305,7 @@ u64 snd_usb_interface_dsd_format_quirks(case USB_ID (0x20b1 ,0x2008 ):/* Matrix Audio X-Sabre */ case USB_ID (0x20b1 ,0x300a ):/* Matrix Audio Mini-i Pro */ case USB_ID (0x22d9 ,0x0416 ):/* OPPO HA-1 */ +case USB_ID (0x2772 ,0x0230 ):/* Pro-Ject Pre Box S2 Digital */ if (fp->altsetting ==2 )return SNDRV_PCM_FMTBIT_DSD_U32_BE ;break ;
Greg Kroah-Hartman
maintainerPATCH 8/27 can: gs_usb: fix busy loop if no more TX context is available
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfgang Grandegger <[email protected]>
commit 97819f943063b622eca44d3644067c190dc75039 upstream.
If sending messages with no cable connected, it quickly happens that there is no more TX context available. Then "gs_can_start_xmit()" returns with "NETDEV_TX_BUSY" and the upper layer does retry immediately keeping the CPU busy. To fix that issue, I moved "atomic_dec(&dev->active_tx_urbs)" from "gs_usb_xmit_callback()" to the TX done handling in "gs_usb_receive_bulk_callback()". Renaming "active_tx_urbs" to "active_tx_contexts" and moving it into "gs_[alloc|free]_tx_context()" would also make sense.
--- drivers/net/can/usb/gs_usb.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
drivers/net/can/usb/gs_usb.c +2 -8
@@ -356,6 +356,8 @@ static void gs_usb_receive_bulk_callbackgs_free_tx_context (txc); +atomic_dec (&dev->active_tx_urbs); +netif_wake_queue (netdev); }
@@ -444,14 +446,6 @@ static void gs_usb_xmit_callback(struct urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); - -atomic_dec (&dev->active_tx_urbs); - -if (!netif_device_present (netdev)) -return ; - -if (netif_queue_stopped (netdev)) -netif_wake_queue (netdev); }static netdev_tx_t gs_can_start_xmit (struct sk_buff *skb,struct net_device *netdev)
Greg Kroah-Hartman
maintainerPATCH 9/27 usb: musb: sunxi: Explicitly release USB PHY on exit
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Liu <[email protected]>
commit 6ed05c68cbcae42cd52b8e53b66952bfa9c002ce upstream.
This fixes a kernel oops when unloading the driver due to usb_put_phy being called after usb_phy_generic_unregister when the device is detached. Calling usb_phy_generic_unregister causes x->dev->driver to be NULL in usb_put_phy and results in a NULL pointer dereference.
--- drivers/usb/musb/sunxi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/musb/sunxi.c +2 -0
@@ -320,6 +320,8 @@ static int sunxi_musb_exit(struct musb *if (test_bit (SUNXI_MUSB_FL_HAS_SRAM , &glue->flags))sunxi_sram_release (musb->controller->parent); +devm_usb_put_phy (glue->dev, glue->xceiv); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 10/27 usb: musb: Check for host-mode using is_host_active() on reset interrupt
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Liu <[email protected]>
commit 445ef61543da3db5b699f87fb0aa4f227165f6ed upstream.
The sunxi musb has a bug where sometimes it will generate a babble error on device disconnect instead of a disconnect IRQ. When this happens the musb controller switches from host mode to device mode (it clears MUSB_DEVCTL_HM/MUSB_DEVCTL_SESSION and sets MUSB_DEVCTL_BDEVICE) and gets stuck in this state.
The babble error is misdetected as a bus reset because MUSB_DEVCTL_HM was cleared.
To fix this, use is_host_active() rather than (devctl & MUSB_DEVCTL_HM) to detect babble error so that sunxi musb babble recovery can handle it by restoring the mode. This information is provided by the driver logic and does not rely on register contents.
--- drivers/usb/musb/musb_core.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/usb/musb/musb_core.c +2 -4
@@ -877,7 +877,7 @@ b_host:*/ if (int_usb &MUSB_INTR_RESET ) { handled =IRQ_HANDLED ; -if (devctl &MUSB_DEVCTL_HM ) { +if (is_host_active (musb)) {/* * When BABBLE happens what we can depends on which * platform MUSB is running, because some platforms
@@ -887,9 +887,7 @@ b_host:* drop the session. */ dev_err (musb->controller,"Babble\n" ); - -if (is_host_active (musb)) -musb_recover_from_babble (musb); +musb_recover_from_babble (musb); }else {dev_dbg (musb->controller,"BUS RESET as %s\n" ,usb_otg_state_string (musb->xceiv->otg->state));
Greg Kroah-Hartman
maintainerPATCH 12/27 drm/nouveau/bsp/g92: disable by default
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilia Mirkin <[email protected]>
commit 194d68dd051c2dd5ac2b522ae16100e774e8d869 upstream.
G92's seem to require some additional bit of initialization before the BSP engine can work. It feels like clocks are not set up for the underlying VLD engine, which means that all commands submitted to the xtensa chip end up hanging. VP seems to work fine though.
This still allows people to force-enable the bsp engine if they want to play around with it, but makes it harder for the card to hang by default.
--- drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c +1 -1
@@ -40,5 +40,5 @@ int g84_bsp_new(struct nvkm_device *device, int index, struct nvkm_engine **pengine) { return nvkm_xtensa_new_(&g84_bsp, device, index, - true, 0x103000, pengine); + device->chipset != 0x92, 0x103000, pengine); }
Greg Kroah-Hartman
maintainerPATCH 13/27 drm/nouveau/mmu: flush tlbs before deleting page tables
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Skeggs <[email protected]>
commit 77913bbcb43ac9a07a6fe849c2fd3bf85fc8bdd8 upstream.
Even though we've zeroed the PDE, the GPU may have cached the PD, so we need to flush when deleting them.
Noticed while working on replacement MMU code, but a backport might be a good idea, so let's fix it in the current code too.
--- drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c +2 -0
@@ -240,6 +240,8 @@ nvkm_vm_unmap_pgt(struct nvkm_vm *vm, in mmu->func->map_pgt (vpgd->obj, pde, vpgt->mem); } + mmu->func->flush (vm); +nvkm_memory_del (&pgt); } }
Greg Kroah-Hartman
maintainerPATCH 14/27 ALSA: seq: Enable use locking in all configurations
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 8009d506a1dd00cf436b0c4cca0dcec130580a21 upstream.
The 'use' locking macros are no-ops if neither SMP or SND_DEBUG is enabled. This might once have been OK in non-preemptible configurations, but even in that case snd_seq_read() may sleep while relying on a 'use' lock. So always use the proper implementations.
--- sound/core/seq/seq_lock.c | 4 ---- sound/core/seq/seq_lock.h | 12 ------------ 2 files changed, 16 deletions(-)
sound/core/seq/seq_lock.c +0 -4
@@ -23,8 +23,6 @@#include <sound/core.h> #include "seq_lock.h" -#if defined(CONFIG_SMP ) || defined(CONFIG_SND_DEBUG ) -/* wait until all locks are released */ void snd_use_lock_sync_helper (snd_use_lock_t *lockp,const char *file,int line) {
@@ -42,5 +40,3 @@ void snd_use_lock_sync_helper(snd_use_lo }EXPORT_SYMBOL (snd_use_lock_sync_helper); - -#endif
sound/core/seq/seq_lock.h +0 -12
@@ -3,8 +3,6 @@#include <linux/sched.h> -#if defined(CONFIG_SMP ) || defined(CONFIG_SND_DEBUG ) -typedef atomic_t snd_use_lock_t ;/* initialize lock */
@@ -20,14 +18,4 @@ typedef atomic_t snd_use_lock_t;void snd_use_lock_sync_helper (snd_use_lock_t *lock,const char *file,int line);#define snd_use_lock_sync (lockp) snd_use_lock_sync_helper(lockp, __BASE_FILE__, __LINE__) -#else /* SMP || CONFIG_SND_DEBUG */ - -typedef spinlock_t snd_use_lock_t ;/* dummy */ -#define snd_use_lock_init (lockp)/**/ -#define snd_use_lock_use (lockp)/**/ -#define snd_use_lock_free (lockp)/**/ -#define snd_use_lock_sync (lockp)/**/ - -#endif /* SMP || CONFIG_SND_DEBUG */ -#endif /* __SND_SEQ_LOCK_H */
Greg Kroah-Hartman
maintainerPATCH 15/27 ALSA: hda: Remove superfluous - added by printk conversion
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 6bf88a343db2b3c160edf9b82a74966b31cc80bd upstream.
While converting the error messages to the standard macros in the commit 4e76a8833fac ("ALSA: hda - Replace with standard printk"), a superfluous '-' slipped in the code mistakenly. Its influence is almost negligible, merely shows a dB value as negative integer instead of positive integer (or vice versa) in the rare error message. So let's kill this embarrassing byte to show more correct value.
--- sound/pci/hda/hda_codec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/hda_codec.c +1 -1
@@ -1755,7 +1755,7 @@ static int get_kctl_0dB_offset(struct hdreturn -1 ;if (*step_to_check && *step_to_check != step) {codec_err (codec,"Mismatching dB step for vmaster slave (%d!=%d)\n" , -- *step_to_check, step); + *step_to_check, step);return -1 ; } *step_to_check = step;
Greg Kroah-Hartman
maintainerPATCH 16/27 i2c: ismt: Separate I2C block read from SMBus block read
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pontus Andersson <[email protected]>
commit c6ebcedbab7ca78984959386012a17b21183e1a3 upstream.
Commit b6c159a9cb69 ("i2c: ismt: Don't duplicate the receive length for block reads") broke I2C block reads. It aimed to fix normal SMBus block read, but changed the correct behavior of I2C block read in the process.
According to Documentation/i2c/smbus-protocol, one vital difference between normal SMBus block read and I2C block read is that there is no byte count prefixed in the data sent on the wire:
SMBus Block Read: i2c_smbus_read_block_data()
S Addr Wr [A] Comm [A]
S Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P
I2C Block Read: i2c_smbus_read_i2c_block_data()
S Addr Wr [A] Comm [A]
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
Therefore the two transaction types need to be processed differently in the driver by copying of the dma_buffer as done previously for the I2C_SMBUS_I2C_BLOCK_DATA case.
--- drivers/i2c/busses/i2c-ismt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-ismt.c +4 -1
@@ -338,12 +338,15 @@ static int ismt_process_desc(const struc data->word = dma_buffer[0 ] | (dma_buffer[1 ] <<8 );break ;case I2C_SMBUS_BLOCK_DATA : -case I2C_SMBUS_I2C_BLOCK_DATA :if (desc->rxbytes != dma_buffer[0 ] +1 )return -EMSGSIZE ;memcpy (data->block, dma_buffer, desc->rxbytes);break ; +case I2C_SMBUS_I2C_BLOCK_DATA : +memcpy (&data->block[1 ], dma_buffer, desc->rxbytes); + data->block[0 ] = desc->rxbytes; +break ; }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 17/27 brcmsmac: make some local variables static const to reduce stack size
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit c503dd38f850be28867ef7a42d9abe5ade81a9bd upstream.
With KASAN and a couple of other patches applied, this driver is one of the few remaining ones that actually use more than 2048 bytes of kernel stack:
broadcom/brcm80211/brcmsmac/phy/phy_n.c: In function 'wlc_phy_workarounds_nphy_gainctrl':broadcom/brcm80211/brcmsmac/phy/phy_n.c:16065:1: warning: the frame size of 3264 bytes is larger than 2048 bytes [-Wframe-larger-than=] broadcom/brcm80211/brcmsmac/phy/phy_n.c: In function 'wlc_phy_workarounds_nphy':broadcom/brcm80211/brcmsmac/phy/phy_n.c:17138:1: warning: the frame size of 2864 bytes is larger than 2048 bytes [-Wframe-larger-than=]
Here, I'm reducing the stack size by marking as many local variables as 'static const' as I can without changing the actual code.
This is the first of three patches to improve the stack usage in this driver. It would be good to have this backported to stabl kernels to get all drivers in 'allmodconfig' below the 2048 byte limit so we can turn on the frame warning again globally, but I realize that the patch is larger than the normal limit for stable backports.
The other two patches do not need to be backported.
--- drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c | 197 +++++++++----------- 1 file changed, 97 insertions(+), 100 deletions(-)
drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c +97 -100
@@ -14764,8 +14764,8 @@ static void wlc_phy_ipa_restore_tx_digi_ }static void -wlc_phy_set_rfseq_nphy (struct brcms_phy *pi,u8 cmd,u8 *events,u8 *dlys, -u8 len) +wlc_phy_set_rfseq_nphy (struct brcms_phy *pi,u8 cmd,const u8 *events, +const u8 *dlys,u8 len) {u32 t1_offset, t2_offset;u8 ctr;
@@ -15240,16 +15240,16 @@ static void wlc_phy_workarounds_nphy_gaistatic void wlc_phy_workarounds_nphy_gainctrl_2057_rev6 (struct brcms_phy *pi) {u16 currband; -s8 lna1G_gain_db_rev7[] = {9 ,14 ,19 ,24 }; -s8 *lna1_gain_db =NULL ; -s8 *lna1_gain_db_2 =NULL ; -s8 *lna2_gain_db =NULL ; -s8 tiaA_gain_db_rev7[] = {-9 ,-6 ,-3 ,0 ,3 ,3 ,3 ,3 ,3 ,3 }; -s8 *tia_gain_db; -s8 tiaA_gainbits_rev7[] = {0 ,1 ,2 ,3 ,4 ,4 ,4 ,4 ,4 ,4 }; -s8 *tia_gainbits; -u16 rfseqA_init_gain_rev7[] = {0x624f ,0x624f }; -u16 *rfseq_init_gain; +static const s8 lna1G_gain_db_rev7[] = {9 ,14 ,19 ,24 }; +const s8 *lna1_gain_db =NULL ; +const s8 *lna1_gain_db_2 =NULL ; +const s8 *lna2_gain_db =NULL ; +static const s8 tiaA_gain_db_rev7[] = {-9 ,-6 ,-3 ,0 ,3 ,3 ,3 ,3 ,3 ,3 }; +const s8 *tia_gain_db; +static const s8 tiaA_gainbits_rev7[] = {0 ,1 ,2 ,3 ,4 ,4 ,4 ,4 ,4 ,4 }; +const s8 *tia_gainbits; +static const u16 rfseqA_init_gain_rev7[] = {0x624f ,0x624f }; +const u16 *rfseq_init_gain;u16 init_gaincode;u16 clip1hi_gaincode;u16 clip1md_gaincode =0 ;
@@ -15310,10 +15310,9 @@ static void wlc_phy_workarounds_nphy_gaiif ((freq <=5080 ) || (freq ==5825 )) { -s8 lna1A_gain_db_rev7[] = {11 ,16 ,20 ,24 }; -s8 lna1A_gain_db_2_rev7[] = { -11 ,17 ,22 ,25 }; -s8 lna2A_gain_db_rev7[] = {-1 ,6 ,10 ,14 }; +static const s8 lna1A_gain_db_rev7[] = {11 ,16 ,20 ,24 }; +static const s8 lna1A_gain_db_2_rev7[] = {11 ,17 ,22 ,25 }; +static const s8 lna2A_gain_db_rev7[] = {-1 ,6 ,10 ,14 }; crsminu_th =0x3e ; lna1_gain_db = lna1A_gain_db_rev7;
@@ -15321,10 +15320,9 @@ static void wlc_phy_workarounds_nphy_gai lna2_gain_db = lna2A_gain_db_rev7; }else if ((freq >=5500 ) && (freq <=5700 )) { -s8 lna1A_gain_db_rev7[] = {11 ,17 ,21 ,25 }; -s8 lna1A_gain_db_2_rev7[] = { -12 ,18 ,22 ,26 }; -s8 lna2A_gain_db_rev7[] = {1 ,8 ,12 ,16 }; +static const s8 lna1A_gain_db_rev7[] = {11 ,17 ,21 ,25 }; +static const s8 lna1A_gain_db_2_rev7[] = {12 ,18 ,22 ,26 }; +static const s8 lna2A_gain_db_rev7[] = {1 ,8 ,12 ,16 }; crsminu_th =0x45 ; clip1md_gaincode_B =0x14 ;
@@ -15335,10 +15333,9 @@ static void wlc_phy_workarounds_nphy_gai lna2_gain_db = lna2A_gain_db_rev7; }else { -s8 lna1A_gain_db_rev7[] = {12 ,18 ,22 ,26 }; -s8 lna1A_gain_db_2_rev7[] = { -12 ,18 ,22 ,26 }; -s8 lna2A_gain_db_rev7[] = {-1 ,6 ,10 ,14 }; +static const s8 lna1A_gain_db_rev7[] = {12 ,18 ,22 ,26 }; +static const s8 lna1A_gain_db_2_rev7[] = {12 ,18 ,22 ,26 }; +static const s8 lna2A_gain_db_rev7[] = {-1 ,6 ,10 ,14 }; crsminu_th =0x41 ; lna1_gain_db = lna1A_gain_db_rev7;
@@ -15450,65 +15447,65 @@ static void wlc_phy_workarounds_nphy_gaiNPHY_RFSEQ_CMD_CLR_HIQ_DIS ,NPHY_RFSEQ_CMD_SET_HPF_BW }; -u8 rfseq_updategainu_dlys[] = {10 ,30 ,1 }; -s8 lna1G_gain_db[] = {7 ,11 ,16 ,23 }; -s8 lna1G_gain_db_rev4[] = {8 ,12 ,17 ,25 }; -s8 lna1G_gain_db_rev5[] = {9 ,13 ,18 ,26 }; -s8 lna1G_gain_db_rev6[] = {8 ,13 ,18 ,25 }; -s8 lna1G_gain_db_rev6_224B0[] = {10 ,14 ,19 ,27 }; -s8 lna1A_gain_db[] = {7 ,11 ,17 ,23 }; -s8 lna1A_gain_db_rev4[] = {8 ,12 ,18 ,23 }; -s8 lna1A_gain_db_rev5[] = {6 ,10 ,16 ,21 }; -s8 lna1A_gain_db_rev6[] = {6 ,10 ,16 ,21 }; -s8 *lna1_gain_db =NULL ; -s8 lna2G_gain_db[] = {-5 ,6 ,10 ,14 }; -s8 lna2G_gain_db_rev5[] = {-3 ,7 ,11 ,16 }; -s8 lna2G_gain_db_rev6[] = {-5 ,6 ,10 ,14 }; -s8 lna2G_gain_db_rev6_224B0[] = {-5 ,6 ,10 ,15 }; -s8 lna2A_gain_db[] = {-6 ,2 ,6 ,10 }; -s8 lna2A_gain_db_rev4[] = {-5 ,2 ,6 ,10 }; -s8 lna2A_gain_db_rev5[] = {-7 ,0 ,4 ,8 }; -s8 lna2A_gain_db_rev6[] = {-7 ,0 ,4 ,8 }; -s8 *lna2_gain_db =NULL ; -s8 tiaG_gain_db[] = { +static const u8 rfseq_updategainu_dlys[] = {10 ,30 ,1 }; +static const s8 lna1G_gain_db[] = {7 ,11 ,16 ,23 }; +static const s8 lna1G_gain_db_rev4[] = {8 ,12 ,17 ,25 }; +static const s8 lna1G_gain_db_rev5[] = {9 ,13 ,18 ,26 }; +static const s8 lna1G_gain_db_rev6[] = {8 ,13 ,18 ,25 }; +static const s8 lna1G_gain_db_rev6_224B0[] = {10 ,14 ,19 ,27 }; +static const s8 lna1A_gain_db[] = {7 ,11 ,17 ,23 }; +static const s8 lna1A_gain_db_rev4[] = {8 ,12 ,18 ,23 }; +static const s8 lna1A_gain_db_rev5[] = {6 ,10 ,16 ,21 }; +static const s8 lna1A_gain_db_rev6[] = {6 ,10 ,16 ,21 }; +const s8 *lna1_gain_db =NULL ; +static const s8 lna2G_gain_db[] = {-5 ,6 ,10 ,14 }; +static const s8 lna2G_gain_db_rev5[] = {-3 ,7 ,11 ,16 }; +static const s8 lna2G_gain_db_rev6[] = {-5 ,6 ,10 ,14 }; +static const s8 lna2G_gain_db_rev6_224B0[] = {-5 ,6 ,10 ,15 }; +static const s8 lna2A_gain_db[] = {-6 ,2 ,6 ,10 }; +static const s8 lna2A_gain_db_rev4[] = {-5 ,2 ,6 ,10 }; +static const s8 lna2A_gain_db_rev5[] = {-7 ,0 ,4 ,8 }; +static const s8 lna2A_gain_db_rev6[] = {-7 ,0 ,4 ,8 }; +const s8 *lna2_gain_db =NULL ; +static const s8 tiaG_gain_db[] = {0x0A ,0x0A ,0x0A ,0x0A ,0x0A ,0x0A ,0x0A ,0x0A ,0x0A ,0x0A }; -s8 tiaA_gain_db[] = { +static const s8 tiaA_gain_db[] = {0x13 ,0x13 ,0x13 ,0x13 ,0x13 ,0x13 ,0x13 ,0x13 ,0x13 ,0x13 }; -s8 tiaA_gain_db_rev4[] = { +static const s8 tiaA_gain_db_rev4[] = {0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d }; -s8 tiaA_gain_db_rev5[] = { +static const s8 tiaA_gain_db_rev5[] = {0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d }; -s8 tiaA_gain_db_rev6[] = { +static const s8 tiaA_gain_db_rev6[] = {0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d ,0x0d }; -s8 *tia_gain_db; -s8 tiaG_gainbits[] = { +const s8 *tia_gain_db; +static const s8 tiaG_gainbits[] = {0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 }; -s8 tiaA_gainbits[] = { +static const s8 tiaA_gainbits[] = {0x06 ,0x06 ,0x06 ,0x06 ,0x06 ,0x06 ,0x06 ,0x06 ,0x06 ,0x06 }; -s8 tiaA_gainbits_rev4[] = { +static const s8 tiaA_gainbits_rev4[] = {0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 }; -s8 tiaA_gainbits_rev5[] = { +static const s8 tiaA_gainbits_rev5[] = {0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 }; -s8 tiaA_gainbits_rev6[] = { +static const s8 tiaA_gainbits_rev6[] = {0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 }; -s8 *tia_gainbits; -s8 lpf_gain_db[] = {0x00 ,0x06 ,0x0c ,0x12 ,0x12 ,0x12 }; -s8 lpf_gainbits[] = {0x00 ,0x01 ,0x02 ,0x03 ,0x03 ,0x03 }; -u16 rfseqG_init_gain[] = {0x613f ,0x613f ,0x613f ,0x613f }; -u16 rfseqG_init_gain_rev4[] = {0x513f ,0x513f ,0x513f ,0x513f }; -u16 rfseqG_init_gain_rev5[] = {0x413f ,0x413f ,0x413f ,0x413f }; -u16 rfseqG_init_gain_rev5_elna[] = { +const s8 *tia_gainbits; +static const s8 lpf_gain_db[] = {0x00 ,0x06 ,0x0c ,0x12 ,0x12 ,0x12 }; +static const s8 lpf_gainbits[] = {0x00 ,0x01 ,0x02 ,0x03 ,0x03 ,0x03 }; +static const u16 rfseqG_init_gain[] = {0x613f ,0x613f ,0x613f ,0x613f }; +static const u16 rfseqG_init_gain_rev4[] = {0x513f ,0x513f ,0x513f ,0x513f }; +static const u16 rfseqG_init_gain_rev5[] = {0x413f ,0x413f ,0x413f ,0x413f }; +static const u16 rfseqG_init_gain_rev5_elna[] = {0x013f ,0x013f ,0x013f ,0x013f }; -u16 rfseqG_init_gain_rev6[] = {0x513f ,0x513f }; -u16 rfseqG_init_gain_rev6_224B0[] = {0x413f ,0x413f }; -u16 rfseqG_init_gain_rev6_elna[] = {0x113f ,0x113f }; -u16 rfseqA_init_gain[] = {0x516f ,0x516f ,0x516f ,0x516f }; -u16 rfseqA_init_gain_rev4[] = {0x614f ,0x614f ,0x614f ,0x614f }; -u16 rfseqA_init_gain_rev4_elna[] = { +static const u16 rfseqG_init_gain_rev6[] = {0x513f ,0x513f }; +static const u16 rfseqG_init_gain_rev6_224B0[] = {0x413f ,0x413f }; +static const u16 rfseqG_init_gain_rev6_elna[] = {0x113f ,0x113f }; +static const u16 rfseqA_init_gain[] = {0x516f ,0x516f ,0x516f ,0x516f }; +static const u16 rfseqA_init_gain_rev4[] = {0x614f ,0x614f ,0x614f ,0x614f }; +static const u16 rfseqA_init_gain_rev4_elna[] = {0x314f ,0x314f ,0x314f ,0x314f }; -u16 rfseqA_init_gain_rev5[] = {0x714f ,0x714f ,0x714f ,0x714f }; -u16 rfseqA_init_gain_rev6[] = {0x714f ,0x714f }; -u16 *rfseq_init_gain; +static const u16 rfseqA_init_gain_rev5[] = {0x714f ,0x714f ,0x714f ,0x714f }; +static const u16 rfseqA_init_gain_rev6[] = {0x714f ,0x714f }; +const u16 *rfseq_init_gain;u16 initG_gaincode =0x627e ;u16 initG_gaincode_rev4 =0x527e ;u16 initG_gaincode_rev5 =0x427e ;
@@ -15538,10 +15535,10 @@ static void wlc_phy_workarounds_nphy_gaiu16 clip1mdA_gaincode_rev6 =0x2084 ;u16 clip1md_gaincode =0 ;u16 clip1loG_gaincode =0x0074 ; -u16 clip1loG_gaincode_rev5[] = { +static const u16 clip1loG_gaincode_rev5[] = {0x0062 ,0x0064 ,0x006a ,0x106a ,0x106c ,0x1074 ,0x107c ,0x207c }; -u16 clip1loG_gaincode_rev6[] = { +static const u16 clip1loG_gaincode_rev6[] = {0x106a ,0x106c ,0x1074 ,0x107c ,0x007e ,0x107e ,0x207e ,0x307e };u16 clip1loG_gaincode_rev6_224B0 =0x1074 ;
@@ -16066,7 +16063,7 @@ static void wlc_phy_workarounds_nphy_gaistatic void wlc_phy_workarounds_nphy (struct brcms_phy *pi) { -u8 rfseq_rx2tx_events[] = { +static const u8 rfseq_rx2tx_events[] = {NPHY_RFSEQ_CMD_NOP ,NPHY_RFSEQ_CMD_RXG_FBW ,NPHY_RFSEQ_CMD_TR_SWITCH ,
@@ -16076,7 +16073,7 @@ static void wlc_phy_workarounds_nphy(strNPHY_RFSEQ_CMD_EXT_PA };u8 rfseq_rx2tx_dlys[] = {8 ,6 ,6 ,2 ,4 ,60 ,1 }; -u8 rfseq_tx2rx_events[] = { +static const u8 rfseq_tx2rx_events[] = {NPHY_RFSEQ_CMD_NOP ,NPHY_RFSEQ_CMD_EXT_PA ,NPHY_RFSEQ_CMD_TX_GAIN ,
@@ -16085,8 +16082,8 @@ static void wlc_phy_workarounds_nphy(strNPHY_RFSEQ_CMD_RXG_FBW ,NPHY_RFSEQ_CMD_CLR_HIQ_DIS }; -u8 rfseq_tx2rx_dlys[] = {8 ,6 ,2 ,4 ,4 ,6 ,1 }; -u8 rfseq_tx2rx_events_rev3[] = { +static const u8 rfseq_tx2rx_dlys[] = {8 ,6 ,2 ,4 ,4 ,6 ,1 }; +static const u8 rfseq_tx2rx_events_rev3[] = {NPHY_REV3_RFSEQ_CMD_EXT_PA ,NPHY_REV3_RFSEQ_CMD_INT_PA_PU , NPHY_REV3_RFSEQ_CMD_TX_GAIN,
@@ -16096,7 +16093,7 @@ static void wlc_phy_workarounds_nphy(strNPHY_REV3_RFSEQ_CMD_CLR_HIQ_DIS ,NPHY_REV3_RFSEQ_CMD_END }; -u8 rfseq_tx2rx_dlys_rev3[] = {8 ,4 ,2 ,2 ,4 ,4 ,6 ,1 }; +static const u8 rfseq_tx2rx_dlys_rev3[] = {8 ,4 ,2 ,2 ,4 ,4 ,6 ,1 };u8 rfseq_rx2tx_events_rev3[] = {NPHY_REV3_RFSEQ_CMD_NOP , NPHY_REV3_RFSEQ_CMD_RXG_FBW,
@@ -16110,7 +16107,7 @@ static void wlc_phy_workarounds_nphy(str };u8 rfseq_rx2tx_dlys_rev3[] = {8 ,6 ,6 ,4 ,4 ,18 ,42 ,1 ,1 }; -u8 rfseq_rx2tx_events_rev3_ipa[] = { +static const u8 rfseq_rx2tx_events_rev3_ipa[] = {NPHY_REV3_RFSEQ_CMD_NOP ,NPHY_REV3_RFSEQ_CMD_RXG_FBW ,NPHY_REV3_RFSEQ_CMD_TR_SWITCH ,
@@ -16121,15 +16118,15 @@ static void wlc_phy_workarounds_nphy(strNPHY_REV3_RFSEQ_CMD_INT_PA_PU , NPHY_REV3_RFSEQ_CMD_END }; -u8 rfseq_rx2tx_dlys_rev3_ipa[] = {8 ,6 ,6 ,4 ,4 ,16 ,43 ,1 ,1 }; -u16 rfseq_rx2tx_dacbufpu_rev7[] = {0x10f ,0x10f }; +static const u8 rfseq_rx2tx_dlys_rev3_ipa[] = {8 ,6 ,6 ,4 ,4 ,16 ,43 ,1 ,1 }; +static const u16 rfseq_rx2tx_dacbufpu_rev7[] = {0x10f ,0x10f };s16 alpha0, alpha1, alpha2;s16 beta0, beta1, beta2;u32 leg_data_weights, ht_data_weights, nss1_data_weights, stbc_data_weights;u8 chan_freq_range =0 ; -u16 dac_control =0x0002 ; +static const u16 dac_control =0x0002 ;u16 aux_adc_vmid_rev7_core0[] = {0x8e ,0x96 ,0x96 ,0x96 };u16 aux_adc_vmid_rev7_core1[] = {0x8f ,0x9f ,0x9f ,0x96 };u16 aux_adc_vmid_rev4[] = {0xa2 ,0xb4 ,0xb4 ,0x89 };
@@ -16139,8 +16136,8 @@ static void wlc_phy_workarounds_nphy(stru16 aux_adc_gain_rev4[] = {0x02 ,0x02 ,0x02 ,0x00 };u16 aux_adc_gain_rev3[] = {0x02 ,0x02 ,0x02 ,0x00 };u16 *aux_adc_gain; -u16 sk_adc_vmid[] = {0xb4 ,0xb4 ,0xb4 ,0x24 }; -u16 sk_adc_gain[] = {0x02 ,0x02 ,0x02 ,0x02 }; +static const u16 sk_adc_vmid[] = {0xb4 ,0xb4 ,0xb4 ,0x24 }; +static const u16 sk_adc_gain[] = {0x02 ,0x02 ,0x02 ,0x02 };s32 min_nvar_val =0x18d ;s32 min_nvar_offset_6mbps =20 ;u8 pdetrange;
@@ -16151,9 +16148,9 @@ static void wlc_phy_workarounds_nphy(stru16 rfseq_rx2tx_lpf_h_hpc_rev7 =0x77 ;u16 rfseq_tx2rx_lpf_h_hpc_rev7 =0x77 ;u16 rfseq_pktgn_lpf_h_hpc_rev7 =0x77 ; -u16 rfseq_htpktgn_lpf_hpc_rev7[] = {0x77 ,0x11 ,0x11 }; -u16 rfseq_pktgn_lpf_hpc_rev7[] = {0x11 ,0x11 }; -u16 rfseq_cckpktgn_lpf_hpc_rev7[] = {0x11 ,0x11 }; +static const u16 rfseq_htpktgn_lpf_hpc_rev7[] = {0x77 ,0x11 ,0x11 }; +static const u16 rfseq_pktgn_lpf_hpc_rev7[] = {0x11 ,0x11 }; +static const u16 rfseq_cckpktgn_lpf_hpc_rev7[] = {0x11 ,0x11 };u16 ipalvlshift_3p3_war_en =0 ;u16 rccal_bcap_val, rccal_scap_val;u16 rccal_tx20_11b_bcap =0 ;
@@ -24291,13 +24288,13 @@ static void wlc_phy_update_txcal_ladder_u16 bbmult;u16 tblentry; -struct nphy_txiqcal_ladder ladder_lo[] = { +static const struct nphy_txiqcal_ladder ladder_lo[] = { {3 ,0 }, {4 ,0 }, {6 ,0 }, {9 ,0 }, {13 ,0 }, {18 ,0 }, {25 ,0 }, {25 ,1 }, {25 ,2 }, {25 ,3 }, {25 ,4 }, {25 ,5 }, {25 ,6 }, {25 ,7 }, {35 ,7 }, {50 ,7 }, {71 ,7 }, {100 ,7 } }; -struct nphy_txiqcal_ladder ladder_iq[] = { +static const struct nphy_txiqcal_ladder ladder_iq[] = { {3 ,0 }, {4 ,0 }, {6 ,0 }, {9 ,0 }, {13 ,0 }, {18 ,0 }, {25 ,0 }, {35 ,0 }, {50 ,0 }, {71 ,0 }, {100 ,0 }, {100 ,1 }, {100 ,2 }, {100 ,3 }, {100 ,4 }, {100 ,5 }, {100 ,6 }, {100 ,7 }
@@ -25773,67 +25770,67 @@ wlc_phy_cal_txiqlo_nphy(struct brcms_phyu16 cal_gain[2 ];struct nphy_iqcal_params cal_params[2 ];u32 tbl_len; -void *tbl_ptr; +const void *tbl_ptr;bool ladder_updated[2 ];u8 mphase_cal_lastphase =0 ;int bcmerror =0 ;bool phyhang_avoid_state = false; -u16 tbl_tx_iqlo_cal_loft_ladder_20[] = { +static const u16 tbl_tx_iqlo_cal_loft_ladder_20[] = {0x0300 ,0x0500 ,0x0700 ,0x0900 ,0x0d00 ,0x1100 ,0x1900 ,0x1901 ,0x1902 ,0x1903 ,0x1904 ,0x1905 ,0x1906 ,0x1907 ,0x2407 ,0x3207 ,0x4607 ,0x6407 }; -u16 tbl_tx_iqlo_cal_iqimb_ladder_20[] = { +static const u16 tbl_tx_iqlo_cal_iqimb_ladder_20[] = {0x0200 ,0x0300 ,0x0600 ,0x0900 ,0x0d00 ,0x1100 ,0x1900 ,0x2400 ,0x3200 ,0x4600 ,0x6400 ,0x6401 ,0x6402 ,0x6403 ,0x6404 ,0x6405 ,0x6406 ,0x6407 }; -u16 tbl_tx_iqlo_cal_loft_ladder_40[] = { +static const u16 tbl_tx_iqlo_cal_loft_ladder_40[] = {0x0200 ,0x0300 ,0x0400 ,0x0700 ,0x0900 ,0x0c00 ,0x1200 ,0x1201 ,0x1202 ,0x1203 ,0x1204 ,0x1205 ,0x1206 ,0x1207 ,0x1907 ,0x2307 ,0x3207 ,0x4707 }; -u16 tbl_tx_iqlo_cal_iqimb_ladder_40[] = { +static const u16 tbl_tx_iqlo_cal_iqimb_ladder_40[] = {0x0100 ,0x0200 ,0x0400 ,0x0700 ,0x0900 ,0x0c00 ,0x1200 ,0x1900 ,0x2300 ,0x3200 ,0x4700 ,0x4701 ,0x4702 ,0x4703 ,0x4704 ,0x4705 ,0x4706 ,0x4707 }; -u16 tbl_tx_iqlo_cal_startcoefs[] = { +static const u16 tbl_tx_iqlo_cal_startcoefs[] = {0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 }; -u16 tbl_tx_iqlo_cal_cmds_fullcal[] = { +static const u16 tbl_tx_iqlo_cal_cmds_fullcal[] = {0x8123 ,0x8264 ,0x8086 ,0x8245 ,0x8056 ,0x9123 ,0x9264 ,0x9086 ,0x9245 ,0x9056 }; -u16 tbl_tx_iqlo_cal_cmds_recal[] = { +static const u16 tbl_tx_iqlo_cal_cmds_recal[] = {0x8101 ,0x8253 ,0x8053 ,0x8234 ,0x8034 ,0x9101 ,0x9253 ,0x9053 ,0x9234 ,0x9034 }; -u16 tbl_tx_iqlo_cal_startcoefs_nphyrev3[] = { +static const u16 tbl_tx_iqlo_cal_startcoefs_nphyrev3[] = {0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 ,0x0000 }; -u16 tbl_tx_iqlo_cal_cmds_fullcal_nphyrev3[] = { +static const u16 tbl_tx_iqlo_cal_cmds_fullcal_nphyrev3[] = {0x8434 ,0x8334 ,0x8084 ,0x8267 ,0x8056 ,0x8234 ,0x9434 ,0x9334 ,0x9084 ,0x9267 ,0x9056 ,0x9234 }; -u16 tbl_tx_iqlo_cal_cmds_recal_nphyrev3[] = { +static const u16 tbl_tx_iqlo_cal_cmds_recal_nphyrev3[] = {0x8423 ,0x8323 ,0x8073 ,0x8256 ,0x8045 ,0x8223 ,0x9423 ,0x9323 ,0x9073 ,0x9256 ,0x9045 ,0x9223 };
Greg Kroah-Hartman
maintainerPATCH 18/27 bus: mbus: fix window size calculation for 4GB windows
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Luebbe <[email protected]>
commit 2bbbd96357ce76cc45ec722c00f654aa7b189112 upstream.
At least the Armada XP SoC supports 4GB on a single DRAM window. Because the size register values contain the actual size - 1, the MSB is set in that case. For example, the SDRAM window's control register's value is 0xffffffe1 for 4GB (bits 31 to 24 contain the size).
The MBUS driver reads back each window's size from registers and calculates the actual size as (control_reg | ~DDR_SIZE_MASK) + 1, which overflows for 32 bit values, resulting in other miscalculations further on (a bad RAM window for the CESA crypto engine calculated by mvebu_mbus_setup_cpu_target_nooverlap() in my case).
This patch changes the type in 'struct mbus_dram_window' from u32 to u64, which allows us to keep using the same register calculation code in most MBUS-using drivers (which calculate ->size - 1 again).
--- drivers/bus/mvebu-mbus.c | 2 +- include/linux/mbus.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/bus/mvebu-mbus.c +1 -1
@@ -720,7 +720,7 @@ mvebu_mbus_default_setup_cpu_target(struif (mbus->hw_io_coherency) w->mbus_attr |=ATTR_HW_COHERENCY ; w->base = base &DDR_BASE_CS_LOW_MASK ; - w->size = (size | ~DDR_SIZE_MASK ) +1 ; + w->size = (u64)(size | ~DDR_SIZE_MASK ) +1 ; } } mvebu_mbus_dram_info.num_cs = cs;
include/linux/mbus.h +2 -2
@@ -29,8 +29,8 @@ struct mbus_dram_target_infostruct mbus_dram_window {u8 cs_index;u8 mbus_attr; -u32 base; -u32 size; +u64 base; +u64 size; } cs[4 ]; };
Greg Kroah-Hartman
maintainerPATCH 19/27 clockevents/drivers/cs5535: Improve resilience to spurious interrupts
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Kozub <[email protected]>
commit eb39a7c0355393c5a8d930f342ad7a6231b552c4 upstream.
The interrupt handler mfgpt_tick() is not robust versus spurious interrupts which happen before the clock event device is registered and fully initialized.
The reason is that the safe guard against spurious interrupts solely checks for the clockevents shutdown state, but lacks a check for detached state. If the interrupt hits while the device is in detached state it passes the safe guard and dereferences the event handler call back which is NULL.
Add the missing state check.
--- drivers/clocksource/cs5535-clockevt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/clocksource/cs5535-clockevt.c +2 -1
@@ -117,7 +117,8 @@ static irqreturn_t mfgpt_tick(int irq, v/* Turn off the clock (and clear the event) */ disable_timer (cs5535_event_clock); -if (clockevent_state_shutdown (&cs5535_clockevent)) +if (clockevent_state_detached (&cs5535_clockevent) || +clockevent_state_shutdown (&cs5535_clockevent))return IRQ_HANDLED ;/* Clear the counter */
Greg Kroah-Hartman
maintainerPATCH 20/27 rtlwifi: rtl8821ae: Fix connection lost problem
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit b8b8b16352cd90c6083033fd4487f04fae935c18 upstream.
In commit 40b368af4b75 ("rtlwifi: Fix alignment issues"), the read of REG_DBI_READ was changed from 16 to 8 bits. For unknown reasonsi this change results in reduced stability for the wireless connection. This regression was located using bisection.
--- drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c +1 -1
@@ -1127,7 +1127,7 @@ static u8 _rtl8821ae_dbi_read(struct rtl }if (0 == tmp) { read_addr =REG_DBI_RDATA + addr %4 ; - ret =rtl_read_byte (rtlpriv, read_addr); + ret =rtl_read_word (rtlpriv, read_addr); }return ret; }
Greg Kroah-Hartman
maintainerPATCH 21/27 KEYS: encrypted: fix dereference of NULL user_key_payload
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit 13923d0865ca96312197962522e88bc0aedccd74 upstream.
A key of type "encrypted" references a "master key" which is used to encrypt and decrypt the encrypted key's payload. However, when we accessed the master key's payload, we failed to handle the case where the master key has been revoked, which sets the payload pointer to NULL. Note that request_key() *does* skip revoked keys, but there is still a window where the key can be revoked before we acquire its semaphore.
Fix it by checking for a NULL payload, treating it like a key which was already revoked at the time it was requested.
This was an issue for master keys of type "user" only. Master keys can also be of type "trusted", but those cannot be revoked.
--- security/keys/encrypted-keys/encrypted.c | 7 +++++++ 1 file changed, 7 insertions(+)
security/keys/encrypted-keys/encrypted.c +7 -0
@@ -315,6 +315,13 @@ static struct key *request_user_key(consdown_read (&ukey->sem); upayload =user_key_payload (ukey); +if (!upayload) { +/* key was revoked before we acquired its semaphore */ +up_read (&ukey->sem); +key_put (ukey); + ukey =ERR_PTR (-EKEYREVOKED ); + goto error; + } *master_key = upayload->data; *master_keylen = upayload->datalen; error:
Greg Kroah-Hartman
maintainerPATCH 22/27 lib/digsig: fix dereference of NULL user_key_payload
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit 192cabd6a296cbc57b3d8c05c4c89d87fc102506 upstream.
digsig_verify() requests a user key, then accesses its payload. However, a revoked key has a NULL payload, and we failed to check for this. request_key() *does* skip revoked keys, but there is still a window where the key can be revoked before we acquire its semaphore.
Fix it by checking for a NULL payload, treating it like a key which was already revoked at the time it was requested.
--- lib/digsig.c | 6 ++++++ 1 file changed, 6 insertions(+)
lib/digsig.c +6 -0
@@ -87,6 +87,12 @@ static int digsig_verify_rsa(struct keydown_read (&key->sem); ukp =user_key_payload (key); +if (!ukp) { +/* key was revoked before we acquired its semaphore */ + err = -EKEYREVOKED ; + goto err1; + } +if (ukp->datalen <sizeof (*pkh)) goto err1;
Greg Kroah-Hartman
maintainerPATCH 23/27 KEYS: dont let add_key() update an uninstantiated key
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
commit 60ff5b2f547af3828aebafd54daded44cfb0807a upstream.
Currently, when passed a key that already exists, add_key() will call the key's ->update() method if such exists. But this is heavily broken in the case where the key is uninstantiated because it doesn't call __key_instantiate_and_link(). Consequently, it doesn't do most of the things that are supposed to happen when the key is instantiated, such as setting the instantiation state, clearing KEY_FLAG_USER_CONSTRUCT and awakening tasks waiting on it, and incrementing key->user->nikeys.
It also never takes key_construction_mutex, which means that ->instantiate() can run concurrently with ->update() on the same key. In the case of the "user" and "logon" key types this causes a memory leak, at best. Maybe even worse, the ->update() methods of the "encrypted" and "trusted" key types actually just dereference a NULL pointer when passed an uninstantiated key.
Change key_create_or_update() to wait interruptibly for the key to finish construction before continuing.
This patch only affects *uninstantiated* keys. For now we still allow a negatively instantiated key to be updated (thereby positively instantiating it), although that's broken too (the next patch fixes it) and I'm not sure that anyone actually uses that functionality either.
Here is a simple reproducer for the bug using the "encrypted" key type (requires CONFIG_ENCRYPTED_KEYS=y), though as noted above the bug pertained to more than just the "encrypted" key type:
#include <stdlib.h>
#include <unistd.h>
#include <keyutils.h>
int main(void)
{
int ringid = keyctl_join_session_keyring(NULL);
if (fork()) {
for (;;) {
const char payload[] = "update user:foo 32";
usleep(rand() % 10000);
add_key("encrypted", "desc", payload, sizeof(payload), ringid);
keyctl_clear(ringid);
}
} else {
for (;;)
request_key("encrypted", "desc", "callout_info", ringid);
}
}It causes:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
IP: encrypted_update+0xb0/0x170
PGD 7a178067 P4D 7a178067 PUD 77269067 PMD 0
PREEMPT SMP
CPU: 0 PID: 340 Comm: reproduce Tainted: G D 4.14.0-rc1-00025-g428490e38b2e #796
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
task: ffff8a467a39a340 task.stack: ffffb15c40770000
RIP: 0010:encrypted_update+0xb0/0x170
RSP: 0018:ffffb15c40773de8 EFLAGS: 00010246
RAX: 0000000000000000 RBX: ffff8a467a275b00 RCX: 0000000000000000
RDX: 0000000000000005 RSI: ffff8a467a275b14 RDI: ffffffffb742f303
RBP: ffffb15c40773e20 R08: 0000000000000000 R09: ffff8a467a275b17
R10: 0000000000000020 R11: 0000000000000000 R12: 0000000000000000
R13: 0000000000000000 R14: ffff8a4677057180 R15: ffff8a467a275b0f
FS: 00007f5d7fb08700(0000) GS:ffff8a467f200000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000018 CR3: 0000000077262005 CR4: 00000000001606f0
Call Trace:
key_create_or_update+0x2bc/0x460
SyS_add_key+0x10c/0x1d0
entry_SYSCALL_64_fastpath+0x1f/0xbe
RIP: 0033:0x7f5d7f211259
RSP: 002b:00007ffed03904c8 EFLAGS: 00000246 ORIG_RAX: 00000000000000f8
RAX: ffffffffffffffda RBX: 000000003b2a7955 RCX: 00007f5d7f211259
RDX: 00000000004009e4 RSI: 00000000004009ff RDI: 0000000000400a04
RBP: 0000000068db8bad R08: 000000003b2a7955 R09: 0000000000000004
R10: 000000000000001a R11: 0000000000000246 R12: 0000000000400868
R13: 00007ffed03905d0 R14: 0000000000000000 R15: 0000000000000000
Code: 77 28 e8 64 34 1f 00 45 31 c0 31 c9 48 8d 55 c8 48 89 df 48 8d 75 d0 e8 ff f9 ff ff 85 c0 41 89 c4 0f 88 84 00 00 00 4c 8b 7d c8 <49> 8b 75 18 4c 89 ff e8 24 f8 ff ff 85 c0 41 89 c4 78 6d 49 8b
RIP: encrypted_update+0xb0/0x170 RSP: ffffb15c40773de8
CR2: 0000000000000018--- security/keys/key.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
security/keys/key.c +10 -0
@@ -907,6 +907,16 @@ error:*/ __key_link_end (keyring, &index_key, edit); + key =key_ref_to_ptr (key_ref); +if (test_bit (KEY_FLAG_USER_CONSTRUCT , &key->flags)) { + ret =wait_for_key_construction (key, true); +if (ret <0 ) { +key_ref_put (key_ref); + key_ref =ERR_PTR (ret); + goto error_free_prep; + } + } + key_ref =__key_update (key_ref, &prep); goto error_free_prep; }
Greg Kroah-Hartman
maintainerPATCH 24/27 pkcs7: Prevent NULL pointer dereference, since sinfo is not always set.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Sesterhenn <[email protected]>
commit 68a1fdbbf8bd3378325e45c19e167a165f9ffc3a upstream.
The ASN.1 parser does not necessarily set the sinfo field, this patch prevents a NULL pointer dereference on broken input.
--- crypto/asymmetric_keys/pkcs7_parser.c | 3 +++ 1 file changed, 3 insertions(+)
crypto/asymmetric_keys/pkcs7_parser.c +3 -0
@@ -90,6 +90,9 @@ static int pkcs7_check_authattrs(structbool want; sinfo = msg->signed_infos; +if (!sinfo) + goto inconsistent; +if (sinfo->authattrs) { want = true; msg->have_authattrs = true;
Greg Kroah-Hartman
maintainerPATCH 25/27 parisc: Avoid trashing sr2 and sr3 in LWS code
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
commit f4125cfdb3008363137f744c101e5d76ead760ba upstream.
There is no need to trash sr2 and sr3 in the Light-weight syscall (LWS). sr2 already points to kernel space (it's zero in userspace, otherwise syscalls wouldn't work), and since the LWS code is executed in userspace, we can simply ignore to preload sr3.
--- arch/parisc/kernel/syscall.S | 53 +++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 29 deletions(-)
arch/parisc/kernel/syscall.S +24 -29
@@ -479,11 +479,6 @@ lws_start: comiclr,>> __NR_lws_entries, %r20, %r0 b,n lws_exit_nosys - /* WARNING: Trashing sr2 and sr3 */ - mfsp %sr7,%r1 /* get userspace into sr3 */ - mtsp %r1,%sr3 - mtsp %r0,%sr2 /* get kernel space into sr2 */ - /* Load table start */ ldil L%lws_table, %r1 ldo R%lws_table(%r1), %r28 /* Scratch use of r28 */
@@ -632,9 +627,9 @@ cas_action: stw %r1, 4(%sr2,%r20) #endif /* The load and store could fail */ -1: ldw,ma 0(%sr3,%r26), %r28 +1: ldw,ma 0(%r26), %r28 sub,<> %r28, %r25, %r0 -2: stw,ma %r24, 0(%sr3,%r26) +2: stw,ma %r24, 0(%r26) /* Free lock */ stw,ma %r20, 0(%sr2,%r20) #if ENABLE_LWS_DEBUG
@@ -711,9 +706,9 @@ lws_compare_and_swap_2: nop /* 8bit load */ -4: ldb 0(%sr3,%r25), %r25 +4: ldb 0(%r25), %r25 b cas2_lock_start -5: ldb 0(%sr3,%r24), %r24 +5: ldb 0(%r24), %r24 nop nop nop
@@ -721,9 +716,9 @@ lws_compare_and_swap_2: nop /* 16bit load */ -6: ldh 0(%sr3,%r25), %r25 +6: ldh 0(%r25), %r25 b cas2_lock_start -7: ldh 0(%sr3,%r24), %r24 +7: ldh 0(%r24), %r24 nop nop nop
@@ -731,9 +726,9 @@ lws_compare_and_swap_2: nop /* 32bit load */ -8: ldw 0(%sr3,%r25), %r25 +8: ldw 0(%r25), %r25 b cas2_lock_start -9: ldw 0(%sr3,%r24), %r24 +9: ldw 0(%r24), %r24 nop nop nop
@@ -742,14 +737,14 @@ lws_compare_and_swap_2: /* 64bit load */ #ifdef CONFIG_64BIT -10: ldd 0(%sr3,%r25), %r25 -11: ldd 0(%sr3,%r24), %r24 +10: ldd 0(%r25), %r25 +11: ldd 0(%r24), %r24 #else /* Load new value into r22/r23 - high/low */ -10: ldw 0(%sr3,%r25), %r22 -11: ldw 4(%sr3,%r25), %r23 +10: ldw 0(%r25), %r22 +11: ldw 4(%r25), %r23 /* Load new value into fr4 for atomic store later */ -12: flddx 0(%sr3,%r24), %fr4 +12: flddx 0(%r24), %fr4 #endif cas2_lock_start:
@@ -799,30 +794,30 @@ cas2_action: ldo 1(%r0),%r28 /* 8bit CAS */ -13: ldb,ma 0(%sr3,%r26), %r29 +13: ldb,ma 0(%r26), %r29 sub,= %r29, %r25, %r0 b,n cas2_end -14: stb,ma %r24, 0(%sr3,%r26) +14: stb,ma %r24, 0(%r26) b cas2_end copy %r0, %r28 nop nop /* 16bit CAS */ -15: ldh,ma 0(%sr3,%r26), %r29 +15: ldh,ma 0(%r26), %r29 sub,= %r29, %r25, %r0 b,n cas2_end -16: sth,ma %r24, 0(%sr3,%r26) +16: sth,ma %r24, 0(%r26) b cas2_end copy %r0, %r28 nop nop /* 32bit CAS */ -17: ldw,ma 0(%sr3,%r26), %r29 +17: ldw,ma 0(%r26), %r29 sub,= %r29, %r25, %r0 b,n cas2_end -18: stw,ma %r24, 0(%sr3,%r26) +18: stw,ma %r24, 0(%r26) b cas2_end copy %r0, %r28 nop
@@ -830,22 +825,22 @@ cas2_action: /* 64bit CAS */ #ifdef CONFIG_64BIT -19: ldd,ma 0(%sr3,%r26), %r29 +19: ldd,ma 0(%r26), %r29 sub,*= %r29, %r25, %r0 b,n cas2_end -20: std,ma %r24, 0(%sr3,%r26) +20: std,ma %r24, 0(%r26) copy %r0, %r28 #else /* Compare first word */ -19: ldw,ma 0(%sr3,%r26), %r29 +19: ldw,ma 0(%r26), %r29 sub,= %r29, %r22, %r0 b,n cas2_end /* Compare second word */ -20: ldw,ma 4(%sr3,%r26), %r29 +20: ldw,ma 4(%r26), %r29 sub,= %r29, %r23, %r0 b,n cas2_end /* Perform the store */ -21: fstdx %fr4, 0(%sr3,%r26) +21: fstdx %fr4, 0(%r26) copy %r0, %r28 #endif
Greg Kroah-Hartman
maintainerPATCH 26/27 parisc: Fix double-word compare and exchange in LWS code on 32-bit kernels
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
commit 374b3bf8e8b519f61eb9775888074c6e46b3bf0c upstream.
As discussed on the debian-hppa list, double-wordcompare and exchange operations fail on 32-bit kernels. Looking at the code, I realized that the ",ma" completer does the wrong thing in the "ldw,ma 4(%r26), %r29" instruction. This increments %r26 and causes the following store to write to the wrong location.
Note by Helge Deller:
The patch applies cleanly to stable kernel series if this upstream commit is merged in advance:f4125cfdb300 ("parisc: Avoid trashing sr2 and sr3 in LWS code").
--- arch/parisc/kernel/syscall.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/parisc/kernel/syscall.S +3 -3
@@ -740,7 +740,7 @@ lws_compare_and_swap_2: 10: ldd 0(%r25), %r25 11: ldd 0(%r24), %r24 #else - /* Load new value into r22/r23 - high/low */ + /* Load old value into r22/r23 - high/low */ 10: ldw 0(%r25), %r22 11: ldw 4(%r25), %r23 /* Load new value into fr4 for atomic store later */
@@ -832,11 +832,11 @@ cas2_action: copy %r0, %r28 #else /* Compare first word */ -19: ldw,ma 0(%r26), %r29 +19: ldw 0(%r26), %r29 sub,= %r29, %r22, %r0 b,n cas2_end /* Compare second word */ -20: ldw,ma 4(%r26), %r29 +20: ldw 4(%r26), %r29 sub,= %r29, %r23, %r0 b,n cas2_end /* Perform the store */
Greg Kroah-Hartman
maintainerPATCH 27/27 sched/autogroup: Fix autogroup_move_group() to never skip sched_move_task()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleg Nesterov <[email protected]>
commit 18f649ef344127ef6de23a5a4272dbe2fdb73dde upstream.
The PF_EXITING check in task_wants_autogroup() is no longer needed. Remove it, but see the next patch.
However the comment is correct in that autogroup_move_group() must always change task_group() for every thread so the sysctl_ check is very wrong; we can race with cgroups and even sys_setsid() is not safe because a task running with task_group() == ag->tg must participate in refcounting:
int main(void)
{
int sctl = open("/proc/sys/kernel/sched_autogroup_enabled", O_WRONLY);
assert(sctl > 0);
if (fork()) {
wait(NULL); // destroy the child's ag/tg
pause();
}
assert(pwrite(sctl, "1\n", 2, 0) == 2);
assert(setsid() > 0);
if (fork())
pause();
kill(getppid(), SIGKILL);
sleep(1);
// The child has gone, the grandchild runs with kref == 1
assert(pwrite(sctl, "0\n", 2, 0) == 2);
assert(setsid() > 0);
// runs with the freed ag/tg
for (;;)
sleep(1);
return 0;
}crashes the kernel. It doesn't really need sleep(1), it doesn't matter if autogroup_move_group() actually frees the task_group or this happens later.
--- kernel/sched/auto_group.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
kernel/sched/auto_group.c +12 -11
@@ -111,14 +111,11 @@ bool task_wants_autogroup(struct task_st {if (tg != &root_task_group)return false; -/* -* We can only assume the task group can't go away on us if -* autogroup_move_group() can see us on ->thread_group list. +* If we race with autogroup_move_group() the caller can use the old +* value of signal->autogroup but in this case sched_move_task() will +* be called again before autogroup_kref_put(). */ -if (p->flags &PF_EXITING ) -return false; -return true; }
@@ -138,13 +135,17 @@ autogroup_move_group(struct task_struct } p->signal->autogroup =autogroup_kref_get (ag); - -if (!READ_ONCE (sysctl_sched_autogroup_enabled)) - goto out; - +/* +* We can't avoid sched_move_task() after we changed signal->autogroup, +* this process can already run with task_group() == prev->tg or we can +* race with cgroup code which can read autogroup = prev under rq->lock. +* In the latter case for_each_thread() can not miss a migrating thread, +* cpu_cgroup_attach() must not be possible after cgroup_exit() and it +* can't be removed from thread list, we hold ->siglock. +*/ for_each_thread (p, t)sched_move_task (t); -out: +unlock_task_sighand (p, &flags);autogroup_kref_put (prev); }
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.95 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Oct 26 12:57:00 UTC 2017. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 116 pass: 116 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Quoted 17 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.95 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Oct 26 12:57:00 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.95-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.
Quoted 5 lines
thanks,
greg k-h
-------------
Results from the Linaro test farm. No regressions spotted.
Summary
------------------------------------------------------------------------
kernel: 4.4.95-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.4.y
git commit: a2b7c8b78a72a2da81ce896fd498a3cdf63a5702
git describe: v4.4.94-28-ga2b7c8b78a72
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.4-oe/build/v4.4.94-28-ga2b7c8b78a72
No regressions (compared to build v4.4.93-47-gcc1d76b2d639)
Boards, architectures and test suites:
-------------------------------------
juno-r2 - arm64
* boot - pass: 20
* kselftest - skip: 7, fail: 13, pass: 32 (known failures)
* libhugetlbfs - skip: 1, pass: 90
* ltp-cap_bounds-tests - pass: 2
* ltp-containers-tests - skip: 36, fail: 13, pass: 27 (known failures, test case setup issues)
* ltp-fcntl-locktests-tests - pass: 2
* ltp-filecaps-tests - pass: 2
* ltp-fs-tests - fail: 2, pass: 59
* ltp-fs_bind-tests - pass: 2
* ltp-fs_perms_simple-tests - pass: 19
* ltp-fsx-tests - pass: 2
* ltp-hugetlb-tests - pass: 22
* ltp-io-tests - pass: 3
* ltp-ipc-tests - pass: 9
* ltp-math-tests - pass: 11
* ltp-nptl-tests - pass: 2
* ltp-pty-tests - pass: 4
* ltp-sched-tests - pass: 10
* ltp-securebits-tests - pass: 4
* ltp-syscalls-tests - skip: 159, fail: 4, pass: 938 (known failures)
* ltp-timers-tests - pass: 13
x15 - arm
* boot - pass: 20
* kselftest - skip: 9, fail: 12, pass: 32 (known failures)
* ltp-cap_bounds-tests - pass: 2
* ltp-containers-tests - pass: 64
* ltp-fcntl-locktests-tests - pass: 2
* ltp-filecaps-tests - pass: 2
* ltp-fs-tests - pass: 60
* ltp-fs_bind-tests - pass: 2
* ltp-fs_perms_simple-tests - pass: 19
* ltp-fsx-tests - pass: 2
* ltp-io-tests - pass: 3
* ltp-ipc-tests - pass: 9
* ltp-math-tests - pass: 11
* ltp-nptl-tests - pass: 2
* ltp-pty-tests - pass: 4
* ltp-sched-tests - skip: 1, pass: 13
* ltp-securebits-tests - pass: 4
* ltp-syscalls-tests - skip: 68, fail: 4, pass: 1036 (known failures)
* ltp-timers-tests - pass: 13
dell-poweredge-r200 - x86_64
* boot - pass: 20
* kselftest - fail: 24, pass: 42 (known failures)
* libhugetlbfs - skip: 1, pass: 76
* ltp-cap_bounds-tests - pass: 2
* ltp-containers-tests - pass: 64
* ltp-fcntl-locktests-tests - pass: 2
* ltp-filecaps-tests - pass: 2
* ltp-fs-tests - skip: 1, pass: 61
* ltp-fs_bind-tests - pass: 2
* ltp-fs_perms_simple-tests - pass: 19
* ltp-fsx-tests - pass: 2
* ltp-hugetlb-tests - pass: 22
* ltp-io-tests - pass: 3
* ltp-ipc-tests - pass: 9
* ltp-math-tests - pass: 11
* ltp-nptl-tests - pass: 2
* ltp-pty-tests - pass: 4
* ltp-sched-tests - skip: 1, pass: 9
* ltp-securebits-tests - pass: 4
* ltp-syscalls-tests - skip: 164, fail: 3, pass: 960 (known failures)
* ltp-timers-tests - pass: 13
As Hikey with 4.4 requires some platform enablement patches, we report it’s results separately.
Summary
------------------------------------------------------------------------
kernel: 4.4.95-rc1
git repo: https://git.linaro.org/lkft/arm64-stable-rc.git
git tag: 4.4.95-rc1-hikey-20171024
git commit: 342b31177c919b75bc683f9cb79b78132c17ffab
git describe: 4.4.95-rc1-hikey-20171024
Test details: https://qa-reports.linaro.org/lkft/linaro-hikey-stable-rc-4.4-oe/build/4.4.95-rc1-hikey-20171024
No regressions (compared to build 4.4.94-rc1-hikey-20171019)
Boards, architectures and test suites:
-------------------------------------
hi6220-hikey - arm64
* boot - pass: 20
* kselftest - skip: 9, fail: 13, pass: 32 (known failures)
* libhugetlbfs - skip: 1, pass: 90
* ltp-cap_bounds-tests - pass: 2
* ltp-containers-tests - skip: 36, fail: 13, pass: 27 (known failures)
* ltp-fcntl-locktests-tests - pass: 2
* ltp-filecaps-tests - pass: 2
* ltp-fs-tests - fail: 2, pass: 59
* ltp-fs_bind-tests - pass: 2
* ltp-fs_perms_simple-tests - pass: 19
* ltp-fsx-tests - pass: 2
* ltp-hugetlb-tests - skip: 1, pass: 21
* ltp-io-tests - pass: 3
* ltp-ipc-tests - pass: 9
* ltp-math-tests - pass: 11
* ltp-nptl-tests - pass: 2
* ltp-pty-tests - pass: 4
* ltp-sched-tests - pass: 14
* ltp-securebits-tests - pass: 4
* ltp-syscalls-tests - skip: 125, fail: 3, pass: 980 (known failures)
* ltp-timers-tests - pass: 13
Documentation - https://collaborate.linaro.org/display/LKFT/Email+Reports
A message that is not in the archive (sent off-list or not yet received): [email protected]
Greg Kroah-Hartman
maintainerQuoted 12 lines · kernelci.org bot
stable-rc/linux-4.4.y boot: 43 boots: 1 failed, 42 passed (v4.4.94-28-ga2b7c8b78a72)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-4.4.y/kernel/v4.4.94-28-ga2b7c8b78a72/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-4.4.y/kernel/v4.4.94-28-ga2b7c8b78a72/Tree: stable-rc
Branch: linux-4.4.y
Git Describe: v4.4.94-28-ga2b7c8b78a72
Git Commit:a2b7c8b78a72a2da81ce896fd498a3cdf63a5702
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 14 unique boards, 8 SoC families, 9 builds out of 182
Quoted 6 lines
Boot Failure Detected:
arm:
omap2plus_defconfig
am335x-boneblack_rootfs:nfs: 1 failed lab
This also failed for 3.18, is it a bad lab/device or did I break something for that platform?
thanks,
greg k-h
Quoted 15 lines · Greg Kroah-Hartman
Quoted 14 lines · kernelci.org bot
stable-rc/linux-4.4.y boot: 43 boots: 1 failed, 42 passed (v4.4.94-28-ga2b7c8b78a72)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-4.4.y/kernel/v4.4.94-28-ga2b7c8b78a72/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-4.4.y/kernel/v4.4.94-28-ga2b7c8b78a72/Tree: stable-rc
Branch: linux-4.4.y
Git Describe: v4.4.94-28-ga2b7c8b78a72
Git Commit:a2b7c8b78a72a2da81ce896fd498a3cdf63a5702
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 14 unique boards, 8 SoC families, 9 builds out of 182Boot Failure Detected:
Quoted 7 lines
Quoted 4 lines
arm:
omap2plus_defconfig
am335x-boneblack_rootfs:nfs: 1 failed labThis also failed for 3.18, is it a bad lab/device or did I break something for that platform?
Sorry for the (travel) lag... looks like a lab issue.
Kevin