Linux 6.1.108
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.1.108 kernel.
All users of the 6.1 kernel series must upgrade.
The updated 6.1.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.1.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/loongarch/include/asm/dma-direct.h | 11 drivers/ata/libata-core.c | 3 drivers/dma/dw/core.c | 89 ++++++- drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 3 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c | 9 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 21 - drivers/iommu/io-pgtable-arm-v7s.c | 3 drivers/iommu/io-pgtable-arm.c | 3 drivers/iommu/io-pgtable-dart.c | 3 drivers/mmc/core/core.c | 3 drivers/mmc/host/dw_mmc.c | 3 drivers/mmc/host/mtk-sd.c | 14 - drivers/mmc/host/sdhci-msm.c | 3 drivers/mmc/host/sdhci-pci-o2micro.c | 3 drivers/mmc/host/sdhci-tegra.c | 8 drivers/mmc/host/sdhci.c | 9 drivers/net/bonding/bond_main.c | 36 ++ drivers/net/ethernet/intel/igc/igc_tsn.c | 9 drivers/net/ethernet/microsoft/mana/hw_channel.c | 62 ++-- drivers/net/gtp.c | 2 drivers/net/wireless/intel/iwlwifi/fw/acpi.c | 13 - drivers/net/wireless/marvell/mwifiex/cfg80211.c | 32 ++ drivers/net/wireless/silabs/wfx/sta.c | 5 drivers/nfc/pn533/pn533.c | 5 drivers/phy/xilinx/phy-zynqmp.c | 152 +++++++----- drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c | 55 ++-- drivers/pinctrl/pinctrl-rockchip.c | 2 drivers/pinctrl/pinctrl-single.c | 2 drivers/scsi/aacraid/comminit.c | 2 drivers/soc/qcom/cmd-db.c | 2 drivers/soundwire/stream.c | 8 drivers/thermal/thermal_of.c | 17 - drivers/usb/cdns3/cdnsp-gadget.h | 3 drivers/usb/cdns3/cdnsp-ring.c | 30 ++ drivers/usb/class/cdc-acm.c | 3 drivers/usb/core/sysfs.c | 1 drivers/usb/dwc3/core.c | 8 drivers/usb/dwc3/dwc3-omap.c | 4 drivers/usb/dwc3/dwc3-st.c | 16 - drivers/usb/serial/option.c | 5 drivers/usb/typec/tcpm/tcpm.c | 14 - drivers/video/fbdev/offb.c | 1 fs/btrfs/compression.c | 2 fs/btrfs/qgroup.c | 2 fs/smb/client/smb2pdu.c | 2 include/linux/of.h | 15 + include/net/busy_poll.h | 2 include/net/netfilter/nf_tables_ipv4.h | 10 include/net/netfilter/nf_tables_ipv6.h | 5 mm/truncate.c | 4 net/bluetooth/hci_core.c | 10 net/core/net-sysfs.c | 2 net/ethtool/ioctl.c | 3 net/mptcp/pm.c | 32 +- net/mptcp/pm_netlink.c | 110 ++++---- net/mptcp/protocol.c | 7 net/mptcp/protocol.h | 7 net/mptcp/subflow.c | 8 net/sctp/sm_statefuns.c | 22 + security/apparmor/policy_unpack_test.c | 6 sound/soc/amd/acp/acp-legacy-mach.c | 2 sound/soc/sof/amd/acp.c | 19 + sound/soc/sof/amd/acp.h | 7 tools/testing/selftests/net/forwarding/local_termination.sh | 4 tools/testing/selftests/net/forwarding/no_forwarding.sh | 3 66 files changed, 649 insertions(+), 314 deletions(-)
Aleksandr Mishin (1):
nfc: pn533: Add poll mod list filling check
Alex Deucher (2):
drm/amdgpu: align pp_power_profile_mode with kernel docs drm/amdgpu/swsmu: always force a state reprogram on init
Alexander Sverdlin (1):
wifi: wfx: repair open network AP mode
Anjaneyulu (1):
wifi: iwlwifi: fw: fix wgds rev 3 exact size
Ben Hutchings (1):
scsi: aacraid: Fix double-free on probe failure
ChanWoo Lee (1):
mmc: Avoid open coding by using mmc_op_tuning()
Cong Wang (1):
gtp: fix a potential NULL pointer dereference
David Howells (1):
mm: Fix missing folio invalidation calls during truncation
Eric Dumazet (1):
net: busy-poll: use ktime_get_ns() instead of local_clock()
Faizal Rahim (2):
igc: Fix reset adapter logics when tx mode change
igc: Fix qbv tx latency by setting gtxoffset
Filipe Manana (1):
btrfs: fix extent map use-after-free when adding pages to compressed bio
Geliang Tang (1):
mptcp: unify pm get_local_id interfaces
Greg Kroah-Hartman (3):
usb: typec: fix up incorrectly backported "usb: typec: tcpm: unregister existing source caps before re-registration"
fbdev: offb: fix up missing cleanup.h
Linux 6.1.108
Guenter Roeck (1):
apparmor: fix policy_unpack_test on big endian systems
Haiyang Zhang (1):
net: mana: Fix race of mana_hwc_post_rx_wqe and new hwc response
Huang-Huang Bao (1):
pinctrl: rockchip: correct RK3328 iomux width flag for GPIO2-B pins
Ian Ray (1):
cdc-acm: Add DISABLE_ECHO quirk for GE HealthCare UI Controller
Jamie Bainbridge (1):
ethtool: check device is present when getting link settings
Jason Gunthorpe (1):
iommu: Do not return 0 from map_pages if it doesn't do anything
Jesse Zhang (1):
drm/amdgpu: Using uninitialized value *size when calling amdgpu_vce_cs_reloc
Jianbo Liu (1):
bonding: implement xdo_dev_state_free and call it after deletion
Jonathan Cameron (2):
of: Add cleanup.h based auto release via __free(device_node) markings
of: Introduce for_each_*_child_of_node_scoped() to automate of_node_put() handling
Josef Bacik (1):
btrfs: run delayed iputs when flushing delalloc
Krzysztof Kozlowski (6):
thermal: of: Fix OF node leak in thermal_of_trips_init() error path
thermal: of: Fix OF node leak in of_thermal_zone_find() error paths
soundwire: stream: fix programming slave ports for non-continous port maps
usb: dwc3: omap: add missing depopulate in probe error path
usb: dwc3: st: fix probed platform device ref count on probe error path
usb: dwc3: st: add missing depopulate in probe error path
Luiz Augusto von Dentz (1):
Bluetooth: hci_core: Fix not handling hibernation actions
Ma Ke (2):
pinctrl: single: fix potential NULL dereference in pcs_get_function() drm/amd/display: avoid using null object of framebuffer
Matthieu Baerts (NGI0) (10):
mptcp: close subflow when receiving TCP+FIN
mptcp: sched: check both backup in retrans
mptcp: pm: skip connecting to already established sf
mptcp: pm: reset MPC endp ID when re-added
mptcp: pm: send ACK on an active subflow
mptcp: pm: do not remove already closed subflows
mptcp: pm: ADD_ADDR 0 is not a new address
mptcp: pm: remove mptcp_pm_remove_subflow()
mptcp: pm: only mark 'subflow' endp as available
mptcp: pm: check add_addr_accept_max before accepting new ADD_ADDR
Mengqi Zhang (1):
mmc: mtk-sd: receive cmd8 data when hs400 tuning fail
Miao Wang (1):
LoongArch: Remove the unused dma-direct.h
Niklas Cassel (1):
ata: libata-core: Fix null pointer dereference on error
Nícolas F. R. A. Prado (1):
pinctrl: mediatek: common-v2: Fix broken bias-disable for PULL_PU_PD_RSEL_TYPE
Ondrej Mosnacek (1):
sctp: fix association labeling in the duplicate COOKIE-ECHO case
Pablo Neira Ayuso (2):
netfilter: nf_tables: restore IP sanity checks for netdev/egress
netfilter: nf_tables_ipv6: consider network offset in netdev/egress validation
Pawel Laszczak (2):
usb: cdnsp: fix incorrect index in cdnsp_get_hw_deq function
usb: cdnsp: fix for Link TRB with TC
Petr Machata (2):
selftests: forwarding: no_forwarding: Down ports on cleanup
selftests: forwarding: local_termination: Down ports on cleanup
Piyush Mehta (3):
phy: xilinx: add runtime PM support
phy: xilinx: phy-zynqmp: dynamic clock support for power-save
phy: xilinx: phy-zynqmp: Fix SGMII linkup failure on resume
Sascha Hauer (1):
wifi: mwifiex: duplicate static structs used in driver instances
Sean Anderson (1):
phy: zynqmp: Enable reference clock correctly
Selvarasu Ganesan (1):
usb: dwc3: core: Prevent USB core invalid event buffer address access
Serge Semin (2):
dmaengine: dw: Add peripheral bus width verification
dmaengine: dw: Add memory bus width verification
Stefan Metzmacher (1):
smb/client: avoid dereferencing rdata=NULL in smb2_new_read_req()
Vijendar Mukunda (1):
ASoC: SOF: amd: Fix for acp init sequence
Volodymyr Babchuk (1):
soc: qcom: cmd-db: Map shared memory as WC, not WB
Yuntao Liu (1):
ASoC: amd: acp: fix module autoloading
ZHANG Yuntian (1):
USB: serial: option: add MeiG Smart SRM825L
Zijun Hu (1):
usb: core: sysfs: Unmerge @usb3_hardware_lpm_attr_group in remove_power_attributes()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 1 -SUBLEVEL = 107 +SUBLEVEL = 108 EXTRAVERSION = NAME = Curry Ramen
arch/loongarch/include/asm/dma-direct.h deleted +0 -11
@@ -1,11 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* -* Copyright (C) 2020-2022 Loongson Technology Corporation Limited -*/ -#ifndef _LOONGARCH_DMA_DIRECT_H -#define _LOONGARCH_DMA_DIRECT_H - -dma_addr_t phys_to_dma (struct device *dev,phys_addr_t paddr); -phys_addr_t dma_to_phys (struct device *dev,dma_addr_t daddr); - -#endif /* _LOONGARCH_DMA_DIRECT_H */
drivers/ata/libata-core.c +3 -0
@@ -5471,6 +5471,9 @@ static void ata_host_release(struct kref *kref)for (i =0 ; i < host->n_ports; i++) {struct ata_port *ap = host->ports[i]; +if (!ap) +continue ; +kfree (ap->pmp_link);kfree (ap->slave_link);kfree (ap);
drivers/dma/dw/core.c +82 -7
131 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +2 -1
@@ -743,7 +743,8 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p,uint32_t created =0 ;uint32_t allocated =0 ;uint32_t tmp, handle =0 ; -uint32_t *size = &tmp; +uint32_t dummy =0xffffffff ; +uint32_t *size = &dummy;unsigned idx;int i, r =0 ;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c +7 -2
@@ -28,6 +28,7 @@#include <drm/drm_blend.h> #include <drm/drm_gem_atomic_helper.h> #include <drm/drm_plane_helper.h> +#include <drm/drm_gem_framebuffer_helper.h> #include <drm/drm_fourcc.h> #include "amdgpu.h"
@@ -848,10 +849,14 @@ static int dm_plane_helper_prepare_fb(struct drm_plane *plane, } afb =to_amdgpu_framebuffer (new_state->fb); - obj = new_state->fb->obj[0 ]; + obj =drm_gem_fb_get_obj (new_state->fb,0 ); +if (!obj) { +DRM_ERROR ("Failed to get obj from framebuffer\n" ); +return -EINVAL ; + } + rbo =gem_to_amdgpu_bo (obj); adev =amdgpu_ttm_adev (rbo->tbo.bdev); - r =amdgpu_bo_reserve (rbo, true);if (r) {dev_err (adev->dev,"fail to reserve bo (%d)\n" , r);
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +11 -10
@@ -1829,8 +1829,9 @@ static int smu_bump_power_profile_mode(struct smu_context *smu, }static int smu_adjust_power_state_dynamic (struct smu_context *smu, -enum amd_dpm_forced_level level, -bool skip_display_settings) +enum amd_dpm_forced_level level, +bool skip_display_settings, +bool force_update) {int ret =0 ;int index =0 ;
@@ -1859,7 +1860,7 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu, } } -if (smu_dpm_ctx->dpm_level != level) { +if (force_update || smu_dpm_ctx->dpm_level != level) { ret =smu_asic_set_performance_level (smu, level);if (ret) {dev_err (smu->adev->dev,"Failed to set performance level!" );
@@ -1870,13 +1871,12 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu, smu_dpm_ctx->dpm_level = level; } -if (smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_MANUAL && - smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM ) { +if (smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM ) { index =fls (smu->workload_mask); index = index >0 && index <=WORKLOAD_POLICY_MAX ? index -1 :0 ; workload[0 ] = smu->workload_setting[index]; -if (smu->power_profile_mode != workload[0 ]) +if (force_update || smu->power_profile_mode != workload[0 ])smu_bump_power_profile_mode (smu, workload,0 ); }
@@ -1897,11 +1897,13 @@ static int smu_handle_task(struct smu_context *smu, ret =smu_pre_display_config_changed (smu);if (ret)return ret; - ret =smu_adjust_power_state_dynamic (smu, level, false); + ret =smu_adjust_power_state_dynamic (smu, level, false, false);break ;case AMD_PP_TASK_COMPLETE_INIT : + ret =smu_adjust_power_state_dynamic (smu, level, true, true); +break ;case AMD_PP_TASK_READJUST_POWER_STATE : - ret =smu_adjust_power_state_dynamic (smu, level, true); + ret =smu_adjust_power_state_dynamic (smu, level, true, false);break ;default :break ;
@@ -1948,8 +1950,7 @@ static int smu_switch_power_profile(void *handle, workload[0 ] = smu->workload_setting[index]; } -if (smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_MANUAL && - smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM ) +if (smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM )smu_bump_power_profile_mode (smu, workload,0 );return 0 ;
drivers/iommu/io-pgtable-arm-v7s.c +1 -2
@@ -552,9 +552,8 @@ static int arm_v7s_map_pages(struct io_pgtable_ops *ops, unsigned long iova, paddr >= (1ULL << data->iop.cfg.oas)))return -ERANGE ; -/* If no access, then nothing to do */ if (!(prot & (IOMMU_READ |IOMMU_WRITE ))) -return 0 ; +return -EINVAL ;while (pgcount--) { ret = __arm_v7s_map(data, iova, paddr, pgsize, prot, 1, data->pgd,
drivers/iommu/io-pgtable-arm.c +1 -2
@@ -480,9 +480,8 @@ static int arm_lpae_map_pages(struct io_pgtable_ops *ops, unsigned long iova,if (WARN_ON (iaext || paddr >> cfg->oas))return -ERANGE ; -/* If no access, then nothing to do */ if (!(iommu_prot & (IOMMU_READ |IOMMU_WRITE ))) -return 0 ; +return -EINVAL ; prot =arm_lpae_prot_to_pte (data, iommu_prot); ret = __arm_lpae_map(data, iova, paddr, pgsize, pgcount, prot, lvl,
drivers/iommu/io-pgtable-dart.c +1 -2
@@ -250,9 +250,8 @@ static int dart_map_pages(struct io_pgtable_ops *ops, unsigned long iova,if (WARN_ON (paddr >> cfg->oas))return -ERANGE ; -/* If no access, then nothing to do */ if (!(iommu_prot & (IOMMU_READ |IOMMU_WRITE ))) -return 0 ; +return -EINVAL ; tbl =dart_get_table (data, iova);
drivers/mmc/core/core.c +1 -2
@@ -142,8 +142,7 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq)int err = cmd->error;/* Flag re-tuning needed on CRC errors */ - if (cmd->opcode != MMC_SEND_TUNING_BLOCK && - cmd->opcode != MMC_SEND_TUNING_BLOCK_HS200 && + if (!mmc_op_tuning(cmd->opcode) && !host->retune_crc_disable && (err == -EILSEQ || (mrq->sbc && mrq->sbc->error == -EILSEQ) || (mrq->data && mrq->data->error == -EILSEQ) ||
drivers/mmc/host/dw_mmc.c +1 -2
@@ -334,8 +334,7 @@ static u32 dw_mci_prep_stop_abort(struct dw_mci *host, struct mmc_command *cmd) cmdr ==MMC_READ_MULTIPLE_BLOCK || cmdr ==MMC_WRITE_BLOCK || cmdr ==MMC_WRITE_MULTIPLE_BLOCK || - cmdr ==MMC_SEND_TUNING_BLOCK || - cmdr ==MMC_SEND_TUNING_BLOCK_HS200 || +mmc_op_tuning (cmdr) || cmdr == MMC_GEN_CMD) { stop->opcode = MMC_STOP_TRANSMISSION; stop->arg =0 ;
drivers/mmc/host/mtk-sd.c +5 -9
@@ -1206,10 +1206,8 @@ static bool msdc_cmd_done(struct msdc_host *host, int events, }if (!sbc_error && !(events &MSDC_INT_CMDRDY )) { -if (events &MSDC_INT_CMDTMO || - (cmd->opcode !=MMC_SEND_TUNING_BLOCK && - cmd->opcode !=MMC_SEND_TUNING_BLOCK_HS200 && - !host->hs400_tuning)) +if ((events &MSDC_INT_CMDTMO && !host->hs400_tuning) || + (!mmc_op_tuning (cmd->opcode) && !host->hs400_tuning))/* * should not clear fifo/interrupt as the tune data * may have alreay come when cmd19/cmd21 gets response
@@ -1301,11 +1299,9 @@ static void msdc_start_command(struct msdc_host *host,static void msdc_cmd_next (struct msdc_host *host,struct mmc_request *mrq,struct mmc_command *cmd) { -if ((cmd->error && - !(cmd->error == -EILSEQ && - (cmd->opcode ==MMC_SEND_TUNING_BLOCK || - cmd->opcode ==MMC_SEND_TUNING_BLOCK_HS200 || - host->hs400_tuning))) || +if ((cmd->error && !host->hs400_tuning && + !(cmd->error == -EILSEQ && +mmc_op_tuning (cmd->opcode))) || (mrq->sbc && mrq->sbc->error))msdc_request_done (host, mrq);else if (cmd == mrq->sbc)
drivers/mmc/host/sdhci-msm.c +1 -2
@@ -2218,8 +2218,7 @@ static int __sdhci_msm_check_write(struct sdhci_host *host, u16 val, int reg)if (!msm_host->use_cdr)break ;if ((msm_host->transfer_mode &SDHCI_TRNS_READ ) && -SDHCI_GET_CMD (val) !=MMC_SEND_TUNING_BLOCK_HS200 && -SDHCI_GET_CMD (val) !=MMC_SEND_TUNING_BLOCK ) + !mmc_op_tuning (SDHCI_GET_CMD (val)))sdhci_msm_set_cdr (host, true);else sdhci_msm_set_cdr (host, false);
drivers/mmc/host/sdhci-pci-o2micro.c +1 -2
@@ -326,8 +326,7 @@ static int sdhci_o2_execute_tuning(struct mmc_host *mmc, u32 opcode) (host->timing != MMC_TIMING_UHS_SDR50))return sdhci_execute_tuning (mmc, opcode); -if (WARN_ON ((opcode !=MMC_SEND_TUNING_BLOCK_HS200 ) && - (opcode !=MMC_SEND_TUNING_BLOCK ))) +if (WARN_ON (!mmc_op_tuning (opcode)))return -EINVAL ;/* Force power mode enter L0 */
drivers/mmc/host/sdhci-tegra.c +2 -6
@@ -268,13 +268,9 @@ static void tegra210_sdhci_writew(struct sdhci_host *host, u16 val, int reg) {bool is_tuning_cmd =0 ;bool clk_enabled; -u8 cmd; -if (reg ==SDHCI_COMMAND ) { - cmd =SDHCI_GET_CMD (val); - is_tuning_cmd = cmd ==MMC_SEND_TUNING_BLOCK || - cmd ==MMC_SEND_TUNING_BLOCK_HS200 ; - } +if (reg ==SDHCI_COMMAND ) + is_tuning_cmd =mmc_op_tuning (SDHCI_GET_CMD (val));if (is_tuning_cmd) clk_enabled =tegra_sdhci_configure_card_clk (host,0 );
drivers/mmc/host/sdhci.c +2 -7
@@ -1712,8 +1712,7 @@ static bool sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) flags |=SDHCI_CMD_INDEX ;/* CMD19 is special in that the Data Present Select should be set */ -if (cmd->data || cmd->opcode ==MMC_SEND_TUNING_BLOCK || - cmd->opcode ==MMC_SEND_TUNING_BLOCK_HS200 ) +if (cmd->data ||mmc_op_tuning (cmd->opcode)) flags |=SDHCI_CMD_DATA ; timeout = jiffies;
@@ -3396,8 +3395,6 @@ static void sdhci_adma_show_error(struct sdhci_host *host)static void sdhci_data_irq (struct sdhci_host *host,u32 intmask) { -u32 command; -/* * CMD19 generates _only_ Buffer Read Ready interrupt if * use sdhci_send_tuning.
@@ -3406,9 +3403,7 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)* SDHCI_INT_DATA_AVAIL always there, stuck in irq storm. */ if (intmask &SDHCI_INT_DATA_AVAIL && !host->data) { - command =SDHCI_GET_CMD (sdhci_readw (host,SDHCI_COMMAND )); -if (command ==MMC_SEND_TUNING_BLOCK || - command ==MMC_SEND_TUNING_BLOCK_HS200 ) { +if (mmc_op_tuning (SDHCI_GET_CMD (sdhci_readw (host,SDHCI_COMMAND )))) { host->tuning_done =1 ;wake_up (&host->buf_ready_int);return ;
drivers/net/bonding/bond_main.c +36 -0
@@ -577,12 +577,47 @@ static void bond_ipsec_del_sa_all(struct bonding *bond) __func__); }else { slave->dev->xfrmdev_ops->xdo_dev_state_delete (ipsec->xs); +if (slave->dev->xfrmdev_ops->xdo_dev_state_free) + slave->dev->xfrmdev_ops->xdo_dev_state_free (ipsec->xs); } }spin_unlock_bh (&bond->ipsec_lock);rcu_read_unlock (); } +static void bond_ipsec_free_sa (struct xfrm_state *xs) +{ +struct net_device *bond_dev = xs->xso.dev; +struct net_device *real_dev; +netdevice_tracker tracker; +struct bonding *bond; +struct slave *slave; + +if (!bond_dev) +return ; + +rcu_read_lock (); + bond =netdev_priv (bond_dev); + slave =rcu_dereference (bond->curr_active_slave); + real_dev = slave ? slave->dev :NULL ; +netdev_hold (real_dev, &tracker,GFP_ATOMIC ); +rcu_read_unlock (); + +if (!slave) + goto out; + +if (!xs->xso.real_dev) + goto out; + +WARN_ON (xs->xso.real_dev != real_dev); + +if (real_dev && real_dev->xfrmdev_ops && + real_dev->xfrmdev_ops->xdo_dev_state_free) + real_dev->xfrmdev_ops->xdo_dev_state_free (xs); +out: +netdev_put (real_dev, &tracker); +} +/** * bond_ipsec_offload_ok - can this packet use the xfrm hw offload * @skb: current data packet
@@ -623,6 +658,7 @@ static bool bond_ipsec_offload_ok(struct sk_buff *skb, struct xfrm_state *xs)static const struct xfrmdev_ops bond_xfrmdev_ops = { .xdo_dev_state_add = bond_ipsec_add_sa, .xdo_dev_state_delete = bond_ipsec_del_sa, + .xdo_dev_state_free = bond_ipsec_free_sa, .xdo_dev_offload_ok = bond_ipsec_offload_ok, };#endif /* CONFIG_XFRM_OFFLOAD */
drivers/net/ethernet/intel/igc/igc_tsn.c +8 -1
@@ -49,12 +49,19 @@ static unsigned int igc_tsn_new_flags(struct igc_adapter *adapter)return new_flags; } +static bool igc_tsn_is_tx_mode_in_tsn (struct igc_adapter *adapter) +{ +struct igc_hw *hw = &adapter->hw; + +return !!(rd32 (IGC_TQAVCTRL ) &IGC_TQAVCTRL_TRANSMIT_MODE_TSN ); +} +void igc_tsn_adjust_txtime_offset (struct igc_adapter *adapter) {struct igc_hw *hw = &adapter->hw;u16 txoffset; -if (!is_any_launchtime (adapter)) +if (!igc_tsn_is_tx_mode_in_tsn (adapter))return ;switch (adapter->link_speed) {
drivers/net/ethernet/microsoft/mana/hw_channel.c +34 -28
93 lines not on this page · raw message
drivers/net/gtp.c +1 -1
@@ -1219,7 +1219,7 @@ static struct sock *gtp_encap_enable_socket(int fd, int type, sock =sockfd_lookup (fd, &err);if (!sock) {pr_debug ("gtp socket fd=%d not found\n" , fd); -return NULL ; +return ERR_PTR (err); } sk = sock->sk;
drivers/net/wireless/intel/iwlwifi/fw/acpi.c +8 -5
@@ -825,22 +825,25 @@ int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt) entry = &wifi_pkg->package.elements[entry_idx]; entry_idx++;if (entry->type !=ACPI_TYPE_INTEGER || - entry->integer.value > num_profiles) { + entry->integer.value > num_profiles || + entry->integer.value < + rev_data[idx].min_profiles) { ret = -EINVAL ; goto out_free; } - num_profiles = entry->integer.value;/* -* this also validates >= min_profiles since we -* otherwise wouldn't have gotten the data when -* looking up in ACPI +* Check to see if we received package count +* same as max # of profiles */ if (wifi_pkg->package.count != hdr_size + profile_size * num_profiles) { ret = -EINVAL ; goto out_free; } + +/* Number of valid profiles */ + num_profiles = entry->integer.value; } goto read_table; }
drivers/net/wireless/marvell/mwifiex/cfg80211.c +26 -6
@@ -4362,11 +4362,27 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)if (ISSUPP_ADHOC_ENABLED (adapter->fw_cap_info)) wiphy->interface_modes |=BIT (NL80211_IFTYPE_ADHOC ); - wiphy->bands[NL80211_BAND_2GHZ ] = &mwifiex_band_2ghz; -if (adapter->config_bands &BAND_A ) - wiphy->bands[NL80211_BAND_5GHZ ] = &mwifiex_band_5ghz; -else + wiphy->bands[NL80211_BAND_2GHZ ] =devm_kmemdup (adapter->dev, + &mwifiex_band_2ghz, +sizeof (mwifiex_band_2ghz), +GFP_KERNEL ); +if (!wiphy->bands[NL80211_BAND_2GHZ ]) { + ret = -ENOMEM ; + goto err; + } + +if (adapter->config_bands &BAND_A ) { + wiphy->bands[NL80211_BAND_5GHZ ] =devm_kmemdup (adapter->dev, + &mwifiex_band_5ghz, +sizeof (mwifiex_band_5ghz), +GFP_KERNEL ); +if (!wiphy->bands[NL80211_BAND_5GHZ ]) { + ret = -ENOMEM ; + goto err; + } + }else { wiphy->bands[NL80211_BAND_5GHZ ] =NULL ; + }if (adapter->drcs_enabled &&ISSUPP_DRCS_ENABLED (adapter->fw_cap_info)) wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta_drcs;
@@ -4459,8 +4475,7 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)if (ret <0 ) {mwifiex_dbg (adapter,ERROR ,"%s: wiphy_register failed: %d\n" , __func__, ret); -wiphy_free (wiphy); -return ret; + goto err; }if (!adapter->regd) {
@@ -4502,4 +4517,9 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) adapter->wiphy = wiphy;return ret; + +err: +wiphy_free (wiphy); + +return ret; }
drivers/net/wireless/silabs/wfx/sta.c +4 -1
@@ -370,8 +370,11 @@ static int wfx_set_mfp_ap(struct wfx_vif *wvif) ptr = (u16 *)cfg80211_find_ie (WLAN_EID_RSN , skb->data + ieoffset, skb->len - ieoffset); -if (unlikely (!ptr)) +if (!ptr) { +/* No RSN IE is fine in open networks */ + ret =0 ; goto free_skb; + } ptr += pairwise_cipher_suite_count_offset;if (WARN_ON (ptr > (u16 *)skb_tail_pointer (skb)))
drivers/nfc/pn533/pn533.c +5 -0
@@ -1723,6 +1723,11 @@ static int pn533_start_poll(struct nfc_dev *nfc_dev, }pn533_poll_create_mod_list (dev, im_protocols, tm_protocols); +if (!dev->poll_mod_count) { +nfc_err (dev->dev, +"Poll mod list is empty\n" ); +return -EINVAL ; + }/* Do not always start polling from the same modulation */ get_random_bytes (&rand_mod,sizeof (rand_mod));
drivers/phy/xilinx/phy-zynqmp.c +100 -52
300 lines not on this page · raw message
drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c +29 -26
114 lines not on this page · raw message
drivers/pinctrl/pinctrl-rockchip.c +1 -1
@@ -3803,7 +3803,7 @@ static struct rockchip_pin_bank rk3328_pin_banks[] = {PIN_BANK_IOMUX_FLAGS (0 ,32 ,"gpio0" ,0 ,0 ,0 ,0 ),PIN_BANK_IOMUX_FLAGS (1 ,32 ,"gpio1" ,0 ,0 ,0 ,0 ),PIN_BANK_IOMUX_FLAGS (2 ,32 ,"gpio2" ,0 , -0 , +IOMUX_WIDTH_2BIT ,IOMUX_WIDTH_3BIT ,0 ), PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
drivers/pinctrl/pinctrl-single.c +2 -0
@@ -350,6 +350,8 @@ static int pcs_get_function(struct pinctrl_dev *pctldev, unsigned pin,return -ENOTSUPP ; fselector = setting->func; function =pinmux_generic_get_function (pctldev, fselector); +if (!function) +return -EINVAL ; *func = function->data;if (!(*func)) { dev_err(pcs->dev, "%s could not find function%i\n",
drivers/scsi/aacraid/comminit.c +2 -0
@@ -642,6 +642,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)if (aac_comm_init (dev)<0 ){kfree (dev->queues); + dev->queues =NULL ;return NULL ; }/*
@@ -649,6 +650,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)*/ if (aac_fib_setup (dev) <0 ) {kfree (dev->queues); + dev->queues =NULL ;return NULL ; }
drivers/soc/qcom/cmd-db.c +1 -1
@@ -354,7 +354,7 @@ static int cmd_db_dev_probe(struct platform_device *pdev)return -EINVAL ; } - cmd_db_header =memremap (rmem->base, rmem->size,MEMREMAP_WB ); + cmd_db_header =memremap (rmem->base, rmem->size,MEMREMAP_WC );if (!cmd_db_header) { ret = -ENOMEM ; cmd_db_header =NULL ;
drivers/soundwire/stream.c +4 -4
@@ -1272,18 +1272,18 @@ struct sdw_dpn_prop *sdw_get_slave_dpn_prop(struct sdw_slave *slave, unsigned int port_num) {struct sdw_dpn_prop *dpn_prop; -u8 num_ports; +unsigned long mask;int i;if (direction ==SDW_DATA_DIR_TX ) { - num_ports =hweight32 (slave->prop.source_ports); + mask = slave->prop.source_ports; dpn_prop = slave->prop.src_dpn_prop; }else { - num_ports =hweight32 (slave->prop.sink_ports); + mask = slave->prop.sink_ports; dpn_prop = slave->prop.sink_dpn_prop; } -for (i =0 ; i < num_ports; i++) { +for_each_set_bit (i, &mask,32 ) {if (dpn_prop[i].num == port_num)return &dpn_prop[i]; }
drivers/thermal/thermal_of.c +9 -8
@@ -235,7 +235,7 @@ static int thermal_of_populate_trip(struct device_node *np,static struct thermal_trip *thermal_of_trips_init (struct device_node *np,int *ntrips) {struct thermal_trip *tt; -struct device_node *trips, *trip; +struct device_node *trips;int ret, count; trips =of_get_child_by_name (np,"trips" );
@@ -260,7 +260,7 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n *ntrips = count; count =0 ; -for_each_child_of_node (trips, trip) { +for_each_child_of_node_scoped (trips, trip) { ret =thermal_of_populate_trip (trip, &tt[count++]);if (ret) goto out_kfree;
@@ -294,14 +294,14 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int* Search for each thermal zone, a defined sensor * corresponding to the one passed as parameter */ -for_each_available_child_of_node (np, tz) { +for_each_available_child_of_node_scoped (np, child) {int count, i; - count =of_count_phandle_with_args (tz,"thermal-sensors" , + count =of_count_phandle_with_args (child,"thermal-sensors" ,"#thermal-sensor-cells" );if (count <=0 ) { -pr_err ("%pOFn: missing thermal sensor\n" , tz); +pr_err ("%pOFn: missing thermal sensor\n" , child); tz =ERR_PTR (-EINVAL ); goto out; }
@@ -310,18 +310,19 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, intint ret; - ret =of_parse_phandle_with_args (tz,"thermal-sensors" , + ret =of_parse_phandle_with_args (child,"thermal-sensors" ,"#thermal-sensor-cells" , i, &sensor_specs);if (ret <0 ) { -pr_err ("%pOFn: Failed to read thermal-sensors cells: %d\n" , tz, ret); +pr_err ("%pOFn: Failed to read thermal-sensors cells: %d\n" , child, ret); tz =ERR_PTR (ret); goto out; }if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ? sensor_specs.args[0 ] :0 )) { -pr_debug ("sensor %pOFn id=%d belongs to %pOFn\n" , sensor, id, tz); +pr_debug ("sensor %pOFn id=%d belongs to %pOFn\n" , sensor, id, child); + tz =no_free_ptr (child); goto out; } }
drivers/usb/cdns3/cdnsp-gadget.h +3 -0
@@ -811,6 +811,7 @@ struct cdnsp_stream_info {* generate Missed Service Error Event. * Set skip flag when receive a Missed Service Error Event and * process the missed tds on the endpoint ring. +* @wa1_nop_trb: hold pointer to NOP trb. */ struct cdnsp_ep {struct usb_ep endpoint;
@@ -838,6 +839,8 @@ struct cdnsp_ep {#define EP_UNCONFIGURED BIT(7)bool skip; +union cdnsp_trb *wa1_nop_trb; + };/**
drivers/usb/cdns3/cdnsp-ring.c +29 -1
@@ -402,7 +402,7 @@ static u64 cdnsp_get_hw_deq(struct cdnsp_device *pdev,struct cdnsp_stream_ctx *st_ctx;struct cdnsp_ep *pep; - pep = &pdev->eps[stream_id]; + pep = &pdev->eps[ep_index];if (pep->ep_state &EP_HAS_STREAMS ) { st_ctx = &pep->stream_info.stream_ctx_array[stream_id];
@@ -1902,6 +1902,23 @@ int cdnsp_queue_bulk_tx(struct cdnsp_device *pdev, struct cdnsp_request *preq)if (ret)return ret; +/* +* workaround 1: STOP EP command on LINK TRB with TC bit set to 1 +* causes that internal cycle bit can have incorrect state after +* command complete. In consequence empty transfer ring can be +* incorrectly detected when EP is resumed. +* NOP TRB before LINK TRB avoid such scenario. STOP EP command is +* then on NOP TRB and internal cycle bit is not changed and have +* correct value. +*/ +if (pep->wa1_nop_trb) { + field =le32_to_cpu (pep->wa1_nop_trb->trans_event.flags); + field ^=TRB_CYCLE ; + + pep->wa1_nop_trb->trans_event.flags =cpu_to_le32 (field); + pep->wa1_nop_trb =NULL ; + } +/* * Don't give the first TRB to the hardware (by toggling the cycle bit) * until we've finished creating all the other TRBs. The ring's cycle
@@ -1997,6 +2014,17 @@ int cdnsp_queue_bulk_tx(struct cdnsp_device *pdev, struct cdnsp_request *preq) send_addr = addr; } +if (cdnsp_trb_is_link (ring->enqueue +1 )) { + field =TRB_TYPE (TRB_TR_NOOP ) |TRB_IOC ; +if (!ring->cycle_state) + field |=TRB_CYCLE ; + + pep->wa1_nop_trb = ring->enqueue; + +cdnsp_queue_trb (pdev, ring,0 ,0x0 ,0x0 , +TRB_INTR_TARGET (0 ), field); + } +cdnsp_check_trb_math (preq, enqd_len); ret =cdnsp_giveback_first_trb (pdev, pep, preq->request.stream_id, start_cycle, start_trb);
drivers/usb/class/cdc-acm.c +3 -0
@@ -1737,6 +1737,9 @@ static const struct usb_device_id acm_ids[] = { { USB_DEVICE(0x11ca, 0x0201), /* VeriFone Mx870 Gadget Serial */ .driver_info =SINGLE_RX_URB , }, + { USB_DEVICE(0x1901, 0x0006), /* GE Healthcare Patient Monitor UI Controller */ + .driver_info = DISABLE_ECHO, /* DISABLE ECHO in termios flag */ + }, { USB_DEVICE(0x1965, 0x0018), /* Uniden UBC125XLT */ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ },
drivers/usb/core/sysfs.c +1 -0
@@ -670,6 +670,7 @@ static int add_power_attributes(struct device *dev)static void remove_power_attributes (struct device *dev) { +sysfs_unmerge_group (&dev->kobj, &usb3_hardware_lpm_attr_group);sysfs_unmerge_group (&dev->kobj, &usb2_hardware_lpm_attr_group);sysfs_unmerge_group (&dev->kobj, &power_attr_group); }
drivers/usb/dwc3/core.c +8 -0
@@ -553,9 +553,17 @@ int dwc3_event_buffers_setup(struct dwc3 *dwc)void dwc3_event_buffers_cleanup (struct dwc3 *dwc) {struct dwc3_event_buffer *evt; +u32 reg;if (!dwc->ev_buf)return ; +/* +* Exynos platforms may not be able to access event buffer if the +* controller failed to halt on dwc3_core_exit(). +*/ + reg =dwc3_readl (dwc->regs,DWC3_DSTS ); +if (!(reg &DWC3_DSTS_DEVCTRLHLT )) +return ; evt = dwc->ev_buf;
drivers/usb/dwc3/dwc3-omap.c +3 -1
@@ -522,11 +522,13 @@ static int dwc3_omap_probe(struct platform_device *pdev)if (ret) {dev_err (dev,"failed to request IRQ #%d --> %d\n" , omap->irq, ret); - goto err1; + goto err2; }dwc3_omap_enable_irqs (omap);return 0 ; +err2: +of_platform_depopulate (dev); err1:pm_runtime_put_sync (dev);pm_runtime_disable (dev);
drivers/usb/dwc3/dwc3-st.c +7 -9
@@ -219,10 +219,8 @@ static int st_dwc3_probe(struct platform_device *pdev) dwc3_data->regmap = regmap; res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"syscfg-reg" ); -if (!res) { - ret = -ENXIO ; - goto undo_platform_dev_alloc; - } +if (!res) +return -ENXIO ; dwc3_data->syscfg_reg_off = res->start;
@@ -233,8 +231,7 @@ static int st_dwc3_probe(struct platform_device *pdev)devm_reset_control_get_exclusive (dev,"powerdown" );if (IS_ERR (dwc3_data->rstc_pwrdn)) {dev_err (&pdev->dev,"could not get power controller\n" ); - ret =PTR_ERR (dwc3_data->rstc_pwrdn); - goto undo_platform_dev_alloc; +return PTR_ERR (dwc3_data->rstc_pwrdn); }/* Manage PowerDown */
@@ -269,7 +266,7 @@ static int st_dwc3_probe(struct platform_device *pdev)if (!child_pdev) {dev_err (dev,"failed to find dwc3 core device\n" ); ret = -ENODEV ; - goto err_node_put; + goto depopulate; } dwc3_data->dr_mode =usb_get_dr_mode (&child_pdev->dev);
@@ -285,6 +282,7 @@ static int st_dwc3_probe(struct platform_device *pdev) ret =st_dwc3_drd_init (dwc3_data);if (ret) {dev_err (dev,"drd initialisation failed\n" ); +of_platform_depopulate (dev); goto undo_softreset; }
@@ -294,14 +292,14 @@ static int st_dwc3_probe(struct platform_device *pdev)platform_set_drvdata (pdev, dwc3_data);return 0 ; +depopulate: +of_platform_depopulate (dev); err_node_put:of_node_put (child); undo_softreset:reset_control_assert (dwc3_data->rstc_rst); undo_powerdown:reset_control_assert (dwc3_data->rstc_pwrdn); -undo_platform_dev_alloc: -platform_device_put (pdev);return ret; }
drivers/usb/serial/option.c +5 -0
@@ -619,6 +619,8 @@ static void option_instat_callback(struct urb *urb);/* MeiG Smart Technology products */ #define MEIGSMART_VENDOR_ID 0x2dee +/* MeiG Smart SRM825L based on Qualcomm 315 */ +#define MEIGSMART_PRODUCT_SRM825L 0x4d22/* MeiG Smart SLM320 based on UNISOC UIS8910 */ #define MEIGSMART_PRODUCT_SLM320 0x4d41
@@ -2366,6 +2368,9 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, TOZED_PRODUCT_LT70C, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, LUAT_PRODUCT_AIR720U, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM320, 0xff, 0, 0) }, + { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x30) }, + { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x60) }, { } /* Terminating entry */ };MODULE_DEVICE_TABLE (usb, option_ids);
drivers/usb/typec/tcpm/tcpm.c +7 -7
@@ -2397,7 +2397,7 @@ static int tcpm_register_source_caps(struct tcpm_port *port) {struct usb_power_delivery_desc desc = { port->negotiated_rev };struct usb_power_delivery_capabilities_desc caps = { }; -struct usb_power_delivery_capabilities *cap; +struct usb_power_delivery_capabilities *cap = port->partner_source_caps;if (!port->partner_pd) port->partner_pd =usb_power_delivery_register (NULL , &desc);
@@ -2407,6 +2407,11 @@ static int tcpm_register_source_caps(struct tcpm_port *port)memcpy (caps.pdo, port->source_caps,sizeof (u32) * port->nr_source_caps); caps.role =TYPEC_SOURCE ; +if (cap) { +usb_power_delivery_unregister_capabilities (cap); + port->partner_source_caps =NULL ; + } + cap =usb_power_delivery_register_capabilities (port->partner_pd, &caps);if (IS_ERR (cap))return PTR_ERR (cap);
@@ -2420,7 +2425,7 @@ static int tcpm_register_sink_caps(struct tcpm_port *port) {struct usb_power_delivery_desc desc = { port->negotiated_rev };struct usb_power_delivery_capabilities_desc caps = { }; -struct usb_power_delivery_capabilities *cap = port->partner_source_caps; +struct usb_power_delivery_capabilities *cap;if (!port->partner_pd) port->partner_pd =usb_power_delivery_register (NULL , &desc);
@@ -2430,11 +2435,6 @@ static int tcpm_register_sink_caps(struct tcpm_port *port)memcpy (caps.pdo, port->sink_caps,sizeof (u32) * port->nr_sink_caps); caps.role =TYPEC_SINK ; -if (cap) { -usb_power_delivery_unregister_capabilities (cap); - port->partner_source_caps =NULL ; - } - cap =usb_power_delivery_register_capabilities (port->partner_pd, &caps);if (IS_ERR (cap))return PTR_ERR (cap);
drivers/video/fbdev/offb.c +1 -0
@@ -27,6 +27,7 @@#include <linux/ioport.h> #include <linux/pci.h> #include <linux/platform_device.h> +#include <linux/cleanup.h> #include <asm/io.h> #ifdef CONFIG_PPC32
fs/btrfs/compression.c +1 -1
@@ -613,6 +613,7 @@ static noinline int add_ra_bio_pages(struct inode *inode,put_page (page);break ; } + add_size =min (em->start + em->len, page_end +1 ) - cur;free_extent_map (em);if (page->index == end_index) {
@@ -625,7 +626,6 @@ static noinline int add_ra_bio_pages(struct inode *inode, } } - add_size =min (em->start + em->len, page_end +1 ) - cur; ret =bio_add_page (cb->orig_bio, page, add_size,offset_in_page (cur));if (ret != add_size) {unlock_extent (tree, cur, page_end,NULL );
fs/btrfs/qgroup.c +2 -0
@@ -3745,6 +3745,8 @@ static int try_flush_qgroup(struct btrfs_root *root)return 0 ; } +btrfs_run_delayed_iputs (root->fs_info); +btrfs_wait_on_delayed_iputs (root->fs_info); ret =btrfs_start_delalloc_snapshot (root, true);if (ret <0 ) goto out;
fs/smb/client/smb2pdu.c +1 -1
@@ -4184,7 +4184,7 @@ smb2_new_read_req(void **buf, unsigned int *total_len,* If we want to do a RDMA write, fill in and append * smbd_buffer_descriptor_v1 to the end of read request */ -if (smb3_use_rdma_offload (io_parms)) { +if (rdata &&smb3_use_rdma_offload (io_parms)) {struct smbd_buffer_descriptor_v1 *v1;bool need_invalidate = server->dialect ==SMB30_PROT_ID ;
include/linux/of.h +15 -0
@@ -13,6 +13,7 @@*/ #include <linux/types.h> #include <linux/bitops.h> +#include <linux/cleanup.h> #include <linux/errno.h> #include <linux/kobject.h> #include <linux/mod_devicetable.h>
@@ -128,6 +129,7 @@ static inline struct device_node *of_node_get(struct device_node *node) }static inline void of_node_put (struct device_node *node) { }#endif /* !CONFIG_OF_DYNAMIC */ +DEFINE_FREE(device_node, struct device_node *, if (_T) of_node_put(_T)) /* Pointer for first entry in chain of all nodes. */extern struct device_node *of_root;
@@ -1371,10 +1373,23 @@ static inline int of_property_read_s32(const struct device_node *np,#define for_each_child_of_node (parent, child) \ for (child = of_get_next_child(parent, NULL); child != NULL; \ child = of_get_next_child(parent, child)) + +#define for_each_child_of_node_scoped (parent, child) \ + for (struct device_node *child __free(device_node) = \ + of_get_next_child(parent, NULL); \ + child != NULL; \ + child = of_get_next_child(parent, child)) +#define for_each_available_child_of_node (parent, child) \ for (child = of_get_next_available_child(parent, NULL); child != NULL; \ child = of_get_next_available_child(parent, child)) +#define for_each_available_child_of_node_scoped (parent, child) \ + for (struct device_node *child __free(device_node) = \ + of_get_next_available_child(parent, NULL); \ + child != NULL; \ + child = of_get_next_available_child(parent, child)) +#define for_each_of_cpu_node (cpu) \ for (cpu = of_get_next_cpu_node(NULL); cpu != NULL; \ cpu = of_get_next_cpu_node(cpu))
include/net/busy_poll.h +1 -1
@@ -63,7 +63,7 @@ static inline bool sk_can_busy_loop(struct sock *sk)static inline unsigned long busy_loop_current_time (void ) {#ifdef CONFIG_NET_RX_BUSY_POLL -return (unsigned long )(local_clock () >>10 ); +return (unsigned long )(ktime_get_ns () >>10 );#else return 0 ;#endif
include/net/netfilter/nf_tables_ipv4.h +6 -4
@@ -19,7 +19,7 @@ static inline void nft_set_pktinfo_ipv4(struct nft_pktinfo *pkt)static inline int __nft_set_pktinfo_ipv4_validate (struct nft_pktinfo *pkt) {struct iphdr *iph, _iph; -u32 len, thoff; +u32 len, thoff, skb_len; iph =skb_header_pointer (pkt->skb,skb_network_offset (pkt->skb),sizeof (*iph), &_iph);
@@ -30,15 +30,17 @@ static inline int __nft_set_pktinfo_ipv4_validate(struct nft_pktinfo *pkt)return -1 ; len =iph_totlen (pkt->skb, iph); - thoff =skb_network_offset (pkt->skb) + (iph->ihl *4 ); -if (pkt->skb->len < len) + thoff = iph->ihl *4 ; + skb_len = pkt->skb->len -skb_network_offset (pkt->skb); + +if (skb_len < len)return -1 ;else if (len < thoff)return -1 ; pkt->flags =NFT_PKTINFO_L4PROTO ; pkt->tprot = iph->protocol; - pkt->thoff = thoff; + pkt->thoff =skb_network_offset (pkt->skb) + thoff; pkt->fragoff =ntohs (iph->frag_off) &IP_OFFSET ;return 0 ;
include/net/netfilter/nf_tables_ipv6.h +3 -2
@@ -31,8 +31,8 @@ static inline int __nft_set_pktinfo_ipv6_validate(struct nft_pktinfo *pkt)struct ipv6hdr *ip6h, _ip6h;unsigned int thoff =0 ;unsigned short frag_off; +u32 pkt_len, skb_len;int protohdr; -u32 pkt_len; ip6h =skb_header_pointer (pkt->skb,skb_network_offset (pkt->skb),sizeof (*ip6h), &_ip6h);
@@ -43,7 +43,8 @@ static inline int __nft_set_pktinfo_ipv6_validate(struct nft_pktinfo *pkt)return -1 ; pkt_len =ntohs (ip6h->payload_len); -if (pkt_len +sizeof (*ip6h) > pkt->skb->len) + skb_len = pkt->skb->len -skb_network_offset (pkt->skb); +if (pkt_len +sizeof (*ip6h) > skb_len)return -1 ; protohdr =ipv6_find_hdr (pkt->skb, &thoff,-1 , &frag_off, &flags);
mm/truncate.c +2 -2
@@ -174,7 +174,7 @@ static void truncate_cleanup_folio(struct folio *folio)if (folio_mapped (folio))unmap_mapping_folio (folio); -if (folio_has_private (folio)) +if (folio_needs_release (folio))folio_invalidate (folio,0 ,folio_size (folio));/*
@@ -235,7 +235,7 @@ bool truncate_inode_partial_folio(struct folio *folio, loff_t start, loff_t end)*/ folio_zero_range (folio, offset, length); -if (folio_has_private (folio)) +if (folio_needs_release (folio))folio_invalidate (folio, offset, length);if (!folio_test_large (folio))return true;
net/bluetooth/hci_core.c +8 -2
@@ -2405,10 +2405,16 @@ static int hci_suspend_notifier(struct notifier_block *nb, unsigned long action,/* To avoid a potential race with hci_unregister_dev. */ hci_dev_hold (hdev); -if (action ==PM_SUSPEND_PREPARE ) +switch (action) { +case PM_HIBERNATION_PREPARE : +case PM_SUSPEND_PREPARE : ret =hci_suspend_dev (hdev); -else if (action ==PM_POST_SUSPEND ) +break ; +case PM_POST_HIBERNATION : +case PM_POST_SUSPEND : ret =hci_resume_dev (hdev); +break ; + }if (ret) bt_dev_err(hdev, "Suspend notifier action (%lu) failed: %d",
net/core/net-sysfs.c +1 -1
@@ -215,7 +215,7 @@ static ssize_t speed_show(struct device *dev,if (!rtnl_trylock ())return restart_syscall (); -if (netif_running (netdev) &&netif_device_present (netdev)) { +if (netif_running (netdev)) {struct ethtool_link_ksettings cmd;if (!__ethtool_get_link_ksettings (netdev, &cmd))
net/ethtool/ioctl.c +3 -0
@@ -445,6 +445,9 @@ int __ethtool_get_link_ksettings(struct net_device *dev,if (!dev->ethtool_ops->get_link_ksettings)return -EOPNOTSUPP ; +if (!netif_device_present (dev)) +return -ENODEV ; +memset (link_ksettings,0 ,sizeof (*link_ksettings));return dev->ethtool_ops->get_link_ksettings (dev, link_ksettings); }
net/mptcp/pm.c +20 -12
@@ -59,16 +59,6 @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_return 0 ; } -int mptcp_pm_remove_subflow (struct mptcp_sock *msk,const struct mptcp_rm_list *rm_list) -{ -pr_debug ("msk=%p, rm_list_nr=%d" , msk, rm_list->nr); - -spin_lock_bh (&msk->pm.lock); -mptcp_pm_nl_rm_subflow_received (msk, rm_list); -spin_unlock_bh (&msk->pm.lock); -return 0 ; -} -/* path manager event handlers */ void mptcp_pm_new_connection (struct mptcp_sock *msk,const struct sock *ssk,int server_side)
@@ -235,7 +225,9 @@ void mptcp_pm_add_addr_received(const struct sock *ssk, }else {__MPTCP_INC_STATS (sock_net ((struct sock *)msk),MPTCP_MIB_ADDADDRDROP ); } - }else if (!READ_ONCE (pm->accept_addr)) { +/* id0 should not have a different address */ + }else if ((addr->id ==0 && !mptcp_pm_nl_is_init_remote_addr (msk, addr)) || + (addr->id >0 && !READ_ONCE (pm->accept_addr))) {mptcp_pm_announce_addr (msk, addr, true);mptcp_pm_add_addr_send_ack (msk); }else if (mptcp_pm_schedule_work (msk,MPTCP_PM_ADD_ADDR_RECEIVED )) {
@@ -413,7 +405,23 @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,int mptcp_pm_get_local_id (struct mptcp_sock *msk,struct sock_common *skc) { -return mptcp_pm_nl_get_local_id (msk, skc); +struct mptcp_addr_info skc_local; +struct mptcp_addr_info msk_local; + +if (WARN_ON_ONCE (!msk)) +return -1 ; + +/* The 0 ID mapping is defined by the first subflow, copied into the msk +* addr +*/ +mptcp_local_address ((struct sock_common *)msk, &msk_local); +mptcp_local_address ((struct sock_common *)skc, &skc_local); +if (mptcp_addresses_equal (&msk_local, &skc_local, false)) +return 0 ; + +if (mptcp_pm_is_userspace (msk)) +return mptcp_userspace_pm_get_local_id (msk, &skc_local); +return mptcp_pm_nl_get_local_id (msk, &skc_local); }bool mptcp_pm_is_backup (struct mptcp_sock *msk,struct sock_common *skc)
net/mptcp/pm_netlink.c +63 -47
242 lines not on this page · raw message
net/mptcp/protocol.c +5 -2
@@ -2309,7 +2309,7 @@ static struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk)continue ; } -if (subflow->backup) { +if (subflow->backup || subflow->request_bkup) {if (!backup) backup = ssk;continue ;
@@ -2528,8 +2528,11 @@ static void __mptcp_close_subflow(struct sock *sk)mptcp_for_each_subflow_safe (msk, subflow, tmp) {struct sock *ssk =mptcp_subflow_tcp_sock (subflow); +int ssk_state =inet_sk_state_load (ssk); -if (inet_sk_state_load (ssk) !=TCP_CLOSE ) +if (ssk_state !=TCP_CLOSE && + (ssk_state !=TCP_CLOSE_WAIT || +inet_sk_state_load (sk) !=TCP_ESTABLISHED ))continue ;/* 'subflow_data_ready' will re-sched once rx queue is empty */
net/mptcp/protocol.h +3 -4
@@ -802,6 +802,8 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,void mptcp_pm_add_addr_echoed (struct mptcp_sock *msk,const struct mptcp_addr_info *addr);void mptcp_pm_add_addr_send_ack (struct mptcp_sock *msk); +bool mptcp_pm_nl_is_init_remote_addr (struct mptcp_sock *msk, +const struct mptcp_addr_info *remote);void mptcp_pm_nl_addr_send_ack (struct mptcp_sock *msk);void mptcp_pm_rm_addr_received (struct mptcp_sock *msk,const struct mptcp_rm_list *rm_list);
@@ -834,7 +836,6 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk,const struct mptcp_addr_info *addr, bool echo);int mptcp_pm_remove_addr (struct mptcp_sock *msk,const struct mptcp_rm_list *rm_list); -int mptcp_pm_remove_subflow (struct mptcp_sock *msk,const struct mptcp_rm_list *rm_list);void mptcp_pm_remove_addrs (struct mptcp_sock *msk,struct list_head *rm_list);void mptcp_pm_remove_addrs_and_subflows (struct mptcp_sock *msk,struct list_head *rm_list);
@@ -912,6 +913,7 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,bool mptcp_pm_rm_addr_signal (struct mptcp_sock *msk,unsigned int remaining,struct mptcp_rm_list *rm_list);int mptcp_pm_get_local_id (struct mptcp_sock *msk,struct sock_common *skc); +int mptcp_pm_nl_get_local_id (struct mptcp_sock *msk,struct mptcp_addr_info *skc);int mptcp_userspace_pm_get_local_id (struct mptcp_sock *msk,struct mptcp_addr_info *skc);bool mptcp_pm_is_backup (struct mptcp_sock *msk,struct sock_common *skc);bool mptcp_pm_nl_is_backup (struct mptcp_sock *msk,struct mptcp_addr_info *skc);
@@ -928,9 +930,6 @@ static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflovoid __init mptcp_pm_nl_init (void );void mptcp_pm_nl_work (struct mptcp_sock *msk); -void mptcp_pm_nl_rm_subflow_received (struct mptcp_sock *msk, -const struct mptcp_rm_list *rm_list); -int mptcp_pm_nl_get_local_id (struct mptcp_sock *msk,struct sock_common *skc);unsigned int mptcp_pm_get_add_addr_signal_max (const struct mptcp_sock *msk);unsigned int mptcp_pm_get_add_addr_accept_max (const struct mptcp_sock *msk);unsigned int mptcp_pm_get_subflows_max (const struct mptcp_sock *msk);
net/mptcp/subflow.c +6 -2
@@ -1137,12 +1137,16 @@ static void mptcp_subflow_discard_data(struct sock *ssk, struct sk_buff *skb,/* sched mptcp worker to remove the subflow if no more data is pending */ static void subflow_sched_work_if_closed (struct mptcp_sock *msk,struct sock *ssk) { -if (likely (ssk->sk_state !=TCP_CLOSE )) +struct sock *sk = (struct sock *)msk; + +if (likely (ssk->sk_state !=TCP_CLOSE && + (ssk->sk_state !=TCP_CLOSE_WAIT || +inet_sk_state_load (sk) !=TCP_ESTABLISHED )))return ;if (skb_queue_empty (&ssk->sk_receive_queue) && !test_and_set_bit (MPTCP_WORK_CLOSE_SUBFLOW , &msk->flags)) -mptcp_schedule_work ((struct sock *)msk); +mptcp_schedule_work (sk); }static bool subflow_can_fallback (struct mptcp_subflow_context *subflow)
net/sctp/sm_statefuns.c +16 -6
@@ -2261,12 +2261,6 @@ enum sctp_disposition sctp_sf_do_5_2_4_dupcook( } } -/* Update socket peer label if first association. */ -if (security_sctp_assoc_request (new_asoc, chunk->head_skb ?: chunk->skb)) { -sctp_association_free (new_asoc); -return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); - } -/* Set temp so that it won't be added into hashtable */ new_asoc->temp =1 ;
@@ -2275,6 +2269,22 @@ enum sctp_disposition sctp_sf_do_5_2_4_dupcook(*/ action =sctp_tietags_compare (new_asoc, asoc); +/* In cases C and E the association doesn't enter the ESTABLISHED +* state, so there is no need to call security_sctp_assoc_request(). +*/ +switch (action) { +case 'A' :/* Association restart. */ +case 'B' :/* Collision case B. */ +case 'D' :/* Collision case D. */ +/* Update socket peer label if first association. */ +if (security_sctp_assoc_request ((struct sctp_association *)asoc, + chunk->head_skb ?: chunk->skb)) { +sctp_association_free (new_asoc); +return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); + } +break ; + } +switch (action) {case 'A' :/* Association restart. */ retval = sctp_sf_do_dupcook_a(net, ep, asoc, chunk, commands,
security/apparmor/policy_unpack_test.c +3 -3
@@ -81,14 +81,14 @@ static struct aa_ext *build_aa_ext_struct(struct policy_unpack_fixture *puf, *(buf +1 ) =strlen (TEST_U32_NAME ) +1 ;strcpy (buf +3 ,TEST_U32_NAME ); *(buf +3 +strlen (TEST_U32_NAME ) +1 ) =AA_U32 ; - *((u32 *)(buf +3 +strlen (TEST_U32_NAME ) +2 )) =TEST_U32_DATA ; + *((__le32 *)(buf +3 +strlen (TEST_U32_NAME ) +2 )) =cpu_to_le32 (TEST_U32_DATA ); buf = e->start +TEST_NAMED_U64_BUF_OFFSET ; *buf =AA_NAME ; *(buf +1 ) =strlen (TEST_U64_NAME ) +1 ;strcpy (buf +3 ,TEST_U64_NAME ); *(buf +3 +strlen (TEST_U64_NAME ) +1 ) =AA_U64 ; - *((u64 *)(buf +3 +strlen (TEST_U64_NAME ) +2 )) =TEST_U64_DATA ; + *((__le64 *)(buf +3 +strlen (TEST_U64_NAME ) +2 )) =cpu_to_le64 (TEST_U64_DATA ); buf = e->start +TEST_NAMED_BLOB_BUF_OFFSET ; *buf =AA_NAME ;
@@ -104,7 +104,7 @@ static struct aa_ext *build_aa_ext_struct(struct policy_unpack_fixture *puf, *(buf +1 ) =strlen (TEST_ARRAY_NAME ) +1 ;strcpy (buf +3 ,TEST_ARRAY_NAME ); *(buf +3 +strlen (TEST_ARRAY_NAME ) +1 ) =AA_ARRAY ; - *((u16 *)(buf +3 +strlen (TEST_ARRAY_NAME ) +2 )) =TEST_ARRAY_SIZE ; + *((__le16 *)(buf +3 +strlen (TEST_ARRAY_NAME ) +2 )) =cpu_to_le16 (TEST_ARRAY_SIZE );return e; }
sound/soc/amd/acp/acp-legacy-mach.c +2 -0
@@ -144,6 +144,8 @@ static const struct platform_device_id board_ids[] = { }, { } }; +MODULE_DEVICE_TABLE (platform, board_ids); +static struct platform_driver acp_asoc_audio = { .driver = { .pm = &snd_soc_pm_ops,
sound/soc/sof/amd/acp.c +17 -2
@@ -363,6 +363,7 @@ static int acp_power_on(struct snd_sof_dev *sdev)const struct sof_amd_acp_desc *desc =get_chip_info (sdev->pdata);unsigned int base = desc->pgfsm_base;unsigned int val; +unsigned int acp_pgfsm_status_mask, acp_pgfsm_cntl_mask;int ret; val =snd_sof_dsp_read (sdev,ACP_DSP_BAR , base +PGFSM_STATUS_OFFSET );
@@ -370,9 +371,23 @@ static int acp_power_on(struct snd_sof_dev *sdev)if (val ==ACP_POWERED_ON )return 0 ; -if (val &ACP_PGFSM_STATUS_MASK ) +switch (desc->rev) { +case 3 : +case 5 : + acp_pgfsm_status_mask =ACP3X_PGFSM_STATUS_MASK ; + acp_pgfsm_cntl_mask =ACP3X_PGFSM_CNTL_POWER_ON_MASK ; +break ; +case 6 : + acp_pgfsm_status_mask =ACP6X_PGFSM_STATUS_MASK ; + acp_pgfsm_cntl_mask =ACP6X_PGFSM_CNTL_POWER_ON_MASK ; +break ; +default : +return -EINVAL ; + } + +if (val & acp_pgfsm_status_mask)snd_sof_dsp_write (sdev,ACP_DSP_BAR , base +PGFSM_CONTROL_OFFSET , -ACP_PGFSM_CNTL_POWER_ON_MASK ); + acp_pgfsm_cntl_mask); ret =snd_sof_dsp_read_poll_timeout (sdev,ACP_DSP_BAR , base +PGFSM_STATUS_OFFSET , val, !val,ACP_REG_POLL_INTERVAL ,ACP_REG_POLL_TIMEOUT_US );
sound/soc/sof/amd/acp.h +5 -2
@@ -22,8 +22,11 @@#define ACP_REG_POLL_TIMEOUT_US 2000#define ACP_DMA_COMPLETE_TIMEOUT_US 5000 -#define ACP_PGFSM_CNTL_POWER_ON_MASK 0x01 -#define ACP_PGFSM_STATUS_MASK 0x03 +#define ACP3X_PGFSM_CNTL_POWER_ON_MASK 0x01 +#define ACP3X_PGFSM_STATUS_MASK 0x03 +#define ACP6X_PGFSM_CNTL_POWER_ON_MASK 0x07 +#define ACP6X_PGFSM_STATUS_MASK 0x0F +#define ACP_POWERED_ON 0x00#define ACP_ASSERT_RESET 0x01#define ACP_RELEASE_RESET 0x00
tools/testing/selftests/net/forwarding/local_termination.sh +4 -0
@@ -278,6 +278,10 @@ bridge() cleanup() { pre_cleanup + + ip link set $h2 down + ip link set $h1 down + vrf_cleanup }
tools/testing/selftests/net/forwarding/no_forwarding.sh +3 -0
@@ -233,6 +233,9 @@ cleanup() { pre_cleanup + ip link set dev $swp2 down + ip link set dev $swp1 down + h2_destroy h1_destroy