Linux 5.4.168
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.168 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/boot/dts/imx6ull-pinfunc.h | 2 arch/arm/boot/dts/socfpga_arria10_socdk_qspi.dts | 2 arch/arm/boot/dts/socfpga_arria5_socdk.dts | 2 arch/arm/boot/dts/socfpga_cyclone5_socdk.dts | 2 arch/arm/boot/dts/socfpga_cyclone5_sockit.dts | 2 arch/arm/boot/dts/socfpga_cyclone5_socrates.dts | 2 arch/arm/boot/dts/socfpga_cyclone5_sodia.dts | 2 arch/arm/boot/dts/socfpga_cyclone5_vining_fpga.dts | 4 arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtsi | 1 arch/arm64/boot/dts/rockchip/rk3399-leez-p710.dts | 2 arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts | 2 arch/s390/kernel/machine_kexec_file.c | 7 drivers/ata/libata-scsi.c | 15 + drivers/block/xen-blkfront.c | 15 - drivers/clk/clk.c | 15 - drivers/dma/st_fdma.c | 2 drivers/firmware/scpi_pm_domain.c | 10 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 4 drivers/iio/adc/stm32-adc.c | 1 drivers/input/touchscreen/of_touchscreen.c | 18 - drivers/md/persistent-data/dm-btree-remove.c | 2 drivers/media/usb/dvb-usb-v2/mxl111sf.c | 16 + drivers/net/ethernet/broadcom/bcmsysport.c | 5 drivers/net/ethernet/broadcom/bcmsysport.h | 1 drivers/net/ethernet/intel/igb/igb_main.c | 28 +- drivers/net/ethernet/intel/igbvf/netdev.c | 1 drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 3 drivers/net/netdevsim/bpf.c | 1 drivers/net/wireless/marvell/mwifiex/cmdevt.c | 4 drivers/net/wireless/marvell/mwifiex/fw.h | 8 drivers/net/xen-netback/common.h | 1 drivers/net/xen-netback/rx.c | 77 +++--- drivers/net/xen-netfront.c | 125 +++++++--- drivers/pci/msi.c | 15 - drivers/scsi/scsi_debug.c | 4 drivers/soc/tegra/fuse/fuse-tegra.c | 2 drivers/soc/tegra/fuse/fuse.h | 2 drivers/tty/hvc/hvc_xen.c | 30 ++ drivers/usb/core/quirks.c | 3 drivers/usb/gadget/composite.c | 6 drivers/usb/gadget/legacy/dbgp.c | 6 drivers/usb/gadget/legacy/inode.c | 6 drivers/usb/host/xhci-pci.c | 6 drivers/usb/serial/cp210x.c | 6 drivers/usb/serial/option.c | 8 drivers/virtio/virtio_ring.c | 2 fs/fuse/dir.c | 2 fs/nfsd/nfs4state.c | 9 fs/overlayfs/dir.c | 3 fs/overlayfs/overlayfs.h | 1 fs/overlayfs/super.c | 12 include/net/tc_act/tc_tunnel_key.h | 7 kernel/audit.c | 21 - kernel/rcu/tree.c | 10 kernel/time/timekeeping.c | 3 net/core/skbuff.c | 2 net/ipv4/inet_diag.c | 19 - net/ipv6/sit.c | 1 net/mac80211/agg-rx.c | 8 net/mac80211/agg-tx.c | 80 +++--- net/mac80211/driver-ops.h | 5 net/mac80211/mlme.c | 13 - net/mac80211/sta_info.h | 1 net/mac80211/util.c | 2 net/packet/af_packet.c | 5 net/rds/connection.c | 1 net/sched/act_sample.c | 2 net/sched/cls_api.c | 18 - net/sched/sch_cake.c | 6 net/smc/af_smc.c | 4 scripts/recordmcount.pl | 2 tools/testing/selftests/kvm/kvm_create_max_vcpus.c | 30 ++ tools/testing/selftests/net/fcnal-test.sh | 23 + tools/testing/selftests/net/forwarding/forwarding.config.sample | 2 75 files changed, 523 insertions(+), 249 deletions(-)
Alex Bee (1):
arm64: dts: rockchip: fix audio-supply for Rock Pi 4
Alyssa Ross (1):
dmaengine: st_fdma: fix MODULE_ALIAS
Artem Lapkin (1):
arm64: dts: rockchip: remove mmc-hs400-enhanced-strobe from rk3399-khadas-edge
Baowen Zheng (1):
flow_offload: return EOPNOTSUPP for the unsupported mpls action type
Cyril Novikov (1):
ixgbe: set X550 MDIO speed before talking to PHY
D. Wythe (1):
net/smc: Prevent smc_release() from long blocking
Daniele Palmas (1):
USB: serial: option: add Telit FN990 compositions
David Ahern (2):
selftests: Fix raw socket bind tests with VRF
selftests: Fix IPv6 address bind tests
Dinh Nguyen (1):
ARM: socfpga: dts: fix qspi node compatible
Eric Dumazet (4):
sch_cake: do not call cake_destroy() from cake_init()
inet_diag: use jiffies_delta_to_msecs()
inet_diag: fix kernel-infoleak for UDP sockets
sit: do not call ipip6_dev_free() from sit_init_net()
Fabio Estevam (1):
ARM: dts: imx6ull-pinfunc: Fix CSI_DATA07__ESAI_TX0 pad name
Fabrice Gasnier (1):
iio: adc: stm32: fix a current leak by resetting pcsel before disabling vdda
Felix Fietkau (2):
mac80211: send ADDBA requests using the tid/queue of the aggregation session
mac80211: fix regression in SSN handling of addba tx
Florian Fainelli (1):
net: systemport: Add global locking for descriptor lifecycle
Gal Pressman (1):
net: Fix double 0x prefix print in SKB dump
George Kennedy (2):
libata: if T_LENGTH is zero, dma direction should be DMA_NONE
scsi: scsi_debug: Sanity check block descriptor length in resp_mode_select()
Greg Kroah-Hartman (2):
USB: gadget: bRequestType is a bitfield, not a enum Linux 5.4.168
Haimin Zhang (1):
netdevsim: Zero-initialize memory for new map's value in function nsim_bpf_map_alloc
Hangbin Liu (1):
selftest/net/forwarding: declare NETIFS p9 p10
Hangyu Hua (1):
rds: memory leak in __rds_conn_create()
J. Bruce Fields (1):
nfsd: fix use-after-free due to delegation race
Jerome Marchand (1):
recordmcount.pl: look for jgnop instruction as well as bcrl on s390
Jie2x Zhou (1):
selftests: net: Correct ping6 expected rc from 2 to 1
Jimmy Wang (1):
USB: NO_LPM quirk Lenovo USB-C to Ethernet Adapher(RTL8153-04)
Joe Thornber (1):
dm btree remove: fix use after free in rebalance_children()
Johan Hovold (1):
USB: serial: cp210x: fix CP2105 GPIO registration
Johannes Berg (6):
mac80211: mark TX-during-stop for TX in in_reconfig
mac80211: track only QoS data frames for admission control
mac80211: agg-tx: don't schedule_and_wake_txq() under sta->lock
mac80211: accept aggregation sessions on 6 GHz
mac80211: fix lookup when adding AddBA extension element
mac80211: validate extended element ID is present
John Keeping (1):
arm64: dts: rockchip: fix rk3399-leez-p710 vcc3v3-lan supply
Juergen Gross (5):
xen/blkfront: harden blkfront against event channel storms xen/netfront: harden netfront against event channel storms xen/console: harden hvc_xen against event channel storms xen/netback: fix rx queue stall detection xen/netback: don't queue unlimited number of packages
Karen Sornek (1):
igb: Fix removal of unicast MAC filters of VFs
Le Ma (1):
drm/amdgpu: correct register access for RLC_JUMP_TABLE_RESTORE
Leon Romanovsky (1):
net: sched: Fix suspicious RCU usage while accessing tcf_tunnel_info
Letu Ren (1):
igbvf: fix double free in igbvf_probe
Magnus Karlsson (2):
xsk: Do not sleep in poll() when need_wakeup set Revert "xsk: Do not sleep in poll() when need_wakeup set"
Mike Tipton (1):
clk: Don't parent clks until the parent is fully registered
Miklos Szeredi (2):
fuse: annotate lock in fuse_reverse_inval_entry()
ovl: fix warning in ovl_create_real()
Mordechay Goodstein (1):
mac80211: agg-tx: refactor sending addba
Nathan Chancellor (3):
soc/tegra: fuse: Fix bitwise vs. logical OR warning
mwifiex: Remove unnecessary braces from HostCmd_SET_SEQ_NO_BSS_INFO
Input: touchscreen - avoid bitwise vs logical OR warning
Nehal Bakulchandra Shah (1):
usb: xhci: Extend support for runtime power management for AMD's Yellow carp.
Paul E. McKenney (1):
rcu: Mark accesses to rcu_state.n_force_qs
Paul Moore (1):
audit: improve robustness of the audit queue handling
Pavel Skripkin (1):
media: mxl111sf: change mutex_init() location
Philipp Rudo (1):
s390/kexec_file: fix error handling when applying relocations
Stefan Roese (1):
PCI/MSI: Mask MSI-X vectors only on success
Sudeep Holla (1):
firmware: arm_scpi: Fix string overflow in SCPI genpd driver
Thomas Gleixner (1):
PCI/MSI: Clear PCI_MSIX_FLAGS_MASKALL on error
Vitaly Kuznetsov (1):
KVM: selftests: Make sure kvm_create_max_vcpus test won't hit RLIMIT_NOFILE
Vlad Buslov (1):
net: sched: lock action when translating it to flow_action infra
Will Deacon (1):
virtio_ring: Fix querying of maximum DMA mapping size for virtio device
Willem de Bruijn (1):
net/packet: rx_owner_map depends on pg_vec
Yu Liao (1):
timekeeping: Really make sure wall_to_monotonic isn't positive
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 167 +SUBLEVEL = 168 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/arm/boot/dts/imx6ull-pinfunc.h +1 -1
@@ -82,6 +82,6 @@#define MX6ULL_PAD_CSI_DATA04__ESAI_TX_FS 0x01F4 0x0480 0x0000 0x9 0x0#define MX6ULL_PAD_CSI_DATA05__ESAI_TX_CLK 0x01F8 0x0484 0x0000 0x9 0x0#define MX6ULL_PAD_CSI_DATA06__ESAI_TX5_RX0 0x01FC 0x0488 0x0000 0x9 0x0 -#define MX6ULL_PAD_CSI_DATA07__ESAI_T0 0x0200 0x048C 0x0000 0x9 0x0 +#define MX6ULL_PAD_CSI_DATA07__ESAI_TX0 0x0200 0x048C 0x0000 0x9 0x0#endif /* __DTS_IMX6ULL_PINFUNC_H */
arch/arm/boot/dts/socfpga_arria10_socdk_qspi.dts +1 -1
@@ -12,7 +12,7 @@ flash0: n25q00@0 { #address-cells = <1>; #size-cells = <1>; - compatible = "n25q00aa"; + compatible = "micron,mt25qu02g", "jedec,spi-nor"; reg = <0>; spi-max-frequency = <100000000>;
arch/arm/boot/dts/socfpga_arria5_socdk.dts +1 -1
@@ -119,7 +119,7 @@ flash: flash@0 { #address-cells = <1>; #size-cells = <1>; - compatible = "n25q256a"; + compatible = "micron,n25q256a", "jedec,spi-nor"; reg = <0>; spi-max-frequency = <100000000>;
arch/arm/boot/dts/socfpga_cyclone5_socdk.dts +1 -1
@@ -124,7 +124,7 @@ flash0: n25q00@0 { #address-cells = <1>; #size-cells = <1>; - compatible = "n25q00"; + compatible = "micron,mt25qu02g", "jedec,spi-nor"; reg = <0>; /* chip select */ spi-max-frequency = <100000000>;
arch/arm/boot/dts/socfpga_cyclone5_sockit.dts +1 -1
@@ -169,7 +169,7 @@ flash: flash@0 { #address-cells = <1>; #size-cells = <1>; - compatible = "n25q00"; + compatible = "micron,mt25qu02g", "jedec,spi-nor"; reg = <0>; spi-max-frequency = <100000000>;
arch/arm/boot/dts/socfpga_cyclone5_socrates.dts +1 -1
@@ -80,7 +80,7 @@ flash: flash@0 { #address-cells = <1>; #size-cells = <1>; - compatible = "n25q256a"; + compatible = "micron,n25q256a", "jedec,spi-nor"; reg = <0>; spi-max-frequency = <100000000>; m25p,fast-read;
arch/arm/boot/dts/socfpga_cyclone5_sodia.dts +1 -1
@@ -116,7 +116,7 @@ flash0: n25q512a@0 { #address-cells = <1>; #size-cells = <1>; - compatible = "n25q512a"; + compatible = "micron,n25q512a", "jedec,spi-nor"; reg = <0>; spi-max-frequency = <100000000>;
arch/arm/boot/dts/socfpga_cyclone5_vining_fpga.dts +2 -2
@@ -224,7 +224,7 @@ n25q128@0 { #address-cells = <1>; #size-cells = <1>; - compatible = "n25q128"; + compatible = "micron,n25q128", "jedec,spi-nor"; reg = <0>; /* chip select */ spi-max-frequency = <100000000>; m25p,fast-read;
@@ -241,7 +241,7 @@ n25q00@1 { #address-cells = <1>; #size-cells = <1>; - compatible = "n25q00"; + compatible = "micron,mt25qu02g", "jedec,spi-nor"; reg = <1>; /* chip select */ spi-max-frequency = <100000000>; m25p,fast-read;
arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtsi +0 -1
@@ -685,7 +685,6 @@ &sdhci { bus-width = <8>; mmc-hs400-1_8v; - mmc-hs400-enhanced-strobe; non-removable; status = "okay"; };
arch/arm64/boot/dts/rockchip/rk3399-leez-p710.dts +1 -1
@@ -49,7 +49,7 @@ regulator-boot-on; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; - vim-supply = <&vcc3v3_sys>; + vin-supply = <&vcc3v3_sys>; }; vcc3v3_sys: vcc3v3-sys {
arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts +1 -1
@@ -452,7 +452,7 @@ status = "okay"; bt656-supply = <&vcc_3v0>; - audio-supply = <&vcc_3v0>; + audio-supply = <&vcc1v8_codec>; sdmmc-supply = <&vcc_sdio>; gpio1830-supply = <&vcc_3v0>; };
arch/s390/kernel/machine_kexec_file.c +6 -1
@@ -277,6 +277,7 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi, {Elf_Rela *relas;int i, r_type; +int ret; relas = (void *)pi->ehdr + relsec->sh_offset;
@@ -311,7 +312,11 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi, addr = section->sh_addr + relas[i].r_offset; r_type =ELF64_R_TYPE (relas[i].r_info); -arch_kexec_do_relocs (r_type, loc, val, addr); + ret =arch_kexec_do_relocs (r_type, loc, val, addr); +if (ret) { +pr_err ("Unknown rela relocation: %d\n" , r_type); +return -ENOEXEC ; + } }return 0 ; }
drivers/ata/libata-scsi.c +13 -2
@@ -3164,8 +3164,19 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) goto invalid_fld; } -if (ata_is_ncq (tf->protocol) && (cdb[2 + cdb_offset] &0x3 ) ==0 ) - tf->protocol =ATA_PROT_NCQ_NODATA ; +if ((cdb[2 + cdb_offset] &0x3 ) ==0 ) { +/* +* When T_LENGTH is zero (No data is transferred), dir should +* be DMA_NONE. +*/ +if (scmd->sc_data_direction !=DMA_NONE ) { + fp =2 + cdb_offset; + goto invalid_fld; + } + +if (ata_is_ncq (tf->protocol)) + tf->protocol =ATA_PROT_NCQ_NODATA ; + }/* enable LBA */ tf->flags |=ATA_TFLAG_LBA ;
drivers/block/xen-blkfront.c +12 -3
@@ -1565,9 +1565,12 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)unsigned long flags;struct blkfront_ring_info *rinfo = (struct blkfront_ring_info *)dev_id;struct blkfront_info *info = rinfo->dev_info; +unsigned int eoiflag =XEN_EOI_FLAG_SPURIOUS ; -if (unlikely (info->connected !=BLKIF_STATE_CONNECTED )) +if (unlikely (info->connected !=BLKIF_STATE_CONNECTED )) { +xen_irq_lateeoi (irq,XEN_EOI_FLAG_SPURIOUS );return IRQ_HANDLED ; + }spin_lock_irqsave (&rinfo->ring_lock, flags); again:
@@ -1583,6 +1586,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)unsigned long id;unsigned int op; + eoiflag =0 ; +RING_COPY_RESPONSE (&rinfo->ring, i, &bret); id = bret.id;
@@ -1698,6 +1703,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)spin_unlock_irqrestore (&rinfo->ring_lock, flags); +xen_irq_lateeoi (irq, eoiflag); +return IRQ_HANDLED ; err:
@@ -1705,6 +1712,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)spin_unlock_irqrestore (&rinfo->ring_lock, flags); +/* No EOI in order to avoid further interrupts. */ +pr_alert ("%s disabled for further use\n" , info->gd->disk_name);return IRQ_HANDLED ; }
@@ -1744,8 +1753,8 @@ static int setup_blkring(struct xenbus_device *dev,if (err) goto fail; - err =bind_evtchn_to_irqhandler (rinfo->evtchn, blkif_interrupt,0 , -"blkif" , rinfo); + err =bind_evtchn_to_irqhandler_lateeoi (rinfo->evtchn, blkif_interrupt, +0 ,"blkif" , rinfo);if (err <=0 ) {xenbus_dev_fatal (dev, err,"bind_evtchn_to_irqhandler failed" );
drivers/clk/clk.c +12 -3
@@ -3299,6 +3299,14 @@ static int __clk_core_init(struct clk_core *core)clk_prepare_lock (); +/* +* Set hw->core after grabbing the prepare_lock to synchronize with +* callers of clk_core_fill_parent_index() where we treat hw->core +* being NULL as the clk not being registered yet. This is crucial so +* that clks aren't parented until their parent is fully registered. +*/ + core->hw->core = core; + ret =clk_pm_runtime_get (core);if (ret) goto unlock;
@@ -3452,8 +3460,10 @@ static int __clk_core_init(struct clk_core *core) out:clk_pm_runtime_put (core); unlock: -if (ret) +if (ret) {hlist_del_init (&core->child_node); + core->hw->core =NULL ; + }clk_prepare_unlock ();
@@ -3699,7 +3709,6 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) core->num_parents = init->num_parents; core->min_rate =0 ; core->max_rate =ULONG_MAX ; - hw->core = core; ret =clk_core_populate_parent_map (core, init);if (ret)
@@ -3717,7 +3726,7 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) goto fail_create_clk; } -clk_core_link_consumer (hw->core, hw->clk); +clk_core_link_consumer (core, hw->clk); ret =__clk_core_init (core);if (!ret)
drivers/dma/st_fdma.c +1 -1
@@ -873,4 +873,4 @@ MODULE_LICENSE("GPL v2");MODULE_DESCRIPTION ("STMicroelectronics FDMA engine driver" );MODULE_AUTHOR ("Ludovic.barre <[email protected]>" );MODULE_AUTHOR ("Peter Griffin <[email protected]>" ); -MODULE_ALIAS ("platform: " DRIVER_NAME ); +MODULE_ALIAS ("platform:" DRIVER_NAME );
drivers/firmware/scpi_pm_domain.c +7 -3
@@ -16,7 +16,6 @@ struct scpi_pm_domain {struct generic_pm_domain genpd;struct scpi_ops *ops;u32 domain; -char name[30 ]; };/*
@@ -110,8 +109,13 @@ static int scpi_pm_domain_probe(struct platform_device *pdev) scpi_pd->domain = i; scpi_pd->ops = scpi_ops; -sprintf (scpi_pd->name,"%pOFn.%d" , np, i); - scpi_pd->genpd.name = scpi_pd->name; + scpi_pd->genpd.name =devm_kasprintf (dev,GFP_KERNEL , +"%pOFn.%d" , np, i); +if (!scpi_pd->genpd.name) { +dev_err (dev,"Failed to allocate genpd name:%pOFn.%d\n" , + np, i); +continue ; + } scpi_pd->genpd.power_off = scpi_pd_power_off; scpi_pd->genpd.power_on = scpi_pd_power_on;
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +2 -2
@@ -2906,8 +2906,8 @@ static void gfx_v9_0_init_pg(struct amdgpu_device *adev) AMD_PG_SUPPORT_CP | AMD_PG_SUPPORT_GDS | AMD_PG_SUPPORT_RLC_SMU_HS)) { -WREG32 (mmRLC_JUMP_TABLE_RESTORE, - adev->gfx.rlc.cp_table_gpu_addr >>8 ); +WREG32_SOC15 (GC ,0 , mmRLC_JUMP_TABLE_RESTORE, + adev->gfx.rlc.cp_table_gpu_addr >>8 );gfx_v9_0_init_gfx_power_gating (adev); } }
drivers/iio/adc/stm32-adc.c +1 -0
@@ -933,6 +933,7 @@ static int stm32h7_adc_prepare(struct stm32_adc *adc)static void stm32h7_adc_unprepare (struct stm32_adc *adc) { +stm32_adc_writel (adc,STM32H7_ADC_PCSEL ,0 );stm32h7_adc_disable (adc);stm32h7_adc_enter_pwr_down (adc); }
drivers/input/touchscreen/of_touchscreen.c +9 -9
@@ -81,8 +81,8 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch,touchscreen_get_prop_u32 (dev,"touchscreen-size-x" ,input_abs_get_max (input, axis) +1 , - &maximum) | -touchscreen_get_prop_u32 (dev,"touchscreen-fuzz-x" , + &maximum); + data_present |=touchscreen_get_prop_u32 (dev,"touchscreen-fuzz-x" ,input_abs_get_fuzz (input, axis), &fuzz);if (data_present)
@@ -95,8 +95,8 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch,touchscreen_get_prop_u32 (dev,"touchscreen-size-y" ,input_abs_get_max (input, axis) +1 , - &maximum) | -touchscreen_get_prop_u32 (dev,"touchscreen-fuzz-y" , + &maximum); + data_present |=touchscreen_get_prop_u32 (dev,"touchscreen-fuzz-y" ,input_abs_get_fuzz (input, axis), &fuzz);if (data_present)
@@ -106,11 +106,11 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch, data_present =touchscreen_get_prop_u32 (dev,"touchscreen-max-pressure" ,input_abs_get_max (input, axis), - &maximum) | -touchscreen_get_prop_u32 (dev, -"touchscreen-fuzz-pressure" , -input_abs_get_fuzz (input, axis), - &fuzz); + &maximum); + data_present |=touchscreen_get_prop_u32 (dev, +"touchscreen-fuzz-pressure" , +input_abs_get_fuzz (input, axis), + &fuzz);if (data_present)touchscreen_set_params (input, axis,0 , maximum, fuzz);
drivers/md/persistent-data/dm-btree-remove.c +1 -1
@@ -423,9 +423,9 @@ static int rebalance_children(struct shadow_spine *s,memcpy (n,dm_block_data (child),dm_bm_block_size (dm_tm_get_bm (info->tm))); -dm_tm_unlock (info->tm, child);dm_tm_dec (info->tm,dm_block_location (child)); +dm_tm_unlock (info->tm, child);return 0 ; }
drivers/media/usb/dvb-usb-v2/mxl111sf.c +14 -2
@@ -931,8 +931,6 @@ static int mxl111sf_init(struct dvb_usb_device *d) .len = sizeof(eeprom), .buf = eeprom }, }; -mutex_init (&state->msg_lock); - ret =get_chip_info (state);if (mxl_fail (ret))pr_err ("failed to get chip info during probe" );
@@ -1074,6 +1072,14 @@ static int mxl111sf_get_stream_config_dvbt(struct dvb_frontend *fe,return 0 ; } +static int mxl111sf_probe (struct dvb_usb_device *dev) +{ +struct mxl111sf_state *state =d_to_priv (dev); + +mutex_init (&state->msg_lock); +return 0 ; +} +static struct dvb_usb_device_properties mxl111sf_props_dvbt = { .driver_name =KBUILD_MODNAME , .owner =THIS_MODULE ,
@@ -1083,6 +1089,7 @@ static struct dvb_usb_device_properties mxl111sf_props_dvbt = { .generic_bulk_ctrl_endpoint = 0x02, .generic_bulk_ctrl_endpoint_response = 0x81, + .probe = mxl111sf_probe, .i2c_algo = &mxl111sf_i2c_algo, .frontend_attach = mxl111sf_frontend_attach_dvbt, .tuner_attach = mxl111sf_attach_tuner,
@@ -1124,6 +1131,7 @@ static struct dvb_usb_device_properties mxl111sf_props_atsc = { .generic_bulk_ctrl_endpoint = 0x02, .generic_bulk_ctrl_endpoint_response = 0x81, + .probe = mxl111sf_probe, .i2c_algo = &mxl111sf_i2c_algo, .frontend_attach = mxl111sf_frontend_attach_atsc, .tuner_attach = mxl111sf_attach_tuner,
@@ -1165,6 +1173,7 @@ static struct dvb_usb_device_properties mxl111sf_props_mh = { .generic_bulk_ctrl_endpoint = 0x02, .generic_bulk_ctrl_endpoint_response = 0x81, + .probe = mxl111sf_probe, .i2c_algo = &mxl111sf_i2c_algo, .frontend_attach = mxl111sf_frontend_attach_mh, .tuner_attach = mxl111sf_attach_tuner,
@@ -1233,6 +1242,7 @@ static struct dvb_usb_device_properties mxl111sf_props_atsc_mh = { .generic_bulk_ctrl_endpoint = 0x02, .generic_bulk_ctrl_endpoint_response = 0x81, + .probe = mxl111sf_probe, .i2c_algo = &mxl111sf_i2c_algo, .frontend_attach = mxl111sf_frontend_attach_atsc_mh, .tuner_attach = mxl111sf_attach_tuner,
@@ -1311,6 +1321,7 @@ static struct dvb_usb_device_properties mxl111sf_props_mercury = { .generic_bulk_ctrl_endpoint = 0x02, .generic_bulk_ctrl_endpoint_response = 0x81, + .probe = mxl111sf_probe, .i2c_algo = &mxl111sf_i2c_algo, .frontend_attach = mxl111sf_frontend_attach_mercury, .tuner_attach = mxl111sf_attach_tuner,
@@ -1381,6 +1392,7 @@ static struct dvb_usb_device_properties mxl111sf_props_mercury_mh = { .generic_bulk_ctrl_endpoint = 0x02, .generic_bulk_ctrl_endpoint_response = 0x81, + .probe = mxl111sf_probe, .i2c_algo = &mxl111sf_i2c_algo, .frontend_attach = mxl111sf_frontend_attach_mercury_mh, .tuner_attach = mxl111sf_attach_tuner,
drivers/net/ethernet/broadcom/bcmsysport.c +4 -1
@@ -1277,11 +1277,11 @@ static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb,struct bcm_sysport_priv *priv =netdev_priv (dev);struct device *kdev = &priv->pdev->dev;struct bcm_sysport_tx_ring *ring; +unsigned long flags, desc_flags;struct bcm_sysport_cb *cb;struct netdev_queue *txq;u32 len_status, addr_lo;unsigned int skb_len; -unsigned long flags;dma_addr_t mapping;u16 queue;int ret;
@@ -1339,8 +1339,10 @@ static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb, ring->desc_count--;/* Ports are latched, so write upper address first */ +spin_lock_irqsave (&priv->desc_lock, desc_flags);tdma_writel (priv, len_status,TDMA_WRITE_PORT_HI (ring->index));tdma_writel (priv, addr_lo,TDMA_WRITE_PORT_LO (ring->index)); +spin_unlock_irqrestore (&priv->desc_lock, desc_flags);/* Check ring space and update SW control flow */ if (ring->desc_count ==0 )
@@ -1970,6 +1972,7 @@ static int bcm_sysport_open(struct net_device *dev) }/* Initialize both hardware and software ring */ +spin_lock_init (&priv->desc_lock);for (i =0 ; i < dev->num_tx_queues; i++) { ret =bcm_sysport_init_tx_ring (priv, i);if (ret) {
drivers/net/ethernet/broadcom/bcmsysport.h +1 -0
@@ -742,6 +742,7 @@ struct bcm_sysport_priv {int wol_irq;/* Transmit rings */ +spinlock_t desc_lock;struct bcm_sysport_tx_ring *tx_rings;/* Receive queue */
drivers/net/ethernet/intel/igb/igb_main.c +14 -14
@@ -7374,6 +7374,20 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf,struct vf_mac_filter *entry =NULL ;int ret =0 ; +if ((vf_data->flags &IGB_VF_FLAG_PF_SET_MAC ) && + !vf_data->trusted) { +dev_warn (&pdev->dev, +"VF %d requested MAC filter but is administratively denied\n" , + vf); +return -EINVAL ; + } +if (!is_valid_ether_addr (addr)) { +dev_warn (&pdev->dev, +"VF %d attempted to set invalid MAC filter\n" , + vf); +return -EINVAL ; + } +switch (info) {case E1000_VF_MAC_FILTER_CLR :/* remove all unicast MAC filters related to the current VF */
@@ -7387,20 +7401,6 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf, }break ;case E1000_VF_MAC_FILTER_ADD : -if ((vf_data->flags &IGB_VF_FLAG_PF_SET_MAC ) && - !vf_data->trusted) { -dev_warn (&pdev->dev, -"VF %d requested MAC filter but is administratively denied\n" , - vf); -return -EINVAL ; - } -if (!is_valid_ether_addr (addr)) { -dev_warn (&pdev->dev, -"VF %d attempted to set invalid MAC filter\n" , - vf); -return -EINVAL ; - } -/* try to find empty slot in the list */ list_for_each (pos, &adapter->vf_macs.l) { entry = list_entry(pos, struct vf_mac_filter, l);
drivers/net/ethernet/intel/igbvf/netdev.c +1 -0
@@ -2887,6 +2887,7 @@ static int igbvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)return 0 ; err_hw_init: +netif_napi_del (&adapter->rx_ring->napi);kfree (adapter->tx_ring);kfree (adapter->rx_ring); err_sw_init:
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +3 -0
@@ -3405,6 +3405,9 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)/* flush pending Tx transactions */ ixgbe_clear_tx_pending (hw); +/* set MDIO speed before talking to the PHY in case it's the 1st time */ +ixgbe_set_mdio_speed (hw); +/* PHY ops must be identified and initialized prior to reset */ status = hw->phy.ops.init (hw); if (status == IXGBE_ERR_SFP_NOT_SUPPORTED ||
drivers/net/netdevsim/bpf.c +1 -0
@@ -510,6 +510,7 @@ nsim_bpf_map_alloc(struct netdevsim *ns, struct bpf_offloaded_map *offmap) goto err_free; key = nmap->entry[i].key; *key = i; +memset (nmap->entry[i].value,0 , offmap->map.value_size); } }
drivers/net/wireless/marvell/mwifiex/cmdevt.c +2 -2
@@ -322,9 +322,9 @@ static int mwifiex_dnld_sleep_confirm_cmd(struct mwifiex_adapter *adapter) adapter->seq_num++; sleep_cfm_buf->seq_num = -cpu_to_le16 ((HostCmd_SET_SEQ_NO_BSS_INFO +cpu_to_le16 (HostCmd_SET_SEQ_NO_BSS_INFO (adapter->seq_num, priv->bss_num, - priv->bss_type))); + priv->bss_type)); mwifiex_dbg(adapter, CMD, "cmd: DNLD_CMD: %#x, act %#x, len %d, seqno %#x\n",
drivers/net/wireless/marvell/mwifiex/fw.h +4 -4
@@ -512,10 +512,10 @@ enum mwifiex_channel_flags {#define RF_ANTENNA_AUTO 0xFFFF -#define HostCmd_SET_SEQ_NO_BSS_INFO (seq, num, type) { \ - (((seq) & 0x00ff) | \ - (((num) & 0x000f) << 8)) | \ - (((type) & 0x000f) << 12); } +#define HostCmd_SET_SEQ_NO_BSS_INFO (seq, num, type) \ + ((((seq) & 0x00ff) | \ + (((num) & 0x000f) << 8)) | \ + (((type) & 0x000f) << 12))#define HostCmd_GET_SEQ_NO (seq) \ ((seq) & HostCmd_SEQ_NUM_MASK)
drivers/net/xen-netback/common.h +1 -0
@@ -203,6 +203,7 @@ struct xenvif_queue { /* Per-queue data for xenvif */unsigned int rx_queue_max;unsigned int rx_queue_len;unsigned long last_rx_time; +unsigned int rx_slots_needed;bool stalled;struct xenvif_copy_state rx_copy;
drivers/net/xen-netback/rx.c +49 -28
129 lines not on this page · raw message
drivers/net/xen-netfront.c +94 -31
250 lines not on this page · raw message
drivers/pci/msi.c +11 -4
@@ -827,9 +827,6 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries, goto out_disable; } -/* Ensure that all table entries are masked. */ -msix_mask_all (base, tsize); - ret =msix_setup_entries (dev, base, entries, nvec, affd);if (ret) goto out_disable;
@@ -852,6 +849,16 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,/* Set MSI-X enabled bits and unmask the function */ pci_intx_for_msi (dev,0 ); dev->msix_enabled =1 ; + +/* +* Ensure that all table entries are masked to prevent +* stale entries from firing in a crash kernel. +* +* Done late to deal with a broken Marvell NVME device +* which takes the MSI-X mask bits into account even +* when MSI-X is disabled, which prevents MSI delivery. +*/ +msix_mask_all (base, tsize);pci_msix_clear_and_set_ctrl (dev,PCI_MSIX_FLAGS_MASKALL ,0 );pcibios_free_irq (dev);
@@ -878,7 +885,7 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,free_msi_irqs (dev); out_disable: -pci_msix_clear_and_set_ctrl (dev,PCI_MSIX_FLAGS_ENABLE ,0 ); +pci_msix_clear_and_set_ctrl (dev,PCI_MSIX_FLAGS_MASKALL |PCI_MSIX_FLAGS_ENABLE ,0 );return ret; }
drivers/scsi/scsi_debug.c +2 -2
@@ -2296,11 +2296,11 @@ static int resp_mode_select(struct scsi_cmnd *scp, __func__, param_len, res); md_len = mselect6 ? (arr[0 ] +1 ) : (get_unaligned_be16 (arr +0 ) +2 ); bd_len = mselect6 ? arr[3 ] :get_unaligned_be16 (arr +6 ); -if (md_len >2 ) { + off = bd_len + (mselect6 ?4 :8 ); +if (md_len >2 || off >= res) {mk_sense_invalid_fld (scp,SDEB_IN_DATA ,0 ,-1 );return check_condition_result; } - off = bd_len + (mselect6 ?4 :8 ); mpage = arr[off] &0x3f ; ps = !!(arr[off] &0x80 );if (ps) {
drivers/soc/tegra/fuse/fuse-tegra.c +1 -1
@@ -172,7 +172,7 @@ static struct platform_driver tegra_fuse_driver = { };builtin_platform_driver (tegra_fuse_driver); -bool __init tegra_fuse_read_spare (unsigned int spare) +u32 __init tegra_fuse_read_spare (unsigned int spare) {unsigned int offset = fuse->soc->info->spare + spare *4 ;
drivers/soc/tegra/fuse/fuse.h +1 -1
@@ -53,7 +53,7 @@ struct tegra_fuse {void tegra_init_revision (void );void tegra_init_apbmisc (void ); -bool __init tegra_fuse_read_spare (unsigned int spare); +u32 __init tegra_fuse_read_spare (unsigned int spare);u32 __init tegra_fuse_read_early (unsigned int offset);#ifdef CONFIG_ARCH_TEGRA_2x_SOC
drivers/tty/hvc/hvc_xen.c +27 -3
@@ -37,6 +37,8 @@ struct xencons_info {struct xenbus_device *xbdev;struct xencons_interface *intf;unsigned int evtchn; +XENCONS_RING_IDX out_cons; +unsigned int out_cons_same;struct hvc_struct *hvc;int irq;int vtermno;
@@ -138,6 +140,8 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len)XENCONS_RING_IDX cons, prod;int recv =0 ;struct xencons_info *xencons =vtermno_to_xencons (vtermno); +unsigned int eoiflag =0 ; +if (xencons ==NULL )return -EINVAL ; intf = xencons->intf;
@@ -157,7 +161,27 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len)mb ();/* read ring before consuming */ intf->in_cons = cons; -notify_daemon (xencons); +/* +* When to mark interrupt having been spurious: +* - there was no new data to be read, and +* - the backend did not consume some output bytes, and +* - the previous round with no read data didn't see consumed bytes +* (we might have a race with an interrupt being in flight while +* updating xencons->out_cons, so account for that by allowing one +* round without any visible reason) +*/ +if (intf->out_cons != xencons->out_cons) { + xencons->out_cons = intf->out_cons; + xencons->out_cons_same =0 ; + } +if (recv) { +notify_daemon (xencons); + }else if (xencons->out_cons_same++ >1 ) { + eoiflag =XEN_EOI_FLAG_SPURIOUS ; + } + +xen_irq_lateeoi (xencons->irq, eoiflag); +return recv; }
@@ -386,7 +410,7 @@ static int xencons_connect_backend(struct xenbus_device *dev,if (ret)return ret; info->evtchn = evtchn; - irq =bind_evtchn_to_irq (evtchn); + irq =bind_interdomain_evtchn_to_irq_lateeoi (dev->otherend_id, evtchn);if (irq <0 )return irq; info->irq = irq;
@@ -550,7 +574,7 @@ static int __init xen_hvc_init(void)return r; info =vtermno_to_xencons (HVC_COOKIE ); - info->irq =bind_evtchn_to_irq (info->evtchn); + info->irq =bind_evtchn_to_irq_lateeoi (info->evtchn); }if (info->irq <0 ) info->irq =0 ;/* NO_IRQ */
drivers/usb/core/quirks.c +3 -0
@@ -435,6 +435,9 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x1532, 0x0116), .driver_info = USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL }, + /* Lenovo USB-C to Ethernet Adapter RTL8153-04 */ + { USB_DEVICE(0x17ef, 0x720c), .driver_info = USB_QUIRK_NO_LPM }, + /* Lenovo Powered USB-C Travel Hub (4X90S92381, RTL8153 GigE) */ { USB_DEVICE(0x17ef, 0x721e), .driver_info = USB_QUIRK_NO_LPM },
drivers/usb/gadget/composite.c +3 -3
@@ -1649,14 +1649,14 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)u8 endp;if (w_length >USB_COMP_EP0_BUFSIZ ) { -if (ctrl->bRequestType ==USB_DIR_OUT ) { - goto done; - }else { +if (ctrl->bRequestType &USB_DIR_IN ) {/* Cast away the const, we are going to overwrite on purpose. */ __le16 *temp = (__le16 *)&ctrl->wLength; *temp =cpu_to_le16 (USB_COMP_EP0_BUFSIZ ); w_length =USB_COMP_EP0_BUFSIZ ; + }else { + goto done; } }
drivers/usb/gadget/legacy/dbgp.c +3 -3
@@ -346,14 +346,14 @@ static int dbgp_setup(struct usb_gadget *gadget,u16 len =0 ;if (length >DBGP_REQ_LEN ) { -if (ctrl->bRequestType ==USB_DIR_OUT ) { -return err; - }else { +if (ctrl->bRequestType &USB_DIR_IN ) {/* Cast away the const, we are going to overwrite on purpose. */ __le16 *temp = (__le16 *)&ctrl->wLength; *temp =cpu_to_le16 (DBGP_REQ_LEN ); length =DBGP_REQ_LEN ; + }else { +return err; } }
drivers/usb/gadget/legacy/inode.c +3 -3
@@ -1336,14 +1336,14 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)u16 w_length =le16_to_cpu (ctrl->wLength);if (w_length >RBUF_SIZE ) { -if (ctrl->bRequestType ==USB_DIR_OUT ) { -return value; - }else { +if (ctrl->bRequestType &USB_DIR_IN ) {/* Cast away the const, we are going to overwrite on purpose. */ __le16 *temp = (__le16 *)&ctrl->wLength; *temp =cpu_to_le16 (RBUF_SIZE ); w_length =RBUF_SIZE ; + }else { +return value; } }
drivers/usb/host/xhci-pci.c +5 -1
@@ -65,6 +65,8 @@#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_4 0x161e#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_5 0x15d6#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_6 0x15d7 +#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_7 0x161c +#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_8 0x161f#define PCI_DEVICE_ID_ASMEDIA_1042_XHCI 0x1042#define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142
@@ -303,7 +305,9 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) pdev->device ==PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_3 || pdev->device ==PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_4 || pdev->device ==PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_5 || - pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_6)) + pdev->device ==PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_6 || + pdev->device ==PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_7 || + pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_8)) xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW;if (xhci->quirks &XHCI_RESET_ON_RESUME )
drivers/usb/serial/cp210x.c +4 -2
@@ -1552,6 +1552,8 @@ static int cp2105_gpioconf_init(struct usb_serial *serial)/* 2 banks of GPIO - One for the pins taken from each serial port */ if (intf_num ==0 ) { + priv->gc.ngpio =2 ; +if (mode.eci ==CP210X_PIN_MODE_MODEM ) {/* mark all GPIOs of this interface as reserved */ priv->gpio_altfunc =0xff ;
@@ -1562,8 +1564,9 @@ static int cp2105_gpioconf_init(struct usb_serial *serial) priv->gpio_pushpull = (u8)((le16_to_cpu (config.gpio_mode) &CP210X_ECI_GPIO_MODE_MASK ) >>CP210X_ECI_GPIO_MODE_OFFSET ); - priv->gc.ngpio =2 ; }else if (intf_num ==1 ) { + priv->gc.ngpio =3 ; +if (mode.sci ==CP210X_PIN_MODE_MODEM ) {/* mark all GPIOs of this interface as reserved */ priv->gpio_altfunc =0xff ;
@@ -1574,7 +1577,6 @@ static int cp2105_gpioconf_init(struct usb_serial *serial) priv->gpio_pushpull = (u8)((le16_to_cpu (config.gpio_mode) &CP210X_SCI_GPIO_MODE_MASK ) >>CP210X_SCI_GPIO_MODE_OFFSET ); - priv->gc.ngpio =3 ; }else {return -ENODEV ; }
drivers/usb/serial/option.c +8 -0
@@ -1219,6 +1219,14 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(2) | RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff), /* Telit LN920 (ECM) */ .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1070, 0xff), /* Telit FN990 (rmnet) */ + .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1071, 0xff), /* Telit FN990 (MBIM) */ + .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1072, 0xff), /* Telit FN990 (RNDIS) */ + .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff), /* Telit FN990 (ECM) */ + .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
drivers/virtio/virtio_ring.c +1 -1
@@ -263,7 +263,7 @@ size_t virtio_max_dma_size(struct virtio_device *vdev)size_t max_segment_size =SIZE_MAX ;if (vring_use_dma_api (vdev)) - max_segment_size =dma_max_mapping_size (&vdev->dev); + max_segment_size =dma_max_mapping_size (vdev->dev.parent);return max_segment_size; }
fs/fuse/dir.c +1 -1
@@ -1032,7 +1032,7 @@ int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,if (!parent)return -ENOENT ; -inode_lock (parent); +inode_lock_nested (parent,I_MUTEX_PARENT );if (!S_ISDIR (parent->i_mode)) goto unlock;
fs/nfsd/nfs4state.c +7 -2
@@ -1041,6 +1041,11 @@ hash_delegation_locked(struct nfs4_delegation *dp, struct nfs4_file *fp)return 0 ; } +static bool delegation_hashed (struct nfs4_delegation *dp) +{ +return !(list_empty (&dp->dl_perfile)); +} +static bool unhash_delegation_locked (struct nfs4_delegation *dp) {
@@ -1048,7 +1053,7 @@ unhash_delegation_locked(struct nfs4_delegation *dp)lockdep_assert_held (&state_lock); -if (list_empty (&dp->dl_perfile)) +if (!delegation_hashed (dp))return false; dp->dl_stid.sc_type =NFS4_CLOSED_DELEG_STID ;
@@ -4406,7 +4411,7 @@ static void nfsd4_cb_recall_prepare(struct nfsd4_callback *cb)* queued for a lease break. Don't queue it again. */ spin_lock (&state_lock); -if (dp->dl_time ==0 ) { +if (delegation_hashed (dp) && dp->dl_time ==0 ) { dp->dl_time =get_seconds ();list_add_tail (&dp->dl_recall_lru, &nn->del_recall_lru); }
fs/overlayfs/dir.c +1 -2
@@ -113,8 +113,7 @@ int ovl_cleanup_and_whiteout(struct dentry *workdir, struct inode *dir, goto out; } -static int ovl_mkdir_real (struct inode *dir,struct dentry **newdentry, -umode_t mode) +int ovl_mkdir_real (struct inode *dir,struct dentry **newdentry,umode_t mode) {int err;struct dentry *d, *dentry = *newdentry;
fs/overlayfs/overlayfs.h +1 -0
@@ -409,6 +409,7 @@ struct ovl_cattr {#define OVL_CATTR (m) (&(struct ovl_cattr) { .mode = (m) }) +int ovl_mkdir_real (struct inode *dir,struct dentry **newdentry,umode_t mode);struct dentry *ovl_create_real (struct inode *dir,struct dentry *newdentry,struct ovl_cattr *attr);int ovl_cleanup (struct inode *dir,struct dentry *dentry);
fs/overlayfs/super.c +8 -4
@@ -650,10 +650,14 @@ static struct dentry *ovl_workdir_create(struct ovl_fs *ofs, goto retry; } - work =ovl_create_real (dir, work,OVL_CATTR (attr.ia_mode)); - err =PTR_ERR (work); -if (IS_ERR (work)) - goto out_err; + err =ovl_mkdir_real (dir, &work, attr.ia_mode); +if (err) + goto out_dput; + +/* Weird filesystem returning with hashed negative (kernfs)? */ + err = -EINVAL ; +if (d_really_is_negative (work)) + goto out_dput;/* * Try to remove POSIX ACL xattrs from workdir. We are good if:
include/net/tc_act/tc_tunnel_key.h +5 -2
@@ -52,7 +52,10 @@ static inline struct ip_tunnel_info *tcf_tunnel_info(const struct tc_action *a) {#ifdef CONFIG_NET_CLS_ACT struct tcf_tunnel_key *t =to_tunnel_key (a); -struct tcf_tunnel_key_params *params =rtnl_dereference (t->params); +struct tcf_tunnel_key_params *params; + + params =rcu_dereference_protected (t->params, +lockdep_is_held (&a->tcfa_lock));return ¶ms->tcft_enc_metadata->u.tun_info;#else
@@ -69,7 +72,7 @@ tcf_tunnel_info_copy(const struct tc_action *a)if (tun) {size_t tun_size =sizeof (*tun) + tun->options_len;struct ip_tunnel_info *tun_copy =kmemdup (tun, tun_size, -GFP_KERNEL ); +GFP_ATOMIC );return tun_copy; }
kernel/audit.c +10 -11
@@ -712,7 +712,7 @@ static int kauditd_send_queue(struct sock *sk, u32 portid, {int rc =0 ;struct sk_buff *skb; -static unsigned int failed =0 ; +unsigned int failed =0 ;/* NOTE: kauditd_thread takes care of all our locking, we just use * the netlink info passed to us (e.g. sk and portid) */
@@ -729,32 +729,30 @@ static int kauditd_send_queue(struct sock *sk, u32 portid,continue ; } +retry:/* grab an extra skb reference in case of error */ skb_get (skb); rc =netlink_unicast (sk, skb, portid,0 );if (rc <0 ) { -/* fatal failure for our queue flush attempt? */ +/* send failed - try a few times unless fatal error */ if (++failed >= retry_limit || rc == -ECONNREFUSED || rc == -EPERM ) { -/* yes - error processing for the queue */ sk =NULL ;if (err_hook) (*err_hook)(skb); -if (!skb_hook) - goto out; -/* keep processing with the skb_hook */ +if (rc == -EAGAIN ) + rc =0 ; +/* continue to drain the queue */ continue ; }else -/* no - requeue to preserve ordering */ -skb_queue_head (queue, skb); + goto retry; }else { -/* it worked - drop the extra reference and continue */ +/* skb sent - drop the extra reference and continue */ consume_skb (skb); failed =0 ; } } -out:return (rc >=0 ?0 : rc); }
@@ -1557,7 +1555,8 @@ static int __net_init audit_net_init(struct net *net)audit_panic ("cannot initialize netlink socket in namespace" );return -ENOMEM ; } - aunet->sk->sk_sndtimeo =MAX_SCHEDULE_TIMEOUT ; +/* limit the timeout in case auditd is blocked/stopped */ + aunet->sk->sk_sndtimeo =HZ /10 ;return 0 ; }
kernel/rcu/tree.c +5 -5
@@ -1602,7 +1602,7 @@ static void rcu_gp_fqs(bool first_time)struct rcu_node *rnp =rcu_get_root ();WRITE_ONCE (rcu_state.gp_activity, jiffies); - rcu_state.n_force_qs++; +WRITE_ONCE (rcu_state.n_force_qs, rcu_state.n_force_qs +1 );if (first_time) {/* Collect dyntick-idle snapshots. */ force_qs_rnp (dyntick_save_progress_counter);
@@ -2207,7 +2207,7 @@ static void rcu_do_batch(struct rcu_data *rdp)/* Reset ->qlen_last_fqs_check trigger if enough CBs have drained. */ if (count ==0 && rdp->qlen_last_fqs_check !=0 ) { rdp->qlen_last_fqs_check =0 ; - rdp->n_force_qs_snap = rcu_state.n_force_qs; + rdp->n_force_qs_snap =READ_ONCE (rcu_state.n_force_qs); }else if (count < rdp->qlen_last_fqs_check - qhimark) rdp->qlen_last_fqs_check = count;
@@ -2535,10 +2535,10 @@ static void __call_rcu_core(struct rcu_data *rdp, struct rcu_head *head, }else {/* Give the grace period a kick. */ rdp->blimit =DEFAULT_MAX_RCU_BLIMIT ; -if (rcu_state.n_force_qs == rdp->n_force_qs_snap && +if (READ_ONCE (rcu_state.n_force_qs) == rdp->n_force_qs_snap &&rcu_segcblist_first_pend_cb (&rdp->cblist) != head)rcu_force_quiescent_state (); - rdp->n_force_qs_snap = rcu_state.n_force_qs; + rdp->n_force_qs_snap =READ_ONCE (rcu_state.n_force_qs); rdp->qlen_last_fqs_check =rcu_segcblist_n_cbs (&rdp->cblist); } }
@@ -3029,7 +3029,7 @@ int rcutree_prepare_cpu(unsigned int cpu)/* Set up local state, ensuring consistent view of global state. */ raw_spin_lock_irqsave_rcu_node (rnp, flags); rdp->qlen_last_fqs_check =0 ; - rdp->n_force_qs_snap = rcu_state.n_force_qs; + rdp->n_force_qs_snap =READ_ONCE (rcu_state.n_force_qs); rdp->blimit = blimit;if (rcu_segcblist_empty (&rdp->cblist) &&/* No early-boot CBs? */ !rcu_segcblist_is_offloaded (&rdp->cblist))
kernel/time/timekeeping.c +1 -2
@@ -1236,8 +1236,7 @@ int do_settimeofday64(const struct timespec64 *ts)timekeeping_forward_now (tk); xt =tk_xtime (tk); - ts_delta.tv_sec = ts->tv_sec - xt.tv_sec; - ts_delta.tv_nsec = ts->tv_nsec - xt.tv_nsec; + ts_delta =timespec64_sub (*ts, xt);if (timespec64_compare (&tk->wall_to_monotonic, &ts_delta) >0 ) { ret = -EINVAL ;
net/core/skbuff.c +1 -1
@@ -768,7 +768,7 @@ void skb_dump(const char *level, const struct sk_buff *skb, bool full_pkt) ntohs(skb->protocol), skb->pkt_type, skb->skb_iif);if (dev) -printk ("%sdev name=%s feat=0x%pNF\n" , +printk ("%sdev name=%s feat=%pNF\n" , level, dev->name, &dev->features);if (sk) printk("%ssk family=%hu type=%u proto=%u\n",
net/ipv4/inet_diag.c +7 -12
@@ -200,6 +200,7 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, r->idiag_state = sk->sk_state; r->idiag_timer =0 ; r->idiag_retrans =0 ; + r->idiag_expires =0 ;if (inet_diag_msg_attrs_fill (sk, skb, r, ext, user_ns, net_admin)) goto errout;
@@ -240,20 +241,17 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, r->idiag_timer =1 ; r->idiag_retrans = icsk->icsk_retransmits; r->idiag_expires = -jiffies_to_msecs (icsk->icsk_timeout - jiffies); +jiffies_delta_to_msecs (icsk->icsk_timeout - jiffies); }else if (icsk->icsk_pending ==ICSK_TIME_PROBE0 ) { r->idiag_timer =4 ; r->idiag_retrans = icsk->icsk_probes_out; r->idiag_expires = -jiffies_to_msecs (icsk->icsk_timeout - jiffies); +jiffies_delta_to_msecs (icsk->icsk_timeout - jiffies); }else if (timer_pending (&sk->sk_timer)) { r->idiag_timer =2 ; r->idiag_retrans = icsk->icsk_probes_out; r->idiag_expires = -jiffies_to_msecs (sk->sk_timer.expires - jiffies); - }else { - r->idiag_timer =0 ; - r->idiag_expires =0 ; +jiffies_delta_to_msecs (sk->sk_timer.expires - jiffies); }if ((ext & (1 << (INET_DIAG_INFO -1 ))) && handler->idiag_info_size) {
@@ -338,16 +336,13 @@ static int inet_twsk_diag_fill(struct sock *sk, r =nlmsg_data (nlh);BUG_ON (tw->tw_state !=TCP_TIME_WAIT ); - tmo = tw->tw_timer.expires - jiffies; -if (tmo <0 ) - tmo =0 ; -inet_diag_msg_common_fill (r, sk); r->idiag_retrans =0 ; r->idiag_state = tw->tw_substate; r->idiag_timer =3 ; - r->idiag_expires =jiffies_to_msecs (tmo); + tmo = tw->tw_timer.expires - jiffies; + r->idiag_expires =jiffies_delta_to_msecs (tmo); r->idiag_rqueue =0 ; r->idiag_wqueue =0 ; r->idiag_uid =0 ;
@@ -381,7 +376,7 @@ static int inet_req_diag_fill(struct sock *sk, struct sk_buff *skb, offsetof(struct sock, sk_cookie)); tmo =inet_reqsk (sk)->rsk_timer.expires - jiffies; - r->idiag_expires = (tmo >=0 ) ?jiffies_to_msecs (tmo) :0 ; + r->idiag_expires =jiffies_delta_to_msecs (tmo); r->idiag_rqueue =0 ; r->idiag_wqueue =0 ; r->idiag_uid =0 ;
net/ipv6/sit.c +0 -1
@@ -1876,7 +1876,6 @@ static int __net_init sit_init_net(struct net *net)return 0 ; err_reg_dev: -ipip6_dev_free (sitn->fb_tunnel_dev);free_netdev (sitn->fb_tunnel_dev); err_alloc_dev:return err;
net/mac80211/agg-rx.c +5 -3
@@ -9,7 +9,7 @@* Copyright 2007, Michael Wu <[email protected]> * Copyright 2007-2010, Intel Corporation * Copyright(c) 2015-2017 Intel Deutschland GmbH -* Copyright (C) 2018 Intel Corporation +* Copyright (C) 2018-2021 Intel Corporation */ /**
@@ -191,7 +191,8 @@ static void ieee80211_add_addbaext(struct ieee80211_sub_if_data *sdata, sband =ieee80211_get_sband (sdata);if (!sband)return ; - he_cap =ieee80211_get_he_iftype_cap (sband, sdata->vif.type); + he_cap =ieee80211_get_he_iftype_cap (sband, +ieee80211_vif_type_p2p (&sdata->vif));if (!he_cap)return ;
@@ -292,7 +293,8 @@ void ___ieee80211_start_rx_ba_session(struct sta_info *sta, goto end; } -if (!sta->sta.ht_cap.ht_supported) { +if (!sta->sta.ht_cap.ht_supported && + sta->sdata->vif.bss_conf.chandef.chan->band !=NL80211_BAND_6GHZ ) {ht_dbg (sta->sdata,"STA %pM erroneously requests BA session on tid %d w/o QoS\n" , sta->sta.addr, tid);
net/mac80211/agg-tx.c +49 -31
150 lines not on this page · raw message
net/mac80211/driver-ops.h +4 -1
@@ -1202,8 +1202,11 @@ static inline void drv_wake_tx_queue(struct ieee80211_local *local, {struct ieee80211_sub_if_data *sdata =vif_to_sdata (txq->txq.vif); -if (local->in_reconfig) +/* In reconfig don't transmit now, but mark for waking later */ +if (local->in_reconfig) { +set_bit (IEEE80211_TXQ_STOP_NETIF_TX , &txq->flags);return ; + }if (!check_sdata_in_driver (sdata))return ;
net/mac80211/mlme.c +10 -3
@@ -2418,11 +2418,18 @@ static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, u16 tx_time) {struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; -u16 tid =ieee80211_get_tid (hdr); -int ac =ieee80211_ac_from_tid (tid); -struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac]; +u16 tid; +int ac; +struct ieee80211_sta_tx_tspec *tx_tspec;unsigned long now = jiffies; +if (!ieee80211_is_data_qos (hdr->frame_control)) +return ; + + tid =ieee80211_get_tid (hdr); + ac =ieee80211_ac_from_tid (tid); + tx_tspec = &ifmgd->tx_tspec[ac]; +if (likely (!tx_tspec->admitted_time))return ;
net/mac80211/sta_info.h +1 -0
@@ -180,6 +180,7 @@ struct tid_ampdu_tx {u8 stop_initiator;bool tx_stop;u16 buf_size; +u16 ssn;u16 failed_bar_ssn;bool bar_pending;
net/mac80211/util.c +2 -0
@@ -1227,6 +1227,8 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, elems->max_idle_period_ie = (void *)pos;break ;case WLAN_EID_EXTENSION : +if (!elen) +break ;if (pos[0 ] ==WLAN_EID_EXT_HE_MU_EDCA && elen >= (sizeof (*elems->mu_edca_param_set) +1 )) { elems->mu_edca_param_set = (void *)&pos[1 ];
net/packet/af_packet.c +3 -2
@@ -4453,9 +4453,10 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, } out_free_pg_vec: -bitmap_free (rx_owner_map); -if (pg_vec) +if (pg_vec) { +bitmap_free (rx_owner_map);free_pg_vec (pg_vec, order, req->tp_block_nr); + } out:return err; }
net/rds/connection.c +1 -0
@@ -253,6 +253,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,* should end up here, but if it * does, reset/destroy the connection. */ +kfree (conn->c_path);kmem_cache_free (rds_conn_slab, conn); conn =ERR_PTR (-EOPNOTSUPP ); goto out;
net/sched/act_sample.c +0 -2
@@ -265,14 +265,12 @@ tcf_sample_get_group(const struct tc_action *a,struct tcf_sample *s =to_sample (a);struct psample_group *group; -spin_lock_bh (&s->tcf_lock); group =rcu_dereference_protected (s->psample_group,lockdep_is_held (&s->tcf_lock));if (group) {psample_group_take (group); *destructor = tcf_psample_group_put; } -spin_unlock_bh (&s->tcf_lock);return group; }
net/sched/cls_api.c +12 -6
@@ -3436,7 +3436,7 @@ static void tcf_sample_get_group(struct flow_action_entry *entry,int tc_setup_flow_action (struct flow_action *flow_action,const struct tcf_exts *exts,bool rtnl_held) { -const struct tc_action *act; +struct tc_action *act;int i, j, k, err =0 ;if (!exts)
@@ -3450,6 +3450,7 @@ int tc_setup_flow_action(struct flow_action *flow_action,struct flow_action_entry *entry; entry = &flow_action->entries[j]; +spin_lock_bh (&act->tcfa_lock);if (is_tcf_gact_ok (act)) { entry->id =FLOW_ACTION_ACCEPT ; }else if (is_tcf_gact_shot (act)) {
@@ -3490,13 +3491,13 @@ int tc_setup_flow_action(struct flow_action *flow_action,break ;default : err = -EOPNOTSUPP ; - goto err_out; + goto err_out_locked; } }else if (is_tcf_tunnel_set (act)) { entry->id =FLOW_ACTION_TUNNEL_ENCAP ; err =tcf_tunnel_encap_get_tunnel (entry, act);if (err) - goto err_out; + goto err_out_locked; }else if (is_tcf_tunnel_release (act)) { entry->id =FLOW_ACTION_TUNNEL_DECAP ; }else if (is_tcf_pedit (act)) {
@@ -3510,7 +3511,7 @@ int tc_setup_flow_action(struct flow_action *flow_action,break ;default : err = -EOPNOTSUPP ; - goto err_out; + goto err_out_locked; } entry->mangle.htype =tcf_pedit_htype (act, k); entry->mangle.mask =tcf_pedit_mask (act, k);
@@ -3561,15 +3562,17 @@ int tc_setup_flow_action(struct flow_action *flow_action, entry->mpls_mangle.ttl =tcf_mpls_ttl (act);break ;default : - goto err_out; + err = -EOPNOTSUPP ; + goto err_out_locked; } }else if (is_tcf_skbedit_ptype (act)) { entry->id =FLOW_ACTION_PTYPE ; entry->ptype =tcf_skbedit_ptype (act); }else { err = -EOPNOTSUPP ; - goto err_out; + goto err_out_locked; } +spin_unlock_bh (&act->tcfa_lock);if (!is_tcf_pedit (act)) j++;
@@ -3583,6 +3586,9 @@ int tc_setup_flow_action(struct flow_action *flow_action,tc_cleanup_flow_action (flow_action);return err; +err_out_locked: +spin_unlock_bh (&act->tcfa_lock); + goto err_out; }EXPORT_SYMBOL (tc_setup_flow_action);
net/sched/sch_cake.c +1 -5
@@ -2724,7 +2724,7 @@ static int cake_init(struct Qdisc *sch, struct nlattr *opt, q->tins =kvcalloc (CAKE_MAX_TINS ,sizeof (struct cake_tin_data ),GFP_KERNEL );if (!q->tins) - goto nomem; +return -ENOMEM ;for (i =0 ; i <CAKE_MAX_TINS ; i++) {struct cake_tin_data *b = q->tins + i;
@@ -2754,10 +2754,6 @@ static int cake_init(struct Qdisc *sch, struct nlattr *opt, q->min_netlen = ~0 ; q->min_adjlen = ~0 ;return 0 ; - -nomem: -cake_destroy (sch); -return -ENOMEM ; }static int cake_dump (struct Qdisc *sch,struct sk_buff *skb)
net/smc/af_smc.c +3 -1
@@ -183,7 +183,9 @@ static int smc_release(struct socket *sock)/* cleanup for a dangling non-blocking connect */ if (smc->connect_nonblock && sk->sk_state ==SMC_INIT )tcp_abort (smc->clcsock->sk,ECONNABORTED ); -flush_work (&smc->connect_work); + +if (cancel_work_sync (&smc->connect_work)) +sock_put (&smc->sk);/* sock_hold in smc_connect for passive closing */ if (sk->sk_state ==SMC_LISTEN )/* smc_close_non_accepted() is called and acquires
scripts/recordmcount.pl +1 -1
@@ -252,7 +252,7 @@ if ($arch eq "x86_64") { } elsif ($arch eq "s390" && $bits == 64) { if ($cc =~ /-DCC_USING_HOTPATCH/) { - $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*brcl\\s*0,[0-9a-f]+ <([^\+]*)>\$"; + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*(bcrl\\s*0,|jgnop\\s*)[0-9a-f]+ <([^\+]*)>\$"; $mcount_adjust = 0; } else { $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_390_(PC|PLT)32DBL\\s+_mcount\\+0x2\$";
tools/testing/selftests/kvm/kvm_create_max_vcpus.c +30 -0
@@ -12,6 +12,7 @@#include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/resource.h> #include "test_util.h"
@@ -43,10 +44,39 @@ int main(int argc, char *argv[]) {int kvm_max_vcpu_id =kvm_check_cap (KVM_CAP_MAX_VCPU_ID );int kvm_max_vcpus =kvm_check_cap (KVM_CAP_MAX_VCPUS ); +/* +* Number of file descriptors reqired, KVM_CAP_MAX_VCPUS for vCPU fds + +* an arbitrary number for everything else. +*/ +int nr_fds_wanted = kvm_max_vcpus +100 ; +struct rlimit rl;printf ("KVM_CAP_MAX_VCPU_ID: %d\n" , kvm_max_vcpu_id);printf ("KVM_CAP_MAX_VCPUS: %d\n" , kvm_max_vcpus); +/* +* Check that we're allowed to open nr_fds_wanted file descriptors and +* try raising the limits if needed. +*/ +TEST_ASSERT (!getrlimit (RLIMIT_NOFILE , &rl),"getrlimit() failed!" ); + +if (rl.rlim_cur < nr_fds_wanted) { + rl.rlim_cur = nr_fds_wanted; +if (rl.rlim_max < nr_fds_wanted) { +int old_rlim_max = rl.rlim_max; + rl.rlim_max = nr_fds_wanted; + +int r =setrlimit (RLIMIT_NOFILE , &rl); +if (r <0 ) { +printf ("RLIMIT_NOFILE hard limit is too low (%d, wanted %d)\n" , + old_rlim_max, nr_fds_wanted); +exit (KSFT_SKIP ); + } + }else { +TEST_ASSERT (!setrlimit (RLIMIT_NOFILE , &rl),"setrlimit() failed!" ); + } + } +/* * Upstream KVM prior to 4.8 does not support KVM_CAP_MAX_VCPU_ID. * Userspace is supposed to use KVM_CAP_MAX_VCPUS as the maximum ID
tools/testing/selftests/net/fcnal-test.sh +16 -7
@@ -1491,8 +1491,9 @@ ipv4_addr_bind_vrf() for a in ${NSA_IP} ${VRF_IP} do log_start + show_hint "Socket not bound to VRF, but address is in VRF" run_cmd nettest -s -R -P icmp -l ${a} -b - log_test_addr ${a} $? 0 "Raw socket bind to local address" + log_test_addr ${a} $? 1 "Raw socket bind to local address" log_start run_cmd nettest -s -R -P icmp -l ${a} -d ${NSA_DEV} -b
@@ -1884,7 +1885,7 @@ ipv6_ping_vrf() log_start show_hint "Fails since VRF device does not support linklocal or multicast" run_cmd ${ping6} -c1 -w1 ${a} - log_test_addr ${a} $? 2 "ping out, VRF bind" + log_test_addr ${a} $? 1 "ping out, VRF bind" done for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
@@ -2890,11 +2891,14 @@ ipv6_addr_bind_novrf() run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b log_test_addr ${a} $? 0 "TCP socket bind to local address after device bind" + # Sadly, the kernel allows binding a socket to a device and then + # binding to an address not on the device. So this test passes + # when it really should not a=${NSA_LO_IP6} log_start - show_hint "Should fail with 'Cannot assign requested address'" - run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b - log_test_addr ${a} $? 1 "TCP socket bind to out of scope local address" + show_hint "Tecnically should fail since address is not on device but kernel allows" + run_cmd nettest -6 -s -l ${a} -I ${NSA_DEV} -t1 -b + log_test_addr ${a} $? 0 "TCP socket bind to out of scope local address" } ipv6_addr_bind_vrf()
@@ -2935,10 +2939,15 @@ ipv6_addr_bind_vrf() run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b log_test_addr ${a} $? 0 "TCP socket bind to local address with device bind" + # Sadly, the kernel allows binding a socket to a device and then + # binding to an address not on the device. The only restriction + # is that the address is valid in the L3 domain. So this test + # passes when it really should not a=${VRF_IP6} log_start - run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b - log_test_addr ${a} $? 1 "TCP socket bind to VRF address with device bind" + show_hint "Tecnically should fail since address is not on device but kernel allows" + run_cmd nettest -6 -s -l ${a} -I ${NSA_DEV} -t1 -b + log_test_addr ${a} $? 0 "TCP socket bind to VRF address with device bind" a=${NSA_LO_IP6} log_start
tools/testing/selftests/net/forwarding/forwarding.config.sample +2 -0
@@ -13,6 +13,8 @@ NETIFS[p5]=veth4 NETIFS[p6]=veth5 NETIFS[p7]=veth6 NETIFS[p8]=veth7 +NETIFS[p9]=veth8 +NETIFS[p10]=veth9 ############################################################################## # Defines