4.14.154-stable review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 4.14.154-stable review
This is the start of the stable review cycle for the 4.14.154 release. There are 105 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, 13 Nov 2019 18:08:44 +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.154-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.154-rc1
Tejun Heo <[email protected]>
cgroup,writeback: don't switch wbs immediately on dead wbs if the memcg is dead
Konstantin Khlebnikov <[email protected]>
mm/filemap.c: don't initiate writeback if mapping has no dirty pages
Joakim Zhang <[email protected]>
can: flexcan: disable completely the ECC mechanism
Jan Beulich <[email protected]>
x86/apic/32: Avoid bogus LDR warnings
Dou Liyang <[email protected]>
x86/apic: Drop logical_smp_processor_id() inline
Dou Liyang <[email protected]>
x86/apic: Move pending interrupt check code into it's own function
Wenwen Wang <[email protected]>
e1000: fix memory leaks
Manfred Rudigier <[email protected]>
igb: Fix constant media auto sense switching when no cable is connected
Chuhong Yuan <[email protected]>
net: ethernet: arc: add the missed clk_disable_unprepare
Trond Myklebust <[email protected]>
NFSv4: Don't allow a cached open with a revoked delegation
Haiyang Zhang <[email protected]>
hv_netvsc: Fix error handling in netvsc_attach()
Jiangfeng Xiao <[email protected]>
net: hisilicon: Fix "Trying to free already-free IRQ"
Will Deacon <[email protected]>
fjes: Handle workqueue allocation failure
Nicholas Piggin <[email protected]>
scsi: qla2xxx: stop timer in shutdown path
Potnuri Bharat Teja <[email protected]>
RDMA/iw_cxgb4: Avoid freeing skb twice in arp failure case
Johan Hovold <[email protected]>
USB: ldusb: use unsigned size format specifiers
Alan Stern <[email protected]>
USB: Skip endpoints with 0 maxpacket length
Kim Phillips <[email protected]>
perf/x86/amd/ibs: Handle erratum #420 only on the affected CPU family (10h)
Kim Phillips <[email protected]>
perf/x86/amd/ibs: Fix reading of the IBS OpData register and thus precise RIP validity
Yinbo Zhu <[email protected]>
usb: dwc3: remove the call trace of USBx_GFLADJ
Peter Chen <[email protected]>
usb: gadget: configfs: fix concurrent issue between composite APIs
Chandana Kishori Chiluveru <[email protected]>
usb: gadget: composite: Fix possible double free memory bug
Cristian Birsan <[email protected]>
usb: gadget: udc: atmel: Fix interrupt storm in FIFO mode.
Nikhil Badola <[email protected]>
usb: fsl: Check memory resource before releasing it
Taehee Yoo <[email protected]>
macsec: fix refcnt leak in module exit routine
Taehee Yoo <[email protected]>
bonding: fix unexpected IFF_BONDING bit unset
Eric Dumazet <[email protected]>
ipvs: move old_secure_tcp into struct netns_ipvs
Davide Caratti <[email protected]>
ipvs: don't ignore errors in case refcounting ip_vs module fails
Himanshu Madhani <[email protected]>
scsi: qla2xxx: Initialized mailbox to prevent driver load failure
Daniel Wagner <[email protected]>
scsi: lpfc: Honor module parameter lpfc_use_adisc
Hillf Danton <[email protected]>
net: openvswitch: free vport unless register_netdevice() succeeds
Dan Carpenter <[email protected]>
RDMA/uverbs: Prevent potential underflow
Hannes Reinecke <[email protected]>
scsi: qla2xxx: fixup incorrect usage of host_byte
Navid Emamdoost <[email protected]>
net/mlx5: prevent memory leak in mlx5_fpga_conn_create_cq
Kamal Heib <[email protected]>
RDMA/qedr: Fix reported firmware version
Zhang Lixu <[email protected]>
HID: intel-ish-hid: fix wrong error handling in ishtp_cl_alloc_tx_ring()
Radhey Shyam Pandey <[email protected]>
dmaengine: xilinx_dma: Fix control reg update in vdma_channel_set_config
Vidya Sagar <[email protected]>
PCI: tegra: Enable Relaxed Ordering only for Tegra20 & Tegra30
Suwan Kim <[email protected]>
usbip: Implement SG support to vhci-hcd and stub driver
Shuah Khan <[email protected]>
usbip: stub_rx: fix static checker warning on unnecessary checks
Shuah Khan <[email protected]>
usbip: Fix vhci_urb_enqueue() URB null transfer buffer error path
Bart Van Assche <[email protected]>
lib/scatterlist: Introduce sgl_alloc() and sgl_free()
Qian Cai <[email protected]>
sched/fair: Fix -Wunused-but-set-variable warnings
Dave Chiluk <[email protected]>
sched/fair: Fix low cpu usage with high throttling by removing expiration of cpu-local slices
Roger Quadros <[email protected]>
ARM: dts: dra7: Disable USB metastability workaround for USB2
Zumeng Chen <[email protected]>
cpufreq: ti-cpufreq: add missing of_node_put()
Claudio Foellmi <[email protected]>
i2c: omap: Trigger bus recovery in lockup case
Christophe Jaillet <[email protected]>
ASoC: davinci-mcasp: Fix an error handling path in 'davinci_mcasp_probe()'
Takashi Iwai <[email protected]>
ASoC: davinci: Kill BUG_ON() usage
Arvind Yadav <[email protected]>
ASoC: davinci-mcasp: Handle return value of devm_kasprintf
Gustavo A. R. Silva <[email protected]>
ASoC: tlv320dac31xx: mark expected switch fall-through
Sudeep Holla <[email protected]>
mailbox: reset txdone_method TXDONE_BY_POLL if client knows_txdone
Kishon Vijay Abraham I <[email protected]>
misc: pci_endpoint_test: Fix BUG_ON error during pci_disable_msi()
Keerthy <[email protected]>
PCI: dra7xx: Add shutdown handler to cleanly turn off clocks
Dan Carpenter <[email protected]>
misc: pci_endpoint_test: Prevent some integer overflows
Vignesh R <[email protected]>
mtd: spi-nor: cadence-quadspi: add a delay in write sequence
Roman Yeryomin <[email protected]>
mtd: spi-nor: enable 4B opcodes for mx66l51235l
Andrew F. Davis <[email protected]>
ASoC: tlv320aic31xx: Handle inverted BCLK in non-DSP modes
Keerthy <[email protected]>
mfd: palmas: Assign the right powerhold mask for tps65917
Roger Quadros <[email protected]>
usb: dwc3: Allow disabling of metastability workaround
Al Viro <[email protected]>
configfs: fix a deadlock in configfs_symlink()
Al Viro <[email protected]>
configfs: provide exclusion between IO and removals
Al Viro <[email protected]>
configfs: new object reprsenting tree fragments
Al Viro <[email protected]>
configfs_register_group() shouldn't be (and isn't) called in rmdirable parts
Al Viro <[email protected]>
configfs: stash the data we need into configfs_buffer at open time
Thomas Meyer <[email protected]>
configfs: Fix bool initialization/comparison
Johan Hovold <[email protected]>
can: peak_usb: fix slab info leak
Johan Hovold <[email protected]>
can: mcba_usb: fix use-after-free on disconnect
Navid Emamdoost <[email protected]>
can: gs_usb: gs_can_open(): prevent memory leak
Marc Kleine-Budde <[email protected]>
can: rx-offload: can_rx_offload_queue_sorted(): fix error handling, avoid skb mem leak
Stephane Grosjean <[email protected]>
can: peak_usb: fix a potential out-of-sync while decoding packets
Kurt Van Dijck <[email protected]>
can: c_can: c_can_poll(): only read status register after status IRQ
Johan Hovold <[email protected]>
can: usb_8dev: fix use-after-free on disconnect
Alexander Shishkin <[email protected]>
intel_th: pci: Add Jasper Lake PCH support
Alexander Shishkin <[email protected]>
intel_th: pci: Add Comet Lake PCH support
Dan Carpenter <[email protected]>
netfilter: ipset: Fix an error code in ip_set_sockfn_get()
Lukas Wunner <[email protected]>
netfilter: nf_tables: Align nft_expr private data to 64-bit
Andreas Klinger <[email protected]>
iio: srf04: fix wrong limitation in distance measuring
Alexandru Ardelean <[email protected]>
iio: imu: adis16480: make sure provided frequency is positive
Fabrice Gasnier <[email protected]>
iio: adc: stm32-adc: fix stopping dma
Al Viro <[email protected]>
ceph: add missing check in d_revalidate snapdir handling
Luis Henriques <[email protected]>
ceph: fix use-after-free in __ceph_remove_cap()
Catalin Marinas <[email protected]>
arm64: Do not mask out PTE_RDONLY in pte_same()
Jason Gerecke <[email protected]>
HID: wacom: generic: Treat serial number and related fields as unsigned
Alex Deucher <[email protected]>
drm/radeon: fix si_enable_smc_cac() failed issue
Jiri Olsa <[email protected]>
perf tools: Fix time sorting
Shuah Khan <[email protected]>
tools: gpio: Use !building_out_of_srctree to determine srctree
Kevin Hao <[email protected]>
dump_stack: avoid the livelock of the dump_lock
Michal Hocko <[email protected]>
mm, vmstat: hide /proc/pagetypeinfo from normal users
Yang Shi <[email protected]>
mm: thp: handle page cache THP correctly in PageTransCompoundMap
Mel Gorman <[email protected]>
mm, meminit: recalculate pcpu batch and high limits after init completes
Takashi Iwai <[email protected]>
ALSA: hda/ca0132 - Fix possible workqueue stall
Takashi Sakamoto <[email protected]>
ALSA: bebob: fix to detect configured source of sampling clock for Focusrite Saffire Pro i/o series
Takashi Iwai <[email protected]>
ALSA: timer: Fix incorrectly assigned timer instance
Manish Chopra <[email protected]>
qede: fix NULL pointer deref in __qede_remove()
Pan Bian <[email protected]>
NFC: st21nfca: fix double free
Pan Bian <[email protected]>
nfc: netlink: fix double device reference drop
Pan Bian <[email protected]>
NFC: fdp: fix incorrect free object
Aleksander Morgado <[email protected]>
net: usb: qmi_wwan: add support for DW5821e with eSIM support
Sean Tranchetti <[email protected]>
net: qualcomm: rmnet: Fix potential UAF when unregistering
Eric Dumazet <[email protected]>
net: fix data-race in neigh_event_send()
Alexander Sverdlin <[email protected]>
net: ethernet: octeon_mgmt: Account for second possible VLAN header
David Ahern <[email protected]>
ipv4: Fix table id reference in fib_sync_down_addr
Oliver Neukum <[email protected]>
CDC-NCM: handle incomplete transfer of MTU
Jay Vosburgh <[email protected]>
bonding: fix state transition issue in link monitoring
-------------
Diffstat:
Documentation/devicetree/bindings/usb/dwc3.txt | 2 + Documentation/scheduler/sched-bwc.txt | 45 ++++ Makefile | 4 +- arch/arm/boot/dts/dra7.dtsi | 1 + arch/arm64/include/asm/pgtable.h | 17 -- arch/x86/events/amd/ibs.c | 8 +- arch/x86/include/asm/smp.h | 10 - arch/x86/kernel/apic/apic.c | 122 +++++---- drivers/cpufreq/ti-cpufreq.c | 1 + drivers/dma/xilinx/xilinx_dma.c | 7 + drivers/gpu/drm/radeon/si_dpm.c | 1 + drivers/hid/intel-ish-hid/ishtp/client-buffers.c | 2 +- drivers/hid/wacom.h | 15 ++ drivers/hid/wacom_wac.c | 10 +- drivers/hwtracing/intel_th/pci.c | 10 + drivers/i2c/busses/i2c-omap.c | 25 +- drivers/iio/adc/stm32-adc.c | 4 +- drivers/iio/imu/adis16480.c | 5 +- drivers/iio/proximity/srf04.c | 29 +- drivers/infiniband/core/uverbs.h | 2 +- drivers/infiniband/hw/cxgb4/cm.c | 2 - drivers/infiniband/hw/qedr/main.c | 2 +- drivers/mailbox/mailbox.c | 4 +- drivers/mailbox/pcc.c | 4 +- drivers/mfd/palmas.c | 10 +- drivers/misc/pci_endpoint_test.c | 17 ++ drivers/mtd/spi-nor/cadence-quadspi.c | 27 +- drivers/mtd/spi-nor/spi-nor.c | 2 +- drivers/net/bonding/bond_main.c | 47 ++-- drivers/net/can/c_can/c_can.c | 25 +- drivers/net/can/c_can/c_can.h | 1 + drivers/net/can/flexcan.c | 1 + drivers/net/can/rx-offload.c | 6 +- drivers/net/can/usb/gs_usb.c | 1 + drivers/net/can/usb/mcba_usb.c | 3 +- drivers/net/can/usb/peak_usb/pcan_usb.c | 17 +- drivers/net/can/usb/peak_usb/pcan_usb_core.c | 2 +- drivers/net/can/usb/usb_8dev.c | 3 +- drivers/net/ethernet/arc/emac_rockchip.c | 3 + drivers/net/ethernet/cavium/octeon/octeon_mgmt.c | 2 +- drivers/net/ethernet/hisilicon/hip04_eth.c | 1 - drivers/net/ethernet/intel/e1000/e1000_ethtool.c | 7 +- drivers/net/ethernet/intel/igb/igb_main.c | 3 +- .../net/ethernet/mellanox/mlx5/core/fpga/conn.c | 4 +- drivers/net/ethernet/qlogic/qede/qede_main.c | 12 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 4 +- drivers/net/fjes/fjes_main.c | 15 +- drivers/net/hyperv/netvsc_drv.c | 9 +- drivers/net/macsec.c | 4 - drivers/net/usb/cdc_ncm.c | 6 +- drivers/net/usb/qmi_wwan.c | 1 + drivers/nfc/fdp/i2c.c | 2 +- drivers/nfc/st21nfca/core.c | 1 + drivers/pci/dwc/pci-dra7xx.c | 17 ++ drivers/pci/host/pci-tegra.c | 7 +- drivers/scsi/lpfc/lpfc_nportdisc.c | 4 +- drivers/scsi/qla2xxx/qla_bsg.c | 6 +- drivers/scsi/qla2xxx/qla_mbx.c | 3 +- drivers/scsi/qla2xxx/qla_os.c | 4 + drivers/usb/core/config.c | 5 + drivers/usb/dwc3/core.c | 6 +- drivers/usb/dwc3/core.h | 3 + drivers/usb/dwc3/gadget.c | 6 +- drivers/usb/gadget/composite.c | 4 + drivers/usb/gadget/configfs.c | 110 +++++++- drivers/usb/gadget/udc/atmel_usba_udc.c | 6 +- drivers/usb/gadget/udc/fsl_udc_core.c | 2 +- drivers/usb/misc/ldusb.c | 7 +- drivers/usb/usbip/Kconfig | 1 + drivers/usb/usbip/stub.h | 7 +- drivers/usb/usbip/stub_main.c | 57 ++-- drivers/usb/usbip/stub_rx.c | 213 ++++++++++----- drivers/usb/usbip/stub_tx.c | 99 +++++-- drivers/usb/usbip/usbip_common.c | 59 +++-- drivers/usb/usbip/vhci_hcd.c | 16 +- drivers/usb/usbip/vhci_rx.c | 3 + drivers/usb/usbip/vhci_tx.c | 66 ++++- fs/ceph/caps.c | 10 +- fs/ceph/inode.c | 1 + fs/configfs/configfs_internal.h | 15 +- fs/configfs/dir.c | 137 +++++++--- fs/configfs/file.c | 294 ++++++++++----------- fs/configfs/symlink.c | 33 ++- fs/fs-writeback.c | 9 +- fs/nfs/delegation.c | 10 + fs/nfs/delegation.h | 1 + fs/nfs/nfs4proc.c | 7 +- include/linux/mfd/palmas.h | 3 + include/linux/mm.h | 5 - include/linux/mm_types.h | 5 + include/linux/page-flags.h | 20 +- include/linux/scatterlist.h | 10 + include/net/bonding.h | 3 +- include/net/ip_vs.h | 1 + include/net/neighbour.h | 4 +- include/net/netfilter/nf_tables.h | 3 +- include/rdma/ib_verbs.h | 2 +- kernel/sched/fair.c | 85 +----- kernel/sched/sched.h | 4 - lib/Kconfig | 4 + lib/dump_stack.c | 7 +- lib/scatterlist.c | 105 ++++++++ mm/filemap.c | 3 +- mm/page_alloc.c | 10 +- mm/vmstat.c | 2 +- net/ipv4/fib_semantics.c | 2 +- net/netfilter/ipset/ip_set_core.c | 8 +- net/netfilter/ipvs/ip_vs_app.c | 12 +- net/netfilter/ipvs/ip_vs_ctl.c | 29 +- net/netfilter/ipvs/ip_vs_pe.c | 3 +- net/netfilter/ipvs/ip_vs_sched.c | 3 +- net/netfilter/ipvs/ip_vs_sync.c | 13 +- net/nfc/netlink.c | 2 - net/openvswitch/vport-internal_dev.c | 11 +- sound/core/timer.c | 6 +- sound/firewire/bebob/bebob_focusrite.c | 3 + sound/pci/hda/patch_ca0132.c | 2 +- sound/soc/codecs/tlv320aic31xx.c | 30 ++- sound/soc/davinci/davinci-mcasp.c | 21 +- tools/gpio/Makefile | 6 +- tools/perf/util/hist.c | 2 +- 121 files changed, 1532 insertions(+), 693 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/105 bonding: fix state transition issue in link monitoring
From: Jay Vosburgh <[email protected]>
[ Upstream commit 1899bb325149e481de31a4f32b59ea6f24e176ea ]
Since de77ecd4ef02 ("bonding: improve link-status update in mii-monitoring"), the bonding driver has utilized two separate variables to indicate the next link state a particular slave should transition to. Each is used to communicate to a different portion of the link state change commit logic; one to the bond_miimon_commit function itself, and another to the state transition logic.
Unfortunately, the two variables can become unsynchronized,
resulting in incorrect link state transitions within bonding. This can cause slaves to become stuck in an incorrect link state until a subsequent carrier state transition.
The issue occurs when a special case in bond_slave_netdev_event
sets slave->link directly to BOND_LINK_FAIL. On the next pass through bond_miimon_inspect after the slave goes carrier up, the BOND_LINK_FAIL case will set the proposed next state (link_new_state) to BOND_LINK_UP, but the new_link to BOND_LINK_DOWN. The setting of the final link state from new_link comes after that from link_new_state, and so the slave will end up incorrectly in _DOWN state.
Resolve this by combining the two variables into one.
--- drivers/net/bonding/bond_main.c | 41 +++++++++++++++++++--------------------- include/net/bonding.h | 3 -- 2 files changed, 21 insertions(+), 23 deletions(-)
drivers/net/bonding/bond_main.c +20 -21
@@ -2055,8 +2055,7 @@ static int bond_miimon_inspect(struct bo ignore_updelay = !rcu_dereference (bond->curr_active_slave);bond_for_each_slave_rcu (bond, slave, iter) { - slave->new_link =BOND_LINK_NOCHANGE ; - slave->link_new_state = slave->link; +bond_propose_link_state (slave,BOND_LINK_NOCHANGE ); link_state =bond_check_dev_link (bond, slave->dev,0 );
@@ -2092,7 +2091,7 @@ static int bond_miimon_inspect(struct bo }if (slave->delay <=0 ) { - slave->new_link =BOND_LINK_DOWN ; +bond_propose_link_state (slave,BOND_LINK_DOWN ); commit++;continue ; }
@@ -2131,7 +2130,7 @@ static int bond_miimon_inspect(struct bo slave->delay =0 ;if (slave->delay <=0 ) { - slave->new_link =BOND_LINK_UP ; +bond_propose_link_state (slave,BOND_LINK_UP ); commit++; ignore_updelay = false;continue ;
@@ -2151,7 +2150,7 @@ static void bond_miimon_commit(struct bostruct slave *slave, *primary;bond_for_each_slave (bond, slave, iter) { -switch (slave->new_link) { +switch (slave->link_new_state) {case BOND_LINK_NOCHANGE :/* For 802.3ad mode, check current slave speed and * duplex again in case its port was disabled after
@@ -2244,8 +2243,8 @@ static void bond_miimon_commit(struct bodefault :netdev_err (bond->dev,"invalid new link %d on slave %s\n" , - slave->new_link, slave->dev->name); - slave->new_link =BOND_LINK_NOCHANGE ; + slave->link_new_state, slave->dev->name); +bond_propose_link_state (slave,BOND_LINK_NOCHANGE );continue ; }
@@ -2644,13 +2643,13 @@ static void bond_loadbalance_arp_mon(strbond_for_each_slave_rcu (bond, slave, iter) {unsigned long trans_start =dev_trans_start (slave->dev); - slave->new_link =BOND_LINK_NOCHANGE ; +bond_propose_link_state (slave,BOND_LINK_NOCHANGE );if (slave->link !=BOND_LINK_UP ) {if (bond_time_in_interval (bond, trans_start,1 ) &&bond_time_in_interval (bond, slave->last_rx,1 )) { - slave->new_link =BOND_LINK_UP ; +bond_propose_link_state (slave,BOND_LINK_UP ); slave_state_changed =1 ;/* primary_slave has no meaning in round-robin
@@ -2677,7 +2676,7 @@ static void bond_loadbalance_arp_mon(strif (!bond_time_in_interval (bond, trans_start,2 ) || !bond_time_in_interval (bond, slave->last_rx,2 )) { - slave->new_link =BOND_LINK_DOWN ; +bond_propose_link_state (slave,BOND_LINK_DOWN ); slave_state_changed =1 ;if (slave->link_failure_count <UINT_MAX )
@@ -2709,8 +2708,8 @@ static void bond_loadbalance_arp_mon(str goto re_arm;bond_for_each_slave (bond, slave, iter) { -if (slave->new_link !=BOND_LINK_NOCHANGE ) - slave->link = slave->new_link; +if (slave->link_new_state !=BOND_LINK_NOCHANGE ) + slave->link = slave->link_new_state; }if (slave_state_changed) {
@@ -2733,9 +2732,9 @@ re_arm: }/* Called to inspect slaves for active-backup mode ARP monitor link state -* changes. Sets new_link in slaves to specify what action should take -* place for the slave. Returns 0 if no changes are found, >0 if changes -* to link states must be committed. +* changes. Sets proposed link state in slaves to specify what action +* should take place for the slave. Returns 0 if no changes are found, >0 +* if changes to link states must be committed. * * Called with rcu_read_lock held. */
@@ -2747,12 +2746,12 @@ static int bond_ab_arp_inspect(struct boint commit =0 ;bond_for_each_slave_rcu (bond, slave, iter) { - slave->new_link =BOND_LINK_NOCHANGE ; +bond_propose_link_state (slave,BOND_LINK_NOCHANGE ); last_rx =slave_last_rx (bond, slave);if (slave->link !=BOND_LINK_UP ) {if (bond_time_in_interval (bond, last_rx,1 )) { - slave->new_link =BOND_LINK_UP ; +bond_propose_link_state (slave,BOND_LINK_UP ); commit++; }continue ;
@@ -2780,7 +2779,7 @@ static int bond_ab_arp_inspect(struct boif (!bond_is_active_slave (slave) && !rcu_access_pointer (bond->current_arp_slave) && !bond_time_in_interval (bond, last_rx,3 )) { - slave->new_link =BOND_LINK_DOWN ; +bond_propose_link_state (slave,BOND_LINK_DOWN ); commit++; }
@@ -2793,7 +2792,7 @@ static int bond_ab_arp_inspect(struct boif (bond_is_active_slave (slave) && (!bond_time_in_interval (bond, trans_start,2 ) || !bond_time_in_interval (bond, last_rx,2 ))) { - slave->new_link =BOND_LINK_DOWN ; +bond_propose_link_state (slave,BOND_LINK_DOWN ); commit++; } }
@@ -2813,7 +2812,7 @@ static void bond_ab_arp_commit(struct bostruct slave *slave;bond_for_each_slave (bond, slave, iter) { -switch (slave->new_link) { +switch (slave->link_new_state) {case BOND_LINK_NOCHANGE :continue ;
@@ -2866,7 +2865,7 @@ static void bond_ab_arp_commit(struct bodefault :netdev_err (bond->dev,"impossible: new_link %d on slave %s\n" , - slave->new_link, slave->dev->name); + slave->link_new_state, slave->dev->name);continue ; }
include/net/bonding.h +1 -2
@@ -149,7 +149,6 @@ struct slave {unsigned long target_last_arp_rx[BOND_MAX_ARP_TARGETS ];s8 link;/* one of BOND_LINK_XXXX */ s8 link_new_state;/* one of BOND_LINK_XXXX */ -s8 new_link; u8 backup:1, /* indicates backup slave. Value corresponds with BOND_STATE_ACTIVE and BOND_STATE_BACKUP */ inactive:1, /* indicates inactive slave */
@@ -523,7 +522,7 @@ static inline void bond_propose_link_stastatic inline void bond_commit_link_state (struct slave *slave,bool notify) { -if (slave->link == slave->link_new_state) +if (slave->link_new_state ==BOND_LINK_NOCHANGE )return ; slave->link = slave->link_new_state;
Re: [PATCH 4.14 001/105] bonding: fix state transition issue in link monitoring
Quoted 181 lines · Greg Kroah-Hartman
From: Jay Vosburgh <[email protected]>
[ Upstream commit
1899bb325149e481de31a4f32b59ea6f24e176ea]Since
de77ecd4ef02("bonding: improve link-status update in mii-monitoring"), the bonding driver has utilized two separate variables to indicate the next link state a particular slave should transition to. Each is used to communicate to a different portion of the link state change commit logic; one to thebond_miimon_commitfunction itself, and another to the state transition logic.Unfortunately, the two variables can become unsynchronized,
resulting in incorrect link state transitions within bonding. This can cause slaves to become stuck in an incorrect link state until a subsequent carrier state transition.The issue occurs when a special case in
bond_slave_netdev_event
setsslave->linkdirectly toBOND_LINK_FAIL. On the next pass throughbond_miimon_inspectafter the slave goes carrier up, theBOND_LINK_FAILcase will set the proposed next state (link_new_state) toBOND_LINK_UP, but thenew_linktoBOND_LINK_DOWN. The setting of the final link state fromnew_linkcomes after that fromlink_new_state, and so the slave will end up incorrectly in_DOWNstate.Resolve this by combining the two variables into one.
Reported-by Aleksei Zakharov <[email protected]>Reported-by Sha Zhang <[email protected]>Cc Mahesh Bandewar <[email protected]>Fixes de77ecd4ef02 ("bonding: improve link-status update in mii-monitoring")Signed-off-by Jay Vosburgh <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/net/bonding/bond_main.c | 41 +++++++++++++++++++--------------------- include/net/bonding.h | 3 -- 2 files changed, 21 insertions(+), 23 deletions(-)drivers/net/bonding/bond_main.c +19
-20@@ -2055,8 +2055,7 @@ static int bond_miimon_inspect(struct bo ignore_updelay = !rcu_dereference (bond->curr_active_slave);bond_for_each_slave_rcu (bond, slave, iter) { - slave->new_link =BOND_LINK_NOCHANGE ; - slave->link_new_state = slave->link; +bond_propose_link_state (slave,BOND_LINK_NOCHANGE ); link_state =bond_check_dev_link (bond, slave->dev,0 );@@ -2092,7 +2091,7 @@ static int bond_miimon_inspect(struct bo }if (slave->delay <=0 ) { - slave->new_link =BOND_LINK_DOWN ; +bond_propose_link_state (slave,BOND_LINK_DOWN ); commit++;continue ; }@@ -2131,7 +2130,7 @@ static int bond_miimon_inspect(struct bo slave->delay =0 ;if (slave->delay <=0 ) { - slave->new_link =BOND_LINK_UP ; +bond_propose_link_state (slave,BOND_LINK_UP ); commit++; ignore_updelay = false;continue ;@@ -2151,7 +2150,7 @@ static void bond_miimon_commit(struct bostruct slave *slave, *primary;bond_for_each_slave (bond, slave, iter) { -switch (slave->new_link) { +switch (slave->link_new_state) {case BOND_LINK_NOCHANGE :/* For 802.3ad mode, check current slave speed and * duplex again in case its port was disabled after @@ -2244,8 +2243,8 @@ static void bond_miimon_commit(struct bodefault :netdev_err (bond->dev,"invalid new link %d on slave %s\n" , - slave->new_link, slave->dev->name); - slave->new_link =BOND_LINK_NOCHANGE ; + slave->link_new_state, slave->dev->name); +bond_propose_link_state (slave,BOND_LINK_NOCHANGE );continue ; }@@ -2644,13 +2643,13 @@ static void bond_loadbalance_arp_mon(strbond_for_each_slave_rcu (bond, slave, iter) {unsigned long trans_start =dev_trans_start (slave->dev); - slave->new_link =BOND_LINK_NOCHANGE ; +bond_propose_link_state (slave,BOND_LINK_NOCHANGE );if (slave->link !=BOND_LINK_UP ) {if (bond_time_in_interval (bond, trans_start,1 ) &&bond_time_in_interval (bond, slave->last_rx,1 )) { - slave->new_link =BOND_LINK_UP ; +bond_propose_link_state (slave,BOND_LINK_UP ); slave_state_changed =1 ;/* primary_slave has no meaning in round-robin @@ -2677,7 +2676,7 @@ static void bond_loadbalance_arp_mon(strif (!bond_time_in_interval (bond, trans_start,2 ) || !bond_time_in_interval (bond, slave->last_rx,2 )) { - slave->new_link =BOND_LINK_DOWN ; +bond_propose_link_state (slave,BOND_LINK_DOWN ); slave_state_changed =1 ;if (slave->link_failure_count <UINT_MAX )@@ -2709,8 +2708,8 @@ static void bond_loadbalance_arp_mon(str goto re_arm;bond_for_each_slave (bond, slave, iter) { -if (slave->new_link !=BOND_LINK_NOCHANGE ) - slave->link = slave->new_link; +if (slave->link_new_state !=BOND_LINK_NOCHANGE ) + slave->link = slave->link_new_state; }if (slave_state_changed) {@@ -2733,9 +2732,9 @@ re_arm: }/* Called to inspect slaves for active-backup mode ARP monitor link state -* changes. Sets new_link in slaves to specify what action should take -* place for the slave. Returns 0 if no changes are found, >0 if changes -* to link states must be committed. +* changes. Sets proposed link state in slaves to specify what action +* should take place for the slave. Returns 0 if no changes are found, >0 +* if changes to link states must be committed. * * Called with rcu_read_lock held. */ @@ -2747,12 +2746,12 @@ static int bond_ab_arp_inspect(struct boint commit =0 ;bond_for_each_slave_rcu (bond, slave, iter) { - slave->new_link =BOND_LINK_NOCHANGE ; +bond_propose_link_state (slave,BOND_LINK_NOCHANGE ); last_rx =slave_last_rx (bond, slave);if (slave->link !=BOND_LINK_UP ) {if (bond_time_in_interval (bond, last_rx,1 )) { - slave->new_link =BOND_LINK_UP ; +bond_propose_link_state (slave,BOND_LINK_UP ); commit++; }continue ;@@ -2780,7 +2779,7 @@ static int bond_ab_arp_inspect(struct boif (!bond_is_active_slave (slave) && !rcu_access_pointer (bond->current_arp_slave) && !bond_time_in_interval (bond, last_rx,3 )) { - slave->new_link =BOND_LINK_DOWN ; +bond_propose_link_state (slave,BOND_LINK_DOWN ); commit++; }@@ -2793,7 +2792,7 @@ static int bond_ab_arp_inspect(struct boif (bond_is_active_slave (slave) && (!bond_time_in_interval (bond, trans_start,2 ) || !bond_time_in_interval (bond, last_rx,2 ))) { - slave->new_link =BOND_LINK_DOWN ; +bond_propose_link_state (slave,BOND_LINK_DOWN ); commit++; } }@@ -2813,7 +2812,7 @@ static void bond_ab_arp_commit(struct bostruct slave *slave;bond_for_each_slave (bond, slave, iter) { -switch (slave->new_link) { +switch (slave->link_new_state) {case BOND_LINK_NOCHANGE :continue ;
drivers/net/bonding/bond_main.c static void bond_ab_arp_commit(struct bo · line 2867
Quoted 3 lines
drivers/net/bonding/bond_main.c +0
-0@@ -2866,7 +2865,7 @@ static void bond_ab_arp_commit(struct bodefault : netdev_err(bond->dev, "impossible: new_link %d on slave %s\n",
Hello,
I think the error message here should be: "impossible: link_new_state %d on slave %s\n" instead?
As in the upstream commit it's:
slave_err(bond->dev, slave->dev,
"impossible: link_new_state %d on slave\n",
slave->link_new_state);Thanks
Quoted 26 lines
drivers/net/bonding/bond_main.c +1
-1- slave->new_link, slave->dev->name); + slave->link_new_state, slave->dev->name);continue ; }include/net/bonding.h +1
-2@@ -149,7 +149,6 @@ struct slave {unsigned long target_last_arp_rx[BOND_MAX_ARP_TARGETS ];s8 link;/* one of BOND_LINK_XXXX */ s8 link_new_state;/* one of BOND_LINK_XXXX */ -s8 new_link; u8 backup:1, /* indicates backup slave. Value corresponds withBOND_STATE_ACTIVE and BOND_STATE_BACKUP */ inactive:1, /* indicates inactive slave */@@ -523,7 +522,7 @@ static inline void bond_propose_link_stastatic inline void bond_commit_link_state (struct slave *slave,bool notify) { -if (slave->link == slave->link_new_state) +if (slave->link_new_state ==BOND_LINK_NOCHANGE )return ; slave->link = slave->link_new_state;
Greg Kroah-Hartman
maintainerPATCH 2/105 CDC-NCM: handle incomplete transfer of MTU
In reply to Greg Kroah-HartmanFrom: Oliver Neukum <[email protected]>
[ Upstream commit 332f989a3b0041b810836c5c3747e59aad7e9d0b ]
A malicious device may give half an answer when asked for its MTU. The driver will proceed after this with a garbage MTU. Anything but a complete answer must be treated as an error.
V2: used sizeof as request by Alexander
--- drivers/net/usb/cdc_ncm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/usb/cdc_ncm.c +3 -3
@@ -578,8 +578,8 @@ static void cdc_ncm_set_dgram_size(struc/* read current mtu value from device */ err =usbnet_read_cmd (dev,USB_CDC_GET_MAX_DATAGRAM_SIZE ,USB_TYPE_CLASS |USB_DIR_IN |USB_RECIP_INTERFACE , -0 , iface_no, &max_datagram_size,2 ); -if (err <0 ) { +0 , iface_no, &max_datagram_size,sizeof (max_datagram_size)); +if (err <sizeof (max_datagram_size)) {dev_dbg (&dev->intf->dev,"GET_MAX_DATAGRAM_SIZE failed\n" ); goto out; }
@@ -590,7 +590,7 @@ static void cdc_ncm_set_dgram_size(struc max_datagram_size =cpu_to_le16 (ctx->max_datagram_size); err =usbnet_write_cmd (dev,USB_CDC_SET_MAX_DATAGRAM_SIZE ,USB_TYPE_CLASS |USB_DIR_OUT |USB_RECIP_INTERFACE , -0 , iface_no, &max_datagram_size,2 ); +0 , iface_no, &max_datagram_size,sizeof (max_datagram_size));if (err <0 )dev_dbg (&dev->intf->dev,"SET_MAX_DATAGRAM_SIZE failed\n" );
Greg Kroah-Hartman
maintainerPATCH 3/105 ipv4: Fix table id reference in fib_sync_down_addr
In reply to Greg Kroah-HartmanFrom: David Ahern <[email protected]>
[ Upstream commit e0a312629fefa943534fc46f7bfbe6de3fdaf463 ]
Hendrik reported routes in the main table using source address are not removed when the address is removed. The problem is that fib_sync_down_addr does not account for devices in the default VRF which are associated with the main table. Fix by updating the table id reference.
--- net/ipv4/fib_semantics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/fib_semantics.c +1 -1
@@ -1471,8 +1471,8 @@ int fib_sync_down_addr(struct net_deviceint ret =0 ;unsigned int hash =fib_laddr_hashfn (local);struct hlist_head *head = &fib_info_laddrhash[hash]; +int tb_id =l3mdev_fib_table (dev) ? :RT_TABLE_MAIN ;struct net *net =dev_net (dev); -int tb_id =l3mdev_fib_table (dev);struct fib_info *fi;if (!fib_info_laddrhash || local ==0 )
Greg Kroah-Hartman
maintainerPATCH 4/105 net: ethernet: octeon_mgmt: Account for second possible VLAN header
In reply to Greg Kroah-HartmanFrom: Alexander Sverdlin <[email protected]>
[ Upstream commit e4dd5608033efe7b6030cde359bfdbaeb73bc22d ]
Octeon's input ring-buffer entry has 14 bits-wide size field, so to account for second possible VLAN header max_mtu must be further reduced.
--- drivers/net/ethernet/cavium/octeon/octeon_mgmt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/cavium/octeon/octeon_mgmt.c +1 -1
@@ -1497,7 +1497,7 @@ static int octeon_mgmt_probe(struct plat netdev->ethtool_ops = &octeon_mgmt_ethtool_ops; netdev->min_mtu =64 -OCTEON_MGMT_RX_HEADROOM ; - netdev->max_mtu =16383 -OCTEON_MGMT_RX_HEADROOM ; + netdev->max_mtu =16383 -OCTEON_MGMT_RX_HEADROOM -VLAN_HLEN ; mac =of_get_mac_address (pdev->dev.of_node);
Greg Kroah-Hartman
maintainerPATCH 5/105 net: fix data-race in neigh_event_send()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 1b53d64435d56902fc234ff2507142d971a09687 ]
KCSAN reported the following data-race [1]
The fix will also prevent the compiler from optimizing out the condition.
[1]
BUG: KCSAN: data-race in neigh_resolve_output / neigh_resolve_output
write to 0xffff8880a41dba78 of 8 bytes by interrupt on cpu 1:
neigh_event_send include/net/neighbour.h:443 [inline] neigh_resolve_output+0x78/0x480 net/core/neighbour.c:1474 neigh_output include/net/neighbour.h:511 [inline] ip_finish_output2+0x4af/0xe40 net/ipv4/ip_output.c:228 __ip_finish_output net/ipv4/ip_output.c:308 [inline] __ip_finish_output+0x23a/0x490 net/ipv4/ip_output.c:290 ip_finish_output+0x41/0x160 net/ipv4/ip_output.c:318 NF_HOOK_COND include/linux/netfilter.h:294 [inline] ip_output+0xdf/0x210 net/ipv4/ip_output.c:432 dst_output include/net/dst.h:436 [inline] ip_local_out+0x74/0x90 net/ipv4/ip_output.c:125 __ip_queue_xmit+0x3a8/0xa40 net/ipv4/ip_output.c:532 ip_queue_xmit+0x45/0x60 include/net/ip.h:237 __tcp_transmit_skb+0xe81/0x1d60 net/ipv4/tcp_output.c:1169 tcp_transmit_skb net/ipv4/tcp_output.c:1185 [inline] __tcp_retransmit_skb+0x4bd/0x15f0 net/ipv4/tcp_output.c:2976 tcp_retransmit_skb+0x36/0x1a0 net/ipv4/tcp_output.c:2999 tcp_retransmit_timer+0x719/0x16d0 net/ipv4/tcp_timer.c:515 tcp_write_timer_handler+0x42d/0x510 net/ipv4/tcp_timer.c:598 tcp_write_timer+0xd1/0xf0 net/ipv4/tcp_timer.c:618
read to 0xffff8880a41dba78 of 8 bytes by interrupt on cpu 0:
neigh_event_send include/net/neighbour.h:442 [inline] neigh_resolve_output+0x57/0x480 net/core/neighbour.c:1474 neigh_output include/net/neighbour.h:511 [inline] ip_finish_output2+0x4af/0xe40 net/ipv4/ip_output.c:228 __ip_finish_output net/ipv4/ip_output.c:308 [inline] __ip_finish_output+0x23a/0x490 net/ipv4/ip_output.c:290 ip_finish_output+0x41/0x160 net/ipv4/ip_output.c:318 NF_HOOK_COND include/linux/netfilter.h:294 [inline] ip_output+0xdf/0x210 net/ipv4/ip_output.c:432 dst_output include/net/dst.h:436 [inline] ip_local_out+0x74/0x90 net/ipv4/ip_output.c:125 __ip_queue_xmit+0x3a8/0xa40 net/ipv4/ip_output.c:532 ip_queue_xmit+0x45/0x60 include/net/ip.h:237 __tcp_transmit_skb+0xe81/0x1d60 net/ipv4/tcp_output.c:1169 tcp_transmit_skb net/ipv4/tcp_output.c:1185 [inline] __tcp_retransmit_skb+0x4bd/0x15f0 net/ipv4/tcp_output.c:2976 tcp_retransmit_skb+0x36/0x1a0 net/ipv4/tcp_output.c:2999 tcp_retransmit_timer+0x719/0x16d0 net/ipv4/tcp_timer.c:515 tcp_write_timer_handler+0x42d/0x510 net/ipv4/tcp_timer.c:598
Reported by Kernel Concurrency Sanitizer on:
CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.4.0-rc3+ #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
--- include/net/neighbour.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/net/neighbour.h +2 -2
@@ -429,8 +429,8 @@ static inline int neigh_event_send(struc {unsigned long now = jiffies; -if (neigh->used != now) - neigh->used = now; +if (READ_ONCE (neigh->used) != now) +WRITE_ONCE (neigh->used, now);if (!(neigh->nud_state&(NUD_CONNECTED |NUD_DELAY |NUD_PROBE )))return __neigh_event_send (neigh, skb);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 6/105 net: qualcomm: rmnet: Fix potential UAF when unregistering
In reply to Greg Kroah-HartmanFrom: Sean Tranchetti <[email protected]>
[ Upstream commit e7a86c687e64ab24f88330ad24ecc9442ce40c5a ]
During the exit/unregistration process of the RmNet driver, the function rmnet_unregister_real_device() is called to handle freeing the driver's internal state and removing the RX handler on the underlying physical device. However, the order of operations this function performs is wrong and can lead to a use after free of the rmnet_port structure.
Before calling netdev_rx_handler_unregister(), this port structure is freed with kfree(). If packets are received on any RmNet devices before synchronize_net() completes, they will attempt to use this already-freed port structure when processing the packet. As such, before cleaning up any other internal state, the RX handler must be unregistered in order to guarantee that no further packets will arrive on the device.
--- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +2 -2
@@ -84,10 +84,10 @@ static int rmnet_unregister_real_device(if (port->nr_rmnet_devs)return -EINVAL ; -kfree (port); -netdev_rx_handler_unregister (real_dev); +kfree (port); +/* release reference on real_dev */ dev_put (real_dev);
Greg Kroah-Hartman
maintainerPATCH 7/105 net: usb: qmi_wwan: add support for DW5821e with eSIM support
In reply to Greg Kroah-HartmanFrom: Aleksander Morgado <[email protected]>
[ Upstream commit e497df686e8fed8c1dd69179010656362858edb3 ]
Exactly same layout as the default DW5821e module, just a different vid/pid.
The QMI interface is exposed in USB configuration #1:
P: Vendor=413c ProdID=81e0 Rev=03.18 S: Manufacturer=Dell Inc. S: Product=DW5821e-eSIM Snapdragon X20 LTE S: SerialNumber=0123456789ABCDEF C: #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=500mA I: If#=0x0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan I: If#=0x1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid I: If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -1286,6 +1286,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ + {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
Greg Kroah-Hartman
maintainerPATCH 8/105 NFC: fdp: fix incorrect free object
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit 517ce4e93368938b204451285e53014549804868 ]
The address of fw_vsc_cfg is on stack. Releasing it with devm_kfree() is incorrect, which may result in a system crash or other security impacts. The expected object to free is *fw_vsc_cfg.
--- drivers/nfc/fdp/i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nfc/fdp/i2c.c +1 -1
@@ -267,7 +267,7 @@ static void fdp_nci_i2c_read_device_prop *fw_vsc_cfg, len);if (r) { -devm_kfree (dev, fw_vsc_cfg); +devm_kfree (dev, *fw_vsc_cfg); goto vsc_read_err; } }else {
Greg Kroah-Hartman
maintainerPATCH 9/105 nfc: netlink: fix double device reference drop
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit 025ec40b81d785a98f76b8bdb509ac10773b4f12 ]
The function nfc_put_device(dev) is called twice to drop the reference to dev when there is no associated local llcp. Remove one of them to fix the bug.
--- net/nfc/netlink.c | 2 -- 1 file changed, 2 deletions(-)
net/nfc/netlink.c +0 -2
@@ -1100,7 +1100,6 @@ static int nfc_genl_llc_set_params(struc local =nfc_llcp_find_local (dev);if (!local) { -nfc_put_device (dev); rc = -ENODEV ; goto exit; }
@@ -1160,7 +1159,6 @@ static int nfc_genl_llc_sdreq(struct sk_ local =nfc_llcp_find_local (dev);if (!local) { -nfc_put_device (dev); rc = -ENODEV ; goto exit; }
Greg Kroah-Hartman
maintainerPATCH 10/105 NFC: st21nfca: fix double free
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit 99a8efbb6e30b72ac98cecf81103f847abffb1e5 ]
The variable nfcid_skb is not changed in the callee nfc_hci_get_param() if error occurs. Consequently, the freed variable nfcid_skb will be freed again, resulting in a double free bug. Set nfcid_skb to NULL after releasing it to fix the bug.
--- drivers/nfc/st21nfca/core.c | 1 + 1 file changed, 1 insertion(+)
drivers/nfc/st21nfca/core.c +1 -0
@@ -719,6 +719,7 @@ static int st21nfca_hci_complete_target_NFC_PROTO_FELICA_MASK ; }else {kfree_skb (nfcid_skb); + nfcid_skb =NULL ;/* P2P in type A */ r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE, ST21NFCA_RF_READER_F_NFCID1,
Greg Kroah-Hartman
maintainerPATCH 11/105 qede: fix NULL pointer deref in __qede_remove()
In reply to Greg Kroah-HartmanFrom: Manish Chopra <[email protected]>
[ Upstream commit deabc87111c690097c03765ea017cd500f7376fc ]
While rebooting the system with SR-IOV vfs enabled leads to below crash due to recurrence of __qede_remove() on the VF devices (first from .shutdown() flow of the VF itself and another from PF's .shutdown() flow executing pci_disable_sriov())
This patch adds a safeguard in __qede_remove() flow to fix this, so that driver doesn't attempt to remove "already removed" devices.
[ 194.360134] BUG: unable to handle kernel NULL pointer dereference at 00000000000008dc [ 194.360227] IP: [<ffffffffc03553c4>] __qede_remove+0x24/0x130 [qede] [ 194.360304] PGD 0 [ 194.360325] Oops: 0000 [#1] SMP [ 194.360360] Modules linked in: tcp_lp fuse tun bridge stp llc devlink bonding ip_set nfnetlink ib_isert iscsi_target_mod ib_srpt target_core_mod ib_srp scsi_transport_srp scsi_tgt ib_ipoib ib_umad rpcrdma sunrpc rdma_ucm ib_uverbs ib_iser rdma_cm iw_cm ib_cm libiscsi scsi_transport_iscsi dell_smbios iTCO_wdt iTCO_vendor_support dell_wmi_descriptor dcdbas vfat fat pcc_cpufreq skx_edac intel_powerclamp coretemp intel_rapl iosf_mbi kvm_intel kvm irqbypass crc32_pclmul ghash_clmulni_intel aesni_intel lrw gf128mul glue_helper ablk_helper cryptd qedr ib_core pcspkr ses enclosure joydev ipmi_ssif sg i2c_i801 lpc_ich mei_me mei wmi ipmi_si ipmi_devintf ipmi_msghandler tpm_crb acpi_pad acpi_power_meter xfs libcrc32c sd_mod crc_t10dif crct10dif_generic crct10dif_pclmul crct10dif_common crc32c_intel mgag200 [ 194.361044] qede i2c_algo_bit drm_kms_helper qed syscopyarea sysfillrect nvme sysimgblt fb_sys_fops ttm nvme_core mpt3sas crc8 ptp drm pps_core ahci raid_class scsi_transport_sas libahci libata drm_panel_orientation_quirks nfit libnvdimm dm_mirror dm_region_hash dm_log dm_mod [last unloaded: ip_tables] [ 194.361297] CPU: 51 PID: 7996 Comm: reboot Kdump: loaded Not tainted 3.10.0-1062.el7.x86_64 #1 [ 194.361359] Hardware name: Dell Inc. PowerEdge MX840c/0740HW, BIOS 2.4.6 10/15/2019 [ 194.361412] task: ffff9cea9b360000 ti: ffff9ceabebdc000 task.ti: ffff9ceabebdc000 [ 194.361463] RIP: 0010:[<ffffffffc03553c4>] [<ffffffffc03553c4>] __qede_remove+0x24/0x130 [qede] [ 194.361534] RSP: 0018:ffff9ceabebdfac0 EFLAGS: 00010282 [ 194.361570] RAX: 0000000000000000 RBX: ffff9cd013846098 RCX: 0000000000000000 [ 194.361621] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff9cd013846098 [ 194.361668] RBP: ffff9ceabebdfae8 R08: 0000000000000000 R09: 0000000000000000 [ 194.361715] R10: 00000000bfe14201 R11: ffff9ceabfe141e0 R12: 0000000000000000 [ 194.361762] R13: ffff9cd013846098 R14: 0000000000000000 R15: ffff9ceab5e48000 [ 194.361810] FS: 00007f799c02d880(0000) GS:ffff9ceacb0c0000(0000) knlGS:0000000000000000 [ 194.361865] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 194.361903] CR2: 00000000000008dc CR3: 0000001bdac76000 CR4: 00000000007607e0 [ 194.361953] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 194.362002] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 194.362051] PKRU: 55555554 [ 194.362073] Call Trace: [ 194.362109] [<ffffffffc0355500>] qede_remove+0x10/0x20 [qede] [ 194.362180] [<ffffffffb97d0f3e>] pci_device_remove+0x3e/0xc0 [ 194.362240] [<ffffffffb98b3c52>] __device_release_driver+0x82/0xf0 [ 194.362285] [<ffffffffb98b3ce3>] device_release_driver+0x23/0x30 [ 194.362343] [<ffffffffb97c86d4>] pci_stop_bus_device+0x84/0xa0 [ 194.362388] [<ffffffffb97c87e2>] pci_stop_and_remove_bus_device+0x12/0x20 [ 194.362450] [<ffffffffb97f153f>] pci_iov_remove_virtfn+0xaf/0x160 [ 194.362496] [<ffffffffb97f1aec>] sriov_disable+0x3c/0xf0 [ 194.362534] [<ffffffffb97f1bc3>] pci_disable_sriov+0x23/0x30 [ 194.362599] [<ffffffffc02f83c3>] qed_sriov_disable+0x5e3/0x650 [qed] [ 194.362658] [<ffffffffb9622df6>] ? kfree+0x106/0x140 [ 194.362709] [<ffffffffc02cc0c0>] ? qed_free_stream_mem+0x70/0x90 [qed] [ 194.362754] [<ffffffffb9622df6>] ? kfree+0x106/0x140 [ 194.362803] [<ffffffffc02cd659>] qed_slowpath_stop+0x1a9/0x1d0 [qed] [ 194.362854] [<ffffffffc035544e>] __qede_remove+0xae/0x130 [qede] [ 194.362904] [<ffffffffc03554e0>] qede_shutdown+0x10/0x20 [qede] [ 194.362956] [<ffffffffb97cf90a>] pci_device_shutdown+0x3a/0x60 [ 194.363010] [<ffffffffb98b180b>] device_shutdown+0xfb/0x1f0 [ 194.363066] [<ffffffffb94b66c6>] kernel_restart_prepare+0x36/0x40 [ 194.363107] [<ffffffffb94b66e2>] kernel_restart+0x12/0x60 [ 194.363146] [<ffffffffb94b6959>] SYSC_reboot+0x229/0x260 [ 194.363196] [<ffffffffb95f200d>] ? handle_mm_fault+0x39d/0x9b0 [ 194.363253] [<ffffffffb942b621>] ? __switch_to+0x151/0x580 [ 194.363304] [<ffffffffb9b7ec28>] ? __schedule+0x448/0x9c0 [ 194.363343] [<ffffffffb94b69fe>] SyS_reboot+0xe/0x10 [ 194.363387] [<ffffffffb9b8bede>] system_call_fastpath+0x25/0x2a [ 194.363430] Code: f9 e9 37 ff ff ff 90 0f 1f 44 00 00 55 48 89 e5 41 57 41 56 41 55 4c 8d af 98 00 00 00 41 54 4c 89 ef 41 89 f4 53 e8 4c e4 55 f9 <80> b8 dc 08 00 00 01 48 89 c3 4c 8d b8 c0 08 00 00 4c 8b b0 c0 [ 194.363712] RIP [<ffffffffc03553c4>] __qede_remove+0x24/0x130 [qede] [ 194.363764] RSP <ffff9ceabebdfac0> [ 194.363791] CR2: 00000000000008dc
--- drivers/net/ethernet/qlogic/qede/qede_main.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/net/ethernet/qlogic/qede/qede_main.c +10 -2
@@ -1052,8 +1052,16 @@ enum qede_remove_mode {static void __qede_remove (struct pci_dev *pdev,enum qede_remove_mode mode) {struct net_device *ndev =pci_get_drvdata (pdev); -struct qede_dev *edev =netdev_priv (ndev); -struct qed_dev *cdev = edev->cdev; +struct qede_dev *edev; +struct qed_dev *cdev; + +if (!ndev) { +dev_info (&pdev->dev,"Device has already been removed\n" ); +return ; + } + + edev =netdev_priv (ndev); + cdev = edev->cdev;DP_INFO (edev,"Starting qede_remove\n" );
Greg Kroah-Hartman
maintainerPATCH 12/105 ALSA: timer: Fix incorrectly assigned timer instance
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit e7af6307a8a54f0b873960b32b6a644f2d0fbd97 upstream.
The clean up commit 41672c0c24a6 ("ALSA: timer: Simplify error path in snd_timer_open()") unified the error handling code paths with the standard goto, but it introduced a subtle bug: the timer instance is stored in snd_timer_open() incorrectly even if it returns an error. This may eventually lead to UAF, as spotted by fuzzer.
The culprit is the snd_timer_open() code checks the SNDRV_TIMER_IFLG_EXCLUSIVE flag with the common variable timeri. This variable is supposed to be the newly created instance, but we (ab-)used it for a temporary check before the actual creation of a timer instance. After that point, there is another check for the max number of instances, and it bails out if over the threshold. Before the refactoring above, it worked fine because the code returned directly from that point. After the refactoring, however, it jumps to the unified error path that stores the timeri variable in return -- even if it returns an error. Unfortunately this stored value is kept in the caller side (snd_timer_user_tselect()) in tu->timeri. This causes inconsistency later, as if the timer was successfully assigned.
In this patch, we fix it by not re-using timeri variable but a temporary variable for testing the exclusive connection, so timeri remains NULL at that point.
--- sound/core/timer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/core/timer.c +3 -3
@@ -298,11 +298,11 @@ int snd_timer_open(struct snd_timer_inst goto unlock; }if (!list_empty (&timer->open_list_head)) { - timeri =list_entry (timer->open_list_head.next, +struct snd_timer_instance *t = +list_entry (timer->open_list_head.next, struct snd_timer_instance, open_list); -if (timeri->flags &SNDRV_TIMER_IFLG_EXCLUSIVE ) { +if (t->flags &SNDRV_TIMER_IFLG_EXCLUSIVE ) { err = -EBUSY ; - timeri =NULL ; goto unlock; } }
Greg Kroah-Hartman
maintainerPATCH 13/105 ALSA: bebob: fix to detect configured source of sampling clock for Focusrite Saffire Pro i/o series
In reply to Greg Kroah-HartmanFrom: Takashi Sakamoto <[email protected]>
commit 706ad6746a66546daf96d4e4a95e46faf6cf689a upstream.
For Focusrite Saffire Pro i/o, the lowest 8 bits of register represents configured source of sampling clock. The next lowest 8 bits represents whether the configured source is actually detected or not just after the register is changed for the source.
Current implementation evaluates whole the register to detect configured source. This results in failure due to the next lowest 8 bits when the source is connected in advance.
This commit fixes the bug.
--- sound/firewire/bebob/bebob_focusrite.c | 3 +++ 1 file changed, 3 insertions(+)
sound/firewire/bebob/bebob_focusrite.c +3 -0
@@ -28,6 +28,8 @@#define SAFFIRE_CLOCK_SOURCE_SPDIF 1/* clock sources as returned from register of Saffire Pro 10 and 26 */ +#define SAFFIREPRO_CLOCK_SOURCE_SELECT_MASK 0x000000ff +#define SAFFIREPRO_CLOCK_SOURCE_DETECT_MASK 0x0000ff00#define SAFFIREPRO_CLOCK_SOURCE_INTERNAL 0#define SAFFIREPRO_CLOCK_SOURCE_SKIP 1/* never used on hardware */ #define SAFFIREPRO_CLOCK_SOURCE_SPDIF 2
@@ -190,6 +192,7 @@ saffirepro_both_clk_src_get(struct snd_b map = saffirepro_clk_maps[1 ];/* In a case that this driver cannot handle the value of register. */ + value &=SAFFIREPRO_CLOCK_SOURCE_SELECT_MASK ;if (value >=SAFFIREPRO_CLOCK_SOURCE_COUNT || map[value] <0 ) { err = -EIO ; goto end;
Greg Kroah-Hartman
maintainerPATCH 14/105 ALSA: hda/ca0132 - Fix possible workqueue stall
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 15c2b3cc09a31620914955cb2a89c277c18ee999 upstream.
The unsolicited event handler for the headphone jack on CA0132 codec driver tries to reschedule the another delayed work with cancel_delayed_work_sync(). It's no good idea, unfortunately, especially after we changed the work queue to the standard global one; this may lead to a stall because both works are using the same global queue.
Fix it by dropping the _sync but does call cancel_delayed_work() instead.
--- sound/pci/hda/patch_ca0132.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_ca0132.c +1 -1
@@ -4440,7 +4440,7 @@ static void hp_callback(struct hda_codec/* Delay enabling the HP amp, to let the mic-detection * state machine run. */ -cancel_delayed_work_sync (&spec->unsol_hp_work); +cancel_delayed_work (&spec->unsol_hp_work);schedule_delayed_work (&spec->unsol_hp_work,msecs_to_jiffies (500 )); tbl =snd_hda_jack_tbl_get (codec, cb->nid);if (tbl)
Greg Kroah-Hartman
maintainerPATCH 15/105 mm, meminit: recalculate pcpu batch and high limits after init completes
In reply to Greg Kroah-HartmanFrom: Mel Gorman <[email protected]>
commit 3e8fc0075e24338b1117cdff6a79477427b8dbed upstream.
Deferred memory initialisation updates zone->managed_pages during the initialisation phase but before that finishes, the per-cpu page allocator (pcpu) calculates the number of pages allocated/freed in batches as well as the maximum number of pages allowed on a per-cpu list. As zone->managed_pages is not up to date yet, the pcpu initialisation calculates inappropriately low batch and high values.
This increases zone lock contention quite severely in some cases with the degree of severity depending on how many CPUs share a local zone and the size of the zone. A private report indicated that kernel build times were excessive with extremely high system CPU usage. A perf profile indicated that a large chunk of time was lost on zone->lock contention.
This patch recalculates the pcpu batch and high values after deferred initialisation completes for every populated zone in the system. It was tested on a 2-socket AMD EPYC 2 machine using a kernel compilation workload -- allmodconfig and all available CPUs.
mmtests configuration: config-workload-kernbench-max Configuration was modified to build on a fresh XFS partition.
kernbench
5.4.0-rc3 5.4.0-rc3
vanilla resetpcpu-v2
Amean user-256 13249.50 ( 0.00%) 16401.31 * -23.79%*
Amean syst-256 14760.30 ( 0.00%) 4448.39 * 69.86%*
Amean elsp-256 162.42 ( 0.00%) 119.13 * 26.65%*
Stddev user-256 42.97 ( 0.00%) 19.15 ( 55.43%)
Stddev syst-256 336.87 ( 0.00%) 6.71 ( 98.01%)
Stddev elsp-256 2.46 ( 0.00%) 0.39 ( 84.03%) 5.4.0-rc3 5.4.0-rc3
vanilla resetpcpu-v2
Duration User 39766.24 49221.79
Duration System 44298.10 13361.67Duration Elapsed 519.11 388.87
The patch reduces system CPU usage by 69.86% and total build time by 26.65%. The variance of system CPU usage is also much reduced.
Before, this was the breakdown of batch and high values over all zones was:
256 batch: 1
256 batch: 63
512 batch: 7
256 high: 0
256 high: 378
512 high: 42512 pcpu pagesets had a batch limit of 7 and a high limit of 42. After the patch:
256 batch: 1
768 batch: 63
256 high: 0
768 high: 378--- mm/page_alloc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
mm/page_alloc.c +8 -2
@@ -1998,6 +1998,14 @@ static void steal_suitable_fallback(stru old_block_type =get_pageblock_migratetype (page);/* +* The number of managed pages has changed due to the initialisation +* so the pcpu batch and high limits needs to be updated or the limits +* will be artificially small. +*/ +for_each_populated_zone (zone) +zone_pcp_update (zone); + +/* * This can happen due to races and we want to prevent broken * highatomic accounting. */
@@ -7659,7 +7667,6 @@ void free_contig_range(unsigned long pfn }#endif -#ifdef CONFIG_MEMORY_HOTPLUG /* * The zone indicated has a new number of managed_pages; batch sizes and percpu * page high values need to be recalulated.
@@ -7673,7 +7680,6 @@ void __meminit zone_pcp_update(struct zo per_cpu_ptr(zone->pageset, cpu));mutex_unlock (&pcp_batch_high_lock); } -#endif void zone_pcp_reset (struct zone *zone) {
Greg Kroah-Hartman
maintainerPATCH 16/105 mm: thp: handle page cache THP correctly in PageTransCompoundMap
In reply to Greg Kroah-HartmanFrom: Yang Shi <[email protected]>
commit 169226f7e0d275c1879551f37484ef6683579a5c upstream.
We have a usecase to use tmpfs as QEMU memory backend and we would like to take the advantage of THP as well. But, our test shows the EPT is not PMD mapped even though the underlying THP are PMD mapped on host. The number showed by /sys/kernel/debug/kvm/largepage is much less than the number of PMD mapped shmem pages as the below:
7f2778200000-7f2878200000 rw-s 00000000 00:14 262232 /dev/shm/qemu_back_mem.mem.Hz2hSf (deleted)
Size: 4194304 kB
[snip]
AnonHugePages: 0 kB
ShmemPmdMapped: 579584 kB
[snip]
Locked: 0 kB
cat /sys/kernel/debug/kvm/largepages
12
And some benchmarks do worse than with anonymous THPs.
By digging into the code we figured out that commit 127393fbe597 ("mm:
thp: kvm: fix memory corruption in KVM with THP enabled") checks if there is a single PTE mapping on the page for anonymous THP when setting up EPT map. But the _mapcount < 0 check doesn't work for page cache THP since every subpage of page cache THP would get _mapcount inc'ed once it is PMD mapped, so PageTransCompoundMap() always returns false for page cache THP. This would prevent KVM from setting up PMD mapped EPT entry.
So we need handle page cache THP correctly. However, when page cache THP's PMD gets split, kernel just remove the map instead of setting up PTE map like what anonymous THP does. Before KVM calls get_user_pages() the subpages may get PTE mapped even though it is still a THP since the page cache THP may be mapped by other processes at the mean time.
Checking its _mapcount and whether the THP has PTE mapped or not. Although this may report some false negative cases (PTE mapped by other processes), it looks not trivial to make this accurate.
With this fix /sys/kernel/debug/kvm/largepage would show reasonable pages are PMD mapped by EPT as the below:
7fbeaee00000-7fbfaee00000 rw-s 00000000 00:14 275464 /dev/shm/qemu_back_mem.mem.SKUvat (deleted)
Size: 4194304 kB
[snip]
AnonHugePages: 0 kB
ShmemPmdMapped: 557056 kB
[snip]
Locked: 0 kB
cat /sys/kernel/debug/kvm/largepages
271
And the benchmarks are as same as anonymous THPs.
--- include/linux/mm.h | 5 ----- include/linux/mm_types.h | 5 +++++ include/linux/page-flags.h | 20 ++++++++++++++++++-- 3 files changed, 23 insertions(+), 7 deletions(-)
include/linux/mm.h +0 -5
@@ -549,11 +549,6 @@ static inline void *kvmalloc_array(size_extern void kvfree (const void *addr); -static inline atomic_t *compound_mapcount_ptr (struct page *page) -{ -return &page[1 ].compound_mapcount; -} -static inline int compound_mapcount (struct page *page) {VM_BUG_ON_PAGE (!PageCompound (page), page);
include/linux/mm_types.h +5 -0
@@ -240,6 +240,11 @@ struct page_frag_cache {typedef unsigned long vm_flags_t ; +static inline atomic_t *compound_mapcount_ptr (struct page *page) +{ +return &page[1 ].compound_mapcount; +} +/* * A region containing a mapping of a non-memory backed file under NOMMU * conditions. These are held in a global tree and are pinned by the VMAs that
include/linux/page-flags.h +18 -2
@@ -565,12 +565,28 @@ static inline int PageTransCompound(stru* * Unlike PageTransCompound, this is safe to be called only while * split_huge_pmd() cannot run from under us, like if protected by the -* MMU notifier, otherwise it may result in page->_mapcount < 0 false +* MMU notifier, otherwise it may result in page->_mapcount check false * positives. +* +* We have to treat page cache THP differently since every subpage of it +* would get _mapcount inc'ed once it is PMD mapped. But, it may be PTE +* mapped in the current process so comparing subpage's _mapcount to +* compound_mapcount to filter out PTE mapped case. */ static inline int PageTransCompoundMap (struct page *page) { -return PageTransCompound (page) &&atomic_read (&page->_mapcount) <0 ; +struct page *head; + +if (!PageTransCompound (page)) +return 0 ; + +if (PageAnon (page)) +return atomic_read (&page->_mapcount) <0 ; + + head =compound_head (page); +/* File THP is PMD mapped and not PTE mapped */ +return atomic_read (&page->_mapcount) == +atomic_read (compound_mapcount_ptr (head)); }/*
Greg Kroah-Hartman
maintainerPATCH 17/105 mm, vmstat: hide /proc/pagetypeinfo from normal users
In reply to Greg Kroah-HartmanFrom: Michal Hocko <[email protected]>
commit abaed0112c1db08be15a784a2c5c8a8b3063cdd3 upstream.
/proc/pagetypeinfo is a debugging tool to examine internal page allocator state wrt to fragmentation. It is not very useful for any other use so normal users really do not need to read this file.
Waiman Long has noticed that reading this file can have negative side effects because zone->lock is necessary for gathering data and that a) interferes with the page allocator and its users and b) can lead to hard lockups on large machines which have very long free_list.
Reduce both issues by simply not exporting the file to regular users.
--- mm/vmstat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/vmstat.c +1 -1
@@ -1951,7 +1951,7 @@ void __init init_mm_internals(void)#endif #ifdef CONFIG_PROC_FS proc_create ("buddyinfo" ,0444 ,NULL , &buddyinfo_file_operations); -proc_create ("pagetypeinfo" ,0444 ,NULL , &pagetypeinfo_file_operations); +proc_create ("pagetypeinfo" ,0400 ,NULL , &pagetypeinfo_file_operations);proc_create ("vmstat" ,0444 ,NULL , &vmstat_file_operations);proc_create ("zoneinfo" ,0444 ,NULL , &zoneinfo_file_operations);#endif
Greg Kroah-Hartman
maintainerPATCH 18/105 dump_stack: avoid the livelock of the dump_lock
In reply to Greg Kroah-HartmanFrom: Kevin Hao <[email protected]>
commit 5cbf2fff3bba8d3c6a4d47c1754de1cf57e2b01f upstream.
In the current code, we use the atomic_cmpxchg() to serialize the output of the dump_stack(), but this implementation suffers the thundering herd problem. We have observed such kind of livelock on a Marvell cn96xx board(24 cpus) when heavily using the dump_stack() in a kprobe handler. Actually we can let the competitors to wait for the releasing of the lock before jumping to atomic_cmpxchg(). This will definitely mitigate the thundering herd problem. Thanks Linus for the suggestion.
--- lib/dump_stack.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
lib/dump_stack.c +6 -1
@@ -46,7 +46,12 @@ retry: was_locked =1 ; }else {local_irq_restore (flags); -cpu_relax (); +/* +* Wait for the lock to release before jumping to +* atomic_cmpxchg() in order to mitigate the thundering herd +* problem. +*/ +do {cpu_relax (); }while (atomic_read (&dump_lock) !=-1 ); goto retry; }
Greg Kroah-Hartman
maintainerPATCH 19/105 tools: gpio: Use !building_out_of_srctree to determine srctree
In reply to Greg Kroah-HartmanFrom: Shuah Khan <[email protected]>
commit 4a6a6f5c4aeedb72db871d60bfcca89835f317aa upstream.
make TARGETS=gpio kselftest fails with:
Makefile:23: tools/build/Makefile.include: No such file or directory
When the gpio tool make is invoked from tools Makefile, srctree is cleared and the current logic check for srctree equals to empty string to determine srctree location from CURDIR.
When the build in invoked from selftests/gpio Makefile, the srctree is set to "." and the same logic used for srctree equals to empty is needed to determine srctree.
Check building_out_of_srctree undefined as the condition for both cases to fix "make TARGETS=gpio kselftest" build failure.
--- tools/gpio/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
tools/gpio/Makefile +5 -1
@@ -3,7 +3,11 @@ include ../scripts/Makefile.include bindir ?= /usr/bin -ifeq ($(srctree),) +# This will work when gpio is built in tools env. where srctree +# isn't set and when invoked from selftests build, where srctree +# is set to ".". building_out_of_srctree is undefined for in srctree +# builds +ifndef building_out_of_srctree srctree := $(patsubst %/,%,$(dir $(CURDIR))) srctree := $(patsubst %/,%,$(dir $(srctree))) endif
Greg Kroah-Hartman
maintainerPATCH 20/105 perf tools: Fix time sorting
In reply to Greg Kroah-HartmanFrom: Jiri Olsa <[email protected]>
commit 722ddfde366fd46205456a9c5ff9b3359dc9a75e upstream.
The final sort might get confused when the comparison is done over bigger numbers than int like for -s time.
Check the following report for longer workloads:
$ perf report -s time -F time,overhead --stdio
Fix hist_entry__sort() to properly return int64_t and not possible cut int.
--- tools/perf/util/hist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/hist.c +1 -1
@@ -1504,7 +1504,7 @@ int hists__collapse_resort(struct histsreturn 0 ; } -static int hist_entry__sort (struct hist_entry *a,struct hist_entry *b) +static int64_t hist_entry__sort (struct hist_entry *a,struct hist_entry *b) {struct hists *hists = a->hists;struct perf_hpp_fmt *fmt;
Greg Kroah-Hartman
maintainerPATCH 21/105 drm/radeon: fix si_enable_smc_cac() failed issue
In reply to Greg Kroah-HartmanFrom: Alex Deucher <[email protected]>
commit 2c409ba81be25516afe05ae27a4a15da01740b01 upstream.
Need to set the dte flag on this asic.
Port the fix from amdgpu:5cb818b861be114 ("drm/amd/amdgpu: fix si_enable_smc_cac() failed issue")
--- drivers/gpu/drm/radeon/si_dpm.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/radeon/si_dpm.c +1 -0
@@ -1956,6 +1956,7 @@ static void si_initialize_powertune_defacase 0x682C : si_pi->cac_weights = cac_weights_cape_verde_pro; si_pi->dte_data = dte_data_sun_xt; + update_dte_from_pl2 = true;break ;case 0x6825 :case 0x6827 :
Greg Kroah-Hartman
maintainerPATCH 22/105 HID: wacom: generic: Treat serial number and related fields as unsigned
In reply to Greg Kroah-HartmanFrom: Jason Gerecke <[email protected]>
commit ff479731c3859609530416a18ddb3db5db019b66 upstream.
The HID descriptors for most Wacom devices oddly declare the serial number and other related fields as signed integers. When these numbers are ingested by the HID subsystem, they are automatically sign-extended into 32-bit integers. We treat the fields as unsigned elsewhere in the kernel and userspace, however, so this sign-extension causes problems. In particular, the sign-extended tool ID sent to userspace as ABS_MISC does not properly match unsigned IDs used by xf86-input-wacom and libwacom.
We introduce a function 'wacom_s32tou' that can undo the automatic sign extension performed by 'hid_snto32'. We call this function when processing the serial number and related fields to ensure that we are dealing with and reporting the unsigned form. We opt to use this method rather than adding a descriptor fixup in 'wacom_hid_usage_quirk' since it should be more robust in the face of future devices.
Ref: https://github.com/linuxwacom/input-wacom/issues/134
--- drivers/hid/wacom.h | 15 +++++++++++++++ drivers/hid/wacom_wac.c | 10 ++++++---- 2 files changed, 21 insertions(+), 4 deletions(-)
drivers/hid/wacom.h +15 -0
@@ -205,6 +205,21 @@ static inline void wacom_schedule_work(s } } +/* +* Convert a signed 32-bit integer to an unsigned n-bit integer. Undoes +* the normally-helpful work of 'hid_snto32' for fields that use signed +* ranges for questionable reasons. +*/ +static inline __u32 wacom_s32tou (s32 value,__u8 n) +{ +switch (n) { +case 8 :return ((__u8 )value); +case 16 :return ((__u16 )value); +case 32 :return ((__u32 )value); + } +return value & (1 << (n -1 )) ? value & (~(~0U << n)) : value; +} +extern const struct hid_device_id wacom_ids[];void wacom_wac_irq (struct wacom_wac *wacom_wac,size_t len);
drivers/hid/wacom_wac.c +6 -4
@@ -2182,7 +2182,7 @@ static void wacom_wac_pen_event(struct hcase HID_DG_TOOLSERIALNUMBER :if (value) { wacom_wac->serial[0 ] = (wacom_wac->serial[0 ] & ~0xFFFFFFFFULL ); - wacom_wac->serial[0 ] |= (__u32 )value; + wacom_wac->serial[0 ] |=wacom_s32tou (value, field->report_size); }return ;case HID_DG_TWIST :
@@ -2198,15 +2198,17 @@ static void wacom_wac_pen_event(struct hreturn ;case WACOM_HID_WD_SERIALHI :if (value) { +__u32 raw_value =wacom_s32tou (value, field->report_size); + wacom_wac->serial[0 ] = (wacom_wac->serial[0 ] &0xFFFFFFFF ); - wacom_wac->serial[0 ] |= ((__u64 )value) <<32 ; + wacom_wac->serial[0 ] |= ((__u64 )raw_value) <<32 ;/* * Non-USI EMR devices may contain additional tool type * information here. See WACOM_HID_WD_TOOLTYPE case for * more details. */ if (value >>20 ==1 ) { - wacom_wac->id[0 ] |= value &0xFFFFF ; + wacom_wac->id[0 ] |= raw_value &0xFFFFF ; } }return ;
@@ -2218,7 +2220,7 @@ static void wacom_wac_pen_event(struct h* bitwise OR so the complete value can be built * up over time :( */ - wacom_wac->id[0 ] |= value; + wacom_wac->id[0 ] |=wacom_s32tou (value, field->report_size);return ;case WACOM_HID_WD_OFFSETLEFT :if (features->offset_left && value != features->offset_left)
Greg Kroah-Hartman
maintainerPATCH 23/105 arm64: Do not mask out PTE_RDONLY in pte_same()
In reply to Greg Kroah-HartmanFrom: Catalin Marinas <[email protected]>
commit 6767df245f4736d0cf0c6fb7cf9cf94b27414245 upstream.
Following commit 73e86cb03cf2 ("arm64: Move PTE_RDONLY bit handling out of set_pte_at()"), the PTE_RDONLY bit is no longer managed by set_pte_at() but built into the PAGE_* attribute definitions. Consequently, pte_same() must include this bit when checking two PTEs for equality.
Remove the arm64-specific pte_same() function, practically reverting commit 747a70e60b72 ("arm64: Fix copy-on-write referencing in HugeTLB")
--- arch/arm64/include/asm/pgtable.h | 17 ----------------- 1 file changed, 17 deletions(-)
arch/arm64/include/asm/pgtable.h +0 -17
@@ -258,23 +258,6 @@ static inline void set_pte_at(struct mm_set_pte (ptep, pte); } -#define __HAVE_ARCH_PTE_SAME -static inline int pte_same (pte_t pte_a,pte_t pte_b) -{ -pteval_t lhs, rhs; - - lhs =pte_val (pte_a); - rhs =pte_val (pte_b); - -if (pte_present (pte_a)) - lhs &= ~PTE_RDONLY ; - -if (pte_present (pte_b)) - rhs &= ~PTE_RDONLY ; - -return (lhs == rhs); -} -/* * Huge pte definitions. */
Greg Kroah-Hartman
maintainerPATCH 24/105 ceph: fix use-after-free in __ceph_remove_cap()
In reply to Greg Kroah-HartmanFrom: Luis Henriques <[email protected]>
commit ea60ed6fcf29eebc78f2ce91491e6309ee005a01 upstream.
KASAN reports a use-after-free when running xfstest generic/531, with the following trace:
[ 293.903362] kasan_report+0xe/0x20 [ 293.903365] rb_erase+0x1f/0x790 [ 293.903370] __ceph_remove_cap+0x201/0x370 [ 293.903375] __ceph_remove_caps+0x4b/0x70 [ 293.903380] ceph_evict_inode+0x4e/0x360 [ 293.903386] evict+0x169/0x290 [ 293.903390] __dentry_kill+0x16f/0x250 [ 293.903394] dput+0x1c6/0x440 [ 293.903398] __fput+0x184/0x330 [ 293.903404] task_work_run+0xb9/0xe0 [ 293.903410] exit_to_usermode_loop+0xd3/0xe0 [ 293.903413] do_syscall_64+0x1a0/0x1c0 [ 293.903417] entry_SYSCALL_64_after_hwframe+0x44/0xa9
This happens because __ceph_remove_cap() may queue a cap release (__ceph_queue_cap_release) which can be scheduled before that cap is removed from the inode list with
rb_erase(&cap->ci_node, &ci->i_caps);
And, when this finally happens, the use-after-free will occur.
This can be fixed by removing the cap from the inode list before being removed from the session list, and thus eliminating the risk of an UAF.
--- fs/ceph/caps.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/ceph/caps.c +5 -5
@@ -935,6 +935,11 @@ void __ceph_remove_cap(struct ceph_cap *dout ("__ceph_remove_cap %p from %p\n" , cap, &ci->vfs_inode); +/* remove from inode's cap rbtree, and clear auth cap */ +rb_erase (&cap->ci_node, &ci->i_caps); +if (ci->i_auth_cap == cap) + ci->i_auth_cap =NULL ; +/* remove from session list */ spin_lock (&session->s_cap_lock);if (session->s_cap_iterator == cap) {
@@ -970,11 +975,6 @@ void __ceph_remove_cap(struct ceph_cap *spin_unlock (&session->s_cap_lock); -/* remove from inode list */ -rb_erase (&cap->ci_node, &ci->i_caps); -if (ci->i_auth_cap == cap) - ci->i_auth_cap =NULL ; -if (removed)ceph_put_cap (mdsc, cap);
Greg Kroah-Hartman
maintainerPATCH 25/105 ceph: add missing check in d_revalidate snapdir handling
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit 1f08529c84cfecaf1261ed9b7e17fab18541c58f upstream.
We should not play with dcache without parent locked...
--- fs/ceph/inode.c | 1 + 1 file changed, 1 insertion(+)
fs/ceph/inode.c +1 -0
@@ -1347,6 +1347,7 @@ retry_lookup:dout (" final dn %p\n" , dn); }else if ((req->r_op ==CEPH_MDS_OP_LOOKUPSNAP || req->r_op ==CEPH_MDS_OP_MKSNAP ) && +test_bit (CEPH_MDS_R_PARENT_LOCKED , &req->r_req_flags) && !test_bit (CEPH_MDS_R_ABORTED , &req->r_req_flags)) {struct dentry *dn = req->r_dentry;struct inode *dir = req->r_parent;
Greg Kroah-Hartman
maintainerPATCH 26/105 iio: adc: stm32-adc: fix stopping dma
In reply to Greg Kroah-HartmanFrom: Fabrice Gasnier <[email protected]>
commit e6afcf6c598d6f3a0c9c408bfeddb3f5730608b0 upstream.
There maybe a race when using dmaengine_terminate_all(). The predisable routine may call iio_triggered_buffer_predisable() prior to a pending DMA callback.
Adopt dmaengine_terminate_sync() to ensure there's no pending DMA request before calling iio_triggered_buffer_predisable().
--- drivers/iio/adc/stm32-adc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/adc/stm32-adc.c +2 -2
@@ -1343,7 +1343,7 @@ static int stm32_adc_dma_start(struct ii cookie =dmaengine_submit (desc); ret =dma_submit_error (cookie);if (ret) { -dmaengine_terminate_all (adc->dma_chan); +dmaengine_terminate_sync (adc->dma_chan);return ret; }
@@ -1416,7 +1416,7 @@ static int stm32_adc_buffer_predisable(sdev_err (&indio_dev->dev,"predisable failed\n" );if (adc->dma_chan) -dmaengine_terminate_all (adc->dma_chan); +dmaengine_terminate_sync (adc->dma_chan);if (stm32_adc_set_trig (indio_dev,NULL ))dev_err (&indio_dev->dev,"Can't clear trigger\n" );
Greg Kroah-Hartman
maintainerPATCH 27/105 iio: imu: adis16480: make sure provided frequency is positive
In reply to Greg Kroah-HartmanFrom: Alexandru Ardelean <[email protected]>
commit 24e1eb5c0d78cfb9750b690bbe997d4d59170258 upstream.
It could happen that either val or val2 [provided from userspace] is negative. In that case the computed frequency could get a weird value.
Fix this by checking that neither of the 2 variables is negative, and check that the computed result is not-zero.
--- drivers/iio/imu/adis16480.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/iio/imu/adis16480.c +4 -1
@@ -266,8 +266,11 @@ static int adis16480_set_freq(struct iiostruct adis16480 *st =iio_priv (indio_dev);unsigned int t; +if (val <0 || val2 <0 ) +return -EINVAL ; + t = val *1000 + val2 /1000 ; -if (t <=0 ) +if (t ==0 )return -EINVAL ; t =2460000 / t;
Greg Kroah-Hartman
maintainerPATCH 28/105 iio: srf04: fix wrong limitation in distance measuring
In reply to Greg Kroah-HartmanFrom: Andreas Klinger <[email protected]>
commit 431f7667bd6889a274913162dfd19cce9d84848e upstream.
The measured time value in the driver is limited to the maximum distance which can be read by the sensor. This limitation was wrong and is fixed by this patch.
It also takes into account that we are supporting a variety of sensors today and that the recently added sensors have a higher maximum distance range.
Changes in v2:
- Added a Tested-by
--- drivers/iio/proximity/srf04.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-)
drivers/iio/proximity/srf04.c +15 -14
@@ -105,7 +105,7 @@ static int srf04_read(struct srf04_dataudelay (10 );gpiod_set_value (data->gpiod_trig,0 ); -/* it cannot take more than 20 ms */ +/* it should not take more than 20 ms until echo is rising */ ret =wait_for_completion_killable_timeout (&data->rising,HZ /50 );if (ret <0 ) {mutex_unlock (&data->lock);
@@ -115,7 +115,8 @@ static int srf04_read(struct srf04_datareturn -ETIMEDOUT ; } - ret =wait_for_completion_killable_timeout (&data->falling,HZ /50 ); +/* it cannot take more than 50 ms until echo is falling */ + ret =wait_for_completion_killable_timeout (&data->falling,HZ /20 );if (ret <0 ) {mutex_unlock (&data->lock);return ret;
@@ -130,19 +131,19 @@ static int srf04_read(struct srf04_data dt_ns =ktime_to_ns (ktime_dt);/* -* measuring more than 3 meters is beyond the capabilities of -* the sensor +* measuring more than 6,45 meters is beyond the capabilities of +* the supported sensors * ==> filter out invalid results for not measuring echos of * another us sensor * * formula: -* distance 3 m -* time = ---------- = --------- = 9404389 ns -* speed 319 m/s +* distance 6,45 * 2 m +* time = ---------- = ------------ = 40438871 ns +* speed 319 m/s * * using a minimum speed at -20 °C of 319 m/s */ -if (dt_ns >9404389 ) +if (dt_ns >40438871 )return -EIO ; time_ns = dt_ns;
@@ -154,20 +155,20 @@ static int srf04_read(struct srf04_data* with Temp in °C * and speed in m/s * -* use 343 m/s as ultrasonic speed at 20 °C here in absence of the +* use 343,5 m/s as ultrasonic speed at 20 °C here in absence of the * temperature * * therefore: -* time 343 -* distance = ------ * ----- -* 10^6 2 +* time 343,5 time * 106 +* distance = ------ * ------- = ------------ +* 10^6 2 617176 * with time in ns * and distance in mm (one way) * -* because we limit to 3 meters the multiplication with 343 just +* because we limit to 6,45 meters the multiplication with 106 just * fits into 32 bit */ - distance_mm = time_ns *343 /2000000 ; + distance_mm = time_ns *106 /617176 ;return distance_mm; }
Greg Kroah-Hartman
maintainerPATCH 29/105 netfilter: nf_tables: Align nft_expr private data to 64-bit
In reply to Greg Kroah-HartmanFrom: Lukas Wunner <[email protected]>
commit 250367c59e6ba0d79d702a059712d66edacd4a1a upstream.
Invoking the following commands on a 32-bit architecture with strict alignment requirements (such as an ARMv7-based Raspberry Pi) results in an alignment exception:
# nft add table ip test-ip4
# nft add chain ip test-ip4 output { type filter hook output priority 0; }
# nft add rule ip test-ip4 output quota 1025 bytesAlignment trap: not handling instruction e1b26f9f at [<7f4473f8>] Unhandled fault: alignment exception (0x001) at 0xb832e824
Internal error: : 1 [#1] PREEMPT SMP ARM Hardware name: BCM2835
[<7f4473fc>] (nft_quota_do_init [nft_quota])
[<7f447448>] (nft_quota_init [nft_quota])
[<7f4260d0>] (nf_tables_newrule [nf_tables])
[<7f4168dc>] (nfnetlink_rcv_batch [nfnetlink])
[<7f416bd0>] (nfnetlink_rcv [nfnetlink])
[<8078b334>] (netlink_unicast)
[<8078b664>] (netlink_sendmsg)
[<8071b47c>] (sock_sendmsg)
[<8071bd18>] (___sys_sendmsg)
[<8071ce3c>] (__sys_sendmsg)
[<8071ce94>] (sys_sendmsg)
The reason is that nft_quota_do_init() calls atomic64_set() on an atomic64_t which is only aligned to 32-bit, not 64-bit, because it succeeds struct nft_expr in memory which only contains a 32-bit pointer. Fix by aligning the nft_expr private data to 64-bit.
--- include/net/netfilter/nf_tables.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
include/net/netfilter/nf_tables.h +2 -1
@@ -759,7 +759,8 @@ struct nft_expr_ops {*/ struct nft_expr {const struct nft_expr_ops *ops; -unsigned char data[]; +unsigned char data[] + __attribute__((aligned (__alignof__(u64 )))); };static inline void *nft_expr_priv (const struct nft_expr *expr)
Greg Kroah-Hartman
maintainerPATCH 30/105 netfilter: ipset: Fix an error code in ip_set_sockfn_get()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 30b7244d79651460ff114ba8f7987ed94c86b99a upstream.
The copy_to_user() function returns the number of bytes remaining to be copied. In this code, that positive return is checked at the end of the function and we return zero/success. What we should do instead is return -EFAULT.
--- net/netfilter/ipset/ip_set_core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/netfilter/ipset/ip_set_core.c +5 -3
@@ -1950,8 +1950,9 @@ ip_set_sockfn_get(struct sock *sk, int o } req_version->version =IPSET_PROTOCOL ; - ret =copy_to_user (user, req_version, -sizeof (struct ip_set_req_version )); +if (copy_to_user (user, req_version, +sizeof (struct ip_set_req_version ))) + ret = -EFAULT ; goto done; }case IP_SET_OP_GET_BYNAME : {
@@ -2008,7 +2009,8 @@ ip_set_sockfn_get(struct sock *sk, int o }/* end of switch(op) */ copy: - ret =copy_to_user (user, data, copylen); +if (copy_to_user (user, data, copylen)) + ret = -EFAULT ; done:vfree (data);
Greg Kroah-Hartman
maintainerPATCH 31/105 intel_th: pci: Add Comet Lake PCH support
In reply to Greg Kroah-HartmanFrom: Alexander Shishkin <[email protected]>
commit 3adbb5718dd5264666ddbc2b9b43799d292e9cb6 upstream.
This adds support for Intel TH on Comet Lake PCH.
--- drivers/hwtracing/intel_th/pci.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/hwtracing/intel_th/pci.c +5 -0
@@ -184,6 +184,11 @@ static const struct pci_device_id intel_ .driver_data = (kernel_ulong_t)&intel_th_2x, }, { +/* Comet Lake PCH */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x06a6), + .driver_data = (kernel_ulong_t)&intel_th_2x, + }, + {/* Ice Lake NNPI */ PCI_DEVICE (PCI_VENDOR_ID_INTEL ,0x45c5 ), .driver_data = (kernel_ulong_t)&intel_th_2x,
Greg Kroah-Hartman
maintainerPATCH 32/105 intel_th: pci: Add Jasper Lake PCH support
In reply to Greg Kroah-HartmanFrom: Alexander Shishkin <[email protected]>
commit 9d55499d8da49e9261e95a490f3fda41d955f505 upstream.
This adds support for Intel TH on Jasper Lake PCH.
--- drivers/hwtracing/intel_th/pci.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/hwtracing/intel_th/pci.c +5 -0
@@ -198,6 +198,11 @@ static const struct pci_device_id intel_ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa0a6), .driver_data = (kernel_ulong_t)&intel_th_2x, }, + { +/* Jasper Lake PCH */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), + .driver_data = (kernel_ulong_t)&intel_th_2x, + }, { 0 }, };
Greg Kroah-Hartman
maintainerPATCH 33/105 can: usb_8dev: fix use-after-free on disconnect
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 3759739426186a924675651b388d1c3963c5710e upstream.
The driver was accessing its driver data after having freed it.
--- drivers/net/can/usb/usb_8dev.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/can/usb/usb_8dev.c +1 -2
@@ -1007,9 +1007,8 @@ static void usb_8dev_disconnect(struct unetdev_info (priv->netdev,"device disconnected\n" );unregister_netdev (priv->netdev); -free_candev (priv->netdev); -unlink_all_urbs (priv); +free_candev (priv->netdev); } }
Greg Kroah-Hartman
maintainerPATCH 34/105 can: c_can: c_can_poll(): only read status register after status IRQ
In reply to Greg Kroah-HartmanFrom: Kurt Van Dijck <[email protected]>
commit 3cb3eaac52c0f145d895f4b6c22834d5f02b8569 upstream.
When the status register is read without the status IRQ pending, the chip may not raise the interrupt line for an upcoming status interrupt and the driver may miss a status interrupt.
It is critical that the BUSOFF status interrupt is forwarded to the higher layers, since no more interrupts will follow without intervention.
Thanks to Wolfgang and Joe for bringing up the first idea.
--- drivers/net/can/c_can/c_can.c | 25 ++++++++++++++++++++----- drivers/net/can/c_can/c_can.h | 1 + 2 files changed, 21 insertions(+), 5 deletions(-)
drivers/net/can/c_can/c_can.c +20 -5
@@ -97,6 +97,9 @@#define BTR_TSEG2_SHIFT 12#define BTR_TSEG2_MASK (0x7 << BTR_TSEG2_SHIFT) +/* interrupt register */ +#define INT_STS_PENDING 0x8000 +/* brp extension register */ #define BRP_EXT_BRPE_MASK 0x0f#define BRP_EXT_BRPE_SHIFT 0
@@ -1029,10 +1032,16 @@ static int c_can_poll(struct napi_structu16 curr, last = priv->last_status;int work_done =0 ; - priv->last_status = curr = priv->read_reg (priv,C_CAN_STS_REG ); -/* Ack status on C_CAN. D_CAN is self clearing */ -if (priv->type !=BOSCH_D_CAN ) - priv->write_reg (priv,C_CAN_STS_REG ,LEC_UNUSED ); +/* Only read the status register if a status interrupt was pending */ +if (atomic_xchg (&priv->sie_pending,0 )) { + priv->last_status = curr = priv->read_reg (priv,C_CAN_STS_REG ); +/* Ack status on C_CAN. D_CAN is self clearing */ +if (priv->type !=BOSCH_D_CAN ) + priv->write_reg (priv,C_CAN_STS_REG ,LEC_UNUSED ); + }else { +/* no change detected ... */ + curr = last; + }/* handle state changes */ if ((curr &STATUS_EWARN ) && (!(last &STATUS_EWARN ))) {
@@ -1083,10 +1092,16 @@ static irqreturn_t c_can_isr(int irq, vo {struct net_device *dev = (struct net_device *)dev_id;struct c_can_priv *priv =netdev_priv (dev); +int reg_int; -if (!priv->read_reg (priv,C_CAN_INT_REG )) + reg_int = priv->read_reg (priv,C_CAN_INT_REG ); +if (!reg_int)return IRQ_NONE ; +/* save for later use */ +if (reg_int &INT_STS_PENDING ) +atomic_set (&priv->sie_pending,1 ); +/* disable all interrupts and schedule the NAPI */ c_can_irq_control (priv, false);napi_schedule (&priv->napi);
drivers/net/can/c_can/c_can.h +1 -0
@@ -198,6 +198,7 @@ struct c_can_priv {struct net_device *dev;struct device *device;atomic_t tx_active; +atomic_t sie_pending;unsigned long tx_dir;int last_status;u16 (*read_reg) (const struct c_can_priv *priv,enum reg index);
Greg Kroah-Hartman
maintainerPATCH 35/105 can: peak_usb: fix a potential out-of-sync while decoding packets
In reply to Greg Kroah-HartmanFrom: Stephane Grosjean <[email protected]>
commit de280f403f2996679e2607384980703710576fed upstream.
When decoding a buffer received from PCAN-USB, the first timestamp read in a packet is a 16-bit coded time base, and the next ones are an 8-bit offset to this base, regardless of the type of packet read.
This patch corrects a potential loss of synchronization by using a timestamp index read from the buffer, rather than an index of received data packets, to determine on the sizeof the timestamp to be read from the packet being decoded.
--- drivers/net/can/usb/peak_usb/pcan_usb.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/net/can/usb/peak_usb/pcan_usb.c +12 -5
@@ -108,7 +108,7 @@ struct pcan_usb_msg_context {u8 *end;u8 rec_cnt;u8 rec_idx; -u8 rec_data_idx; +u8 rec_ts_idx;struct net_device *netdev;struct pcan_usb *pdev; };
@@ -552,10 +552,15 @@ static int pcan_usb_decode_status(struct mc->ptr +=PCAN_USB_CMD_ARGS ;if (status_len &PCAN_USB_STATUSLEN_TIMESTAMP ) { -int err =pcan_usb_decode_ts (mc, !mc->rec_idx); +int err =pcan_usb_decode_ts (mc, !mc->rec_ts_idx);if (err)return err; + +/* Next packet in the buffer will have a timestamp on a single +* byte +*/ + mc->rec_ts_idx++; }switch (f) {
@@ -638,10 +643,13 @@ static int pcan_usb_decode_data(struct p cf->can_dlc =get_can_dlc (rec_len); -/* first data packet timestamp is a word */ -if (pcan_usb_decode_ts (mc, !mc->rec_data_idx)) +/* Only first packet timestamp is a word */ +if (pcan_usb_decode_ts (mc, !mc->rec_ts_idx)) goto decode_failed; +/* Next packet in the buffer will have a timestamp on a single byte */ + mc->rec_ts_idx++; +/* read data */ memset (cf->data,0x0 ,sizeof (cf->data));if (status_len &PCAN_USB_STATUSLEN_RTR ) {
@@ -695,7 +703,6 @@ static int pcan_usb_decode_msg(struct pe/* handle normal can frames here */ }else { err =pcan_usb_decode_data (&mc, sl); - mc.rec_data_idx++; } }
Greg Kroah-Hartman
maintainerPATCH 36/105 can: rx-offload: can_rx_offload_queue_sorted(): fix error handling, avoid skb mem leak
In reply to Greg Kroah-HartmanFrom: Marc Kleine-Budde <[email protected]>
commit ca913f1ac024559ebc17f0b599af262f0ad997c9 upstream.
If the rx-offload skb_queue is full can_rx_offload_queue_sorted() will not queue the skb and return with an error.
None of the callers of this function, issue a kfree_skb() to free the not queued skb. This results in a memory leak.
This patch fixes the problem by freeing the skb in case of a full queue. The return value is adjusted to -ENOBUFS to better reflect the actual problem.
The device stats handling is left to the callers, as this function might be used in both the rx and tx path.
--- drivers/net/can/rx-offload.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/can/rx-offload.c +4 -2
@@ -216,8 +216,10 @@ int can_rx_offload_queue_sorted(struct cunsigned long flags;if (skb_queue_len (&offload->skb_queue) > - offload->skb_queue_len_max) -return -ENOMEM ; + offload->skb_queue_len_max) { +kfree_skb (skb); +return -ENOBUFS ; + } cb =can_rx_offload_get_cb (skb); cb->timestamp = timestamp;
Greg Kroah-Hartman
maintainerPATCH 37/105 can: gs_usb: gs_can_open(): prevent memory leak
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
commit fb5be6a7b4863ecc44963bb80ca614584b6c7817 upstream.
In gs_can_open() if usb_submit_urb() fails the allocated urb should be released.
--- drivers/net/can/usb/gs_usb.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/can/usb/gs_usb.c +1 -0
@@ -631,6 +631,7 @@ static int gs_can_open(struct net_device rc);usb_unanchor_urb (urb); +usb_free_urb (urb);break ; }
Greg Kroah-Hartman
maintainerPATCH 38/105 can: mcba_usb: fix use-after-free on disconnect
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 4d6636498c41891d0482a914dd570343a838ad79 upstream.
The driver was accessing its driver data after having freed it.
--- drivers/net/can/usb/mcba_usb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/can/usb/mcba_usb.c +1 -2
@@ -887,9 +887,8 @@ static void mcba_usb_disconnect(struct unetdev_info (priv->netdev,"device disconnected\n" );unregister_candev (priv->netdev); -free_candev (priv->netdev); -mcba_urb_unlink (priv); +free_candev (priv->netdev); }static struct usb_driver mcba_usb_driver = {
Greg Kroah-Hartman
maintainerPATCH 39/105 can: peak_usb: fix slab info leak
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit f7a1337f0d29b98733c8824e165fca3371d7d4fd upstream.
Fix a small slab info leak due to a failure to clear the command buffer at allocation.
The first 16 bytes of the command buffer are always sent to the device in pcan_usb_send_cmd() even though only the first two may have been initialised in case no argument payload is provided (e.g. when waiting for a response).
--- drivers/net/can/usb/peak_usb/pcan_usb_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/can/usb/peak_usb/pcan_usb_core.c +1 -1
@@ -776,7 +776,7 @@ static int peak_usb_create_dev(const str dev =netdev_priv (netdev);/* allocate a buffer large enough to send commands */ - dev->cmd_buf =kmalloc (PCAN_USB_MAX_CMD_LEN ,GFP_KERNEL ); + dev->cmd_buf =kzalloc (PCAN_USB_MAX_CMD_LEN ,GFP_KERNEL );if (!dev->cmd_buf) { err = -ENOMEM ; goto lbl_free_candev;
Greg Kroah-Hartman
maintainerPATCH 40/105 configfs: Fix bool initialization/comparison
In reply to Greg Kroah-HartmanFrom: Thomas Meyer <[email protected]>
commit 3f6928c347707a65cee10a9f54b85ad5fb078b3f upstream.
Bool initializations should use true and false. Bool tests don't need comparisons.
--- fs/configfs/file.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
fs/configfs/file.c +6 -6
@@ -166,7 +166,7 @@ configfs_read_bin_file(struct file *file retval = -ETXTBSY ; goto out; } - buffer->read_in_progress =1 ; + buffer->read_in_progress = true;if (buffer->needs_read_fill) {/* perform first read with buf == NULL to get extent */
@@ -325,7 +325,7 @@ configfs_write_bin_file(struct file *fil len = -ETXTBSY ; goto out; } - buffer->write_in_progress =1 ; + buffer->write_in_progress = true;/* buffer grows? */ if (*ppos + count > buffer->bin_buffer_size) {
@@ -429,8 +429,8 @@ static int check_perm(struct inode * ino }mutex_init (&buffer->mutex); buffer->needs_read_fill =1 ; - buffer->read_in_progress =0 ; - buffer->write_in_progress =0 ; + buffer->read_in_progress = false; + buffer->write_in_progress = false; buffer->ops = ops; file->private_data = buffer; goto Done;
@@ -488,10 +488,10 @@ static int configfs_release_bin_file(strssize_t len =0 ;int ret; - buffer->read_in_progress =0 ; + buffer->read_in_progress = false;if (buffer->write_in_progress) { - buffer->write_in_progress =0 ; + buffer->write_in_progress = false; len = bin_attr->write (item, buffer->bin_buffer, buffer->bin_buffer_size);
Greg Kroah-Hartman
maintainerPATCH 41/105 configfs: stash the data we need into configfs_buffer at open time
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit ff4dd081977da56566a848f071aed8fa92d604a1 upstream.
simplifies the ->read()/->write()/->release() instances nicely
--- fs/configfs/file.c | 229 +++++++++++++++++++++-------------------------------- 1 file changed, 95 insertions(+), 134 deletions(-)
fs/configfs/file.c +95 -134
@@ -53,24 +53,18 @@ struct configfs_buffer {bool write_in_progress;char *bin_buffer;int bin_buffer_size; +int cb_max_size; +struct config_item *item; +struct module *owner; +union { +struct configfs_attribute *attr; +struct configfs_bin_attribute *bin_attr; + }; }; -/** -* fill_read_buffer - allocate and fill buffer from item. -* @dentry: dentry pointer. -* @buffer: data buffer for file. -* -* Allocate @buffer->page, if it hasn't been already, then call the -* config_item's show() method to fill the buffer with this attribute's -* data. -* This is called only once, on the file's first read. -*/ -static int fill_read_buffer (struct dentry * dentry,struct configfs_buffer * buffer) +static int fill_read_buffer (struct configfs_buffer * buffer) { -struct configfs_attribute * attr =to_attr (dentry); -struct config_item * item =to_item (dentry->d_parent); -int ret =0 ;ssize_t count;if (!buffer->page)
@@ -78,15 +72,15 @@ static int fill_read_buffer(struct dentrif (!buffer->page)return -ENOMEM ; - count = attr->show (item, buffer->page); + count = buffer->attr->show (buffer->item, buffer->page); +if (count <0 ) +return count; +if (WARN_ON_ONCE (count > (ssize_t )SIMPLE_ATTR_SIZE )) +return -EIO ; -BUG_ON (count > (ssize_t )SIMPLE_ATTR_SIZE ); -if (count >=0 ) { - buffer->needs_read_fill =0 ; - buffer->count = count; - }else - ret = count; -return ret; + buffer->needs_read_fill =0 ; + buffer->count = count; +return 0 ; }/**
@@ -111,12 +105,13 @@ static int fill_read_buffer(struct dentrstatic ssize_t configfs_read_file (struct file *file,char __user *buf,size_t count,loff_t *ppos) { -struct configfs_buffer * buffer = file->private_data; +struct configfs_buffer *buffer = file->private_data;ssize_t retval =0 ;mutex_lock (&buffer->mutex);if (buffer->needs_read_fill) { -if ((retval =fill_read_buffer (file->f_path.dentry,buffer))) + retval =fill_read_buffer (buffer); +if (retval) goto out; } pr_debug("%s: count = %zd, ppos = %lld, buf = %s\n",
@@ -153,9 +148,6 @@ configfs_read_bin_file(struct file *file size_t count, loff_t *ppos) { struct configfs_buffer *buffer = file->private_data; -struct dentry *dentry = file->f_path.dentry; -struct config_item *item =to_item (dentry->d_parent); -struct configfs_bin_attribute *bin_attr =to_bin_attr (dentry);ssize_t retval =0 ;ssize_t len =min_t (size_t, count,PAGE_SIZE );
@@ -170,14 +162,14 @@ configfs_read_bin_file(struct file *fileif (buffer->needs_read_fill) {/* perform first read with buf == NULL to get extent */ - len = bin_attr->read (item,NULL ,0 ); + len = buffer->bin_attr->read (buffer->item,NULL ,0 );if (len <=0 ) { retval = len; goto out; }/* do not exceed the maximum value */ -if (bin_attr->cb_max_size && len > bin_attr->cb_max_size) { +if (buffer->cb_max_size && len > buffer->cb_max_size) { retval = -EFBIG ; goto out; }
@@ -190,7 +182,8 @@ configfs_read_bin_file(struct file *file buffer->bin_buffer_size = len;/* perform second read to fill buffer */ - len = bin_attr->read (item, buffer->bin_buffer, len); + len = buffer->bin_attr->read (buffer->item, + buffer->bin_buffer, len);if (len <0 ) { retval = len;vfree (buffer->bin_buffer);
@@ -240,25 +233,10 @@ fill_write_buffer(struct configfs_bufferreturn error ? -EFAULT : count; } - -/** -* flush_write_buffer - push buffer to config_item. -* @dentry: dentry to the attribute -* @buffer: data buffer for file. -* @count: number of bytes -* -* Get the correct pointers for the config_item and the attribute we're -* dealing with, then call the store() method for the attribute, -* passing the buffer that we acquired in fill_write_buffer(). -*/ -static int -flush_write_buffer (struct dentry * dentry,struct configfs_buffer * buffer,size_t count) +flush_write_buffer (struct configfs_buffer *buffer,size_t count) { -struct configfs_attribute * attr =to_attr (dentry); -struct config_item * item =to_item (dentry->d_parent); - -return attr->store (item, buffer->page, count); +return buffer->attr->store (buffer->item, buffer->page, count); }
@@ -282,13 +260,13 @@ flush_write_buffer(struct dentry * dentrstatic ssize_t configfs_write_file (struct file *file,const char __user *buf,size_t count,loff_t *ppos) { -struct configfs_buffer * buffer = file->private_data; +struct configfs_buffer *buffer = file->private_data;ssize_t len;mutex_lock (&buffer->mutex); len =fill_write_buffer (buffer, buf, count);if (len >0 ) - len =flush_write_buffer (file->f_path.dentry, buffer, len); + len =flush_write_buffer (buffer, len);if (len >0 ) *ppos += len;mutex_unlock (&buffer->mutex);
@@ -313,8 +291,6 @@ configfs_write_bin_file(struct file *fil size_t count, loff_t *ppos) { struct configfs_buffer *buffer = file->private_data; -struct dentry *dentry = file->f_path.dentry; -struct configfs_bin_attribute *bin_attr =to_bin_attr (dentry);void *tbuf =NULL ;ssize_t len;
@@ -330,8 +306,8 @@ configfs_write_bin_file(struct file *fil/* buffer grows? */ if (*ppos + count > buffer->bin_buffer_size) { -if (bin_attr->cb_max_size && - *ppos + count > bin_attr->cb_max_size) { +if (buffer->cb_max_size && + *ppos + count > buffer->cb_max_size) { len = -EFBIG ; goto out; }
@@ -363,31 +339,45 @@ out:return len; } -static int check_perm (struct inode * inode,struct file * file,int type) +static int __configfs_open_file (struct inode *inode,struct file *file,int type) { -struct config_item *item =configfs_get_config_item (file->f_path.dentry->d_parent); -struct configfs_attribute * attr =to_attr (file->f_path.dentry); -struct configfs_bin_attribute *bin_attr =NULL ; -struct configfs_buffer * buffer; -struct configfs_item_operations * ops =NULL ; -int error =0 ; +struct dentry *dentry = file->f_path.dentry; +struct configfs_attribute *attr; +struct configfs_buffer *buffer; +int error; -if (!item || !attr) - goto Einval; + error = -ENOMEM ; + buffer =kzalloc (sizeof (struct configfs_buffer ),GFP_KERNEL ); +if (!buffer) + goto out; -if (type &CONFIGFS_ITEM_BIN_ATTR ) - bin_attr =to_bin_attr (file->f_path.dentry); + error = -EINVAL ; + buffer->item =configfs_get_config_item (dentry->d_parent); +if (!buffer->item) + goto out_free_buffer; + + attr =to_attr (dentry); +if (!attr) + goto out_put_item; + +if (type &CONFIGFS_ITEM_BIN_ATTR ) { + buffer->bin_attr =to_bin_attr (dentry); + buffer->cb_max_size = buffer->bin_attr->cb_max_size; + }else { + buffer->attr = attr; + } + buffer->owner = attr->ca_owner;/* Grab the module reference for this attribute if we have one */ -if (!try_module_get (attr->ca_owner)) { - error = -ENODEV ; - goto Done; - } + error = -ENODEV ; +if (!try_module_get (buffer->owner)) + goto out_put_item; -if (item->ci_type) - ops = item->ci_type->ct_item_ops; -else - goto Eaccess; + error = -EACCES ; +if (!buffer->item->ci_type) + goto out_put_module; + + buffer->ops = buffer->item->ci_type->ct_item_ops;/* File needs write support. * The inode's perms must say it's ok,
@@ -395,13 +385,11 @@ static int check_perm(struct inode * ino*/ if (file->f_mode &FMODE_WRITE ) {if (!(inode->i_mode &S_IWUGO )) - goto Eaccess; - + goto out_put_module;if ((type &CONFIGFS_ITEM_ATTR ) && !attr->store) - goto Eaccess; - -if ((type &CONFIGFS_ITEM_BIN_ATTR ) && !bin_attr->write) - goto Eaccess; + goto out_put_module; +if ((type &CONFIGFS_ITEM_BIN_ATTR ) && !buffer->bin_attr->write) + goto out_put_module; }/* File needs read support.
@@ -410,90 +398,65 @@ static int check_perm(struct inode * ino*/ if (file->f_mode &FMODE_READ ) {if (!(inode->i_mode &S_IRUGO )) - goto Eaccess; - + goto out_put_module;if ((type &CONFIGFS_ITEM_ATTR ) && !attr->show) - goto Eaccess; - -if ((type &CONFIGFS_ITEM_BIN_ATTR ) && !bin_attr->read) - goto Eaccess; + goto out_put_module; +if ((type &CONFIGFS_ITEM_BIN_ATTR ) && !buffer->bin_attr->read) + goto out_put_module; } -/* No error? Great, allocate a buffer for the file, and store it -* it in file->private_data for easy access. -*/ - buffer =kzalloc (sizeof (struct configfs_buffer ),GFP_KERNEL ); -if (!buffer) { - error = -ENOMEM ; - goto Enomem; - }mutex_init (&buffer->mutex); buffer->needs_read_fill =1 ; buffer->read_in_progress = false; buffer->write_in_progress = false; - buffer->ops = ops; file->private_data = buffer; - goto Done; +return 0 ; - Einval: - error = -EINVAL ; - goto Done; - Eaccess: - error = -EACCES ; - Enomem: -module_put (attr->ca_owner); - Done: -if (error && item) -config_item_put (item); +out_put_module: +module_put (buffer->owner); +out_put_item: +config_item_put (buffer->item); +out_free_buffer: +kfree (buffer); +out:return error; }static int configfs_release (struct inode *inode,struct file *filp) { -struct config_item * item =to_item (filp->f_path.dentry->d_parent); -struct configfs_attribute * attr =to_attr (filp->f_path.dentry); -struct module * owner = attr->ca_owner; -struct configfs_buffer * buffer = filp->private_data; - -if (item) -config_item_put (item); -/* After this point, attr should not be accessed. */ -module_put (owner); - -if (buffer) { -if (buffer->page) -free_page ((unsigned long )buffer->page); -mutex_destroy (&buffer->mutex); -kfree (buffer); - } +struct configfs_buffer *buffer = filp->private_data; + +if (buffer->item) +config_item_put (buffer->item); +module_put (buffer->owner); +if (buffer->page) +free_page ((unsigned long )buffer->page); +mutex_destroy (&buffer->mutex); +kfree (buffer);return 0 ; }static int configfs_open_file (struct inode *inode,struct file *filp) { -return check_perm (inode, filp,CONFIGFS_ITEM_ATTR ); +return __configfs_open_file (inode, filp,CONFIGFS_ITEM_ATTR ); }static int configfs_open_bin_file (struct inode *inode,struct file *filp) { -return check_perm (inode, filp,CONFIGFS_ITEM_BIN_ATTR ); +return __configfs_open_file (inode, filp,CONFIGFS_ITEM_BIN_ATTR ); } -static int configfs_release_bin_file (struct inode *inode,struct file *filp) +static int configfs_release_bin_file (struct inode *inode,struct file *file) { -struct configfs_buffer *buffer = filp->private_data; -struct dentry *dentry = filp->f_path.dentry; -struct config_item *item =to_item (dentry->d_parent); -struct configfs_bin_attribute *bin_attr =to_bin_attr (dentry); -ssize_t len =0 ; -int ret; +struct configfs_buffer *buffer = file->private_data; buffer->read_in_progress = false;if (buffer->write_in_progress) { buffer->write_in_progress = false; - len = bin_attr->write (item, buffer->bin_buffer, +/* result of ->release() is ignored */ + buffer->bin_attr->write (buffer->item, buffer->bin_buffer, buffer->bin_buffer_size);/* vfree on NULL is safe */
@@ -503,10 +466,8 @@ static int configfs_release_bin_file(str buffer->needs_read_fill =1 ; } - ret =configfs_release (inode, filp); -if (len <0 ) -return len; -return ret; +configfs_release (inode, file); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 42/105 configfs_register_group() shouldnt be (and isnt) called in rmdirable parts
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit f19e4ed1e1edbfa3c9ccb9fed17759b7d6db24c6 upstream.
revert cc57c07343bd "configfs: fix registered group removal" It was an attempt to handle something that fundamentally doesn't work - configfs_register_group() should never be done in a part of tree that can be rmdir'ed. And in mainline it never had been, so let's not borrow trouble; the fix was racy anyway, it would take a lot more to make that work and desired semantics is not clear.
--- fs/configfs/dir.c | 11 ----------- 1 file changed, 11 deletions(-)
fs/configfs/dir.c +0 -11
@@ -1782,16 +1782,6 @@ void configfs_unregister_group(struct costruct dentry *dentry = group->cg_item.ci_dentry;struct dentry *parent = group->cg_item.ci_parent->ci_dentry; -mutex_lock (&subsys->su_mutex); -if (!group->cg_item.ci_parent->ci_group) { -/* -* The parent has already been unlinked and detached -* due to a rmdir. -*/ - goto unlink_group; - } -mutex_unlock (&subsys->su_mutex); -inode_lock_nested (d_inode (parent),I_MUTEX_PARENT );spin_lock (&configfs_dirent_lock);configfs_detach_prep (dentry,NULL );
@@ -1806,7 +1796,6 @@ void configfs_unregister_group(struct codput (dentry);mutex_lock (&subsys->su_mutex); -unlink_group:unlink_group (group);mutex_unlock (&subsys->su_mutex); }
Greg Kroah-Hartman
maintainerPATCH 43/105 configfs: new object reprsenting tree fragments
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit 47320fbe11a6059ae502c9c16b668022fdb4cf76 upstream.
Refcounted, hangs of configfs_dirent, created by operations that add fragments to configfs tree (mkdir and configfs_register_{subsystem,group}). Will be used in the next commit to provide exclusion between fragment removal and ->show/->store calls.
--- fs/configfs/configfs_internal.h | 15 ++++- fs/configfs/dir.c | 105 +++++++++++++++++++++++++++++++--------- fs/configfs/file.c | 4 - 3 files changed, 97 insertions(+), 27 deletions(-)
fs/configfs/configfs_internal.h +13 -2
@@ -34,6 +34,15 @@#include <linux/list.h> #include <linux/spinlock.h> +struct configfs_fragment { +atomic_t frag_count; +struct rw_semaphore frag_sem; +bool frag_dead; +}; + +void put_fragment (struct configfs_fragment *); +struct configfs_fragment *get_fragment (struct configfs_fragment *); +struct configfs_dirent {atomic_t s_count;int s_dependent_count;
@@ -48,6 +57,7 @@ struct configfs_dirent {#ifdef CONFIG_LOCKDEP int s_depth;#endif +struct configfs_fragment *s_frag; };#define CONFIGFS_ROOT 0x0001
@@ -75,8 +85,8 @@ extern int configfs_create(struct dentryextern int configfs_create_file (struct config_item *,const struct configfs_attribute *);extern int configfs_create_bin_file (struct config_item *,const struct configfs_bin_attribute *); -extern int configfs_make_dirent (struct configfs_dirent *, -struct dentry *,void *,umode_t ,int ); +extern int configfs_make_dirent (struct configfs_dirent *,struct dentry *, +void *,umode_t ,int ,struct configfs_fragment *);extern int configfs_dirent_is_ready (struct configfs_dirent *);extern void configfs_hash_and_remove (struct dentry * dir,const char * name);
@@ -151,6 +161,7 @@ static inline void release_configfs_dire {if (!(sd->s_type &CONFIGFS_ROOT )) {kfree (sd->s_iattr); +put_fragment (sd->s_frag);kmem_cache_free (configfs_dir_cachep, sd); } }
fs/configfs/dir.c +82 -23
281 lines not on this page · raw message
fs/configfs/file.c +2 -2
@@ -502,7 +502,7 @@ int configfs_create_file(struct config_iinode_lock_nested (d_inode (dir),I_MUTEX_NORMAL ); error =configfs_make_dirent (parent_sd,NULL , (void *) attr, mode, -CONFIGFS_ITEM_ATTR ); +CONFIGFS_ITEM_ATTR , parent_sd->s_frag);inode_unlock (d_inode (dir));return error;
@@ -524,7 +524,7 @@ int configfs_create_bin_file(struct confinode_lock_nested (dir->d_inode,I_MUTEX_NORMAL ); error =configfs_make_dirent (parent_sd,NULL , (void *) bin_attr, mode, -CONFIGFS_ITEM_BIN_ATTR ); +CONFIGFS_ITEM_BIN_ATTR , parent_sd->s_frag);inode_unlock (dir->d_inode);return error;
Greg Kroah-Hartman
maintainerPATCH 44/105 configfs: provide exclusion between IO and removals
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit b0841eefd9693827afb9888235e26ddd098f9cef upstream.
Make sure that attribute methods are not called after the item has been removed from the tree. To do so, we
* at the point of no return in removals, grab ->frag_sem
exclusive and mark the fragment dead.
* call the methods of attributes with ->frag_sem taken
shared and only after having verified that the fragment is still alive.
The main benefit is for method instances - they are
guaranteed that the objects they are accessing *and* all ancestors are still there. Another win is that we don't need to bother with extra refcount on config_item when opening a file - the item will be alive for as long as it stays in the tree, and we won't touch it/attributes/any associated data after it's been removed from the tree.
--- fs/configfs/dir.c | 23 ++++++++++++++++ fs/configfs/file.c | 75 ++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 80 insertions(+), 18 deletions(-)
fs/configfs/dir.c +23 -0
@@ -1474,6 +1474,7 @@ static int configfs_rmdir(struct inode *struct config_item *item;struct configfs_subsystem *subsys;struct configfs_dirent *sd; +struct configfs_fragment *frag;struct module *subsys_owner =NULL , *dead_item_owner =NULL ;int ret;
@@ -1531,6 +1532,16 @@ static int configfs_rmdir(struct inode * } }while (ret == -EAGAIN ); + frag = sd->s_frag; +if (down_write_killable (&frag->frag_sem)) { +spin_lock (&configfs_dirent_lock); +configfs_detach_rollback (dentry); +spin_unlock (&configfs_dirent_lock); +return -EINTR ; + } + frag->frag_dead = true; +up_write (&frag->frag_sem); +/* Get a working ref for the duration of this function */ item =configfs_get_config_item (dentry);
@@ -1832,6 +1843,12 @@ void configfs_unregister_group(struct costruct configfs_subsystem *subsys = group->cg_subsys;struct dentry *dentry = group->cg_item.ci_dentry;struct dentry *parent = group->cg_item.ci_parent->ci_dentry; +struct configfs_dirent *sd = dentry->d_fsdata; +struct configfs_fragment *frag = sd->s_frag; + +down_write (&frag->frag_sem); + frag->frag_dead = true; +up_write (&frag->frag_sem);inode_lock_nested (d_inode (parent),I_MUTEX_PARENT );spin_lock (&configfs_dirent_lock);
@@ -1957,12 +1974,18 @@ void configfs_unregister_subsystem(strucstruct config_group *group = &subsys->su_group;struct dentry *dentry = group->cg_item.ci_dentry;struct dentry *root = dentry->d_sb->s_root; +struct configfs_dirent *sd = dentry->d_fsdata; +struct configfs_fragment *frag = sd->s_frag;if (dentry->d_parent != root) {pr_err ("Tried to unregister non-subsystem!\n" );return ; } +down_write (&frag->frag_sem); + frag->frag_dead = true; +up_write (&frag->frag_sem); +inode_lock_nested (d_inode (root),I_MUTEX_PARENT );inode_lock_nested (d_inode (dentry),I_MUTEX_CHILD );
fs/configfs/file.c +57 -18
169 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 45/105 configfs: fix a deadlock in configfs_symlink()
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit 351e5d869e5ac10cb40c78b5f2d7dfc816ad4587 upstream.
Configfs abuses symlink(2). Unlike the normal filesystems, it wants the target resolved at symlink(2) time, like link(2) would've done. The problem is that ->symlink() is called with the parent directory locked exclusive, so resolving the target inside the ->symlink() is easily deadlocked.
Short of really ugly games in sys_symlink() itself, all we can do is to unlock the parent before resolving the target and relock it after. However, that invalidates the checks done by the caller of ->symlink(), so we have to
* check that dentry is still where it used to be
(it couldn't have been moved, but it could've been unhashed)
* recheck that it's still negative (somebody else
might've successfully created a symlink with the same name while we were looking the target up)
* recheck the permissions on the parent directory.
--- fs/configfs/symlink.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-)
fs/configfs/symlink.c +32 -1
@@ -157,11 +157,42 @@ int configfs_symlink(struct inode *dir, !type->ct_item_ops->allow_link) goto out_put; +/* +* This is really sick. What they wanted was a hybrid of +* link(2) and symlink(2) - they wanted the target resolved +* at syscall time (as link(2) would've done), be a directory +* (which link(2) would've refused to do) *AND* be a deep +* fucking magic, making the target busy from rmdir POV. +* symlink(2) is nothing of that sort, and the locking it +* gets matches the normal symlink(2) semantics. Without +* attempts to resolve the target (which might very well +* not even exist yet) done prior to locking the parent +* directory. This perversion, OTOH, needs to resolve +* the target, which would lead to obvious deadlocks if +* attempted with any directories locked. +* +* Unfortunately, that garbage is userland ABI and we should've +* said "no" back in 2005. Too late now, so we get to +* play very ugly games with locking. +* +* Try *ANYTHING* of that sort in new code, and you will +* really regret it. Just ask yourself - what could a BOFH +* do to me and do I want to find it out first-hand? +* +* AV, a thoroughly annoyed bastard. +*/ +inode_unlock (dir); ret =get_target (symname, &path, &target_item, dentry->d_sb); +inode_lock (dir);if (ret) goto out_put; - ret = type->ct_item_ops->allow_link (parent_item, target_item); +if (dentry->d_inode ||d_unhashed (dentry)) + ret = -EEXIST ; +else + ret =inode_permission (dir,MAY_WRITE |MAY_EXEC ); +if (!ret) + ret = type->ct_item_ops->allow_link (parent_item, target_item);if (!ret) {mutex_lock (&configfs_symlink_mutex); ret =create_link (parent_item, target_item, dentry);
Greg Kroah-Hartman
maintainerPATCH 46/105 usb: dwc3: Allow disabling of metastability workaround
In reply to Greg Kroah-HartmanFrom: Roger Quadros <[email protected]>
commit 42bf02ec6e420e541af9a47437d0bdf961ca2972 upstream
Some platforms (e.g. TI's DRA7 USB2 instance) have more trouble with the metastability workaround as it supports only a High-Speed PHY and the PHY can enter into an Erratic state [1] when the controller is set in SuperSpeed mode as part of the metastability workaround.
This causes upto 2 seconds delay in enumeration on DRA7's USB2 instance in gadget mode.
If these platforms can be better off without the workaround, provide a device tree property to suggest that so the workaround is avoided.
[1] Device mode enumeration trace showing PHY Erratic Error.
irq/90-dwc3-969 [000] d... 52.323145: dwc3_event: event (00000901): Erratic Error [U0]
irq/90-dwc3-969 [000] d... 52.560646: dwc3_event: event (00000901): Erratic Error [U0]
irq/90-dwc3-969 [000] d... 52.798144: dwc3_event: event (00000901): Erratic Error [U0]--- Documentation/devicetree/bindings/usb/dwc3.txt | 2 ++ drivers/usb/dwc3/core.c | 3 +++ drivers/usb/dwc3/core.h | 3 +++ drivers/usb/dwc3/gadget.c | 6 ++++-- 4 files changed, 12 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/usb/dwc3.txt +2 -0
@@ -47,6 +47,8 @@ Optional properties: from P0 to P1/P2/P3 without delay. - snps,dis-tx-ipgap-linecheck-quirk: when set, disable u2mac linestate check during HS transmit. + - snps,dis_metastability_quirk: when set, disable metastability workaround. + CAUTION: use only if you are absolutely sure of it. - snps,is-utmi-l1-suspend: true when DWC3 asserts output signal utmi_l1_suspend_n, false when asserts utmi_sleep_n - snps,hird-threshold: HIRD threshold
drivers/usb/dwc3/core.c +3 -0
@@ -1115,6 +1115,9 @@ static void dwc3_get_properties(struct ddevice_property_read_u32 (dev,"snps,quirk-frame-length-adjustment" , &dwc->fladj); + dwc->dis_metastability_quirk =device_property_read_bool (dev, +"snps,dis_metastability_quirk" ); + dwc->lpm_nyet_threshold = lpm_nyet_threshold; dwc->tx_de_emphasis = tx_de_emphasis;
drivers/usb/dwc3/core.h +3 -0
@@ -869,6 +869,7 @@ struct dwc3_scratchpad_array {* 1 - -3.5dB de-emphasis * 2 - No de-emphasis * 3 - Reserved +* @dis_metastability_quirk: set to disable metastability quirk. * @imod_interval: set the interrupt moderation interval in 250ns * increments or 0 to disable. */
@@ -1025,6 +1026,8 @@ struct dwc3 { unsigned tx_de_emphasis_quirk:1; unsigned tx_de_emphasis:2; + unsigned dis_metastability_quirk:1; +u16 imod_interval; };
drivers/usb/dwc3/gadget.c +4 -2
@@ -2034,7 +2034,8 @@ static void dwc3_gadget_set_speed(struct* STAR#9000525659: Clock Domain Crossing on DCTL in * USB 2.0 Mode */ -if (dwc->revision <DWC3_REVISION_220A ) { +if (dwc->revision <DWC3_REVISION_220A && + !dwc->dis_metastability_quirk) { reg |=DWC3_DCFG_SUPERSPEED ; }else {switch (speed) {
@@ -3265,7 +3266,8 @@ int dwc3_gadget_init(struct dwc3 *dwc)* is less than super speed because we don't have means, yet, to tell * composite.c that we are USB 2.0 + LPM ECN. */ -if (dwc->revision <DWC3_REVISION_220A ) +if (dwc->revision <DWC3_REVISION_220A && + !dwc->dis_metastability_quirk)dev_info (dwc->dev,"changing max_speed on rev %08x\n" , dwc->revision);
Greg Kroah-Hartman
maintainerPATCH 47/105 mfd: palmas: Assign the right powerhold mask for tps65917
In reply to Greg Kroah-HartmanFrom: Keerthy <[email protected]>
commit 572ff4d560be3784205b224cd67d6715620092d7 upstream
The powerhold mask for TPS65917 is different when comapred to the other palmas versions. Hence assign the right mask that enables power off of tps65917 pmic correctly.
--- drivers/mfd/palmas.c | 10 +++++++++- include/linux/mfd/palmas.h | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-)
drivers/mfd/palmas.c +9 -1
@@ -430,6 +430,7 @@ static void palmas_power_off(void) {unsigned int addr;int ret, slave; +u8 powerhold_mask;struct device_node *np = palmas_dev->dev->of_node;if (of_property_read_bool (np,"ti,palmas-override-powerhold" )) {
@@ -437,8 +438,15 @@ static void palmas_power_off(void) PALMAS_PRIMARY_SECONDARY_PAD2); slave =PALMAS_BASE_TO_SLAVE (PALMAS_PU_PD_OD_BASE ); +if (of_device_is_compatible (np,"ti,tps65917" )) + powerhold_mask = +TPS65917_PRIMARY_SECONDARY_PAD2_GPIO_5_MASK ; +else + powerhold_mask = +PALMAS_PRIMARY_SECONDARY_PAD2_GPIO_7_MASK ; + ret =regmap_update_bits (palmas_dev->regmap[slave], addr, -PALMAS_PRIMARY_SECONDARY_PAD2_GPIO_7_MASK ,0 ); + powerhold_mask,0 );if (ret) dev_err(palmas_dev->dev, "Unable to write PRIMARY_SECONDARY_PAD2 %d\n",
include/linux/mfd/palmas.h +3 -0
@@ -3733,6 +3733,9 @@ enum usb_irq_events {#define TPS65917_REGEN3_CTRL_MODE_ACTIVE 0x01#define TPS65917_REGEN3_CTRL_MODE_ACTIVE_SHIFT 0x00 +/* POWERHOLD Mask field for PRIMARY_SECONDARY_PAD2 register */ +#define TPS65917_PRIMARY_SECONDARY_PAD2_GPIO_5_MASK 0xC +/* Registers for function RESOURCE */ #define TPS65917_REGEN1_CTRL 0x2#define TPS65917_PLLEN_CTRL 0x3
Greg Kroah-Hartman
maintainerPATCH 48/105 ASoC: tlv320aic31xx: Handle inverted BCLK in non-DSP modes
In reply to Greg Kroah-HartmanFrom: "Andrew F. Davis" <[email protected]>
commit dcb407b257af06fa58b0544ec01ec9e0d3927e02 upstream
Currently BCLK inverting is only handled when the DAI format is DSP, but the BCLK may be inverted in any supported mode. Without this using this CODEC in any other mode than DSP with the BCLK inverted leads to bad sampling timing and very poor audio quality.
--- sound/soc/codecs/tlv320aic31xx.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
sound/soc/codecs/tlv320aic31xx.c +18 -10
@@ -924,6 +924,18 @@ static int aic31xx_set_dai_fmt(struct snreturn -EINVAL ; } +/* signal polarity */ +switch (fmt &SND_SOC_DAIFMT_INV_MASK ) { +case SND_SOC_DAIFMT_NB_NF : +break ; +case SND_SOC_DAIFMT_IB_NF : + iface_reg2 |=AIC31XX_BCLKINV_MASK ; +break ; +default : +dev_err (codec->dev,"Invalid DAI clock signal polarity\n" ); +return -EINVAL ; + } +/* interface format */ switch (fmt &SND_SOC_DAIFMT_FORMAT_MASK ) {case SND_SOC_DAIFMT_I2S :
@@ -931,16 +943,12 @@ static int aic31xx_set_dai_fmt(struct sncase SND_SOC_DAIFMT_DSP_A : dsp_a_val =0x1 ;case SND_SOC_DAIFMT_DSP_B : -/* NOTE: BCLKINV bit value 1 equas NB and 0 equals IB */ -switch (fmt &SND_SOC_DAIFMT_INV_MASK ) { -case SND_SOC_DAIFMT_NB_NF : - iface_reg2 |=AIC31XX_BCLKINV_MASK ; -break ; -case SND_SOC_DAIFMT_IB_NF : -break ; -default : -return -EINVAL ; - } +/* +* NOTE: This CODEC samples on the falling edge of BCLK in +* DSP mode, this is inverted compared to what most DAIs +* expect, so we invert for this mode +*/ + iface_reg2 ^=AIC31XX_BCLKINV_MASK ; iface_reg1 |= (AIC31XX_DSP_MODE <<AIC31XX_IFACE1_DATATYPE_SHIFT );break ;
Greg Kroah-Hartman
maintainerPATCH 49/105 mtd: spi-nor: enable 4B opcodes for mx66l51235l
In reply to Greg Kroah-HartmanFrom: Roman Yeryomin <[email protected]>
commit d342b6a973af459f6104cad6effc8efc71a0558d upstream
--- drivers/mtd/spi-nor/spi-nor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/spi-nor/spi-nor.c +1 -1
@@ -1030,7 +1030,7 @@ static const struct flash_info spi_nor_i { "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) }, { "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) }, - { "mx66l51235l", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { "mx66l51235l", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, { "mx66u51235f", INFO(0xc2253a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, { "mx66l1g45g", INFO(0xc2201b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { "mx66l1g55g", INFO(0xc2261b, 0, 64 * 1024, 2048, SPI_NOR_QUAD_READ) },
Greg Kroah-Hartman
maintainerPATCH 50/105 mtd: spi-nor: cadence-quadspi: add a delay in write sequence
In reply to Greg Kroah-HartmanFrom: Vignesh R <[email protected]>
commit 61dc8493bae9ba82a1c72edbc6c6065f6a94456a upstream
As per 66AK2G02 TRM[1] SPRUHY8F section 11.15.5.3 Indirect Access Controller programming sequence, a delay equal to couple of QSPI master clock(~5ns) is required after setting CQSPI_REG_INDIRECTWR_START bit and writing data to the flash. Introduce a quirk flag CQSPI_NEEDS_WR_DELAY to handle this and set this flag for TI 66AK2G SoC.
[1]http://www.ti.com/lit/ug/spruhy8f/spruhy8f.pdf
--- drivers/mtd/spi-nor/cadence-quadspi.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
drivers/mtd/spi-nor/cadence-quadspi.c +26 -1
@@ -38,6 +38,9 @@#define CQSPI_NAME "cadence-qspi"#define CQSPI_MAX_CHIPSELECT 16 +/* Quirks */ +#define CQSPI_NEEDS_WR_DELAY BIT(0) +struct cqspi_st ;struct cqspi_flash_pdata {
@@ -76,6 +79,7 @@ struct cqspi_st {u32 fifo_depth;u32 fifo_width;u32 trigger_address; +u32 wr_delay;struct cqspi_flash_pdata f_pdata[CQSPI_MAX_CHIPSELECT ]; };
@@ -623,6 +627,15 @@ static int cqspi_indirect_write_execute(reinit_completion (&cqspi->transfer_complete);writel (CQSPI_REG_INDIRECTWR_START_MASK , reg_base +CQSPI_REG_INDIRECTWR ); +/* +* As per 66AK2G02 TRM SPRUHY8F section 11.15.5.3 Indirect Access +* Controller programming sequence, couple of cycles of +* QSPI_REF_CLK delay is required for the above bit to +* be internally synchronized by the QSPI module. Provide 5 +* cycles of delay. +*/ +if (cqspi->wr_delay) +ndelay (cqspi->wr_delay);while (remaining >0 ) {size_t write_words, mod_bytes;
@@ -1184,6 +1197,7 @@ static int cqspi_probe(struct platform_dstruct cqspi_st *cqspi;struct resource *res;struct resource *res_ahb; +unsigned long data;int ret;int irq;
@@ -1241,6 +1255,10 @@ static int cqspi_probe(struct platform_d } cqspi->master_ref_clk_hz =clk_get_rate (cqspi->clk); + data = (unsigned long )of_device_get_match_data (dev); +if (data &CQSPI_NEEDS_WR_DELAY ) + cqspi->wr_delay =5 *DIV_ROUND_UP (NSEC_PER_SEC , + cqspi->master_ref_clk_hz); ret =devm_request_irq (dev, irq, cqspi_irq_handler,0 , pdev->name, cqspi);
@@ -1312,7 +1330,14 @@ static const struct dev_pm_ops cqspi__de#endif static const struct of_device_id cqspi_dt_ids[] = { - {.compatible ="cdns,qspi-nor" ,}, + { + .compatible ="cdns,qspi-nor" , + .data = (void *)0 , + }, + { + .compatible ="ti,k2g-qspi" , + .data = (void *)CQSPI_NEEDS_WR_DELAY , + }, {/* end of table */ } };
Greg Kroah-Hartman
maintainerPATCH 51/105 misc: pci_endpoint_test: Prevent some integer overflows
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 378f79cab12b669928f3a4037f023837ead2ce0c upstream
"size + max" can have an arithmetic overflow when we're allocating:
orig_src_addr = dma_alloc_coherent(dev, size + alignment, ...
I've added a few checks to prevent that.
--- drivers/misc/pci_endpoint_test.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/misc/pci_endpoint_test.c +9 -0
@@ -226,6 +226,9 @@ static bool pci_endpoint_test_copy(strucu32 src_crc32;u32 dst_crc32; +if (size >SIZE_MAX - alignment) + goto err; + orig_src_addr =dma_alloc_coherent (dev, size + alignment, &orig_src_phys_addr,GFP_KERNEL );if (!orig_src_addr) {
@@ -311,6 +314,9 @@ static bool pci_endpoint_test_write(strusize_t alignment = test->alignment;u32 crc32; +if (size >SIZE_MAX - alignment) + goto err; + orig_addr =dma_alloc_coherent (dev, size + alignment, &orig_phys_addr,GFP_KERNEL );if (!orig_addr) {
@@ -369,6 +375,9 @@ static bool pci_endpoint_test_read(strucsize_t alignment = test->alignment;u32 crc32; +if (size >SIZE_MAX - alignment) + goto err; + orig_addr =dma_alloc_coherent (dev, size + alignment, &orig_phys_addr,GFP_KERNEL );if (!orig_addr) {
Greg Kroah-Hartman
maintainerPATCH 52/105 PCI: dra7xx: Add shutdown handler to cleanly turn off clocks
In reply to Greg Kroah-HartmanFrom: Keerthy <[email protected]>
commit 9c049bea083fea21373b8baf51fe49acbe24e105 upstream
Add shutdown handler to cleanly turn off clocks. This will help in cases of kexec where in a new kernel can boot abruptly.
--- drivers/pci/dwc/pci-dra7xx.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
drivers/pci/dwc/pci-dra7xx.c +17 -0
@@ -817,6 +817,22 @@ static int dra7xx_pcie_resume_noirq(stru }#endif +void dra7xx_pcie_shutdown (struct platform_device *pdev) +{ +struct device *dev = &pdev->dev; +struct dra7xx_pcie *dra7xx =dev_get_drvdata (dev); +int ret; + +dra7xx_pcie_stop_link (dra7xx->pci); + + ret =pm_runtime_put_sync (dev); +if (ret <0 ) +dev_dbg (dev,"pm_runtime_put_sync failed\n" ); + +pm_runtime_disable (dev); +dra7xx_pcie_disable_phy (dra7xx); +} +static const struct dev_pm_ops dra7xx_pcie_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(dra7xx_pcie_suspend, dra7xx_pcie_resume) SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(dra7xx_pcie_suspend_noirq,
@@ -830,5 +846,6 @@ static struct platform_driver dra7xx_pci .suppress_bind_attrs = true, .pm = &dra7xx_pcie_pm_ops, }, + .shutdown = dra7xx_pcie_shutdown, };builtin_platform_driver_probe (dra7xx_pcie_driver, dra7xx_pcie_probe);
Greg Kroah-Hartman
maintainerPATCH 53/105 misc: pci_endpoint_test: Fix BUG_ON error during pci_disable_msi()
In reply to Greg Kroah-HartmanFrom: Kishon Vijay Abraham I <[email protected]>
commit b7636e816adcb52bc96b6fb7bc9d141cbfd17ddb upstream
pci_disable_msi() throws a Kernel BUG if the driver has successfully requested an IRQ and not released it. Fix it here by freeing IRQs before invoking pci_disable_msi().
--- drivers/misc/pci_endpoint_test.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/misc/pci_endpoint_test.c +8 -0
@@ -92,6 +92,7 @@ struct pci_endpoint_test {void __iomem *bar[6 ];struct completion irq_raised;int last_irq; +int num_irqs;/* mutex to protect the ioctls */ struct mutex mutex;struct miscdevice miscdev;
@@ -514,6 +515,7 @@ static int pci_endpoint_test_probe(struc irq =pci_alloc_irq_vectors (pdev,1 ,32 ,PCI_IRQ_MSI );if (irq <0 )dev_err (dev,"failed to get MSI interrupts\n" ); + test->num_irqs = irq; } err = devm_request_irq(dev, pdev->irq, pci_endpoint_test_irqhandler,
@@ -581,6 +583,9 @@ err_iounmap:pci_iounmap (pdev, test->bar[bar]); } +for (i =0 ; i < irq; i++) +devm_free_irq (dev, pdev->irq + i, test); + err_disable_msi:pci_disable_msi (pdev);pci_release_regions (pdev);
@@ -594,6 +599,7 @@ err_disable_pdev:static void pci_endpoint_test_remove (struct pci_dev *pdev) {int id; +int i;enum pci_barno bar;struct pci_endpoint_test *test =pci_get_drvdata (pdev);struct miscdevice *misc_device = &test->miscdev;
@@ -609,6 +615,8 @@ static void pci_endpoint_test_remove(strif (test->bar[bar])pci_iounmap (pdev, test->bar[bar]); } +for (i =0 ; i < test->num_irqs; i++) +devm_free_irq (&pdev->dev, pdev->irq + i, test);pci_disable_msi (pdev);pci_release_regions (pdev);pci_disable_device (pdev);
Greg Kroah-Hartman
maintainerPATCH 54/105 mailbox: reset txdone_method TXDONE_BY_POLL if client knows_txdone
In reply to Greg Kroah-HartmanFrom: Sudeep Holla <[email protected]>
commit 33cd7123ac0ba5360656ae27db453de5b9aa711f upstream
Currently the mailbox framework sets txdone_method to TXDONE_BY_POLL if the controller sets txdone_by_poll. However some clients can have a mechanism to do TXDONE_BY_ACK which they can specify by knows_txdone. However, we endup setting both TXDONE_BY_POLL and TXDONE_BY_ACK in that case. In such scenario, we may end up with below warnings as the tx ticker is run both by mailbox framework and the client.
WARNING: CPU: 1 PID: 0 at kernel/time/hrtimer.c:805 hrtimer_forward+0x88/0xd8 CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.12.0-rc5 #242 Hardware name: ARM LTD ARM Juno Development Platform task: ffff8009768ca700 task.stack: ffff8009768f8000 PC is at hrtimer_forward+0x88/0xd8 LR is at txdone_hrtimer+0xd4/0xf8 Call trace: hrtimer_forward+0x88/0xd8 __hrtimer_run_queues+0xe4/0x158 hrtimer_interrupt+0xa4/0x220 arch_timer_handler_phys+0x30/0x40 handle_percpu_devid_irq+0x78/0x130 generic_handle_irq+0x24/0x38 __handle_domain_irq+0x5c/0xb8 gic_handle_irq+0x54/0xa8
This patch fixes the issue by resetting TXDONE_BY_POLL if client has set knows_txdone.
--- drivers/mailbox/mailbox.c | 4 ++-- drivers/mailbox/pcc.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/mailbox/mailbox.c +2 -2
@@ -351,7 +351,7 @@ struct mbox_chan *mbox_request_channel(sinit_completion (&chan->tx_complete);if (chan->txdone_method ==TXDONE_BY_POLL && cl->knows_txdone) - chan->txdone_method |=TXDONE_BY_ACK ; + chan->txdone_method =TXDONE_BY_ACK ;spin_unlock_irqrestore (&chan->lock, flags);
@@ -420,7 +420,7 @@ void mbox_free_channel(struct mbox_chanspin_lock_irqsave (&chan->lock, flags); chan->cl =NULL ; chan->active_req =NULL ; -if (chan->txdone_method == (TXDONE_BY_POLL |TXDONE_BY_ACK )) +if (chan->txdone_method ==TXDONE_BY_ACK ) chan->txdone_method =TXDONE_BY_POLL ;module_put (chan->mbox->dev->driver->owner);
drivers/mailbox/pcc.c +2 -2
@@ -266,7 +266,7 @@ struct mbox_chan *pcc_mbox_request_channinit_completion (&chan->tx_complete);if (chan->txdone_method ==TXDONE_BY_POLL && cl->knows_txdone) - chan->txdone_method |=TXDONE_BY_ACK ; + chan->txdone_method =TXDONE_BY_ACK ;spin_unlock_irqrestore (&chan->lock, flags);
@@ -312,7 +312,7 @@ void pcc_mbox_free_channel(struct mbox_cspin_lock_irqsave (&chan->lock, flags); chan->cl =NULL ; chan->active_req =NULL ; -if (chan->txdone_method == (TXDONE_BY_POLL |TXDONE_BY_ACK )) +if (chan->txdone_method ==TXDONE_BY_ACK ) chan->txdone_method =TXDONE_BY_POLL ;spin_unlock_irqrestore (&chan->lock, flags);
Greg Kroah-Hartman
maintainerPATCH 55/105 ASoC: tlv320dac31xx: mark expected switch fall-through
In reply to Greg Kroah-HartmanFrom: "Gustavo A. R. Silva" <[email protected]>
commit 09fc38c1af4cb888255e9ecf267bf9757c12885d upstream
In preparation to enabling -Wimplicit-fallthrough, mark switch cases where we are expecting to fall through.
Addresses-Coverity-ID: 1195220
--- sound/soc/codecs/tlv320aic31xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/codecs/tlv320aic31xx.c +1 -1
@@ -941,7 +941,7 @@ static int aic31xx_set_dai_fmt(struct sncase SND_SOC_DAIFMT_I2S :break ;case SND_SOC_DAIFMT_DSP_A : - dsp_a_val =0x1 ; + dsp_a_val =0x1 ;/* fall through */ case SND_SOC_DAIFMT_DSP_B :/* * NOTE: This CODEC samples on the falling edge of BCLK in
Greg Kroah-Hartman
maintainerPATCH 56/105 ASoC: davinci-mcasp: Handle return value of devm_kasprintf
In reply to Greg Kroah-HartmanFrom: Arvind Yadav <[email protected]>
commit 0c8b794c4a10aaf7ac0d4a49be2b2638e2038adb upstream
devm_kasprintf() can fail here and we must check its return value.
--- sound/soc/davinci/davinci-mcasp.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
sound/soc/davinci/davinci-mcasp.c +12 -0
@@ -1894,6 +1894,10 @@ static int davinci_mcasp_probe(struct plif (irq >=0 ) { irq_name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"%s_common" ,dev_name (&pdev->dev)); +if (!irq_name) { + ret = -ENOMEM ; + goto err; + } ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, davinci_mcasp_common_irq_handler, IRQF_ONESHOT | IRQF_SHARED,
@@ -1911,6 +1915,10 @@ static int davinci_mcasp_probe(struct plif (irq >=0 ) { irq_name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"%s_rx" ,dev_name (&pdev->dev)); +if (!irq_name) { + ret = -ENOMEM ; + goto err; + } ret =devm_request_threaded_irq (&pdev->dev, irq,NULL , davinci_mcasp_rx_irq_handler,IRQF_ONESHOT , irq_name, mcasp);
@@ -1926,6 +1934,10 @@ static int davinci_mcasp_probe(struct plif (irq >=0 ) { irq_name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"%s_tx" ,dev_name (&pdev->dev)); +if (!irq_name) { + ret = -ENOMEM ; + goto err; + } ret =devm_request_threaded_irq (&pdev->dev, irq,NULL , davinci_mcasp_tx_irq_handler,IRQF_ONESHOT , irq_name, mcasp);
Greg Kroah-Hartman
maintainerPATCH 57/105 ASoC: davinci: Kill BUG_ON() usage
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit befff4fbc27e19b14b343eb4a65d8f75d38b6230 upstream
Don't use BUG_ON() for a non-critical sanity check on production systems. This patch replaces with a softer WARN_ON() and an error path.
--- sound/soc/davinci/davinci-mcasp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/soc/davinci/davinci-mcasp.c +2 -1
@@ -1748,7 +1748,8 @@ static int davinci_mcasp_get_dma_type(st PTR_ERR(chan));return PTR_ERR (chan); } -BUG_ON (!chan->device || !chan->device->dev); +if (WARN_ON (!chan->device || !chan->device->dev)) +return -EINVAL ;if (chan->device->dev->of_node) ret = of_property_read_string(chan->device->dev->of_node,
Greg Kroah-Hartman
maintainerPATCH 58/105 ASoC: davinci-mcasp: Fix an error handling path in davinci_mcasp_probe()
In reply to Greg Kroah-HartmanFrom: Christophe Jaillet <[email protected]>
commit 1b8b68b05d1868404316d32e20782b00442aba90 upstream
All error handling paths in this function 'goto err' except this one.
If one of the 2 previous memory allocations fails, we should go through the existing error handling path. Otherwise there is an unbalanced pm_runtime_enable()/pm_runtime_disable().
--- sound/soc/davinci/davinci-mcasp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
sound/soc/davinci/davinci-mcasp.c +4 -2
@@ -2022,8 +2022,10 @@ static int davinci_mcasp_probe(struct pl GFP_KERNEL);if (!mcasp->chconstr[SNDRV_PCM_STREAM_PLAYBACK ].list || - !mcasp->chconstr[SNDRV_PCM_STREAM_CAPTURE ].list) -return -ENOMEM ; + !mcasp->chconstr[SNDRV_PCM_STREAM_CAPTURE ].list) { + ret = -ENOMEM ; + goto err; + } ret =davinci_mcasp_set_ch_constraints (mcasp);if (ret)
Greg Kroah-Hartman
maintainerPATCH 59/105 i2c: omap: Trigger bus recovery in lockup case
In reply to Greg Kroah-HartmanFrom: Claudio Foellmi <[email protected]>
commit 93367bfca98f36cece57c01dbce6ea1b4ac58245 upstream
A very conservative check for bus activity (to prevent interference in multimaster setups) prevented the bus recovery methods from being triggered in the case that SDA or SCL was stuck low.
This defeats the purpose of the recovery mechanism, which was introduced for exactly this situation (a slave device keeping SDA pulled down).
Also added a check to make sure SDA is low before attempting recovery. If SDA is not stuck low, recovery will not help, so we can skip it.
Note that bus lockups can persist across reboots. The only other options are to reset or power cycle the offending slave device, and many i2c slaves do not even have a reset pin.
If we see that one of the lines is low for the entire timeout duration, we can actually be sure that there is no other master driving the bus. It is therefore save for us to attempt a bus recovery.
--- drivers/i2c/busses/i2c-omap.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-omap.c +23 -2
@@ -487,6 +487,22 @@ static int omap_i2c_init(struct omap_i2c }/* +* Try bus recovery, but only if SDA is actually low. +*/ +static int omap_i2c_recover_bus (struct omap_i2c_dev *omap) +{ +u16 systest; + + systest =omap_i2c_read_reg (omap,OMAP_I2C_SYSTEST_REG ); +if ((systest &OMAP_I2C_SYSTEST_SCL_I_FUNC ) && + (systest &OMAP_I2C_SYSTEST_SDA_I_FUNC )) +return 0 ;/* bus seems to already be fine */ +if (!(systest &OMAP_I2C_SYSTEST_SCL_I_FUNC )) +return -EBUSY ;/* recovery would not fix SCL */ +return i2c_recover_bus (&omap->adapter); +} + +/* * Waiting on Bus Busy */ static int omap_i2c_wait_for_bb (struct omap_i2c_dev *omap)
@@ -496,7 +512,7 @@ static int omap_i2c_wait_for_bb(struct o timeout = jiffies +OMAP_I2C_TIMEOUT ;while (omap_i2c_read_reg (omap,OMAP_I2C_STAT_REG ) &OMAP_I2C_STAT_BB ) {if (time_after (jiffies, timeout)) -return i2c_recover_bus (&omap->adapter); +return omap_i2c_recover_bus (omap);msleep (1 ); }
@@ -577,8 +593,13 @@ static int omap_i2c_wait_for_bb_valid(st }if (time_after (jiffies, timeout)) { +/* +* SDA or SCL were low for the entire timeout without +* any activity detected. Most likely, a slave is +* locking up the bus with no master driving the clock. +*/ dev_warn (omap->dev,"timeout waiting for bus ready\n" ); -return -ETIMEDOUT ; +return omap_i2c_recover_bus (omap); }msleep (1 );
Greg Kroah-Hartman
maintainerPATCH 60/105 cpufreq: ti-cpufreq: add missing of_node_put()
In reply to Greg Kroah-HartmanFrom: Zumeng Chen <[email protected]>
commit 248aefdcc3a7e0cfbd014946b4dead63e750e71b upstream
call of_node_put to release the refcount of np.
--- drivers/cpufreq/ti-cpufreq.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpufreq/ti-cpufreq.c +1 -0
@@ -205,6 +205,7 @@ static int ti_cpufreq_init(void) np =of_find_node_by_path ("/" ); match =of_match_node (ti_cpufreq_of_match, np); +of_node_put (np);if (!match)return -ENODEV ;
Greg Kroah-Hartman
maintainerPATCH 61/105 ARM: dts: dra7: Disable USB metastability workaround for USB2
In reply to Greg Kroah-HartmanFrom: Roger Quadros <[email protected]>
commit b8c9c6fa2002b8fd4a9710f76f80f99c6046d48c upstream.
The metastability workaround causes Erratic errors [1] on the HighSpeed USB PHY which can cause upto 2 seconds delay in enumerating to a USB host while in Gadget mode.
Disable the Run/Stop metastability workaround to avoid this ill effect. We are aware that this opens up the opportunity for Run/Stop metastability, however this issue has never been observed in TI releases so we think that Run/Stop metastability is a lesser evil than the PHY Erratic errors. So disable it.
[1] USB controller trace during gadget enumeration
irq/90-dwc3-969 [000] d... 52.323145: dwc3_event: event
(00000901): Erratic Error [U0]
irq/90-dwc3-969 [000] d... 52.560646: dwc3_event: event
(00000901): Erratic Error [U0]
irq/90-dwc3-969 [000] d... 52.798144: dwc3_event: event
(00000901): Erratic Error [U0]--- arch/arm/boot/dts/dra7.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/dra7.dtsi +1 -0
@@ -1540,6 +1540,7 @@ dr_mode = "otg"; snps,dis_u3_susphy_quirk; snps,dis_u2_susphy_quirk; + snps,dis_metastability_quirk; }; };
Greg Kroah-Hartman
maintainerPATCH 62/105 sched/fair: Fix low cpu usage with high throttling by removing expiration of cpu-local slices
In reply to Greg Kroah-HartmanFrom: Dave Chiluk <[email protected]>
commit de53fd7aedb100f03e5d2231cfce0e4993282425 upstream.
It has been observed, that highly-threaded, non-cpu-bound applications running under cpu.cfs_quota_us constraints can hit a high percentage of periods throttled while simultaneously not consuming the allocated amount of quota. This use case is typical of user-interactive non-cpu bound applications, such as those running in kubernetes or mesos when run on multiple cpu cores.
This has been root caused to cpu-local run queue being allocated per cpu bandwidth slices, and then not fully using that slice within the period. At which point the slice and quota expires. This expiration of unused slice results in applications not being able to utilize the quota for which they are allocated.
The non-expiration of per-cpu slices was recently fixed by 'commit 512ac999d275 ("sched/fair: Fix bandwidth timer clock drift condition")'. Prior to that it appears that this had been broken since at least 'commit 51f2176d74ac ("sched/fair: Fix unlocked reads of some cfs_b->quota/period")' which was introduced in v3.16-rc1 in 2014. That added the following conditional which resulted in slices never being expired.
if (cfs_rq->runtime_expires != cfs_b->runtime_expires) {
/* extend local deadline, drift is bounded above by 2 ticks */
cfs_rq->runtime_expires += TICK_NSEC;Because this was broken for nearly 5 years, and has recently been fixed and is now being noticed by many users running kubernetes
(https://github.com/kubernetes/kubernetes/issues/67577) it is my opinion that the mechanisms around expiring runtime should be removed altogether.
This allows quota already allocated to per-cpu run-queues to live longer than the period boundary. This allows threads on runqueues that do not use much CPU to continue to use their remaining slice over a longer period of time than cpu.cfs_period_us. However, this helps prevent the above condition of hitting throttling while also not fully utilizing your cpu quota.
This theoretically allows a machine to use slightly more than its allotted quota in some periods. This overflow would be bounded by the remaining quota left on each per-cpu runqueueu. This is typically no more than min_cfs_rq_runtime=1ms per cpu. For CPU bound tasks this will change nothing, as they should theoretically fully utilize all of their quota in each period. For user-interactive tasks as described above this provides a much better user/application experience as their cpu utilization will more closely match the amount they requested when they hit throttling. This means that cpu limits no longer strictly apply per period for non-cpu bound applications, but that they are still accurate over longer timeframes.
This greatly improves performance of high-thread-count, non-cpu bound applications with low cfs_quota_us allocation on high-core-count machines. In the case of an artificial testcase (10ms/100ms of quota on 80 CPU machine), this commit resulted in almost 30x performance improvement, while still maintaining correct cpu quota restrictions. That testcase is available at https://github.com/indeedeng/fibtest.
--- Documentation/scheduler/sched-bwc.txt | 45 +++++++++++++++++++++ kernel/sched/fair.c | 70 +++------------------------------- kernel/sched/sched.h | 4 - 3 files changed, 52 insertions(+), 67 deletions(-)
Documentation/scheduler/sched-bwc.txt +45 -0
@@ -90,6 +90,51 @@ There are two ways in which a group may In case b) above, even though the child may have runtime remaining it will not be allowed to until the parent's runtime is refreshed. +CFS Bandwidth Quota Caveats +--------------------------- +Once a slice is assigned to a cpu it does not expire. However all but 1ms of +the slice may be returned to the global pool if all threads on that cpu become +unrunnable. This is configured at compile time by the min_cfs_rq_runtime +variable. This is a performance tweak that helps prevent added contention on +the global lock. + +The fact that cpu-local slices do not expire results in some interesting corner +cases that should be understood. + +For cgroup cpu constrained applications that are cpu limited this is a +relatively moot point because they will naturally consume the entirety of their +quota as well as the entirety of each cpu-local slice in each period. As a +result it is expected that nr_periods roughly equal nr_throttled, and that +cpuacct.usage will increase roughly equal to cfs_quota_us in each period. + +For highly-threaded, non-cpu bound applications this non-expiration nuance +allows applications to briefly burst past their quota limits by the amount of +unused slice on each cpu that the task group is running on (typically at most +1ms per cpu or as defined by min_cfs_rq_runtime). This slight burst only +applies if quota had been assigned to a cpu and then not fully used or returned +in previous periods. This burst amount will not be transferred between cores. +As a result, this mechanism still strictly limits the task group to quota +average usage, albeit over a longer time window than a single period. This +also limits the burst ability to no more than 1ms per cpu. This provides +better more predictable user experience for highly threaded applications with +small quota limits on high core count machines. It also eliminates the +propensity to throttle these applications while simultanously using less than +quota amounts of cpu. Another way to say this, is that by allowing the unused +portion of a slice to remain valid across periods we have decreased the +possibility of wastefully expiring quota on cpu-local silos that don't need a +full slice's amount of cpu time. + +The interaction between cpu-bound and non-cpu-bound-interactive applications +should also be considered, especially when single core usage hits 100%. If you +gave each of these applications half of a cpu-core and they both got scheduled +on the same CPU it is theoretically possible that the non-cpu bound application +will use up to 1ms additional quota in some periods, thereby preventing the +cpu-bound application from fully using its quota by that same amount. In these +instances it will be up to the CFS algorithm (see sched-design-CFS.rst) to +decide which application is chosen to run, as they will both be runnable and +have remaining quota. This runtime discrepancy will be made up in the following +periods when the interactive application idles. + Examples -------- 1. Limit a group to 1 CPU worth of runtime.
kernel/sched/fair.c +7 -63
155 lines not on this page · raw message
kernel/sched/sched.h +0 -4
@@ -280,8 +280,6 @@ struct cfs_bandwidth {ktime_t period;u64 quota, runtime;s64 hierarchical_quota; -u64 runtime_expires; -int expires_seq;short idle, period_active;struct hrtimer period_timer, slack_timer;
@@ -489,8 +487,6 @@ struct cfs_rq {#ifdef CONFIG_CFS_BANDWIDTH int runtime_enabled; -int expires_seq; -u64 runtime_expires;s64 runtime_remaining;u64 throttled_clock, throttled_clock_task;
Greg Kroah-Hartman
maintainerPATCH 63/105 sched/fair: Fix -Wunused-but-set-variable warnings
In reply to Greg Kroah-HartmanFrom: Qian Cai <[email protected]>
commit 763a9ec06c409dcde2a761aac4bb83ff3938e0b3 upstream.
Commit:
de53fd7aedb1 ("sched/fair: Fix low cpu usage with high throttling by removing expiration of cpu-local slices")
introduced a few compilation warnings:
kernel/sched/fair.c: In function '__refill_cfs_bandwidth_runtime':
kernel/sched/fair.c:4365:6: warning: variable 'now' set but not used [-Wunused-but-set-variable] kernel/sched/fair.c: In function 'start_cfs_bandwidth':
kernel/sched/fair.c:4992:6: warning: variable 'overrun' set but not used [-Wunused-but-set-variable]
Also, __refill_cfs_bandwidth_runtime() does no longer update the expiration time, so fix the comments accordingly.
--- kernel/sched/fair.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)
kernel/sched/fair.c +5 -10
@@ -4091,21 +4091,16 @@ static inline u64 sched_cfs_bandwidth_sl }/* -* Replenish runtime according to assigned quota and update expiration time. -* We use sched_clock_cpu directly instead of rq->clock to avoid adding -* additional synchronization around rq->lock. +* Replenish runtime according to assigned quota. We use sched_clock_cpu +* directly instead of rq->clock to avoid adding additional synchronization +* around rq->lock. * * requires cfs_b->lock */ void __refill_cfs_bandwidth_runtime (struct cfs_bandwidth *cfs_b) { -u64 now; - -if (cfs_b->quota ==RUNTIME_INF ) -return ; - - now =sched_clock_cpu (smp_processor_id ()); - cfs_b->runtime = cfs_b->quota; +if (cfs_b->quota !=RUNTIME_INF ) + cfs_b->runtime = cfs_b->quota; }static inline struct cfs_bandwidth *tg_cfs_bandwidth (struct task_group *tg)
Greg Kroah-Hartman
maintainerPATCH 64/105 lib/scatterlist: Introduce sgl_alloc() and sgl_free()
In reply to Greg Kroah-HartmanFrom: Bart Van Assche <[email protected]>
commit e80a0af4759a164214f02da157a3800753ce135f upstream.
Many kernel drivers contain code that allocates and frees both a scatterlist and the pages that populate that scatterlist. Introduce functions in lib/scatterlist.c that perform these tasks instead of duplicating this functionality in multiple drivers. Only include these functions in the build if CONFIG_SGL_ALLOC=y to avoid that the kernel size increases if this functionality is not used.
--- include/linux/scatterlist.h | 10 ++++ lib/Kconfig | 4 + lib/scatterlist.c | 105 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+)
include/linux/scatterlist.h +10 -0
@@ -267,6 +267,16 @@ int sg_alloc_table_from_pages(struct sg_ unsigned long offset, unsigned long size, gfp_t gfp_mask); +#ifdef CONFIG_SGL_ALLOC +struct scatterlist *sgl_alloc_order (unsigned long long length, +unsigned int order,bool chainable, +gfp_t gfp,unsigned int *nent_p); +struct scatterlist *sgl_alloc (unsigned long long length,gfp_t gfp, +unsigned int *nent_p); +void sgl_free_order (struct scatterlist *sgl,int order); +void sgl_free (struct scatterlist *sgl); +#endif /* CONFIG_SGL_ALLOC */ +size_t sg_copy_buffer (struct scatterlist *sgl,unsigned int nents,void *buf,size_t buflen,off_t skip,bool to_buffer);
lib/Kconfig +4 -0
@@ -413,6 +413,10 @@ config HAS_DMA depends on !NO_DMA default y +config SGL_ALLOC + bool + default n + config DMA_NOOP_OPS bool depends on HAS_DMA && (!64BIT || ARCH_DMA_ADDR_T_64BIT)
lib/scatterlist.c +105 -0
111 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 65/105 usbip: Fix vhci_urb_enqueue() URB null transfer buffer error path
In reply to Greg Kroah-HartmanFrom: Shuah Khan <[email protected]>
commit 2c904963b1dd2acd4bc785b6c72e10a6283c2081 upstream.
Fix vhci_urb_enqueue() to print debug msg and return error instead of failing with BUG_ON.
--- drivers/usb/usbip/vhci_hcd.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/usb/usbip/vhci_hcd.c +4 -2
@@ -716,8 +716,10 @@ static int vhci_urb_enqueue(struct usb_h } vdev = &vhci_hcd->vdev[portnum-1 ]; -/* patch to usb_sg_init() is in 2.5.60 */ -BUG_ON (!urb->transfer_buffer && urb->transfer_buffer_length); +if (!urb->transfer_buffer && urb->transfer_buffer_length) { +dev_dbg (dev,"Null URB transfer buffer\n" ); +return -EINVAL ; + }spin_lock_irqsave (&vhci->lock, flags);
Greg Kroah-Hartman
maintainerPATCH 66/105 usbip: stub_rx: fix static checker warning on unnecessary checks
In reply to Greg Kroah-HartmanFrom: Shuah Khan <[email protected]>
commit 10c90120930628e8b959bf58d4a0aaef3ae5d945 upstream.
Fix the following static checker warnings:
The patch c6688ef9f297: "usbip: fix stub_rx: harden CMD_SUBMIT path to handle malicious input" from Dec 7, 2017, leads to the following static checker warning:
drivers/usb/usbip/stub_rx.c:346 get_pipe()
warn: impossible condition
'(pdu->u.cmd_submit.transfer_buffer_length > ((~0 >> 1))) => (s32min-s32max > s32max)'
drivers/usb/usbip/stub_rx.c:486 stub_recv_cmd_submit()
warn: always true condition
'(pdu->u.cmd_submit.transfer_buffer_length <= ((~0 >> 1))) => (s32min-s32max <= s32max)'
--- drivers/usb/usbip/stub_rx.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-)
drivers/usb/usbip/stub_rx.c +1 -10
@@ -353,14 +353,6 @@ static int get_pipe(struct stub_device * epd = &ep->desc; -/* validate transfer_buffer_length */ -if (pdu->u.cmd_submit.transfer_buffer_length >INT_MAX ) { -dev_err (&sdev->udev->dev, -"CMD_SUBMIT: -EMSGSIZE transfer_buffer_length %d\n" , - pdu->u.cmd_submit.transfer_buffer_length); -return -1 ; - } -if (usb_endpoint_xfer_control (epd)) {if (dir ==USBIP_DIR_OUT )return usb_sndctrlpipe (udev, epnum);
@@ -487,8 +479,7 @@ static void stub_recv_cmd_submit(struct }/* allocate urb transfer buffer, if needed */ -if (pdu->u.cmd_submit.transfer_buffer_length >0 && - pdu->u.cmd_submit.transfer_buffer_length <=INT_MAX ) { +if (pdu->u.cmd_submit.transfer_buffer_length >0 ) { priv->urb->transfer_buffer =kzalloc (pdu->u.cmd_submit.transfer_buffer_length,GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 67/105 usbip: Implement SG support to vhci-hcd and stub driver
In reply to Greg Kroah-HartmanFrom: Suwan Kim <[email protected]>
commit ea44d190764b4422af4d1c29eaeb9e69e353b406 upstream.
There are bugs on vhci with usb 3.0 storage device. In USB, each SG list entry buffer should be divisible by the bulk max packet size. But with native SG support, this problem doesn't matter because the SG buffer is treated as contiguous buffer. But without native SG support, USB storage driver breaks SG list into several URBs and the error occurs because of a buffer size of URB that cannot be divided by the bulk max packet size. The error situation is as follows.
When USB Storage driver requests 31.5 KB data and has SG list which has 3584 bytes buffer followed by 7 4096 bytes buffer for some reason. USB Storage driver splits this SG list into several URBs because VHCI doesn't support SG and sends them separately. So the first URB buffer size is 3584 bytes. When receiving data from device, USB 3.0 device sends data packet of 1024 bytes size because the max packet size of BULK pipe is 1024 bytes. So device sends 4096 bytes. But the first URB buffer has only 3584 bytes buffer size. So host controller terminates the transfer even though there is more data to receive. So, vhci needs to support SG transfer to prevent this error.
In this patch, vhci supports SG regardless of whether the server's host controller supports SG or not, because stub driver splits SG list into several URBs if the server's host controller doesn't support SG.
To support SG, vhci sets URB_DMA_MAP_SG flag in urb->transfer_flags if URB has SG list and this flag will tell stub driver to use SG list. After receiving urb from stub driver, vhci clear URB_DMA_MAP_SG flag to avoid unnecessary DMA unmapping in HCD.
vhci sends each SG list entry to stub driver. Then, stub driver sees the total length of the buffer and allocates SG table and pages according to the total buffer length calling sgl_alloc(). After stub driver receives completed URB, it again sends each SG list entry to vhci.
If the server's host controller doesn't support SG, stub driver breaks a single SG request into several URBs and submits them to the server's host controller. When all the split URBs are completed, stub driver reassembles the URBs into a single return command and sends it to vhci.
Moreover, in the situation where vhci supports SG, but stub driver does not, or vice versa, usbip works normally. Because there is no protocol modification, there is no problem in communication between server and client even if the one has a kernel without SG support.
In the case of vhci supports SG and stub driver doesn't, because vhci sends only the total length of the buffer to stub driver as it did before the patch applied, stub driver only needs to allocate the required length of buffers using only kmalloc() regardless of whether vhci supports SG or not. But stub driver has to allocate buffer with kmalloc() as much as the total length of SG buffer which is quite huge when vhci sends SG request, so it has overhead in buffer allocation in this situation.
If stub driver needs to send data buffer to vhci because of IN pipe, stub driver also sends only total length of buffer as metadata and then sends real data as vhci does. Then vhci receive data from stub driver and store it to the corresponding buffer of SG list entry.
And for the case of stub driver supports SG and vhci doesn't, since the USB storage driver checks that vhci doesn't support SG and sends the request to stub driver by splitting the SG list into multiple URBs, stub driver allocates a buffer for each URB with kmalloc() as it did before this patch.
* Test environment
Test uses two difference machines and two different kernel version to make mismatch situation between the client and the server where vhci supports SG, but stub driver does not, or vice versa. All tests are conducted in both full SG support that both vhci and stub support SG and half SG support that is the mismatch situation. Test kernel version is 5.3-rc6 with commit "usb: add a HCD_DMA flag instead of guestimating DMA capabilities" to avoid unnecessary DMA mapping and unmapping.
- Test kernel version
- 5.3-rc6 with SG support
- 5.1.20-200.fc29.x86_64 without SG support
* SG support test
- Test devices
- Super-speed storage device - SanDisk Ultra USB 3.0
- High-speed storage device - SMI corporation USB 2.0 flash drive
- Test description
Test read and write operation of mass storage device that uses the BULK transfer. In test, the client reads and writes files whose size is over 1G and it works normally.
* Regression test
- Test devices
- Super-speed device - Logitech Brio webcam
- High-speed device - Logitech C920 HD Pro webcam
- Full-speed device - Logitech bluetooth mouse
- Britz BR-Orion speaker
- Low-speed device - Logitech wired mouse
- Test description
Moving and click test for mouse. To test the webcam, use gnome-cheese. To test the speaker, play music and video on the client. All works normally.
* VUDC compatibility test
VUDC also works well with this patch. Tests are done with two USB gadget created by CONFIGFS USB gadget. Both use the BULK pipe.
1. Serial gadget
2. Mass storage gadget
- Serial gadget test
Serial gadget on the host sends and receives data using cat command on the /dev/ttyGS<N>. The client uses minicom to communicate with the serial gadget.
- Mass storage gadget test
After connecting the gadget with vhci, use "dd" to test read and write operation on the client side.
Read - dd if=/dev/sd<N> iflag=direct of=/dev/null bs=1G count=1 Write - dd if=<my file path> iflag=direct of=/dev/sd<N> bs=1G count=1
--- drivers/usb/usbip/Kconfig | 1 drivers/usb/usbip/stub.h | 7 + drivers/usb/usbip/stub_main.c | 57 ++++++++--- drivers/usb/usbip/stub_rx.c | 202 +++++++++++++++++++++++++++------------ drivers/usb/usbip/stub_tx.c | 99 ++++++++++++++----- drivers/usb/usbip/usbip_common.c | 59 +++++++---- drivers/usb/usbip/vhci_hcd.c | 12 ++ drivers/usb/usbip/vhci_rx.c | 3 drivers/usb/usbip/vhci_tx.c | 66 ++++++++++-- 9 files changed, 380 insertions(+), 126 deletions(-)
drivers/usb/usbip/Kconfig +1 -0
@@ -2,6 +2,7 @@ config USBIP_CORE tristate "USB/IP support" depends on NET select USB_COMMON + select SGL_ALLOC ---help--- This enables pushing USB packets over IP to allow remote machines direct access to USB devices. It provides the
drivers/usb/usbip/stub.h +6 -1
@@ -66,7 +66,11 @@ struct stub_priv {unsigned long seqnum;struct list_head list;struct stub_device *sdev; -struct urb *urb; +struct urb **urbs; +struct scatterlist *sgl; +int num_urbs; +int completed_urbs; +int urb_status;int unlinking; };
@@ -100,6 +104,7 @@ extern struct usb_device_driver stub_dristruct bus_id_priv *get_busid_priv (const char *busid);void put_busid_priv (struct bus_id_priv *bid);int del_match_busid (char *busid); +void stub_free_priv_and_urb (struct stub_priv *priv);void stub_device_cleanup_urbs (struct stub_device *sdev);/* stub_rx.c */
drivers/usb/usbip/stub_main.c +42 -15
86 lines not on this page · raw message
drivers/usb/usbip/stub_rx.c +145 -57
260 lines not on this page · raw message
drivers/usb/usbip/stub_tx.c +77 -22
150 lines not on this page · raw message
drivers/usb/usbip/usbip_common.c +41 -18
78 lines not on this page · raw message
drivers/usb/usbip/vhci_hcd.c +11 -1
@@ -716,7 +716,8 @@ static int vhci_urb_enqueue(struct usb_h } vdev = &vhci_hcd->vdev[portnum-1 ]; -if (!urb->transfer_buffer && urb->transfer_buffer_length) { +if (!urb->transfer_buffer && !urb->num_sgs && + urb->transfer_buffer_length) {dev_dbg (dev,"Null URB transfer buffer\n" );return -EINVAL ; }
@@ -1162,6 +1163,15 @@ static int vhci_setup(struct usb_hcd *hc hcd->speed =HCD_USB3 ; hcd->self.root_hub->speed =USB_SPEED_SUPER ; } + +/* +* Support SG. +* sg_tablesize is an arbitrary value to alleviate memory pressure +* on the host. +*/ + hcd->self.sg_tablesize =32 ; + hcd->self.no_sg_constraint =1 ; +return 0 ; }
drivers/usb/usbip/vhci_rx.c +3 -0
@@ -104,6 +104,9 @@ static void vhci_recv_ret_submit(structif (usbip_dbg_flag_vhci_rx)usbip_dump_urb (urb); +if (urb->num_sgs) + urb->transfer_flags &= ~URB_DMA_MAP_SG ; +usbip_dbg_vhci_rx ("now giveback urb %u\n" , pdu->base.seqnum);spin_lock_irqsave (&vhci->lock, flags);
drivers/usb/usbip/vhci_tx.c +54 -12
126 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 68/105 PCI: tegra: Enable Relaxed Ordering only for Tegra20 & Tegra30
In reply to Greg Kroah-HartmanFrom: Vidya Sagar <[email protected]>
commit 7be142caabc4780b13a522c485abc806de5c4114 upstream.
The PCI Tegra controller conversion to a device tree configurable driver in commit d1523b52bff3 ("PCI: tegra: Move PCIe driver to drivers/pci/host") implied that code for the driver can be compiled in for a kernel supporting multiple platforms.
Unfortunately, a blind move of the code did not check that some of the quirks that were applied in arch/arm (eg enabling Relaxed Ordering on all PCI devices - since the quirk hook erroneously matches PCI_ANY_ID for both Vendor-ID and Device-ID) are now applied in all kernels that compile the PCI Tegra controlled driver, DT and ACPI alike.
This is completely wrong, in that enablement of Relaxed Ordering is only required by default in Tegra20 platforms as described in the Tegra20 Technical Reference Manual (available at
https://developer.nvidia.com/embedded/downloads#?search=tegra%202 in Section 34.1, where it is mentioned that Relaxed Ordering bit needs to be enabled in its root ports to avoid deadlock in hardware) and in the Tegra30 platforms for the same reasons (unfortunately not documented in the TRM).
There is no other strict requirement on PCI devices Relaxed Ordering enablement on any other Tegra platforms or PCI host bridge driver.
Fix this quite upsetting situation by limiting the vendor and device IDs to which the Relaxed Ordering quirk applies to the root ports in question, reported above.
--- drivers/pci/host/pci-tegra.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/pci/host/pci-tegra.c +5 -2
@@ -607,12 +607,15 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVDECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_NVIDIA ,0x0e1c , tegra_pcie_fixup_class);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_NVIDIA ,0x0e1d , tegra_pcie_fixup_class); -/* Tegra PCIE requires relaxed ordering */ +/* Tegra20 and Tegra30 PCIE requires relaxed ordering */ static void tegra_pcie_relax_enable (struct pci_dev *dev) {pcie_capability_set_word (dev,PCI_EXP_DEVCTL ,PCI_EXP_DEVCTL_RELAX_EN ); } -DECLARE_PCI_FIXUP_FINAL (PCI_ANY_ID ,PCI_ANY_ID , tegra_pcie_relax_enable); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_NVIDIA ,0x0bf0 , tegra_pcie_relax_enable); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_NVIDIA ,0x0bf1 , tegra_pcie_relax_enable); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_NVIDIA ,0x0e1c , tegra_pcie_relax_enable); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_NVIDIA ,0x0e1d , tegra_pcie_relax_enable);static int tegra_pcie_request_resources (struct tegra_pcie *pcie) {
Greg Kroah-Hartman
maintainerPATCH 69/105 dmaengine: xilinx_dma: Fix control reg update in vdma_channel_set_config
In reply to Greg Kroah-HartmanFrom: Radhey Shyam Pandey <[email protected]>
[ Upstream commit 6c6de1ddb1be3840f2ed5cc9d009a622720940c9 ]
In vdma_channel_set_config clear the delay, frame count and master mask before updating their new values. It avoids programming incorrect state when input parameters are different from default.
--- drivers/dma/xilinx/xilinx_dma.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/dma/xilinx/xilinx_dma.c +7 -0
@@ -72,6 +72,9 @@#define XILINX_DMA_DMACR_CIRC_EN BIT(1)#define XILINX_DMA_DMACR_RUNSTOP BIT(0)#define XILINX_DMA_DMACR_FSYNCSRC_MASK GENMASK(6, 5) +#define XILINX_DMA_DMACR_DELAY_MASK GENMASK(31, 24) +#define XILINX_DMA_DMACR_FRAME_COUNT_MASK GENMASK(23, 16) +#define XILINX_DMA_DMACR_MASTER_MASK GENMASK(11, 8)#define XILINX_DMA_REG_DMASR 0x0004#define XILINX_DMA_DMASR_EOL_LATE_ERR BIT(15)
@@ -2057,8 +2060,10 @@ int xilinx_vdma_channel_set_config(struct dma_chan *dchan, chan->config.gen_lock = cfg->gen_lock; chan->config.master = cfg->master; + dmacr &= ~XILINX_DMA_DMACR_GENLOCK_EN ;if (cfg->gen_lock && chan->genlock) { dmacr |=XILINX_DMA_DMACR_GENLOCK_EN ; + dmacr &= ~XILINX_DMA_DMACR_MASTER_MASK ; dmacr |= cfg->master <<XILINX_DMA_DMACR_MASTER_SHIFT ; }
@@ -2072,11 +2077,13 @@ int xilinx_vdma_channel_set_config(struct dma_chan *dchan, chan->config.delay = cfg->delay;if (cfg->coalesc <=XILINX_DMA_DMACR_FRAME_COUNT_MAX ) { + dmacr &= ~XILINX_DMA_DMACR_FRAME_COUNT_MASK ; dmacr |= cfg->coalesc <<XILINX_DMA_DMACR_FRAME_COUNT_SHIFT ; chan->config.coalesc = cfg->coalesc; }if (cfg->delay <=XILINX_DMA_DMACR_DELAY_MAX ) { + dmacr &= ~XILINX_DMA_DMACR_DELAY_MASK ; dmacr |= cfg->delay <<XILINX_DMA_DMACR_DELAY_SHIFT ; chan->config.delay = cfg->delay; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 70/105 HID: intel-ish-hid: fix wrong error handling in ishtp_cl_alloc_tx_ring()
In reply to Greg Kroah-HartmanFrom: Zhang Lixu <[email protected]>
[ Upstream commit 16ff7bf6dbcc6f77d2eec1ac9120edf44213c2f1 ]
When allocating tx ring buffers failed, should free tx buffers, not rx buffers.
--- drivers/hid/intel-ish-hid/ishtp/client-buffers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hid/intel-ish-hid/ishtp/client-buffers.c +1 -1
@@ -90,7 +90,7 @@ int ishtp_cl_alloc_tx_ring(struct ishtp_cl *cl)return 0 ; out:dev_err (&cl->device->dev,"error in allocating Tx pool\n" ); -ishtp_cl_free_rx_ring (cl); +ishtp_cl_free_tx_ring (cl);return -ENOMEM ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 71/105 RDMA/qedr: Fix reported firmware version
In reply to Greg Kroah-HartmanFrom: Kamal Heib <[email protected]>
[ Upstream commit b806c94ee44e53233b8ce6c92d9078d9781786a5 ]
Remove spaces from the reported firmware version string. Actual value:
$ cat /sys/class/infiniband/qedr0/fw_ver 8. 37. 7. 0
Expected value:
$ cat /sys/class/infiniband/qedr0/fw_ver 8.37.7.0
--- drivers/infiniband/hw/qedr/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/qedr/main.c +1 -1
@@ -73,7 +73,7 @@ static void qedr_get_dev_fw_str(struct ib_device *ibdev, char *str)struct qedr_dev *qedr =get_qedr_dev (ibdev);u32 fw_ver = (u32 )qedr->attr.fw_ver; -snprintf (str,IB_FW_VERSION_NAME_MAX ,"%d. %d. %d. %d" , +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%d.%d.%d.%d" , (fw_ver >>24 ) &0xFF , (fw_ver >>16 ) &0xFF , (fw_ver >>8 ) &0xFF , fw_ver &0xFF ); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 72/105 net/mlx5: prevent memory leak in mlx5_fpga_conn_create_cq
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
[ Upstream commit c8c2a057fdc7de1cd16f4baa51425b932a42eb39 ]
In mlx5_fpga_conn_create_cq if mlx5_vector2eqn fails the allocated memory should be released.
--- drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.c +3 -1
@@ -462,8 +462,10 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size) } err =mlx5_vector2eqn (mdev,smp_processor_id (), &eqn, &irqn); -if (err) +if (err) { +kvfree (in); goto err_cqwq; + } cqc =MLX5_ADDR_OF (create_cq_in, in, cq_context);MLX5_SET (cqc, cqc, log_cq_size,ilog2 (cq_size));
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 73/105 scsi: qla2xxx: fixup incorrect usage of host_byte
In reply to Greg Kroah-HartmanFrom: Hannes Reinecke <[email protected]>
[ Upstream commit 66cf50e65b183c863825f5c28a818e3f47a72e40 ]
DRIVER_ERROR is a a driver byte setting, not a host byte. The qla2xxx driver should rather return DID_ERROR here to be in line with the other drivers.
--- drivers/scsi/qla2xxx/qla_bsg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/scsi/qla2xxx/qla_bsg.c +3 -3
@@ -258,7 +258,7 @@ qla2x00_process_els(struct bsg_job *bsg_job)srb_t *sp;const char *type;int req_sg_cnt, rsp_sg_cnt; -int rval = (DRIVER_ERROR <<16 ); +int rval = (DID_ERROR <<16 );uint16_t nextlid =0 ;if (bsg_request->msgcode ==FC_BSG_RPT_ELS ) {
@@ -433,7 +433,7 @@ qla2x00_process_ct(struct bsg_job *bsg_job)struct Scsi_Host *host =fc_bsg_to_shost (bsg_job);scsi_qla_host_t *vha =shost_priv (host);struct qla_hw_data *ha = vha->hw; -int rval = (DRIVER_ERROR <<16 ); +int rval = (DID_ERROR <<16 );int req_sg_cnt, rsp_sg_cnt;uint16_t loop_id;struct fc_port *fcport;
@@ -1951,7 +1951,7 @@ qlafx00_mgmt_cmd(struct bsg_job *bsg_job)struct Scsi_Host *host =fc_bsg_to_shost (bsg_job);scsi_qla_host_t *vha =shost_priv (host);struct qla_hw_data *ha = vha->hw; -int rval = (DRIVER_ERROR <<16 ); +int rval = (DID_ERROR <<16 );struct qla_mt_iocb_rqst_fx00 *piocb_rqst;srb_t *sp;int req_sg_cnt =0 , rsp_sg_cnt =0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 74/105 RDMA/uverbs: Prevent potential underflow
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit a9018adfde809d44e71189b984fa61cc89682b5e ]
The issue is in drivers/infiniband/core/uverbs_std_types_cq.c in the UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE) function. We check that:
if (attr.comp_vector >= attrs->ufile->device->num_comp_vectors) {But we don't check if "attr.comp_vector" is negative. It could potentially lead to an array underflow. My concern would be where cq->vector is used in the create_cq() function from the cxgb4 driver.
And really "attr.comp_vector" is appears as a u32 to user space so that's the right type to use.
--- drivers/infiniband/core/uverbs.h | 2 +- include/rdma/ib_verbs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/core/uverbs.h +1 -1
@@ -87,7 +87,7 @@struct ib_uverbs_device {atomic_t refcount; -int num_comp_vectors; +u32 num_comp_vectors;struct completion comp;struct device *dev;struct ib_device __rcu *ib_dev;
include/rdma/ib_verbs.h +1 -1
@@ -306,7 +306,7 @@ enum ib_cq_creation_flags {struct ib_cq_init_attr {unsigned int cqe; -int comp_vector; +u32 comp_vector;u32 flags; };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 75/105 net: openvswitch: free vport unless register_netdevice() succeeds
In reply to Greg Kroah-HartmanFrom: Hillf Danton <[email protected]>
[ Upstream commit 9464cc37f3671ee69cb1c00662b5e1f113a96b23 ]
syzbot found the following crash on:
HEAD commit: 1e78030e Merge tag 'mmc-v5.3-rc1' of git://git.kernel.org/.. git tree: upstream console output: https://syzkaller.appspot.com/x/log.txt?x=148d3d1a600000 kernel config: https://syzkaller.appspot.com/x/.config?x=30cef20daf3e9977 dashboard link: https://syzkaller.appspot.com/bug?extid=13210896153522fe1ee5 compiler: gcc (GCC) 9.0.0 20181231 (experimental) syz repro: https://syzkaller.appspot.com/x/repro.syz?x=136aa8c4600000 C reproducer: https://syzkaller.appspot.com/x/repro.c?x=109ba792600000
=====================================================================
BUG: memory leak
unreferenced object 0xffff8881207e4100 (size 128):
comm "syz-executor032", pid 7014, jiffies 4294944027 (age 13.830s)
hex dump (first 32 bytes):
00 70 16 18 81 88 ff ff 80 af 8c 22 81 88 ff ff .p........."....
00 b6 23 17 81 88 ff ff 00 00 00 00 00 00 00 00 ..#.............
backtrace:
[<000000000eb78212>] kmemleak_alloc_recursive include/linux/kmemleak.h:43 [inline]
[<000000000eb78212>] slab_post_alloc_hook mm/slab.h:522 [inline]
[<000000000eb78212>] slab_alloc mm/slab.c:3319 [inline]
[<000000000eb78212>] kmem_cache_alloc_trace+0x145/0x2c0 mm/slab.c:3548
[<00000000006ea6c6>] kmalloc include/linux/slab.h:552 [inline]
[<00000000006ea6c6>] kzalloc include/linux/slab.h:748 [inline]
[<00000000006ea6c6>] ovs_vport_alloc+0x37/0xf0 net/openvswitch/vport.c:130
[<00000000f9a04a7d>] internal_dev_create+0x24/0x1d0 net/openvswitch/vport-internal_dev.c:164
[<0000000056ee7c13>] ovs_vport_add+0x81/0x190 net/openvswitch/vport.c:199
[<000000005434efc7>] new_vport+0x19/0x80 net/openvswitch/datapath.c:194
[<00000000b7b253f1>] ovs_dp_cmd_new+0x22f/0x410 net/openvswitch/datapath.c:1614
[<00000000e0988518>] genl_family_rcv_msg+0x2ab/0x5b0 net/netlink/genetlink.c:629
[<00000000d0cc9347>] genl_rcv_msg+0x54/0x9c net/netlink/genetlink.c:654
[<000000006694b647>] netlink_rcv_skb+0x61/0x170 net/netlink/af_netlink.c:2477
[<0000000088381f37>] genl_rcv+0x29/0x40 net/netlink/genetlink.c:665
[<00000000dad42a47>] netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
[<00000000dad42a47>] netlink_unicast+0x1ec/0x2d0 net/netlink/af_netlink.c:1328
[<0000000067e6b079>] netlink_sendmsg+0x270/0x480 net/netlink/af_netlink.c:1917
[<00000000aab08a47>] sock_sendmsg_nosec net/socket.c:637 [inline]
[<00000000aab08a47>] sock_sendmsg+0x54/0x70 net/socket.c:657
[<000000004cb7c11d>] ___sys_sendmsg+0x393/0x3c0 net/socket.c:2311
[<00000000c4901c63>] __sys_sendmsg+0x80/0xf0 net/socket.c:2356
[<00000000c10abb2d>] __do_sys_sendmsg net/socket.c:2365 [inline]
[<00000000c10abb2d>] __se_sys_sendmsg net/socket.c:2363 [inline]
[<00000000c10abb2d>] __x64_sys_sendmsg+0x23/0x30 net/socket.c:2363BUG: memory leak
unreferenced object 0xffff88811723b600 (size 64):
comm "syz-executor032", pid 7014, jiffies 4294944027 (age 13.830s)
hex dump (first 32 bytes):
01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 02 00 00 00 05 35 82 c1 .............5..
backtrace:
[<00000000352f46d8>] kmemleak_alloc_recursive include/linux/kmemleak.h:43 [inline]
[<00000000352f46d8>] slab_post_alloc_hook mm/slab.h:522 [inline]
[<00000000352f46d8>] slab_alloc mm/slab.c:3319 [inline]
[<00000000352f46d8>] __do_kmalloc mm/slab.c:3653 [inline]
[<00000000352f46d8>] __kmalloc+0x169/0x300 mm/slab.c:3664
[<000000008e48f3d1>] kmalloc include/linux/slab.h:557 [inline]
[<000000008e48f3d1>] ovs_vport_set_upcall_portids+0x54/0xd0 net/openvswitch/vport.c:343
[<00000000541e4f4a>] ovs_vport_alloc+0x7f/0xf0 net/openvswitch/vport.c:139
[<00000000f9a04a7d>] internal_dev_create+0x24/0x1d0 net/openvswitch/vport-internal_dev.c:164
[<0000000056ee7c13>] ovs_vport_add+0x81/0x190 net/openvswitch/vport.c:199
[<000000005434efc7>] new_vport+0x19/0x80 net/openvswitch/datapath.c:194
[<00000000b7b253f1>] ovs_dp_cmd_new+0x22f/0x410 net/openvswitch/datapath.c:1614
[<00000000e0988518>] genl_family_rcv_msg+0x2ab/0x5b0 net/netlink/genetlink.c:629
[<00000000d0cc9347>] genl_rcv_msg+0x54/0x9c net/netlink/genetlink.c:654
[<000000006694b647>] netlink_rcv_skb+0x61/0x170 net/netlink/af_netlink.c:2477
[<0000000088381f37>] genl_rcv+0x29/0x40 net/netlink/genetlink.c:665
[<00000000dad42a47>] netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
[<00000000dad42a47>] netlink_unicast+0x1ec/0x2d0 net/netlink/af_netlink.c:1328
[<0000000067e6b079>] netlink_sendmsg+0x270/0x480 net/netlink/af_netlink.c:1917
[<00000000aab08a47>] sock_sendmsg_nosec net/socket.c:637 [inline]
[<00000000aab08a47>] sock_sendmsg+0x54/0x70 net/socket.c:657
[<000000004cb7c11d>] ___sys_sendmsg+0x393/0x3c0 net/socket.c:2311
[<00000000c4901c63>] __sys_sendmsg+0x80/0xf0 net/socket.c:2356BUG: memory leak
unreferenced object 0xffff8881228ca500 (size 128):
comm "syz-executor032", pid 7015, jiffies 4294944622 (age 7.880s)
hex dump (first 32 bytes):
00 f0 27 18 81 88 ff ff 80 ac 8c 22 81 88 ff ff ..'........"....
40 b7 23 17 81 88 ff ff 00 00 00 00 00 00 00 00 @.#.............
backtrace:
[<000000000eb78212>] kmemleak_alloc_recursive include/linux/kmemleak.h:43 [inline]
[<000000000eb78212>] slab_post_alloc_hook mm/slab.h:522 [inline]
[<000000000eb78212>] slab_alloc mm/slab.c:3319 [inline]
[<000000000eb78212>] kmem_cache_alloc_trace+0x145/0x2c0 mm/slab.c:3548
[<00000000006ea6c6>] kmalloc include/linux/slab.h:552 [inline]
[<00000000006ea6c6>] kzalloc include/linux/slab.h:748 [inline]
[<00000000006ea6c6>] ovs_vport_alloc+0x37/0xf0 net/openvswitch/vport.c:130
[<00000000f9a04a7d>] internal_dev_create+0x24/0x1d0 net/openvswitch/vport-internal_dev.c:164
[<0000000056ee7c13>] ovs_vport_add+0x81/0x190 net/openvswitch/vport.c:199
[<000000005434efc7>] new_vport+0x19/0x80 net/openvswitch/datapath.c:194
[<00000000b7b253f1>] ovs_dp_cmd_new+0x22f/0x410 net/openvswitch/datapath.c:1614
[<00000000e0988518>] genl_family_rcv_msg+0x2ab/0x5b0 net/netlink/genetlink.c:629
[<00000000d0cc9347>] genl_rcv_msg+0x54/0x9c net/netlink/genetlink.c:654
[<000000006694b647>] netlink_rcv_skb+0x61/0x170 net/netlink/af_netlink.c:2477
[<0000000088381f37>] genl_rcv+0x29/0x40 net/netlink/genetlink.c:665
[<00000000dad42a47>] netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
[<00000000dad42a47>] netlink_unicast+0x1ec/0x2d0 net/netlink/af_netlink.c:1328
[<0000000067e6b079>] netlink_sendmsg+0x270/0x480 net/netlink/af_netlink.c:1917
[<00000000aab08a47>] sock_sendmsg_nosec net/socket.c:637 [inline]
[<00000000aab08a47>] sock_sendmsg+0x54/0x70 net/socket.c:657
[<000000004cb7c11d>] ___sys_sendmsg+0x393/0x3c0 net/socket.c:2311
[<00000000c4901c63>] __sys_sendmsg+0x80/0xf0 net/socket.c:2356
[<00000000c10abb2d>] __do_sys_sendmsg net/socket.c:2365 [inline]
[<00000000c10abb2d>] __se_sys_sendmsg net/socket.c:2363 [inline]
[<00000000c10abb2d>] __x64_sys_sendmsg+0x23/0x30 net/socket.c:2363=====================================================================
The function in net core, register_netdevice(), may fail with vport's destruction callback either invoked or not. After commit 309b66970ee2 ("net: openvswitch: do not free vport if register_netdevice() is failed."), the duty to destroy vport is offloaded from the driver OTOH, which ends up in the memory leak reported.
It is fixed by releasing vport unless device is registered successfully. To do that, the callback assignment is defered until device is registered.
[sbrivio: this was sent to [email protected] and never made its way
to netdev -- resending original patch]
--- net/openvswitch/vport-internal_dev.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
net/openvswitch/vport-internal_dev.c +4 -7
@@ -156,7 +156,7 @@ static void do_setup(struct net_device *netdev) netdev->priv_flags |=IFF_LIVE_ADDR_CHANGE |IFF_OPENVSWITCH |IFF_PHONY_HEADROOM |IFF_NO_QUEUE ; netdev->needs_free_netdev = true; - netdev->priv_destructor = internal_dev_destructor; + netdev->priv_destructor =NULL ; netdev->ethtool_ops = &internal_dev_ethtool_ops; netdev->rtnl_link_ops = &internal_dev_link_ops;
@@ -178,7 +178,6 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)struct internal_dev *internal_dev;struct net_device *dev;int err; -bool free_vport = true; vport =ovs_vport_alloc (0 , &ovs_internal_vport_ops, parms);if (IS_ERR (vport)) {
@@ -210,10 +209,9 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)rtnl_lock (); err =register_netdevice (vport->dev); -if (err) { - free_vport = false; +if (err) goto error_unlock; - } + vport->dev->priv_destructor = internal_dev_destructor;dev_set_promiscuity (vport->dev,1 );rtnl_unlock ();
@@ -227,8 +225,7 @@ error_unlock: error_free_netdev:free_netdev (dev); error_free_vport: -if (free_vport) -ovs_vport_free (vport); +ovs_vport_free (vport); error:return ERR_PTR (err); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 76/105 scsi: lpfc: Honor module parameter lpfc_use_adisc
In reply to Greg Kroah-HartmanFrom: Daniel Wagner <[email protected]>
[ Upstream commit 0fd103ccfe6a06e40e2d9d8c91d96332cc9e1239 ]
The initial lpfc_desc_set_adisc implementation in commit dea3101e0a5c ("lpfc: add Emulex FC driver version 8.0.28") enabled ADISC if
cfg_use_adisc && RSCN_MODE && FCP_2_DEVICE
In commit 92d7f7b0cde3 ("[SCSI] lpfc: NPIV: add NPIV support on top of SLI-3") this changed to
(cfg_use_adisc && RSC_MODE) || FCP_2_DEVICE
and later in commit ffc954936b13 ("[SCSI] lpfc 8.3.13: FC Discovery Fixes and enhancements.") to
(cfg_use_adisc && RSC_MODE) || (FCP_2_DEVICE && FCP_TARGET)
A customer reports that after a devloss, an ADISC failure is logged. It turns out the ADISC flag is set even the user explicitly set lpfc_use_adisc = 0.
[Sat Dec 22 22:55:58 2018] lpfc 0000:82:00.0: 2:(0):0203 Devloss timeout on WWPN 50:01:43:80:12:8e:40:20 NPort x05df00 Data: x82000000 x8 xa [Sat Dec 22 23:08:20 2018] lpfc 0000:82:00.0: 2:(0):2755 ADISC failure DID:05DF00 Status:x9/x70000
[mkp: fixed Hannes' email]
--- drivers/scsi/lpfc/lpfc_nportdisc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/lpfc/lpfc_nportdisc.c +2 -2
@@ -809,9 +809,9 @@ lpfc_disc_set_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)if (!(vport->fc_flag &FC_PT2PT )) {/* Check config parameter use-adisc or FCP-2 */ -if ((vport->cfg_use_adisc && (vport->fc_flag &FC_RSCN_MODE )) || +if (vport->cfg_use_adisc && ((vport->fc_flag &FC_RSCN_MODE ) || ((ndlp->nlp_fcp_info &NLP_FCP_2_DEVICE ) && - (ndlp->nlp_type &NLP_FCP_TARGET ))) { + (ndlp->nlp_type &NLP_FCP_TARGET )))) {spin_lock_irq (shost->host_lock); ndlp->nlp_flag |=NLP_NPR_ADISC ;spin_unlock_irq (shost->host_lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 77/105 scsi: qla2xxx: Initialized mailbox to prevent driver load failure
In reply to Greg Kroah-HartmanFrom: Himanshu Madhani <[email protected]>
[ Upstream commit c2ff2a36eff60efb5e123c940115216d6bf65684 ]
This patch fixes issue with Gen7 adapter in a blade environment where one of the ports will not be detected by driver. Firmware expects mailbox 11 to be set or cleared by driver for newer ISP.
Following message is seen in the log file:
[ 18.810892] qla2xxx [0000:d8:00.0]-1820:1: **** Failed=102 mb[0]=4005 mb[1]=37 mb[2]=20 mb[3]=8 [ 18.819596] cmd=2 ****
[mkp: typos]
--- drivers/scsi/qla2xxx/qla_mbx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/qla2xxx/qla_mbx.c +2 -1
@@ -624,6 +624,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) mcp->mb[2 ] =LSW (risc_addr); mcp->mb[3 ] =0 ; mcp->mb[4 ] =0 ; + mcp->mb[11 ] =0 ; ha->flags.using_lr_setting =0 ;if (IS_QLA25XX (ha) ||IS_QLA81XX (ha) ||IS_QLA83XX (ha) ||IS_QLA27XX (ha)) {
@@ -667,7 +668,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)if (ha->flags.exchoffld_enabled) mcp->mb[4 ] |=ENABLE_EXCHANGE_OFFLD ; - mcp->out_mb |=MBX_4 |MBX_3 |MBX_2 |MBX_1 ; + mcp->out_mb |=MBX_4 |MBX_3 |MBX_2 |MBX_1 |MBX_11 ; mcp->in_mb |=MBX_3 |MBX_2 |MBX_1 ; }else { mcp->mb[1 ] =LSW (risc_addr);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 78/105 ipvs: dont ignore errors in case refcounting ip_vs module fails
In reply to Greg Kroah-HartmanFrom: Davide Caratti <[email protected]>
[ Upstream commit 62931f59ce9cbabb934a431f48f2f1f441c605ac ]
if the IPVS module is removed while the sync daemon is starting, there is a small gap where try_module_get() might fail getting the refcount inside ip_vs_use_count_inc(). Then, the refcounts of IPVS module are unbalanced, and the subsequent call to stop_sync_thread() causes the following splat:
WARNING: CPU: 0 PID: 4013 at kernel/module.c:1146 module_put.part.44+0x15b/0x290 Modules linked in: ip_vs(-) nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 veth ip6table_filter ip6_tables iptable_filter binfmt_misc intel_rapl_msr intel_rapl_common crct10dif_pclmul crc32_pclmul ext4 mbcache jbd2 ghash_clmulni_intel snd_hda_codec_generic ledtrig_audio snd_hda_intel snd_intel_nhlt snd_hda_codec snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm aesni_intel crypto_simd cryptd glue_helper joydev pcspkr snd_timer virtio_balloon snd soundcore i2c_piix4 nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c ata_generic pata_acpi virtio_net net_failover virtio_blk failover virtio_console qxl drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ata_piix ttm crc32c_intel serio_raw drm virtio_pci libata virtio_ring virtio floppy dm_mirror dm_region_hash dm_log dm_mod [last unloaded: nf_defrag_ipv6] CPU: 0 PID: 4013 Comm: modprobe Tainted: G W 5.4.0-rc1.upstream+ #741 Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 RIP: 0010:module_put.part.44+0x15b/0x290 Code: 04 25 28 00 00 00 0f 85 18 01 00 00 48 83 c4 68 5b 5d 41 5c 41 5d 41 5e 41 5f c3 89 44 24 28 83 e8 01 89 c5 0f 89 57 ff ff ff <0f> 0b e9 78 ff ff ff 65 8b 1d 67 83 26 4a 89 db be 08 00 00 00 48 RSP: 0018:ffff888050607c78 EFLAGS: 00010297 RAX: 0000000000000003 RBX: ffffffffc1420590 RCX: ffffffffb5db0ef9 RDX: 0000000000000000 RSI: 0000000000000004 RDI: ffffffffc1420590 RBP: 00000000ffffffff R08: fffffbfff82840b3 R09: fffffbfff82840b3 R10: 0000000000000001 R11: fffffbfff82840b2 R12: 1ffff1100a0c0f90 R13: ffffffffc1420200 R14: ffff88804f533300 R15: ffff88804f533ca0 FS: 00007f8ea9720740(0000) GS:ffff888053800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f3245abe000 CR3: 000000004c28a006 CR4: 00000000001606f0 Call Trace: stop_sync_thread+0x3a3/0x7c0 [ip_vs] ip_vs_sync_net_cleanup+0x13/0x50 [ip_vs] ops_exit_list.isra.5+0x94/0x140 unregister_pernet_operations+0x29d/0x460 unregister_pernet_device+0x26/0x60 ip_vs_cleanup+0x11/0x38 [ip_vs] __x64_sys_delete_module+0x2d5/0x400 do_syscall_64+0xa5/0x4e0 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x7f8ea8bf0db7 Code: 73 01 c3 48 8b 0d b9 80 2c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 b8 b0 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 89 80 2c 00 f7 d8 64 89 01 48 RSP: 002b:00007ffcd38d2fe8 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 0000000002436240 RCX: 00007f8ea8bf0db7 RDX: 0000000000000000 RSI: 0000000000000800 RDI: 00000000024362a8 RBP: 0000000000000000 R08: 00007f8ea8eba060 R09: 00007f8ea8c658a0 R10: 00007ffcd38d2a60 R11: 0000000000000206 R12: 0000000000000000 R13: 0000000000000001 R14: 00000000024362a8 R15: 0000000000000000 irq event stamp: 4538 hardirqs last enabled at (4537): [<ffffffffb6193dde>] quarantine_put+0x9e/0x170 hardirqs last disabled at (4538): [<ffffffffb5a0556a>] trace_hardirqs_off_thunk+0x1a/0x20 softirqs last enabled at (4522): [<ffffffffb6f8ebe9>] sk_common_release+0x169/0x2d0 softirqs last disabled at (4520): [<ffffffffb6f8eb3e>] sk_common_release+0xbe/0x2d0
Check the return value of ip_vs_use_count_inc() and let its caller return proper error. Inside do_ip_vs_set_ctl() the module is already refcounted, we don't need refcount/derefcount there. Finally, in register_ip_vs_app() and start_sync_thread(), take the module refcount earlier and ensure it's released in the error path.
Change since v1:
- better return values in case of failure of ip_vs_use_count_inc(), thanks to Julian Anastasov
- no need to increase/decrease the module refcount in ip_vs_set_ctl(), thanks to Julian Anastasov
--- net/netfilter/ipvs/ip_vs_app.c | 12 ++++++++++-- net/netfilter/ipvs/ip_vs_ctl.c | 14 ++++---------- net/netfilter/ipvs/ip_vs_pe.c | 3 ++- net/netfilter/ipvs/ip_vs_sched.c | 3 ++- net/netfilter/ipvs/ip_vs_sync.c | 13 ++++++++++--- 5 files changed, 28 insertions(+), 17 deletions(-)
net/netfilter/ipvs/ip_vs_app.c +10 -2
@@ -198,21 +198,29 @@ struct ip_vs_app *register_ip_vs_app(struct netns_ipvs *ipvs, struct ip_vs_app *mutex_lock (&__ip_vs_app_mutex); +/* increase the module use count */ +if (!ip_vs_use_count_inc ()) { + err = -ENOENT ; + goto out_unlock; + } +list_for_each_entry (a, &ipvs->app_list, a_list) {if (!strcmp (app->name, a->name)) { err = -EEXIST ; +/* decrease the module use count */ +ip_vs_use_count_dec (); goto out_unlock; } } a =kmemdup (app,sizeof (*app),GFP_KERNEL );if (!a) { err = -ENOMEM ; +/* decrease the module use count */ +ip_vs_use_count_dec (); goto out_unlock; }INIT_LIST_HEAD (&a->incs_list);list_add (&a->a_list, &ipvs->app_list); -/* increase the module use count */ -ip_vs_use_count_inc (); out_unlock:mutex_unlock (&__ip_vs_app_mutex);
net/netfilter/ipvs/ip_vs_ctl.c +4 -10
@@ -1197,7 +1197,8 @@ ip_vs_add_service(struct netns_ipvs *ipvs, struct ip_vs_service_user_kern *u,struct ip_vs_service *svc =NULL ;/* increase the module use count */ -ip_vs_use_count_inc (); +if (!ip_vs_use_count_inc ()) +return -ENOPROTOOPT ;/* Lookup the scheduler by 'u->sched_name' */ if (strcmp (u->sched_name,"none" )) {
@@ -2395,9 +2396,6 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)if (copy_from_user (arg, user, len) !=0 )return -EFAULT ; -/* increase the module use count */ -ip_vs_use_count_inc (); -/* Handle daemons since they have another lock */ if (cmd ==IP_VS_SO_SET_STARTDAEMON || cmd ==IP_VS_SO_SET_STOPDAEMON ) {
@@ -2410,13 +2408,13 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) ret = -EINVAL ;if (strscpy (cfg.mcast_ifn, dm->mcast_ifn,sizeof (cfg.mcast_ifn)) <=0 ) - goto out_dec; +return ret; cfg.syncid = dm->syncid; ret =start_sync_thread (ipvs, &cfg, dm->state); }else { ret =stop_sync_thread (ipvs, dm->state); } - goto out_dec; +return ret; }mutex_lock (&__ip_vs_mutex);
@@ -2511,10 +2509,6 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) out_unlock:mutex_unlock (&__ip_vs_mutex); - out_dec: -/* decrease the module use count */ -ip_vs_use_count_dec (); -return ret; }
net/netfilter/ipvs/ip_vs_pe.c +2 -1
@@ -67,7 +67,8 @@ int register_ip_vs_pe(struct ip_vs_pe *pe)struct ip_vs_pe *tmp;/* increase the module use count */ -ip_vs_use_count_inc (); +if (!ip_vs_use_count_inc ()) +return -ENOENT ;mutex_lock (&ip_vs_pe_mutex);/* Make sure that the pe with this name doesn't exist
net/netfilter/ipvs/ip_vs_sched.c +2 -1
@@ -184,7 +184,8 @@ int register_ip_vs_scheduler(struct ip_vs_scheduler *scheduler) }/* increase the module use count */ -ip_vs_use_count_inc (); +if (!ip_vs_use_count_inc ()) +return -ENOENT ;mutex_lock (&ip_vs_sched_mutex);
net/netfilter/ipvs/ip_vs_sync.c +10 -3
@@ -1771,6 +1771,10 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c,IP_VS_DBG (7 ,"Each ip_vs_sync_conn entry needs %zd bytes\n" ,sizeof (struct ip_vs_sync_conn_v0 )); +/* increase the module use count */ +if (!ip_vs_use_count_inc ()) +return -ENOPROTOOPT ; +/* Do not hold one mutex and then to block on another */ for (;;) {rtnl_lock ();
@@ -1901,9 +1905,6 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c,mutex_unlock (&ipvs->sync_mutex);rtnl_unlock (); -/* increase the module use count */ -ip_vs_use_count_inc (); -return 0 ; out:
@@ -1933,11 +1934,17 @@ out: }kfree (ti); } + +/* decrease the module use count */ +ip_vs_use_count_dec ();return result; out_early:mutex_unlock (&ipvs->sync_mutex);rtnl_unlock (); + +/* decrease the module use count */ +ip_vs_use_count_dec ();return result; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 79/105 ipvs: move old_secure_tcp into struct netns_ipvs
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit c24b75e0f9239e78105f81c5f03a751641eb07ef ]
syzbot reported the following issue :
BUG: KCSAN: data-race in update_defense_level / update_defense_level
read to 0xffffffff861a6260 of 4 bytes by task 3006 on cpu 1:
update_defense_level+0x621/0xb30 net/netfilter/ipvs/ip_vs_ctl.c:177 defense_work_handler+0x3d/0xd0 net/netfilter/ipvs/ip_vs_ctl.c:225 process_one_work+0x3d4/0x890 kernel/workqueue.c:2269 worker_thread+0xa0/0x800 kernel/workqueue.c:2415 kthread+0x1d4/0x200 drivers/block/aoe/aoecmd.c:1253 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:352
write to 0xffffffff861a6260 of 4 bytes by task 7333 on cpu 0:
update_defense_level+0xa62/0xb30 net/netfilter/ipvs/ip_vs_ctl.c:205 defense_work_handler+0x3d/0xd0 net/netfilter/ipvs/ip_vs_ctl.c:225 process_one_work+0x3d4/0x890 kernel/workqueue.c:2269 worker_thread+0xa0/0x800 kernel/workqueue.c:2415 kthread+0x1d4/0x200 drivers/block/aoe/aoecmd.c:1253 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:352
Reported by Kernel Concurrency Sanitizer on:
CPU: 0 PID: 7333 Comm: kworker/0:5 Not tainted 5.4.0-rc3+ #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Workqueue: events defense_work_handler
Indeed, old_secure_tcp is currently a static variable, while it needs to be a per netns variable.
--- include/net/ip_vs.h | 1 + net/netfilter/ipvs/ip_vs_ctl.c | 15 +++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-)
include/net/ip_vs.h +1 -0
@@ -891,6 +891,7 @@ struct netns_ipvs {struct delayed_work defense_work;/* Work handler */ int drop_rate;int drop_counter; +int old_secure_tcp;atomic_t dropentry;/* locks in ctl.c */ spinlock_t dropentry_lock;/* drop entry handling */
net/netfilter/ipvs/ip_vs_ctl.c +7 -8
@@ -98,7 +98,6 @@ static bool __ip_vs_addr_is_local_v6(struct net *net,static void update_defense_level (struct netns_ipvs *ipvs) {struct sysinfo i; -static int old_secure_tcp =0 ;int availmem;int nomem;int to_change =-1 ;
@@ -179,35 +178,35 @@ static void update_defense_level(struct netns_ipvs *ipvs)spin_lock (&ipvs->securetcp_lock);switch (ipvs->sysctl_secure_tcp) {case 0 : -if (old_secure_tcp >=2 ) +if (ipvs->old_secure_tcp >=2 ) to_change =0 ;break ;case 1 :if (nomem) { -if (old_secure_tcp <2 ) +if (ipvs->old_secure_tcp <2 ) to_change =1 ; ipvs->sysctl_secure_tcp =2 ; }else { -if (old_secure_tcp >=2 ) +if (ipvs->old_secure_tcp >=2 ) to_change =0 ; }break ;case 2 :if (nomem) { -if (old_secure_tcp <2 ) +if (ipvs->old_secure_tcp <2 ) to_change =1 ; }else { -if (old_secure_tcp >=2 ) +if (ipvs->old_secure_tcp >=2 ) to_change =0 ; ipvs->sysctl_secure_tcp =1 ; }break ;case 3 : -if (old_secure_tcp <2 ) +if (ipvs->old_secure_tcp <2 ) to_change =1 ;break ; } - old_secure_tcp = ipvs->sysctl_secure_tcp; + ipvs->old_secure_tcp = ipvs->sysctl_secure_tcp;if (to_change >=0 )ip_vs_protocol_timeout_change (ipvs, ipvs->sysctl_secure_tcp >1 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 80/105 bonding: fix unexpected IFF_BONDING bit unset
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit 65de65d9033750d2cf1b336c9d6e9da3a8b5cc6e ]
The IFF_BONDING means bonding master or bonding slave device. ->ndo_add_slave() sets IFF_BONDING flag and ->ndo_del_slave() unsets IFF_BONDING flag.
bond0<--bond1
Both bond0 and bond1 are bonding device and these should keep having IFF_BONDING flag until they are removed.
But bond1 would lose IFF_BONDING at ->ndo_del_slave() because that routine do not check whether the slave device is the bonding type or not. This patch adds the interface type check routine before removing IFF_BONDING flag.
Test commands:
ip link add bond0 type bond
ip link add bond1 type bond
ip link set bond1 master bond0
ip link set bond1 nomaster
ip link del bond1 type bond
ip link add bond1 type bond
Splat looks like:
[ 226.665555] proc_dir_entry 'bonding/bond1' already registered [ 226.666440] WARNING: CPU: 0 PID: 737 at fs/proc/generic.c:361 proc_register+0x2a9/0x3e0 [ 226.667571] Modules linked in: bonding af_packet sch_fq_codel ip_tables x_tables unix [ 226.668662] CPU: 0 PID: 737 Comm: ip Not tainted 5.4.0-rc3+ #96 [ 226.669508] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 226.670652] RIP: 0010:proc_register+0x2a9/0x3e0 [ 226.671612] Code: 89 fa 48 c1 ea 03 80 3c 02 00 0f 85 39 01 00 00 48 8b 04 24 48 89 ea 48 c7 c7 a0 0b 14 9f 48 8b b0 e 0 00 00 00 e8 07 e7 88 ff <0f> 0b 48 c7 c7 40 2d a5 9f e8 59 d6 23 01 48 8b 4c 24 10 48 b8 00 [ 226.675007] RSP: 0018:ffff888050e17078 EFLAGS: 00010282 [ 226.675761] RAX: dffffc0000000008 RBX: ffff88805fdd0f10 RCX: ffffffff9dd344e2 [ 226.676757] RDX: 0000000000000001 RSI: 0000000000000008 RDI: ffff88806c9f6b8c [ 226.677751] RBP: ffff8880507160f3 R08: ffffed100d940019 R09: ffffed100d940019 [ 226.678761] R10: 0000000000000001 R11: ffffed100d940018 R12: ffff888050716008 [ 226.679757] R13: ffff8880507160f2 R14: dffffc0000000000 R15: ffffed100a0e2c1e [ 226.680758] FS: 00007fdc217cc0c0(0000) GS:ffff88806c800000(0000) knlGS:0000000000000000 [ 226.681886] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 226.682719] CR2: 00007f49313424d0 CR3: 0000000050e46001 CR4: 00000000000606f0 [ 226.683727] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 226.684725] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 226.685681] Call Trace: [ 226.687089] proc_create_seq_private+0xb3/0xf0 [ 226.687778] bond_create_proc_entry+0x1b3/0x3f0 [bonding] [ 226.691458] bond_netdev_event+0x433/0x970 [bonding] [ 226.692139] ? __module_text_address+0x13/0x140 [ 226.692779] notifier_call_chain+0x90/0x160 [ 226.693401] register_netdevice+0x9b3/0xd80 [ 226.694010] ? alloc_netdev_mqs+0x854/0xc10 [ 226.694629] ? netdev_change_features+0xa0/0xa0 [ 226.695278] ? rtnl_create_link+0x2ed/0xad0 [ 226.695849] bond_newlink+0x2a/0x60 [bonding] [ 226.696422] __rtnl_newlink+0xb9f/0x11b0 [ 226.696968] ? rtnl_link_unregister+0x220/0x220
[ ... ]
--- drivers/net/bonding/bond_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/bonding/bond_main.c +4 -2
@@ -1779,7 +1779,8 @@ err_hwaddr_unsync:bond_hw_addr_flush (bond_dev, slave_dev); err_close: - slave_dev->priv_flags &= ~IFF_BONDING ; +if (!netif_is_bond_master (slave_dev)) + slave_dev->priv_flags &= ~IFF_BONDING ;dev_close (slave_dev); err_restore_mac:
@@ -1985,7 +1986,8 @@ static int __bond_release_one(struct net_device *bond_dev,else dev_set_mtu (slave_dev, slave->original_mtu); - slave_dev->priv_flags &= ~IFF_BONDING ; +if (!netif_is_bond_master (slave_dev)) + slave_dev->priv_flags &= ~IFF_BONDING ;bond_free_slave (slave);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 81/105 macsec: fix refcnt leak in module exit routine
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit 2bce1ebed17da54c65042ec2b962e3234bad5b47 ]
When a macsec interface is created, it increases a refcnt to a lower device(real device). when macsec interface is deleted, the refcnt is decreased in macsec_free_netdev(), which is ->priv_destructor() of macsec interface.
The problem scenario is this.
When nested macsec interfaces are exiting, the exit routine of the macsec module makes refcnt leaks.
Test commands:
ip link add dummy0 type dummy
ip link add macsec0 link dummy0 type macsec
ip link add macsec1 link macsec0 type macsec
modprobe -rv macsec
[ 208.629433] unregister_netdevice: waiting for macsec0 to become free. Usage count = 1
Steps of exit routine of macsec module are below.
1. Calls ->dellink() in __rtnl_link_unregister().
2. Checks refcnt and wait refcnt to be 0 if refcnt is not 0 in netdev_run_todo().
3. Calls ->priv_destruvtor() in netdev_run_todo().
Step2 checks refcnt, but step3 decreases refcnt.
So, step2 waits forever.
This patch makes the macsec module do not hold a refcnt of the lower device because it already holds a refcnt of the lower device with netdev_upper_dev_link().
--- drivers/net/macsec.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/net/macsec.c +0 -4
@@ -2993,12 +2993,10 @@ static const struct nla_policy macsec_rtnl_policy[IFLA_MACSEC_MAX + 1] = {static void macsec_free_netdev (struct net_device *dev) {struct macsec_dev *macsec =macsec_priv (dev); -struct net_device *real_dev = macsec->real_dev;free_percpu (macsec->stats);free_percpu (macsec->secy.tx_sc.stats); -dev_put (real_dev); }static void macsec_setup (struct net_device *dev)
@@ -3239,8 +3237,6 @@ static int macsec_newlink(struct net *net, struct net_device *dev,if (err <0 )return err; -dev_hold (real_dev); - macsec->nest_level =dev_get_nest_level (real_dev) +1 ;netdev_lockdep_set_classes (dev); lockdep_set_class_and_subclass(&dev->addr_list_lock,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 82/105 usb: fsl: Check memory resource before releasing it
In reply to Greg Kroah-HartmanFrom: Nikhil Badola <[email protected]>
[ Upstream commit bc1e3a2dd0c9954fd956ac43ca2876bbea018c01 ]
Check memory resource existence before releasing it to avoid NULL pointer dereference
--- drivers/usb/gadget/udc/fsl_udc_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/fsl_udc_core.c +1 -1
@@ -2569,7 +2569,7 @@ static int fsl_udc_remove(struct platform_device *pdev)dma_pool_destroy (udc_controller->td_pool);free_irq (udc_controller->irq, udc_controller);iounmap (dr_regs); -if (pdata->operating_mode ==FSL_USB2_DR_DEVICE ) +if (res && (pdata->operating_mode ==FSL_USB2_DR_DEVICE ))release_mem_region (res->start,resource_size (res));/* free udc --wait for the release() finished */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 83/105 usb: gadget: udc: atmel: Fix interrupt storm in FIFO mode.
In reply to Greg Kroah-HartmanFrom: Cristian Birsan <[email protected]>
[ Upstream commit ba3a1a915c49cc3023e4ddfc88f21e7514e82aa4 ]
Fix interrupt storm generated by endpoints when working in FIFO mode. The TX_COMPLETE interrupt is used only by control endpoints processing. Do not enable it for other types of endpoints.
--- drivers/usb/gadget/udc/atmel_usba_udc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/usb/gadget/udc/atmel_usba_udc.c +4 -2
@@ -488,9 +488,11 @@ static void submit_request(struct usba_ep *ep, struct usba_request *req)next_fifo_transaction (ep, req);if (req->last_transaction) {usba_ep_writel (ep,CTL_DIS ,USBA_TX_PK_RDY ); -usba_ep_writel (ep,CTL_ENB ,USBA_TX_COMPLETE ); +if (ep_is_control (ep)) +usba_ep_writel (ep,CTL_ENB ,USBA_TX_COMPLETE ); }else { -usba_ep_writel (ep,CTL_DIS ,USBA_TX_COMPLETE ); +if (ep_is_control (ep)) +usba_ep_writel (ep,CTL_DIS ,USBA_TX_COMPLETE );usba_ep_writel (ep,CTL_ENB ,USBA_TX_PK_RDY ); } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 84/105 usb: gadget: composite: Fix possible double free memory bug
In reply to Greg Kroah-HartmanFrom: Chandana Kishori Chiluveru <[email protected]>
[ Upstream commit 1c20c89b0421b52b2417bb0f62a611bc669eda1d ]
composite_dev_cleanup call from the failure of configfs_composite_bind frees up the cdev->os_desc_req and cdev->req. If the previous calls of bind and unbind is successful these will carry stale values.
Consider the below sequence of function calls:configfs_composite_bind()
composite_dev_prepare()
- Allocate cdev->req, cdev->req->buf
composite_os_desc_req_prepare()
- Allocate cdev->os_desc_req, cdev->os_desc_req->bufconfigfs_composite_unbind()
composite_dev_cleanup()
- free the cdev->os_desc_req->buf and cdev->req->buf
Next composition switchconfigfs_composite_bind()
- If it fails goto err_comp_cleanup will call the composite_dev_cleanup() function
composite_dev_cleanup()
- calls kfree up with the stale values of cdev->req->buf and cdev->os_desc_req from the previous configfs_composite_bind call. The free call on these stale values leads to double free.
Hence, Fix this issue by setting request and buffer pointer to NULL after kfree.
--- drivers/usb/gadget/composite.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/gadget/composite.c +4 -0
@@ -2187,14 +2187,18 @@ void composite_dev_cleanup(struct usb_composite_dev *cdev)usb_ep_dequeue (cdev->gadget->ep0, cdev->os_desc_req);kfree (cdev->os_desc_req->buf); + cdev->os_desc_req->buf =NULL ;usb_ep_free_request (cdev->gadget->ep0, cdev->os_desc_req); + cdev->os_desc_req =NULL ; }if (cdev->req) {if (cdev->setup_pending)usb_ep_dequeue (cdev->gadget->ep0, cdev->req);kfree (cdev->req->buf); + cdev->req->buf =NULL ;usb_ep_free_request (cdev->gadget->ep0, cdev->req); + cdev->req =NULL ; } cdev->next_string_id =0 ;device_remove_file (&cdev->gadget->dev, &dev_attr_suspended);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 85/105 usb: gadget: configfs: fix concurrent issue between composite APIs
In reply to Greg Kroah-HartmanFrom: Peter Chen <[email protected]>
[ Upstream commit 1a1c851bbd706ea9f3a9756c2d3db28523506d3b ]
We meet several NULL pointer issues if configfs_composite_unbind and composite_setup (or composite_disconnect) are running together. These issues occur when do the function switch stress test, the configfs_compsoite_unbind is called from user mode by
echo "" to /sys/../UDC entry, and meanwhile, the setup interrupt or disconnect interrupt occurs by hardware. The composite_setup will get the cdev from get_gadget_data, but configfs_composite_unbind will set gadget data as NULL, so the NULL pointer issue occurs. This concurrent is hard to reproduce by native kernel, but can be reproduced by android kernel.
In this commit, we introduce one spinlock belongs to structure gadget_info since we can't use the same spinlock in usb_composite_dev due to exclusive running together between composite_setup and configfs_composite_unbind. And one bit flag 'unbind' to indicate the code is at unbind routine, this bit is needed due to we release the lock at during configfs_composite_unbind sometimes, and composite_setup may be run at that time.
Several oops:
oops 1:android_work: sent uevent USB_STATE=CONNECTED
configfs-gadget gadget: super-speed config #1: bandroid_work: sent uevent USB_STATE=CONFIGURED
init: Received control message 'start' for 'adbd' from pid: 3515 (system_server)
Unable to handle kernel NULL pointer dereference at virtual address 0000002a
init: Received control message 'stop' for 'adbd' from pid: 3375 (/vendor/bin/hw/[email protected]) Mem abort info:
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000004
CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgd = ffff8008f1b7f000
[000000000000002a] *pgd=0000000000000000
Internal error: Oops: 96000004 [#1] PREEMPT SMP Modules linked in: CPU: 4 PID: 2457 Comm: irq/125-5b11000 Not tainted 4.14.98-07846-g0b40a9b-dirty #16 Hardware name: Freescale i.MX8QM MEK (DT) task: ffff8008f2a98000 task.stack: ffff00000b7b8000 PC is at composite_setup+0x44/0x1508 LR is at android_setup+0xb8/0x13c pc : [<ffff0000089ffb3c>] lr : [<ffff000008a032fc>] pstate: 800001c5
sp : ffff00000b7bbb80
x29: ffff00000b7bbb80 x28: ffff8008f2a3c010
x27: 0000000000000001 x26: 0000000000000000 [1232/1897]
audit: audit_lost=25791 audit_rate_limit=5 audit_backlog_limit=64
x25: 00000000ffffffa1 x24: ffff8008f2a3c010
audit: rate limit exceeded
x23: 0000000000000409 x22: ffff000009c8e000
x21: ffff8008f7a8b428 x20: ffff00000afae000
x19: ffff0000089ff000 x18: 0000000000000000
x17: 0000000000000000 x16: ffff0000082b7c9c
x15: 0000000000000000 x14: f1866f5b952aca46
x13: e35502e30d44349c x12: 0000000000000008
x11: 0000000000000008 x10: 0000000000000a30
x9 : ffff00000b7bbd00 x8 : ffff8008f2a98a90
x7 : ffff8008f27a9c90 x6 : 0000000000000001
x5 : 0000000000000000 x4 : 0000000000000001
x3 : 0000000000000000 x2 : 0000000000000006
x1 : ffff0000089ff8d0 x0 : 732a010310b9ed00
X7: 0xffff8008f27a9c10:
9c10 00000002 00000000 00000001 00000000 13110000 ffff0000 00000002 00208040 9c30 00000000 00000000 00000000 00000000 00000000 00000005 00000029 00000000 9c50 00051778 00000001 f27a8e00 ffff8008 00000005 00000000 00000078 00000078 9c70 00000078 00000000 09031d48 ffff0000 00100000 00000000 00400000 00000000 9c90 00000001 00000000 00000000 00000000 00000000 00000000 ffefb1a0 ffff8008 9cb0 f27a9ca8 ffff8008 00000000 00000000 b9d88037 00000173 1618a3eb 00000001 9cd0 870a792a 0000002e 16188fe6 00000001 0000242b 00000000 00000000 00000000
using random self ethernet address
9cf0 019a4646 00000000 000547f3 00000000 ecfd6c33 00000002 00000000 using random host ethernet address
00000000
X8: 0xffff8008f2a98a10:
8a10 00000000 00000000 f7788d00 ffff8008 00000001 00000000 00000000 00000000 8a30 eb218000 ffff8008 f2a98000 ffff8008 f2a98000 ffff8008 09885000 ffff0000 8a50 f34df480 ffff8008 00000000 00000000 f2a98648 ffff8008 09c8e000 ffff0000 8a70 fff2c800 ffff8008 09031d48 ffff0000 0b7bbd00 ffff0000 0b7bbd00 ffff0000 8a90 080861bc ffff0000 00000000 00000000 00000000 00000000 00000000 00000000 8ab0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 8ad0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 8af0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
X21: 0xffff8008f7a8b3a8:
b3a8 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 b3c8 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 b3e8 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 b408 00000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b428 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 b448 0053004d 00540046 00300031 00010030 eb07b520 ffff8008 20011201 00000003 b468 e418d109 0104404e 00010302 00000000 eb07b558 ffff8008 eb07b558 ffff8008 b488 f7a8b488 ffff8008 f7a8b488 ffff8008 f7a8b300 ffff8008 00000000 00000000
X24: 0xffff8008f2a3bf90:
bf90 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 bfb0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 bfd0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 bff0 00000000 00000000 00000000 00000000 f76c8010 ffff8008 f76c8010 ffff8008 c010 00000000 00000000 f2a3c018 ffff8008 f2a3c018 ffff8008 08a067dc ffff0000 c030 f2a5a000 ffff8008 091c3650 ffff0000 f716fd18 ffff8008 f716fe30 ffff8008 c050 f2ce4a30 ffff8008 00000000 00000005 00000000 00000000 095d1568 ffff0000 c070 f76c8010 ffff8008 f2ce4b00 ffff8008 095cac68 ffff0000 f2a5a028 ffff8008
X28: 0xffff8008f2a3bf90:
bf90 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 bfb0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 bfd0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 bff0 00000000 00000000 00000000 00000000 f76c8010 ffff8008 f76c8010 ffff8008 c010 00000000 00000000 f2a3c018 ffff8008 f2a3c018 ffff8008 08a067dc ffff0000 c030 f2a5a000 ffff8008 091c3650 ffff0000 f716fd18 ffff8008 f716fe30 ffff8008 c050 f2ce4a30 ffff8008 00000000 00000005 00000000 00000000 095d1568 ffff0000 c070 f76c8010 ffff8008 f2ce4b00 ffff8008 095cac68 ffff0000 f2a5a028 ffff8008
Process irq/125-5b11000 (pid: 2457, stack limit = 0xffff00000b7b8000)
Call trace: Exception stack(0xffff00000b7bba40 to 0xffff00000b7bbb80)
ba40: 732a010310b9ed00 ffff0000089ff8d0 0000000000000006 0000000000000000
ba60: 0000000000000001 0000000000000000 0000000000000001 ffff8008f27a9c90
ba80: ffff8008f2a98a90 ffff00000b7bbd00 0000000000000a30 0000000000000008
baa0: 0000000000000008 e35502e30d44349c f1866f5b952aca46 0000000000000000
bac0: ffff0000082b7c9c 0000000000000000 0000000000000000 ffff0000089ff000
bae0: ffff00000afae000 ffff8008f7a8b428 ffff000009c8e000 0000000000000409
bb00: ffff8008f2a3c010 00000000ffffffa1 0000000000000000 0000000000000001
bb20: ffff8008f2a3c010 ffff00000b7bbb80 ffff000008a032fc ffff00000b7bbb80
bb40: ffff0000089ffb3c 00000000800001c5 ffff00000b7bbb80 732a010310b9ed00
bb60: ffffffffffffffff ffff0000080f777c ffff00000b7bbb80 ffff0000089ffb3c
[<ffff0000089ffb3c>] composite_setup+0x44/0x1508 [<ffff000008a032fc>] android_setup+0xb8/0x13c [<ffff0000089bd9a8>] cdns3_ep0_delegate_req+0x44/0x70 [<ffff0000089bdff4>] cdns3_check_ep0_interrupt_proceed+0x33c/0x654 [<ffff0000089bca44>] cdns3_device_thread_irq_handler+0x4b0/0x4bc [<ffff0000089b77b4>] cdns3_thread_irq+0x48/0x68 [<ffff000008145bf0>] irq_thread_fn+0x28/0x88 [<ffff000008145e38>] irq_thread+0x13c/0x228 [<ffff0000080fed70>] kthread+0x104/0x130 [<ffff000008085064>] ret_from_fork+0x10/0x18
oops2:composite_disconnect: Calling disconnect on a Gadget that is not connectedandroid_work: did not send uevent (0 0 (null))
init: Received control message 'stop' for 'adbd' from pid: 3359 (/vendor/bin/hw/[email protected])
init: Sending signal 9 to service 'adbd' (pid 22343) process group...
------------[ cut here ]------------ audit: audit_lost=180038 audit_rate_limit=5 audit_backlog_limit=64 audit: rate limit exceeded WARNING: CPU: 0 PID: 3468 at kernel_imx/drivers/usb/gadget/composite.c:2009 composite_disconnect+0x80/0x88 Modules linked in: CPU: 0 PID: 3468 Comm: HWC-UEvent-Thre Not tainted 4.14.98-07846-g0b40a9b-dirty #16 Hardware name: Freescale i.MX8QM MEK (DT) task: ffff8008f2349c00 task.stack: ffff00000b0a8000 PC is at composite_disconnect+0x80/0x88 LR is at composite_disconnect+0x80/0x88 pc : [<ffff0000089ff9b0>] lr : [<ffff0000089ff9b0>] pstate: 600001c5
sp : ffff000008003dd0
x29: ffff000008003dd0 x28: ffff8008f2349c00
x27: ffff000009885018 x26: ffff000008004000
Timeout for IPC response!
x25: ffff000009885018 x24: ffff000009c8e280
x23: ffff8008f2d98010 x22: 00000000000001c0
x21: ffff8008f2d98394 x20: ffff8008f2d98010
x19: 0000000000000000 x18: 0000e3956f4f075a
fxos8700 4-001e: i2c block read acc failed
x17: 0000e395735727e8 x16: ffff00000829f4d4
x15: ffffffffffffffff x14: 7463656e6e6f6320
x13: 746f6e2009090920 x12: 7369207461687420
x11: 7465676461472061 x10: 206e6f207463656e
x9 : 6e6f637369642067 x8 : ffff000009c8e280
x7 : ffff0000086ca6cc x6 : ffff000009f15e78
x5 : 0000000000000000 x4 : 0000000000000000
x3 : ffffffffffffffff x2 : c3f28b86000c3900
x1 : c3f28b86000c3900 x0 : 000000000000004e
X20: 0xffff8008f2d97f90:
7f90 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 7fb0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
libprocessgroup: Failed to kill process cgroup uid 0 pid 22343 in 215ms, 1 processes remain 7fd0
Timeout for IPC response!
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
using random self ethernet address
7ff0 00000000 00000000 00000000 00000000 f76c8010 ffff8008 f76c8010 ffff8008 8010 00000100 00000000 f2d98018 ffff8008 f2d98018 ffff8008 08a067dc
using random host ethernet address
ffff0000
8030 f206d800 ffff8008 091c3650 ffff0000 f7957b18 ffff8008 f7957730 ffff8008 8050 f716a630 ffff8008 00000000 00000005 00000000 00000000 095d1568 ffff0000 8070 f76c8010 ffff8008 f716a800 ffff8008 095cac68 ffff0000 f206d828 ffff8008
X21: 0xffff8008f2d98314:
8314 ffff8008 00000000 00000000 00000000 00000000 00000000 00000000 00000000 8334 00000000 00000000 00000000 00000000 00000000 08a04cf4 ffff0000 00000000 8354 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 8374 00000000 00000000 00000000 00001001 00000000 00000000 00000000 00000000 8394 e4bbe4bb 0f230000 ffff0000 0afae000 ffff0000 ae001000 00000000 f206d400 Timeout for IPC response! 83b4 ffff8008 00000000 00000000 f7957b18 ffff8008 f7957718 ffff8008 f7957018 83d4 ffff8008 f7957118 ffff8008 f7957618 ffff8008 f7957818 ffff8008 f7957918 83f4 ffff8008 f7957d18 ffff8008 00000000 00000000 00000000 00000000 00000000
X23: 0xffff8008f2d97f90:
7f90 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 7fb0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 7fd0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 7ff0 00000000 00000000 00000000 00000000 f76c8010 ffff8008 f76c8010 ffff8008 8010 00000100 00000000 f2d98018 ffff8008 f2d98018 ffff8008 08a067dc ffff0000 8030 f206d800 ffff8008 091c3650 ffff0000 f7957b18 ffff8008 f7957730 ffff8008 8050 f716a630 ffff8008 00000000 00000005 00000000 00000000 095d1568 ffff0000 8070 f76c8010 ffff8008 f716a800 ffff8008 095cac68 ffff0000 f206d828 ffff8008
X28: 0xffff8008f2349b80:
9b80 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 9ba0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 9bc0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 9be0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 9c00 00000022 00000000 ffffffff ffffffff 00010001 00000000 00000000 00000000 9c20 0b0a8000 ffff0000 00000002 00404040 00000000 00000000 00000000 00000000 9c40 00000001 00000000 00000001 00000000 001ebd44 00000001 f390b800 ffff8008 9c60 00000000 00000001 00000070 00000070 00000070 00000000 09031d48 ffff0000
Call trace: Exception stack(0xffff000008003c90 to 0xffff000008003dd0)
3c80: 000000000000004e c3f28b86000c3900
3ca0: c3f28b86000c3900 ffffffffffffffff 0000000000000000 0000000000000000
3cc0: ffff000009f15e78 ffff0000086ca6cc ffff000009c8e280 6e6f637369642067
3ce0: 206e6f207463656e 7465676461472061 7369207461687420 746f6e2009090920
3d00: 7463656e6e6f6320 ffffffffffffffff ffff00000829f4d4 0000e395735727e8
3d20: 0000e3956f4f075a 0000000000000000 ffff8008f2d98010 ffff8008f2d98394
3d40: 00000000000001c0 ffff8008f2d98010 ffff000009c8e280 ffff000009885018
3d60: ffff000008004000 ffff000009885018 ffff8008f2349c00 ffff000008003dd0
3d80: ffff0000089ff9b0 ffff000008003dd0 ffff0000089ff9b0 00000000600001c5
3da0: ffff8008f33f2cd8 0000000000000000 0000ffffffffffff 0000000000000000
init: Received control message 'start' for 'adbd' from pid: 3359 (/vendor/bin/hw/[email protected]) 3dc0: ffff000008003dd0 ffff0000089ff9b0
[<ffff0000089ff9b0>] composite_disconnect+0x80/0x88 [<ffff000008a044d4>] android_disconnect+0x3c/0x68 [<ffff0000089ba9f8>] cdns3_device_irq_handler+0xfc/0x2c8 [<ffff0000089b84c0>] cdns3_irq+0x44/0x94 [<ffff00000814494c>] __handle_irq_event_percpu+0x60/0x24c [<ffff000008144c0c>] handle_irq_event+0x58/0xc0 [<ffff00000814873c>] handle_fasteoi_irq+0x98/0x180 [<ffff000008143a10>] generic_handle_irq+0x24/0x38 [<ffff000008144170>] __handle_domain_irq+0x60/0xac [<ffff0000080819c4>] gic_handle_irq+0xd4/0x17c
--- drivers/usb/gadget/configfs.c | 110 ++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 5 deletions(-)
drivers/usb/gadget/configfs.c +105 -5
@@ -60,6 +60,8 @@ struct gadget_info {bool use_os_desc;char b_vendor_code;char qw_sign[OS_STRING_QW_SIGN_LEN ]; +spinlock_t spinlock; +bool unbind; };static inline struct gadget_info *to_gadget_info (struct config_item *item)
@@ -1243,6 +1245,7 @@ static int configfs_composite_bind(struct usb_gadget *gadget,int ret;/* the gi->lock is hold by the caller */ + gi->unbind =0 ; cdev->gadget = gadget;set_gadget_data (gadget, cdev); ret =composite_dev_prepare (composite, cdev);
@@ -1375,31 +1378,128 @@ static void configfs_composite_unbind(struct usb_gadget *gadget) {struct usb_composite_dev *cdev;struct gadget_info *gi; +unsigned long flags;/* the gi->lock is hold by the caller */ cdev =get_gadget_data (gadget); gi = container_of(cdev, struct gadget_info, cdev); +spin_lock_irqsave (&gi->spinlock, flags); + gi->unbind =1 ; +spin_unlock_irqrestore (&gi->spinlock, flags);kfree (otg_desc[0 ]); otg_desc[0 ] =NULL ;purge_configs_funcs (gi);composite_dev_cleanup (cdev);usb_ep_autoconfig_reset (cdev->gadget); +spin_lock_irqsave (&gi->spinlock, flags); cdev->gadget =NULL ;set_gadget_data (gadget,NULL ); +spin_unlock_irqrestore (&gi->spinlock, flags); +} + +static int configfs_composite_setup (struct usb_gadget *gadget, +const struct usb_ctrlrequest *ctrl) +{ +struct usb_composite_dev *cdev; +struct gadget_info *gi; +unsigned long flags; +int ret; + + cdev =get_gadget_data (gadget); +if (!cdev) +return 0 ; + + gi = container_of(cdev, struct gadget_info, cdev); +spin_lock_irqsave (&gi->spinlock, flags); + cdev =get_gadget_data (gadget); +if (!cdev || gi->unbind) { +spin_unlock_irqrestore (&gi->spinlock, flags); +return 0 ; + } + + ret =composite_setup (gadget, ctrl); +spin_unlock_irqrestore (&gi->spinlock, flags); +return ret; +} + +static void configfs_composite_disconnect (struct usb_gadget *gadget) +{ +struct usb_composite_dev *cdev; +struct gadget_info *gi; +unsigned long flags; + + cdev =get_gadget_data (gadget); +if (!cdev) +return ; + + gi = container_of(cdev, struct gadget_info, cdev); +spin_lock_irqsave (&gi->spinlock, flags); + cdev =get_gadget_data (gadget); +if (!cdev || gi->unbind) { +spin_unlock_irqrestore (&gi->spinlock, flags); +return ; + } + +composite_disconnect (gadget); +spin_unlock_irqrestore (&gi->spinlock, flags); +} + +static void configfs_composite_suspend (struct usb_gadget *gadget) +{ +struct usb_composite_dev *cdev; +struct gadget_info *gi; +unsigned long flags; + + cdev =get_gadget_data (gadget); +if (!cdev) +return ; + + gi = container_of(cdev, struct gadget_info, cdev); +spin_lock_irqsave (&gi->spinlock, flags); + cdev =get_gadget_data (gadget); +if (!cdev || gi->unbind) { +spin_unlock_irqrestore (&gi->spinlock, flags); +return ; + } + +composite_suspend (gadget); +spin_unlock_irqrestore (&gi->spinlock, flags); +} + +static void configfs_composite_resume (struct usb_gadget *gadget) +{ +struct usb_composite_dev *cdev; +struct gadget_info *gi; +unsigned long flags; + + cdev =get_gadget_data (gadget); +if (!cdev) +return ; + + gi = container_of(cdev, struct gadget_info, cdev); +spin_lock_irqsave (&gi->spinlock, flags); + cdev =get_gadget_data (gadget); +if (!cdev || gi->unbind) { +spin_unlock_irqrestore (&gi->spinlock, flags); +return ; + } + +composite_resume (gadget); +spin_unlock_irqrestore (&gi->spinlock, flags); }static const struct usb_gadget_driver configfs_driver_template = { .bind = configfs_composite_bind, .unbind = configfs_composite_unbind, - .setup = composite_setup, - .reset = composite_disconnect, - .disconnect = composite_disconnect, + .setup = configfs_composite_setup, + .reset = configfs_composite_disconnect, + .disconnect = configfs_composite_disconnect, - .suspend = composite_suspend, - .resume = composite_resume, + .suspend = configfs_composite_suspend, + .resume = configfs_composite_resume, .max_speed =USB_SPEED_SUPER , .driver = {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 86/105 usb: dwc3: remove the call trace of USBx_GFLADJ
In reply to Greg Kroah-HartmanFrom: Yinbo Zhu <[email protected]>
[ Upstream commit a7d9874c6f3fbc8d25cd9ceba35b6822612c4ebf ]
layerscape board sometimes reported some usb call trace, that is due to kernel sent LPM tokerns automatically when it has no pending transfers and think that the link is idle enough to enter L1, which procedure will ask usb register has a recovery,then kernel will compare USBx_GFLADJ and set GFLADJ_30MHZ, GFLADJ_30MHZ_REG until GFLADJ_30MHZ is equal 0x20, if the conditions were met then issue occur, but whatever the conditions whether were met that usb is all need keep GFLADJ_30MHZ of value is 0x20 (xhci spec ask use GFLADJ_30MHZ to adjust any offset from clock source that generates the clock that drives the SOF counter, 0x20 is default value of it)That is normal logic, so need remove the call trace.
--- drivers/usb/dwc3/core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/dwc3/core.c +1 -2
@@ -282,8 +282,7 @@ static void dwc3_frame_length_adjustment(struct dwc3 *dwc) reg =dwc3_readl (dwc->regs,DWC3_GFLADJ ); dft = reg &DWC3_GFLADJ_30MHZ_MASK ; -if (!dev_WARN_ONCE (dwc->dev, dft == dwc->fladj, -"request value same as default, ignoring\n" )) { +if (dft != dwc->fladj) { reg &= ~DWC3_GFLADJ_30MHZ_MASK ; reg |=DWC3_GFLADJ_30MHZ_SDBND_SEL | dwc->fladj;dwc3_writel (dwc->regs,DWC3_GFLADJ , reg);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 87/105 perf/x86/amd/ibs: Fix reading of the IBS OpData register and thus precise RIP validity
In reply to Greg Kroah-HartmanFrom: Kim Phillips <[email protected]>
[ Upstream commit 317b96bb14303c7998dbcd5bc606bd8038fdd4b4 ]
The loop that reads all the IBS MSRs into *buf stopped one MSR short of reading the IbsOpData register, which contains the RipInvalid status bit.
Fix the offset_max assignment so the MSR gets read, so the RIP invalid evaluation is based on what the IBS h/w output, instead of what was left in memory.
--- arch/x86/events/amd/ibs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/events/amd/ibs.c +1 -1
@@ -625,7 +625,7 @@ fail:if (event->attr.sample_type &PERF_SAMPLE_RAW ) offset_max = perf_ibs->offset_max;else if (check_rip) - offset_max =2 ; + offset_max =3 ;else offset_max =1 ; do {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 88/105 perf/x86/amd/ibs: Handle erratum #420 only on the affected CPU family (10h)
In reply to Greg Kroah-HartmanFrom: Kim Phillips <[email protected]>
[ Upstream commit e431e79b60603079d269e0c2a5177943b95fa4b6 ]
This saves us writing the IBS control MSR twice when disabling the event.
I searched revision guides for all families since 10h, and did not find occurrence of erratum #420, nor anything remotely similar:
so we isolate the secondary MSR write to family 10h only.
Also unconditionally update the count mask for IBS Op implementations that have read & writeable current count (CurCnt) fields in addition to the MaxCnt field. These bits were reserved on prior implementations, and therefore shouldn't have negative impact.
--- arch/x86/events/amd/ibs.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/x86/events/amd/ibs.c +4 -2
@@ -389,7 +389,8 @@ static inline void perf_ibs_disable_event(struct perf_ibs *perf_ibs, struct hw_perf_event *hwc, u64 config) { config &= ~perf_ibs->cnt_mask; -wrmsrl (hwc->config_base, config); +if (boot_cpu_data.x86 ==0x10 ) +wrmsrl (hwc->config_base, config); config &= ~perf_ibs->enable_mask;wrmsrl (hwc->config_base, config); }
@@ -564,7 +565,8 @@ static struct perf_ibs perf_ibs_op = { }, .msr = MSR_AMD64_IBSOPCTL, .config_mask = IBS_OP_CONFIG_MASK, - .cnt_mask = IBS_OP_MAX_CNT, + .cnt_mask =IBS_OP_MAX_CNT |IBS_OP_CUR_CNT | + IBS_OP_CUR_CNT_RAND, .enable_mask = IBS_OP_ENABLE, .valid_mask = IBS_OP_VAL, .max_period = IBS_OP_MAX_CNT << 4,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 89/105 USB: Skip endpoints with 0 maxpacket length
In reply to Greg Kroah-HartmanFrom: Alan Stern <[email protected]>
[ Upstream commit d482c7bb0541d19dea8bff437a9f3c5563b5b2d2 ]
Endpoints with a maxpacket length of 0 are probably useless. They can't transfer any data, and it's not at all unlikely that an HCD will crash or hang when trying to handle an URB for such an endpoint.
Currently the USB core does not check for endpoints having a maxpacket value of 0. This patch adds a check, printing a warning and skipping over any endpoints it catches.
Now, the USB spec does not rule out endpoints having maxpacket = 0. But since they wouldn't have any practical use, there doesn't seem to be any good reason for us to accept them.
--- drivers/usb/core/config.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/core/config.c +5 -0
@@ -348,6 +348,11 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,/* Validate the wMaxPacketSize field */ maxp =usb_endpoint_maxp (&endpoint->desc); +if (maxp ==0 ) { +dev_warn (ddev,"config %d interface %d altsetting %d endpoint 0x%X has wMaxPacketSize 0, skipping\n" , + cfgno, inum, asnum, d->bEndpointAddress); + goto skip_to_next_endpoint_or_interface_descriptor; + }/* Find the highest legal maxpacket size for this endpoint */ i =0 ;/* additional transactions per microframe */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 90/105 USB: ldusb: use unsigned size format specifiers
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit 88f6bf3846ee90bf33aa1ce848cd3bfb3229f4a4 ]
A recent info-leak bug manifested itself along with warning about a negative buffer overflow:
ldusb 1-1:0.28: Read buffer overflow, -131383859965943 bytes dropped
when it was really a rather large positive one.
A sanity check that prevents this has now been put in place, but let's fix up the size format specifiers, which should all be unsigned.
--- drivers/usb/misc/ldusb.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/usb/misc/ldusb.c +4 -3
@@ -490,7 +490,7 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, } bytes_to_read =min (count, *actual_buffer);if (bytes_to_read < *actual_buffer) -dev_warn (&dev->intf->dev,"Read buffer overflow, %zd bytes dropped\n" , +dev_warn (&dev->intf->dev,"Read buffer overflow, %zu bytes dropped\n" , *actual_buffer-bytes_to_read);/* copy one interrupt_in_buffer from ring_buffer into userspace */
@@ -565,8 +565,9 @@ static ssize_t ld_usb_write(struct file *file, const char __user *buffer,/* write the data into interrupt_out_buffer from userspace */ bytes_to_write =min (count, write_buffer_size*dev->interrupt_out_endpoint_size);if (bytes_to_write < count) -dev_warn (&dev->intf->dev,"Write buffer overflow, %zd bytes dropped\n" , count-bytes_to_write); -dev_dbg (&dev->intf->dev,"%s: count = %zd, bytes_to_write = %zd\n" , +dev_warn (&dev->intf->dev,"Write buffer overflow, %zu bytes dropped\n" , + count - bytes_to_write); +dev_dbg (&dev->intf->dev,"%s: count = %zu, bytes_to_write = %zu\n" , __func__, count, bytes_to_write);if (copy_from_user (dev->interrupt_out_buffer, buffer, bytes_to_write)) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 91/105 RDMA/iw_cxgb4: Avoid freeing skb twice in arp failure case
In reply to Greg Kroah-HartmanFrom: Potnuri Bharat Teja <[email protected]>
[ Upstream commit d4934f45693651ea15357dd6c7c36be28b6da884 ]
_put_ep_safe() and _put_pass_ep_safe() free the skb before it is freed by process_work(). fix double free by freeing the skb only in process_work().
--- drivers/infiniband/hw/cxgb4/cm.c | 2 -- 1 file changed, 2 deletions(-)
drivers/infiniband/hw/cxgb4/cm.c +0 -2
@@ -491,7 +491,6 @@ static int _put_ep_safe(struct c4iw_dev *dev, struct sk_buff *skb) ep = *((struct c4iw_ep **)(skb->cb +2 *sizeof (void *)));release_ep_resources (ep); -kfree_skb (skb);return 0 ; }
@@ -502,7 +501,6 @@ static int _put_pass_ep_safe(struct c4iw_dev *dev, struct sk_buff *skb) ep = *((struct c4iw_ep **)(skb->cb +2 *sizeof (void *)));c4iw_put_ep (&ep->parent_ep->com);release_ep_resources (ep); -kfree_skb (skb);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 92/105 scsi: qla2xxx: stop timer in shutdown path
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
[ Upstream commit d3566abb1a1e7772116e4d50fb6a58d19c9802e5 ]
In shutdown/reboot paths, the timer is not stopped:
qla2x00_shutdown
pci_device_shutdown
device_shutdown
kernel_restart_prepare
kernel_restart
sys_reboot
This causes lockups (on powerpc) when firmware config space access calls are interrupted by smp_send_stop later in reboot.
--- drivers/scsi/qla2xxx/qla_os.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/scsi/qla2xxx/qla_os.c +4 -0
@@ -3437,6 +3437,10 @@ qla2x00_shutdown(struct pci_dev *pdev)/* Stop currently executing firmware. */ qla2x00_try_to_stop_firmware (vha); +/* Disable timer */ +if (vha->timer_active) +qla2x00_stop_timer (vha); +/* Turn adapter off line */ vha->flags.online =0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 93/105 fjes: Handle workqueue allocation failure
In reply to Greg Kroah-HartmanFrom: Will Deacon <[email protected]>
[ Upstream commit 85ac30fa2e24f628e9f4f9344460f4015d33fd7d ]
In the highly unlikely event that we fail to allocate either of the "/txrx" or "/control" workqueues, we should bail cleanly rather than blindly march on with NULL queue pointer(s) installed in the 'fjes_adapter' instance.
--- drivers/net/fjes/fjes_main.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/net/fjes/fjes_main.c +14 -1
@@ -1252,8 +1252,17 @@ static int fjes_probe(struct platform_device *plat_dev) adapter->open_guard = false; adapter->txrx_wq =alloc_workqueue (DRV_NAME "/txrx" ,WQ_MEM_RECLAIM ,0 ); +if (unlikely (!adapter->txrx_wq)) { + err = -ENOMEM ; + goto err_free_netdev; + } + adapter->control_wq =alloc_workqueue (DRV_NAME "/control" ,WQ_MEM_RECLAIM ,0 ); +if (unlikely (!adapter->control_wq)) { + err = -ENOMEM ; + goto err_free_txrx_wq; + }INIT_WORK (&adapter->tx_stall_task, fjes_tx_stall_task); INIT_WORK(&adapter->raise_intr_rxdata_task,
@@ -1270,7 +1279,7 @@ static int fjes_probe(struct platform_device *plat_dev) hw->hw_res.irq =platform_get_irq (plat_dev,0 ); err =fjes_hw_init (&adapter->hw);if (err) - goto err_free_netdev; + goto err_free_control_wq;/* setup MAC address (02:00:00:00:00:[epid])*/ netdev->dev_addr[0 ] =2 ;
@@ -1292,6 +1301,10 @@ static int fjes_probe(struct platform_device *plat_dev) err_hw_exit:fjes_hw_exit (&adapter->hw); +err_free_control_wq: +destroy_workqueue (adapter->control_wq); +err_free_txrx_wq: +destroy_workqueue (adapter->txrx_wq); err_free_netdev:free_netdev (netdev); err_out:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 94/105 net: hisilicon: Fix "Trying to free already-free IRQ"
In reply to Greg Kroah-HartmanFrom: Jiangfeng Xiao <[email protected]>
[ Upstream commit 63a41746827cb16dc6ad0d4d761ab4e7dda7a0c3 ]
When rmmod hip04_eth.ko, we can get the following warning:
Task track: rmmod(1623)>bash(1591)>login(1581)>init(1)
------------[ cut here ]------------ WARNING: CPU: 0 PID: 1623 at kernel/irq/manage.c:1557 __free_irq+0xa4/0x2ac() Trying to free already-free IRQ 200 Modules linked in: ping(O) pramdisk(O) cpuinfo(O) rtos_snapshot(O) interrupt_ctrl(O) mtdblock mtd_blkdevrtfs nfs_acl nfs lockd grace sunrpc xt_tcpudp ipt_REJECT iptable_filter ip_tables x_tables nf_reject_ipv CPU: 0 PID: 1623 Comm: rmmod Tainted: G O 4.4.193 #1 Hardware name: Hisilicon A15 [<c020b408>] (rtos_unwind_backtrace) from [<c0206624>] (show_stack+0x10/0x14) [<c0206624>] (show_stack) from [<c03f2be4>] (dump_stack+0xa0/0xd8) [<c03f2be4>] (dump_stack) from [<c021a780>] (warn_slowpath_common+0x84/0xb0) [<c021a780>] (warn_slowpath_common) from [<c021a7e8>] (warn_slowpath_fmt+0x3c/0x68) [<c021a7e8>] (warn_slowpath_fmt) from [<c026876c>] (__free_irq+0xa4/0x2ac) [<c026876c>] (__free_irq) from [<c0268a14>] (free_irq+0x60/0x7c) [<c0268a14>] (free_irq) from [<c0469e80>] (release_nodes+0x1c4/0x1ec) [<c0469e80>] (release_nodes) from [<c0466924>] (__device_release_driver+0xa8/0x104) [<c0466924>] (__device_release_driver) from [<c0466a80>] (driver_detach+0xd0/0xf8) [<c0466a80>] (driver_detach) from [<c0465e18>] (bus_remove_driver+0x64/0x8c) [<c0465e18>] (bus_remove_driver) from [<c02935b0>] (SyS_delete_module+0x198/0x1e0) [<c02935b0>] (SyS_delete_module) from [<c0202ed0>] (__sys_trace_return+0x0/0x10) ---[ end trace bb25d6123d849b44 ]---
Currently "rmmod hip04_eth.ko" call free_irq more than once as devres_release_all and hip04_remove both call free_irq. This results in a 'Trying to free already-free IRQ' warning. To solve the problem free_irq has been moved out of hip04_remove.
--- drivers/net/ethernet/hisilicon/hip04_eth.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/ethernet/hisilicon/hip04_eth.c +0 -1
@@ -945,7 +945,6 @@ static int hip04_remove(struct platform_device *pdev)hip04_free_ring (ndev, d);unregister_netdev (ndev); -free_irq (ndev->irq, ndev);of_node_put (priv->phy_node);cancel_work_sync (&priv->tx_timeout_task);free_netdev (ndev);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 95/105 hv_netvsc: Fix error handling in netvsc_attach()
In reply to Greg Kroah-HartmanFrom: Haiyang Zhang <[email protected]>
[ Upstream commit 719b85c336ed35565d0f3982269d6f684087bb00 ]
If rndis_filter_open() fails, we need to remove the rndis device created in earlier steps, before returning an error code. Otherwise, the retry of netvsc_attach() from its callers will fail and hang.
--- drivers/net/hyperv/netvsc_drv.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/net/hyperv/netvsc_drv.c +8 -1
@@ -969,7 +969,7 @@ static int netvsc_attach(struct net_device *ndev,if (netif_running (ndev)) { ret =rndis_filter_open (nvdev);if (ret) -return ret; + goto err; rdev = nvdev->extension;if (!rdev->link_state)
@@ -977,6 +977,13 @@ static int netvsc_attach(struct net_device *ndev, }return 0 ; + +err: +netif_device_detach (ndev); + +rndis_filter_device_remove (hdev, nvdev); + +return ret; } static int netvsc_set_channels(struct net_device *net,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 96/105 NFSv4: Dont allow a cached open with a revoked delegation
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
[ Upstream commit be3df3dd4c70ee020587a943a31b98a0fb4b6424 ]
If the delegation is marked as being revoked, we must not use it for cached opens.
--- fs/nfs/delegation.c | 10 ++++++++++ fs/nfs/delegation.h | 1 + fs/nfs/nfs4proc.c | 7 ++----- 3 files changed, 13 insertions(+), 5 deletions(-)
fs/nfs/delegation.c +10 -0
@@ -52,6 +52,16 @@ nfs4_is_valid_delegation(const struct nfs_delegation *delegation,return false; } +struct nfs_delegation *nfs4_get_valid_delegation (const struct inode *inode) +{ +struct nfs_delegation *delegation; + + delegation =rcu_dereference (NFS_I (inode)->delegation); +if (nfs4_is_valid_delegation (delegation,0 )) +return delegation; +return NULL ; +} +static int nfs4_do_check_delegation (struct inode *inode,fmode_t flags,bool mark) {
fs/nfs/delegation.h +1 -0
@@ -63,6 +63,7 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_stateint nfs4_lock_delegation_recall (struct file_lock *fl,struct nfs4_state *state,const nfs4_stateid *stateid);bool nfs4_copy_delegation_stateid (struct inode *inode,fmode_t flags,nfs4_stateid *dst,struct rpc_cred **cred); +struct nfs_delegation *nfs4_get_valid_delegation (const struct inode *inode);void nfs_mark_delegation_referenced (struct nfs_delegation *delegation);int nfs4_have_delegation (struct inode *inode,fmode_t flags);int nfs4_check_delegation (struct inode *inode,fmode_t flags);
fs/nfs/nfs4proc.c +2 -5
@@ -1355,8 +1355,6 @@ static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode,return 0 ;if ((delegation->type & fmode) != fmode)return 0 ; -if (test_bit (NFS_DELEGATION_RETURNING , &delegation->flags)) -return 0 ;switch (claim) {case NFS4_OPEN_CLAIM_NULL :case NFS4_OPEN_CLAIM_FH :
@@ -1615,7 +1613,6 @@ static void nfs4_return_incompatible_delegation(struct inode *inode, fmode_t fmostatic struct nfs4_state *nfs4_try_open_cached (struct nfs4_opendata *opendata) {struct nfs4_state *state = opendata->state; -struct nfs_inode *nfsi =NFS_I (state->inode);struct nfs_delegation *delegation;int open_mode = opendata->o_arg.open_flags;fmode_t fmode = opendata->o_arg.fmode;
@@ -1632,7 +1629,7 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata) }spin_unlock (&state->owner->so_lock);rcu_read_lock (); - delegation =rcu_dereference (nfsi->delegation); + delegation =nfs4_get_valid_delegation (state->inode);if (!can_open_delegated (delegation, fmode, claim)) {rcu_read_unlock ();break ;
@@ -2153,7 +2150,7 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata) data->o_arg.open_flags, claim)) goto out_no_action;rcu_read_lock (); - delegation =rcu_dereference (NFS_I (data->state->inode)->delegation); + delegation =nfs4_get_valid_delegation (data->state->inode);if (can_open_delegated (delegation, data->o_arg.fmode, claim)) goto unlock_no_action;rcu_read_unlock ();
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 97/105 net: ethernet: arc: add the missed clk_disable_unprepare
In reply to Greg Kroah-HartmanFrom: Chuhong Yuan <[email protected]>
[ Upstream commit 4202e219edd6cc164c042e16fa327525410705ae ]
The remove misses to disable and unprepare priv->macclk like what is done when probe fails.
Add the missed call in remove.
--- drivers/net/ethernet/arc/emac_rockchip.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/arc/emac_rockchip.c +3 -0
@@ -261,6 +261,9 @@ static int emac_rockchip_remove(struct platform_device *pdev)if (priv->regulator)regulator_disable (priv->regulator); +if (priv->soc_data->need_div_macclk) +clk_disable_unprepare (priv->macclk); +free_netdev (ndev);return err; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 98/105 igb: Fix constant media auto sense switching when no cable is connected
In reply to Greg Kroah-HartmanFrom: Manfred Rudigier <[email protected]>
[ Upstream commit 8d5cfd7f76a2414e23c74bb8858af7540365d985 ]
At least on the i350 there is an annoying behavior that is maybe also present on 82580 devices, but was probably not noticed yet as MAS is not widely used.
If no cable is connected on both fiber/copper ports the media auto sense code will constantly swap between them as part of the watchdog task and produce many unnecessary kernel log messages.
The swap code responsible for this behavior (switching to fiber) should not be executed if the current media type is copper and there is no signal detected on the fiber port. In this case we can safely wait until the AUTOSENSE_EN bit is cleared.
--- drivers/net/ethernet/intel/igb/igb_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/igb/igb_main.c +2 -1
@@ -1680,7 +1680,8 @@ static void igb_check_swap_media(struct igb_adapter *adapter)if ((hw->phy.media_type == e1000_media_type_copper) && (!(connsw &E1000_CONNSW_AUTOSENSE_EN ))) { swap_now = true; - }else if (!(connsw &E1000_CONNSW_SERDESD )) { + }else if ((hw->phy.media_type != e1000_media_type_copper) && + !(connsw &E1000_CONNSW_SERDESD )) {/* copper signal takes time to appear */ if (adapter->copper_tries <4 ) { adapter->copper_tries++;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 99/105 e1000: fix memory leaks
In reply to Greg Kroah-HartmanFrom: Wenwen Wang <[email protected]>
[ Upstream commit 8472ba62154058b64ebb83d5f57259a352d28697 ]
In e1000_set_ringparam(), 'tx_old' and 'rx_old' are not deallocated if e1000_up() fails, leading to memory leaks. Refactor the code to fix this issue.
--- drivers/net/ethernet/intel/e1000/e1000_ethtool.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/e1000/e1000_ethtool.c +3 -4
@@ -627,6 +627,7 @@ static int e1000_set_ringparam(struct net_device *netdev,for (i =0 ; i < adapter->num_rx_queues; i++) rxdr[i].count = rxdr->count; + err =0 ;if (netif_running (adapter->netdev)) {/* Try to get new resources before deleting old */ err =e1000_setup_all_rx_resources (adapter);
@@ -647,14 +648,13 @@ static int e1000_set_ringparam(struct net_device *netdev, adapter->rx_ring = rxdr; adapter->tx_ring = txdr; err =e1000_up (adapter); -if (err) - goto err_setup; }kfree (tx_old);kfree (rx_old);clear_bit (__E1000_RESETTING, &adapter->flags); -return 0 ; +return err; + err_setup_tx:e1000_free_all_rx_resources (adapter); err_setup_rx:
@@ -666,7 +666,6 @@ err_alloc_rx: err_alloc_tx:if (netif_running (adapter->netdev))e1000_up (adapter); -err_setup:clear_bit (__E1000_RESETTING, &adapter->flags);return err; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 100/105 x86/apic: Move pending interrupt check code into its own function
In reply to Greg Kroah-HartmanFrom: Dou Liyang <[email protected]>
[ Upstream commit 9b217f33017715903d0956dfc58f82d2a2d00e63 ]
The pending interrupt check code is mixed with the local APIC setup code, that looks messy.
Extract the related code, move it into a new function named apic_pending_intr_clear().
--- arch/x86/kernel/apic/apic.c | 100 ++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 45 deletions(-)
arch/x86/kernel/apic/apic.c +55 -45
@@ -1362,6 +1362,56 @@ static void lapic_setup_esr(void) oldvalue, value); } +static void apic_pending_intr_clear (void ) +{ +long long max_loops = cpu_khz ? cpu_khz :1000000 ; +unsigned long long tsc =0 , ntsc; +unsigned int value, queued; +int i, j, acked =0 ; + +if (boot_cpu_has (X86_FEATURE_TSC )) + tsc =rdtsc (); +/* +* After a crash, we no longer service the interrupts and a pending +* interrupt from previous kernel might still have ISR bit set. +* +* Most probably by now CPU has serviced that pending interrupt and +* it might not have done the ack_APIC_irq() because it thought, +* interrupt came from i8259 as ExtInt. LAPIC did not get EOI so it +* does not clear the ISR bit and cpu thinks it has already serivced +* the interrupt. Hence a vector might get locked. It was noticed +* for timer irq (vector 0x31). Issue an extra EOI to clear ISR. +*/ +do { + queued =0 ; +for (i =APIC_ISR_NR -1 ; i >=0 ; i--) + queued |=apic_read (APIC_IRR + i*0x10 ); + +for (i =APIC_ISR_NR -1 ; i >=0 ; i--) { + value =apic_read (APIC_ISR + i*0x10 ); +for (j =31 ; j >=0 ; j--) { +if (value & (1 <<j)) { +ack_APIC_irq (); + acked++; + } + } + } +if (acked >256 ) { +printk (KERN_ERR "LAPIC pending interrupts after %d EOI\n" , + acked); +break ; + } +if (queued) { +if (boot_cpu_has (X86_FEATURE_TSC ) && cpu_khz) { + ntsc =rdtsc (); + max_loops = (cpu_khz <<10 ) - (ntsc - tsc); + }else + max_loops--; + } + }while (queued && max_loops >0 ); +WARN_ON (max_loops <=0 ); +} +/** * setup_local_APIC - setup the local APIC *
@@ -1371,13 +1421,11 @@ static void lapic_setup_esr(void)void setup_local_APIC (void ) {int cpu =smp_processor_id (); -unsigned int value, queued; -int i, j, acked =0 ; -unsigned long long tsc =0 , ntsc; -long long max_loops = cpu_khz ? cpu_khz :1000000 ; +unsigned int value; +#ifdef CONFIG_X86_32 +int i; +#endif -if (boot_cpu_has (X86_FEATURE_TSC )) - tsc =rdtsc ();if (disable_apic) {disable_ioapic_support ();
@@ -1437,45 +1485,7 @@ void setup_local_APIC(void) value &= ~APIC_TPRI_MASK ;apic_write (APIC_TASKPRI , value); -/* -* After a crash, we no longer service the interrupts and a pending -* interrupt from previous kernel might still have ISR bit set. -* -* Most probably by now CPU has serviced that pending interrupt and -* it might not have done the ack_APIC_irq() because it thought, -* interrupt came from i8259 as ExtInt. LAPIC did not get EOI so it -* does not clear the ISR bit and cpu thinks it has already serivced -* the interrupt. Hence a vector might get locked. It was noticed -* for timer irq (vector 0x31). Issue an extra EOI to clear ISR. -*/ -do { - queued =0 ; -for (i =APIC_ISR_NR -1 ; i >=0 ; i--) - queued |=apic_read (APIC_IRR + i*0x10 ); - -for (i =APIC_ISR_NR -1 ; i >=0 ; i--) { - value =apic_read (APIC_ISR + i*0x10 ); -for (j =31 ; j >=0 ; j--) { -if (value & (1 <<j)) { -ack_APIC_irq (); - acked++; - } - } - } -if (acked >256 ) { -printk (KERN_ERR "LAPIC pending interrupts after %d EOI\n" , - acked); -break ; - } -if (queued) { -if (boot_cpu_has (X86_FEATURE_TSC ) && cpu_khz) { - ntsc =rdtsc (); - max_loops = (cpu_khz <<10 ) - (ntsc - tsc); - }else - max_loops--; - } - }while (queued && max_loops >0 ); -WARN_ON (max_loops <=0 ); +apic_pending_intr_clear ();/* * Now that we are all set up, enable the APIC
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 101/105 x86/apic: Drop logical_smp_processor_id() inline
In reply to Greg Kroah-HartmanFrom: Dou Liyang <[email protected]>
[ Upstream commit 8f1561680f42a5491b371b513f1ab8197f31fd62 ]
The logical_smp_processor_id() inline which is only called in setup_local_APIC() on x86_32 systems has no real value.
Drop it and directly use GET_APIC_LOGICAL_ID() at the call site and use a more suitable variable name for readability
--- arch/x86/include/asm/smp.h | 10 ---------- arch/x86/kernel/apic/apic.c | 10 +++++----- 2 files changed, 5 insertions(+), 15 deletions(-)
arch/x86/include/asm/smp.h +0 -10
@@ -175,16 +175,6 @@ static inline int wbinvd_on_all_cpus(void)extern unsigned disabled_cpus;#ifdef CONFIG_X86_LOCAL_APIC - -#ifndef CONFIG_X86_64 -static inline int logical_smp_processor_id (void ) -{ -/* we don't want to mark this access volatile - bad code generation */ -return GET_APIC_LOGICAL_ID (apic_read (APIC_LDR )); -} - -#endif -extern int hard_smp_processor_id (void );#else /* CONFIG_X86_LOCAL_APIC */
arch/x86/kernel/apic/apic.c +5 -5
@@ -1423,7 +1423,7 @@ void setup_local_APIC(void)int cpu =smp_processor_id ();unsigned int value;#ifdef CONFIG_X86_32 -int i; +int logical_apicid, ldr_apicid;#endif
@@ -1470,11 +1470,11 @@ void setup_local_APIC(void)* initialized during get_smp_config(), make sure it matches the * actual value. */ - i =early_per_cpu (x86_cpu_to_logical_apicid, cpu); -WARN_ON (i !=BAD_APICID && i !=logical_smp_processor_id ()); + logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu); + ldr_apicid =GET_APIC_LOGICAL_ID (apic_read (APIC_LDR )); +WARN_ON (logical_apicid !=BAD_APICID && logical_apicid != ldr_apicid);/* always use the value from LDR */ -early_per_cpu (x86_cpu_to_logical_apicid, cpu) = -logical_smp_processor_id (); +early_per_cpu (x86_cpu_to_logical_apicid, cpu) = ldr_apicid;#endif /*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 102/105 x86/apic/32: Avoid bogus LDR warnings
In reply to Greg Kroah-HartmanFrom: Jan Beulich <[email protected]>
[ Upstream commit fe6f85ca121e9c74e7490fe66b0c5aae38e332c3 ]
The removal of the LDR initialization in the bigsmp_32 APIC code unearthed a problem in setup_local_APIC().
The code checks unconditionally for a mismatch of the logical APIC id by comparing the early APIC id which was initialized in get_smp_config() with the actual LDR value in the APIC.
Due to the removal of the bogus LDR initialization the check now can trigger on bigsmp_32 APIC systems emitting a warning for every booting CPU. This is of course a false positive because the APIC is not using logical destination mode.
Restrict the check and the possibly resulting fixup to systems which are actually using the APIC in logical destination mode.
[ tglx: Massaged changelog and added Cc stable ]
--- arch/x86/kernel/apic/apic.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-)
arch/x86/kernel/apic/apic.c +15 -13
@@ -1422,9 +1422,6 @@ void setup_local_APIC(void) {int cpu =smp_processor_id ();unsigned int value; -#ifdef CONFIG_X86_32 -int logical_apicid, ldr_apicid; -#endif if (disable_apic) {
@@ -1465,16 +1462,21 @@ void setup_local_APIC(void) apic->init_apic_ldr ();#ifdef CONFIG_X86_32 -/* -* APIC LDR is initialized. If logical_apicid mapping was -* initialized during get_smp_config(), make sure it matches the -* actual value. -*/ - logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu); - ldr_apicid =GET_APIC_LOGICAL_ID (apic_read (APIC_LDR )); -WARN_ON (logical_apicid !=BAD_APICID && logical_apicid != ldr_apicid); -/* always use the value from LDR */ -early_per_cpu (x86_cpu_to_logical_apicid, cpu) = ldr_apicid; +if (apic->dest_logical) { +int logical_apicid, ldr_apicid; + +/* +* APIC LDR is initialized. If logical_apicid mapping was +* initialized during get_smp_config(), make sure it matches +* the actual value. +*/ + logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu); + ldr_apicid =GET_APIC_LOGICAL_ID (apic_read (APIC_LDR )); +if (logical_apicid !=BAD_APICID ) +WARN_ON (logical_apicid != ldr_apicid); +/* Always use the value from LDR. */ +early_per_cpu (x86_cpu_to_logical_apicid, cpu) = ldr_apicid; + }#endif /*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 103/105 can: flexcan: disable completely the ECC mechanism
In reply to Greg Kroah-HartmanFrom: Joakim Zhang <[email protected]>
[ Upstream commit 5e269324db5adb2f5f6ec9a93a9c7b0672932b47 ]
The ECC (memory error detection and correction) mechanism can be activated or not, controlled by the ECCDIS bit in CAN_MECR. When disabled, updates on indications and reporting registers are stopped. So if want to disable ECC completely, had better assert ECCDIS bit, not just mask the related interrupts.
--- drivers/net/can/flexcan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/can/flexcan.c +1 -0
@@ -1018,6 +1018,7 @@ static int flexcan_chip_start(struct net_device *dev) reg_mecr =flexcan_read (®s->mecr); reg_mecr &= ~FLEXCAN_MECR_ECRWRDIS ;flexcan_write (reg_mecr, ®s->mecr); + reg_mecr |=FLEXCAN_MECR_ECCDIS ; reg_mecr &= ~(FLEXCAN_MECR_NCEFAFRZ |FLEXCAN_MECR_HANCEI_MSK |FLEXCAN_MECR_FANCEI_MSK );flexcan_write (reg_mecr, ®s->mecr);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 104/105 mm/filemap.c: dont initiate writeback if mapping has no dirty pages
In reply to Greg Kroah-HartmanFrom: Konstantin Khlebnikov <[email protected]>
commit c3aab9a0bd91b696a852169479b7db1ece6cbf8c upstream.
Functions like filemap_write_and_wait_range() should do nothing if inode has no dirty pages or pages currently under writeback. But they anyway construct struct writeback_control and this does some atomic operations if CONFIG_CGROUP_WRITEBACK=y - on fast path it locks inode->i_lock and updates state of writeback ownership, on slow path might be more work. Current this path is safely avoided only when inode mapping has no pages.
For example generic_file_read_iter() calls filemap_write_and_wait_range() at each O_DIRECT read - pretty hot path.
This patch skips starting new writeback if mapping has no dirty tags set. If writeback is already in progress filemap_write_and_wait_range() will wait for it.
--- mm/filemap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
mm/filemap.c +2 -1
@@ -338,7 +338,8 @@ int __filemap_fdatawrite_range(struct ad .range_end = end, }; -if (!mapping_cap_writeback_dirty (mapping)) +if (!mapping_cap_writeback_dirty (mapping) || + !mapping_tagged (mapping,PAGECACHE_TAG_DIRTY ))return 0 ;wbc_attach_fdatawrite_inode (&wbc, mapping->host);
stable-rc/linux-4.14.y boot: 112 boots: 104 failed, 0 passed with 8 offline (v4.14.153-106-ga46a2b6a665b)
stable-rc/linux-4.14.y boot: 112 boots: 104 failed, 0 passed with 8 offline (v4.14.153-106-ga46a2b6a665b)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-4.14.y/kernel/v4.14.153-106-ga46a2b6a665b/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-4.14.y/kernel/v4.14.153-106-ga46a2b6a665b/
Tree: stable-rc
Branch: linux-4.14.y
Git Describe: v4.14.153-106-ga46a2b6a665b
Git Commit: a46a2b6a665bee1f0e231d13d5c04472bafec941
Git URL: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 61 unique boards, 21 SoC families, 13 builds out of 201
Boot Regressions Detected:
arm:
bcm2835_defconfig:
gcc-8:
bcm2835-rpi-b:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
bcm2836-rpi-2-b:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
davinci_all_defconfig:
gcc-8:
da850-evm:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
dm365evm,legacy:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
exynos_defconfig:
gcc-8:
exynos4412-odroidx2:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
exynos5250-arndale:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
exynos5420-arndale-octa:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
exynos5800-peach-pi:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx_v6_v7_defconfig:
gcc-8:
imx6dl-wandboard_dual:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx6dl-wandboard_solo:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx6q-wandboard:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx7s-warp:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
vf610-colibri-eval-v3:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
multi_v7_defconfig:
gcc-8:
alpine-db:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
am335x-boneblack:
lab-baylibre: failing since 1 day (last pass: v4.14.151 - first fail: v4.14.153-68-g0d12dcf336c6)
armada-xp-openblocks-ax3-4:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
bcm2836-rpi-2-b:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
exynos4412-odroidx2:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
exynos5250-arndale:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
exynos5420-arndale-octa:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
exynos5800-peach-pi:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx6dl-wandboard_dual:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx6dl-wandboard_solo:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx6q-sabrelite:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx6q-wandboard:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
imx7s-warp:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
meson8b-odroidc1:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
mt7623n-bananapi-bpi-r2:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
omap3-beagle:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
omap3-beagle-xm:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
omap4-panda:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
qcom-apq8064-cm-qs600:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
rk3288-rock2-square:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
rk3288-veyron-jaq:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
socfpga_cyclone5_de0_sockit:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
stih410-b2120:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun4i-a10-cubieboard:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun5i-a13-olinuxino-micro:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun5i-r8-chip:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun7i-a20-bananapi:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun7i-a20-cubieboard2:
lab-clabbe: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun8i-a83t-bananapi-m3:
lab-clabbe: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun8i-h2-plus-orangepi-zero:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
tegra124-jetson-tk1:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
tegra124-nyan-big:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
tegra20-iris-512:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
tegra30-beaver:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
vf610-colibri-eval-v3:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
zynq-zc702:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
mvebu_v7_defconfig:
gcc-8:
armada-xp-openblocks-ax3-4:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
omap2plus_defconfig:
gcc-8:
am335x-boneblack:
lab-baylibre: failing since 1 day (last pass: v4.14.151 - first fail: v4.14.153-68-g0d12dcf336c6)
omap3-beagle:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
omap3-beagle-xm:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
omap4-panda:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sunxi_defconfig:
gcc-8:
sun4i-a10-cubieboard:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun5i-a13-olinuxino-micro:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun5i-r8-chip:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun7i-a20-bananapi:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun7i-a20-cubieboard2:
lab-clabbe: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun8i-a33-olinuxino:
lab-clabbe: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun8i-a83t-bananapi-m3:
lab-clabbe: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun8i-h2-plus-orangepi-zero:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
tegra_defconfig:
gcc-8:
tegra124-jetson-tk1:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
tegra124-nyan-big:
lab-collabora: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
tegra20-iris-512:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
tegra30-beaver:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)arm64:
defconfig:
gcc-8:
bcm2837-rpi-3-b:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
juno-r2:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
meson-gxbb-p200:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
meson-gxl-s905x-khadas-vim:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
meson-gxl-s905x-libretech-cc:
lab-clabbe: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
meson-gxl-s905x-nexbox-a95x:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
meson-gxm-nexbox-a1:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
mt7622-rfb1:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
r8a7795-salvator-x:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
r8a7796-m3ulcb:
lab-baylibre: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun50i-a64-bananapi-m64:
lab-clabbe: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)
sun50i-a64-pine64-plus:
lab-baylibre-seattle: failing since 1 day (last pass: v4.14.153 - first fail: v4.14.153-40-gf7fb2676f8a6)Boot Failures Detected:
i386:
i386_defconfig:
gcc-8:
qemu_i386: 2 failed labsarm:
tegra_defconfig:
gcc-8:
tegra124-jetson-tk1: 1 failed lab
tegra124-nyan-big: 1 failed lab
tegra20-iris-512: 1 failed lab
tegra30-beaver: 1 failed lab
multi_v7_defconfig:
gcc-8:
alpine-db: 1 failed lab
am335x-boneblack: 1 failed lab armada-xp-openblocks-ax3-4: 1 failed lab
bcm2836-rpi-2-b: 1 failed lab
exynos4412-odroidx2: 1 failed lab
exynos5250-arndale: 1 failed lab
exynos5420-arndale-octa: 1 failed lab
exynos5422-odroidxu3: 2 failed labs
exynos5800-peach-pi: 2 failed labs
imx6dl-wandboard_dual: 1 failed lab
imx6dl-wandboard_solo: 1 failed lab
imx6q-sabrelite: 2 failed labs
imx6q-wandboard: 1 failed lab
imx7s-warp: 1 failed lab
meson8b-odroidc1: 2 failed labs
mt7623n-bananapi-bpi-r2: 1 failed lab
omap3-beagle: 1 failed lab
omap4-panda: 3 failed labs
qemu_arm-virt-gicv2: 2 failed labs
qemu_arm-virt-gicv3: 2 failed labs
rk3288-rock2-square: 1 failed lab
rk3288-veyron-jaq: 1 failed lab socfpga_cyclone5_de0_sockit: 1 failed lab
stih410-b2120: 1 failed lab
sun4i-a10-cubieboard: 1 failed lab
sun5i-a13-olinuxino-micro: 1 failed lab
sun7i-a20-cubieboard2: 2 failed labs
sun8i-a33-olinuxino: 1 failed lab
sun8i-a83t-bananapi-m3: 1 failed lab sun8i-h2-plus-orangepi-zero: 1 failed lab
tegra124-jetson-tk1: 1 failed lab
tegra124-nyan-big: 1 failed lab
tegra20-iris-512: 1 failed lab
tegra30-beaver: 1 failed lab
vf610-colibri-eval-v3: 1 failed lab
zynq-zc702: 1 failed lab
davinci_all_defconfig:
gcc-8:
da850-evm: 1 failed lab
sunxi_defconfig:
gcc-8:
sun4i-a10-cubieboard: 1 failed lab
sun5i-a13-olinuxino-micro: 1 failed lab
sun7i-a20-cubieboard2: 2 failed labs
sun8i-a33-olinuxino: 1 failed lab
sun8i-a83t-bananapi-m3: 1 failed lab sun8i-h2-plus-orangepi-zero: 1 failed lab
imx_v6_v7_defconfig:
gcc-8:
imx6dl-wandboard_dual: 1 failed lab
imx6dl-wandboard_solo: 1 failed lab
imx6q-wandboard: 1 failed lab
imx7s-warp: 1 failed lab
vf610-colibri-eval-v3: 1 failed lab
exynos_defconfig:
gcc-8:
exynos4412-odroidx2: 1 failed lab
exynos5250-arndale: 1 failed lab
exynos5420-arndale-octa: 1 failed lab
exynos5422-odroidxu3: 2 failed labs
exynos5800-peach-pi: 2 failed labs
bcm2835_defconfig:
gcc-8:
bcm2835-rpi-b: 1 failed lab
bcm2836-rpi-2-b: 1 failed lab
bcm2837-rpi-3-b: 1 failed lab
omap2plus_defconfig:
gcc-8:
am335x-boneblack: 1 failed lab
omap3-beagle: 1 failed lab
omap3-beagle-xm: 1 failed lab
omap4-panda: 3 failed labs
mvebu_v7_defconfig:
gcc-8:
armada-xp-openblocks-ax3-4: 1 failed lab
x86_64:
x86_64_defconfig:
gcc-8:
minnowboard-turbot-E3826: 1 failed lab
qemu_x86_64: 2 failed labsarm64:
defconfig:
gcc-8:
bcm2837-rpi-3-b: 1 failed lab
juno-r2: 1 failed lab
meson-gxbb-p200: 1 failed lab
meson-gxl-s905x-khadas-vim: 1 failed lab
meson-gxl-s905x-libretech-cc: 3 failed labs
meson-gxl-s905x-nexbox-a95x: 1 failed lab
meson-gxm-nexbox-a1: 1 failed lab
mt7622-rfb1: 1 failed lab
qemu_arm64-virt-gicv2: 2 failed labs
qemu_arm64-virt-gicv3: 2 failed labs
r8a7795-salvator-x: 1 failed lab
r8a7796-m3ulcb: 2 failed labs
rk3399-gru-kevin: 1 failed lab
sun50i-a64-bananapi-m64: 1 failed lab
sun50i-a64-pine64-plus: 1 failed labOffline Platforms:
arm:
sunxi_defconfig:
gcc-8
sun5i-r8-chip: 1 offline lab
sun7i-a20-bananapi: 1 offline lab
multi_v7_defconfig:
gcc-8
omap3-beagle-xm: 1 offline lab
qcom-apq8064-cm-qs600: 1 offline lab
sun5i-r8-chip: 1 offline lab
sun7i-a20-bananapi: 1 offline lab
davinci_all_defconfig:
gcc-8
dm365evm,legacy: 1 offline lab
qcom_defconfig:
gcc-8
qcom-apq8064-cm-qs600: 1 offline lab
---
For more info write to <[email protected]>
Greg Kroah-Hartman
maintainerQuoted 1 line · kernelci.org bot
stable-rc/linux-4.14.y boot: 112 boots: 104 failed, 0 passed with 8 offline (v4.14.153-106-ga46a2b6a665b)
wow, everything dies :(
Greg Kroah-Hartman
maintainerQuoted 5 lines · Greg Kroah-Hartman
Quoted 1 line · kernelci.org bot
stable-rc/linux-4.14.y boot: 112 boots: 104 failed, 0 passed with 8 offline (v4.14.153-106-ga46a2b6a665b)
wow, everything dies :(
Ok, pushing out -rc2 now to hopefully resolve this.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerQuoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.154 release. There are 105 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, 13 Nov 2019 18:08:44 +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.154-rc1.gz
There is now a -rc2 out:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.154-rc2.gz
Jon Hunter
maintainerQuoted 6 lines · Greg Kroah-Hartman
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.154 release. There are 105 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.
Quoted 9 lines
Quoted 5 lines
Responses should be made by Wed, 13 Nov 2019 18:08:44 +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.154-rc1.gzThere is now a -rc2 out:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.154-rc2.gz
All tests for Tegra are passing ...
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.154-rc2-gfc7e45ae100f
Boards tested: tegra124-jetson-tk1, tegra20-ventana,
tegra210-p2371-2180, tegra30-cardhu-a04
Cheers
Jon
Signature · 1 line
nvpublic
Greg Kroah-Hartman
maintainerQuoted 20 lines · Jon Hunter
Quoted 6 lines · Greg Kroah-Hartman
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.154 release. There are 105 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.
Quoted 9 lines
Quoted 5 lines
Responses should be made by Wed, 13 Nov 2019 18:08:44 +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.154-rc1.gzThere is now a -rc2 out:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.154-rc2.gzAll tests for Tegra are passing ...
Quoted 9 lines
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.154-rc2-gfc7e45ae100f
Boards tested: tegra124-jetson-tk1, tegra20-ventana,tegra210-p2371-2180, tegra30-cardhu-a04
Oh good, thanks for testing all of these and letting me know.
greg k-h
Quoted 7 lines · Greg Kroah-Hartman
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.154 release. There are 105 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.
Quoted 8 lines
Quoted 5 lines
Responses should be made by Wed, 13 Nov 2019 18:08:44 +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.154-rc1.gzThere is now a -rc2 out:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.154-rc2.gz
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
Summary
------------------------------------------------------------------------
kernel: 4.14.154-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: fc7e45ae100f042a6f3e1cb7bf47c487b2d5bf3e
git describe: v4.14.153-105-gfc7e45ae100f
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.14-oe/build/v4.14.153-105-gfc7e45ae100f
No regressions (compared to build v4.14.153)
No fixes (compared to build v4.14.153)
Ran 24216 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
* 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
* perf
* spectre-meltdown-checker-test
* v4l2-compliance
* network-basic-tests
* ltp-open-posix-tests
* kvm-unit-tests
* ssuite
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-none
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Greg Kroah-Hartman
maintainerPATCH 105/105 cgroup,writeback: dont switch wbs immediately on dead wbs if the memcg is dead
In reply to Greg Kroah-HartmanFrom: Tejun Heo <[email protected]>
commit 65de03e251382306a4575b1779c57c87889eee49 upstream.
cgroup writeback tries to refresh the associated wb immediately if the current wb is dead. This is to avoid keeping issuing IOs on the stale wb after memcg - blkcg association has changed (ie. when blkcg got disabled / enabled higher up in the hierarchy).
Unfortunately, the logic gets triggered spuriously on inodes which are associated with dead cgroups. When the logic is triggered on dead cgroups, the attempt fails only after doing quite a bit of work allocating and initializing a new wb.
While c3aab9a0bd91 ("mm/filemap.c: don't initiate writeback if mapping has no dirty pages") alleviated the issue significantly as it now only triggers when the inode has dirty pages. However, the condition can still be triggered before the inode is switched to a different cgroup and the logic simply doesn't make sense.
Skip the immediate switching if the associated memcg is dying.
This is a simplified version of the following two patches:
* https://lore.kernel.org/linux-mm/20190513183053.GA73423@dennisz-mbp/
* http://lkml.kernel.org/r/156355839560.2063.5265687291430814589.stgit@buzz
--- fs/fs-writeback.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/fs-writeback.c +6 -3
@@ -582,10 +582,13 @@ void wbc_attach_and_unlock_inode(structspin_unlock (&inode->i_lock);/* -* A dying wb indicates that the memcg-blkcg mapping has changed -* and a new wb is already serving the memcg. Switch immediately. +* A dying wb indicates that either the blkcg associated with the +* memcg changed or the associated memcg is dying. In the first +* case, a replacement wb should already be available and we should +* refresh the wb immediately. In the second case, trying to +* refresh will keep failing. */ -if (unlikely (wb_dying (wbc->wb))) +if (unlikely (wb_dying (wbc->wb) && !css_is_dying (wbc->wb->memcg_css)))inode_switch_wbs (inode, wbc->wb_id); }
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.154 release. There are 105 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, 13 Nov 2019 18:08:44 +0000. Anything received after that time might be too late.
For -rc2:
Build results:
total: 172 pass: 172 fail: 0 Qemu test results: total: 372 pass: 372 fail: 0
Guenter