Linux 6.12.50
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.12.50 kernel.
All users of the 6.12 kernel series must upgrade.
The updated 6.12.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.12.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
------------
Documentation/admin-guide/laptops/lg-laptop.rst | 4 Makefile | 2 arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_sodia.dts | 6 arch/arm/boot/dts/marvell/kirkwood-openrd-client.dts | 2 arch/arm64/boot/dts/freescale/imx8mp.dtsi | 4 arch/arm64/boot/dts/marvell/cn9132-clearfog.dts | 16 arch/arm64/boot/dts/marvell/cn9132-sr-cex7.dtsi | 8 drivers/cpufreq/cpufreq.c | 20 drivers/firewire/core-cdev.c | 2 drivers/gpio/gpiolib.c | 21 drivers/gpu/drm/ast/ast_dp.c | 2 drivers/gpu/drm/gma500/oaktrail_hdmi.c | 2 drivers/gpu/drm/i915/display/intel_backlight.c | 5 drivers/gpu/drm/panthor/panthor_sched.c | 8 drivers/hid/amd-sfh-hid/amd_sfh_client.c | 12 drivers/hid/amd-sfh-hid/amd_sfh_common.h | 3 drivers/hid/amd-sfh-hid/amd_sfh_pcie.c | 4 drivers/hid/hid-asus.c | 3 drivers/i2c/busses/i2c-designware-platdrv.c | 7 drivers/infiniband/hw/mlx5/devx.c | 1 drivers/iommu/iommufd/fault.c | 4 drivers/iommu/iommufd/main.c | 34 drivers/mmc/host/sdhci-cadence.c | 11 drivers/net/can/rcar/rcar_can.c | 8 drivers/net/can/spi/hi311x.c | 1 drivers/net/can/sun4i_can.c | 1 drivers/net/can/usb/etas_es58x/es58x_core.c | 3 drivers/net/can/usb/mcba_usb.c | 1 drivers/net/can/usb/peak_usb/pcan_usb_core.c | 2 drivers/net/dsa/lantiq_gswip.c | 21 drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 2 drivers/net/ethernet/freescale/fec_main.c | 4 drivers/net/ethernet/intel/i40e/i40e.h | 3 drivers/net/ethernet/intel/i40e/i40e_main.c | 26 drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 110 +- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h | 3 drivers/net/ethernet/marvell/octeontx2/af/cgx.c | 3 drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c | 2 drivers/net/phy/sfp.c | 24 drivers/net/tun.c | 3 drivers/net/wireless/virtual/virt_wifi.c | 4 drivers/platform/x86/lg-laptop.c | 34 drivers/ufs/core/ufs-mcq.c | 4 drivers/usb/core/quirks.c | 2 drivers/usb/host/xhci-dbgcap.c | 2 drivers/usb/host/xhci-mem.c | 50 - drivers/usb/host/xhci.c | 2 drivers/usb/host/xhci.h | 6 drivers/video/fbdev/core/fbcon.c | 13 fs/afs/server.c | 3 fs/btrfs/volumes.c | 5 fs/hugetlbfs/inode.c | 10 fs/proc/task_mmu.c | 3 fs/smb/client/smb2inode.c | 2 fs/smb/server/transport_rdma.c | 22 include/crypto/if_alg.h | 2 include/linux/firmware/imx/sm.h | 12 include/linux/swap.h | 10 include/net/bluetooth/hci_core.h | 21 kernel/bpf/core.c | 5 kernel/bpf/verifier.c | 6 kernel/futex/requeue.c | 6 kernel/trace/trace_dynevent.c | 4 kernel/vhost_task.c | 3 mm/gup.c | 15 mm/kmsan/core.c | 10 mm/kmsan/kmsan_test.c | 16 mm/mlock.c | 6 mm/swap.c | 51 - net/bluetooth/hci_event.c | 26 net/bluetooth/hci_sync.c | 7 net/core/skbuff.c | 2 net/ipv4/nexthop.c | 7 net/smc/smc_loopback.c | 14 net/xfrm/xfrm_state.c | 3 sound/pci/hda/patch_realtek.c | 11 sound/usb/mixer_quirks.c | 545 +++++++++---- sound/usb/quirks.c | 24 sound/usb/usbaudio.h | 4 tools/testing/selftests/net/fib_nexthops.sh | 12 80 files changed, 999 insertions(+), 383 deletions(-)
Adrián Larumbe (1):
drm/panthor: Defer scheduler entitiy destruction to queue release
Aleksander Jan Bajkowski (1):
net: sfp: add quirk for FLYPRO copper SFP+ module
Alok Tiwari (2):
scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE
bnxt_en: correct offset handling for IPv6 destination address
Amit Chaudhari (1):
HID: asus: add support for missing PX series fn keys
Basavaraj Natikar (1):
HID: amd_sfh: Add sync across amd sfh work functions
Benoît Monin (1):
mmc: sdhci-cadence: add Mobileye eyeQ support
Chen Ni (1):
ALSA: usb-audio: Convert comma to semicolon
Chris Morgan (1):
net: sfp: add quirk for Potron SFP+ XGSPON ONU Stick
Christian Loehle (1):
cpufreq: Initialize cpufreq-based invariance before subsys
Cristian Ciocaltea (7):
ALSA: usb-audio: Fix code alignment in mixer_quirks
ALSA: usb-audio: Fix block comments in mixer_quirks
ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
Cryolitia PukNgae (1):
ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
Dan Carpenter (1):
octeontx2-pf: Fix potential use after free in otx2_tc_add_flow()
Daniel Lee (1):
platform/x86: lg-laptop: Fix WMAB call in fan_mode_store()
Eric Biggers (2):
crypto: af_alg - Fix incorrect boolean values in af_alg_ctx
kmsan: fix out-of-bounds access to shadow memory
Geert Uytterhoeven (1):
can: rcar_can: rcar_can_resume(): fix s2ram with PSCI
Greg Kroah-Hartman (1):
Linux 6.12.50
Guenter Roeck (1):
drm/i915/backlight: Return immediately when scale() finds invalid parameters
Hans de Goede (1):
gpiolib: Extend software-node support to support secondary software-nodes
Heikki Krogerus (1):
i2c: designware: Add quirk for Intel Xe
Hugh Dickins (3):
mm/gup: local lru_add_drain() to avoid lru_add_drain_all()
mm: revert "mm/gup: clear the LRU flag of a page before adding to LRU batch"
mm: folio_may_be_lru_cached() unless folio_test_large()
Ido Schimmel (2):
nexthop: Forbid FDB status change while nexthop is in a group
selftests: fib_nexthops: Fix creation of non-FDB nexthops
Jakub Acs (1):
fs/proc/task_mmu: check p->vec_buf for NULL
James Guan (1):
wifi: virt_wifi: Fix page fault on connect
Jason Baron (1):
net: allow alloc_skb_with_frags() to use MAX_SKB_FRAGS
Jason Gunthorpe (1):
iommufd: Fix race during abort for file descriptors
Jiayi Li (1):
usb: core: Add 0x prefix to quirks debug output
Jihed Chaibi (1):
ARM: dts: kirkwood: Fix sound DAI cells for OpenRD clients
Jinjiang Tu (1):
mm/hugetlb: fix folio is still mapped when deleted
Jiri Olsa (1):
bpf: Check the helper function is valid in get_helper_proto
Josua Mayer (2):
arm64: dts: marvell: cn9132-clearfog: disable eMMC high-speed modes
arm64: dts: marvell: cn9132-clearfog: fix multi-lane pci x2 and x4 ports
Leon Hwang (1):
bpf: Reject bpf_timer for PREEMPT_RT
Luiz Augusto von Dentz (2):
Bluetooth: hci_sync: Fix hci_resume_advertising_sync
Bluetooth: hci_event: Fix UAF in hci_acl_create_conn_sync
Lukasz Czapnik (8):
i40e: add validation for ring_len param
i40e: fix idx validation in i40e_validate_queue_map
i40e: fix idx validation in config queues msg
i40e: fix input validation logic for action_meta
i40e: fix validation of VF state in get resources
i40e: add max boundary check for VF filters
i40e: add mask to apply valid bits for itr_idx
i40e: improve VF MAC filters accounting
Marc Kleine-Budde (1):
net: fec: rename struct fec_devinfo fec_imx6x_info -> fec_imx6sx_info
Mark Harmstone (1):
btrfs: don't allow adding block device of less than 1 MB
Masami Hiramatsu (Google) (1):
tracing: dynevent: Add a missing lockdown check on dynevent
Niklas Neronin (1):
Revert "usb: xhci: remove option to change a default ring's TRB cycle bit"
Nirmoy Das (1):
drm/ast: Use msleep instead of mdelay for edid read
Nobuhiro Iwamatsu (1):
ARM: dts: socfpga: sodia: Fix mdio bus probe and PHY address
Or Har-Toov (1):
IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
Peng Fan (2):
firmware: imx: Add stub functions for SCMI MISC API
arm64: dts: imx8mp: Correct thermal sensor index
Petr Malat (1):
ethernet: rvu-af: Remove slash from the driver name
Sabrina Dubroca (1):
xfrm: xfrm_alloc_spi shouldn't use 0 as SPI
Samasth Norway Ananda (1):
fbcon: fix integer overflow in fbcon_do_set_font
Sang-Heon Jeon (1):
smb: client: fix wrong index reference in smb2_compound_op()
Sebastian Andrzej Siewior (2):
vhost: Take a reference on the task in struct vhost_task.
futex: Prevent use-after-free during requeue-PI
Sidraya Jayagond (1):
net/smc: fix warning in smc_rx_splice() when calling get_page()
Stefan Binding (1):
ALSA: hda/realtek: Add support for ASUS NUC using CS35L41 HDA
Stefan Metzmacher (2):
smb: server: don't use delayed_work for post_recv_credits_work
smb: server: use disable_work_sync in transport_rdma.c
Stéphane Grosjean (1):
can: peak_usb: fix shift-out-of-bounds issue
Takashi Iwai (1):
ALSA: usb-audio: Fix build with CONFIG_INPUT=n
Takashi Sakamoto (1):
firewire: core: fix overlooked update of subsystem ABI version
Thomas Zimmermann (1):
fbcon: Fix OOB access in font allocation
Vincent Mailhol (4):
can: etas_es58x: populate ndo_change_mtu() to prevent buffer overflow
can: hi311x: populate ndo_change_mtu() to prevent buffer overflow
can: sun4i_can: populate ndo_change_mtu() to prevent buffer overflow
can: mcba_usb: populate ndo_change_mtu() to prevent buffer overflow
Vladimir Oltean (2):
net: dsa: lantiq_gswip: move gswip_add_single_port_br() call to port_setup()
net: dsa: lantiq_gswip: suppress -EINVAL errors for bridge FDB entries added to the CPU port
Wang Liang (1):
net: tun: Update napi->skb after XDP process
Zabelin Nikita (1):
drm/gma500: Fix null dereference in hdmi teardown
Zhen Ni (1):
afs: Fix potential null pointer dereference in afs_put_server
noble.yang (1):
ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
qaqland (1):
ALSA: usb-audio: Add mute TLV for playback volumes on more devices
Greg Kroah-Hartman
maintainerDocumentation/admin-guide/laptops/lg-laptop.rst +2 -2
@@ -48,8 +48,8 @@ This value is reset to 100 when the kernel boots. Fan mode -------- -Writing 1/0 to /sys/devices/platform/lg-laptop/fan_mode disables/enables -the fan silent mode. +Writing 0/1/2 to /sys/devices/platform/lg-laptop/fan_mode sets fan mode to +Optimal/Silent/Performance respectively. USB charge
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 49 +SUBLEVEL = 50 EXTRAVERSION = NAME = Baby Opossum Posse
arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_sodia.dts +4 -2
@@ -66,8 +66,10 @@ &gmac1 { mdio0 { #address-cells = <1>; #size-cells = <0>; - phy0: ethernet-phy@0 { - reg = <0>; + compatible = "snps,dwmac-mdio"; + + phy0: ethernet-phy@4 { + reg = <4>; rxd0-skew-ps = <0>; rxd1-skew-ps = <0>; rxd2-skew-ps = <0>;
arch/arm/boot/dts/marvell/kirkwood-openrd-client.dts +1 -1
@@ -38,7 +38,7 @@ sound { simple-audio-card,mclk-fs = <256>; simple-audio-card,cpu { - sound-dai = <&audio0 0>; + sound-dai = <&audio0>; }; simple-audio-card,codec {
arch/arm64/boot/dts/freescale/imx8mp.dtsi +2 -2
@@ -283,7 +283,7 @@ thermal-zones { cpu-thermal { polling-delay-passive = <250>; polling-delay = <2000>; - thermal-sensors = <&tmu 0>; + thermal-sensors = <&tmu 1>; trips { cpu_alert0: trip0 { temperature = <85000>;
@@ -313,7 +313,7 @@ map0 { soc-thermal { polling-delay-passive = <250>; polling-delay = <2000>; - thermal-sensors = <&tmu 1>; + thermal-sensors = <&tmu 0>; trips { soc_alert0: trip0 { temperature = <85000>;
arch/arm64/boot/dts/marvell/cn9132-clearfog.dts +14 -2
@@ -413,7 +413,13 @@ fixed-link { /* SRDS #0,#1,#2,#3 - PCIe */ &cp0_pcie0 { num-lanes = <4>; - phys = <&cp0_comphy0 0>, <&cp0_comphy1 0>, <&cp0_comphy2 0>, <&cp0_comphy3 0>; + /* + * The mvebu-comphy driver does not currently know how to pass correct + * lane-count to ATF while configuring the serdes lanes. + * Rely on bootloader configuration only. + * + * phys = <&cp0_comphy0 0>, <&cp0_comphy1 0>, <&cp0_comphy2 0>, <&cp0_comphy3 0>; + */ status = "okay"; };
@@ -475,7 +481,13 @@ &cp1_eth0 { /* SRDS #0,#1 - PCIe */ &cp1_pcie0 { num-lanes = <2>; - phys = <&cp1_comphy0 0>, <&cp1_comphy1 0>; + /* + * The mvebu-comphy driver does not currently know how to pass correct + * lane-count to ATF while configuring the serdes lanes. + * Rely on bootloader configuration only. + * + * phys = <&cp1_comphy0 0>, <&cp1_comphy1 0>; + */ status = "okay"; };
arch/arm64/boot/dts/marvell/cn9132-sr-cex7.dtsi +8 -0
@@ -137,6 +137,14 @@ &ap_sdhci0 { pinctrl-0 = <&ap_mmc0_pins>; pinctrl-names = "default"; vqmmc-supply = <&v_1_8>; + /* + * Not stable in HS modes - phy needs "more calibration", so disable + * UHS (by preventing voltage switch), SDR104, SDR50 and DDR50 modes. + */ + no-1-8-v; + no-sd; + no-sdio; + non-removable; status = "okay"; };
drivers/cpufreq/cpufreq.c +11 -9
@@ -2973,6 +2973,15 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) goto err_null_driver; } +/* +* Mark support for the scheduler's frequency invariance engine for +* drivers that implement target(), target_index() or fast_switch(). +*/ +if (!cpufreq_driver->setpolicy) { +static_branch_enable_cpuslocked (&cpufreq_freq_invariance); +pr_debug ("cpufreq: supports frequency invariance\n" ); + } + ret =subsys_interface_register (&cpufreq_interface);if (ret) goto err_boost_unreg;
@@ -2994,21 +3003,14 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) hp_online = ret; ret =0 ; -/* -* Mark support for the scheduler's frequency invariance engine for -* drivers that implement target(), target_index() or fast_switch(). -*/ -if (!cpufreq_driver->setpolicy) { -static_branch_enable_cpuslocked (&cpufreq_freq_invariance); -pr_debug ("supports frequency invariance" ); - } -pr_debug ("driver %s up and running\n" , driver_data->name); goto out; err_if_unreg:subsys_interface_unregister (&cpufreq_interface); err_boost_unreg: +if (!cpufreq_driver->setpolicy) +static_branch_disable_cpuslocked (&cpufreq_freq_invariance);remove_boost_sysfs_file (); err_null_driver:write_lock_irqsave (&cpufreq_driver_lock, flags);
drivers/firewire/core-cdev.c +1 -1
@@ -41,7 +41,7 @@/* * ABI version history is documented in linux/firewire-cdev.h. */ -#define FW_CDEV_KERNEL_VERSION 5 +#define FW_CDEV_KERNEL_VERSION 6#define FW_CDEV_VERSION_EVENT_REQUEST2 4#define FW_CDEV_VERSION_ALLOCATE_REGION_END 4#define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
drivers/gpio/gpiolib.c +19 -2
@@ -4317,6 +4317,23 @@ static struct gpio_desc *gpiod_find_by_fwnode(struct fwnode_handle *fwnode,return desc; } +static struct gpio_desc *gpiod_fwnode_lookup (struct fwnode_handle *fwnode, +struct device *consumer, +const char *con_id, +unsigned int idx, +enum gpiod_flags *flags, +unsigned long *lookupflags) +{ +struct gpio_desc *desc; + + desc =gpiod_find_by_fwnode (fwnode, consumer, con_id, idx, flags, lookupflags); +if (gpiod_not_found (desc) && !IS_ERR_OR_NULL (fwnode)) + desc =gpiod_find_by_fwnode (fwnode->secondary, consumer, con_id, + idx, flags, lookupflags); + +return desc; +} + struct gpio_desc *gpiod_find_and_request(struct device *consumer, struct fwnode_handle *fwnode, const char *con_id,
@@ -4335,8 +4352,8 @@ struct gpio_desc *gpiod_find_and_request(struct device *consumer,int ret =0 ; scoped_guard(srcu, &gpio_devices_srcu) { - desc =gpiod_find_by_fwnode (fwnode, consumer, con_id, idx, - &flags, &lookupflags); + desc =gpiod_fwnode_lookup (fwnode, consumer, con_id, idx, + &flags, &lookupflags);if (gpiod_not_found (desc) && platform_lookup_allowed) {/* * Either we are not using DT or ACPI, or their lookup
drivers/gpu/drm/ast/ast_dp.c +1 -1
@@ -79,7 +79,7 @@ static int ast_astdp_read_edid_block(void *data, u8 *buf, unsigned int block, si* 3. The Delays are often longer a lot when system resume from S3/S4. */ if (j) -mdelay (j +1 ); +msleep (j +1 );/* Wait for EDID offset to show up in mirror register */ vgacrd7 =ast_get_index_reg (ast,AST_IO_VGACRI ,0xd7 );
drivers/gpu/drm/gma500/oaktrail_hdmi.c +1 -1
@@ -726,8 +726,8 @@ void oaktrail_hdmi_teardown(struct drm_device *dev)if (hdmi_dev) { pdev = hdmi_dev->dev; -pci_set_drvdata (pdev,NULL );oaktrail_hdmi_i2c_exit (pdev); +pci_set_drvdata (pdev,NULL );iounmap (hdmi_dev->regs);kfree (hdmi_dev);pci_dev_put (pdev);
drivers/gpu/drm/i915/display/intel_backlight.c +3 -2
@@ -40,8 +40,9 @@ static u32 scale(u32 source_val, {u64 target_val; -WARN_ON (source_min > source_max); -WARN_ON (target_min > target_max); +if (WARN_ON (source_min >= source_max) || +WARN_ON (target_min > target_max)) +return target_min;/* defensive */ source_val =clamp (source_val, source_min, source_max);
drivers/gpu/drm/panthor/panthor_sched.c +1 -7
@@ -865,8 +865,7 @@ static void group_free_queue(struct panthor_group *group, struct panthor_queue *if (IS_ERR_OR_NULL (queue))return ; -if (queue->entity.fence_context) -drm_sched_entity_destroy (&queue->entity); +drm_sched_entity_destroy (&queue->entity);if (queue->scheduler.ops)drm_sched_fini (&queue->scheduler);
@@ -3458,11 +3457,6 @@ int panthor_group_destroy(struct panthor_file *pfile, u32 group_handle)if (!group)return -EINVAL ; -for (u32 i =0 ; i < group->queue_count; i++) { -if (group->queues[i]) -drm_sched_entity_destroy (&group->queues[i]->entity); - } -mutex_lock (&sched->reset.lock);mutex_lock (&sched->lock); group->destroyed = true;
drivers/hid/amd-sfh-hid/amd_sfh_client.c +10 -2
@@ -39,8 +39,12 @@ int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type)struct amdtp_hid_data *hid_data = hid->driver_data;struct amdtp_cl_data *cli_data = hid_data->cli_data;struct request_list *req_list = &cli_data->req_list; +struct amd_input_data *in_data = cli_data->in_data; +struct amd_mp2_dev *mp2;int i; + mp2 = container_of(in_data, struct amd_mp2_dev, in_data); +guard (mutex)(&mp2->lock);for (i =0 ; i < cli_data->num_hid_devices; i++) {if (cli_data->hid_sensor_hubs[i] == hid) {struct request_list *new =kzalloc (sizeof (*new),GFP_KERNEL );
@@ -75,6 +79,8 @@ void amd_sfh_work(struct work_struct *work)u8 report_id, node_type;u8 report_size =0 ; + mp2 = container_of(in_data, struct amd_mp2_dev, in_data); +guard (mutex)(&mp2->lock); req_node = list_last_entry(&req_list->list, struct request_list, list);list_del (&req_node->list); current_index = req_node->current_index;
@@ -83,7 +89,6 @@ void amd_sfh_work(struct work_struct *work) node_type = req_node->report_type;kfree (req_node); - mp2 = container_of(in_data, struct amd_mp2_dev, in_data); mp2_ops = mp2->mp2_ops;if (node_type ==HID_FEATURE_REPORT ) { report_size = mp2_ops->get_feat_rep(sensor_index, report_id,
@@ -107,6 +112,8 @@ void amd_sfh_work(struct work_struct *work) cli_data->cur_hid_dev = current_index; cli_data->sensor_requested_cnt[current_index] =0 ;amdtp_hid_wakeup (cli_data->hid_sensor_hubs[current_index]); +if (!list_empty (&req_list->list)) +schedule_delayed_work (&cli_data->work,0 ); }void amd_sfh_work_buffer (struct work_struct *work)
@@ -117,9 +124,10 @@ void amd_sfh_work_buffer(struct work_struct *work)u8 report_size;int i; + mp2 = container_of(in_data, struct amd_mp2_dev, in_data); +guard (mutex)(&mp2->lock);for (i =0 ; i < cli_data->num_hid_devices; i++) {if (cli_data->sensor_sts[i] ==SENSOR_ENABLED ) { - mp2 = container_of(in_data, struct amd_mp2_dev, in_data); report_size = mp2->mp2_ops->get_in_rep (i, cli_data->sensor_idx[i], cli_data->report_id[i], in_data); hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT,
drivers/hid/amd-sfh-hid/amd_sfh_common.h +3 -0
@@ -10,6 +10,7 @@#ifndef AMD_SFH_COMMON_H #define AMD_SFH_COMMON_H +#include <linux/mutex.h> #include <linux/pci.h> #include "amd_sfh_hid.h"
@@ -57,6 +58,8 @@ struct amd_mp2_dev {u32 mp2_acs;struct sfh_dev_status dev_en;struct work_struct work; +/* mp2 to protect data */ +struct mutex lock;u8 init_done;u8 rver; };
drivers/hid/amd-sfh-hid/amd_sfh_pcie.c +4 -0
@@ -405,6 +405,10 @@ static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *iif (!privdata->cl_data)return -ENOMEM ; + rc =devm_mutex_init (&pdev->dev, &privdata->lock); +if (rc) +return rc; + privdata->sfh1_1_ops = (const struct amd_sfh1_1_ops *)id->driver_data;if (privdata->sfh1_1_ops) {if (boot_cpu_data.x86 >=0x1A )
drivers/hid/hid-asus.c +3 -0
@@ -971,7 +971,10 @@ static int asus_input_mapping(struct hid_device *hdev,case 0xc4 :asus_map_key_clear (KEY_KBDILLUMUP );break ;case 0xc5 :asus_map_key_clear (KEY_KBDILLUMDOWN );break ;case 0xc7 :asus_map_key_clear (KEY_KBDILLUMTOGGLE );break ; +case 0x4e :asus_map_key_clear (KEY_FN_ESC );break ; +case 0x7e :asus_map_key_clear (KEY_EMOJI_PICKER );break ; +case 0x8b :asus_map_key_clear (KEY_PROG1 );break ;/* ProArt Creator Hub key */ case 0x6b :asus_map_key_clear (KEY_F21 );break ;/* ASUS touchpad toggle */ case 0x38 :asus_map_key_clear (KEY_PROG1 );break ;/* ROG key */ case 0xba :asus_map_key_clear (KEY_PROG2 );break ;/* Fn+C ASUS Splendid */
drivers/i2c/busses/i2c-designware-platdrv.c +5 -2
@@ -101,7 +101,7 @@ static int bt1_i2c_request_regs(struct dw_i2c_dev *dev) }#endif -static int txgbe_i2c_request_regs (struct dw_i2c_dev *dev) +static int dw_i2c_get_parent_regmap (struct dw_i2c_dev *dev) { dev->map =dev_get_regmap (dev->dev->parent,NULL );if (!dev->map)
@@ -123,12 +123,15 @@ static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)struct platform_device *pdev =to_platform_device (dev->dev);int ret; +if (device_is_compatible (dev->dev,"intel,xe-i2c" )) +return dw_i2c_get_parent_regmap (dev); +switch (dev->flags &MODEL_MASK ) {case MODEL_BAIKAL_BT1 : ret =bt1_i2c_request_regs (dev);break ;case MODEL_WANGXUN_SP : - ret =txgbe_i2c_request_regs (dev); + ret =dw_i2c_get_parent_regmap (dev);break ;default : dev->base =devm_platform_ioremap_resource (pdev,0 );
drivers/infiniband/hw/mlx5/devx.c +1 -0
@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode) {switch (opcode) {case MLX5_CMD_OP_CREATE_RQ : +case MLX5_CMD_OP_CREATE_RMP :return MLX5_EVENT_QUEUE_TYPE_RQ ;case MLX5_CMD_OP_CREATE_QP :return MLX5_EVENT_QUEUE_TYPE_QP ;
drivers/iommu/iommufd/fault.c +1 -3
@@ -415,7 +415,7 @@ int iommufd_fault_alloc(struct iommufd_ucmd *ucmd) fdno =get_unused_fd_flags (O_CLOEXEC );if (fdno <0 ) { rc = fdno; - goto out_fput; + goto out_abort; } cmd->out_fault_id = fault->obj.id;
@@ -431,8 +431,6 @@ int iommufd_fault_alloc(struct iommufd_ucmd *ucmd)return 0 ; out_put_fdno:put_unused_fd (fdno); -out_fput: -fput (filep); out_abort:iommufd_object_abort_and_destroy (ucmd->ictx, &fault->obj);
drivers/iommu/iommufd/main.c +31 -3
@@ -23,6 +23,7 @@#include "iommufd_test.h" struct iommufd_object_ops { +size_t file_offset;void (*destroy)(struct iommufd_object *obj);void (*abort)(struct iommufd_object *obj); };
@@ -97,10 +98,30 @@ void iommufd_object_abort(struct iommufd_ctx *ictx, struct iommufd_object *obj)void iommufd_object_abort_and_destroy (struct iommufd_ctx *ictx,struct iommufd_object *obj) { -if (iommufd_object_ops[obj->type].abort) - iommufd_object_ops[obj->type].abort (obj); +const struct iommufd_object_ops *ops = &iommufd_object_ops[obj->type]; + +if (ops->file_offset) { +struct file **filep = ((void *)obj) + ops->file_offset; + +/* +* A file should hold a users refcount while the file is open +* and put it back in its release. The file should hold a +* pointer to obj in their private data. Normal fput() is +* deferred to a workqueue and can get out of order with the +* following kfree(obj). Using the sync version ensures the +* release happens immediately. During abort we require the file +* refcount is one at this point - meaning the object alloc +* function cannot do anything to allow another thread to take a +* refcount prior to a guaranteed success. +*/ +if (*filep) +__fput_sync (*filep); + } + +if (ops->abort) + ops->abort (obj);else - iommufd_object_ops[obj->type].destroy (obj); + ops->destroy (obj);iommufd_object_abort (ictx, obj); }
@@ -498,6 +519,12 @@ void iommufd_ctx_put(struct iommufd_ctx *ictx) }EXPORT_SYMBOL_NS_GPL (iommufd_ctx_put,IOMMUFD ); +#define IOMMUFD_FILE_OFFSET (_struct, _filep, _obj) \ + .file_offset = (offsetof(_struct, _filep) + \ + BUILD_BUG_ON_ZERO(!__same_type( \ + struct file *, ((_struct *)NULL)->_filep)) + \ + BUILD_BUG_ON_ZERO(offsetof(_struct, _obj))) +static const struct iommufd_object_ops iommufd_object_ops[] = { [IOMMUFD_OBJ_ACCESS ] = { .destroy = iommufd_access_destroy_object,
@@ -518,6 +545,7 @@ static const struct iommufd_object_ops iommufd_object_ops[] = { }, [IOMMUFD_OBJ_FAULT ] = { .destroy = iommufd_fault_destroy, + IOMMUFD_FILE_OFFSET(struct iommufd_fault, filep, obj), }, #ifdef CONFIG_IOMMUFD_TEST [IOMMUFD_OBJ_SELFTEST] = {
drivers/mmc/host/sdhci-cadence.c +11 -0
@@ -433,6 +433,13 @@ static const struct sdhci_cdns_drv_data sdhci_elba_drv_data = { }, }; +static const struct sdhci_cdns_drv_data sdhci_eyeq_drv_data = { + .pltfm_data = { + .ops = &sdhci_cdns_ops, + .quirks2 =SDHCI_QUIRK2_PRESET_VALUE_BROKEN , + }, +}; +static const struct sdhci_cdns_drv_data sdhci_cdns_drv_data = { .pltfm_data = { .ops = &sdhci_cdns_ops,
@@ -595,6 +602,10 @@ static const struct of_device_id sdhci_cdns_match[] = { .compatible = "amd,pensando-elba-sd4hc", .data = &sdhci_elba_drv_data, }, + { + .compatible = "mobileye,eyeq-sd4hc", + .data = &sdhci_eyeq_drv_data, + }, { .compatible = "cdns,sd4hc" }, {/* sentinel */ } };
drivers/net/can/rcar/rcar_can.c +1 -7
@@ -861,7 +861,6 @@ static int __maybe_unused rcar_can_resume(struct device *dev) {struct net_device *ndev =dev_get_drvdata (dev);struct rcar_can_priv *priv =netdev_priv (ndev); -u16 ctlr;int err;if (!netif_running (ndev))
@@ -873,12 +872,7 @@ static int __maybe_unused rcar_can_resume(struct device *dev)return err; } - ctlr =readw (&priv->regs->ctlr); - ctlr &= ~RCAR_CAN_CTLR_SLPM ; -writew (ctlr, &priv->regs->ctlr); - ctlr &= ~RCAR_CAN_CTLR_CANM ; -writew (ctlr, &priv->regs->ctlr); - priv->can.state =CAN_STATE_ERROR_ACTIVE ; +rcar_can_start (ndev);netif_device_attach (ndev);netif_start_queue (ndev);
drivers/net/can/spi/hi311x.c +1 -0
@@ -813,6 +813,7 @@ static const struct net_device_ops hi3110_netdev_ops = { .ndo_open = hi3110_open, .ndo_stop = hi3110_stop, .ndo_start_xmit = hi3110_hard_start_xmit, + .ndo_change_mtu = can_change_mtu, };static const struct ethtool_ops hi3110_ethtool_ops = {
drivers/net/can/sun4i_can.c +1 -0
@@ -768,6 +768,7 @@ static const struct net_device_ops sun4ican_netdev_ops = { .ndo_open = sun4ican_open, .ndo_stop = sun4ican_close, .ndo_start_xmit = sun4ican_start_xmit, + .ndo_change_mtu = can_change_mtu, };static const struct ethtool_ops sun4ican_ethtool_ops = {
drivers/net/can/usb/etas_es58x/es58x_core.c +2 -1
@@ -7,7 +7,7 @@* * Copyright (c) 2019 Robert Bosch Engineering and Business Solutions. All rights reserved. * Copyright (c) 2020 ETAS K.K.. All rights reserved. -* Copyright (c) 2020-2022 Vincent Mailhol <[email protected]> +* Copyright (c) 2020-2025 Vincent Mailhol <[email protected]> */ #include <linux/unaligned.h>
@@ -1977,6 +1977,7 @@ static const struct net_device_ops es58x_netdev_ops = { .ndo_stop = es58x_stop, .ndo_start_xmit = es58x_start_xmit, .ndo_eth_ioctl = can_eth_ioctl_hwts, + .ndo_change_mtu = can_change_mtu, };static const struct ethtool_ops es58x_ethtool_ops = {
drivers/net/can/usb/mcba_usb.c +1 -0
@@ -761,6 +761,7 @@ static const struct net_device_ops mcba_netdev_ops = { .ndo_open = mcba_usb_open, .ndo_stop = mcba_usb_close, .ndo_start_xmit = mcba_usb_start_xmit, + .ndo_change_mtu = can_change_mtu, };static const struct ethtool_ops mcba_ethtool_ops = {
drivers/net/can/usb/peak_usb/pcan_usb_core.c +1 -1
@@ -111,7 +111,7 @@ void peak_usb_update_ts_now(struct peak_time_ref *time_ref, u32 ts_now)u32 delta_ts = time_ref->ts_dev_2 - time_ref->ts_dev_1;if (time_ref->ts_dev_2 < time_ref->ts_dev_1) - delta_ts &= (1 << time_ref->adapter->ts_used_bits) -1 ; + delta_ts &= (1ULL << time_ref->adapter->ts_used_bits) -1 ; time_ref->ts_total += delta_ts; }
drivers/net/dsa/lantiq_gswip.c +16 -5
@@ -685,18 +685,27 @@ static int gswip_add_single_port_br(struct gswip_priv *priv, int port, bool add)return 0 ; } -static int gswip_port_enable (struct dsa_switch *ds,int port, -struct phy_device *phydev) +static int gswip_port_setup (struct dsa_switch *ds,int port) {struct gswip_priv *priv = ds->priv;int err;if (!dsa_is_cpu_port (ds, port)) { -u32 mdio_phy =0 ; - err =gswip_add_single_port_br (priv, port, true);if (err)return err; + } + +return 0 ; +} + +static int gswip_port_enable (struct dsa_switch *ds,int port, +struct phy_device *phydev) +{ +struct gswip_priv *priv = ds->priv; + +if (!dsa_is_cpu_port (ds, port)) { +u32 mdio_phy =0 ;if (phydev) mdio_phy = phydev->mdio.addr &GSWIP_MDIO_PHY_ADDR_MASK ;
@@ -1359,8 +1368,9 @@ static int gswip_port_fdb(struct dsa_switch *ds, int port,int i;int err; +/* Operation not supported on the CPU port, don't throw errors */ if (!bridge) -return -EINVAL ; +return 0 ;for (i = max_ports; i <ARRAY_SIZE (priv->vlans); i++) {if (priv->vlans[i].bridge == bridge) {
@@ -1829,6 +1839,7 @@ static const struct phylink_mac_ops gswip_phylink_mac_ops = {static const struct dsa_switch_ops gswip_xrx200_switch_ops = { .get_tag_protocol = gswip_get_tag_protocol, .setup = gswip_setup, + .port_setup = gswip_port_setup, .port_enable = gswip_port_enable, .port_disable = gswip_port_disable, .port_bridge_join = gswip_port_bridge_join,
drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +1 -1
@@ -244,7 +244,7 @@ bnxt_tc_parse_pedit(struct bnxt *bp, struct bnxt_tc_actions *actions, offset < offset_of_ip6_daddr + 16) { actions->nat.src_xlate = false; idx = (offset - offset_of_ip6_daddr) / 4; - actions->nat.l3.ipv6.saddr.s6_addr32[idx] = htonl(val); + actions->nat.l3.ipv6.daddr.s6_addr32[idx] = htonl(val); } else { netdev_err(bp->dev, "%s: IPv6_hdr: Invalid pedit field\n",
drivers/net/ethernet/freescale/fec_main.c +2 -2
@@ -131,7 +131,7 @@ static const struct fec_devinfo fec_mvf600_info = { FEC_QUIRK_HAS_MDIO_C45, }; -static const struct fec_devinfo fec_imx6x_info = { +static const struct fec_devinfo fec_imx6sx_info = { .quirks =FEC_QUIRK_ENET_MAC |FEC_QUIRK_HAS_GBIT |FEC_QUIRK_HAS_BUFDESC_EX |FEC_QUIRK_HAS_CSUM | FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
@@ -196,7 +196,7 @@ static const struct of_device_id fec_dt_ids[] = { { .compatible = "fsl,imx28-fec", .data = &fec_imx28_info, }, { .compatible = "fsl,imx6q-fec", .data = &fec_imx6q_info, }, { .compatible = "fsl,mvf600-fec", .data = &fec_mvf600_info, }, - { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6x_info, }, + { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6sx_info, }, { .compatible = "fsl,imx6ul-fec", .data = &fec_imx6ul_info, }, { .compatible = "fsl,imx8mq-fec", .data = &fec_imx8mq_info, }, { .compatible = "fsl,imx8qm-fec", .data = &fec_imx8qm_info, },
drivers/net/ethernet/intel/i40e/i40e.h +2 -1
@@ -1277,7 +1277,8 @@ struct i40e_mac_filter *i40e_add_mac_filter(struct i40e_vsi *vsi, const u8 *macaddr);int i40e_del_mac_filter (struct i40e_vsi *vsi,const u8 *macaddr);bool i40e_is_vsi_in_vlan (struct i40e_vsi *vsi); -int i40e_count_filters (struct i40e_vsi *vsi); +int i40e_count_all_filters (struct i40e_vsi *vsi); +int i40e_count_active_filters (struct i40e_vsi *vsi);struct i40e_mac_filter *i40e_find_mac (struct i40e_vsi *vsi,const u8 *macaddr);void i40e_vlan_stripping_enable (struct i40e_vsi *vsi);static inline bool i40e_is_sw_dcb (struct i40e_pf *pf)
drivers/net/ethernet/intel/i40e/i40e_main.c +22 -4
@@ -1241,12 +1241,30 @@ void i40e_update_stats(struct i40e_vsi *vsi) }/** -* i40e_count_filters - counts VSI mac filters +* i40e_count_all_filters - counts VSI MAC filters * @vsi: the VSI to be searched * -* Returns count of mac filters -**/ -int i40e_count_filters (struct i40e_vsi *vsi) +* Return: count of MAC filters in any state. +*/ +int i40e_count_all_filters (struct i40e_vsi *vsi) +{ +struct i40e_mac_filter *f; +struct hlist_node *h; +int bkt, cnt =0 ; + +hash_for_each_safe (vsi->mac_filter_hash, bkt, h, f, hlist) + cnt++; + +return cnt; +} + +/** +* i40e_count_active_filters - counts VSI MAC filters +* @vsi: the VSI to be searched +* +* Return: count of active MAC filters. +*/ +int i40e_count_active_filters (struct i40e_vsi *vsi) {struct i40e_mac_filter *f;struct hlist_node *h;
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +64 -46
213 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h +2 -1
@@ -41,7 +41,8 @@ enum i40e_vf_states {I40E_VF_STATE_MC_PROMISC ,I40E_VF_STATE_UC_PROMISC ,I40E_VF_STATE_PRE_ENABLE , - I40E_VF_STATE_RESETTING +I40E_VF_STATE_RESETTING , + I40E_VF_STATE_RESOURCES_LOADED, };/* VF capabilities */
drivers/net/ethernet/marvell/octeontx2/af/cgx.c +1 -2
@@ -21,8 +21,7 @@#include "rvu.h" #include "lmac_common.h" -#define DRV_NAME "Marvell-CGX/RPM" -#define DRV_STRING "Marvell CGX/RPM Driver" +#define DRV_NAME "Marvell-CGX-RPM"#define CGX_RX_STAT_GLOBAL_INDEX 9
drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c +1 -1
@@ -1319,7 +1319,6 @@ static int otx2_tc_add_flow(struct otx2_nic *nic, free_leaf:otx2_tc_del_from_flow_list (flow_cfg, new_node); -kfree_rcu (new_node, rcu);if (new_node->is_act_police) {mutex_lock (&nic->mbox.lock);
@@ -1339,6 +1338,7 @@ static int otx2_tc_add_flow(struct otx2_nic *nic,mutex_unlock (&nic->mbox.lock); } +kfree_rcu (new_node, rcu);return rc; }
drivers/net/phy/sfp.c +23 -1
@@ -360,6 +360,11 @@ static void sfp_fixup_ignore_tx_fault(struct sfp *sfp) sfp->state_ignore_mask |=SFP_F_TX_FAULT ; } +static void sfp_fixup_ignore_hw (struct sfp *sfp,unsigned int mask) +{ + sfp->state_hw_mask &= ~mask; +} +static void sfp_fixup_nokia (struct sfp *sfp) {sfp_fixup_long_startup (sfp);
@@ -408,7 +413,19 @@ static void sfp_fixup_halny_gsfp(struct sfp *sfp)* these are possibly used for other purposes on this * module, e.g. a serial port. */ - sfp->state_hw_mask &= ~(SFP_F_TX_FAULT |SFP_F_LOS ); +sfp_fixup_ignore_hw (sfp,SFP_F_TX_FAULT |SFP_F_LOS ); +} + +static void sfp_fixup_potron (struct sfp *sfp) +{ +/* +* The TX_FAULT and LOS pins on this device are used for serial +* communication, so ignore them. Additionally, provide extra +* time for this device to fully start up. +*/ + +sfp_fixup_long_startup (sfp); +sfp_fixup_ignore_hw (sfp,SFP_F_TX_FAULT |SFP_F_LOS ); }static void sfp_fixup_rollball_cc (struct sfp *sfp)
@@ -474,6 +491,9 @@ static const struct sfp_quirk sfp_quirks[] = {SFP_QUIRK ("ALCATELLUCENT" ,"3FE46541AA" , sfp_quirk_2500basex, sfp_fixup_nokia), +// FLYPRO SFP-10GT-CS-30M uses Rollball protocol to talk to the PHY. + SFP_QUIRK_F("FLYPRO", "SFP-10GT-CS-30M", sfp_fixup_rollball), +// Fiberstore SFP-10G-T doesn't identify as copper, uses the Rollball // protocol to talk to the PHY and needs 4 sec wait before probing the // PHY.
@@ -511,6 +531,8 @@ static const struct sfp_quirk sfp_quirks[] = {SFP_QUIRK_F ("Walsun" ,"HXSX-ATRC-1" , sfp_fixup_fs_10gt),SFP_QUIRK_F ("Walsun" ,"HXSX-ATRI-1" , sfp_fixup_fs_10gt), +SFP_QUIRK_F ("YV" ,"SFP+ONU-XGSPON" , sfp_fixup_potron), +// OEM SFP-GE-T is a 1000Base-T module with broken TX_FAULT indicator SFP_QUIRK_F("OEM", "SFP-GE-T", sfp_fixup_ignore_tx_fault),
drivers/net/tun.c +3 -0
@@ -1932,6 +1932,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,local_bh_enable (); goto unlock_frags; } + +if (frags && skb != tfile->napi.skb) + tfile->napi.skb = skb; }rcu_read_unlock ();local_bh_enable ();
drivers/net/wireless/virtual/virt_wifi.c +3 -1
@@ -277,7 +277,9 @@ static void virt_wifi_connect_complete(struct work_struct *work) priv->is_connected = true;/* Schedules an event that acquires the rtnl lock. */ -cfg80211_connect_result (priv->upperdev, requested_bss,NULL ,0 ,NULL ,0 , +cfg80211_connect_result (priv->upperdev, + priv->is_connected ? fake_router_bssid :NULL , +NULL ,0 ,NULL ,0 , status,GFP_KERNEL );netif_carrier_on (priv->upperdev); }
drivers/platform/x86/lg-laptop.c +14 -20
@@ -8,6 +8,7 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt#include <linux/acpi.h> +#include <linux/bitfield.h> #include <linux/bits.h> #include <linux/device.h> #include <linux/dev_printk.h>
@@ -75,6 +76,9 @@ MODULE_PARM_DESC(fw_debug, "Enable printing of firmware debug messages");#define WMBB_USB_CHARGE 0x10B#define WMBB_BATT_LIMIT 0x10C +#define FAN_MODE_LOWER GENMASK(1, 0) +#define FAN_MODE_UPPER GENMASK(5, 4) +#define PLATFORM_NAME "lg-laptop"MODULE_ALIAS ("wmi:" WMI_EVENT_GUID0 );
@@ -274,29 +278,19 @@ static ssize_t fan_mode_store(struct device *dev,struct device_attribute *attr, const char *buffer, size_t count) { - bool value; + unsigned long value;union acpi_object *r; -u32 m;int ret; - ret =kstrtobool (buffer, &value); + ret =kstrtoul (buffer,10 , &value);if (ret)return ret; +if (value >=3 ) +return -EINVAL ; - r =lg_wmab (dev,WM_FAN_MODE ,WM_GET ,0 ); -if (!r) -return -EIO ; - -if (r->type !=ACPI_TYPE_INTEGER ) { -kfree (r); -return -EIO ; - } - - m = r->integer.value; -kfree (r); - r =lg_wmab (dev,WM_FAN_MODE ,WM_SET , (m &0xffffff0f ) | (value <<4 )); -kfree (r); - r =lg_wmab (dev,WM_FAN_MODE ,WM_SET , (m &0xfffffff0 ) | value); + r =lg_wmab (dev,WM_FAN_MODE ,WM_SET , +FIELD_PREP (FAN_MODE_LOWER , value) | +FIELD_PREP (FAN_MODE_UPPER , value));kfree (r);return count;
@@ -305,7 +299,7 @@ static ssize_t fan_mode_store(struct device *dev,static ssize_t fan_mode_show (struct device *dev,struct device_attribute *attr,char *buffer) { -unsigned int status; +unsigned int mode;union acpi_object *r; r =lg_wmab (dev,WM_FAN_MODE ,WM_GET ,0 );
@@ -317,10 +311,10 @@ static ssize_t fan_mode_show(struct device *dev,return -EIO ; } - status = r->integer.value &0x01 ; + mode =FIELD_GET (FAN_MODE_LOWER , r->integer.value);kfree (r); -return sysfs_emit (buffer,"%d\n" , status); +return sysfs_emit (buffer,"%d\n" , mode); } static ssize_t usb_charge_store(struct device *dev,
drivers/ufs/core/ufs-mcq.c +2 -2
@@ -243,7 +243,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba) hwq->sqe_base_addr =dmam_alloc_coherent (hba->dev, utrdl_size, &hwq->sqe_dma_addr,GFP_KERNEL ); -if (!hwq->sqe_dma_addr) { +if (!hwq->sqe_base_addr) {dev_err (hba->dev,"SQE allocation failed\n" );return -ENOMEM ; }
@@ -252,7 +252,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba) hwq->cqe_base_addr =dmam_alloc_coherent (hba->dev, cqe_size, &hwq->cqe_dma_addr,GFP_KERNEL ); -if (!hwq->cqe_dma_addr) { +if (!hwq->cqe_base_addr) {dev_err (hba->dev,"CQE allocation failed\n" );return -ENOMEM ; }
drivers/usb/core/quirks.c +1 -1
@@ -734,7 +734,7 @@ void usb_detect_quirks(struct usb_device *udev) udev->quirks ^=usb_detect_dynamic_quirks (udev);if (udev->quirks) -dev_dbg (&udev->dev,"USB quirks for this device: %x\n" , +dev_dbg (&udev->dev,"USB quirks for this device: 0x%x\n" , udev->quirks);#ifdef CONFIG_USB_DEFAULT_PERSIST
drivers/usb/host/xhci-dbgcap.c +1 -1
@@ -458,7 +458,7 @@ static void xhci_dbc_ring_init(struct xhci_ring *ring) trb->link.segment_ptr =cpu_to_le64 (ring->first_seg->dma); trb->link.control =cpu_to_le32 (LINK_TOGGLE |TRB_TYPE (TRB_LINK )); } -xhci_initialize_ring_info (ring); +xhci_initialize_ring_info (ring,1 ); }static int xhci_dbc_reinit_ep_rings (struct xhci_dbc *dbc)
drivers/usb/host/xhci-mem.c +27 -23
158 lines not on this page · raw message
drivers/usb/host/xhci.c +1 -1
@@ -769,7 +769,7 @@ static void xhci_clear_command_ring(struct xhci_hcd *xhci) seg->trbs[TRBS_PER_SEGMENT -1 ].link.control &=cpu_to_le32 (~TRB_CYCLE ); } -xhci_initialize_ring_info (ring); +xhci_initialize_ring_info (ring,1 );/* * Reset the hardware dequeue pointer. * Yes, this will need to be re-written after resume, but we're paranoid
drivers/usb/host/xhci.h +4 -2
@@ -1803,12 +1803,14 @@ void xhci_slot_copy(struct xhci_hcd *xhci,int xhci_endpoint_init (struct xhci_hcd *xhci,struct xhci_virt_device *virt_dev,struct usb_device *udev,struct usb_host_endpoint *ep,gfp_t mem_flags); -struct xhci_ring *xhci_ring_alloc (struct xhci_hcd *xhci,unsigned int num_segs, +struct xhci_ring *xhci_ring_alloc (struct xhci_hcd *xhci, +unsigned int num_segs,unsigned int cycle_state,enum xhci_ring_type type,unsigned int max_packet,gfp_t flags);void xhci_ring_free (struct xhci_hcd *xhci,struct xhci_ring *ring);int xhci_ring_expansion (struct xhci_hcd *xhci,struct xhci_ring *ring,unsigned int num_trbs,gfp_t flags); -void xhci_initialize_ring_info (struct xhci_ring *ring); +void xhci_initialize_ring_info (struct xhci_ring *ring, +unsigned int cycle_state);void xhci_free_endpoint_ring (struct xhci_hcd *xhci,struct xhci_virt_device *virt_dev,unsigned int ep_index);
drivers/video/fbdev/core/fbcon.c +10 -3
@@ -2492,7 +2492,7 @@ static int fbcon_set_font(struct vc_data *vc, const struct console_font *font,unsigned charcount = font->charcount;int w = font->width;int h = font->height; -int size; +int size, alloc_size;int i, csum;u8 *new_data, *data = font->data;int pitch =PITCH (font->width);
@@ -2519,9 +2519,16 @@ static int fbcon_set_font(struct vc_data *vc, const struct console_font *font,if (fbcon_invalid_charcount (info, charcount))return -EINVAL ; - size =CALC_FONTSZ (h, pitch, charcount); +/* Check for integer overflow in font size calculation */ +if (check_mul_overflow (h, pitch, &size) || +check_mul_overflow (size, charcount, &size)) +return -EINVAL ; + +/* Check for overflow in allocation size calculation */ +if (check_add_overflow (FONT_EXTRA_WORDS *sizeof (int ), size, &alloc_size)) +return -EINVAL ; - new_data =kmalloc (FONT_EXTRA_WORDS *sizeof (int ) + size,GFP_USER ); + new_data =kmalloc (alloc_size,GFP_USER );if (!new_data)return -ENOMEM ;
fs/afs/server.c +2 -1
@@ -394,13 +394,14 @@ struct afs_server *afs_use_server(struct afs_server *server, enum afs_server_travoid afs_put_server (struct afs_net *net,struct afs_server *server,enum afs_server_trace reason) { -unsigned int a, debug_id = server->debug_id; +unsigned int a, debug_id;bool zero;int r;if (!server)return ; + debug_id = server->debug_id; a =atomic_read (&server->active); zero =__refcount_dec_and_test (&server->ref, &r);trace_afs_server (debug_id, r -1 , a, reason);
fs/btrfs/volumes.c +5 -0
@@ -2699,6 +2699,11 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path goto error; } +if (bdev_nr_bytes (file_bdev (bdev_file)) <=BTRFS_DEVICE_RANGE_RESERVED ) { + ret = -EINVAL ; + goto error; + } +if (fs_devices->seeding) { seeding_dev = true;down_write (&sb->s_umount);
fs/hugetlbfs/inode.c +6 -4
@@ -594,14 +594,16 @@ static bool remove_inode_single_folio(struct hstate *h, struct inode *inode,/* * If folio is mapped, it was faulted in after being -* unmapped in caller. Unmap (again) while holding -* the fault mutex. The mutex will prevent faults -* until we finish removing the folio. +* unmapped in caller or hugetlb_vmdelete_list() skips +* unmapping it due to fail to grab lock. Unmap (again) +* while holding the fault mutex. The mutex will prevent +* faults until we finish removing the folio. Hold folio +* lock to guarantee no concurrent migration. */ +folio_lock (folio);if (unlikely (folio_mapped (folio)))hugetlb_unmap_file_folio (h, mapping, folio, index); -folio_lock (folio);/* * We must remove the folio from page cache before removing * the region/ reserve map (hugetlb_unreserve_pages). In
fs/proc/task_mmu.c +3 -0
@@ -2259,6 +2259,9 @@ static void pagemap_scan_backout_range(struct pagemap_scan_private *p, {struct page_region *cur_buf = &p->vec_buf[p->vec_buf_index]; +if (!p->vec_buf) +return ; +if (cur_buf->start != addr) cur_buf->end = addr;else
fs/smb/client/smb2inode.c +1 -1
@@ -641,7 +641,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, tmp_rc = rc;for (i =0 ; i < num_cmds; i++) { -char *buf = rsp_iov[i + i].iov_base; +char *buf = rsp_iov[i +1 ].iov_base;if (buf && resp_buftype[i +1 ] !=CIFS_NO_BUFFER ) rc = server->ops->map_error (buf, false);
fs/smb/server/transport_rdma.c +10 -12
@@ -147,7 +147,7 @@ struct smb_direct_transport {wait_queue_head_t wait_send_pending;atomic_t send_pending; -struct delayed_work post_recv_credits_work; +struct work_struct post_recv_credits_work;struct work_struct send_immediate_work;struct work_struct disconnect_work;
@@ -366,8 +366,8 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)spin_lock_init (&t->lock_new_recv_credits); -INIT_DELAYED_WORK (&t->post_recv_credits_work, - smb_direct_post_recv_credits); +INIT_WORK (&t->post_recv_credits_work, + smb_direct_post_recv_credits);INIT_WORK (&t->send_immediate_work, smb_direct_send_immediate_work);INIT_WORK (&t->disconnect_work, smb_direct_disconnect_rdma_work);
@@ -398,9 +398,9 @@ static void free_transport(struct smb_direct_transport *t)wait_event (t->wait_send_pending,atomic_read (&t->send_pending) ==0 ); -cancel_work_sync (&t->disconnect_work); -cancel_delayed_work_sync (&t->post_recv_credits_work); -cancel_work_sync (&t->send_immediate_work); +disable_work_sync (&t->disconnect_work); +disable_work_sync (&t->post_recv_credits_work); +disable_work_sync (&t->send_immediate_work);if (t->qp) {ib_drain_qp (t->qp);
@@ -614,8 +614,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)wake_up_interruptible (&t->wait_send_credits);if (is_receive_credit_post_required (receive_credits, avail_recvmsg_count)) -mod_delayed_work (smb_direct_wq, - &t->post_recv_credits_work,0 ); +queue_work (smb_direct_wq, &t->post_recv_credits_work);if (data_length) {enqueue_reassembly (t, recvmsg, (int )data_length);
@@ -772,8 +771,7 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf, st->count_avail_recvmsg += queue_removed;if (is_receive_credit_post_required (st->recv_credits, st->count_avail_recvmsg)) {spin_unlock (&st->receive_credit_lock); -mod_delayed_work (smb_direct_wq, - &st->post_recv_credits_work,0 ); +queue_work (smb_direct_wq, &st->post_recv_credits_work); }else {spin_unlock (&st->receive_credit_lock); }
@@ -800,7 +798,7 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf,static void smb_direct_post_recv_credits (struct work_struct *work) {struct smb_direct_transport *t =container_of (work, - struct smb_direct_transport, post_recv_credits_work.work); + struct smb_direct_transport, post_recv_credits_work);struct smb_direct_recvmsg *recvmsg;int receive_credits, credits =0 ;int ret;
@@ -1681,7 +1679,7 @@ static int smb_direct_prepare_negotiation(struct smb_direct_transport *t) goto out_err; } -smb_direct_post_recv_credits (&t->post_recv_credits_work.work); +smb_direct_post_recv_credits (&t->post_recv_credits_work);return 0 ; out_err:put_recvmsg (t, recvmsg);
include/crypto/if_alg.h +1 -1
@@ -152,7 +152,7 @@ struct af_alg_ctx {size_t used;atomic_t rcvused; - u32 more:1, + bool more:1, merge:1, enc:1, write:1,
include/linux/firmware/imx/sm.h +12 -0
@@ -17,7 +17,19 @@#define SCMI_IMX_CTRL_SAI4_MCLK 4/* WAKE SAI4 MCLK */ #define SCMI_IMX_CTRL_SAI5_MCLK 5/* WAKE SAI5 MCLK */ +#if IS_ENABLED (CONFIG_IMX_SCMI_MISC_DRV )int scmi_imx_misc_ctrl_get (u32 id,u32 *num,u32 *val);int scmi_imx_misc_ctrl_set (u32 id,u32 val); +#else +static inline int scmi_imx_misc_ctrl_get (u32 id,u32 *num,u32 *val) +{ +return -EOPNOTSUPP ; +} + +static inline int scmi_imx_misc_ctrl_set (u32 id,u32 val) +{ +return -EOPNOTSUPP ; +} +#endif #endif
include/linux/swap.h +10 -0
@@ -382,6 +382,16 @@ void folio_add_lru_vma(struct folio *, struct vm_area_struct *);void mark_page_accessed (struct page *);void folio_mark_accessed (struct folio *); +static inline bool folio_may_be_lru_cached (struct folio *folio) +{ +/* +* Holding PMD-sized folios in per-CPU LRU cache unbalances accounting. +* Holding small numbers of low-order mTHP folios in per-CPU LRU cache +* will be sensible, but nobody has implemented and tested that yet. +*/ +return !folio_test_large (folio); +} +extern atomic_t lru_disable_count;static inline bool lru_cache_disabled (void )
include/net/bluetooth/hci_core.h +21 -0
@@ -1203,6 +1203,27 @@ static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,return NULL ; } +static inline struct hci_conn *hci_conn_hash_lookup_role (struct hci_dev *hdev, +__u8 type,__u8 role, +bdaddr_t *ba) +{ +struct hci_conn_hash *h = &hdev->conn_hash; +struct hci_conn *c; + +rcu_read_lock (); + +list_for_each_entry_rcu (c, &h->list, list) { +if (c->type == type && c->role == role && !bacmp (&c->dst, ba)) { +rcu_read_unlock (); +return c; + } + } + +rcu_read_unlock (); + +return NULL ; +} +static inline struct hci_conn *hci_conn_hash_lookup_le (struct hci_dev *hdev,bdaddr_t *ba,__u8 ba_type)
kernel/bpf/core.c +4 -1
@@ -2953,7 +2953,10 @@ EXPORT_SYMBOL_GPL(bpf_event_output);/* Always built-in helper functions. */ const struct bpf_func_proto bpf_tail_call_proto = { - .func =NULL , +/* func is unused for tail_call, we set it to pass the +* get_helper_proto check +*/ + .func =BPF_PTR_POISON , .gpl_only = false, .ret_type =RET_VOID , .arg1_type =ARG_PTR_TO_CTX ,
kernel/bpf/verifier.c +5 -1
@@ -7799,6 +7799,10 @@ static int process_timer_func(struct bpf_verifier_env *env, int regno,verbose (env,"verifier bug. Two map pointers in a timer helper\n" );return -EFAULT ; } +if (IS_ENABLED (CONFIG_PREEMPT_RT )) { +verbose (env,"bpf_timer cannot be used for PREEMPT_RT.\n" ); +return -EOPNOTSUPP ; + } meta->map_uid = reg->map_uid; meta->map_ptr = map;return 0 ;
@@ -10465,7 +10469,7 @@ static int get_helper_proto(struct bpf_verifier_env *env, int func_id,return -EINVAL ; *ptr = env->ops->get_func_proto (func_id, env->prog); -return *ptr ?0 : -EINVAL ; +return *ptr && (*ptr)->func ?0 : -EINVAL ; } static int check_helper_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
kernel/futex/requeue.c +4 -2
@@ -225,18 +225,20 @@ static inlinevoid requeue_pi_wake_futex (struct futex_q *q,union futex_key *key,struct futex_hash_bucket *hb) { - q->key = *key; +struct task_struct *task; + q->key = *key;__futex_unqueue (q);WARN_ON (!q->rt_waiter); q->rt_waiter =NULL ; q->lock_ptr = &hb->lock; + task =READ_ONCE (q->task);/* Signal locked state to the waiter */ futex_requeue_pi_complete (q,1 ); -wake_up_state (q->task,TASK_NORMAL ); +wake_up_state (task,TASK_NORMAL ); }/**
kernel/trace/trace_dynevent.c +4 -0
@@ -239,6 +239,10 @@ static int dyn_event_open(struct inode *inode, struct file *file) {int ret; + ret =security_locked_down (LOCKDOWN_TRACEFS ); +if (ret) +return ret; + ret =tracing_check_open_get_tr (NULL );if (ret)return ret;
kernel/vhost_task.c +2 -1
@@ -100,6 +100,7 @@ void vhost_task_stop(struct vhost_task *vtsk)* freeing it below. */ wait_for_completion (&vtsk->exited); +put_task_struct (vtsk->task);kfree (vtsk); }EXPORT_SYMBOL_GPL (vhost_task_stop);
@@ -148,7 +149,7 @@ struct vhost_task *vhost_task_create(bool (*fn)(void *),return ERR_PTR (PTR_ERR (tsk)); } - vtsk->task = tsk; + vtsk->task =get_task_struct (tsk);return vtsk; }EXPORT_SYMBOL_GPL (vhost_task_create);
mm/gup.c +11 -4
@@ -2356,8 +2356,8 @@ static unsigned long collect_longterm_unpinnable_folios( struct pages_or_folios *pofs) {unsigned long collected =0 ; -bool drain_allow = true;struct folio *folio; +int drained =0 ;long i =0 ; for (folio = pofs_get_folio(pofs, i); folio;
@@ -2376,10 +2376,17 @@ static unsigned long collect_longterm_unpinnable_folios(continue ; } -if (drain_allow &&folio_ref_count (folio) != -folio_expected_ref_count (folio) +1 ) { +if (drained ==0 &&folio_may_be_lru_cached (folio) && +folio_ref_count (folio) != +folio_expected_ref_count (folio) +1 ) { +lru_add_drain (); + drained =1 ; + } +if (drained ==1 &&folio_may_be_lru_cached (folio) && +folio_ref_count (folio) != +folio_expected_ref_count (folio) +1 ) {lru_add_drain_all (); - drain_allow = false; + drained =2 ; }if (!folio_isolate_lru (folio))
mm/kmsan/core.c +7 -3
@@ -195,7 +195,8 @@ void kmsan_internal_set_shadow_origin(void *addr, size_t size, int b, u32 origin, bool checked) {u64 address = (u64 )addr; -u32 *shadow_start, *origin_start; +void *shadow_start; +u32 *aligned_shadow, *origin_start;size_t pad =0 ;KMSAN_WARN_ON (!kmsan_metadata_is_contiguous (addr, size));
@@ -214,9 +215,12 @@ void kmsan_internal_set_shadow_origin(void *addr, size_t size, int b, }__memset (shadow_start, b, size); -if (!IS_ALIGNED (address,KMSAN_ORIGIN_SIZE )) { +if (IS_ALIGNED (address,KMSAN_ORIGIN_SIZE )) { + aligned_shadow = shadow_start; + }else { pad = address %KMSAN_ORIGIN_SIZE ; address -= pad; + aligned_shadow = shadow_start - pad; size += pad; } size =ALIGN (size,KMSAN_ORIGIN_SIZE );
@@ -230,7 +234,7 @@ void kmsan_internal_set_shadow_origin(void *addr, size_t size, int b,* corresponding shadow slot is zero. */ for (int i =0 ; i < size /KMSAN_ORIGIN_SIZE ; i++) { -if (origin || !shadow_start[i]) +if (origin || !aligned_shadow[i]) origin_start[i] = origin; } }
mm/kmsan/kmsan_test.c +16 -0
@@ -556,6 +556,21 @@ DEFINE_TEST_MEMSETXX(16) DEFINE_TEST_MEMSETXX(32)DEFINE_TEST_MEMSETXX (64 ) +/* Test case: ensure that KMSAN does not access shadow memory out of bounds. */ +static void test_memset_on_guarded_buffer (struct kunit *test) +{ +void *buf =vmalloc (PAGE_SIZE ); + +kunit_info (test, +"memset() on ends of guarded buffer should not crash\n" ); + +for (size_t size =0 ; size <=128 ; size++) { +memset (buf,0xff , size); +memset (buf +PAGE_SIZE - size,0xff , size); + } +vfree (buf); +} + static noinline void fibonacci(int *array, int size, int start) {if (start <2 || (start == size))
@@ -661,6 +676,7 @@ static struct kunit_case kmsan_test_cases[] = {KUNIT_CASE (test_memset16),KUNIT_CASE (test_memset32),KUNIT_CASE (test_memset64), +KUNIT_CASE (test_memset_on_guarded_buffer),KUNIT_CASE (test_long_origin_chain),KUNIT_CASE (test_stackdepot_roundtrip), KUNIT_CASE(test_unpoison_memory),
mm/mlock.c +3 -3
@@ -255,7 +255,7 @@ void mlock_folio(struct folio *folio)folio_get (folio);if (!folio_batch_add (fbatch,mlock_lru (folio)) || -folio_test_large (folio) ||lru_cache_disabled ()) + !folio_may_be_lru_cached (folio) ||lru_cache_disabled ())mlock_folio_batch (fbatch);local_unlock (&mlock_fbatch.lock); }
@@ -278,7 +278,7 @@ void mlock_new_folio(struct folio *folio)folio_get (folio);if (!folio_batch_add (fbatch,mlock_new (folio)) || -folio_test_large (folio) ||lru_cache_disabled ()) + !folio_may_be_lru_cached (folio) ||lru_cache_disabled ())mlock_folio_batch (fbatch);local_unlock (&mlock_fbatch.lock); }
@@ -299,7 +299,7 @@ void munlock_folio(struct folio *folio)*/ folio_get (folio);if (!folio_batch_add (fbatch, folio) || -folio_test_large (folio) ||lru_cache_disabled ()) + !folio_may_be_lru_cached (folio) ||lru_cache_disabled ())mlock_folio_batch (fbatch);local_unlock (&mlock_fbatch.lock); }
mm/swap.c +27 -24
125 lines not on this page · raw message
net/bluetooth/hci_event.c +23 -3
@@ -3050,8 +3050,18 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data,hci_dev_lock (hdev); +/* Check for existing connection: +* +* 1. If it doesn't exist then it must be receiver/slave role. +* 2. If it does exist confirm that it is connecting/BT_CONNECT in case +* of initiator/master role since there could be a collision where +* either side is attempting to connect or something like a fuzzing +* testing is trying to play tricks to destroy the hcon object before +* it even attempts to connect (e.g. hcon->state == BT_OPEN). +*/ conn =hci_conn_hash_lookup_ba (hdev, ev->link_type, &ev->bdaddr); -if (!conn) { +if (!conn || + (conn->role ==HCI_ROLE_MASTER && conn->state !=BT_CONNECT )) {/* In case of error status and there is no connection pending * just unlock as there is nothing to cleanup. */
@@ -5618,8 +5628,18 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,*/ hci_dev_clear_flag (hdev,HCI_LE_ADV ); - conn =hci_conn_hash_lookup_ba (hdev,LE_LINK , bdaddr); -if (!conn) { +/* Check for existing connection: +* +* 1. If it doesn't exist then use the role to create a new object. +* 2. If it does exist confirm that it is connecting/BT_CONNECT in case +* of initiator/master role since there could be a collision where +* either side is attempting to connect or something like a fuzzing +* testing is trying to play tricks to destroy the hcon object before +* it even attempts to connect (e.g. hcon->state == BT_OPEN). +*/ + conn =hci_conn_hash_lookup_role (hdev,LE_LINK , role, bdaddr); +if (!conn || + (conn->role ==HCI_ROLE_MASTER && conn->state !=BT_CONNECT )) {/* In case of error status and there is no connection pending * just unlock as there is nothing to cleanup. */
net/bluetooth/hci_sync.c +7 -0
@@ -2604,6 +2604,13 @@ static int hci_resume_advertising_sync(struct hci_dev *hdev)hci_remove_ext_adv_instance_sync (hdev, adv->instance,NULL ); } + +/* If current advertising instance is set to instance 0x00 +* then we need to re-enable it. +*/ +if (!hdev->cur_adv_instance) + err =hci_enable_ext_advertising_sync (hdev, + hdev->cur_adv_instance); }else {/* Schedule for most recent instance to be restarted and begin * the software rotation loop
net/core/skbuff.c +1 -1
@@ -6603,7 +6603,7 @@ struct sk_buff *alloc_skb_with_frags(unsigned long header_len,return NULL ;while (data_len) { -if (nr_frags ==MAX_SKB_FRAGS -1 ) +if (nr_frags ==MAX_SKB_FRAGS ) goto failure;while (order &&PAGE_ALIGN (data_len) < (PAGE_SIZE << order)) order--;
net/ipv4/nexthop.c +7 -0
@@ -2375,6 +2375,13 @@ static int replace_nexthop_single(struct net *net, struct nexthop *old,return -EINVAL ; } +if (!list_empty (&old->grp_list) && +rtnl_dereference (new->nh_info)->fdb_nh != +rtnl_dereference (old->nh_info)->fdb_nh) { +NL_SET_ERR_MSG (extack,"Cannot change nexthop FDB status while in a group" ); +return -EINVAL ; + } + err =call_nexthop_notifiers (net,NEXTHOP_EVENT_REPLACE , new, extack);if (err)return err;
net/smc/smc_loopback.c +9 -5
@@ -56,6 +56,7 @@ static int smc_lo_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb, {struct smc_lo_dmb_node *dmb_node, *tmp_node;struct smc_lo_dev *ldev = smcd->priv; +struct folio *folio;int sba_idx, rc;/* check space for new dmb */
@@ -74,13 +75,16 @@ static int smc_lo_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb, dmb_node->sba_idx = sba_idx; dmb_node->len = dmb->dmb_len; - dmb_node->cpu_addr =kzalloc (dmb_node->len,GFP_KERNEL | - __GFP_NOWARN | __GFP_NORETRY | - __GFP_NOMEMALLOC); -if (!dmb_node->cpu_addr) { + +/* not critical; fail under memory pressure and fallback to TCP */ + folio =folio_alloc (GFP_KERNEL | __GFP_NOWARN | __GFP_NOMEMALLOC | + __GFP_NORETRY | __GFP_ZERO, +get_order (dmb_node->len)); +if (!folio) { rc = -ENOMEM ; goto err_node; } + dmb_node->cpu_addr =folio_address (folio); dmb_node->dma_addr =SMC_DMA_ADDR_INVALID ;refcount_set (&dmb_node->refcnt,1 );
@@ -122,7 +126,7 @@ static void __smc_lo_unregister_dmb(struct smc_lo_dev *ldev,write_unlock_bh (&ldev->dmb_ht_lock);clear_bit (dmb_node->sba_idx, ldev->sba_idx_mask); -kvfree (dmb_node->cpu_addr); +folio_put (virt_to_folio (dmb_node->cpu_addr));kfree (dmb_node);if (atomic_dec_and_test (&ldev->dmb_cnt))
net/xfrm/xfrm_state.c +3 -0
@@ -2502,6 +2502,8 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high,for (h =0 ; h < range; h++) {u32 spi = (low == high) ? low :get_random_u32_inclusive (low, high); +if (spi ==0 ) + goto next; newspi =htonl (spi);spin_lock_bh (&net->xfrm.xfrm_state_lock);
@@ -2517,6 +2519,7 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high,xfrm_state_put (x0);spin_unlock_bh (&net->xfrm.xfrm_state_lock); +next:if (signal_pending (current)) { err = -ERESTARTSYS ; goto unlock;
sound/pci/hda/patch_realtek.c +11 -0
@@ -7272,6 +7272,11 @@ static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixucomp_generic_fixup (codec, action,"spi" ,"CSC3551" ,"-%s:00-cs35l41-hda.%d" ,2 ); } +static void cs35l41_fixup_spi_one (struct hda_codec *codec,const struct hda_fixup *fix,int action) +{ +comp_generic_fixup (codec, action,"spi" ,"CSC3551" ,"-%s:00-cs35l41-hda.%d" ,1 ); +} +static void cs35l41_fixup_spi_four (struct hda_codec *codec,const struct hda_fixup *fix,int action) {comp_generic_fixup (codec, action,"spi" ,"CSC3551" ,"-%s:00-cs35l41-hda.%d" ,4 );
@@ -7956,6 +7961,7 @@ enum {ALC287_FIXUP_CS35L41_I2C_2 ,ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED ,ALC287_FIXUP_CS35L41_I2C_4 , +ALC245_FIXUP_CS35L41_SPI_1 ,ALC245_FIXUP_CS35L41_SPI_2 ,ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED , ALC245_FIXUP_CS35L41_SPI_4,
@@ -10067,6 +10073,10 @@ static const struct hda_fixup alc269_fixups[] = { .type = HDA_FIXUP_FUNC, .v.func = cs35l41_fixup_spi_two, }, + [ALC245_FIXUP_CS35L41_SPI_1] = { + .type = HDA_FIXUP_FUNC, + .v.func = cs35l41_fixup_spi_one, + }, [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = { .type = HDA_FIXUP_FUNC, .v.func = cs35l41_fixup_spi_two,
@@ -11001,6 +11011,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1043 ,0x8398 ,"ASUS P1005" ,ALC269_FIXUP_STEREO_DMIC ),SND_PCI_QUIRK (0x1043 ,0x83ce ,"ASUS P1005" ,ALC269_FIXUP_STEREO_DMIC ),SND_PCI_QUIRK (0x1043 ,0x8516 ,"ASUS X101CH" ,ALC269_FIXUP_ASUS_X101 ), +SND_PCI_QUIRK (0x1043 ,0x88f4 ,"ASUS NUC14LNS" ,ALC245_FIXUP_CS35L41_SPI_1 ),SND_PCI_QUIRK (0x104d ,0x9073 ,"Sony VAIO" ,ALC275_FIXUP_SONY_VAIO_GPIO2 ),SND_PCI_QUIRK (0x104d ,0x907b ,"Sony VAIO" ,ALC275_FIXUP_SONY_HWEQ ), SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
sound/usb/mixer_quirks.c +407 -138
888 lines not on this page · raw message
sound/usb/quirks.c +22 -2
@@ -2196,6 +2196,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_SET_IFACE_FIRST),DEVICE_FLG (0x0556 ,0x0014 ,/* Phoenix Audio TMX320VC */ QUIRK_FLAG_GET_SAMPLE_RATE ), +DEVICE_FLG (0x0572 ,0x1b08 ,/* Conexant Systems (Rockwell), Inc. */ +QUIRK_FLAG_MIXER_MIN_MUTE ), +DEVICE_FLG (0x0572 ,0x1b09 ,/* Conexant Systems (Rockwell), Inc. */ +QUIRK_FLAG_MIXER_MIN_MUTE ),DEVICE_FLG (0x05a3 ,0x9420 ,/* ELP HD USB Camera */ QUIRK_FLAG_GET_SAMPLE_RATE ), DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
@@ -2238,12 +2242,16 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_CTL_MSG_DELAY_1M),DEVICE_FLG (0x0b0e ,0x0349 ,/* Jabra 550a */ QUIRK_FLAG_CTL_MSG_DELAY_1M ), +DEVICE_FLG (0x0bda ,0x498a ,/* Realtek Semiconductor Corp. */ +QUIRK_FLAG_MIXER_MIN_MUTE ),DEVICE_FLG (0x0c45 ,0x6340 ,/* Sonix HD USB Camera */ QUIRK_FLAG_GET_SAMPLE_RATE ),DEVICE_FLG (0x0c45 ,0x636b ,/* Microdia JP001 USB Camera */ QUIRK_FLAG_GET_SAMPLE_RATE ), -DEVICE_FLG (0x0d8c ,0x0014 ,/* USB Audio Device */ -QUIRK_FLAG_CTL_MSG_DELAY_1M ), +DEVICE_FLG (0x0d8c ,0x000c ,/* C-Media */ +QUIRK_FLAG_MIXER_MIN_MUTE ), +DEVICE_FLG (0x0d8c ,0x0014 ,/* C-Media */ +QUIRK_FLAG_CTL_MSG_DELAY_1M |QUIRK_FLAG_MIXER_MIN_MUTE ),DEVICE_FLG (0x0ecb ,0x205c ,/* JBL Quantum610 Wireless */ QUIRK_FLAG_FIXED_RATE ), DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
@@ -2252,6 +2260,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),DEVICE_FLG (0x1101 ,0x0003 ,/* Audioengine D1 */ QUIRK_FLAG_GET_SAMPLE_RATE ), +DEVICE_FLG (0x12d1 ,0x3a07 ,/* Huawei Technologies Co., Ltd. */ +QUIRK_FLAG_MIXER_MIN_MUTE ),DEVICE_FLG (0x1224 ,0x2a25 ,/* Jieli Technology USB PHY 2.0 */ QUIRK_FLAG_GET_SAMPLE_RATE |QUIRK_FLAG_MIC_RES_16 ), DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
@@ -2290,6 +2300,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),DEVICE_FLG (0x1901 ,0x0191 ,/* GE B850V3 CP2114 audio interface */ QUIRK_FLAG_GET_SAMPLE_RATE ), +DEVICE_FLG (0x19f7 ,0x0003 ,/* RODE NT-USB */ +QUIRK_FLAG_MIXER_MIN_MUTE ),DEVICE_FLG (0x19f7 ,0x0035 ,/* RODE NT-USB+ */ QUIRK_FLAG_GET_SAMPLE_RATE ), DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
@@ -2340,6 +2352,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_IGNORE_CTL_ERROR),DEVICE_FLG (0x2912 ,0x30c8 ,/* Audioengine D1 */ QUIRK_FLAG_GET_SAMPLE_RATE ), +DEVICE_FLG (0x2a70 ,0x1881 ,/* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */ +QUIRK_FLAG_MIXER_MIN_MUTE ),DEVICE_FLG (0x2b53 ,0x0023 ,/* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */ QUIRK_FLAG_GENERIC_IMPLICIT_FB ), DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
@@ -2350,10 +2364,14 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_CTL_MSG_DELAY_1M),DEVICE_FLG (0x2d95 ,0x8021 ,/* VIVO USB-C-XE710 HEADSET */ QUIRK_FLAG_CTL_MSG_DELAY_1M ), +DEVICE_FLG (0x2d99 ,0x0026 ,/* HECATE G2 GAMING HEADSET */ +QUIRK_FLAG_MIXER_MIN_MUTE ),DEVICE_FLG (0x2fc6 ,0xf0b7 ,/* iBasso DC07 Pro */ QUIRK_FLAG_CTL_MSG_DELAY_1M ),DEVICE_FLG (0x30be ,0x0101 ,/* Schiit Hel */ QUIRK_FLAG_IGNORE_CTL_ERROR ), +DEVICE_FLG (0x339b ,0x3a07 ,/* Synaptics HONOR USB-C HEADSET */ +QUIRK_FLAG_MIXER_MIN_MUTE ),DEVICE_FLG (0x413c ,0xa506 ,/* Dell AE515 sound bar */ QUIRK_FLAG_GET_SAMPLE_RATE ), DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
@@ -2405,6 +2423,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_DSD_RAW),VENDOR_FLG (0x2d87 ,/* Cayin device */ QUIRK_FLAG_DSD_RAW ), +VENDOR_FLG (0x2fc6 ,/* Comture-inc devices */ +QUIRK_FLAG_DSD_RAW ),VENDOR_FLG (0x3336 ,/* HEM devices */ QUIRK_FLAG_DSD_RAW ), VENDOR_FLG(0x3353, /* Khadas devices */
sound/usb/usbaudio.h +4 -0
@@ -196,6 +196,9 @@ extern bool snd_usb_skip_validation;* for the given endpoint. * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384 * Set the fixed resolution for Mic Capture Volume (mostly for webcams) +* QUIRK_FLAG_MIXER_MIN_MUTE +* Set minimum volume control value as mute for devices where the lowest +* playback value represents muted state instead of minimum audible volume */ #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
@@ -222,5 +225,6 @@ extern bool snd_usb_skip_validation;#define QUIRK_FLAG_FIXED_RATE (1U << 21)#define QUIRK_FLAG_MIC_RES_16 (1U << 22)#define QUIRK_FLAG_MIC_RES_384 (1U << 23) +#define QUIRK_FLAG_MIXER_MIN_MUTE (1U << 24)#endif /* __USBAUDIO_H */
tools/testing/selftests/net/fib_nexthops.sh +6 -6
@@ -465,8 +465,8 @@ ipv6_fdb_grp_fcnal() log_test $? 0 "Get Fdb nexthop group by id" # fdb nexthop group can only contain fdb nexthops - run_cmd "$IP nexthop add id 63 via 2001:db8:91::4" - run_cmd "$IP nexthop add id 64 via 2001:db8:91::5" + run_cmd "$IP nexthop add id 63 via 2001:db8:91::4 dev veth1" + run_cmd "$IP nexthop add id 64 via 2001:db8:91::5 dev veth1" run_cmd "$IP nexthop add id 103 group 63/64 fdb" log_test $? 2 "Fdb Nexthop group with non-fdb nexthops"
@@ -545,15 +545,15 @@ ipv4_fdb_grp_fcnal() log_test $? 0 "Get Fdb nexthop group by id" # fdb nexthop group can only contain fdb nexthops - run_cmd "$IP nexthop add id 14 via 172.16.1.2" - run_cmd "$IP nexthop add id 15 via 172.16.1.3" + run_cmd "$IP nexthop add id 14 via 172.16.1.2 dev veth1" + run_cmd "$IP nexthop add id 15 via 172.16.1.3 dev veth1" run_cmd "$IP nexthop add id 103 group 14/15 fdb" log_test $? 2 "Fdb Nexthop group with non-fdb nexthops" # Non fdb nexthop group can not contain fdb nexthops run_cmd "$IP nexthop add id 16 via 172.16.1.2 fdb" run_cmd "$IP nexthop add id 17 via 172.16.1.3 fdb" - run_cmd "$IP nexthop add id 104 group 14/15" + run_cmd "$IP nexthop add id 104 group 16/17" log_test $? 2 "Non-Fdb Nexthop group with fdb nexthops" # fdb nexthop cannot have blackhole
@@ -580,7 +580,7 @@ ipv4_fdb_grp_fcnal() run_cmd "$BRIDGE fdb add 02:02:00:00:00:14 dev vx10 nhid 12 self" log_test $? 255 "Fdb mac add with nexthop" - run_cmd "$IP ro add 172.16.0.0/22 nhid 15" + run_cmd "$IP ro add 172.16.0.0/22 nhid 16" log_test $? 2 "Route add with fdb nexthop" run_cmd "$IP ro add 172.16.0.0/22 nhid 103"