4.14.170-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.14.170-stable review
This is the start of the stable review cycle for the 4.14.170 release. There are 89 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, 05 Feb 2020 16:17:59 +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/v4.x/stable-review/patch-4.14.170-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.14.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.14.170-rc1
Praveen Chaudhary <[email protected]>
net: Fix skb->csum update in inet_proto_csum_replace16().
Vasily Averin <[email protected]>
l2t_seq_next should increase position index
Vasily Averin <[email protected]>
seq_tab_next() should increase position index
Finn Thain <[email protected]>
net/sonic: Quiesce SONIC before re-initializing descriptor memory
Finn Thain <[email protected]>
net/sonic: Fix receive buffer handling
Finn Thain <[email protected]>
net/sonic: Use MMIO accessors
Finn Thain <[email protected]>
net/sonic: Add mutual exclusion for accessing shared state
Madalin Bucur <[email protected]>
net: fsl/fman: rename IF_MODE_XGMII to IF_MODE_10G
Madalin Bucur <[email protected]>
net/fsl: treat fsl,erratum-a011043
Madalin Bucur <[email protected]>
powerpc/fsl/dts: add fsl,erratum-a011043
Manish Chopra <[email protected]>
qlcnic: Fix CPU soft lockup while collecting firmware dump
Hayes Wang <[email protected]>
r8152: get default setting of WOL before initializing
Michael Ellerman <[email protected]>
airo: Add missing CAP_NET_ADMIN check in AIROOLDIOCTL/SIOCDEVPRIVATE
Michael Ellerman <[email protected]>
airo: Fix possible info leak in AIROOLDIOCTL/SIOCDEVPRIVATE
Vincenzo Frascino <[email protected]>
tee: optee: Fix compilation issue with nommu
Vladimir Murzin <[email protected]>
ARM: 8955/1: virt: Relax arch timer version check during early boot
Hannes Reinecke <[email protected]>
scsi: fnic: do not queue commands during fwreset
Nicolas Dichtel <[email protected]>
vti[6]: fix packet tx through bpf_redirect()
Matwey V. Kornilov <[email protected]>
ARM: dts: am335x-boneblack-common: fix memory size
Johan Hovold <[email protected]>
Input: aiptek - use descriptors of current altsetting
Luca Coelho <[email protected]>
iwlwifi: mvm: fix NVM check for 3168 devices
Michael Chan <[email protected]>
bnxt_en: Fix ipv6 RFS filter matching logic.
Florian Fainelli <[email protected]>
net: dsa: bcm_sf2: Configure IMP port for 2Gb/sec
Arnd Bergmann <[email protected]>
wireless: wext: avoid gcc -O3 warning
Jouni Malinen <[email protected]>
mac80211: Fix TKIP replay protection immediately after key setup
Orr Mazor <[email protected]>
cfg80211: Fix radar event during another phy CAC
Ganapathi Bhat <[email protected]>
wireless: fix enabling channel 12 for custom regulatory domain
Kristian Evensen <[email protected]>
qmi_wwan: Add support for Quectel RM500Q
Arnaud Pouliquen <[email protected]>
ASoC: sti: fix possible sleep-in-atomic
Manfred Rudigier <[email protected]>
igb: Fix SGMII SFP module discovery for 100FX/LX.
Cambda Zhu <[email protected]>
ixgbe: Fix calculation of queue with VFs and flow director on interface flap
Radoslaw Tyl <[email protected]>
ixgbevf: Remove limit of 10 entries for unicast filter list
Lubomir Rintel <[email protected]>
clk: mmp2: Fix the order of timer mux parents
Markus Theil <[email protected]>
mac80211: mesh: restrict airtime metric to peered established plinks
Dave Gerlach <[email protected]>
soc: ti: wkup_m3_ipc: Fix race condition with rproc_boot
Kishon Vijay Abraham I <[email protected]>
ARM: dts: beagle-x15-common: Model 5V0 regulator
Marek Szyprowski <[email protected]>
ARM: dts: sun8i: a83t: Correct USB3503 GPIOs polarity
Lee Jones <[email protected]>
media: si470x-i2c: Move free() past last use of 'radio'
Michal Koutný <[email protected]>
cgroup: Prevent double killing of css when enabling threaded cgroup
Dan Carpenter <[email protected]>
Bluetooth: Fix race condition in hci_release_sock()
Zhenzhong Duan <[email protected]>
ttyprintk: fix a potential deadlock in interrupt context issue
Hans Verkuil <[email protected]>
media: dvb-usb/dvb-usb-urb.c: initialize actlen to 0
Hans Verkuil <[email protected]>
media: gspca: zero usb_buf
Sean Young <[email protected]>
media: af9005: uninitialized variable printked
Sean Young <[email protected]>
media: digitv: don't continue if remote control state can't be read
Jan Kara <[email protected]>
reiserfs: Fix memory leak of journal device string
Dan Carpenter <[email protected]>
mm/mempolicy.c: fix out of bounds write in mpol_parse_str()
Theodore Ts'o <[email protected]>
ext4: validate the debug_want_extra_isize mount option at parse time
Dirk Behme <[email protected]>
arm64: kbuild: remove compressed images on 'make ARCH=arm64 (dist)clean'
Vitaly Chikunov <[email protected]>
tools lib: Fix builds when glibc contains strlcpy()
Chanwoo Choi <[email protected]>
PM / devfreq: Add new name attribute for sysfs
Andres Freund <[email protected]>
perf c2c: Fix return type for histogram sorting comparision functions
Herbert Xu <[email protected]>
crypto: pcrypt - Fix user-after-free on module unload
Xiaochen Shen <[email protected]>
x86/resctrl: Fix a deadlock due to inaccurate reference
Xiaochen Shen <[email protected]>
x86/resctrl: Fix use-after-free due to inaccurate refcount of rdtgroup
Xiaochen Shen <[email protected]>
x86/resctrl: Fix use-after-free when deleting resource groups
Al Viro <[email protected]>
vfs: fix do_last() regression
Herbert Xu <[email protected]>
crypto: af_alg - Use bh_lock_sock in sk_destruct
Johan Hovold <[email protected]>
rsi: fix use-after-free on probe errors
Eric Dumazet <[email protected]>
net_sched: ematch: reject invalid TCF_EM_SIMPLE
Laura Abbott <[email protected]>
usb-storage: Disable UAS on JMicron SATA enclosure
Slawomir Pawlowski <[email protected]>
PCI: Add DMA alias quirk for Intel VCA NTB
Arnd Bergmann <[email protected]>
atm: eni: fix uninitialized variable warning
Dmitry Osipenko <[email protected]>
gpio: max77620: Add missing dependency on GPIOLIB_IRQCHIP
Krzysztof Kozlowski <[email protected]>
net: wan: sdla: Fix cast from pointer to integer of different size
Fenghua Yu <[email protected]>
drivers/net/b44: Change to non-atomic bit operations on pwol_mask
wuxu.wu <[email protected]>
spi: spi-dw: Add lock protect dw_spi rx/tx to prevent concurrent calls
Andreas Kemnade <[email protected]>
watchdog: rn5t618_wdt: fix module aliases
David Engraf <[email protected]>
watchdog: max77620_wdt: fix potential build errors
Tony Lindgren <[email protected]>
phy: cpcap-usb: Prevent USB line glitches from waking up modem
Hans de Goede <[email protected]>
HID: ite: Add USB id match for Acer SW5-012 keyboard dock
Randy Dunlap <[email protected]>
arc: eznps: fix allmodconfig kconfig warning
Johan Hovold <[email protected]>
zd1211rw: fix storage endpoint lookup
Johan Hovold <[email protected]>
rtl8xxxu: fix interface sanity check
Johan Hovold <[email protected]>
brcmfmac: fix interface sanity check
Johan Hovold <[email protected]>
ath9k: fix storage endpoint lookup
Eric Biggers <[email protected]>
crypto: chelsio - fix writing tfm flags to wrong place
Lukas Wunner <[email protected]>
serial: 8250_bcm2835aux: Fix line mismatch on driver unbind
Malcolm Priestley <[email protected]>
staging: vt6656: Fix false Tx excessive retries reporting.
Malcolm Priestley <[email protected]>
staging: vt6656: use NULLFUCTION stack on mac80211
Malcolm Priestley <[email protected]>
staging: vt6656: correct packet types for CTS protect, mode.
Colin Ian King <[email protected]>
staging: wlan-ng: ensure error return is actually returned
Andrey Shvetsov <[email protected]>
staging: most: net: fix buffer overflow
Bin Liu <[email protected]>
usb: dwc3: turn off VBUS when leaving host mode
Johan Hovold <[email protected]>
USB: serial: ir-usb: fix IrLAP framing
Johan Hovold <[email protected]>
USB: serial: ir-usb: fix link-speed handling
Johan Hovold <[email protected]>
USB: serial: ir-usb: add missing endpoint sanity check
Johan Hovold <[email protected]>
rsi_91x_usb: fix interface sanity check
Johan Hovold <[email protected]>
orinoco_usb: fix interface sanity check
-------------
Diffstat:
Documentation/ABI/testing/sysfs-class-devfreq | 7 ++ Makefile | 4 +- arch/arc/plat-eznps/Kconfig | 2 +- arch/arm/boot/dts/am335x-boneblack-common.dtsi | 5 + arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi | 21 ++++ arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts | 2 +- arch/arm/kernel/hyp-stub.S | 7 +- arch/arm64/boot/Makefile | 2 +- .../dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi | 1 + .../dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi | 1 + arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 38 +++--- crypto/af_alg.c | 6 +- crypto/pcrypt.c | 3 +- drivers/atm/eni.c | 4 +- drivers/char/ttyprintk.c | 15 ++- drivers/clk/mmp/clk-of-mmp2.c | 2 +- drivers/crypto/chelsio/chcr_algo.c | 16 +-- drivers/devfreq/devfreq.c | 9 ++ drivers/gpio/Kconfig | 1 + drivers/hid/hid-ids.h | 1 + drivers/hid/hid-ite.c | 3 + drivers/input/tablet/aiptek.c | 2 +- drivers/media/radio/si470x/radio-si470x-i2c.c | 2 +- drivers/media/usb/dvb-usb/af9005.c | 2 +- drivers/media/usb/dvb-usb/digitv.c | 10 +- drivers/media/usb/dvb-usb/dvb-usb-urb.c | 2 +- drivers/media/usb/gspca/gspca.c | 2 +- drivers/net/dsa/bcm_sf2.c | 2 +- drivers/net/ethernet/broadcom/b44.c | 9 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 22 +++- drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | 3 +- drivers/net/ethernet/chelsio/cxgb4/l2t.c | 3 +- drivers/net/ethernet/freescale/fman/fman_memac.c | 4 +- drivers/net/ethernet/freescale/xgmac_mdio.c | 7 +- drivers/net/ethernet/intel/igb/e1000_82575.c | 8 +- drivers/net/ethernet/intel/igb/igb_ethtool.c | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 37 ++++-- drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 - drivers/net/ethernet/natsemi/sonic.c | 109 ++++++++++++++--- drivers/net/ethernet/natsemi/sonic.h | 25 ++-- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 1 + .../net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | 2 + drivers/net/usb/qmi_wwan.c | 1 + drivers/net/usb/r8152.c | 9 +- drivers/net/wan/sdla.c | 2 +- drivers/net/wireless/ath/ath9k/hif_usb.c | 2 +- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 4 +- drivers/net/wireless/cisco/airo.c | 20 ++- drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 2 +- .../net/wireless/intersil/orinoco/orinoco_usb.c | 4 +- .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +- drivers/net/wireless/rsi/rsi_91x_hal.c | 12 +- drivers/net/wireless/rsi/rsi_91x_usb.c | 2 +- drivers/net/wireless/zydas/zd1211rw/zd_usb.c | 2 +- drivers/pci/quirks.c | 34 ++++++ drivers/phy/motorola/phy-cpcap-usb.c | 18 ++- drivers/scsi/fnic/fnic_scsi.c | 3 + drivers/soc/ti/wkup_m3_ipc.c | 4 +- drivers/spi/spi-dw.c | 15 ++- drivers/spi/spi-dw.h | 1 + drivers/staging/most/aim-network/networking.c | 10 ++ drivers/staging/vt6656/device.h | 2 + drivers/staging/vt6656/int.c | 6 +- drivers/staging/vt6656/main_usb.c | 1 + drivers/staging/vt6656/rxtx.c | 26 ++-- drivers/staging/wlan-ng/prism2mgmt.c | 2 +- drivers/tee/optee/Kconfig | 1 + drivers/tty/serial/8250/8250_bcm2835aux.c | 2 +- drivers/usb/dwc3/core.c | 3 + drivers/usb/serial/ir-usb.c | 136 ++++++++++++++++----- drivers/usb/storage/unusual_uas.h | 7 +- drivers/watchdog/Kconfig | 1 + drivers/watchdog/rn5t618_wdt.c | 1 + fs/ext4/super.c | 127 ++++++++++--------- fs/namei.c | 4 +- fs/reiserfs/super.c | 2 + include/linux/usb/irda.h | 13 +- include/net/cfg80211.h | 5 + kernel/cgroup/cgroup.c | 11 +- mm/mempolicy.c | 6 +- net/bluetooth/hci_sock.c | 3 + net/core/utils.c | 20 ++- net/ipv4/ip_vti.c | 13 +- net/ipv6/ip6_vti.c | 13 +- net/mac80211/cfg.c | 23 ++++ net/mac80211/mesh_hwmp.c | 3 + net/mac80211/tkip.c | 18 ++- net/sched/ematch.c | 3 + net/wireless/rdev-ops.h | 10 ++ net/wireless/reg.c | 36 +++++- net/wireless/trace.h | 5 + net/wireless/wext-core.c | 3 +- sound/soc/sti/uniperif_player.c | 7 +- tools/include/linux/string.h | 8 ++ tools/lib/string.c | 7 ++ tools/perf/builtin-c2c.c | 10 +- 112 files changed, 802 insertions(+), 308 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/89 orinoco_usb: fix interface sanity check
From: Johan Hovold <[email protected]>
commit b73e05aa543cf8db4f4927e36952360d71291d41 upstream.
Make sure to use the current alternate setting when verifying the interface descriptors to avoid binding to an invalid interface.
Failing to do so could cause the driver to misbehave or trigger a WARN() in usb_submit_urb() that kernels with panic_on_warn set would choke on.
--- drivers/net/wireless/intersil/orinoco/orinoco_usb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/intersil/orinoco/orinoco_usb.c +2 -2
@@ -1613,9 +1613,9 @@ static int ezusb_probe(struct usb_interf/* set up the endpoint information */ /* check out the endpoints */ - iface_desc = &interface->altsetting[0 ].desc; + iface_desc = &interface->cur_altsetting->desc;for (i =0 ; i < iface_desc->bNumEndpoints; ++i) { - ep = &interface->altsetting[0 ].endpoint[i].desc; + ep = &interface->cur_altsetting->endpoint[i].desc;if (usb_endpoint_is_bulk_in (ep)) {/* we found a bulk in endpoint */
Greg Kroah-Hartman
maintainerPATCH 2/89 rsi_91x_usb: fix interface sanity check
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 3139b180906af43bc09bd3373fc2338a8271d9d9 upstream.
Make sure to use the current alternate setting when verifying the interface descriptors to avoid binding to an invalid interface.
Failing to do so could cause the driver to misbehave or trigger a WARN() in usb_submit_urb() that kernels with panic_on_warn set would choke on.
--- drivers/net/wireless/rsi/rsi_91x_usb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/rsi/rsi_91x_usb.c +1 -1
@@ -105,7 +105,7 @@ static int rsi_find_bulk_in_and_out_endp__le16 buffer_size;int ii, bep_found =0 ; - iface_desc = &(interface->altsetting[0 ]); + iface_desc = interface->cur_altsetting;for (ii =0 ; ii < iface_desc->desc.bNumEndpoints; ++ii) { endpoint = &(iface_desc->endpoint[ii].desc);
Greg Kroah-Hartman
maintainerPATCH 3/89 USB: serial: ir-usb: add missing endpoint sanity check
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 2988a8ae7476fe9535ab620320790d1714bdad1d upstream.
Add missing endpoint sanity check to avoid dereferencing a NULL-pointer on open() in case a device lacks a bulk-out endpoint.
Note that prior to commit f4a4cbb2047e ("USB: ir-usb: reimplement using generic framework") the oops would instead happen on open() if the device lacked a bulk-in endpoint and on write() if it lacked a bulk-out endpoint.
--- drivers/usb/serial/ir-usb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/ir-usb.c +3 -0
@@ -199,6 +199,9 @@ static int ir_startup(struct usb_serialstruct usb_irda_cs_descriptor *irda_desc;int rates; +if (serial->num_bulk_in <1 || serial->num_bulk_out <1 ) +return -ENODEV ; + irda_desc =irda_usb_find_class_desc (serial,0 );if (!irda_desc) { dev_err(&serial->dev->dev,
Greg Kroah-Hartman
maintainerPATCH 4/89 USB: serial: ir-usb: fix link-speed handling
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 17a0184ca17e288decdca8b2841531e34d49285f upstream.
Commit e0d795e4f36c ("usb: irda: cleanup on ir-usb module") added a USB IrDA header with common defines, but mistakingly switched to using the class-descriptor baud-rate bitmask values for the outbound header.
This broke link-speed handling for rates above 9600 baud, but a device would also be able to operate at the default 9600 baud until a link-speed request was issued (e.g. using the TCGETS ioctl).
--- drivers/usb/serial/ir-usb.c | 20 ++++++++++---------- include/linux/usb/irda.h | 13 ++++++++++++- 2 files changed, 22 insertions(+), 11 deletions(-)
drivers/usb/serial/ir-usb.c +10 -10
@@ -339,34 +339,34 @@ static void ir_set_termios(struct tty_stswitch (baud) {case 2400 : - ir_baud =USB_IRDA_BR_2400 ; + ir_baud =USB_IRDA_LS_2400 ;break ;case 9600 : - ir_baud =USB_IRDA_BR_9600 ; + ir_baud =USB_IRDA_LS_9600 ;break ;case 19200 : - ir_baud =USB_IRDA_BR_19200 ; + ir_baud =USB_IRDA_LS_19200 ;break ;case 38400 : - ir_baud =USB_IRDA_BR_38400 ; + ir_baud =USB_IRDA_LS_38400 ;break ;case 57600 : - ir_baud =USB_IRDA_BR_57600 ; + ir_baud =USB_IRDA_LS_57600 ;break ;case 115200 : - ir_baud =USB_IRDA_BR_115200 ; + ir_baud =USB_IRDA_LS_115200 ;break ;case 576000 : - ir_baud =USB_IRDA_BR_576000 ; + ir_baud =USB_IRDA_LS_576000 ;break ;case 1152000 : - ir_baud =USB_IRDA_BR_1152000 ; + ir_baud =USB_IRDA_LS_1152000 ;break ;case 4000000 : - ir_baud =USB_IRDA_BR_4000000 ; + ir_baud =USB_IRDA_LS_4000000 ;break ;default : - ir_baud =USB_IRDA_BR_9600 ; + ir_baud =USB_IRDA_LS_9600 ; baud =9600 ; }
include/linux/usb/irda.h +12 -1
@@ -119,11 +119,22 @@ struct usb_irda_cs_descriptor {* 6 - 115200 bps * 7 - 576000 bps * 8 - 1.152 Mbps -* 9 - 5 mbps +* 9 - 4 Mbps * 10..15 - Reserved */ #define USB_IRDA_STATUS_LINK_SPEED 0x0f +#define USB_IRDA_LS_NO_CHANGE 0 +#define USB_IRDA_LS_2400 1 +#define USB_IRDA_LS_9600 2 +#define USB_IRDA_LS_19200 3 +#define USB_IRDA_LS_38400 4 +#define USB_IRDA_LS_57600 5 +#define USB_IRDA_LS_115200 6 +#define USB_IRDA_LS_576000 7 +#define USB_IRDA_LS_1152000 8 +#define USB_IRDA_LS_4000000 9 +/* The following is a 4-bit value used only for * outbound header: *
Greg Kroah-Hartman
maintainerPATCH 5/89 USB: serial: ir-usb: fix IrLAP framing
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 38c0d5bdf4973f9f5a888166e9d3e9ed0d32057a upstream.
Commit f4a4cbb2047e ("USB: ir-usb: reimplement using generic framework") switched to using the generic write implementation which may combine multiple write requests into larger transfers. This can break the IrLAP protocol where end-of-frame is determined using the USB short packet mechanism, for example, if multiple frames are sent in rapid succession.
--- drivers/usb/serial/ir-usb.c | 113 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 91 insertions(+), 22 deletions(-)
drivers/usb/serial/ir-usb.c +91 -22
@@ -49,9 +49,10 @@ static int buffer_size;static int xbof =-1 ;static int ir_startup (struct usb_serial *serial); -static int ir_open (struct tty_struct *tty,struct usb_serial_port *port); -static int ir_prepare_write_buffer (struct usb_serial_port *port, -void *dest,size_t size); +static int ir_write (struct tty_struct *tty,struct usb_serial_port *port, +const unsigned char *buf,int count); +static int ir_write_room (struct tty_struct *tty); +static void ir_write_bulk_callback (struct urb *urb);static void ir_process_read_urb (struct urb *urb);static void ir_set_termios (struct tty_struct *tty,struct usb_serial_port *port,struct ktermios *old_termios);
@@ -81,8 +82,9 @@ static struct usb_serial_driver ir_devic .num_ports = 1, .set_termios = ir_set_termios, .attach = ir_startup, - .open = ir_open, - .prepare_write_buffer = ir_prepare_write_buffer, + .write = ir_write, + .write_room = ir_write_room, + .write_bulk_callback = ir_write_bulk_callback, .process_read_urb = ir_process_read_urb, };
@@ -258,35 +260,102 @@ static int ir_startup(struct usb_serialreturn 0 ; } -static int ir_open (struct tty_struct *tty,struct usb_serial_port *port) +static int ir_write (struct tty_struct *tty,struct usb_serial_port *port, +const unsigned char *buf,int count) { -int i; +struct urb *urb =NULL ; +unsigned long flags; +int ret; -for (i =0 ; i <ARRAY_SIZE (port->write_urbs); ++i) - port->write_urbs[i]->transfer_flags =URB_ZERO_PACKET ; +if (port->bulk_out_size ==0 ) +return -EINVAL ; -/* Start reading from the device */ -return usb_serial_generic_open (tty, port); -} +if (count ==0 ) +return 0 ; -static int ir_prepare_write_buffer (struct usb_serial_port *port, -void *dest,size_t size) -{ -unsigned char *buf = dest; -int count; + count =min (count, port->bulk_out_size -1 ); + +spin_lock_irqsave (&port->lock, flags); +if (__test_and_clear_bit (0 , &port->write_urbs_free)) { + urb = port->write_urbs[0 ]; + port->tx_bytes += count; + } +spin_unlock_irqrestore (&port->lock, flags); + +if (!urb) +return 0 ;/* * The first byte of the packet we send to the device contains an -* inbound header which indicates an additional number of BOFs and +* outbound header which indicates an additional number of BOFs and * a baud rate change. * * See section 5.4.2.2 of the USB IrDA spec. */ - *buf = ir_xbof | ir_baud; + *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud; + +memcpy (urb->transfer_buffer +1 , buf, count); + + urb->transfer_buffer_length = count +1 ; + urb->transfer_flags =URB_ZERO_PACKET ; + + ret =usb_submit_urb (urb,GFP_ATOMIC ); +if (ret) { +dev_err (&port->dev,"failed to submit write urb: %d\n" , ret); + +spin_lock_irqsave (&port->lock, flags); +__set_bit (0 , &port->write_urbs_free); + port->tx_bytes -= count; +spin_unlock_irqrestore (&port->lock, flags); + +return ret; + } + +return count; +} + +static void ir_write_bulk_callback (struct urb *urb) +{ +struct usb_serial_port *port = urb->context; +int status = urb->status; +unsigned long flags; + +spin_lock_irqsave (&port->lock, flags); +__set_bit (0 , &port->write_urbs_free); + port->tx_bytes -= urb->transfer_buffer_length -1 ; +spin_unlock_irqrestore (&port->lock, flags); + +switch (status) { +case 0 : +break ; +case -ENOENT : +case -ECONNRESET : +case -ESHUTDOWN : +dev_dbg (&port->dev,"write urb stopped: %d\n" , status); +return ; +case -EPIPE : +dev_err (&port->dev,"write urb stopped: %d\n" , status); +return ; +default : +dev_err (&port->dev,"nonzero write-urb status: %d\n" , status); +break ; + } + +usb_serial_port_softint (port); +} + +static int ir_write_room (struct tty_struct *tty) +{ +struct usb_serial_port *port = tty->driver_data; +int count =0 ; + +if (port->bulk_out_size ==0 ) +return 0 ; + +if (test_bit (0 , &port->write_urbs_free)) + count = port->bulk_out_size -1 ; - count =kfifo_out_locked (&port->write_fifo, buf +1 , size -1 , - &port->lock); -return count +1 ; +return count; }static void ir_process_read_urb (struct urb *urb)
Greg Kroah-Hartman
maintainerPATCH 6/89 usb: dwc3: turn off VBUS when leaving host mode
In reply to Greg Kroah-HartmanFrom: Bin Liu <[email protected]>
commit 09ed259fac621634d51cd986aa8d65f035662658 upstream.
VBUS should be turned off when leaving the host mode.
Set GCTL_PRTCAP to device mode in teardown to de-assert DRVVBUS pin to turn off VBUS power.
--- drivers/usb/dwc3/core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/dwc3/core.c +3 -0
@@ -1031,6 +1031,9 @@ static void dwc3_core_exit_mode(struct d/* do nothing */ break ; } + +/* de-assert DRVVBUS for HOST and OTG mode */ +dwc3_set_prtcap (dwc,DWC3_GCTL_PRTCAP_DEVICE ); }static void dwc3_get_properties (struct dwc3 *dwc)
Greg Kroah-Hartman
maintainerPATCH 7/89 staging: most: net: fix buffer overflow
In reply to Greg Kroah-HartmanFrom: Andrey Shvetsov <[email protected]>
commit 4d1356ac12f4d5180d0df345d85ff0ee42b89c72 upstream.
If the length of the socket buffer is 0xFFFFFFFF (max size for an unsigned int), then payload_len becomes 0xFFFFFFF1 after subtracting 14 (ETH_HLEN). Then, mdp_len is set to payload_len + 16 (MDP_HDR_LEN) which overflows and results in a value of 2. These values for payload_len and mdp_len will pass current buffer size checks.
This patch checks if derived from skb->len sum may overflow.
The check is based on the following idea:
For any unsigned V1, V2 and derived unsigned SUM = V1 + V2, V1 + V2 overflows iif SUM < V1.
--- drivers/staging/most/aim-network/networking.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/staging/most/aim-network/networking.c +10 -0
@@ -85,6 +85,11 @@ static int skb_to_mamac(const struct sk_unsigned int payload_len = skb->len -ETH_HLEN ;unsigned int mdp_len = payload_len +MDP_HDR_LEN ; +if (mdp_len < skb->len) { +pr_err ("drop: too large packet! (%u)\n" , skb->len); +return -EINVAL ; + } +if (mbo->buffer_length < mdp_len) {pr_err ("drop: too small buffer! (%d for %d)\n" , mbo->buffer_length, mdp_len);
@@ -132,6 +137,11 @@ static int skb_to_mep(const struct sk_buu8 *buff = mbo->virt_address;unsigned int mep_len = skb->len +MEP_HDR_LEN ; +if (mep_len < skb->len) { +pr_err ("drop: too large packet! (%u)\n" , skb->len); +return -EINVAL ; + } +if (mbo->buffer_length < mep_len) {pr_err ("drop: too small buffer! (%d for %d)\n" , mbo->buffer_length, mep_len);
Greg Kroah-Hartman
maintainerPATCH 8/89 staging: wlan-ng: ensure error return is actually returned
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
commit 4cc41cbce536876678b35e03c4a8a7bb72c78fa9 upstream.
Currently when the call to prism2sta_ifst fails a netdev_err error is reported, error return variable result is set to -1 but the function always returns 0 for success. Fix this by returning the error value in variable result rather than 0.
Addresses-Coverity: ("Unused value")
--- drivers/staging/wlan-ng/prism2mgmt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/wlan-ng/prism2mgmt.c +1 -1
@@ -945,7 +945,7 @@ int prism2mgmt_flashdl_state(struct wlan } } -return 0 ; +return result; }/*----------------------------------------------------------------
Greg Kroah-Hartman
maintainerPATCH 9/89 staging: vt6656: correct packet types for CTS protect, mode.
In reply to Greg Kroah-HartmanFrom: Malcolm Priestley <[email protected]>
commit d971fdd3412f8342747778fb59b8803720ed82b1 upstream.
It appears that the driver still transmits in CTS protect mode even though it is not enabled in mac80211.
That is both packet types PK_TYPE_11GA and PK_TYPE_11GB both use CTS protect. The only difference between them GA does not use B rates.
Find if only B rate in GB or GA in protect mode otherwise transmit packets as PK_TYPE_11A.
--- drivers/staging/vt6656/device.h | 2 ++ drivers/staging/vt6656/rxtx.c | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-)
drivers/staging/vt6656/device.h +2 -0
@@ -62,6 +62,8 @@#define RATE_AUTO 12#define MAX_RATE 12 +#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ + BIT(RATE_5M) | BIT(RATE_11M))/* * device specific
drivers/staging/vt6656/rxtx.c +8 -4
@@ -825,10 +825,14 @@ int vnt_tx_packet(struct vnt_private *prif (info->band ==NL80211_BAND_5GHZ ) { pkt_type =PK_TYPE_11A ; }else { -if (tx_rate->flags &IEEE80211_TX_RC_USE_CTS_PROTECT ) - pkt_type =PK_TYPE_11GB ; -else - pkt_type =PK_TYPE_11GA ; +if (tx_rate->flags &IEEE80211_TX_RC_USE_CTS_PROTECT ) { +if (priv->basic_rates &VNT_B_RATES ) + pkt_type =PK_TYPE_11GB ; +else + pkt_type =PK_TYPE_11GA ; + }else { + pkt_type =PK_TYPE_11A ; + } } }else { pkt_type =PK_TYPE_11B ;
Greg Kroah-Hartman
maintainerPATCH 10/89 staging: vt6656: use NULLFUCTION stack on mac80211
In reply to Greg Kroah-HartmanFrom: Malcolm Priestley <[email protected]>
commit d579c43c82f093e63639151625b2139166c730fd upstream.
It appears that the drivers does not go into power save correctly the NULL data packets are not being transmitted because it not enabled in mac80211.
The driver needs to capture ieee80211_is_nullfunc headers and copy the duration_id to it's own duration data header.
--- drivers/staging/vt6656/main_usb.c | 1 + drivers/staging/vt6656/rxtx.c | 14 +++++--------- 2 files changed, 6 insertions(+), 9 deletions(-)
drivers/staging/vt6656/main_usb.c +1 -0
@@ -977,6 +977,7 @@ vt6656_probe(struct usb_interface *intf,ieee80211_hw_set (priv->hw,RX_INCLUDES_FCS );ieee80211_hw_set (priv->hw,REPORTS_TX_ACK_STATUS );ieee80211_hw_set (priv->hw,SUPPORTS_PS ); +ieee80211_hw_set (priv->hw,PS_NULLFUNC_STACK ); priv->hw->max_signal =100 ;
drivers/staging/vt6656/rxtx.c +5 -9
@@ -288,11 +288,9 @@ static u16 vnt_rxtx_datahead_g(struct vn PK_TYPE_11B, &buf->b);/* Get Duration and TimeStamp */ -if (ieee80211_is_pspoll (hdr->frame_control)) { -__le16 dur =cpu_to_le16 (priv->current_aid |BIT (14 ) |BIT (15 )); - - buf->duration_a = dur; - buf->duration_b = dur; +if (ieee80211_is_nullfunc (hdr->frame_control)) { + buf->duration_a = hdr->duration_id; + buf->duration_b = hdr->duration_id; }else { buf->duration_a =vnt_get_duration_le (priv, tx_context->pkt_type, need_ack);
@@ -381,10 +379,8 @@ static u16 vnt_rxtx_datahead_ab(struct v tx_context->pkt_type, &buf->ab);/* Get Duration and TimeStampOff */ -if (ieee80211_is_pspoll (hdr->frame_control)) { -__le16 dur =cpu_to_le16 (priv->current_aid |BIT (14 ) |BIT (15 )); - - buf->duration = dur; +if (ieee80211_is_nullfunc (hdr->frame_control)) { + buf->duration = hdr->duration_id; }else { buf->duration =vnt_get_duration_le (priv, tx_context->pkt_type, need_ack);
Greg Kroah-Hartman
maintainerPATCH 11/89 staging: vt6656: Fix false Tx excessive retries reporting.
In reply to Greg Kroah-HartmanFrom: Malcolm Priestley <[email protected]>
commit 9dd631fa99dc0a0dfbd191173bf355ba30ea786a upstream.
The driver reporting IEEE80211_TX_STAT_ACK is not being handled correctly. The driver should only report on TSR_TMO flag is not set indicating no transmission errors and when not IEEE80211_TX_CTL_NO_ACK is being requested.
--- drivers/staging/vt6656/int.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/staging/vt6656/int.c +4 -2
@@ -107,9 +107,11 @@ static int vnt_int_report_rate(struct vn info->status.rates[0 ].count = tx_retry; -if (!(tsr & (TSR_TMO |TSR_RETRYTMO ))) { +if (!(tsr &TSR_TMO )) { info->status.rates[0 ].idx = idx; - info->flags |=IEEE80211_TX_STAT_ACK ; + +if (!(info->flags &IEEE80211_TX_CTL_NO_ACK )) + info->flags |=IEEE80211_TX_STAT_ACK ; }ieee80211_tx_status_irqsafe (priv->hw, context->skb);
Greg Kroah-Hartman
maintainerPATCH 12/89 serial: 8250_bcm2835aux: Fix line mismatch on driver unbind
In reply to Greg Kroah-HartmanFrom: Lukas Wunner <[email protected]>
commit dc76697d7e933d5e299116f219c890568785ea15 upstream.
Unbinding the bcm2835aux UART driver raises the following error if the maximum number of 8250 UARTs is set to 1 (via the 8250.nr_uarts module parameter or CONFIG_SERIAL_8250_RUNTIME_UARTS):
(NULL device *): Removing wrong port: a6f80333 != fa20408b
That's because bcm2835aux_serial_probe() retrieves UART line number 1 from the devicetree and stores it in data->uart.port.line, while serial8250_register_8250_port() instead uses UART line number 0, which is stored in data->line.
On driver unbind, bcm2835aux_serial_remove() uses data->uart.port.line, which contains the wrong number. Fix it.
The issue does not occur if the maximum number of 8250 UARTs is >= 2.
--- drivers/tty/serial/8250/8250_bcm2835aux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/8250/8250_bcm2835aux.c +1 -1
@@ -119,7 +119,7 @@ static int bcm2835aux_serial_remove(stru {struct bcm2835aux_data *data =platform_get_drvdata (pdev); -serial8250_unregister_port (data->uart.port.line); +serial8250_unregister_port (data->line);clk_disable_unprepare (data->clk);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 13/89 crypto: chelsio - fix writing tfm flags to wrong place
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit bd56cea012fc2d6381e8cd3209510ce09f9de8c9 upstream.
The chelsio crypto driver is casting 'struct crypto_aead' directly to 'struct crypto_tfm', which is incorrect because the crypto_tfm isn't the first field of 'struct crypto_aead'. Consequently, the calls to crypto_tfm_set_flags() are modifying some other field in the struct.
Also, the driver is setting CRYPTO_TFM_RES_BAD_KEY_LEN in ->setauthsize(), not just in ->setkey(). This is incorrect since this flag is for bad key lengths, not for bad authentication tag lengths.
Fix these bugs by removing the broken crypto_tfm_set_flags() calls from ->setauthsize() and by fixing them in ->setkey().
--- drivers/crypto/chelsio/chcr_algo.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-)
drivers/crypto/chelsio/chcr_algo.c +3 -13
@@ -2693,9 +2693,6 @@ static int chcr_gcm_setauthsize(struct c aeadctx->mayverify =VERIFY_SW ;break ;default : - -crypto_tfm_set_flags ((struct crypto_tfm *) tfm, -CRYPTO_TFM_RES_BAD_KEY_LEN );return -EINVAL ; }return crypto_aead_setauthsize (aeadctx->sw_cipher, authsize);
@@ -2720,8 +2717,6 @@ static int chcr_4106_4309_setauthsize(st aeadctx->mayverify =VERIFY_HW ;break ;default : -crypto_tfm_set_flags ((struct crypto_tfm *)tfm, -CRYPTO_TFM_RES_BAD_KEY_LEN );return -EINVAL ; }return crypto_aead_setauthsize (aeadctx->sw_cipher, authsize);
@@ -2762,8 +2757,6 @@ static int chcr_ccm_setauthsize(struct c aeadctx->mayverify =VERIFY_HW ;break ;default : -crypto_tfm_set_flags ((struct crypto_tfm *)tfm, -CRYPTO_TFM_RES_BAD_KEY_LEN );return -EINVAL ; }return crypto_aead_setauthsize (aeadctx->sw_cipher, authsize);
@@ -2790,8 +2783,7 @@ static int chcr_ccm_common_setkey(struct ck_size =CHCR_KEYCTX_CIPHER_KEY_SIZE_256 ; mk_size =CHCR_KEYCTX_MAC_KEY_SIZE_256 ; }else { -crypto_tfm_set_flags ((struct crypto_tfm *)aead, -CRYPTO_TFM_RES_BAD_KEY_LEN ); +crypto_aead_set_flags (aead,CRYPTO_TFM_RES_BAD_KEY_LEN ); aeadctx->enckey_len =0 ;return -EINVAL ; }
@@ -2831,8 +2823,7 @@ static int chcr_aead_rfc4309_setkey(struint error;if (keylen <3 ) { -crypto_tfm_set_flags ((struct crypto_tfm *)aead, -CRYPTO_TFM_RES_BAD_KEY_LEN ); +crypto_aead_set_flags (aead,CRYPTO_TFM_RES_BAD_KEY_LEN ); aeadctx->enckey_len =0 ;return -EINVAL ; }
@@ -2883,8 +2874,7 @@ static int chcr_gcm_setkey(struct crypto }else if (keylen ==AES_KEYSIZE_256 ) { ck_size =CHCR_KEYCTX_CIPHER_KEY_SIZE_256 ; }else { -crypto_tfm_set_flags ((struct crypto_tfm *)aead, -CRYPTO_TFM_RES_BAD_KEY_LEN ); +crypto_aead_set_flags (aead,CRYPTO_TFM_RES_BAD_KEY_LEN );pr_err ("GCM: Invalid key length %d\n" , keylen); ret = -EINVAL ; goto out;
Greg Kroah-Hartman
maintainerPATCH 14/89 ath9k: fix storage endpoint lookup
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 0ef332951e856efa89507cdd13ba8f4fb8d4db12 upstream.
Make sure to use the current alternate setting when verifying the storage interface descriptors to avoid submitting an URB to an invalid endpoint.
Failing to do so could cause the driver to misbehave or trigger a WARN() in usb_submit_urb() that kernels with panic_on_warn set would choke on.
--- drivers/net/wireless/ath/ath9k/hif_usb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath9k/hif_usb.c +1 -1
@@ -1214,7 +1214,7 @@ err_fw:static int send_eject_command (struct usb_interface *interface) {struct usb_device *udev =interface_to_usbdev (interface); -struct usb_host_interface *iface_desc = &interface->altsetting[0 ]; +struct usb_host_interface *iface_desc = interface->cur_altsetting;struct usb_endpoint_descriptor *endpoint;unsigned char *cmd;u8 bulk_out_ep;
Greg Kroah-Hartman
maintainerPATCH 15/89 brcmfmac: fix interface sanity check
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 3428fbcd6e6c0850b1a8b2a12082b7b2aabb3da3 upstream.
Make sure to use the current alternate setting when verifying the interface descriptors to avoid binding to an invalid interface.
Failing to do so could cause the driver to misbehave or trigger a WARN() in usb_submit_urb() that kernels with panic_on_warn set would choke on.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +2 -2
@@ -1333,7 +1333,7 @@ brcmf_usb_probe(struct usb_interface *in goto fail; } - desc = &intf->altsetting[0 ].desc; + desc = &intf->cur_altsetting->desc;if ((desc->bInterfaceClass !=USB_CLASS_VENDOR_SPEC ) || (desc->bInterfaceSubClass !=2 ) || (desc->bInterfaceProtocol !=0xff )) {
@@ -1346,7 +1346,7 @@ brcmf_usb_probe(struct usb_interface *in num_of_eps = desc->bNumEndpoints;for (ep =0 ; ep < num_of_eps; ep++) { - endpoint = &intf->altsetting[0 ].endpoint[ep].desc; + endpoint = &intf->cur_altsetting->endpoint[ep].desc; endpoint_num =usb_endpoint_num (endpoint);if (!usb_endpoint_xfer_bulk (endpoint))continue ;
Greg Kroah-Hartman
maintainerPATCH 16/89 rtl8xxxu: fix interface sanity check
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 39a4281c312f2d226c710bc656ce380c621a2b16 upstream.
Make sure to use the current alternate setting when verifying the interface descriptors to avoid binding to an invalid interface.
Failing to do so could cause the driver to misbehave or trigger a WARN() in usb_submit_urb() that kernels with panic_on_warn set would choke on.
--- drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +1 -1
@@ -5921,7 +5921,7 @@ static int rtl8xxxu_parse_usb(struct rtlu8 dir, xtype, num;int ret =0 ; - host_interface = &interface->altsetting[0 ]; + host_interface = interface->cur_altsetting; interface_desc = &host_interface->desc; endpoints = interface_desc->bNumEndpoints;
Greg Kroah-Hartman
maintainerPATCH 17/89 zd1211rw: fix storage endpoint lookup
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 2d68bb2687abb747558b933e80845ff31570a49c upstream.
Make sure to use the current alternate setting when verifying the storage interface descriptors to avoid submitting an URB to an invalid endpoint.
Failing to do so could cause the driver to misbehave or trigger a WARN() in usb_submit_urb() that kernels with panic_on_warn set would choke on.
--- drivers/net/wireless/zydas/zd1211rw/zd_usb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/zydas/zd1211rw/zd_usb.c +1 -1
@@ -1272,7 +1272,7 @@ static void print_id(struct usb_device *static int eject_installer (struct usb_interface *intf) {struct usb_device *udev =interface_to_usbdev (intf); -struct usb_host_interface *iface_desc = &intf->altsetting[0 ]; +struct usb_host_interface *iface_desc = intf->cur_altsetting;struct usb_endpoint_descriptor *endpoint;unsigned char *cmd;u8 bulk_out_ep;
Greg Kroah-Hartman
maintainerPATCH 18/89 arc: eznps: fix allmodconfig kconfig warning
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit 1928b36cfa4df1aeedf5f2644d0c33f3a1fcfd7b ]
Fix kconfig warning for arch/arc/plat-eznps/Kconfig allmodconfig:
WARNING: unmet direct dependencies detected for CLKSRC_NPS
Depends on [n]: GENERIC_CLOCKEVENTS [=y] && !PHYS_ADDR_T_64BIT [=y] Selected by [y]:
- ARC_PLAT_EZNPS [=y]
--- arch/arc/plat-eznps/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arc/plat-eznps/Kconfig +1 -1
@@ -7,7 +7,7 @@ menuconfig ARC_PLAT_EZNPS bool "\"EZchip\" ARC dev platform" select CPU_BIG_ENDIAN - select CLKSRC_NPS + select CLKSRC_NPS if !PHYS_ADDR_T_64BIT select EZNPS_GIC select EZCHIP_NPS_MANAGEMENT_ENET if ETHERNET help
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 19/89 HID: ite: Add USB id match for Acer SW5-012 keyboard dock
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 8f18eca9ebc57d6b150237033f6439242907e0ba ]
The Acer SW5-012 2-in-1 keyboard dock uses a Synaptics S91028 touchpad which is connected to an ITE 8595 USB keyboard controller chip.
This keyboard has the same quirk for its rfkill / airplane mode hotkey as other keyboards with the ITE 8595 chip, it only sends a single release event when pressed and released, it never sends a press event.
This commit adds this keyboards USB id to the hid-ite id-table, fixing the rfkill key not working on this keyboard.
--- drivers/hid/hid-ids.h | 1 + drivers/hid/hid-ite.c | 3 +++ 2 files changed, 4 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -1024,6 +1024,7 @@#define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10#define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3#define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3 +#define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968#define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710#define USB_VENDOR_ID_TEXAS_INSTRUMENTS 0x2047
drivers/hid/hid-ite.c +3 -0
@@ -43,6 +43,9 @@ static int ite_event(struct hid_device *hdev, struct hid_field *field,static const struct hid_device_id ite_devices[] = { {HID_USB_DEVICE (USB_VENDOR_ID_ITE ,USB_DEVICE_ID_ITE8595 ) }, {HID_USB_DEVICE (USB_VENDOR_ID_258A ,USB_DEVICE_ID_258A_6A88 ) }, +/* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */ + {HID_USB_DEVICE (USB_VENDOR_ID_SYNAPTICS , +USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 ) }, { } };MODULE_DEVICE_TABLE (hid, ite_devices);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 20/89 phy: cpcap-usb: Prevent USB line glitches from waking up modem
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 63078b6ba09e842f09df052c5728857389fddcd2 ]
The micro-USB connector on Motorola Mapphone devices can be muxed between the SoC and the mdm6600 modem. But even when used for the SoC, configuring the PHY with ID pin grounded will wake up the modem from idle state. Looks like the issue is probably caused by line glitches.
We can prevent the glitches by using a previously unknown mode of the GPIO mux to prevent the USB lines from being connected to the moden while configuring the USB PHY, and enable the USB lines after configuring the PHY.
Note that this only prevents waking up mdm6600 as regular USB A-host mode, and does not help when connected to a lapdock. The lapdock specific issue still needs to be debugged separately.
--- drivers/phy/motorola/phy-cpcap-usb.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
drivers/phy/motorola/phy-cpcap-usb.c +15 -3
@@ -115,7 +115,7 @@ struct cpcap_usb_ints_state {enum cpcap_gpio_mode {CPCAP_DM_DP ,CPCAP_MDM_RX_TX , -CPCAP_UNKNOWN , +CPCAP_UNKNOWN_DISABLED ,/* Seems to disable USB lines */ CPCAP_OTG_DM_DP , };
@@ -379,7 +379,8 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) {int error; - error =cpcap_usb_gpio_set_mode (ddata,CPCAP_DM_DP ); +/* Disable lines to prevent glitches from waking up mdm6600 */ + error =cpcap_usb_gpio_set_mode (ddata,CPCAP_UNKNOWN_DISABLED );if (error) goto out_err;
@@ -406,6 +407,11 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata)if (error) goto out_err; +/* Enable UART mode */ + error =cpcap_usb_gpio_set_mode (ddata,CPCAP_DM_DP ); +if (error) + goto out_err; +return 0 ; out_err:
@@ -418,7 +424,8 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) {int error; - error =cpcap_usb_gpio_set_mode (ddata,CPCAP_OTG_DM_DP ); +/* Disable lines to prevent glitches from waking up mdm6600 */ + error =cpcap_usb_gpio_set_mode (ddata,CPCAP_UNKNOWN_DISABLED );if (error)return error;
@@ -458,6 +465,11 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata)if (error) goto out_err; +/* Enable USB mode */ + error =cpcap_usb_gpio_set_mode (ddata,CPCAP_OTG_DM_DP ); +if (error) + goto out_err; +return 0 ; out_err:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 21/89 watchdog: max77620_wdt: fix potential build errors
In reply to Greg Kroah-HartmanFrom: David Engraf <[email protected]>
[ Upstream commit da9e3f4e30a53cd420cf1e6961c3b4110f0f21f0 ]
max77620_wdt uses watchdog core functions. Enable CONFIG_WATCHDOG_CORE to fix potential build errors.
--- drivers/watchdog/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/watchdog/Kconfig +1 -0
@@ -563,6 +563,7 @@ config MAX63XX_WATCHDOG config MAX77620_WATCHDOG tristate "Maxim Max77620 Watchdog Timer" depends on MFD_MAX77620 || COMPILE_TEST + select WATCHDOG_CORE help This is the driver for the Max77620 watchdog timer. Say 'Y' here to enable the watchdog timer support for
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 22/89 watchdog: rn5t618_wdt: fix module aliases
In reply to Greg Kroah-HartmanFrom: Andreas Kemnade <[email protected]>
[ Upstream commit a76dfb859cd42df6e3d1910659128ffcd2fb6ba2 ]
Platform device aliases were missing so module autoloading did not work.
--- drivers/watchdog/rn5t618_wdt.c | 1 + 1 file changed, 1 insertion(+)
drivers/watchdog/rn5t618_wdt.c +1 -0
@@ -193,6 +193,7 @@ static struct platform_driver rn5t618_wdt_driver = {module_platform_driver (rn5t618_wdt_driver); +MODULE_ALIAS ("platform:rn5t618-wdt" );MODULE_AUTHOR ("Beniamino Galvani <[email protected]>" );MODULE_DESCRIPTION ("RN5T618 watchdog driver" );MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 23/89 spi: spi-dw: Add lock protect dw_spi rx/tx to prevent concurrent calls
In reply to Greg Kroah-HartmanFrom: wuxu.wu <[email protected]>
[ Upstream commit 19b61392c5a852b4e8a0bf35aecb969983c5932d ]
dw_spi_irq() and dw_spi_transfer_one concurrent calls.
I find a panic in dw_writer(): txw = *(u8 *)(dws->tx), when dw->tx==null, dw->len==4, and dw->tx_end==1.
When tpm driver's message overtime dw_spi_irq() and dw_spi_transfer_one may concurrent visit dw_spi, so I think dw_spi structure lack of protection.
Otherwise dw_spi_transfer_one set dw rx/tx buffer and then open irq, store dw rx/tx instructions and other cores handle irq load dw rx/tx instructions may out of order.
[ 1025.321302] Call trace: ... [ 1025.321319] __crash_kexec+0x98/0x148 [ 1025.321323] panic+0x17c/0x314 [ 1025.321329] die+0x29c/0x2e8 [ 1025.321334] die_kernel_fault+0x68/0x78 [ 1025.321337] __do_kernel_fault+0x90/0xb0 [ 1025.321346] do_page_fault+0x88/0x500 [ 1025.321347] do_translation_fault+0xa8/0xb8 [ 1025.321349] do_mem_abort+0x68/0x118 [ 1025.321351] el1_da+0x20/0x8c [ 1025.321362] dw_writer+0xc8/0xd0 [ 1025.321364] interrupt_transfer+0x60/0x110 [ 1025.321365] dw_spi_irq+0x48/0x70 ...
--- drivers/spi/spi-dw.c | 15 ++++++++++++--- drivers/spi/spi-dw.h | 1 + 2 files changed, 13 insertions(+), 3 deletions(-)
drivers/spi/spi-dw.c +12 -3
@@ -180,9 +180,11 @@ static inline u32 rx_max(struct dw_spi *dws)static void dw_writer (struct dw_spi *dws) { -u32 max =tx_max (dws); +u32 max;u16 txw =0 ; +spin_lock (&dws->buf_lock); + max =tx_max (dws);while (max--) {/* Set the tx word if the transfer's original "tx" is not null */ if (dws->tx_end - dws->len) {
@@ -194,13 +196,16 @@ static void dw_writer(struct dw_spi *dws)dw_write_io_reg (dws,DW_SPI_DR , txw); dws->tx += dws->n_bytes; } +spin_unlock (&dws->buf_lock); }static void dw_reader (struct dw_spi *dws) { -u32 max =rx_max (dws); +u32 max;u16 rxw; +spin_lock (&dws->buf_lock); + max =rx_max (dws);while (max--) { rxw =dw_read_io_reg (dws,DW_SPI_DR );/* Care rx only if the transfer's original "rx" is not null */
@@ -212,6 +217,7 @@ static void dw_reader(struct dw_spi *dws) } dws->rx += dws->n_bytes; } +spin_unlock (&dws->buf_lock); }static void int_error_stop (struct dw_spi *dws,const char *msg)
@@ -284,18 +290,20 @@ static int dw_spi_transfer_one(struct spi_master *master, {struct dw_spi *dws =spi_master_get_devdata (master);struct chip_data *chip =spi_get_ctldata (spi); +unsigned long flags;u8 imask =0 ;u16 txlevel =0 ;u32 cr0;int ret; dws->dma_mapped =0 ; - +spin_lock_irqsave (&dws->buf_lock, flags); dws->tx = (void *)transfer->tx_buf; dws->tx_end = dws->tx + transfer->len; dws->rx = transfer->rx_buf; dws->rx_end = dws->rx + transfer->len; dws->len = transfer->len; +spin_unlock_irqrestore (&dws->buf_lock, flags);spi_enable_chip (dws,0 );
@@ -486,6 +494,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) dws->type =SSI_MOTO_SPI ; dws->dma_inited =0 ; dws->dma_addr = (dma_addr_t)(dws->paddr +DW_SPI_DR ); +spin_lock_init (&dws->buf_lock); ret =request_irq (dws->irq, dw_spi_irq,IRQF_SHARED ,dev_name (dev), master);
drivers/spi/spi-dw.h +1 -0
@@ -117,6 +117,7 @@ struct dw_spi {size_t len;void *tx;void *tx_end; +spinlock_t buf_lock;void *rx;void *rx_end;int dma_mapped;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 24/89 drivers/net/b44: Change to non-atomic bit operations on pwol_mask
In reply to Greg Kroah-HartmanFrom: Fenghua Yu <[email protected]>
[ Upstream commit f11421ba4af706cb4f5703de34fa77fba8472776 ]
Atomic operations that span cache lines are super-expensive on x86 (not just to the current processor, but also to other processes as all memory operations are blocked until the operation completes). Upcoming x86 processors have a switch to cause such operations to generate a #AC trap. It is expected that some real time systems will enable this mode in BIOS.
In preparation for this, it is necessary to fix code that may execute atomic instructions with operands that cross cachelines because the #AC trap will crash the kernel.
Since "pwol_mask" is local and never exposed to concurrency, there is no need to set bits in pwol_mask using atomic operations.
Directly operate on the byte which contains the bit instead of using __set_bit() to avoid any big endian concern due to type cast to unsigned long in __set_bit().
--- drivers/net/ethernet/broadcom/b44.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/ethernet/broadcom/b44.c +6 -3
@@ -1521,8 +1521,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)int ethaddr_bytes =ETH_ALEN ;memset (ppattern + offset,0xff , magicsync); -for (j =0 ; j < magicsync; j++) -set_bit (len++, (unsigned long *) pmask); +for (j =0 ; j < magicsync; j++) { + pmask[len >>3 ] |=BIT (len &7 ); + len++; + }for (j =0 ; j <B44_MAX_PATTERNS ; j++) {if ((B44_PATTERN_SIZE - len) >=ETH_ALEN )
@@ -1534,7 +1536,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)for (k =0 ; k< ethaddr_bytes; k++) { ppattern[offset + magicsync + (j *ETH_ALEN ) + k] = macaddr[k]; -set_bit (len++, (unsigned long *) pmask); + pmask[len >>3 ] |=BIT (len &7 ); + len++; } }return len -1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 25/89 net: wan: sdla: Fix cast from pointer to integer of different size
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 00c0688cecadbf7ac2f5b4cdb36d912a2d3f0cca ]
Since net_device.mem_start is unsigned long, it should not be cast to int right before casting to pointer. This fixes warning (compile testing on alpha architecture):
drivers/net/wan/sdla.c: In function ‘sdla_transmit’:
drivers/net/wan/sdla.c:711:13: warning:
cast to pointer from integer of different size [-Wint-to-pointer-cast]
--- drivers/net/wan/sdla.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wan/sdla.c +1 -1
@@ -711,7 +711,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb,spin_lock_irqsave (&sdla_lock, flags);SDLA_WINDOW (dev, addr); - pbuf = (void *)(((int ) dev->mem_start) + (addr &SDLA_ADDR_MASK )); + pbuf = (void *)(dev->mem_start + (addr &SDLA_ADDR_MASK ));__sdla_write (dev, pbuf->buf_addr, skb->data, skb->len);SDLA_WINDOW (dev, addr); pbuf->opp_flag =1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 26/89 gpio: max77620: Add missing dependency on GPIOLIB_IRQCHIP
In reply to Greg Kroah-HartmanFrom: Dmitry Osipenko <[email protected]>
[ Upstream commit c5706c7defc79de68a115b5536376298a8fef111 ]
Driver fails to compile in a minimized kernel's configuration because of the missing dependency on GPIOLIB_IRQCHIP.
error: ‘struct gpio_chip’ has no member named ‘irq’
44 | virq = irq_find_mapping(gpio->gpio_chip.irq.domain, offset);
--- drivers/gpio/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/gpio/Kconfig +1 -0
@@ -990,6 +990,7 @@ config GPIO_LP87565 config GPIO_MAX77620 tristate "GPIO support for PMIC MAX77620 and MAX20024" depends on MFD_MAX77620 + select GPIOLIB_IRQCHIP help GPIO driver for MAX77620 and MAX20024 PMIC from Maxim Semiconductor. MAX77620 PMIC has 8 pins that can be configured as GPIOs. The
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 27/89 atm: eni: fix uninitialized variable warning
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 30780d086a83332adcd9362281201cee7c3d9d19 ]
With -O3, gcc has found an actual unintialized variable stored into an mmio register in two instances:
drivers/atm/eni.c: In function 'discard':drivers/atm/eni.c:465:13: error: 'dma[1]' is used uninitialized in this function [-Werror=uninitialized]
writel(dma[i*2+1],eni_dev->rx_dma+dma_wr*8+4);
^drivers/atm/eni.c:465:13: error: 'dma[3]' is used uninitialized in this function [-Werror=uninitialized]
Change the code to always write zeroes instead.
--- drivers/atm/eni.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/atm/eni.c +2 -2
@@ -372,7 +372,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, here = (eni_vcc->descr+skip) & (eni_vcc->words-1 ); dma[j++] = (here <<MID_DMA_COUNT_SHIFT ) | (vcc->vci <<MID_DMA_VCI_SHIFT ) |MID_DT_JK ; - j++; + dma[j++] =0 ; } here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1 );if (!eff) size += skip;
@@ -445,7 +445,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb,if (size != eff) { dma[j++] = (here <<MID_DMA_COUNT_SHIFT ) | (vcc->vci <<MID_DMA_VCI_SHIFT ) |MID_DT_JK ; - j++; + dma[j++] =0 ; }if (!j || j >2 *RX_DMA_BUF ) { printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n");
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 28/89 PCI: Add DMA alias quirk for Intel VCA NTB
In reply to Greg Kroah-HartmanFrom: Slawomir Pawlowski <[email protected]>
[ Upstream commit 56b4cd4b7da9ee95778eb5c8abea49f641ebfd91 ]
Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices exposing computational units via Non Transparent Bridges (NTB, PEX 87xx).
Similarly to MIC x200, we need to add DMA aliases to allow buffer access when IOMMU is enabled.
Add aliases to allow computational unit access to host memory. These aliases mark the whole VCA device as one IOMMU group.
All possible slot numbers (0x20) are used, since we are unable to tell what slot is used on other side. This quirk is intended for both host and computational unit sides. The VCA devices have up to five functions: four for DMA channels and one additional.
--- drivers/pci/quirks.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
drivers/pci/quirks.c +34 -0
@@ -4019,6 +4019,40 @@ static void quirk_mic_x200_dma_alias(struct pci_dev *pdev)DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2260 , quirk_mic_x200_dma_alias);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2264 , quirk_mic_x200_dma_alias); +/* +* Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices +* exposing computational units via Non Transparent Bridges (NTB, PEX 87xx). +* +* Similarly to MIC x200, we need to add DMA aliases to allow buffer access +* when IOMMU is enabled. These aliases allow computational unit access to +* host memory. These aliases mark the whole VCA device as one IOMMU +* group. +* +* All possible slot numbers (0x20) are used, since we are unable to tell +* what slot is used on other side. This quirk is intended for both host +* and computational unit sides. The VCA devices have up to five functions +* (four for DMA channels and one additional). +*/ +static void quirk_pex_vca_alias (struct pci_dev *pdev) +{ +const unsigned int num_pci_slots =0x20 ; +unsigned int slot; + +for (slot =0 ; slot < num_pci_slots; slot++) { +pci_add_dma_alias (pdev,PCI_DEVFN (slot,0x0 )); +pci_add_dma_alias (pdev,PCI_DEVFN (slot,0x1 )); +pci_add_dma_alias (pdev,PCI_DEVFN (slot,0x2 )); +pci_add_dma_alias (pdev,PCI_DEVFN (slot,0x3 )); +pci_add_dma_alias (pdev,PCI_DEVFN (slot,0x4 )); + } +} +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2954 , quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2955 , quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2956 , quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2958 , quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2959 , quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x295A , quirk_pex_vca_alias); +/* * The IOMMU and interrupt controller on Broadcom Vulcan/Cavium ThunderX2 are * associated not at the root bus, but at a bridge below. This quirk avoids
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 29/89 usb-storage: Disable UAS on JMicron SATA enclosure
In reply to Greg Kroah-HartmanFrom: Laura Abbott <[email protected]>
[ Upstream commit bc3bdb12bbb3492067c8719011576370e959a2e6 ]
Steve Ellis reported incorrect block sizes and alignement offsets with a SATA enclosure. Adding a quirk to disable UAS fixes the problems.
--- drivers/usb/storage/unusual_uas.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/usb/storage/unusual_uas.h +5 -2
@@ -163,12 +163,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_IGNORE_UAS), -/* Reported-by: Takeo Nakayama <[email protected]> */ +/* +* Initially Reported-by: Takeo Nakayama <[email protected]> +* UAS Ignore Reported by Steven Ellis <[email protected]> +*/ UNUSUAL_DEV (0x357d ,0x7788 ,0x0000 ,0x9999 ,"JMicron" ,"JMS566" ,USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , -US_FL_NO_REPORT_OPCODES ), +US_FL_NO_REPORT_OPCODES |US_FL_IGNORE_UAS ),/* Reported-by: Hans de Goede <[email protected]> */ UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 30/89 net_sched: ematch: reject invalid TCF_EM_SIMPLE
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 55cd9f67f1e45de8517cdaab985fb8e56c0bc1d8 ]
It is possible for malicious userspace to set TCF_EM_SIMPLE bit even for matches that should not have this bit set.
This can fool two places using tcf_em_is_simple()
1) tcf_em_tree_destroy() -> memory leak of em->data if ops->destroy() is NULL
2) tcf_em_tree_dump() wrongly report/leak 4 low-order bytes of a kernel pointer.
BUG: memory leak
unreferenced object 0xffff888121850a40 (size 32):
comm "syz-executor927", pid 7193, jiffies 4294941655 (age 19.840s)
hex dump (first 32 bytes):
00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<00000000f67036ea>] kmemleak_alloc_recursive include/linux/kmemleak.h:43 [inline]
[<00000000f67036ea>] slab_post_alloc_hook mm/slab.h:586 [inline]
[<00000000f67036ea>] slab_alloc mm/slab.c:3320 [inline]
[<00000000f67036ea>] __do_kmalloc mm/slab.c:3654 [inline]
[<00000000f67036ea>] __kmalloc_track_caller+0x165/0x300 mm/slab.c:3671
[<00000000fab0cc8e>] kmemdup+0x27/0x60 mm/util.c:127
[<00000000d9992e0a>] kmemdup include/linux/string.h:453 [inline]
[<00000000d9992e0a>] em_nbyte_change+0x5b/0x90 net/sched/em_nbyte.c:32
[<000000007e04f711>] tcf_em_validate net/sched/ematch.c:241 [inline]
[<000000007e04f711>] tcf_em_tree_validate net/sched/ematch.c:359 [inline]
[<000000007e04f711>] tcf_em_tree_validate+0x332/0x46f net/sched/ematch.c:300
[<000000007a769204>] basic_set_parms net/sched/cls_basic.c:157 [inline]
[<000000007a769204>] basic_change+0x1d7/0x5f0 net/sched/cls_basic.c:219
[<00000000e57a5997>] tc_new_tfilter+0x566/0xf70 net/sched/cls_api.c:2104
[<0000000074b68559>] rtnetlink_rcv_msg+0x3b2/0x4b0 net/core/rtnetlink.c:5415
[<00000000b7fe53fb>] netlink_rcv_skb+0x61/0x170 net/netlink/af_netlink.c:2477
[<00000000e83a40d0>] rtnetlink_rcv+0x1d/0x30 net/core/rtnetlink.c:5442
[<00000000d62ba933>] netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
[<00000000d62ba933>] netlink_unicast+0x223/0x310 net/netlink/af_netlink.c:1328
[<0000000088070f72>] netlink_sendmsg+0x2c0/0x570 net/netlink/af_netlink.c:1917
[<00000000f70b15ea>] sock_sendmsg_nosec net/socket.c:639 [inline]
[<00000000f70b15ea>] sock_sendmsg+0x54/0x70 net/socket.c:659
[<00000000ef95a9be>] ____sys_sendmsg+0x2d0/0x300 net/socket.c:2330
[<00000000b650f1ab>] ___sys_sendmsg+0x8a/0xd0 net/socket.c:2384
[<0000000055bfa74a>] __sys_sendmsg+0x80/0xf0 net/socket.c:2417
[<000000002abac183>] __do_sys_sendmsg net/socket.c:2426 [inline]
[<000000002abac183>] __se_sys_sendmsg net/socket.c:2424 [inline]
[<000000002abac183>] __x64_sys_sendmsg+0x23/0x30 net/socket.c:2424--- net/sched/ematch.c | 3 +++ 1 file changed, 3 insertions(+)
net/sched/ematch.c +3 -0
@@ -242,6 +242,9 @@ static int tcf_em_validate(struct tcf_pr goto errout;if (em->ops->change) { + err = -EINVAL ; +if (em_hdr->flags &TCF_EM_SIMPLE ) + goto errout; err = em->ops->change (net, data, data_len, em);if (err <0 ) goto errout;
Greg Kroah-Hartman
maintainerPATCH 31/89 rsi: fix use-after-free on probe errors
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 92aafe77123ab478e5f5095878856ab0424910da upstream.
The driver would fail to stop the command timer in most error paths, something which specifically could lead to the timer being freed while still active on I/O errors during probe.
Fix this by making sure that each function starting the timer also stops it in all relevant error paths.
--- drivers/net/wireless/rsi/rsi_91x_hal.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/wireless/rsi/rsi_91x_hal.c +6 -6
@@ -541,6 +541,7 @@ static int bl_cmd(struct rsi_hw *adapterbl_start_cmd_timer (adapter, timeout); status =bl_write_cmd (adapter, cmd, exp_resp, ®out_val);if (status <0 ) { +bl_stop_cmd_timer (adapter);rsi_dbg (ERR_ZONE ,"%s: Command %s (%0x) writing failed..\n" , __func__, str, cmd);
@@ -656,10 +657,9 @@ static int ping_pong_write(struct rsi_hw } status =bl_cmd (adapter, cmd_req, cmd_resp, str); -if (status) { -bl_stop_cmd_timer (adapter); +if (status)return status; - } +return 0 ; }
@@ -749,10 +749,9 @@ static int auto_fw_upgrade(struct rsi_hw status =bl_cmd (adapter,EOF_REACHED ,FW_LOADING_SUCCESSFUL ,"EOF_REACHED" ); -if (status) { -bl_stop_cmd_timer (adapter); +if (status)return status; - } +rsi_dbg (INFO_ZONE ,"FW loading is done and FW is running..\n" );return 0 ; }
@@ -773,6 +772,7 @@ static int rsi_load_firmware(struct rsi_ status = hif_ops->master_reg_read (adapter,SWBL_REGOUT , ®out_val,2 );if (status <0 ) { +bl_stop_cmd_timer (adapter);rsi_dbg (ERR_ZONE ,"%s: REGOUT read failed\n" , __func__);return status;
Greg Kroah-Hartman
maintainerPATCH 32/89 crypto: af_alg - Use bh_lock_sock in sk_destruct
In reply to Greg Kroah-HartmanFrom: Herbert Xu <[email protected]>
commit 37f96694cf73ba116993a9d2d99ad6a75fa7fdb0 upstream.
As af_alg_release_parent may be called from BH context (most notably due to an async request that only completes after socket closure, or as reported here because of an RCU-delayed sk_destruct call), we must use bh_lock_sock instead of lock_sock.
--- crypto/af_alg.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
crypto/af_alg.c +4 -2
@@ -139,11 +139,13 @@ void af_alg_release_parent(struct sock * sk = ask->parent; ask =alg_sk (sk); -lock_sock (sk); +local_bh_disable (); +bh_lock_sock (sk); ask->nokey_refcnt -= nokey;if (!last) last = !--ask->refcnt; -release_sock (sk); +bh_unlock_sock (sk); +local_bh_enable ();if (last)sock_put (sk);
Greg Kroah-Hartman
maintainerPATCH 33/89 vfs: fix do_last() regression
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit 6404674acd596de41fd3ad5f267b4525494a891a upstream.
Brown paperbag time: fetching ->i_uid/->i_mode really should've been done from nd->inode. I even suggested that, but the reason for that has slipped through the cracks and I went for dir->d_inode instead - made for more "obvious" patch.
Analysis:
- at the entry into do_last() and all the way to step_into(): dir (aka nd->path.dentry) is known not to have been freed; so's nd->inode and it's equal to dir->d_inode unless we are already doomed to -ECHILD. inode of the file to get opened is not known.
- after step_into(): inode of the file to get opened is known; dir might be pointing to freed memory/be negative/etc.
- at the call of may_create_in_sticky(): guaranteed to be out of RCU mode; inode of the file to get opened is known and pinned; dir might be garbage.
The last was the reason for the original patch. Except that at the do_last() entry we can be in RCU mode and it is possible that nd->path.dentry->d_inode has already changed under us.
In that case we are going to fail with -ECHILD, but we need to be careful; nd->inode is pointing to valid struct inode and it's the same as nd->path.dentry->d_inode in "won't fail with -ECHILD" case, so we should use that.
Wearing-brown-paperbag: Al Viro <[email protected]>
--- fs/namei.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/namei.c +2 -2
@@ -3266,8 +3266,8 @@ static int do_last(struct nameidata *nd, int *opened) {struct dentry *dir = nd->path.dentry; -kuid_t dir_uid = dir->d_inode->i_uid; -umode_t dir_mode = dir->d_inode->i_mode; +kuid_t dir_uid = nd->inode->i_uid; +umode_t dir_mode = nd->inode->i_mode;int open_flag = op->open_flag;bool will_truncate = (open_flag &O_TRUNC ) !=0 ;bool got_write = false;
Greg Kroah-Hartman
maintainerPATCH 34/89 x86/resctrl: Fix use-after-free when deleting resource groups
In reply to Greg Kroah-HartmanFrom: Xiaochen Shen <[email protected]>
commit b8511ccc75c033f6d54188ea4df7bf1e85778740 upstream.
A resource group (rdtgrp) contains a reference count (rdtgrp->waitcount) that indicates how many waiters expect this rdtgrp to exist. Waiters could be waiting on rdtgroup_mutex or some work sitting on a task's workqueue for when the task returns from kernel mode or exits.
The deletion of a rdtgrp is intended to have two phases:
(1) while holding rdtgroup_mutex the necessary cleanup is done and rdtgrp->flags is set to RDT_DELETED,
(2) after releasing the rdtgroup_mutex, the rdtgrp structure is freed only if there are no waiters and its flag is set to RDT_DELETED. Upon gaining access to rdtgroup_mutex or rdtgrp, a waiter is required to check for the RDT_DELETED flag.
When unmounting the resctrl file system or deleting ctrl_mon groups, all of the subdirectories are removed and the data structure of rdtgrp is forcibly freed without checking rdtgrp->waitcount. If at this point there was a waiter on rdtgrp then a use-after-free issue occurs when the waiter starts running and accesses the rdtgrp structure it was waiting on.
See kfree() calls in [1], [2] and [3] in these two call paths in following scenarios:
(1) rdt_kill_sb() -> rmdir_all_sub() -> free_all_child_rdtgrp()
(2) rdtgroup_rmdir() -> rdtgroup_rmdir_ctrl() -> free_all_child_rdtgrp()
There are several scenarios that result in use-after-free issue in following:
Scenario 1:
-----------
In Thread 1, rdtgroup_tasks_write() adds a task_work callback move_myself(). If move_myself() is scheduled to execute after Thread 2 rdt_kill_sb() is finished, referring to earlier rdtgrp memory (rdtgrp->waitcount) which was already freed in Thread 2 results in use-after-free issue.
Thread 1 (rdtgroup_tasks_write) Thread 2 (rdt_kill_sb)
------------------------------- ----------------------rdtgroup_kn_lock_live
atomic_inc(&rdtgrp->waitcount)
mutex_lockrdtgroup_move_task
__rdtgroup_move_task
/*
* Take an extra refcount, so rdtgrp cannot be freed
* before the call back move_myself has been invoked
*/
atomic_inc(&rdtgrp->waitcount)
/* Callback move_myself will be scheduled for later */
task_work_add(move_myself)rdtgroup_kn_unlock
mutex_unlock
atomic_dec_and_test(&rdtgrp->waitcount)
&& (flags & RDT_DELETED)
mutex_lock
rmdir_all_sub
/*
* sentry and rdtgrp are freed
* without checking refcount
*/
free_all_child_rdtgrp
kfree(sentry)*[1]
kfree(rdtgrp)*[2]
mutex_unlock/*
* Callback is scheduled to execute
* after rdt_kill_sb is finished
*/move_myself
/*
* Use-after-free: refer to earlier rdtgrp
* memory which was freed in [1] or [2].
*/
atomic_dec_and_test(&rdtgrp->waitcount)
&& (flags & RDT_DELETED)
kfree(rdtgrp)
Scenario 2:
-----------
In Thread 1, rdtgroup_tasks_write() adds a task_work callback move_myself(). If move_myself() is scheduled to execute after Thread 2 rdtgroup_rmdir() is finished, referring to earlier rdtgrp memory (rdtgrp->waitcount) which was already freed in Thread 2 results in use-after-free issue.
Thread 1 (rdtgroup_tasks_write) Thread 2 (rdtgroup_rmdir)
------------------------------- -------------------------rdtgroup_kn_lock_live
atomic_inc(&rdtgrp->waitcount)
mutex_lockrdtgroup_move_task
__rdtgroup_move_task
/*
* Take an extra refcount, so rdtgrp cannot be freed
* before the call back move_myself has been invoked
*/
atomic_inc(&rdtgrp->waitcount)
/* Callback move_myself will be scheduled for later */
task_work_add(move_myself)rdtgroup_kn_unlock
mutex_unlock
atomic_dec_and_test(&rdtgrp->waitcount)
&& (flags & RDT_DELETED)
rdtgroup_kn_lock_live
atomic_inc(&rdtgrp->waitcount)
mutex_lock
rdtgroup_rmdir_ctrl
free_all_child_rdtgrp
/*
* sentry is freed without
* checking refcount
*/
kfree(sentry)*[3]
rdtgroup_ctrl_remove
rdtgrp->flags = RDT_DELETED
rdtgroup_kn_unlock
mutex_unlock
atomic_dec_and_test(
&rdtgrp->waitcount)
&& (flags & RDT_DELETED)
kfree(rdtgrp)/*
* Callback is scheduled to execute
* after rdt_kill_sb is finished
*/move_myself
/*
* Use-after-free: refer to earlier rdtgrp
* memory which was freed in [3].
*/
atomic_dec_and_test(&rdtgrp->waitcount)
&& (flags & RDT_DELETED)
kfree(rdtgrp)
If CONFIG_DEBUG_SLAB=y, Slab corruption on kmalloc-2k can be observed like following. Note that "0x6b" is POISON_FREE after kfree(). The corrupted bits "0x6a", "0x64" at offset 0x424 correspond to waitcount member of struct rdtgroup which was freed:
Slab corruption (Not tainted): kmalloc-2k start=ffff9504c5b0d000, len=2048 420: 6b 6b 6b 6b 6a 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkjkkkkkkkkkkk Single bit error detected. Probably bad RAM.
Run memtest86+ or a similar memory test tool.
Next obj: start=ffff9504c5b0d800, len=2048
000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
Slab corruption (Not tainted): kmalloc-2k start=ffff9504c58ab800, len=2048 420: 6b 6b 6b 6b 64 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkdkkkkkkkkkkk Prev obj: start=ffff9504c58ab000, len=2048
000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
Fix this by taking reference count (waitcount) of rdtgrp into account in the two call paths that currently do not do so. Instead of always freeing the resource group it will only be freed if there are no waiters on it. If there are waiters, the resource group will have its flags set to RDT_DELETED.
It will be left to the waiter to free the resource group when it starts running and finding that it was the last waiter and the resource group has been removed (rdtgrp->flags & RDT_DELETED) since. (1) rdt_kill_sb() -> rmdir_all_sub() -> free_all_child_rdtgrp() (2) rdtgroup_rmdir() -> rdtgroup_rmdir_ctrl() -> free_all_child_rdtgrp()
Backporting notes:
Since upstream commit fa7d949337cc ("x86/resctrl: Rename and move rdt files to a separate directory"), the file arch/x86/kernel/cpu/intel_rdt_rdtgroup.c has been renamed and moved to arch/x86/kernel/cpu/resctrl/rdtgroup.c.
Apply the change against file arch/x86/kernel/cpu/intel_rdt_rdtgroup.c in older stable trees.
--- arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +10 -2
@@ -1260,7 +1260,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp)list_for_each_entry_safe (sentry, stmp, head, mon.crdtgrp_list) {free_rmid (sentry->mon.rmid);list_del (&sentry->mon.crdtgrp_list); -kfree (sentry); + +if (atomic_read (&sentry->waitcount) !=0 ) + sentry->flags =RDT_DELETED ; +else +kfree (sentry); } }
@@ -1294,7 +1298,11 @@ static void rmdir_all_sub(void)kernfs_remove (rdtgrp->kn);list_del (&rdtgrp->rdtgroup_list); -kfree (rdtgrp); + +if (atomic_read (&rdtgrp->waitcount) !=0 ) + rdtgrp->flags =RDT_DELETED ; +else +kfree (rdtgrp); }/* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */ update_closid_rmid (cpu_online_mask, &rdtgroup_default);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 35/89 x86/resctrl: Fix use-after-free due to inaccurate refcount of rdtgroup
In reply to Greg Kroah-HartmanFrom: Xiaochen Shen <[email protected]>
commit 074fadee59ee7a9d2b216e9854bd4efb5dad679f upstream.
There is a race condition in the following scenario which results in an use-after-free issue when reading a monitoring file and deleting the parent ctrl_mon group concurrently:
Thread 1 calls atomic_inc() to take refcount of rdtgrp and then calls kernfs_break_active_protection() to drop the active reference of kernfs node in rdtgroup_kn_lock_live().
In Thread 2, kernfs_remove() is a blocking routine. It waits on all sub kernfs nodes to drop the active reference when removing all subtree kernfs nodes recursively. Thread 2 could block on kernfs_remove() until Thread 1 calls kernfs_break_active_protection(). Only after kernfs_remove() completes the refcount of rdtgrp could be trusted.
Before Thread 1 calls atomic_inc() and kernfs_break_active_protection(), Thread 2 could call kfree() when the refcount of rdtgrp (sentry) is 0 instead of 1 due to the race.
In Thread 1, in rdtgroup_kn_unlock(), referring to earlier rdtgrp memory (rdtgrp->waitcount) which was already freed in Thread 2 results in use-after-free issue.
Thread 1 (rdtgroup_mondata_show) Thread 2 (rdtgroup_rmdir) -------------------------------- ------------------------- rdtgroup_kn_lock_live
/*
* kn active protection until
* kernfs_break_active_protection(kn)
*/
rdtgrp = kernfs_to_rdtgroup(kn)
rdtgroup_kn_lock_live
atomic_inc(&rdtgrp->waitcount)
mutex_lock
rdtgroup_rmdir_ctrl
free_all_child_rdtgrp
/*
* sentry->waitcount should be 1
* but is 0 now due to the race.
*/
kfree(sentry)*[1]
/*
* Only after kernfs_remove()
* completes, the refcount of
* rdtgrp could be trusted.
*/
atomic_inc(&rdtgrp->waitcount)
/* kn->active-- */
kernfs_break_active_protection(kn)
rdtgroup_ctrl_remove
rdtgrp->flags = RDT_DELETED
/*
* Blocking routine, wait for
* all sub kernfs nodes to drop
* active reference in
* kernfs_break_active_protection.
*/
kernfs_remove(rdtgrp->kn)
rdtgroup_kn_unlock
mutex_unlock
atomic_dec_and_test(
&rdtgrp->waitcount)
&& (flags & RDT_DELETED)
kernfs_unbreak_active_protection(kn)
kfree(rdtgrp) mutex_lockmon_event_readrdtgroup_kn_unlock
mutex_unlock
/*
* Use-after-free: refer to earlier rdtgrp
* memory which was freed in [1].
*/
atomic_dec_and_test(&rdtgrp->waitcount)
&& (flags & RDT_DELETED)
/* kn->active++ */
kernfs_unbreak_active_protection(kn)
kfree(rdtgrp)Fix it by moving free_all_child_rdtgrp() to after kernfs_remove() in rdtgroup_rmdir_ctrl() to ensure it has the accurate refcount of rdtgrp.
Backporting notes:
Since upstream commit fa7d949337cc ("x86/resctrl: Rename and move rdt files to a separate directory"), the file arch/x86/kernel/cpu/intel_rdt_rdtgroup.c has been renamed and moved to arch/x86/kernel/cpu/resctrl/rdtgroup.c.
Apply the change against file arch/x86/kernel/cpu/intel_rdt_rdtgroup.c for older stable trees.
Upstream commit 17eafd076291 ("x86/intel_rdt: Split resource group removal in two") moved part of resource group removal code from rdtgroup_rmdir_mon() into a separate function rdtgroup_ctrl_remove(). Apply the change against original code base of rdtgroup_rmdir_mon() for older stable trees.
--- arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +5 -5
@@ -1800,11 +1800,6 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp,closid_free (rdtgrp->closid);free_rmid (rdtgrp->mon.rmid); -/* -* Free all the child monitor group rmids. -*/ -free_all_child_rdtgrp (rdtgrp); -list_del (&rdtgrp->rdtgroup_list);/*
@@ -1814,6 +1809,11 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp,kernfs_get (kn);kernfs_remove (rdtgrp->kn); +/* +* Free all the child monitor group rmids. +*/ +free_all_child_rdtgrp (rdtgrp); +return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 36/89 x86/resctrl: Fix a deadlock due to inaccurate reference
In reply to Greg Kroah-HartmanFrom: Xiaochen Shen <[email protected]>
commit 334b0f4e9b1b4a1d475f803419d202f6c5e4d18e upstream.
There is a race condition which results in a deadlock when rmdir and mkdir execute concurrently:
$ ls /sys/fs/resctrl/c1/mon_groups/m1/ cpus cpus_list mon_data tasks
Thread 1: rmdir /sys/fs/resctrl/c1
Thread 2: mkdir /sys/fs/resctrl/c1/mon_groups/m1
3 locks held by mkdir/48649:
#0: (sb_writers#17){.+.+}, at: [<ffffffffb4ca2aa0>] mnt_want_write+0x20/0x50
#1: (&type->i_mutex_dir_key#8/1){+.+.}, at: [<ffffffffb4c8c13b>] filename_create+0x7b/0x170
#2: (rdtgroup_mutex){+.+.}, at: [<ffffffffb4a4389d>] rdtgroup_kn_lock_live+0x3d/0x704 locks held by rmdir/48652:
#0: (sb_writers#17){.+.+}, at: [<ffffffffb4ca2aa0>] mnt_want_write+0x20/0x50
#1: (&type->i_mutex_dir_key#8/1){+.+.}, at: [<ffffffffb4c8c3cf>] do_rmdir+0x13f/0x1e0
#2: (&type->i_mutex_dir_key#8){++++}, at: [<ffffffffb4c86d5d>] vfs_rmdir+0x4d/0x120
#3: (rdtgroup_mutex){+.+.}, at: [<ffffffffb4a4389d>] rdtgroup_kn_lock_live+0x3d/0x70Thread 1 is deleting control group "c1". Holding rdtgroup_mutex, kernfs_remove() removes all kernfs nodes under directory "c1" recursively, then waits for sub kernfs node "mon_groups" to drop active reference.
Thread 2 is trying to create a subdirectory "m1" in the "mon_groups" directory. The wrapper kernfs_iop_mkdir() takes an active reference to the "mon_groups" directory but the code drops the active reference to the parent directory "c1" instead.
As a result, Thread 1 is blocked on waiting for active reference to drop and never release rdtgroup_mutex, while Thread 2 is also blocked on trying to get rdtgroup_mutex.
Thread 1 (rdtgroup_rmdir) Thread 2 (rdtgroup_mkdir) (rmdir /sys/fs/resctrl/c1) (mkdir /sys/fs/resctrl/c1/mon_groups/m1) ------------------------- -------------------------
kernfs_iop_mkdir
/*
* kn: "m1", parent_kn: "mon_groups",
* prgrp_kn: parent_kn->parent: "c1", *
* "mon_groups", parent_kn->active++: 1 */
kernfs_get_active(parent_kn)kernfs_iop_rmdir
/* "c1", kn->active++ */
kernfs_get_active(kn)
rdtgroup_kn_lock_live
atomic_inc(&rdtgrp->waitcount)
/* "c1", kn->active-- */
kernfs_break_active_protection(kn)
mutex_lock rdtgroup_rmdir_ctrl
free_all_child_rdtgrp
sentry->flags = RDT_DELETED
rdtgroup_ctrl_remove
rdtgrp->flags = RDT_DELETED
kernfs_get(kn)
kernfs_remove(rdtgrp->kn)
__kernfs_remove
/* "mon_groups", sub_kn */
atomic_add(KN_DEACTIVATED_BIAS, &sub_kn->active)
kernfs_drain(sub_kn)
/*
* sub_kn->active == KN_DEACTIVATED_BIAS + 1,
* waiting on sub_kn->active to drop, but it
* never drops in Thread 2 which is blocked
* on getting rdtgroup_mutex.
*/Thread 1 hangs here ---->
wait_event(sub_kn->active == KN_DEACTIVATED_BIAS)
...
rdtgroup_mkdir
rdtgroup_mkdir_mon(parent_kn, prgrp_kn)
mkdir_rdt_prepare(parent_kn, prgrp_kn)
rdtgroup_kn_lock_live(prgrp_kn)
atomic_inc(&rdtgrp->waitcount) /*
* "c1", prgrp_kn->active-- *
* The active reference on "c1" is
* dropped, but not matching the
* actual active reference taken
* on "mon_groups", thus causing
* Thread 1 to wait forever while
* holding rdtgroup_mutex. */
kernfs_break_active_protection(
prgrp_kn)
/*
* Trying to get rdtgroup_mutex
* which is held by Thread 1. */
Thread 2 hangs here ----> mutex_lock
...
The problem is that the creation of a subdirectory in the "mon_groups" directory incorrectly releases the active protection of its parent directory instead of itself before it starts waiting for rdtgroup_mutex. This is triggered by the rdtgroup_mkdir() flow calling rdtgroup_kn_lock_live()/rdtgroup_kn_unlock() with kernfs node of the parent control group ("c1") as argument. It should be called with kernfs node "mon_groups" instead. What is currently missing is that the kn->priv of "mon_groups" is NULL instead of pointing to the rdtgrp.
Fix it by pointing kn->priv to rdtgrp when "mon_groups" is created. Then it could be passed to rdtgroup_kn_lock_live()/rdtgroup_kn_unlock() instead. And then it operates on the same rdtgroup structure but handles the active reference of kernfs node "mon_groups" to prevent deadlock. The same changes are also made to the "mon_data" directories.
This results in some unused function parameters that will be cleaned up in follow-up patch as the focus here is on the fix only in support of backporting efforts.
Backporting notes:
Since upstream commit fa7d949337cc ("x86/resctrl: Rename and move rdt files to a separate directory"), the file arch/x86/kernel/cpu/intel_rdt_rdtgroup.c has been renamed and moved to arch/x86/kernel/cpu/resctrl/rdtgroup.c.
Apply the change against file arch/x86/kernel/cpu/intel_rdt_rdtgroup.c for older stable trees.
--- arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +8 -8
@@ -1107,7 +1107,7 @@ static struct dentry *rdt_mount(struct file_system_type *fs_type,if (rdt_mon_capable) { ret =mongroup_create_dir (rdtgroup_default.kn, -NULL ,"mon_groups" , + &rdtgroup_default,"mon_groups" , &kn_mongrp);if (ret) { dentry =ERR_PTR (ret);
@@ -1499,7 +1499,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn,/* * Create the mon_data directory first. */ - ret =mongroup_create_dir (parent_kn,NULL ,"mon_data" , &kn); + ret =mongroup_create_dir (parent_kn, prgrp,"mon_data" , &kn);if (ret)return ret;
@@ -1533,7 +1533,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,uint files =0 ;int ret; - prdtgrp =rdtgroup_kn_lock_live (prgrp_kn); + prdtgrp =rdtgroup_kn_lock_live (parent_kn);if (!prdtgrp) { ret = -ENODEV ; goto out_unlock;
@@ -1589,7 +1589,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,kernfs_activate (kn);/* -* The caller unlocks the prgrp_kn upon success. +* The caller unlocks the parent_kn upon success. */ return 0 ;
@@ -1600,7 +1600,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, out_free_rgrp:kfree (rdtgrp); out_unlock: -rdtgroup_kn_unlock (prgrp_kn); +rdtgroup_kn_unlock (parent_kn);return ret; }
@@ -1638,7 +1638,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn,*/ list_add_tail (&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list); -rdtgroup_kn_unlock (prgrp_kn); +rdtgroup_kn_unlock (parent_kn);return ret; }
@@ -1675,7 +1675,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,* Create an empty mon_groups directory to hold the subset * of tasks and cpus to monitor. */ - ret =mongroup_create_dir (kn,NULL ,"mon_groups" ,NULL ); + ret =mongroup_create_dir (kn, rdtgrp,"mon_groups" ,NULL );if (ret) goto out_id_free; }
@@ -1688,7 +1688,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, out_common_fail:mkdir_rdt_prepare_clean (rdtgrp); out_unlock: -rdtgroup_kn_unlock (prgrp_kn); +rdtgroup_kn_unlock (parent_kn);return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 37/89 crypto: pcrypt - Fix user-after-free on module unload
In reply to Greg Kroah-HartmanFrom: Herbert Xu <[email protected]>
[ Upstream commit 07bfd9bdf568a38d9440c607b72342036011f727 ]
On module unload of pcrypt we must unregister the crypto algorithms first and then tear down the padata structure. As otherwise the crypto algorithms are still alive and can be used while the padata structure is being freed.
--- crypto/pcrypt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
crypto/pcrypt.c +2 -1
@@ -505,11 +505,12 @@ static int __init pcrypt_init(void) static void __exit pcrypt_exit(void) { +crypto_unregister_template (&pcrypt_tmpl); +pcrypt_fini_padata (&pencrypt);pcrypt_fini_padata (&pdecrypt);kset_unregister (pcrypt_kset); -crypto_unregister_template (&pcrypt_tmpl); }module_init (pcrypt_init);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 38/89 perf c2c: Fix return type for histogram sorting comparision functions
In reply to Greg Kroah-HartmanFrom: Andres Freund <[email protected]>
commit c1c8013ec34d7163431d18367808ea40b2e305f8 upstream.
Commit 722ddfde366f ("perf tools: Fix time sorting") changed - correctly so - hist_entry__sort to return int64. Unfortunately several of the builtin-c2c.c comparison routines only happened to work due the cast caused by the wrong return type.
This causes meaningless ordering of both the cacheline list, and the cacheline details page. E.g a simple:
perf c2c record -a sleep 3
perf c2c report
will result in cacheline table like
=================================================
Shared Data Cache Line Table
=================================================
#
# ------- Cacheline ---------- Total Tot - LLC Load Hitm - - Store Reference - - Load Dram - LLC Total - Core Load Hit - - LLC Load Hit - # Index Address Node PA cnt records Hitm Total Lcl Rmt Total L1Hit L1Miss Lcl Rmt Ld Miss Loads FB L1 L2 Llc Rmt # ..... .............. .... ...... ....... ...... ..... ..... ... .... ..... ...... ...... .... ...... ..... ..... ..... ... .... .......
0 0x7f0d27ffba00 N/A 0 52 0.12% 13 6 7 12 12 0 0 7 14 40 4 16 0 0 0
1 0x7f0d27ff61c0 N/A 0 6353 14.04% 1475 801 674 779 779 0 0 718 1392 5574 1299 1967 0 115 0
2 0x7f0d26d3ec80 N/A 0 71 0.15% 16 4 12 13 13 0 0 12 24 58 1 20 0 9 0
3 0x7f0d26d3ec00 N/A 0 98 0.22% 23 17 6 19 19 0 0 6 12 79 0 40 0 10 0i.e. with the list not being ordered by Total Hitm.
--- tools/perf/builtin-c2c.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
tools/perf/builtin-c2c.c +6 -4
@@ -528,8 +528,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __ {struct c2c_hist_entry *c2c_left;struct c2c_hist_entry *c2c_right; -unsigned int tot_hitm_left; -unsigned int tot_hitm_right; +uint64_t tot_hitm_left; +uint64_t tot_hitm_right; c2c_left = container_of(left, struct c2c_hist_entry, he); c2c_right = container_of(right, struct c2c_hist_entry, he);
@@ -562,7 +562,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __m \ c2c_left = container_of(left, struct c2c_hist_entry, he); \ c2c_right = container_of(right, struct c2c_hist_entry, he); \ -return c2c_left->stats.__f - c2c_right->stats.__f; \ +return (uint64_t ) c2c_left->stats.__f - \ + (uint64_t ) c2c_right->stats.__f; \ }#define STAT_FN (__f) \
@@ -615,7 +616,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt c2c_left = container_of(left, struct c2c_hist_entry, he); c2c_right = container_of(right, struct c2c_hist_entry, he); -return llc_miss (&c2c_left->stats) -llc_miss (&c2c_right->stats); +return (uint64_t )llc_miss (&c2c_left->stats) - + (uint64_t )llc_miss (&c2c_right->stats); }static uint64_t total_records (struct c2c_stats *stats)
Greg Kroah-Hartman
maintainerPATCH 39/89 PM / devfreq: Add new name attribute for sysfs
In reply to Greg Kroah-HartmanFrom: Chanwoo Choi <[email protected]>
commit 2fee1a7cc6b1ce6634bb0f025be2c94a58dfa34d upstream.
The commit 4585fbcb5331 ("PM / devfreq: Modify the device name as devfreq(X) for sysfs") changed the node name to devfreq(x). After this commit, it is not possible to get the device name through /sys/class/devfreq/devfreq(X)/*.
Add new name attribute in order to get device name.
--- Documentation/ABI/testing/sysfs-class-devfreq | 7 +++++++ drivers/devfreq/devfreq.c | 9 +++++++++ 2 files changed, 16 insertions(+)
Documentation/ABI/testing/sysfs-class-devfreq +7 -0
@@ -7,6 +7,13 @@ Description: The name of devfreq object denoted as ... is same as the name of device using devfreq. +What: /sys/class/devfreq/.../name +Date: November 2019 +Contact: Chanwoo Choi <[email protected]> +Description: + The /sys/class/devfreq/.../name shows the name of device + of the corresponding devfreq object. + What: /sys/class/devfreq/.../governor Date: September 2011 Contact: MyungJoo Ham <[email protected]>
drivers/devfreq/devfreq.c +9 -0
@@ -902,6 +902,14 @@ err_out: }EXPORT_SYMBOL (devfreq_remove_governor); +static ssize_t name_show (struct device *dev, +struct device_attribute *attr,char *buf) +{ +struct devfreq *devfreq =to_devfreq (dev); +return sprintf (buf,"%s\n" ,dev_name (devfreq->dev.parent)); +} +static DEVICE_ATTR_RO (name); +static ssize_t governor_show (struct device *dev,struct device_attribute *attr,char *buf) {
@@ -1200,6 +1208,7 @@ static ssize_t trans_stat_show(struct destatic DEVICE_ATTR_RO (trans_stat);static struct attribute *devfreq_attrs[] = { + &dev_attr_name.attr, &dev_attr_governor.attr, &dev_attr_available_governors.attr, &dev_attr_cur_freq.attr,
Greg Kroah-Hartman
maintainerPATCH 40/89 tools lib: Fix builds when glibc contains strlcpy()
In reply to Greg Kroah-HartmanFrom: Vitaly Chikunov <[email protected]>
commit 6c4798d3f08b81c2c52936b10e0fa872590c96ae upstream.
Disable a couple of compilation warnings (which are treated as errors) on strlcpy() definition and declaration, allowing users to compile perf and kernel (objtool) when:
1. glibc have strlcpy() (such as in ALT Linux since 2004) objtool and perf build fails with this (in gcc):
In file included from exec-cmd.c:3:
tools/include/linux/string.h:20:15: error: redundant redeclaration of ‘strlcpy’ [-Werror=redundant-decls]
20 | extern size_t strlcpy(char *dest, const char *src, size_t size);
2. clang ignores `-Wredundant-decls', but produces another warning when building perf:
CC util/string.o
../lib/string.c:99:8: error: attribute declaration must precede definition [-Werror,-Wignored-attributes] size_t __weak strlcpy(char *dest, const char *src, size_t size) ../../tools/include/linux/compiler.h:66:34: note: expanded from macro '__weak'
# define __weak __attribute__((weak)) /usr/include/bits/string_fortified.h:151:8: note: previous definition is here __NTH (strlcpy (char *__restrict __dest, const char *__restrict __src,
Committer notes:
The
#pragma GCC diagnostic
directive was introduced in gcc 4.6, so check for that as well.
Resolves: https://bugzilla.kernel.org/show_bug.cgi?id=118481
--- tools/include/linux/string.h | 8 ++++++++ tools/lib/string.c | 7 +++++++ 2 files changed, 15 insertions(+)
tools/include/linux/string.h +8 -0
@@ -14,7 +14,15 @@ int strtobool(const char *s, bool *res);* However uClibc headers also define __GLIBC__ hence the hack below */ #if defined(__GLIBC__) && !defined(__UCLIBC__) +// pragma diagnostic was introduced in gcc 4.6 +#if __GNUC__ >4 || (__GNUC__ ==4 && __GNUC_MINOR__ >=6 ) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif extern size_t strlcpy (char *dest,const char *src,size_t size); +#if __GNUC__ >4 || (__GNUC__ ==4 && __GNUC_MINOR__ >=6 ) +#pragma GCC diagnostic pop +#endif #endif char *str_error_r (int errnum,char *buf,size_t buflen);
tools/lib/string.c +7 -0
@@ -95,6 +95,10 @@ int strtobool(const char *s, bool *res)* If libc has strlcpy() then that version will override this * implementation: */ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wignored-attributes" +#endif size_t __weak strlcpy (char *dest,const char *src,size_t size) {size_t ret =strlen (src);
@@ -106,3 +110,6 @@ size_t __weak strlcpy(char *dest, const }return ret; } +#ifdef __clang__ +#pragma clang diagnostic pop +#endif
Greg Kroah-Hartman
maintainerPATCH 41/89 arm64: kbuild: remove compressed images on make ARCH=arm64 (dist)clean
In reply to Greg Kroah-HartmanFrom: Dirk Behme <[email protected]>
commit d7bbd6c1b01cb5dd13c245d4586a83145c1d5f52 upstream.
Since v4.3-rc1 commit 0723c05fb75e44 ("arm64: enable more compressed Image formats"), it is possible to build Image.{bz2,lz4,lzma,lzo} AArch64 images. However, the commit missed adding support for removing those images on 'make ARCH=arm64 (dist)clean'.
Fix this by adding them to the target list.
Make sure to match the order of the recipes in the makefile.
--- arch/arm64/boot/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/Makefile +1 -1
@@ -16,7 +16,7 @@ OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S -targets := Image Image.gz +targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo $(obj)/Image: vmlinux FORCE $(call if_changed,objcopy)
Greg Kroah-Hartman
maintainerPATCH 42/89 ext4: validate the debug_want_extra_isize mount option at parse time
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
commit 9803387c55f7d2ce69aa64340c5fdc6b3027dbc8 upstream.
Instead of setting s_want_extra_size and then making sure that it is a valid value afterwards, validate the field before we set it. This avoids races and other problems when remounting the file system.
--- fs/ext4/super.c | 127 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 66 insertions(+), 61 deletions(-)
fs/ext4/super.c +66 -61
@@ -1782,6 +1782,13 @@ static int handle_mount_opt(struct super arg =JBD2_DEFAULT_MAX_COMMIT_AGE ; sbi->s_commit_interval =HZ * arg; }else if (token == Opt_debug_want_extra_isize) { +if ((arg &1 ) || + (arg <4 ) || + (arg > (sbi->s_inode_size -EXT4_GOOD_OLD_INODE_SIZE ))) { +ext4_msg (sb,KERN_ERR , +"Invalid want_extra_isize %d" , arg); +return -1 ; + } sbi->s_want_extra_isize = arg; }else if (token == Opt_max_batch_time) { sbi->s_max_batch_time = arg;
@@ -3454,40 +3461,6 @@ int ext4_calculate_overhead(struct superreturn 0 ; } -static void ext4_clamp_want_extra_isize (struct super_block *sb) -{ -struct ext4_sb_info *sbi =EXT4_SB (sb); -struct ext4_super_block *es = sbi->s_es; -unsigned def_extra_isize =sizeof (struct ext4_inode ) - -EXT4_GOOD_OLD_INODE_SIZE ; - -if (sbi->s_inode_size ==EXT4_GOOD_OLD_INODE_SIZE ) { - sbi->s_want_extra_isize =0 ; -return ; - } -if (sbi->s_want_extra_isize <4 ) { - sbi->s_want_extra_isize = def_extra_isize; -if (ext4_has_feature_extra_isize (sb)) { -if (sbi->s_want_extra_isize < -le16_to_cpu (es->s_want_extra_isize)) - sbi->s_want_extra_isize = -le16_to_cpu (es->s_want_extra_isize); -if (sbi->s_want_extra_isize < -le16_to_cpu (es->s_min_extra_isize)) - sbi->s_want_extra_isize = -le16_to_cpu (es->s_min_extra_isize); - } - } -/* Check if enough inode space is available */ -if ((sbi->s_want_extra_isize > sbi->s_inode_size) || - (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize > - sbi->s_inode_size)) { - sbi->s_want_extra_isize = def_extra_isize; -ext4_msg (sb,KERN_INFO , -"required extra inode space not available" ); - } -} -static void ext4_set_resv_clusters (struct super_block *sb) {ext4_fsblk_t resv_clusters;
@@ -3695,6 +3668,65 @@ static int ext4_fill_super(struct super_*/ sbi->s_li_wait_mult =EXT4_DEF_LI_WAIT_MULT ; +if (le32_to_cpu (es->s_rev_level) ==EXT4_GOOD_OLD_REV ) { + sbi->s_inode_size =EXT4_GOOD_OLD_INODE_SIZE ; + sbi->s_first_ino =EXT4_GOOD_OLD_FIRST_INO ; + }else { + sbi->s_inode_size =le16_to_cpu (es->s_inode_size); + sbi->s_first_ino =le32_to_cpu (es->s_first_ino); +if (sbi->s_first_ino <EXT4_GOOD_OLD_FIRST_INO ) { +ext4_msg (sb,KERN_ERR ,"invalid first ino: %u" , + sbi->s_first_ino); + goto failed_mount; + } +if ((sbi->s_inode_size <EXT4_GOOD_OLD_INODE_SIZE ) || + (!is_power_of_2 (sbi->s_inode_size)) || + (sbi->s_inode_size > blocksize)) { +ext4_msg (sb,KERN_ERR , +"unsupported inode size: %d" , + sbi->s_inode_size); + goto failed_mount; + } +/* +* i_atime_extra is the last extra field available for +* [acm]times in struct ext4_inode. Checking for that +* field should suffice to ensure we have extra space +* for all three. +*/ +if (sbi->s_inode_size >= offsetof(struct ext4_inode , i_atime_extra) + +sizeof (((struct ext4_inode *)0 )->i_atime_extra)) { + sb->s_time_gran =1 ; + }else { + sb->s_time_gran =NSEC_PER_SEC ; + } + } +if (sbi->s_inode_size >EXT4_GOOD_OLD_INODE_SIZE ) { + sbi->s_want_extra_isize =sizeof (struct ext4_inode ) - +EXT4_GOOD_OLD_INODE_SIZE ; +if (ext4_has_feature_extra_isize (sb)) { +unsigned v, max = (sbi->s_inode_size - +EXT4_GOOD_OLD_INODE_SIZE ); + + v =le16_to_cpu (es->s_want_extra_isize); +if (v > max) { +ext4_msg (sb,KERN_ERR , +"bad s_want_extra_isize: %d" , v); + goto failed_mount; + } +if (sbi->s_want_extra_isize < v) + sbi->s_want_extra_isize = v; + + v =le16_to_cpu (es->s_min_extra_isize); +if (v > max) { +ext4_msg (sb,KERN_ERR , +"bad s_min_extra_isize: %d" , v); + goto failed_mount; + } +if (sbi->s_want_extra_isize < v) + sbi->s_want_extra_isize = v; + } + } +if (sbi->s_es->s_mount_opts[0 ]) { char *s_mount_opts = kstrndup(sbi->s_es->s_mount_opts, sizeof(sbi->s_es->s_mount_opts),
@@ -3893,29 +3925,6 @@ static int ext4_fill_super(struct super_ has_huge_files); sb->s_maxbytes =ext4_max_size (sb->s_blocksize_bits, has_huge_files); -if (le32_to_cpu (es->s_rev_level) ==EXT4_GOOD_OLD_REV ) { - sbi->s_inode_size =EXT4_GOOD_OLD_INODE_SIZE ; - sbi->s_first_ino =EXT4_GOOD_OLD_FIRST_INO ; - }else { - sbi->s_inode_size =le16_to_cpu (es->s_inode_size); - sbi->s_first_ino =le32_to_cpu (es->s_first_ino); -if (sbi->s_first_ino <EXT4_GOOD_OLD_FIRST_INO ) { -ext4_msg (sb,KERN_ERR ,"invalid first ino: %u" , - sbi->s_first_ino); - goto failed_mount; - } -if ((sbi->s_inode_size <EXT4_GOOD_OLD_INODE_SIZE ) || - (!is_power_of_2 (sbi->s_inode_size)) || - (sbi->s_inode_size > blocksize)) { -ext4_msg (sb,KERN_ERR , -"unsupported inode size: %d" , - sbi->s_inode_size); - goto failed_mount; - } -if (sbi->s_inode_size >EXT4_GOOD_OLD_INODE_SIZE ) - sb->s_time_gran =1 << (EXT4_EPOCH_BITS -2 ); - } - sbi->s_desc_size =le16_to_cpu (es->s_desc_size);if (ext4_has_feature_64bit (sb)) { if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT ||
@@ -4354,8 +4363,6 @@ no_journal:if (ext4_setup_super (sb, es,sb_rdonly (sb))) sb->s_flags |=MS_RDONLY ; -ext4_clamp_want_extra_isize (sb); -ext4_set_resv_clusters (sb); err =ext4_setup_system_zone (sb);
@@ -5139,8 +5146,6 @@ static int ext4_remount(struct super_blo goto restore_opts; } -ext4_clamp_want_extra_isize (sb); -if ((old_opts.s_mount_opt &EXT4_MOUNT_JOURNAL_CHECKSUM ) ^test_opt (sb,JOURNAL_CHECKSUM )) { ext4_msg(sb, KERN_ERR, "changing journal_checksum "
Greg Kroah-Hartman
maintainerPATCH 43/89 mm/mempolicy.c: fix out of bounds write in mpol_parse_str()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit c7a91bc7c2e17e0a9c8b9745a2cb118891218fd1 upstream.
What we are trying to do is change the '=' character to a NUL terminator and then at the end of the function we restore it back to an '='. The problem is there are two error paths where we jump to the end of the function before we have replaced the '=' with NUL.
We end up putting the '=' in the wrong place (possibly one element before the start of the buffer).
Dmitry Vyukov <[email protected]>
--- mm/mempolicy.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
mm/mempolicy.c +3 -3
@@ -2724,6 +2724,9 @@ int mpol_parse_str(char *str, struct memchar *flags =strchr (str,'=' );int err =1 ; +if (flags) + *flags++ ='\0' ;/* terminate mode string */ +if (nodelist) {/* NUL-terminate mode or flags string */ *nodelist++ ='\0' ;
@@ -2734,9 +2737,6 @@ int mpol_parse_str(char *str, struct mem }else nodes_clear (nodes); -if (flags) - *flags++ ='\0' ;/* terminate mode string */ -for (mode =0 ; mode <MPOL_MAX ; mode++) {if (!strcmp (str, policy_modes[mode])) {break ;
Greg Kroah-Hartman
maintainerPATCH 44/89 reiserfs: Fix memory leak of journal device string
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit 5474ca7da6f34fa95e82edc747d5faa19cbdfb5c upstream.
When a filesystem is mounted with jdev mount option, we store the journal device name in an allocated string in superblock. However we fail to ever free that string. Fix it.
--- fs/reiserfs/super.c | 2 ++ 1 file changed, 2 insertions(+)
fs/reiserfs/super.c +2 -0
@@ -629,6 +629,7 @@ static void reiserfs_put_super(struct sureiserfs_write_unlock (s);mutex_destroy (&REISERFS_SB (s)->lock);destroy_workqueue (REISERFS_SB (s)->commit_wq); +kfree (REISERFS_SB (s)->s_jdev);kfree (s->s_fs_info); s->s_fs_info =NULL ; }
@@ -2243,6 +2244,7 @@ error_unlocked: kfree(qf_names[j]); }#endif +kfree (sbi->s_jdev);kfree (sbi); s->s_fs_info =NULL ;
Greg Kroah-Hartman
maintainerPATCH 45/89 media: digitv: dont continue if remote control state cant be read
In reply to Greg Kroah-HartmanFrom: Sean Young <[email protected]>
commit eecc70d22ae51225de1ef629c1159f7116476b2e upstream.
This results in an uninitialized variable read.
--- drivers/media/usb/dvb-usb/digitv.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/media/usb/dvb-usb/digitv.c +7 -3
@@ -233,18 +233,22 @@ static struct rc_map_table rc_map_digitvstatic int digitv_rc_query (struct dvb_usb_device *d,u32 *event,int *state) { -int i; +int ret, i;u8 key[5 ];u8 b[4 ] = {0 }; *event =0 ; *state =REMOTE_NO_KEY_PRESSED ; -digitv_ctrl_msg (d,USB_READ_REMOTE ,0 ,NULL ,0 ,&key[1 ],4 ); + ret =digitv_ctrl_msg (d,USB_READ_REMOTE ,0 ,NULL ,0 , &key[1 ],4 ); +if (ret) +return ret;/* Tell the device we've read the remote. Not sure how necessary this is, but the Nebula SDK does it. */ -digitv_ctrl_msg (d,USB_WRITE_REMOTE ,0 ,b,4 ,NULL ,0 ); + ret =digitv_ctrl_msg (d,USB_WRITE_REMOTE ,0 , b,4 ,NULL ,0 ); +if (ret) +return ret;/* if something is inside the buffer, simulate key press */ if (key[1 ] !=0 )
Greg Kroah-Hartman
maintainerPATCH 46/89 media: af9005: uninitialized variable printked
In reply to Greg Kroah-HartmanFrom: Sean Young <[email protected]>
commit 51d0c99b391f0cac61ad7b827c26f549ee55672c upstream.
If usb_bulk_msg() fails, actual_length can be uninitialized.
--- drivers/media/usb/dvb-usb/af9005.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/usb/dvb-usb/af9005.c +1 -1
@@ -563,7 +563,7 @@ static int af9005_boot_packet(struct usb u8 *buf, int size) {u16 checksum; -int act_len, i, ret; +int act_len =0 , i, ret;memset (buf,0 , size); buf[0 ] = (u8) (FW_BULKOUT_SIZE &0xff );
Greg Kroah-Hartman
maintainerPATCH 47/89 media: gspca: zero usb_buf
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
commit de89d0864f66c2a1b75becfdd6bf3793c07ce870 upstream.
Allocate gspca_dev->usb_buf with kzalloc instead of kmalloc to ensure it is property zeroed. This fixes various syzbot errors about uninitialized data.
Syzbot links:
https://syzkaller.appspot.com/bug?extid=32310fc2aea76898d074
https://syzkaller.appspot.com/bug?extid=99706d6390be1ac542a2
https://syzkaller.appspot.com/bug?extid=64437af5c781a7f0e08e
--- drivers/media/usb/gspca/gspca.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/usb/gspca/gspca.c +1 -1
@@ -2038,7 +2038,7 @@ int gspca_dev_probe2(struct usb_interfacpr_err ("couldn't kzalloc gspca struct\n" );return -ENOMEM ; } - gspca_dev->usb_buf =kmalloc (USB_BUF_SZ ,GFP_KERNEL ); + gspca_dev->usb_buf =kzalloc (USB_BUF_SZ ,GFP_KERNEL );if (!gspca_dev->usb_buf) {pr_err ("out of memory\n" ); ret = -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 48/89 media: dvb-usb/dvb-usb-urb.c: initialize actlen to 0
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
commit 569bc8d6a6a50acb5fcf07fb10b8d2d461fdbf93 upstream.
This fixes a syzbot failure since actlen could be uninitialized, but it was still used.
Syzbot link:
https://syzkaller.appspot.com/bug?extid=6bf9606ee955b646c0e1
--- drivers/media/usb/dvb-usb/dvb-usb-urb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/usb/dvb-usb/dvb-usb-urb.c +1 -1
@@ -12,7 +12,7 @@int dvb_usb_generic_rw (struct dvb_usb_device *d,u8 *wbuf,u16 wlen,u8 *rbuf,u16 rlen,int delay_ms) { -int actlen,ret = -ENOMEM ; +int actlen =0 , ret = -ENOMEM ;if (!d || wbuf ==NULL || wlen ==0 )return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 49/89 ttyprintk: fix a potential deadlock in interrupt context issue
In reply to Greg Kroah-HartmanFrom: Zhenzhong Duan <[email protected]>
commit 9a655c77ff8fc65699a3f98e237db563b37c439b upstream.
tpk_write()/tpk_close() could be interrupted when holding a mutex, then in timer handler tpk_write() may be called again trying to acquire same mutex, lead to deadlock.
Google syzbot reported this issue with CONFIG_DEBUG_ATOMIC_SLEEP enabled:
BUG: sleeping function called from invalid context at
kernel/locking/mutex.c:938in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 0, name: swapper/1 1 lock held by swapper/1/0:
...
Call Trace: <IRQ> dump_stack+0x197/0x210 ___might_sleep.cold+0x1fb/0x23e __might_sleep+0x95/0x190 __mutex_lock+0xc5/0x13c0 mutex_lock_nested+0x16/0x20 tpk_write+0x5d/0x340 resync_tnc+0x1b6/0x320 call_timer_fn+0x1ac/0x780 run_timer_softirq+0x6c3/0x1790 __do_softirq+0x262/0x98c irq_exit+0x19b/0x1e0 smp_apic_timer_interrupt+0x1a3/0x610 apic_timer_interrupt+0xf/0x20 </IRQ>
See link https://syzkaller.appspot.com/bug?extid=2eeef62ee31f9460ad65 for more details.
Fix it by using spinlock in process context instead of mutex and having interrupt disabled in critical section.
--- drivers/char/ttyprintk.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/char/ttyprintk.c +9 -6
@@ -18,10 +18,11 @@#include <linux/serial.h> #include <linux/tty.h> #include <linux/module.h> +#include <linux/spinlock.h> struct ttyprintk_port {struct tty_port port; -struct mutex port_write_mutex; +spinlock_t spinlock; };static struct ttyprintk_port tpk_port;
@@ -100,11 +101,12 @@ static int tpk_open(struct tty_struct *tstatic void tpk_close (struct tty_struct *tty,struct file *filp) {struct ttyprintk_port *tpkp = tty->driver_data; +unsigned long flags; -mutex_lock (&tpkp->port_write_mutex); +spin_lock_irqsave (&tpkp->spinlock, flags);/* flush tpk_printk buffer */ tpk_printk (NULL ,0 ); -mutex_unlock (&tpkp->port_write_mutex); +spin_unlock_irqrestore (&tpkp->spinlock, flags);tty_port_close (&tpkp->port, tty, filp); }
@@ -116,13 +118,14 @@ static int tpk_write(struct tty_struct * const unsigned char *buf, int count) {struct ttyprintk_port *tpkp = tty->driver_data; +unsigned long flags;int ret;/* exclusive use of tpk_printk within this tty */ -mutex_lock (&tpkp->port_write_mutex); +spin_lock_irqsave (&tpkp->spinlock, flags); ret =tpk_printk (buf, count); -mutex_unlock (&tpkp->port_write_mutex); +spin_unlock_irqrestore (&tpkp->spinlock, flags);return ret; }
@@ -172,7 +175,7 @@ static int __init ttyprintk_init(void) {int ret = -ENOMEM ; -mutex_init (&tpk_port.port_write_mutex); +spin_lock_init (&tpk_port.spinlock); ttyprintk_driver = tty_alloc_driver(1, TTY_DRIVER_RESET_TERMIOS |
Greg Kroah-Hartman
maintainerPATCH 50/89 Bluetooth: Fix race condition in hci_release_sock()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 11eb85ec42dc8c7a7ec519b90ccf2eeae9409de8 upstream.
Syzbot managed to trigger a use after free "KASAN: use-after-free Write in hci_sock_bind". I have reviewed the code manually and one possibly cause I have found is that we are not holding lock_sock(sk) when we do the hci_dev_put(hdev) in hci_sock_release(). My theory is that the bind and the release are racing against each other which results in this use after free.
--- net/bluetooth/hci_sock.c | 3 +++ 1 file changed, 3 insertions(+)
net/bluetooth/hci_sock.c +3 -0
@@ -826,6 +826,8 @@ static int hci_sock_release(struct sockeif (!sk)return 0 ; +lock_sock (sk); +switch (hci_pi (sk)->channel) {case HCI_CHANNEL_MONITOR :atomic_dec (&monitor_promisc);
@@ -873,6 +875,7 @@ static int hci_sock_release(struct sockeskb_queue_purge (&sk->sk_receive_queue);skb_queue_purge (&sk->sk_write_queue); +release_sock (sk);sock_put (sk);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 51/89 cgroup: Prevent double killing of css when enabling threaded cgroup
In reply to Greg Kroah-HartmanFrom: Michal Koutný <[email protected]>
commit 3bc0bb36fa30e95ca829e9cf480e1ef7f7638333 upstream.
The test_cgcore_no_internal_process_constraint_on_threads selftest when running with subsystem controlling noise triggers two warnings:
Quoted 2 lines
[ 597.443115] WARNING: CPU: 1 PID: 28167 at kernel/cgroup/cgroup.c:3131 cgroup_apply_control_enable+0xe0/0x3f0 [ 597.443413] WARNING: CPU: 1 PID: 28167 at kernel/cgroup/cgroup.c:3177 cgroup_apply_control_disable+0xa6/0x160
Both stem from a call to cgroup_type_write. The first warning was also triggered by syzkaller.
When we're switching cgroup to threaded mode shortly after a subsystem was disabled on it, we can see the respective subsystem css dying there.
The warning in cgroup_apply_control_enable is harmless in this case since we're not adding new subsys anyway.
The warning in cgroup_apply_control_disable indicates an attempt to kill css of recently disabled subsystem repeatedly.
The commit prevents these situations by making cgroup_type_write wait for all dying csses to go away before re-applying subtree controls. When at it, the locations of WARN_ON_ONCE calls are moved so that warning is triggered only when we are about to misuse the dying css.
--- kernel/cgroup/cgroup.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
kernel/cgroup/cgroup.c +6 -5
@@ -2884,8 +2884,6 @@ static int cgroup_apply_control_enable(sfor_each_subsys (ss, ssid) {struct cgroup_subsys_state *css =cgroup_css (dsct, ss); -WARN_ON_ONCE (css &&percpu_ref_is_dying (&css->refcnt)); -if (!(cgroup_ss_mask (dsct) & (1 << ss->id)))continue ;
@@ -2895,6 +2893,8 @@ static int cgroup_apply_control_enable(sreturn PTR_ERR (css); } +WARN_ON_ONCE (percpu_ref_is_dying (&css->refcnt)); +if (css_visible (css)) { ret =css_populate_dir (css);if (ret)
@@ -2930,11 +2930,11 @@ static void cgroup_apply_control_disablefor_each_subsys (ss, ssid) {struct cgroup_subsys_state *css =cgroup_css (dsct, ss); -WARN_ON_ONCE (css &&percpu_ref_is_dying (&css->refcnt)); -if (!css)continue ; +WARN_ON_ONCE (percpu_ref_is_dying (&css->refcnt)); +if (css->parent && !(cgroup_ss_mask (dsct) & (1 << ss->id))) {kill_css (css);
@@ -3221,7 +3221,8 @@ static ssize_t cgroup_type_write(structif (strcmp (strstrip (buf),"threaded" ))return -EINVAL ; - cgrp =cgroup_kn_lock_live (of->kn, false); +/* drain dying csses before we re-apply (threaded) subtree control */ + cgrp =cgroup_kn_lock_live (of->kn, true);if (!cgrp)return -ENOENT ;
Greg Kroah-Hartman
maintainerPATCH 52/89 media: si470x-i2c: Move free() past last use of radio
In reply to Greg Kroah-HartmanFrom: Lee Jones <[email protected]>
A pointer to 'struct si470x_device' is currently used after free:
drivers/media/radio/si470x/radio-si470x-i2c.c:462:25-30: ERROR: reference
preceded by free on line 460
Shift the call to free() down past its final use.
NB: Not sending to Mainline, since the problem does not exist there, it was caused by the backport of 2df200ab234a ("media: si470x-i2c: add missed operations in remove") to the stable trees.
--- drivers/media/radio/si470x/radio-si470x-i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/radio/si470x/radio-si470x-i2c.c +1 -1
@@ -453,10 +453,10 @@ static int si470x_i2c_remove(struct i2c_free_irq (client->irq, radio);video_unregister_device (&radio->videodev); -kfree (radio);v4l2_ctrl_handler_free (&radio->hdl);v4l2_device_unregister (&radio->v4l2_dev); +kfree (radio);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 53/89 ARM: dts: sun8i: a83t: Correct USB3503 GPIOs polarity
In reply to Greg Kroah-HartmanFrom: Marek Szyprowski <[email protected]>
[ Upstream commit 1c226017d3ec93547b58082bdf778d9db7401c95 ]
Current USB3503 driver ignores GPIO polarity and always operates as if the GPIO lines were flagged as ACTIVE_HIGH. Fix the polarity for the existing USB3503 chip applications to match the chip specification and common convention for naming the pins. The only pin, which has to be ACTIVE_LOW is the reset pin. The remaining are ACTIVE_HIGH. This change allows later to fix the USB3503 driver to properly use generic GPIO bindings and read polarity from DT.
--- arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts +1 -1
@@ -90,7 +90,7 @@ initial-mode = <1>; /* initialize in HUB mode */ disabled-ports = <1>; intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */ - reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */ + reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */ connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */ refclk-frequency = <19200000>; };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 54/89 ARM: dts: beagle-x15-common: Model 5V0 regulator
In reply to Greg Kroah-HartmanFrom: Kishon Vijay Abraham I <[email protected]>
[ Upstream commit e17e7c498d4f734df93c300441e100818ed58168 ]
On am57xx-beagle-x15, 5V0 is connected to P16, P17, P18 and P19 connectors. On am57xx-evm, 5V0 regulator is used to get 3V6 regulator which is connected to the COMQ port. Model 5V0 regulator here in order for it to be used in am57xx-evm to model 3V6 regulator.
--- .../boot/dts/am57xx-beagle-x15-common.dtsi | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+)
arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi +21 -0
@@ -32,6 +32,27 @@ reg = <0x0 0x80000000 0x0 0x80000000>; }; + main_12v0: fixedregulator-main_12v0 { + /* main supply */ + compatible = "regulator-fixed"; + regulator-name = "main_12v0"; + regulator-min-microvolt = <12000000>; + regulator-max-microvolt = <12000000>; + regulator-always-on; + regulator-boot-on; + }; + + evm_5v0: fixedregulator-evm_5v0 { + /* Output of TPS54531D */ + compatible = "regulator-fixed"; + regulator-name = "evm_5v0"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&main_12v0>; + regulator-always-on; + regulator-boot-on; + }; + vdd_3v3: fixedregulator-vdd_3v3 { compatible = "regulator-fixed"; regulator-name = "vdd_3v3";
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 55/89 soc: ti: wkup_m3_ipc: Fix race condition with rproc_boot
In reply to Greg Kroah-HartmanFrom: Dave Gerlach <[email protected]>
[ Upstream commit 03729cfa0d543bc996bf959e762ec999afc8f3d2 ]
Any user of wkup_m3_ipc calls wkup_m3_ipc_get to get a handle and this checks the value of the static variable m3_ipc_state to see if the wkup_m3 is ready. Currently this is populated during probe before rproc_boot has been called, meaning there is a window of time that wkup_m3_ipc_get can return a valid handle but the wkup_m3 itself is not ready, leading to invalid IPC calls to the wkup_m3 and system instability.
To avoid this, move the population of the m3_ipc_state variable until after rproc_boot has succeeded to guarantee a valid and usable handle is always returned.
--- drivers/soc/ti/wkup_m3_ipc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/soc/ti/wkup_m3_ipc.c +2 -2
@@ -375,6 +375,8 @@ static void wkup_m3_rproc_boot_thread(struct wkup_m3_ipc *m3_ipc) ret =rproc_boot (m3_ipc->rproc);if (ret)dev_err (dev,"rproc_boot failed\n" ); +else + m3_ipc_state = m3_ipc;do_exit (0 ); }
@@ -461,8 +463,6 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev) goto err_put_rproc; } - m3_ipc_state = m3_ipc; -return 0 ; err_put_rproc:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 56/89 mac80211: mesh: restrict airtime metric to peered established plinks
In reply to Greg Kroah-HartmanFrom: Markus Theil <[email protected]>
[ Upstream commit 02a614499600af836137c3fbc4404cd96365fff2 ]
The following warning is triggered every time an unestablished mesh peer gets dumped. Checks if a peer link is established before retrieving the airtime link metric.
[ 9563.022567] WARNING: CPU: 0 PID: 6287 at net/mac80211/mesh_hwmp.c:345
airtime_link_metric_get+0xa2/0xb0 [mac80211]
[ 9563.022697] Hardware name: PC Engines apu2/apu2, BIOS v4.10.0.3
[ 9563.022756] RIP: 0010:airtime_link_metric_get+0xa2/0xb0 [mac80211]
[ 9563.022838] Call Trace:
[ 9563.022897] sta_set_sinfo+0x936/0xa10 [mac80211]
[ 9563.022964] ieee80211_dump_station+0x6d/0x90 [mac80211]
[ 9563.023062] nl80211_dump_station+0x154/0x2a0 [cfg80211]
[ 9563.023120] netlink_dump+0x17b/0x370
[ 9563.023130] netlink_recvmsg+0x2a4/0x480
[ 9563.023140] ____sys_recvmsg+0xa6/0x160
[ 9563.023154] ___sys_recvmsg+0x93/0xe0
[ 9563.023169] __sys_recvmsg+0x7e/0xd0
[ 9563.023210] do_syscall_64+0x4e/0x140
[ 9563.023217] entry_SYSCALL_64_after_hwframe+0x44/0xa9--- net/mac80211/mesh_hwmp.c | 3 +++ 1 file changed, 3 insertions(+)
net/mac80211/mesh_hwmp.c +3 -0
@@ -326,6 +326,9 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local,unsigned long fail_avg =ewma_mesh_fail_avg_read (&sta->mesh->fail_avg); +if (sta->mesh->plink_state !=NL80211_PLINK_ESTAB ) +return MAX_METRIC ; +/* Try to get rate based on HW/SW RC algorithm. * Rate is returned in units of Kbps, correct this * to comply with airtime calculation units
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 57/89 clk: mmp2: Fix the order of timer mux parents
In reply to Greg Kroah-HartmanFrom: Lubomir Rintel <[email protected]>
[ Upstream commit 8bea5ac0fbc5b2103f8779ddff216122e3c2e1ad ]
Determined empirically, no documentation is available.
The OLPC XO-1.75 laptop used parent 1, that one being VCTCXO/4 (65MHz), but thought it's a VCTCXO/2 (130MHz). The mmp2 timer driver, not knowing what is going on, ended up just dividing the rate as of
commit f36797ee4380 ("ARM: mmp/mmp2: dt: enable the clock")'
--- drivers/clk/mmp/clk-of-mmp2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/mmp/clk-of-mmp2.c +1 -1
@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock);static const char *ssp_parent_names[] = {"vctcxo_4" ,"vctcxo_2" ,"vctcxo" ,"pll1_16" };static DEFINE_SPINLOCK (timer_lock); -static const char *timer_parent_names[] = {"clk32" ,"vctcxo_2" ,"vctcxo_4" ,"vctcxo" }; +static const char *timer_parent_names[] = {"clk32" ,"vctcxo_4" ,"vctcxo_2" ,"vctcxo" };static DEFINE_SPINLOCK (reset_lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 58/89 ixgbevf: Remove limit of 10 entries for unicast filter list
In reply to Greg Kroah-HartmanFrom: Radoslaw Tyl <[email protected]>
[ Upstream commit aa604651d523b1493988d0bf6710339f3ee60272 ]
Currently, though the FDB entry is added to VF, it does not appear in RAR filters. VF driver only allows to add 10 entries. Attempting to add another causes an error. This patch removes limitation and allows use of all free RAR entries for the FDB if needed.
--- drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +0 -5
@@ -1858,11 +1858,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev)struct ixgbe_hw *hw = &adapter->hw;int count =0 ; -if ((netdev_uc_count (netdev)) >10 ) { -pr_err ("Too many unicast filters - No Space\n" ); -return -ENOSPC ; - } -if (!netdev_uc_empty (netdev)) {struct netdev_hw_addr *ha;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 59/89 ixgbe: Fix calculation of queue with VFs and flow director on interface flap
In reply to Greg Kroah-HartmanFrom: Cambda Zhu <[email protected]>
[ Upstream commit 4fad78ad6422d9bca62135bbed8b6abc4cbb85b8 ]
This patch fixes the calculation of queue when we restore flow director filters after resetting adapter. In ixgbe_fdir_filter_restore(), filter's vf may be zero which makes the queue outside of the rx_ring array.
The calculation is changed to the same as ixgbe_add_ethtool_fdir_entry().
--- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +27 -10
@@ -5131,7 +5131,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)struct ixgbe_hw *hw = &adapter->hw;struct hlist_node *node2;struct ixgbe_fdir_filter *filter; -u64 action; +u8 queue;spin_lock (&adapter->fdir_perfect_lock);
@@ -5140,17 +5140,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)hlist_for_each_entry_safe (filter, node2, &adapter->fdir_filter_list, fdir_node) { - action = filter->action; -if (action !=IXGBE_FDIR_DROP_QUEUE && action !=0 ) - action = - (action >>ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF ) -1 ; +if (filter->action ==IXGBE_FDIR_DROP_QUEUE ) { + queue =IXGBE_FDIR_DROP_QUEUE ; + }else { +u32 ring =ethtool_get_flow_spec_ring (filter->action); +u8 vf =ethtool_get_flow_spec_ring_vf (filter->action); + +if (!vf && (ring >= adapter->num_rx_queues)) { +e_err (drv,"FDIR restore failed without VF, ring: %u\n" , + ring); +continue ; + }else if (vf && + ((vf > adapter->num_vfs) || + ring >= adapter->num_rx_queues_per_pool)) { +e_err (drv,"FDIR restore failed with VF, vf: %hhu, ring: %u\n" , + vf, ring); +continue ; + } + +/* Map the ring onto the absolute queue index */ +if (!vf) + queue = adapter->rx_ring[ring]->reg_idx; +else + queue = ((vf -1 ) * + adapter->num_rx_queues_per_pool) + ring; + }ixgbe_fdir_write_perfect_filter_82599 (hw, - &filter->filter, - filter->sw_idx, - (action ==IXGBE_FDIR_DROP_QUEUE ) ? -IXGBE_FDIR_DROP_QUEUE : - adapter->rx_ring[action]->reg_idx); + &filter->filter, filter->sw_idx, queue); }spin_unlock (&adapter->fdir_perfect_lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 60/89 igb: Fix SGMII SFP module discovery for 100FX/LX.
In reply to Greg Kroah-HartmanFrom: Manfred Rudigier <[email protected]>
[ Upstream commit 5365ec1aeff5b9f2962a9c9b31d63f9dad7e0e2d ]
Changing the link mode should also be done for 100BaseFX SGMII modules, otherwise they just don't work when the default link mode in CTRL_EXT coming from the EEPROM is SERDES.
Additionally 100Base-LX SGMII SFP modules are also supported now, which was not the case before.
Tested with an i210 using Flexoptix S.1303.2M.G 100FX and S.1303.10.G 100LX SGMII SFP modules.
--- drivers/net/ethernet/intel/igb/e1000_82575.c | 8 ++------ drivers/net/ethernet/intel/igb/igb_ethtool.c | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-)
drivers/net/ethernet/intel/igb/e1000_82575.c +2 -6
@@ -562,7 +562,7 @@ static s32 igb_set_sfp_media_type_82575(struct e1000_hw *hw) dev_spec->module_plugged = true;if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) { hw->phy.media_type = e1000_media_type_internal_serdes; - }else if (eth_flags->e100_base_fx) { + }else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { dev_spec->sgmii_active = true; hw->phy.media_type = e1000_media_type_internal_serdes; }else if (eth_flags->e1000_base_t) {
@@ -689,14 +689,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)break ; } -/* do not change link mode for 100BaseFX */ -if (dev_spec->eth_flags.e100_base_fx) -break ; -/* change current link mode setting */ ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK ; -if (hw->phy.media_type == e1000_media_type_copper) +if (dev_spec->sgmii_active) ctrl_ext |=E1000_CTRL_EXT_LINK_MODE_SGMII ;else ctrl_ext |=E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES ;
drivers/net/ethernet/intel/igb/igb_ethtool.c +1 -1
@@ -201,7 +201,7 @@ static int igb_get_link_ksettings(struct net_device *netdev, advertising &= ~ADVERTISED_1000baseKX_Full; } } -if (eth_flags->e100_base_fx) { +if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { supported |= SUPPORTED_100baseT_Full; advertising |= ADVERTISED_100baseT_Full; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 61/89 ASoC: sti: fix possible sleep-in-atomic
In reply to Greg Kroah-HartmanFrom: Arnaud Pouliquen <[email protected]>
[ Upstream commit ce780a47c3c01e1e179d0792df6b853a913928f1 ]
Change mutex and spinlock management to avoid sleep in atomic issue.
--- sound/soc/sti/uniperif_player.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
sound/soc/sti/uniperif_player.c +4 -3
@@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player,* sampling frequency. If no sample rate is already specified, then * set one. */ -mutex_lock (&player->ctrl_lock);if (runtime) {switch (runtime->rate) {case 22050 :
@@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif *player, player->stream_settings.iec958.status[3 + (n *4 )] <<24 ;SET_UNIPERIF_CHANNEL_STA_REGN (player, n, status); } -mutex_unlock (&player->ctrl_lock);/* Update the channel status */ if (player->ver <SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 )
@@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif *player,SET_UNIPERIF_CTRL_ZERO_STUFF_HW (player); +mutex_lock (&player->ctrl_lock);/* Update the channel status */ uni_player_set_channel_status (player, runtime); +mutex_unlock (&player->ctrl_lock);/* Clear the user validity user bits */ SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR (player,0 );
@@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, iec958->status[1 ] = ucontrol->value.iec958.status[1 ]; iec958->status[2 ] = ucontrol->value.iec958.status[2 ]; iec958->status[3 ] = ucontrol->value.iec958.status[3 ]; -mutex_unlock (&player->ctrl_lock);spin_lock_irqsave (&player->irq_lock, flags);if (player->substream && player->substream->runtime)
@@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,uni_player_set_channel_status (player,NULL );spin_unlock_irqrestore (&player->irq_lock, flags); +mutex_unlock (&player->ctrl_lock); +return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 62/89 qmi_wwan: Add support for Quectel RM500Q
In reply to Greg Kroah-HartmanFrom: Kristian Evensen <[email protected]>
[ Upstream commit a9ff44f0e61d074f29770413fef6a5452be7b83e ]
RM500Q is a 5G module from Quectel, supporting both standalone and non-standalone modes. The normal Quectel quirks apply (DTR and dynamic interface numbers).
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -999,6 +999,7 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL *//* 3. Combined interface devices matching on interface number */ {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 63/89 wireless: fix enabling channel 12 for custom regulatory domain
In reply to Greg Kroah-HartmanFrom: Ganapathi Bhat <[email protected]>
[ Upstream commit c4b9d655e445a8be0bff624aedea190606b5ebbc ]
Commit e33e2241e272 ("Revert "cfg80211: Use 5MHz bandwidth by default when checking usable channels"") fixed a broken regulatory (leaving channel 12 open for AP where not permitted). Apply a similar fix to custom regulatory domain processing.
--- net/wireless/reg.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
net/wireless/reg.c +10 -3
@@ -1718,14 +1718,15 @@ static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)static void handle_channel_custom (struct wiphy *wiphy,struct ieee80211_channel *chan, -const struct ieee80211_regdomain *regd) +const struct ieee80211_regdomain *regd, +u32 min_bw) {u32 bw_flags =0 ;const struct ieee80211_reg_rule *reg_rule =NULL ;const struct ieee80211_power_rule *power_rule =NULL ;u32 bw; -for (bw =MHZ_TO_KHZ (20 ); bw >=MHZ_TO_KHZ (5 ); bw = bw /2 ) { +for (bw =MHZ_TO_KHZ (20 ); bw >= min_bw; bw = bw /2 ) { reg_rule =freq_reg_info_regd (MHZ_TO_KHZ (chan->center_freq), regd, bw);if (!IS_ERR (reg_rule))
@@ -1781,8 +1782,14 @@ static void handle_band_custom(struct wiphy *wiphy,if (!sband)return ; +/* +* We currently assume that you always want at least 20 MHz, +* otherwise channel 12 might get enabled if this rule is +* compatible to US, which permits 2402 - 2472 MHz. +*/ for (i =0 ; i < sband->n_channels; i++) -handle_channel_custom (wiphy, &sband->channels[i], regd); +handle_channel_custom (wiphy, &sband->channels[i], regd, +MHZ_TO_KHZ (20 )); }/* Used by drivers prior to wiphy registration */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 64/89 cfg80211: Fix radar event during another phy CAC
In reply to Greg Kroah-HartmanFrom: Orr Mazor <[email protected]>
[ Upstream commit 26ec17a1dc5ecdd8d91aba63ead6f8b5ad5dea0d ]
In case a radar event of CAC_FINISHED or RADAR_DETECTED happens during another phy is during CAC we might need to cancel that CAC.
If we got a radar in a channel that another phy is now doing CAC on then the CAC should be canceled there.
If, for example, 2 phys doing CAC on the same channels, or on comptable channels, once on of them will finish his CAC the other might need to cancel his CAC, since it is no longer relevant.
To fix that the commit adds an callback and implement it in mac80211 to end CAC.
This commit also adds a call to said callback if after a radar event we see the CAC is no longer relevant
--- include/net/cfg80211.h | 5 +++++ net/mac80211/cfg.c | 23 +++++++++++++++++++++++ net/wireless/rdev-ops.h | 10 ++++++++++ net/wireless/reg.c | 23 ++++++++++++++++++++++- net/wireless/trace.h | 5 +++++ 5 files changed, 65 insertions(+), 1 deletion(-)
include/net/cfg80211.h +5 -0
@@ -2843,6 +2843,9 @@ struct cfg80211_pmk_conf {* * @start_radar_detection: Start radar detection in the driver. * +* @end_cac: End running CAC, probably because a related CAC +* was finished on another phy. +* * @update_ft_ies: Provide updated Fast BSS Transition information to the * driver. If the SME is in the driver/firmware, this information can be * used in building Authentication and Reassociation Request frames.
@@ -3148,6 +3151,8 @@ struct cfg80211_ops {struct net_device *dev, struct cfg80211_chan_def *chandef, u32 cac_time_ms); +void (*end_cac)(struct wiphy *wiphy, +struct net_device *dev);int (*update_ft_ies)(struct wiphy *wiphy,struct net_device *dev,struct cfg80211_update_ft_ies_params *ftie); int (*crit_proto_start)(struct wiphy *wiphy,
net/mac80211/cfg.c +23 -0
@@ -2800,6 +2800,28 @@ static int ieee80211_start_radar_detection(struct wiphy *wiphy,return err; } +static void ieee80211_end_cac (struct wiphy *wiphy, +struct net_device *dev) +{ +struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local = sdata->local; + +mutex_lock (&local->mtx); +list_for_each_entry (sdata, &local->interfaces, list) { +/* it might be waiting for the local->mtx, but then +* by the time it gets it, sdata->wdev.cac_started +* will no longer be true +*/ +cancel_delayed_work (&sdata->dfs_cac_timer_work); + +if (sdata->wdev.cac_started) { +ieee80211_vif_release_channel (sdata); + sdata->wdev.cac_started = false; + } + } +mutex_unlock (&local->mtx); +} +static struct cfg80211_beacon_data *cfg80211_beacon_dup (struct cfg80211_beacon_data *beacon) {
@@ -3730,6 +3752,7 @@ const struct cfg80211_ops mac80211_config_ops = {#endif .get_channel = ieee80211_cfg_get_channel, .start_radar_detection = ieee80211_start_radar_detection, + .end_cac = ieee80211_end_cac, .channel_switch = ieee80211_channel_switch, .set_qos_map = ieee80211_set_qos_map, .set_ap_chanwidth = ieee80211_set_ap_chanwidth,
net/wireless/rdev-ops.h +10 -0
@@ -1143,6 +1143,16 @@ rdev_start_radar_detection(struct cfg80211_registered_device *rdev,return ret; } +static inline void +rdev_end_cac (struct cfg80211_registered_device *rdev, +struct net_device *dev) +{ +trace_rdev_end_cac (&rdev->wiphy, dev); +if (rdev->ops->end_cac) + rdev->ops->end_cac (&rdev->wiphy, dev); +trace_rdev_return_void (&rdev->wiphy); +} + static inline int rdev_set_mcast_rate(struct cfg80211_registered_device *rdev, struct net_device *dev,
net/wireless/reg.c +22 -1
@@ -3303,6 +3303,25 @@ bool regulatory_pre_cac_allowed(struct wiphy *wiphy)return pre_cac_allowed; } +static void cfg80211_check_and_end_cac (struct cfg80211_registered_device *rdev) +{ +struct wireless_dev *wdev; +/* If we finished CAC or received radar, we should end any +* CAC running on the same channels. +* the check !cfg80211_chandef_dfs_usable contain 2 options: +* either all channels are available - those the CAC_FINISHED +* event has effected another wdev state, or there is a channel +* in unavailable state in wdev chandef - those the RADAR_DETECTED +* event has effected another wdev state. +* In both cases we should end the CAC on the wdev. +*/ +list_for_each_entry (wdev, &rdev->wiphy.wdev_list, list) { +if (wdev->cac_started && + !cfg80211_chandef_dfs_usable (&rdev->wiphy, &wdev->chandef)) +rdev_end_cac (rdev, wdev->netdev); + } +} + void regulatory_propagate_dfs_state(struct wiphy *wiphy, struct cfg80211_chan_def *chandef, enum nl80211_dfs_state dfs_state,
@@ -3329,8 +3348,10 @@ void regulatory_propagate_dfs_state(struct wiphy *wiphy,cfg80211_set_dfs_state (&rdev->wiphy, chandef, dfs_state);if (event ==NL80211_RADAR_DETECTED || - event ==NL80211_RADAR_CAC_FINISHED ) + event ==NL80211_RADAR_CAC_FINISHED ) {cfg80211_sched_dfs_chan_update (rdev); +cfg80211_check_and_end_cac (rdev); + }nl80211_radar_notify (rdev, chandef, event,NULL ,GFP_KERNEL ); }
net/wireless/trace.h +5 -0
@@ -607,6 +607,11 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_flush_pmksa,TP_ARGS (wiphy, netdev) ); +DEFINE_EVENT (wiphy_netdev_evt, rdev_end_cac, + TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), +TP_ARGS (wiphy, netdev) +); + DECLARE_EVENT_CLASS(station_add_change, TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac, struct station_parameters *params),
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 65/89 mac80211: Fix TKIP replay protection immediately after key setup
In reply to Greg Kroah-HartmanFrom: Jouni Malinen <[email protected]>
[ Upstream commit 6f601265215a421f425ba3a4850a35861d024643 ]
TKIP replay protection was skipped for the very first frame received after a new key is configured. While this is potentially needed to avoid dropping a frame in some cases, this does leave a window for replay attacks with group-addressed frames at the station side. Any earlier frame sent by the AP using the same key would be accepted as a valid frame and the internal RSC would then be updated to the TSC from that frame. This would allow multiple previously transmitted group-addressed frames to be replayed until the next valid new group-addressed frame from the AP is received by the station.
Fix this by limiting the no-replay-protection exception to apply only for the case where TSC=0, i.e., when this is for the very first frame protected using the new key, and the local RSC had not been set to a higher value when configuring the key (which may happen with GTK).
--- net/mac80211/tkip.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
net/mac80211/tkip.c +15 -3
@@ -266,9 +266,21 @@ int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm,if ((keyid >>6 ) != key->conf.keyidx)return TKIP_DECRYPT_INVALID_KEYIDX ; -if (rx_ctx->ctx.state !=TKIP_STATE_NOT_INIT && - (iv32 < rx_ctx->iv32 || - (iv32 == rx_ctx->iv32 && iv16 <= rx_ctx->iv16))) +/* Reject replays if the received TSC is smaller than or equal to the +* last received value in a valid message, but with an exception for +* the case where a new key has been set and no valid frame using that +* key has yet received and the local RSC was initialized to 0. This +* exception allows the very first frame sent by the transmitter to be +* accepted even if that transmitter were to use TSC 0 (IEEE 802.11 +* described TSC to be initialized to 1 whenever a new key is taken into +* use). +*/ +if (iv32 < rx_ctx->iv32 || + (iv32 == rx_ctx->iv32 && + (iv16 < rx_ctx->iv16 || + (iv16 == rx_ctx->iv16 && + (rx_ctx->iv32 || rx_ctx->iv16 || + rx_ctx->ctx.state !=TKIP_STATE_NOT_INIT )))))return TKIP_DECRYPT_REPLAY ;if (only_iv) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 66/89 wireless: wext: avoid gcc -O3 warning
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit e16119655c9e6c4aa5767cd971baa9c491f41b13 ]
After the introduction of CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3, the wext code produces a bogus warning:
In function 'iw_handler_get_iwstats',
inlined from 'ioctl_standard_call' at net/wireless/wext-core.c:1015:9, inlined from 'wireless_process_ioctl' at net/wireless/wext-core.c:935:10, inlined from 'wext_ioctl_dispatch.part.8' at net/wireless/wext-core.c:986:8, inlined from 'wext_handle_ioctl':net/wireless/wext-core.c:671:3: error: argument 1 null where non-null expected [-Werror=nonnull]
memcpy(extra, stats, sizeof(struct iw_statistics)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from arch/x86/include/asm/string.h:5,net/wireless/wext-core.c: In function 'wext_handle_ioctl':arch/x86/include/asm/string_64.h:14:14: note: in a call to function 'memcpy' declared here
The problem is that ioctl_standard_call() sometimes calls the handler with a NULL argument that would cause a problem for iw_handler_get_iwstats. However, iw_handler_get_iwstats never actually gets called that way.
Marking that function as noinline avoids the warning and leads to slightly smaller object code as well.
--- net/wireless/wext-core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/wireless/wext-core.c +2 -1
@@ -659,7 +659,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev)return NULL ; } -static int iw_handler_get_iwstats (struct net_device * dev, +/* noinline to avoid a bogus warning with -O3 */ +static noinline int iw_handler_get_iwstats(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 67/89 net: dsa: bcm_sf2: Configure IMP port for 2Gb/sec
In reply to Greg Kroah-HartmanFrom: Florian Fainelli <[email protected]>
[ Upstream commit 8f1880cbe8d0d49ebb7e9ae409b3b96676e5aa97 ]
With the implementation of the system reset controller we lost a setting that is currently applied by the bootloader and which configures the IMP port for 2Gb/sec, the default is 1Gb/sec. This is needed given the number of ports and applications we expect to run so bring back that setting.
--- drivers/net/dsa/bcm_sf2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/dsa/bcm_sf2.c +1 -1
@@ -137,7 +137,7 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port)/* Force link status for IMP port */ reg =core_readl (priv, offset); - reg |= (MII_SW_OR |LINK_STS ); + reg |= (MII_SW_OR |LINK_STS |GMII_SPEED_UP_2G );core_writel (priv, reg, offset);/* Enable Broadcast, Multicast, Unicast forwarding to IMP port */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 68/89 bnxt_en: Fix ipv6 RFS filter matching logic.
In reply to Greg Kroah-HartmanFrom: Michael Chan <[email protected]>
[ Upstream commit 6fc7caa84e713f7627e171ab1e7c4b5be0dc9b3d ]
Fix bnxt_fltr_match() to match ipv6 source and destination addresses. The function currently only checks ipv4 addresses and will not work corrently on ipv6 filters.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +17 -5
@@ -7402,11 +7402,23 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1,struct flow_keys *keys1 = &f1->fkeys;struct flow_keys *keys2 = &f2->fkeys; -if (keys1->addrs.v4addrs.src == keys2->addrs.v4addrs.src && - keys1->addrs.v4addrs.dst == keys2->addrs.v4addrs.dst && - keys1->ports.ports == keys2->ports.ports && - keys1->basic.ip_proto == keys2->basic.ip_proto && - keys1->basic.n_proto == keys2->basic.n_proto && +if (keys1->basic.n_proto != keys2->basic.n_proto || + keys1->basic.ip_proto != keys2->basic.ip_proto) +return false; + +if (keys1->basic.n_proto ==htons (ETH_P_IP )) { +if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src || + keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst) +return false; + }else { +if (memcmp (&keys1->addrs.v6addrs.src, &keys2->addrs.v6addrs.src, +sizeof (keys1->addrs.v6addrs.src)) || +memcmp (&keys1->addrs.v6addrs.dst, &keys2->addrs.v6addrs.dst, +sizeof (keys1->addrs.v6addrs.dst))) +return false; + } + +if (keys1->ports.ports == keys2->ports.ports && keys1->control.flags == keys2->control.flags &ðer_addr_equal (f1->src_mac_addr, f2->src_mac_addr) &ðer_addr_equal (f1->dst_mac_addr, f2->dst_mac_addr))
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 69/89 iwlwifi: mvm: fix NVM check for 3168 devices
In reply to Greg Kroah-HartmanFrom: Luca Coelho <[email protected]>
[ Upstream commit b3f20e098293892388d6a0491d6bbb2efb46fbff ]
We had a check on !NVM_EXT and then a check for NVM_SDP in the else block of this if. The else block, obviously, could only be reached if using NVM_EXT, so it would never be NVM_SDP.
Fix that by checking whether the nvm_type is IWL_NVM instead of checking for !IWL_NVM_EXT to solve this issue.
--- drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/mvm/nvm.c +1 -1
@@ -298,7 +298,7 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)int regulatory_type;/* Checking for required sections */ -if (mvm->trans->cfg->nvm_type !=IWL_NVM_EXT ) { +if (mvm->trans->cfg->nvm_type ==IWL_NVM ) {if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW ].data || !mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data) {IWL_ERR (mvm,"Can't parse empty OTP/NVM sections\n" );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 70/89 Input: aiptek - use descriptors of current altsetting
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit cfa4f6a99fb183742cace65ec551b444852b8ef6 ]
Make sure to always use the descriptors of the current alternate setting to avoid future issues when accessing fields that may differ between settings.
--- drivers/input/tablet/aiptek.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/tablet/aiptek.c +1 -1
@@ -1733,7 +1733,7 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) aiptek->inputdev = inputdev; aiptek->intf = intf; - aiptek->ifnum = intf->altsetting[0 ].desc.bInterfaceNumber; + aiptek->ifnum = intf->cur_altsetting->desc.bInterfaceNumber; aiptek->inDelay =0 ; aiptek->endDelay =0 ; aiptek->previousJitterable =0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 71/89 ARM: dts: am335x-boneblack-common: fix memory size
In reply to Greg Kroah-HartmanFrom: Matwey V. Kornilov <[email protected]>
[ Upstream commit 5abd45ea0fc3060f7805e131753fdcbafd6c6618 ]
BeagleBone Black series is equipped with 512MB RAM whereas only 256MB is included from am335x-bone-common.dtsi
This leads to an issue with unusual setups when devicetree is loaded by GRUB2 directly.
--- arch/arm/boot/dts/am335x-boneblack-common.dtsi | 5 +++++ 1 file changed, 5 insertions(+)
arch/arm/boot/dts/am335x-boneblack-common.dtsi +5 -0
@@ -131,6 +131,11 @@ }; / { + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 0x20000000>; /* 512 MB */ + }; + clk_mcasp0_fixed: clk_mcasp0_fixed { #clock-cells = <0>; compatible = "fixed-clock";
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 72/89 vti[6]: fix packet tx through bpf_redirect()
In reply to Greg Kroah-HartmanFrom: Nicolas Dichtel <[email protected]>
[ Upstream commit 95224166a9032ff5d08fca633d37113078ce7d01 ]
With an ebpf program that redirects packets through a vti[6] interface, the packets are dropped because no dst is attached.
This could also be reproduced with an AF_PACKET socket, with the following python script (vti1 is an ip_vti interface):
import socket
send_s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 0)
# scapy
# p = IP(src='10.100.0.2', dst='10.200.0.1')/ICMP(type='echo-request')
# raw(p)
req = b'E\x00\x00\x1c\x00\x01\x00\x00@\x01e\xb2\nd\x00\x02\n\xc8\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00'
send_s.sendto(req, ('vti1', 0x800, 0, 0))--- net/ipv4/ip_vti.c | 13 +++++++++++-- net/ipv6/ip6_vti.c | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-)
net/ipv4/ip_vti.c +11 -2
@@ -208,8 +208,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,int mtu;if (!dst) { - dev->stats.tx_carrier_errors++; - goto tx_error_icmp; +struct rtable *rt; + + fl->u.ip4.flowi4_oif = dev->ifindex; + fl->u.ip4.flowi4_flags |=FLOWI_FLAG_ANYSRC ; + rt =__ip_route_output_key (dev_net (dev), &fl->u.ip4); +if (IS_ERR (rt)) { + dev->stats.tx_carrier_errors++; + goto tx_error_icmp; + } + dst = &rt->dst; +skb_dst_set (skb, dst); }dst_hold (dst);
net/ipv6/ip6_vti.c +11 -2
@@ -453,8 +453,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)int err =-1 ;int mtu; -if (!dst) - goto tx_err_link_failure; +if (!dst) { + fl->u.ip6.flowi6_oif = dev->ifindex; + fl->u.ip6.flowi6_flags |=FLOWI_FLAG_ANYSRC ; + dst =ip6_route_output (dev_net (dev),NULL , &fl->u.ip6); +if (dst->error) { +dst_release (dst); + dst =NULL ; + goto tx_err_link_failure; + } +skb_dst_set (skb, dst); + }dst_hold (dst); dst =xfrm_lookup (t->net, dst, fl,NULL ,0 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 73/89 scsi: fnic: do not queue commands during fwreset
In reply to Greg Kroah-HartmanFrom: Hannes Reinecke <[email protected]>
[ Upstream commit 0e2209629fec427ba75a6351486153a9feddd36b ]
When a link is going down the driver will be calling fnic_cleanup_io(), which will traverse all commands and calling 'done' for each found command. While the traversal is handled under the host_lock, calling 'done' happens after the host_lock is being dropped.
As fnic_queuecommand_lck() is being called with the host_lock held, it might well be that it will pick the command being selected for abortion from the above routine and enqueue it for sending, but then 'done' is being called on that very command from the above routine.
Which of course confuses the hell out of the scsi midlayer.
So fix this by not queueing commands when fnic_cleanup_io is active.
--- drivers/scsi/fnic/fnic_scsi.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/fnic/fnic_scsi.c +3 -0
@@ -446,6 +446,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_if (unlikely (fnic_chk_state_flags_locked (fnic,FNIC_FLAGS_IO_BLOCKED )))return SCSI_MLQUEUE_HOST_BUSY ; +if (unlikely (fnic_chk_state_flags_locked (fnic,FNIC_FLAGS_FWRESET ))) +return SCSI_MLQUEUE_HOST_BUSY ; + rport =starget_to_rport (scsi_target (sc->device));if (!rport) { FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 74/89 ARM: 8955/1: virt: Relax arch timer version check during early boot
In reply to Greg Kroah-HartmanFrom: Vladimir Murzin <[email protected]>
[ Upstream commit 6849b5eba1965ceb0cad3a75877ef4569dd3638e ]
Updates to the Generic Timer architecture allow ID_PFR1.GenTimer to have values other than 0 or 1 while still preserving backward compatibility. At the moment, Linux is quite strict in the way it handles this field at early boot and will not configure arch timer if it doesn't find the value 1.
Since here use ubfx for arch timer version extraction (hyb-stub build with -march=armv7-a, so it is safe)
To help backports (even though the code was correct at the time of writing)
--- arch/arm/kernel/hyp-stub.S | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
arch/arm/kernel/hyp-stub.S +3 -4
@@ -159,10 +159,9 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER) @ make CNTP_* and CNTPCT accessible from PL1 mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 - lsr r7, #16 - and r7, #0xf - cmp r7, #1 - bne 1f + ubfx r7, r7, #16, #4 + teq r7, #0 + beq 1f mrc p15, 4, r7, c14, c1, 0 @ CNTHCTL orr r7, r7, #3 @ PL1PCEN | PL1PCTEN mcr p15, 4, r7, c14, c1, 0 @ CNTHCTL
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 75/89 tee: optee: Fix compilation issue with nommu
In reply to Greg Kroah-HartmanFrom: Vincenzo Frascino <[email protected]>
[ Upstream commit 9e0caab8e0f96f0af7d1dd388e62f44184a75372 ]
The optee driver uses specific page table types to verify if a memory region is normal. These types are not defined in nommu systems. Trying to compile the driver in these systems results in a build error:
linux/drivers/tee/optee/call.c: In function ‘is_normal_memory’:
linux/drivers/tee/optee/call.c:533:26: error: ‘L_PTE_MT_MASK’ undeclared
(first use in this function); did you mean ‘PREEMPT_MASK’?
return (pgprot_val(p) & L_PTE_MT_MASK) == L_PTE_MT_WRITEALLOC;
^~~~~~~~~~~~~
PREEMPT_MASK
linux/drivers/tee/optee/call.c:533:26: note: each undeclared identifier is
reported only once for each function it appears in
linux/drivers/tee/optee/call.c:533:44: error: ‘L_PTE_MT_WRITEALLOC’ undeclared
(first use in this function)
return (pgprot_val(p) & L_PTE_MT_MASK) == L_PTE_MT_WRITEALLOC;
^~~~~~~~~~~~~~~~~~~Make the optee driver depend on MMU to fix the compilation issue.
--- drivers/tee/optee/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/tee/optee/Kconfig +1 -0
@@ -2,6 +2,7 @@ config OPTEE tristate "OP-TEE" depends on HAVE_ARM_SMCCC + depends on MMU help This implements the OP-TEE Trusted Execution Environment (TEE) driver.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 76/89 airo: Fix possible info leak in AIROOLDIOCTL/SIOCDEVPRIVATE
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit d6bce2137f5d6bb1093e96d2f801479099b28094 ]
The driver for Cisco Aironet 4500 and 4800 series cards (airo.c), implements AIROOLDIOCTL/SIOCDEVPRIVATE in airo_ioctl().
The ioctl handler copies an aironet_ioctl struct from userspace, which includes a command and a length. Some of the commands are handled in readrids(), which kmalloc()'s a buffer of RIDSIZE (2048) bytes.
That buffer is then passed to PC4500_readrid(), which has two cases. The else case does some setup and then reads up to RIDSIZE bytes from the hardware into the kmalloc()'ed buffer.
Here len == RIDSIZE, pBuf is the kmalloc()'ed buffer:
// read the rid length field bap_read(ai, pBuf, 2, BAP1); // length for remaining part of rid len = min(len, (int)le16_to_cpu(*(__le16*)pBuf)) - 2; ... // read remainder of the rid rc = bap_read(ai, ((__le16*)pBuf)+1, len, BAP1);
PC4500_readrid() then returns to readrids() which does:
len = comp->len;
if (copy_to_user(comp->data, iobuf, min(len, (int)RIDSIZE))) {Where comp->len is the user controlled length field.
So if the "rid length field" returned by the hardware is < 2048, and the user requests 2048 bytes in comp->len, we will leak the previous contents of the kmalloc()'ed buffer to userspace.
Fix it by kzalloc()'ing the buffer.
Found by Ilja by code inspection, not tested as I don't have the required hardware.
--- drivers/net/wireless/cisco/airo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/cisco/airo.c +1 -1
@@ -7811,7 +7811,7 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {return -EINVAL ; } -if ((iobuf =kmalloc (RIDSIZE ,GFP_KERNEL )) ==NULL ) +if ((iobuf =kzalloc (RIDSIZE ,GFP_KERNEL )) ==NULL )return -ENOMEM ;PC4500_readrid (ai,ridcode,iobuf,RIDSIZE ,1 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 77/89 airo: Add missing CAP_NET_ADMIN check in AIROOLDIOCTL/SIOCDEVPRIVATE
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit 78f7a7566f5eb59321e99b55a6fdb16ea05b37d1 ]
The driver for Cisco Aironet 4500 and 4800 series cards (airo.c), implements AIROOLDIOCTL/SIOCDEVPRIVATE in airo_ioctl().
The ioctl handler copies an aironet_ioctl struct from userspace, which includes a command. Some of the commands are handled in readrids(), where the user controlled command is converted into a driver-internal value called "ridcode".
There are two command values, AIROGWEPKTMP and AIROGWEPKNV, which correspond to ridcode values of RID_WEP_TEMP and RID_WEP_PERM respectively. These commands both have checks that the user has CAP_NET_ADMIN, with the comment that "Only super-user can read WEP keys", otherwise they return -EPERM.
However there is another command value, AIRORRID, that lets the user specify the ridcode value directly, with no other checks. This means the user can bypass the CAP_NET_ADMIN check on AIROGWEPKTMP and AIROGWEPKNV.
Fix it by moving the CAP_NET_ADMIN check out of the command handling and instead do it later based on the ridcode. That way regardless of whether the ridcode is set via AIROGWEPKTMP or AIROGWEPKNV, or passed in using AIRORID, we always do the CAP_NET_ADMIN check.
Found by Ilja by code inspection, not tested as I don't have the required hardware.
--- drivers/net/wireless/cisco/airo.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)
drivers/net/wireless/cisco/airo.c +8 -10
@@ -7788,16 +7788,8 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {case AIROGVLIST : ridcode =RID_APLIST ;break ;case AIROGDRVNAM : ridcode =RID_DRVNAME ;break ;case AIROGEHTENC : ridcode =RID_ETHERENCAP ;break ; -case AIROGWEPKTMP : ridcode =RID_WEP_TEMP ; -/* Only super-user can read WEP keys */ -if (!capable (CAP_NET_ADMIN )) -return -EPERM ; -break ; -case AIROGWEPKNV : ridcode =RID_WEP_PERM ; -/* Only super-user can read WEP keys */ -if (!capable (CAP_NET_ADMIN )) -return -EPERM ; -break ; +case AIROGWEPKTMP : ridcode =RID_WEP_TEMP ;break ; +case AIROGWEPKNV : ridcode =RID_WEP_PERM ;break ;case AIROGSTAT : ridcode =RID_STATUS ;break ;case AIROGSTATSD32 : ridcode =RID_STATSDELTA ;break ;case AIROGSTATSC32 : ridcode =RID_STATS ;break ;
@@ -7811,6 +7803,12 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {return -EINVAL ; } +if (ridcode ==RID_WEP_TEMP || ridcode ==RID_WEP_PERM ) { +/* Only super-user can read WEP keys */ +if (!capable (CAP_NET_ADMIN )) +return -EPERM ; + } +if ((iobuf =kzalloc (RIDSIZE ,GFP_KERNEL )) ==NULL )return -ENOMEM ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 78/89 r8152: get default setting of WOL before initializing
In reply to Greg Kroah-HartmanFrom: Hayes Wang <[email protected]>
[ Upstream commit 9583a3638dc07cc1878f41265e85ed497f72efcb ]
Initailization would reset runtime suspend by tp->saved_wolopts, so the tp->saved_wolopts should be set before initializing.
--- drivers/net/usb/r8152.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/net/usb/r8152.c +5 -4
@@ -5244,6 +5244,11 @@ static int rtl8152_probe(struct usb_interface *intf, intf->needs_remote_wakeup =1 ; +if (!rtl_can_wakeup (tp)) +__rtl_set_wol (tp,0 ); +else + tp->saved_wolopts =__rtl_get_wol (tp); + tp->rtl_ops.init (tp);queue_delayed_work (system_long_wq, &tp->hw_phy_work,0 );set_ethernet_addr (tp);
@@ -5257,10 +5262,6 @@ static int rtl8152_probe(struct usb_interface *intf, goto out1; } -if (!rtl_can_wakeup (tp)) -__rtl_set_wol (tp,0 ); - - tp->saved_wolopts =__rtl_get_wol (tp);if (tp->saved_wolopts)device_set_wakeup_enable (&udev->dev, true);else
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 79/89 qlcnic: Fix CPU soft lockup while collecting firmware dump
In reply to Greg Kroah-HartmanFrom: Manish Chopra <[email protected]>
[ Upstream commit 22e984493a41bf8081f13d9ed84def3ca8cfd427 ]
Driver while collecting firmware dump takes longer time to collect/process some of the firmware dump entries/memories. Bigger capture masks makes it worse as it results in larger amount of data being collected and results in CPU soft lockup. Place cond_resched() in some of the driver flows that are expectedly time consuming to relinquish the CPU to avoid CPU soft lockup panic.
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 1 + drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | 2 ++ 2 files changed, 3 insertions(+)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +1 -0
@@ -2043,6 +2043,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev,break ; } entry += p_hdr->size; +cond_resched (); } p_dev->ahw->reset.seq_index = index; }
drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +2 -0
@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, addr +=16 ; reg_read -=16 ; ret +=16 ; +cond_resched (); } out:mutex_unlock (&adapter->ahw->mem_lock);
@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) buf_offset += entry->hdr.cap_size; entry_offset += entry->hdr.offset; buffer = fw_dump->data + buf_offset; +cond_resched (); } fw_dump->clr =1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 80/89 powerpc/fsl/dts: add fsl,erratum-a011043
In reply to Greg Kroah-HartmanFrom: Madalin Bucur <[email protected]>
[ Upstream commit 73d527aef68f7644e59f22ce7f9ac75e7b533aea ]
Add fsl,erratum-a011043 to internal MDIO buses. Software may get false read error when reading internal PCS registers through MDIO. As a workaround, all internal MDIO accesses should ignore the MDIO_CFG[MDIO_RD_ER] bit.
--- arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi | 1 + arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi | 1 + 18 files changed, 18 insertions(+)
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi +1 -0
@@ -63,6 +63,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy0: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi +1 -0
@@ -60,6 +60,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy6: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi +1 -0
@@ -63,6 +63,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy1: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi +1 -0
@@ -60,6 +60,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy7: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy0: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy1: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe5000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy2: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe7000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy3: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe9000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy4: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@400000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xeb000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy5: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi +1 -0
@@ -60,6 +60,7 @@ fman@500000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy14: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi +1 -0
@@ -60,6 +60,7 @@ fman@500000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy15: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@500000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy8: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@500000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy9: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@500000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe5000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy10: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@500000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe7000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy11: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@500000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe9000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy12: ethernet-phy@0 { reg = <0x0>;
arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi +1 -0
@@ -59,6 +59,7 @@ fman@500000 { #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xeb000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy13: ethernet-phy@0 { reg = <0x0>;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 81/89 net/fsl: treat fsl,erratum-a011043
In reply to Greg Kroah-HartmanFrom: Madalin Bucur <[email protected]>
[ Upstream commit 1d3ca681b9d9575ccf696ebc2840a1ebb1fd4074 ]
When fsl,erratum-a011043 is set, adjust for erratum A011043:
MDIO reads to internal PCS registers may result in having the MDIO_CFG[MDIO_RD_ER] bit set, even when there is no error and read data (MDIO_DATA[MDIO_DATA]) is correct. Software may get false read error when reading internal PCS registers through MDIO. As a workaround, all internal MDIO accesses should ignore the MDIO_CFG[MDIO_RD_ER] bit.
--- drivers/net/ethernet/freescale/xgmac_mdio.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/ethernet/freescale/xgmac_mdio.c +6 -1
@@ -49,6 +49,7 @@ struct tgec_mdio_controller {struct mdio_fsl_priv {struct tgec_mdio_controller __iomem *mdio_base;bool is_little_endian; +bool has_a011043; }; static u32 xgmac_read32(void __iomem *regs,
@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum)return ret;/* Return all Fs if nothing was there */ -if (xgmac_read32 (®s->mdio_stat, endian) &MDIO_STAT_RD_ER ) { +if ((xgmac_read32 (®s->mdio_stat, endian) &MDIO_STAT_RD_ER ) && + !priv->has_a011043) {dev_err (&bus->dev,"Error while reading PHY%d reg at %d.%hhu\n" , phy_id, dev_addr, regnum);
@@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) priv->is_little_endian =of_property_read_bool (pdev->dev.of_node,"little-endian" ); + priv->has_a011043 =of_property_read_bool (pdev->dev.of_node, +"fsl,erratum-a011043" ); + ret =of_mdiobus_register (bus, np);if (ret) {dev_err (&pdev->dev,"cannot register MDIO bus\n" );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 82/89 net: fsl/fman: rename IF_MODE_XGMII to IF_MODE_10G
In reply to Greg Kroah-HartmanFrom: Madalin Bucur <[email protected]>
[ Upstream commit 457bfc0a4bf531487ecc3cf82ec728a5e114fb1e ]
As the only 10G PHY interface type defined at the moment the code was developed was XGMII, although the PHY interface mode used was not XGMII, XGMII was used in the code to denote 10G. This patch renames the 10G interface mode to remove the ambiguity.
--- drivers/net/ethernet/freescale/fman/fman_memac.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/freescale/fman/fman_memac.c +2 -2
@@ -110,7 +110,7 @@ do { \/* Interface Mode Register (IF_MODE) */ #define IF_MODE_MASK 0x00000003/* 30-31 Mask on i/f mode bits */ -#define IF_MODE_XGMII 0x00000000/* 30-31 XGMII (10G) interface */ +#define IF_MODE_10G 0x00000000/* 30-31 10G interface */ #define IF_MODE_GMII 0x00000002/* 30-31 GMII (1G) interface */ #define IF_MODE_RGMII 0x00000004#define IF_MODE_RGMII_AUTO 0x00008000
@@ -439,7 +439,7 @@ static int init(struct memac_regs __iomem *regs, struct memac_cfg *cfg, tmp =0 ;switch (phy_if) {case PHY_INTERFACE_MODE_XGMII : - tmp |=IF_MODE_XGMII ; + tmp |=IF_MODE_10G ;break ;default : tmp |=IF_MODE_GMII ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 83/89 net/sonic: Add mutual exclusion for accessing shared state
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit 865ad2f2201dc18685ba2686f13217f8b3a9c52c ]
The netif_stop_queue() call in sonic_send_packet() races with the netif_wake_queue() call in sonic_interrupt(). This causes issues like "NETDEV WATCHDOG: eth0 (macsonic): transmit queue 0 timed out". Fix this by disabling interrupts when accessing tx_skb[] and next_tx. Update a comment to clarify the synchronization properties.
--- drivers/net/ethernet/natsemi/sonic.c | 49 ++++++++++++++++++++-------- drivers/net/ethernet/natsemi/sonic.h | 1 + 2 files changed, 36 insertions(+), 14 deletions(-)
drivers/net/ethernet/natsemi/sonic.c +35 -14
@@ -50,6 +50,8 @@ static int sonic_open(struct net_device *dev)if (sonic_debug >2 )printk ("sonic_open: initializing sonic driver.\n" ); +spin_lock_init (&lp->lock); +for (i =0 ; i <SONIC_NUM_RRS ; i++) {struct sk_buff *skb =netdev_alloc_skb (dev,SONIC_RBSIZE +2 );if (skb ==NULL ) {
@@ -194,8 +196,6 @@ static void sonic_tx_timeout(struct net_device *dev)* wake the tx queue * Concurrently with all of this, the SONIC is potentially writing to * the status flags of the TDs. -* Until some mutual exclusion is added, this code will not work with SMP. However, -* MIPS Jazz machines and m68k Macs were all uni-processor machines. */ static int sonic_send_packet (struct sk_buff *skb,struct net_device *dev)
@@ -203,7 +203,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)struct sonic_local *lp =netdev_priv (dev);dma_addr_t laddr;int length; -int entry = lp->next_tx; +int entry; +unsigned long flags;if (sonic_debug >2 )printk ("sonic_send_packet: skb=%p, dev=%p\n" , skb, dev);
@@ -226,6 +227,10 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)return NETDEV_TX_OK ; } +spin_lock_irqsave (&lp->lock, flags); + + entry = lp->next_tx; +sonic_tda_put (dev, entry,SONIC_TD_STATUS ,0 );/* clear status */ sonic_tda_put (dev, entry,SONIC_TD_FRAG_COUNT ,1 );/* single fragment */ sonic_tda_put (dev, entry,SONIC_TD_PKTSIZE , length);/* length of packet */
@@ -235,10 +240,6 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)sonic_tda_put (dev, entry,SONIC_TD_LINK ,sonic_tda_get (dev, entry,SONIC_TD_LINK ) |SONIC_EOL ); -/* -* Must set tx_skb[entry] only after clearing status, and -* before clearing EOL and before stopping queue -*/ wmb (); lp->tx_len[entry] = length; lp->tx_laddr[entry] = laddr;
@@ -263,6 +264,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)SONIC_WRITE (SONIC_CMD ,SONIC_CR_TXP ); +spin_unlock_irqrestore (&lp->lock, flags); +return NETDEV_TX_OK ; }
@@ -275,9 +278,21 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)struct net_device *dev = dev_id;struct sonic_local *lp =netdev_priv (dev);int status; +unsigned long flags; + +/* The lock has two purposes. Firstly, it synchronizes sonic_interrupt() +* with sonic_send_packet() so that the two functions can share state. +* Secondly, it makes sonic_interrupt() re-entrant, as that is required +* by macsonic which must use two IRQs with different priority levels. +*/ +spin_lock_irqsave (&lp->lock, flags); + + status =SONIC_READ (SONIC_ISR ) &SONIC_IMR_DEFAULT ; +if (!status) { +spin_unlock_irqrestore (&lp->lock, flags); -if (!(status =SONIC_READ (SONIC_ISR ) &SONIC_IMR_DEFAULT ))return IRQ_NONE ; + } do { if (status & SONIC_INT_PKTRX) {
@@ -292,11 +307,12 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)int td_status;int freed_some =0 ; -/* At this point, cur_tx is the index of a TD that is one of: -* unallocated/freed (status set & tx_skb[entry] clear) -* allocated and sent (status set & tx_skb[entry] set ) -* allocated and not yet sent (status clear & tx_skb[entry] set ) -* still being allocated by sonic_send_packet (status clear & tx_skb[entry] clear) +/* The state of a Transmit Descriptor may be inferred +* from { tx_skb[entry], td_status } as follows. +* { clear, clear } => the TD has never been used +* { set, clear } => the TD was handed to SONIC +* { set, set } => the TD was handed back +* { clear, set } => the TD is available for re-use */ if (sonic_debug >2 )
@@ -398,7 +414,12 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)/* load CAM done */ if (status &SONIC_INT_LCD )SONIC_WRITE (SONIC_ISR ,SONIC_INT_LCD );/* clear the interrupt */ - }while ((status =SONIC_READ (SONIC_ISR ) &SONIC_IMR_DEFAULT )); + + status =SONIC_READ (SONIC_ISR ) &SONIC_IMR_DEFAULT ; + }while (status); + +spin_unlock_irqrestore (&lp->lock, flags); +return IRQ_HANDLED ; }
drivers/net/ethernet/natsemi/sonic.h +1 -0
@@ -321,6 +321,7 @@ struct sonic_local {unsigned int next_tx;/* next free TD */ struct device *device;/* generic device */ struct net_device_stats stats; +spinlock_t lock; };#define TX_TIMEOUT (3 * HZ)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 84/89 net/sonic: Use MMIO accessors
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit e3885f576196ddfc670b3d53e745de96ffcb49ab ]
The driver accesses descriptor memory which is simultaneously accessed by the chip, so the compiler must not be allowed to re-order CPU accesses. sonic_buf_get() used 'volatile' to prevent that. sonic_buf_put() should have done so too but was overlooked.
--- drivers/net/ethernet/natsemi/sonic.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/net/ethernet/natsemi/sonic.h +8 -8
@@ -343,30 +343,30 @@ static void sonic_tx_timeout(struct net_device *dev);as far as we can tell. */ /* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put() is a much better name. */ -static inline void sonic_buf_put (void * base,int bitmode, +static inline void sonic_buf_put (u16 *base,int bitmode,int offset,__u16 val) { if (bitmode)#ifdef __BIG_ENDIAN - ((__u16 *) base + (offset*2 ))[1 ] = val; +__raw_writew (val, base + (offset *2 ) +1 );#else - ((__u16 *) base + (offset*2 ))[0 ] = val; +__raw_writew (val, base + (offset *2 ) +0 );#endif else - ((__u16 *) base)[offset] = val; + __raw_writew(val, base + (offset * 1) + 0); } -static inline __u16 sonic_buf_get (void * base,int bitmode, +static inline __u16 sonic_buf_get (u16 *base,int bitmode,int offset) { if (bitmode)#ifdef __BIG_ENDIAN -return ((volatile __u16 *) base + (offset*2 ))[1 ]; +return __raw_readw (base + (offset *2 ) +1 );#else -return ((volatile __u16 *) base + (offset*2 ))[0 ]; +return __raw_readw (base + (offset *2 ) +0 );#endif else - return ((volatile __u16 *) base)[offset]; + return __raw_readw(base + (offset * 1) + 0); }/* Inlines that you should actually use for reading/writing DMA buffers */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 85/89 net/sonic: Fix receive buffer handling
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit 9e311820f67e740f4fb8dcb82b4c4b5b05bdd1a5 ]
The SONIC can sometimes advance its rx buffer pointer (RRP register) without advancing its rx descriptor pointer (CRDA register). As a result the index of the current rx descriptor may not equal that of the current rx buffer. The driver mistakenly assumes that they are always equal. This assumption leads to incorrect packet lengths and possible packet duplication. Avoid this by calling a new function to locate the buffer corresponding to a given descriptor.
--- drivers/net/ethernet/natsemi/sonic.c | 35 ++++++++++++++++++++++++---- drivers/net/ethernet/natsemi/sonic.h | 5 ++-- 2 files changed, 33 insertions(+), 7 deletions(-)
drivers/net/ethernet/natsemi/sonic.c +30 -5
@@ -423,6 +423,21 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)return IRQ_HANDLED ; } +/* Return the array index corresponding to a given Receive Buffer pointer. */ +static int index_from_addr (struct sonic_local *lp,dma_addr_t addr, +unsigned int last) +{ +unsigned int i = last; + +do { + i = (i +1 ) &SONIC_RRS_MASK ; +if (addr == lp->rx_laddr[i]) +return i; + }while (i != last); + +return -ENOENT ; +} +/* * We have a good packet(s), pass it/them up the network stack. */
@@ -442,6 +457,16 @@ static void sonic_rx(struct net_device *dev) status =sonic_rda_get (dev, entry,SONIC_RD_STATUS );if (status &SONIC_RCR_PRX ) { +u32 addr = (sonic_rda_get (dev, entry, +SONIC_RD_PKTPTR_H ) <<16 ) | +sonic_rda_get (dev, entry,SONIC_RD_PKTPTR_L ); +int i =index_from_addr (lp, addr, entry); + +if (i <0 ) { +WARN_ONCE (1 ,"failed to find buffer!\n" ); +break ; + } +/* Malloc up new buffer. */ new_skb =netdev_alloc_skb (dev,SONIC_RBSIZE +2 );if (new_skb ==NULL ) {
@@ -463,7 +488,7 @@ static void sonic_rx(struct net_device *dev)/* now we have a new skb to replace it, pass the used one up the stack */ dma_unmap_single (lp->device, lp->rx_laddr[entry],SONIC_RBSIZE ,DMA_FROM_DEVICE ); - used_skb = lp->rx_skb[entry]; + used_skb = lp->rx_skb[i]; pkt_len =sonic_rda_get (dev, entry,SONIC_RD_PKTLEN );skb_trim (used_skb, pkt_len); used_skb->protocol =eth_type_trans (used_skb, dev);
@@ -472,13 +497,13 @@ static void sonic_rx(struct net_device *dev) lp->stats.rx_bytes += pkt_len;/* and insert the new skb */ - lp->rx_laddr[entry] = new_laddr; - lp->rx_skb[entry] = new_skb; + lp->rx_laddr[i] = new_laddr; + lp->rx_skb[i] = new_skb; bufadr_l = (unsigned long )new_laddr &0xffff ; bufadr_h = (unsigned long )new_laddr >>16 ; -sonic_rra_put (dev, entry,SONIC_RR_BUFADR_L , bufadr_l); -sonic_rra_put (dev, entry,SONIC_RR_BUFADR_H , bufadr_h); +sonic_rra_put (dev, i,SONIC_RR_BUFADR_L , bufadr_l); +sonic_rra_put (dev, i,SONIC_RR_BUFADR_H , bufadr_h); }else {/* This should only happen, if we enable accepting broken packets. */ lp->stats.rx_errors++;
drivers/net/ethernet/natsemi/sonic.h +3 -2
@@ -274,8 +274,9 @@#define SONIC_NUM_RDS SONIC_NUM_RRS/* number of receive descriptors */ #define SONIC_NUM_TDS 16/* number of transmit descriptors */ -#define SONIC_RDS_MASK (SONIC_NUM_RDS-1) -#define SONIC_TDS_MASK (SONIC_NUM_TDS-1) +#define SONIC_RRS_MASK (SONIC_NUM_RRS - 1) +#define SONIC_RDS_MASK (SONIC_NUM_RDS - 1) +#define SONIC_TDS_MASK (SONIC_NUM_TDS - 1)#define SONIC_RBSIZE 1520/* size of one resource buffer */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 86/89 net/sonic: Quiesce SONIC before re-initializing descriptor memory
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit 3f4b7e6a2be982fd8820a2b54d46dd9c351db899 ]
Make sure the SONIC's DMA engine is idle before altering the transmit and receive descriptors. Add a helper for this as it will be needed again.
--- drivers/net/ethernet/natsemi/sonic.c | 25 +++++++++++++++++++++++++ drivers/net/ethernet/natsemi/sonic.h | 3 +++ 2 files changed, 28 insertions(+)
drivers/net/ethernet/natsemi/sonic.c +25 -0
@@ -103,6 +103,24 @@ static int sonic_open(struct net_device *dev)return 0 ; } +/* Wait for the SONIC to become idle. */ +static void sonic_quiesce (struct net_device *dev,u16 mask) +{ +struct sonic_local *__maybe_unused lp =netdev_priv (dev); +int i; +u16 bits; + +for (i =0 ; i <1000 ; ++i) { + bits =SONIC_READ (SONIC_CMD ) & mask; +if (!bits) +return ; +if (irqs_disabled () ||in_interrupt ()) +udelay (20 ); +else +usleep_range (100 ,200 ); + } +WARN_ONCE (1 ,"command deadline expired! 0x%04x\n" , bits); +}/* * Close the SONIC device
@@ -120,6 +138,9 @@ static int sonic_close(struct net_device *dev)/* * stop the SONIC, disable interrupts */ +SONIC_WRITE (SONIC_CMD ,SONIC_CR_RXDIS ); +sonic_quiesce (dev,SONIC_CR_ALL ); +SONIC_WRITE (SONIC_IMR ,0 );SONIC_WRITE (SONIC_ISR ,0x7fff );SONIC_WRITE (SONIC_CMD ,SONIC_CR_RST );
@@ -159,6 +180,9 @@ static void sonic_tx_timeout(struct net_device *dev)* put the Sonic into software-reset mode and * disable all interrupts before releasing DMA buffers */ +SONIC_WRITE (SONIC_CMD ,SONIC_CR_RXDIS ); +sonic_quiesce (dev,SONIC_CR_ALL ); +SONIC_WRITE (SONIC_IMR ,0 );SONIC_WRITE (SONIC_ISR ,0x7fff );SONIC_WRITE (SONIC_CMD ,SONIC_CR_RST );
@@ -638,6 +662,7 @@ static int sonic_init(struct net_device *dev)*/ SONIC_WRITE (SONIC_CMD ,0 );SONIC_WRITE (SONIC_CMD ,SONIC_CR_RXDIS ); +sonic_quiesce (dev,SONIC_CR_ALL );/* * initialize the receive resource area
drivers/net/ethernet/natsemi/sonic.h +3 -0
@@ -110,6 +110,9 @@#define SONIC_CR_TXP 0x0002#define SONIC_CR_HTX 0x0001 +#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \ + SONIC_CR_RXEN | SONIC_CR_TXP) +/* * SONIC data configuration bits */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 87/89 seq_tab_next() should increase position index
In reply to Greg Kroah-HartmanFrom: Vasily Averin <[email protected]>
[ Upstream commit 70a87287c821e9721b62463777f55ba588ac4623 ]
if seq_file .next fuction does not change position index, read after some lseek can generate unexpected output.
https://bugzilla.kernel.org/show_bug.cgi?id=206283
--- drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +1 -2
@@ -66,8 +66,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos)static void *seq_tab_next (struct seq_file *seq,void *v,loff_t *pos) { v =seq_tab_get_idx (seq->private, *pos +1 ); -if (v) - ++*pos; + ++(*pos);return v; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 88/89 l2t_seq_next should increase position index
In reply to Greg Kroah-HartmanFrom: Vasily Averin <[email protected]>
[ Upstream commit 66018a102f7756cf72db4d2704e1b93969d9d332 ]
if seq_file .next fuction does not change position index, read after some lseek can generate unexpected output.
https://bugzilla.kernel.org/show_bug.cgi?id=206283
--- drivers/net/ethernet/chelsio/cxgb4/l2t.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/l2t.c +1 -2
@@ -682,8 +682,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos)static void *l2t_seq_next (struct seq_file *seq,void *v,loff_t *pos) { v =l2t_get_idx (seq, *pos); -if (v) - ++*pos; + ++(*pos);return v; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 89/89 net: Fix skb->csum update in inet_proto_csum_replace16().
In reply to Greg Kroah-HartmanFrom: Praveen Chaudhary <[email protected]>
[ Upstream commit 189c9b1e94539b11c80636bc13e9cf47529e7bba ]
skb->csum is updated incorrectly, when manipulation for NF_NAT_MANIP_SRC\DST is done on IPV6 packet.
Fix:
There is no need to update skb->csum in inet_proto_csum_replace16(), because update in two fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to update skb->csum, because update in 3 fields a.) IPv4 src/dst address, b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as L4 Header checksum for skb->csum calculation.
--- net/core/utils.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
net/core/utils.c +17 -3
@@ -419,6 +419,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, }EXPORT_SYMBOL (inet_proto_csum_replace4); +/** +* inet_proto_csum_replace16 - update layer 4 header checksum field +* @sum: Layer 4 header checksum field +* @skb: sk_buff for the packet +* @from: old IPv6 address +* @to: new IPv6 address +* @pseudohdr: True if layer 4 header checksum includes pseudoheader +* +* Update layer 4 header as per the update in IPv6 src/dst address. +* +* There is no need to update skb->csum in this function, because update in two +* fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other +* for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to +* update skb->csum, because update in 3 fields a.) IPv4 src/dst address, +* b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as +* L4 Header checksum for skb->csum calculation. +*/ void inet_proto_csum_replace16 (__sum16 *sum,struct sk_buff *skb,const __be32 *from,const __be32 *to,bool pseudohdr)
@@ -430,9 +447,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,if (skb->ip_summed !=CHECKSUM_PARTIAL ) { *sum =csum_fold (csum_partial (diff,sizeof (diff), ~csum_unfold (*sum))); -if (skb->ip_summed ==CHECKSUM_COMPLETE && pseudohdr) - skb->csum = ~csum_partial (diff,sizeof (diff), - ~skb->csum); }else if (pseudohdr) *sum = ~csum_fold (csum_partial (diff,sizeof (diff),csum_unfold (*sum)));
Signature · 1 line
2.20.1
Jon Hunter
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.170 release. There are 89 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, 05 Feb 2020 16:17:59 +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/v4.x/stable-review/patch-4.14.170-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.14.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v4.14:
8 builds: 8 pass, 0 fail
16 boots: 16 pass, 0 fail
24 tests: 24 pass, 0 failLinux version: 4.14.170-rc1-g2be5c4bdc0df
Boards tested: tegra124-jetson-tk1, tegra20-ventana,
tegra210-p2371-2180, tegra30-cardhu-a04
Cheers
Jon
Signature · 1 line
nvpublic
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.170 release. There are 89 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, 05 Feb 2020 16:17:59 +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/v4.x/stable-review/patch-4.14.170-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.14.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: 4.14.170-rc2
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.14.y
git commit: b4137330c582d6b6dac367230affdf2c484637c4
git describe: v4.14.169-92-gb4137330c582
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.14-oe/build/v4.14.169-92-gb4137330c582
No regressions (compared to build v4.14.169)
No fixes (compared to build v4.14.169)
Ran 13571 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c - arm64
- hi6220-hikey - arm64
- i386
- juno-r2 - arm64
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15 - arm
- x86_64
Test Suites
-----------
* build
* install-android-platform-tools-r2600
* kselftest
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-cpuhotplug-tests
* ltp-cve-tests
* 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-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* network-basic-tests
* perf
* spectre-meltdown-checker-test
* v4l2-compliance
* kvm-unit-tests
* ltp-open-posix-tests
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.170 release. There are 89 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, 05 Feb 2020 16:17:59 +0000. Anything received after that time might be too late.
Build results:
total: 172 pass: 172 fail: 0 Qemu test results: total: 376 pass: 376 fail: 0
Guenter