Linux 6.1.124
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.1.124 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
------------
Documentation/devicetree/bindings/display/bridge/adi,adv7533.yaml | 2 Makefile | 2 arch/arc/Makefile | 2 arch/x86/kernel/cpu/mshyperv.c | 58 +++ drivers/block/zram/zram_drv.c | 3 drivers/clocksource/hyperv_timer.c | 14 drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 4 drivers/gpu/drm/bridge/adv7511/adv7511_audio.c | 14 drivers/gpu/drm/bridge/adv7511/adv7533.c | 2 drivers/gpu/drm/i915/gt/intel_rc6.c | 2 drivers/infiniband/core/uverbs_cmd.c | 16 - drivers/infiniband/hw/bnxt_re/ib_verbs.c | 28 - drivers/infiniband/hw/bnxt_re/qplib_fp.c | 2 drivers/infiniband/hw/bnxt_re/qplib_sp.c | 2 drivers/infiniband/hw/hns/hns_roce_alloc.c | 3 drivers/infiniband/hw/hns/hns_roce_cq.c | 11 drivers/infiniband/hw/hns/hns_roce_device.h | 12 drivers/infiniband/hw/hns/hns_roce_hem.c | 54 ++- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 130 ++++---- drivers/infiniband/hw/hns/hns_roce_mr.c | 95 +++--- drivers/infiniband/hw/hns/hns_roce_qp.c | 4 drivers/infiniband/hw/hns/hns_roce_srq.c | 4 drivers/infiniband/hw/mlx5/main.c | 6 drivers/infiniband/ulp/rtrs/rtrs-srv.c | 2 drivers/irqchip/irq-gic.c | 2 drivers/net/dsa/microchip/ksz9477.c | 47 ++- drivers/net/dsa/microchip/ksz9477_reg.h | 4 drivers/net/dsa/microchip/ksz_common.h | 5 drivers/net/dsa/microchip/lan937x_main.c | 62 +++- drivers/net/dsa/microchip/lan937x_reg.h | 9 drivers/net/ethernet/broadcom/bcmsysport.c | 21 + drivers/net/ethernet/marvell/mv643xx_eth.c | 14 drivers/net/ethernet/marvell/sky2.c | 1 drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c | 3 drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 151 +++++++--- drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h | 2 drivers/net/usb/qmi_wwan.c | 3 drivers/net/wwan/iosm/iosm_ipc_mmio.c | 2 drivers/net/wwan/t7xx/t7xx_state_monitor.c | 26 + drivers/net/wwan/t7xx/t7xx_state_monitor.h | 5 drivers/pinctrl/pinctrl-mcp23s08.c | 6 drivers/thunderbolt/nhi.c | 12 drivers/thunderbolt/nhi.h | 6 drivers/thunderbolt/retimer.c | 17 - drivers/usb/host/xhci-ring.c | 42 ++ drivers/usb/host/xhci.c | 21 + drivers/usb/host/xhci.h | 2 fs/btrfs/ctree.c | 37 +- fs/btrfs/ctree.h | 7 fs/btrfs/disk-io.c | 9 fs/btrfs/inode.c | 2 fs/smb/server/smb2pdu.c | 12 fs/smb/server/vfs.h | 1 include/clocksource/hyperv_timer.h | 2 include/linux/if_vlan.h | 16 - include/linux/mlx5/driver.h | 6 include/net/bluetooth/hci_core.h | 108 ++++--- include/net/ip_tunnels.h | 28 - include/net/netfilter/nf_tables.h | 7 kernel/bpf/core.c | 6 kernel/kcov.c | 2 kernel/trace/trace_events.c | 12 mm/readahead.c | 6 mm/vmscan.c | 9 net/bluetooth/hci_core.c | 10 net/bluetooth/iso.c | 6 net/bluetooth/l2cap_core.c | 12 net/bluetooth/rfcomm/core.c | 6 net/bluetooth/sco.c | 12 net/core/dev.c | 4 net/core/sock.c | 5 net/ipv4/ip_tunnel.c | 60 ++- net/ipv4/ipip.c | 1 net/ipv4/tcp_input.c | 1 net/ipv6/ila/ila_xlat.c | 16 - net/ipv6/sit.c | 2 net/llc/llc_input.c | 2 net/mac80211/util.c | 3 net/mctp/route.c | 36 +- net/mptcp/options.c | 7 net/mptcp/protocol.c | 22 - net/netrom/nr_route.c | 6 net/packet/af_packet.c | 28 - net/sctp/associola.c | 3 scripts/mod/file2alias.c | 4 security/selinux/ss/services.c | 8 sound/core/seq/oss/seq_oss_synth.c | 2 sound/pci/hda/patch_realtek.c | 2 sound/usb/format.c | 7 sound/usb/mixer_us16x08.c | 2 sound/usb/quirks.c | 2 91 files changed, 1031 insertions(+), 443 deletions(-)
Adrian Ratiu (2):
sound: usb: enable DSD output for ddHiFi TC44C
sound: usb: format: don't warn that raw DSD is unsupported
Andrew Halaney (1):
net: stmmac: don't create a MDIO bus if unnecessary
Anton Protopopov (1):
bpf: fix potential error return
Antonio Pastor (1):
net: llc: reset skb->transport_header
Arnd Bergmann (1):
kcov: mark in_softirq_really() as __always_inline
Bartosz Golaszewski (1):
net: stmmac: platform: provide devm_stmmac_probe_config_dt()
Biju Das (2):
drm: adv7511: Drop dsi single lane support
dt-bindings: display: adi,adv7533: Drop single lane support
Chengchang Tang (4):
RDMA/hns: Refactor mtr find
RDMA/hns: Remove unused parameters and variables RDMA/hns: Fix warning storm caused by invalid input in IO path RDMA/hns: Fix missing flush CQE for DWQE
Christian Ehrig (1):
ipip,ip_tunnel,sit: Add FOU support for externally controlled ipip devices
Dan Carpenter (1):
RDMA/uverbs: Prevent integer overflow issue
Daniel Schaefer (1):
ALSA hda/realtek: Add quirk for Framework F111:000C
Daniele Palmas (1):
net: usb: qmi_wwan: add Telit FE910C04 compositions
Dominique Martinet (1):
zram: check comp is non-NULL before calling comp_destroy
Emmanuel Grumbach (1):
wifi: mac80211: wake the queues in case of failure in resume
Eric Dumazet (5):
ip_tunnel: annotate data-races around t->parms.link
net: restrict SO_REUSEPORT to inet sockets
af_packet: fix vlan_get_tci() vs MSG_PEEK
af_packet: fix vlan_get_protocol_dgram() vs MSG_PEEK
ila: serialize calls to nf_register_net_hooks()
Evgenii Shatokhin (1):
pinctrl: mcp23s08: Fix sleeping in atomic context due to regmap locking
Filipe Manana (3):
btrfs: rename and export __btrfs_cow_block()
btrfs: fix use-after-free when COWing tree bock and tracing is enabled
btrfs: flush delalloc workers queue before stopping cleaner kthread during unmount
Greg Kroah-Hartman (1):
Linux 6.1.124
Hobin Woo (1):
ksmbd: retry iterate_dir in smb2_query_dir
Ido Schimmel (3):
ipv4: ip_tunnel: Unmask upper DSCP bits in ip_tunnel_bind_dev()
ipv4: ip_tunnel: Unmask upper DSCP bits in ip_md_tunnel_xmit()
ipv4: ip_tunnel: Unmask upper DSCP bits in ip_tunnel_xmit()
Ilya Shchipletsov (1):
netrom: check buffer length before accessing it
Jeremy Kerr (1):
net: mctp: handle skb cleanup on sock_queue failures
Jinjian Song (1):
net: wwan: t7xx: Fix FSM command timeout issue
Joe Hattori (2):
net: stmmac: restructure the error path of stmmac_probe_config_dt()
net: mv643xx_eth: fix an OF node reference leak
Johannes Thumshirn (1):
btrfs: fix use-after-free in btrfs_encoded_read_endio()
Kalesh AP (1):
RDMA/bnxt_re: Fix reporting hw_ver in query_device
Leon Romanovsky (1):
ARC: build: Try to guess GCC variant of cross compiler
Li Zhijian (1):
RDMA/rtrs: Ensure 'ib_sge list' is accessible
Luiz Augusto von Dentz (1):
Bluetooth: hci_core: Fix sleeping function called from invalid context
Maciej S. Szmigiero (1):
net: wwan: iosm: Properly check for valid exec stage in ipc_mmio_init()
Mario Limonciello (1):
thunderbolt: Don't display nvm_version unless upgrade supported
Masahiro Yamada (2):
modpost: fix input MODULE_DEVICE_TABLE() built for 64-bit on 32-bit host
modpost: fix the missed iteration for the max bit in do_input()
Mathias Nyman (1):
xhci: Turn NEC specific quirk for handling Stop Endpoint errors generic
Michal Pecio (3):
xhci: retry Stop Endpoint on buggy NEC controllers
usb: xhci: Limit Stop Endpoint retries
usb: xhci: Avoid queuing redundant Stop Endpoint commands
Mika Westerberg (2):
thunderbolt: Add support for Intel Lunar Lake
thunderbolt: Add support for Intel Panther Lake-M/P
Naman Jain (1):
x86/hyperv: Fix hv tsc page based sched_clock for hibernation
Nikolay Kuratov (1):
net/sctp: Prevent autoclose integer overflow in sctp_association_init()
Oleksij Rempel (1):
net: dsa: microchip: add ksz_rmw8() function
Pablo Neira Ayuso (1):
netfilter: nft_set_hash: unaligned atomic read on struct nft_set_ext
Paolo Abeni (3):
mptcp: fix TCP options overflow.
mptcp: fix recvbuffer adjust on sleeping rcvmsg
mptcp: don't always assume copied data in mptcp_cleanup_rbuf()
Pascal Hambourg (1):
sky2: Add device ID 11ab:4373 for Marvell 88E8075
Patrisious Haddad (1):
RDMA/mlx5: Enforce same type port association for multiport RoCE
Prike Liang (1):
drm/amdkfd: Correct the migration DMA map direction
Rodrigo Vivi (1):
drm/i915/dg1: Fix power gate sequence.
Saravanan Vajravel (1):
RDMA/bnxt_re: Add check for path mtu in modify_qp
Seiji Nishikawa (1):
mm: vmscan: account for free pages to prevent infinite Loop in throttle_direct_reclaim()
Selvin Xavier (2):
RDMA/bnxt_re: Fix max_qp_wrs reported RDMA/bnxt_re: Fix the locking while accessing the QP table
Stefan Ekenberg (1):
drm/bridge: adv7511_audio: Update Audio InfoFrame properly
Steven Rostedt (1):
tracing: Have process_string() also allow arrays
Takashi Iwai (1):
ALSA: seq: oss: Fix races at processing SysEx messages
Tanya Agarwal (1):
ALSA: usb-audio: US16x08: Initialize array before use
Thiébaud Weksteen (1):
selinux: ignore unknown extended permissions
Tristram Ha (2):
net: dsa: microchip: Fix KSZ9477 set_ageing_time function
net: dsa: microchip: Fix LAN937X set_ageing_time function
Uros Bizjak (1):
irqchip/gic: Correct declaration of *percpu_base pointer in union gic_base
Vasiliy Kovalev (1):
ALSA: hda/realtek: Add new alc2xx-fixup-headset-mic model
Vitalii Mordan (1):
eth: bcmsysport: fix call balance of priv->clk handling routines
Wang Liang (1):
net: fix memory leak in tcp_conn_request()
Willem de Bruijn (1):
net: reenable NETIF_F_IPV6_CSUM offload for BIG TCP packets
Xiao Liang (1):
net: Fix netns for ip_tunnel_init_flow()
Yafang Shao (1):
mm/readahead: fix large folio support in async readahead
wenglianfa (1):
RDMA/hns: Fix mapping error of zero-hop WQE buffer
Greg Kroah-Hartman
maintainerDocumentation/devicetree/bindings/display/bridge/adi,adv7533.yaml +1 -1
@@ -87,7 +87,7 @@ properties: adi,dsi-lanes: description: Number of DSI data lanes connected to the DSI host. $ref: /schemas/types.yaml#/definitions/uint32 - enum: [ 1, 2, 3, 4 ] + enum: [ 2, 3, 4 ] ports: description:
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 1 -SUBLEVEL = 123 +SUBLEVEL = 124 EXTRAVERSION = NAME = Curry Ramen
arch/arc/Makefile +1 -1
@@ -6,7 +6,7 @@ KBUILD_DEFCONFIG := haps_hs_smp_defconfig ifeq ($(CROSS_COMPILE),) -CROSS_COMPILE := $(call cc-cross-prefix, arc-linux- arceb-linux-) +CROSS_COMPILE := $(call cc-cross-prefix, arc-linux- arceb-linux- arc-linux-gnu-) endif cflags-y += -fno-common -pipe -fno-builtin -mmedium-calls -D__linux__
arch/x86/kernel/cpu/mshyperv.c +58 -0
70 lines not on this page · raw message
drivers/block/zram/zram_drv.c +2 -1
@@ -1733,7 +1733,8 @@ static void zram_reset_device(struct zram *zram)zram_meta_free (zram, zram->disksize); zram->disksize =0 ;memset (&zram->stats,0 ,sizeof (zram->stats)); -zcomp_destroy (zram->comp); +if (zram->comp) +zcomp_destroy (zram->comp); zram->comp =NULL ;reset_bdev (zram);
drivers/clocksource/hyperv_timer.c +13 -1
@@ -27,7 +27,8 @@#include <asm/mshyperv.h> static struct clock_event_device __percpu *hv_clock_event; -static u64 hv_sched_clock_offset__ro_after_init ; +/* Note: offset can hold negative values after hibernation. */ +static u64 hv_sched_clock_offset__read_mostly ;/* * If false, we're using the old mechanism for stimer0 interrupts
@@ -417,6 +418,17 @@ static void resume_hv_clock_tsc(struct clocksource *arg)hv_set_register (HV_REGISTER_REFERENCE_TSC , tsc_msr.as_uint64); } +/* +* Called during resume from hibernation, from overridden +* x86_platform.restore_sched_clock_state routine. This is to adjust offsets +* used to calculate time for hv tsc page based sched_clock, to account for +* time spent before hibernation. +*/ +void hv_adj_sched_clock_offset (u64 offset) +{ + hv_sched_clock_offset -= offset; +} +#ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK static int hv_cs_enable (struct clocksource *cs) {
drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +2 -2
@@ -324,7 +324,7 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange, spage =migrate_pfn_to_page (migrate->src[i]);if (spage && !is_zone_device_page (spage)) { src[i] =dma_map_page (dev, spage,0 ,PAGE_SIZE , -DMA_TO_DEVICE ); +DMA_BIDIRECTIONAL ); r =dma_mapping_error (dev, src[i]);if (r) { dev_err(adev->dev, "%s: fail %d dma_map_page\n",
@@ -623,7 +623,7 @@ svm_migrate_copy_to_ram(struct amdgpu_device *adev, struct svm_range *prange, goto out_oom; } - dst[i] =dma_map_page (dev, dpage,0 ,PAGE_SIZE ,DMA_FROM_DEVICE ); + dst[i] =dma_map_page (dev, dpage,0 ,PAGE_SIZE ,DMA_BIDIRECTIONAL ); r =dma_mapping_error (dev, dst[i]);if (r) {dev_err (adev->dev,"%s: fail %d dma_map_page\n" , __func__, r);
drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +12 -2
@@ -153,7 +153,16 @@ static int adv7511_hdmi_hw_params(struct device *dev, void *data, ADV7511_AUDIO_CFG3_LEN_MASK, len);regmap_update_bits (adv7511->regmap,ADV7511_REG_I2C_FREQ_ID_CFG ,ADV7511_I2C_FREQ_ID_CFG_RATE_MASK , rate <<4 ); -regmap_write (adv7511->regmap,0x73 ,0x1 ); + +/* send current Audio infoframe values while updating */ +regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , +BIT (5 ),BIT (5 )); + +regmap_write (adv7511->regmap,ADV7511_REG_AUDIO_INFOFRAME (0 ),0x1 ); + +/* use Audio infoframe updated info */ +regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , +BIT (5 ),0 );return 0 ; }
@@ -184,8 +193,9 @@ static int audio_startup(struct device *dev, void *data)regmap_update_bits (adv7511->regmap,ADV7511_REG_GC (0 ),BIT (7 ) |BIT (6 ),BIT (7 ));/* use Audio infoframe updated info */ -regmap_update_bits (adv7511->regmap,ADV7511_REG_GC (1 ), +regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE ,BIT (5 ),0 ); +/* enable SPDIF receiver */ if (adv7511->audio_source ==ADV7511_AUDIO_SOURCE_SPDIF ) regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG,
drivers/gpu/drm/bridge/adv7511/adv7533.c +1 -1
@@ -179,7 +179,7 @@ int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)of_property_read_u32 (np,"adi,dsi-lanes" , &num_lanes); -if (num_lanes <1 || num_lanes >4 ) +if (num_lanes <2 || num_lanes >4 )return -EINVAL ; adv->num_dsi_lanes = num_lanes;
drivers/gpu/drm/i915/gt/intel_rc6.c +1 -1
@@ -134,7 +134,7 @@ static void gen11_rc6_enable(struct intel_rc6 *rc6)GEN9_MEDIA_PG_ENABLE |GEN11_MEDIA_SAMPLER_PG_ENABLE ; -if (GRAPHICS_VER (gt->i915) >=12 ) { +if (GRAPHICS_VER (gt->i915) >=12 && !IS_DG1 (gt->i915)) {for (i =0 ; i <I915_MAX_VCS ; i++)if (HAS_ENGINE (gt,_VCS (i))) pg_enable |= (VDN_HCP_POWERGATE_ENABLE(i) |
drivers/infiniband/core/uverbs_cmd.c +9 -7
@@ -161,7 +161,7 @@ static const void __user *uverbs_request_next_ptr(struct uverbs_req_iter *iter, {const void __user *res = iter->cur; -if (iter->cur + len > iter->end) +if (len > iter->end - iter->cur)return (void __force __user *)ERR_PTR (-ENOSPC ); iter->cur += len;return res;
@@ -2009,11 +2009,13 @@ static int ib_uverbs_post_send(struct uverbs_attr_bundle *attrs) ret =uverbs_request_start (attrs, &iter, &cmd,sizeof (cmd));if (ret)return ret; - wqes =uverbs_request_next_ptr (&iter, cmd.wqe_size * cmd.wr_count); + wqes =uverbs_request_next_ptr (&iter,size_mul (cmd.wqe_size, + cmd.wr_count));if (IS_ERR (wqes))return PTR_ERR (wqes); - sgls =uverbs_request_next_ptr ( - &iter, cmd.sge_count *sizeof (struct ib_uverbs_sge )); + sgls =uverbs_request_next_ptr (&iter, +size_mul (cmd.sge_count, +sizeof (struct ib_uverbs_sge )));if (IS_ERR (sgls))return PTR_ERR (sgls); ret =uverbs_request_finish (&iter);
@@ -2199,11 +2201,11 @@ ib_uverbs_unmarshall_recv(struct uverbs_req_iter *iter, u32 wr_count,if (wqe_size <sizeof (struct ib_uverbs_recv_wr ))return ERR_PTR (-EINVAL ); - wqes =uverbs_request_next_ptr (iter, wqe_size * wr_count); + wqes =uverbs_request_next_ptr (iter,size_mul (wqe_size, wr_count));if (IS_ERR (wqes))return ERR_CAST (wqes); - sgls =uverbs_request_next_ptr ( - iter, sge_count *sizeof (struct ib_uverbs_sge )); + sgls =uverbs_request_next_ptr (iter,size_mul (sge_count, +sizeof (struct ib_uverbs_sge )));if (IS_ERR (sgls))return ERR_CAST (sgls); ret =uverbs_request_finish (iter);
drivers/infiniband/hw/bnxt_re/ib_verbs.c +15 -13
@@ -138,7 +138,7 @@ int bnxt_re_query_device(struct ib_device *ibdev, ib_attr->vendor_id = rdev->en_dev->pdev->vendor; ib_attr->vendor_part_id = rdev->en_dev->pdev->device; - ib_attr->hw_ver = rdev->en_dev->pdev->subsystem_device; + ib_attr->hw_ver = rdev->en_dev->pdev->revision; ib_attr->max_qp = dev_attr->max_qp; ib_attr->max_qp_wr = dev_attr->max_qp_wqes; ib_attr->device_cap_flags =
@@ -1940,18 +1940,20 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr, } } -if (qp_attr_mask &IB_QP_PATH_MTU ) { - qp->qplib_qp.modify_flags |= -CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU ; - qp->qplib_qp.path_mtu =__from_ib_mtu (qp_attr->path_mtu); - qp->qplib_qp.mtu =ib_mtu_enum_to_int (qp_attr->path_mtu); - }else if (qp_attr->qp_state ==IB_QPS_RTR ) { - qp->qplib_qp.modify_flags |= -CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU ; - qp->qplib_qp.path_mtu = -__from_ib_mtu (iboe_get_mtu (rdev->netdev->mtu)); - qp->qplib_qp.mtu = -ib_mtu_enum_to_int (iboe_get_mtu (rdev->netdev->mtu)); +if (qp_attr->qp_state ==IB_QPS_RTR ) { +enum ib_mtu qpmtu; + + qpmtu =iboe_get_mtu (rdev->netdev->mtu); +if (qp_attr_mask &IB_QP_PATH_MTU ) { +if (ib_mtu_enum_to_int (qp_attr->path_mtu) > +ib_mtu_enum_to_int (qpmtu)) +return -EINVAL ; + qpmtu = qp_attr->path_mtu; + } + + qp->qplib_qp.modify_flags |=CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU ; + qp->qplib_qp.path_mtu =__from_ib_mtu (qpmtu); + qp->qplib_qp.mtu =ib_mtu_enum_to_int (qpmtu); }if (qp_attr_mask &IB_QP_TIMEOUT ) {
drivers/infiniband/hw/bnxt_re/qplib_fp.c +2 -0
@@ -1149,9 +1149,11 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) rq->dbinfo.db = qp->dpi->dbr; rq->dbinfo.max_slot =bnxt_qplib_set_rq_max_slot (rq->wqe_size); } +spin_lock_bh (&rcfw->tbl_lock); tbl_indx =map_qp_id_to_tbl_indx (qp->id, rcfw); rcfw->qp_tbl[tbl_indx].qp_id = qp->id; rcfw->qp_tbl[tbl_indx].qp_handle = (void *)qp; +spin_unlock_bh (&rcfw->tbl_lock);return 0 ; fail:
drivers/infiniband/hw/bnxt_re/qplib_sp.c +1 -1
@@ -124,7 +124,7 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, attr->max_qp_init_rd_atom = sb->max_qp_init_rd_atom >BNXT_QPLIB_MAX_OUT_RD_ATOM ?BNXT_QPLIB_MAX_OUT_RD_ATOM : sb->max_qp_init_rd_atom; - attr->max_qp_wqes =le16_to_cpu (sb->max_qp_wr); + attr->max_qp_wqes =le16_to_cpu (sb->max_qp_wr) -1 ;/* * 128 WQEs needs to be reserved for the HW (8916). Prevent * reporting the max number
drivers/infiniband/hw/hns/hns_roce_alloc.c +1 -2
@@ -153,8 +153,7 @@ int hns_roce_get_kmem_bufs(struct hns_roce_dev *hr_dev, dma_addr_t *bufs,return total; } -int hns_roce_get_umem_bufs (struct hns_roce_dev *hr_dev,dma_addr_t *bufs, -int buf_cnt,struct ib_umem *umem, +int hns_roce_get_umem_bufs (dma_addr_t *bufs,int buf_cnt,struct ib_umem *umem,unsigned int page_shift) {struct ib_block_iter biter;
drivers/infiniband/hw/hns/hns_roce_cq.c +5 -6
@@ -133,14 +133,12 @@ static int alloc_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;struct ib_device *ibdev = &hr_dev->ib_dev;u64 mtts[MTT_MIN_COUNT ] = {}; -dma_addr_t dma_handle;int ret; - ret =hns_roce_mtr_find (hr_dev, &hr_cq->mtr,0 , mtts,ARRAY_SIZE (mtts), - &dma_handle); -if (!ret) { + ret =hns_roce_mtr_find (hr_dev, &hr_cq->mtr,0 , mtts,ARRAY_SIZE (mtts)); +if (ret) {ibdev_err (ibdev,"failed to find CQ mtr, ret = %d.\n" , ret); -return -EINVAL ; +return ret; }/* Get CQC memory HEM(Hardware Entry Memory) table */
@@ -157,7 +155,8 @@ static int alloc_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq) goto err_put; } - ret =hns_roce_create_cqc (hr_dev, hr_cq, mtts, dma_handle); + ret =hns_roce_create_cqc (hr_dev, hr_cq, mtts, +hns_roce_get_mtr_ba (&hr_cq->mtr));if (ret) goto err_xa;
drivers/infiniband/hw/hns/hns_roce_device.h +8 -4
@@ -882,8 +882,7 @@ struct hns_roce_hw {int (*rereg_write_mtpt)(struct hns_roce_dev *hr_dev,struct hns_roce_mr *mr,int flags,void *mb_buf); -int (*frmr_write_mtpt)(struct hns_roce_dev *hr_dev,void *mb_buf, -struct hns_roce_mr *mr); +int (*frmr_write_mtpt)(void *mb_buf,struct hns_roce_mr *mr);int (*mw_write_mtpt)(void *mb_buf,struct hns_roce_mw *mw); void (*write_cqc)(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq, void *mb_buf, u64 *mtts,
@@ -1117,8 +1116,13 @@ void hns_roce_cmd_use_polling(struct hns_roce_dev *hr_dev);/* hns roce hw need current block and next block addr from mtt */ #define MTT_MIN_COUNT 2 +static inline dma_addr_t hns_roce_get_mtr_ba (struct hns_roce_mtr *mtr) +{ +return mtr->hem_cfg.root_ba; +} +int hns_roce_mtr_find (struct hns_roce_dev *hr_dev,struct hns_roce_mtr *mtr, -u32 offset,u64 *mtt_buf,int mtt_max,u64 *base_addr); +u32 offset,u64 *mtt_buf,int mtt_max); int hns_roce_mtr_create(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr, struct hns_roce_buf_attr *buf_attr, unsigned int page_shift, struct ib_udata *udata,
@@ -1177,7 +1181,7 @@ struct hns_roce_buf *hns_roce_buf_alloc(struct hns_roce_dev *hr_dev, u32 size,int hns_roce_get_kmem_bufs (struct hns_roce_dev *hr_dev,dma_addr_t *bufs,int buf_cnt,struct hns_roce_buf *buf,unsigned int page_shift); -int hns_roce_get_umem_bufs (struct hns_roce_dev *hr_dev,dma_addr_t *bufs, +int hns_roce_get_umem_bufs (dma_addr_t *bufs,int buf_cnt,struct ib_umem *umem,unsigned int page_shift);
drivers/infiniband/hw/hns/hns_roce_hem.c +33 -21
149 lines not on this page · raw message
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +66 -64
278 lines not on this page · raw message
drivers/infiniband/hw/hns/hns_roce_mr.c +59 -36
142 lines not on this page · raw message
drivers/infiniband/hw/hns/hns_roce_qp.c +1 -3
@@ -1139,7 +1139,6 @@ static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp, }static int hns_roce_create_qp_common (struct hns_roce_dev *hr_dev, -struct ib_pd *ib_pd,struct ib_qp_init_attr *init_attr,struct ib_udata *udata,struct hns_roce_qp *hr_qp)
@@ -1293,7 +1292,6 @@ int hns_roce_create_qp(struct ib_qp *qp, struct ib_qp_init_attr *init_attr,struct ib_device *ibdev = qp->device;struct hns_roce_dev *hr_dev =to_hr_dev (ibdev);struct hns_roce_qp *hr_qp =to_hr_qp (qp); -struct ib_pd *pd = qp->pd;int ret; ret =check_qp_type (hr_dev, init_attr->qp_type, !!udata);
@@ -1308,7 +1306,7 @@ int hns_roce_create_qp(struct ib_qp *qp, struct ib_qp_init_attr *init_attr, hr_qp->phy_port = hr_dev->iboe.phy_port[hr_qp->port]; } - ret =hns_roce_create_qp_common (hr_dev, pd, init_attr, udata, hr_qp); + ret =hns_roce_create_qp_common (hr_dev, init_attr, udata, hr_qp);if (ret)ibdev_err (ibdev,"create QP type 0x%x failed(%d)\n" , init_attr->qp_type, ret);
drivers/infiniband/hw/hns/hns_roce_srq.c +2 -2
@@ -249,7 +249,7 @@ static void free_srq_wqe_buf(struct hns_roce_dev *hr_dev,hns_roce_mtr_destroy (hr_dev, &srq->buf_mtr); } -static int alloc_srq_wrid (struct hns_roce_dev *hr_dev,struct hns_roce_srq *srq) +static int alloc_srq_wrid (struct hns_roce_srq *srq) { srq->wrid =kvmalloc_array (srq->wqe_cnt,sizeof (u64),GFP_KERNEL );if (!srq->wrid)
@@ -365,7 +365,7 @@ static int alloc_srq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq, goto err_idx;if (!udata) { - ret =alloc_srq_wrid (hr_dev, srq); + ret =alloc_srq_wrid (srq);if (ret) goto err_wqe_buf; }
drivers/infiniband/hw/mlx5/main.c +4 -2
@@ -3265,7 +3265,8 @@ static int mlx5_ib_init_multiport_master(struct mlx5_ib_dev *dev)list_for_each_entry (mpi, &mlx5_ib_unaffiliated_port_list, list) {if (dev->sys_image_guid == mpi->sys_image_guid && - (mlx5_core_native_port_num (mpi->mdev) -1 ) == i) { + (mlx5_core_native_port_num (mpi->mdev) -1 ) == i && +mlx5_core_same_coredev_type (dev->mdev, mpi->mdev)) { bound =mlx5_ib_bind_slave_port (dev, mpi); }
@@ -4280,7 +4281,8 @@ static int mlx5r_mp_probe(struct auxiliary_device *adev,mutex_lock (&mlx5_ib_multiport_mutex);list_for_each_entry (dev, &mlx5_ib_dev_list, ib_dev_list) { -if (dev->sys_image_guid == mpi->sys_image_guid) +if (dev->sys_image_guid == mpi->sys_image_guid && +mlx5_core_same_coredev_type (dev->mdev, mpi->mdev)) bound =mlx5_ib_bind_slave_port (dev, mpi);if (bound) {
drivers/infiniband/ulp/rtrs/rtrs-srv.c +1 -1
@@ -344,6 +344,7 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id,struct rtrs_srv_mr *srv_mr;bool need_inval = false;enum ib_send_flags flags; +struct ib_sge list;u32 imm;int err;
@@ -396,7 +397,6 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, imm =rtrs_to_io_rsp_imm (id->msg_id, errno, need_inval); imm_wr.wr.next =NULL ;if (always_invalidate) { -struct ib_sge list;struct rtrs_msg_rkey_rsp *msg; srv_mr = &srv_path->mrs[id->msg_id];
drivers/irqchip/irq-gic.c +1 -1
@@ -63,7 +63,7 @@ static void gic_check_cpu_features(void)union gic_base {void __iomem *common_base; -void __percpu *__iomem *percpu_base; +void __iomem *__percpu *percpu_base; };struct gic_chip_data {
drivers/net/dsa/microchip/ksz9477.c +36 -11
69 lines not on this page · raw message
drivers/net/dsa/microchip/ksz9477_reg.h +1 -3
@@ -2,7 +2,7 @@/* * Microchip KSZ9477 register definitions * -* Copyright (C) 2017-2018 Microchip Technology Inc. +* Copyright (C) 2017-2024 Microchip Technology Inc. */ #ifndef __KSZ9477_REGS_H
@@ -190,8 +190,6 @@#define SW_VLAN_ENABLE BIT(7)#define SW_DROP_INVALID_VID BIT(6)#define SW_AGE_CNT_M GENMASK(5, 3) -#define SW_AGE_CNT_S 3 -#define SW_AGE_PERIOD_10_8_M GENMASK(10, 8)#define SW_RESV_MCAST_ENABLE BIT(2)#define SW_HASH_OPTION_M 0x03#define SW_HASH_OPTION_CRC 1
drivers/net/dsa/microchip/ksz_common.h +5 -0
@@ -454,6 +454,11 @@ static inline int ksz_write64(struct ksz_device *dev, u32 reg, u64 value)return regmap_bulk_write (dev->regmap[2 ], reg, val,2 ); } +static inline int ksz_rmw8 (struct ksz_device *dev,int offset,u8 mask,u8 val) +{ +return regmap_update_bits (dev->regmap[0 ], offset, mask, val); +} +static inline int ksz_pread8 (struct ksz_device *dev,int port,int offset,u8 *data) {
drivers/net/dsa/microchip/lan937x_main.c +59 -3
75 lines not on this page · raw message
drivers/net/dsa/microchip/lan937x_reg.h +6 -3
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0 */ /* Microchip LAN937X switch register definitions -* Copyright (C) 2019-2021 Microchip Technology Inc. +* Copyright (C) 2019-2024 Microchip Technology Inc. */ #ifndef __LAN937X_REG_H#define __LAN937X_REG_H
@@ -48,8 +48,7 @@#define SW_VLAN_ENABLE BIT(7)#define SW_DROP_INVALID_VID BIT(6) -#define SW_AGE_CNT_M 0x7 -#define SW_AGE_CNT_S 3 +#define SW_AGE_CNT_M GENMASK(5, 3)#define SW_RESV_MCAST_ENABLE BIT(2)#define REG_SW_LUE_CTRL_1 0x0311
@@ -62,6 +61,10 @@#define SW_FAST_AGING BIT(1)#define SW_LINK_AUTO_AGING BIT(0) +#define REG_SW_LUE_CTRL_2 0x0312 + +#define SW_AGE_CNT_IN_MICROSEC BIT(7) +#define REG_SW_AGE_PERIOD__1 0x0313#define SW_AGE_PERIOD_7_0_M GENMASK(7, 0)
drivers/net/ethernet/broadcom/bcmsysport.c +18 -3
@@ -1956,7 +1956,11 @@ static int bcm_sysport_open(struct net_device *dev)unsigned int i;int ret; -clk_prepare_enable (priv->clk); + ret =clk_prepare_enable (priv->clk); +if (ret) { +netdev_err (dev,"could not enable priv clock\n" ); +return ret; + }/* Reset UniMAC */ umac_reset (priv);
@@ -2614,7 +2618,11 @@ static int bcm_sysport_probe(struct platform_device *pdev) goto err_deregister_notifier; } -clk_prepare_enable (priv->clk); + ret =clk_prepare_enable (priv->clk); +if (ret) { +dev_err (&pdev->dev,"could not enable priv clock\n" ); + goto err_deregister_netdev; + } priv->rev =topctrl_readl (priv,REV_CNTL ) &REV_MASK ; dev_info(&pdev->dev,
@@ -2628,6 +2636,8 @@ static int bcm_sysport_probe(struct platform_device *pdev)return 0 ; +err_deregister_netdev: +unregister_netdev (dev); err_deregister_notifier:unregister_netdevice_notifier (&priv->netdev_notifier); err_deregister_fixed_link:
@@ -2799,7 +2809,12 @@ static int __maybe_unused bcm_sysport_resume(struct device *d)if (!netif_running (dev))return 0 ; -clk_prepare_enable (priv->clk); + ret =clk_prepare_enable (priv->clk); +if (ret) { +netdev_err (dev,"could not enable priv clock\n" ); +return ret; + } +if (priv->wolopts)clk_disable_unprepare (priv->wol_clk);
drivers/net/ethernet/marvell/mv643xx_eth.c +12 -2
@@ -2707,9 +2707,15 @@ static struct platform_device *port_platdev[3];static void mv643xx_eth_shared_of_remove (void ) { +struct mv643xx_eth_platform_data *pd;int n;for (n =0 ; n <3 ; n++) { +if (!port_platdev[n]) +continue ; + pd =dev_get_platdata (&port_platdev[n]->dev); +if (pd) +of_node_put (pd->phy_node);platform_device_del (port_platdev[n]); port_platdev[n] =NULL ; }
@@ -2770,8 +2776,10 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev, } ppdev =platform_device_alloc (MV643XX_ETH_NAME , dev_num); -if (!ppdev) -return -ENOMEM ; +if (!ppdev) { + ret = -ENOMEM ; + goto put_err; + } ppdev->dev.coherent_dma_mask =DMA_BIT_MASK (32 ); ppdev->dev.of_node = pnp;
@@ -2793,6 +2801,8 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev, port_err:platform_device_put (ppdev); +put_err: +of_node_put (ppd.phy_node);return ret; }
drivers/net/ethernet/marvell/sky2.c +1 -0
@@ -130,6 +130,7 @@ static const struct pci_device_id sky2_id_table[] = { { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436C) }, /* 88E8072 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436D) }, /* 88E8055 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4370) }, /* 88E8075 */ + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4373) }, /* 88E8075 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4380) }, /* 88E8057 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4381) }, /* 88E8059 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4382) }, /* 88E8079 */
drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c +1 -2
@@ -423,8 +423,7 @@ mlxsw_sp_span_gretap4_route(const struct net_device *to_dev, parms =mlxsw_sp_ipip_netdev_parms4 (to_dev);ip_tunnel_init_flow (&fl4, parms.iph.protocol, *daddrp, *saddrp, -0 ,0 ,dev_net (to_dev), parms.link, tun->fwmark,0 , -0 ); +0 ,0 , tun->net, parms.link, tun->fwmark,0 ,0 ); rt =ip_route_output_key (tun->net, &fl4);if (IS_ERR (rt))
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +108 -43
224 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h +2 -0
@@ -13,6 +13,8 @@struct plat_stmmacenet_data *stmmac_probe_config_dt (struct platform_device *pdev,u8 *mac); +struct plat_stmmacenet_data * +devm_stmmac_probe_config_dt (struct platform_device *pdev,u8 *mac);void stmmac_remove_config_dt (struct platform_device *pdev,struct plat_stmmacenet_data *plat);
drivers/net/usb/qmi_wwan.c +3 -0
@@ -1372,6 +1372,9 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_SET_DTR(0x1bc7, 0x10a0, 0)}, /* Telit FN920C04 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x10a4, 0)}, /* Telit FN920C04 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x10a9, 0)}, /* Telit FN920C04 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x10c0, 0)}, /* Telit FE910C04 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x10c4, 0)}, /* Telit FE910C04 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x10c8, 0)}, /* Telit FE910C04 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
drivers/net/wwan/iosm/iosm_ipc_mmio.c +1 -1
@@ -104,7 +104,7 @@ struct iosm_mmio *ipc_mmio_init(void __iomem *mmio, struct device *dev)break ;msleep (20 ); - }while (retries-- >0 ); + }while (--retries >0 );if (!retries) {dev_err (ipc_mmio->dev,"invalid exec stage %X" , stage);
drivers/net/wwan/t7xx/t7xx_state_monitor.c +17 -9
@@ -97,14 +97,21 @@ void t7xx_fsm_broadcast_state(struct t7xx_fsm_ctl *ctl, enum md_state state)fsm_state_notify (ctl->md, state); } +static void fsm_release_command (struct kref *ref) +{ +struct t7xx_fsm_command *cmd =container_of (ref,typeof (*cmd), refcnt); + +kfree (cmd); +} +static void fsm_finish_command (struct t7xx_fsm_ctl *ctl,struct t7xx_fsm_command *cmd,int result) {if (cmd->flag &FSM_CMD_FLAG_WAIT_FOR_COMPLETION ) { - *cmd->ret = result; -complete_all (cmd->done); + cmd->result = result; +complete_all (&cmd->done); } -kfree (cmd); +kref_put (&cmd->refcnt, fsm_release_command); }static void fsm_del_kf_event (struct t7xx_fsm_event *event)
@@ -387,7 +394,6 @@ static int fsm_main_thread(void *data)int t7xx_fsm_append_cmd (struct t7xx_fsm_ctl *ctl,enum t7xx_fsm_cmd_state cmd_id,unsigned int flag) { -DECLARE_COMPLETION_ONSTACK (done);struct t7xx_fsm_command *cmd;unsigned long flags;int ret;
@@ -399,11 +405,13 @@ int t7xx_fsm_append_cmd(struct t7xx_fsm_ctl *ctl, enum t7xx_fsm_cmd_state cmd_idINIT_LIST_HEAD (&cmd->entry); cmd->cmd_id = cmd_id; cmd->flag = flag; +kref_init (&cmd->refcnt);if (flag &FSM_CMD_FLAG_WAIT_FOR_COMPLETION ) { - cmd->done = &done; - cmd->ret = &ret; +init_completion (&cmd->done); +kref_get (&cmd->refcnt); } +kref_get (&cmd->refcnt);spin_lock_irqsave (&ctl->command_lock, flags);list_add_tail (&cmd->entry, &ctl->command_queue);spin_unlock_irqrestore (&ctl->command_lock, flags);
@@ -413,11 +421,11 @@ int t7xx_fsm_append_cmd(struct t7xx_fsm_ctl *ctl, enum t7xx_fsm_cmd_state cmd_idif (flag &FSM_CMD_FLAG_WAIT_FOR_COMPLETION ) {unsigned long wait_ret; - wait_ret =wait_for_completion_timeout (&done, + wait_ret =wait_for_completion_timeout (&cmd->done,msecs_to_jiffies (FSM_CMD_TIMEOUT_MS )); -if (!wait_ret) -return -ETIMEDOUT ; + ret = wait_ret ? cmd->result : -ETIMEDOUT ; +kref_put (&cmd->refcnt, fsm_release_command);return ret; }
drivers/net/wwan/t7xx/t7xx_state_monitor.h +3 -2
@@ -107,8 +107,9 @@ struct t7xx_fsm_command {struct list_head entry;enum t7xx_fsm_cmd_state cmd_id;unsigned int flag; -struct completion *done; -int *ret; +struct completion done; +int result; +struct kref refcnt; };struct t7xx_fsm_notifier {
drivers/pinctrl/pinctrl-mcp23s08.c +6 -0
@@ -85,6 +85,7 @@ const struct regmap_config mcp23x08_regmap = { .num_reg_defaults = ARRAY_SIZE(mcp23x08_defaults), .cache_type = REGCACHE_FLAT, .max_register = MCP_OLAT, + .disable_locking = true, /* mcp->lock protects the regmap */ };EXPORT_SYMBOL_GPL (mcp23x08_regmap);
@@ -131,6 +132,7 @@ const struct regmap_config mcp23x17_regmap = { .num_reg_defaults = ARRAY_SIZE(mcp23x17_defaults), .cache_type = REGCACHE_FLAT, .val_format_endian = REGMAP_ENDIAN_LITTLE, + .disable_locking = true, /* mcp->lock protects the regmap */ };EXPORT_SYMBOL_GPL (mcp23x17_regmap);
@@ -228,7 +230,9 @@ static int mcp_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,switch (param) {case PIN_CONFIG_BIAS_PULL_UP : +mutex_lock (&mcp->lock); ret =mcp_read (mcp,MCP_GPPU , &data); +mutex_unlock (&mcp->lock);if (ret <0 )return ret; status = (data &BIT (pin)) ?1 :0 ;
@@ -257,7 +261,9 @@ static int mcp_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,switch (param) {case PIN_CONFIG_BIAS_PULL_UP : +mutex_lock (&mcp->lock); ret =mcp_set_bit (mcp,MCP_GPPU , pin, arg); +mutex_unlock (&mcp->lock);break ;default :dev_dbg (mcp->dev,"Invalid config param %04x\n" , param);
drivers/thunderbolt/nhi.c +12 -0
@@ -1479,6 +1479,18 @@ static struct pci_device_id nhi_ids[] = { .driver_data = (kernel_ulong_t)&icl_nhi_ops }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTL_P_NHI1), .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI0), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI1), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI0), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI1), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI0), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI1), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) },
drivers/thunderbolt/nhi.h +6 -0
@@ -90,6 +90,12 @@ extern const struct tb_nhi_ops icl_nhi_ops;#define PCI_DEVICE_ID_INTEL_TGL_H_NHI1 0x9a21#define PCI_DEVICE_ID_INTEL_RPL_NHI0 0xa73e#define PCI_DEVICE_ID_INTEL_RPL_NHI1 0xa76d +#define PCI_DEVICE_ID_INTEL_LNL_NHI0 0xa833 +#define PCI_DEVICE_ID_INTEL_LNL_NHI1 0xa834 +#define PCI_DEVICE_ID_INTEL_PTL_M_NHI0 0xe333 +#define PCI_DEVICE_ID_INTEL_PTL_M_NHI1 0xe334 +#define PCI_DEVICE_ID_INTEL_PTL_P_NHI0 0xe433 +#define PCI_DEVICE_ID_INTEL_PTL_P_NHI1 0xe434#define PCI_CLASS_SERIAL_USB_USB4 0x0c0340
drivers/thunderbolt/retimer.c +15 -2
@@ -98,6 +98,7 @@ static int tb_retimer_nvm_add(struct tb_retimer *rt) err_nvm:dev_dbg (&rt->dev,"NVM upgrade disabled\n" ); + rt->no_nvm_upgrade = true;if (!IS_ERR (nvm))tb_nvm_free (nvm);
@@ -177,8 +178,6 @@ static ssize_t nvm_authenticate_show(struct device *dev,if (!rt->nvm) ret = -EAGAIN ; -else if (rt->no_nvm_upgrade) - ret = -EOPNOTSUPP ;else ret =sysfs_emit (buf,"%#x\n" , rt->auth_status);
@@ -304,6 +303,19 @@ static ssize_t vendor_show(struct device *dev, struct device_attribute *attr, }static DEVICE_ATTR_RO (vendor); +static umode_t retimer_is_visible (struct kobject *kobj,struct attribute *attr, +int n) +{ +struct device *dev =kobj_to_dev (kobj); +struct tb_retimer *rt =tb_to_retimer (dev); + +if (attr == &dev_attr_nvm_authenticate.attr || + attr == &dev_attr_nvm_version.attr) +return rt->no_nvm_upgrade ?0 : attr->mode; + +return attr->mode; +} +static struct attribute *retimer_attrs[] = { &dev_attr_device.attr, &dev_attr_nvm_authenticate.attr,
@@ -313,6 +325,7 @@ static struct attribute *retimer_attrs[] = { };static const struct attribute_group retimer_group = { + .is_visible = retimer_is_visible, .attrs = retimer_attrs, };
drivers/usb/host/xhci-ring.c +41 -1
62 lines not on this page · raw message
drivers/usb/host/xhci.c +17 -4
@@ -8,6 +8,7 @@* Some code borrowed from the Linux EHCI driver. */ +#include <linux/jiffies.h> #include <linux/pci.h> #include <linux/iommu.h> #include <linux/iopoll.h>
@@ -1902,15 +1903,27 @@ static int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) } } -/* Queue a stop endpoint command, but only if this is -* the first cancellation to be handled. -*/ -if (!(ep->ep_state &EP_STOP_CMD_PENDING )) { +/* These completion handlers will sort out cancelled TDs for us */ +if (ep->ep_state & (EP_STOP_CMD_PENDING |EP_HALTED |SET_DEQ_PENDING )) { +xhci_dbg (xhci,"Not queuing Stop Endpoint on slot %d ep %d in state 0x%x\n" , + urb->dev->slot_id, ep_index, ep->ep_state); + goto done; + } + +/* In this case no commands are pending but the endpoint is stopped */ +if (ep->ep_state &EP_CLEARING_TT ) { +/* and cancelled TDs can be given back right away */ +xhci_dbg (xhci,"Invalidating TDs instantly on slot %d ep %d in state 0x%x\n" , + urb->dev->slot_id, ep_index, ep->ep_state); +xhci_process_cancelled_tds (ep); + }else { +/* Otherwise, queue a new Stop Endpoint command */ command =xhci_alloc_command (xhci, false,GFP_ATOMIC );if (!command) { ret = -ENOMEM ; goto done; } + ep->stop_time = jiffies; ep->ep_state |=EP_STOP_CMD_PENDING ;xhci_queue_stop_endpoint (xhci, command, urb->dev->slot_id, ep_index,0 );
drivers/usb/host/xhci.h +2 -0
@@ -717,6 +717,7 @@ struct xhci_virt_ep {/* Bandwidth checking storage */ struct xhci_bw_info bw_info;struct list_head bw_endpoint_list; +unsigned long stop_time;/* Isoch Frame ID checking storage */ int next_frame_id;/* Use new Isoch TRB layout needed for extended TBC support */
@@ -1951,6 +1952,7 @@ void xhci_ring_doorbell_for_active_rings(struct xhci_hcd *xhci,void xhci_cleanup_command_queue (struct xhci_hcd *xhci);void inc_deq (struct xhci_hcd *xhci,struct xhci_ring *ring);unsigned int count_trbs (u64 addr,u64 len); +void xhci_process_cancelled_tds (struct xhci_virt_ep *ep);/* xHCI roothub code */ void xhci_set_link_state(struct xhci_hcd *xhci, struct xhci_port *port,
fs/btrfs/ctree.c +17 -20
@@ -404,13 +404,13 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,* bytes the allocator should try to find free next to the block it returns. * This is just a hint and may be ignored by the allocator. */ -static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, -struct btrfs_root *root, -struct extent_buffer *buf, -struct extent_buffer *parent,int parent_slot, -struct extent_buffer **cow_ret, -u64 search_start,u64 empty_size, -enum btrfs_lock_nesting nest) +int btrfs_force_cow_block (struct btrfs_trans_handle *trans, +struct btrfs_root *root, +struct extent_buffer *buf, +struct extent_buffer *parent,int parent_slot, +struct extent_buffer **cow_ret, +u64 search_start,u64 empty_size, +enum btrfs_lock_nesting nest) {struct btrfs_fs_info *fs_info = root->fs_info;struct btrfs_disk_key disk_key;
@@ -520,6 +520,8 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,btrfs_free_tree_block (trans,btrfs_root_id (root), buf, parent_start, last_ref); } + +trace_btrfs_cow_block (root, buf, cow);if (unlock_orig)btrfs_tree_unlock (buf);free_extent_buffer_stale (buf);
@@ -559,7 +561,7 @@ static inline int should_cow_block(struct btrfs_trans_handle *trans, }/* -* cows a single block, see __btrfs_cow_block for the real work. +* COWs a single block, see btrfs_force_cow_block() for the real work. * This version of it has extra checks so that a block isn't COWed more than * once per transaction, as long as it hasn't been written yet */
@@ -571,7 +573,6 @@ noinline int btrfs_cow_block(struct btrfs_trans_handle *trans, {struct btrfs_fs_info *fs_info = root->fs_info;u64 search_start; -int ret;if (unlikely (test_bit (BTRFS_ROOT_DELETING , &root->state))) {btrfs_abort_transaction (trans, -EUCLEAN );
@@ -612,12 +613,8 @@ noinline int btrfs_cow_block(struct btrfs_trans_handle *trans,* Also We don't care about the error, as it's handled internally. */ btrfs_qgroup_trace_subtree_after_cow (trans, root, buf); - ret =__btrfs_cow_block (trans, root, buf, parent, - parent_slot, cow_ret, search_start,0 , nest); - -trace_btrfs_cow_block (root, buf, *cow_ret); - -return ret; +return btrfs_force_cow_block (trans, root, buf, parent, parent_slot, + cow_ret, search_start,0 , nest); }ALLOW_ERROR_INJECTION (btrfs_cow_block,ERRNO );
@@ -764,11 +761,11 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans, search_start = last_block;btrfs_tree_lock (cur); - err =__btrfs_cow_block (trans, root, cur, parent, i, - &cur, search_start, -min (16 * blocksize, - (end_slot - i) * blocksize), -BTRFS_NESTING_COW ); + err =btrfs_force_cow_block (trans, root, cur, parent, i, + &cur, search_start, +min (16 * blocksize, + (end_slot - i) * blocksize), +BTRFS_NESTING_COW );if (err) {btrfs_tree_unlock (cur);free_extent_buffer (cur);
fs/btrfs/ctree.h +7 -0
@@ -3032,6 +3032,13 @@ int btrfs_cow_block(struct btrfs_trans_handle *trans, struct extent_buffer *parent, int parent_slot, struct extent_buffer **cow_ret, enum btrfs_lock_nesting nest); +int btrfs_force_cow_block (struct btrfs_trans_handle *trans, +struct btrfs_root *root, +struct extent_buffer *buf, +struct extent_buffer *parent,int parent_slot, +struct extent_buffer **cow_ret, +u64 search_start,u64 empty_size, +enum btrfs_lock_nesting nest); int btrfs_copy_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct extent_buffer *buf,
fs/btrfs/disk-io.c +9 -0
@@ -4651,6 +4651,15 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)* already the cleaner, but below we run all pending delayed iputs. */ btrfs_flush_workqueue (fs_info->fixup_workers); +/* +* Similar case here, we have to wait for delalloc workers before we +* proceed below and stop the cleaner kthread, otherwise we trigger a +* use-after-tree on the cleaner kthread task_struct when a delalloc +* worker running submit_compressed_extents() adds a delayed iput, which +* does a wake up on the cleaner kthread, which was already freed below +* when we call kthread_stop(). +*/ +btrfs_flush_workqueue (fs_info->delalloc_workers);/* * After we parked the cleaner kthread, ordered extents may have
fs/btrfs/inode.c +1 -1
@@ -10469,7 +10469,7 @@ static void btrfs_encoded_read_endio(struct btrfs_bio *bbio)*/ WRITE_ONCE (priv->status, status); } -if (!atomic_dec_return (&priv->pending)) +if (atomic_dec_and_test (&priv->pending))wake_up (&priv->wait);btrfs_bio_free_csum (bbio);bio_put (&bbio->bio);
fs/smb/server/smb2pdu.c +11 -1
@@ -3988,6 +3988,7 @@ static bool __query_dir(struct dir_context *ctx, const char *name, int namlen,/* dot and dotdot entries are already reserved */ if (!strcmp ("." , name) || !strcmp (".." , name))return true; + d_info->num_scan++;if (ksmbd_share_veto_filename (priv->work->tcon->share_conf, name))return true;if (!match_pattern (name, namlen, priv->search_pattern))
@@ -4148,8 +4149,17 @@ int smb2_query_dir(struct ksmbd_work *work) query_dir_private.info_level = req->FileInformationClass; dir_fp->readdir_data.private = &query_dir_private;set_ctx_actor (&dir_fp->readdir_data.ctx, __query_dir); - +again: + d_info.num_scan =0 ; rc =iterate_dir (dir_fp->filp, &dir_fp->readdir_data.ctx); +/* +* num_entry can be 0 if the directory iteration stops before reaching +* the end of the directory and no file is matched with the search +* pattern. +*/ +if (rc >=0 && !d_info.num_entry && d_info.num_scan && + d_info.out_buf_len >0 ) + goto again;/* * req->OutputBufferLength is too small to contain even one entry. * In this case, it immediately returns OutputBufferLength 0 to client.
fs/smb/server/vfs.h +1 -0
@@ -43,6 +43,7 @@ struct ksmbd_dir_info {char *rptr;int name_len;int out_buf_len; +int num_scan;int num_entry;int data_count;int last_entry_offset;
include/clocksource/hyperv_timer.h +2 -0
@@ -34,6 +34,8 @@ extern void hv_init_clocksource(void);extern struct ms_hyperv_tsc_page *hv_get_tsc_page (void ); +extern void hv_adj_sched_clock_offset (u64 offset); + static inline notrace u64hv_read_tsc_page_tsc (const struct ms_hyperv_tsc_page *tsc_pg,u64 *cur_tsc) {
include/linux/if_vlan.h +13 -3
@@ -587,13 +587,16 @@ static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)* vlan_get_protocol - get protocol EtherType. * @skb: skbuff to query * @type: first vlan protocol +* @mac_offset: MAC offset * @depth: buffer to store length of eth and vlan tags in bytes * * Returns the EtherType of the packet, regardless of whether it is * vlan encapsulated (normal or hardware accelerated) or not. */ -static inline __be16 __vlan_get_protocol (const struct sk_buff *skb,__be16 type, -int *depth) +static inline __be16 __vlan_get_protocol_offset (const struct sk_buff *skb, +__be16 type, +int mac_offset, +int *depth) {unsigned int vlan_depth = skb->mac_len, parse_depth =VLAN_MAX_DEPTH ;
@@ -612,7 +615,8 @@ static inline __be16 __vlan_get_protocol(const struct sk_buff *skb, __be16 type, do { struct vlan_hdr vhdr, *vh; - vh = skb_header_pointer(skb, vlan_depth, sizeof(vhdr), &vhdr); + vh = skb_header_pointer(skb, mac_offset + vlan_depth, + sizeof(vhdr), &vhdr); if (unlikely(!vh || !--parse_depth)) return 0;
@@ -627,6 +631,12 @@ static inline __be16 __vlan_get_protocol(const struct sk_buff *skb, __be16 type,return type; } +static inline __be16 __vlan_get_protocol (const struct sk_buff *skb,__be16 type, +int *depth) +{ +return __vlan_get_protocol_offset (skb, type,0 , depth); +} +/** * vlan_get_protocol - get protocol EtherType. * @skb: skbuff to query
include/linux/mlx5/driver.h +6 -0
@@ -1212,6 +1212,12 @@ static inline bool mlx5_core_is_vf(const struct mlx5_core_dev *dev)return dev->coredev_type ==MLX5_COREDEV_VF ; } +static inline bool mlx5_core_same_coredev_type (const struct mlx5_core_dev *dev1, +const struct mlx5_core_dev *dev2) +{ +return dev1->coredev_type == dev2->coredev_type; +} +static inline bool mlx5_core_is_ecpf (const struct mlx5_core_dev *dev) {return dev->caps.embedded_cpu;
include/net/bluetooth/hci_core.h +70 -38
184 lines not on this page · raw message
include/net/ip_tunnels.h +15 -13
@@ -57,6 +57,13 @@ struct ip_tunnel_key {__u8 flow_flags; }; +struct ip_tunnel_encap { +u16 type; +u16 flags; +__be16 sport; +__be16 dport; +}; +/* Flags for ip_tunnel_info mode. */ #define IP_TUNNEL_INFO_TX 0x01/* represents tx tunnel parameters */ #define IP_TUNNEL_INFO_IPV6 0x02/* key contains IPv6 addresses */
@@ -66,9 +73,9 @@ struct ip_tunnel_key {#define IP_TUNNEL_OPTS_MAX \ GENMASK((sizeof_field(struct ip_tunnel_info, \ options_len) * BITS_PER_BYTE) - 1, 0) -struct ip_tunnel_info {struct ip_tunnel_key key; +struct ip_tunnel_encap encap;#ifdef CONFIG_DST_CACHE struct dst_cache dst_cache;#endif
@@ -86,13 +93,6 @@ struct ip_tunnel_6rd_parm { };#endif -struct ip_tunnel_encap { -u16 type; -u16 flags; -__be16 sport; -__be16 dport; -}; -struct ip_tunnel_prl_entry {struct ip_tunnel_prl_entry __rcu *next;__be32 addr;
@@ -293,6 +293,7 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, __be32 remote, __be32 local, __be32 key); +void ip_tunnel_md_udp_encap (struct sk_buff *skb,struct ip_tunnel_info *info);int ip_tunnel_rcv (struct ip_tunnel *tunnel,struct sk_buff *skb,const struct tnl_ptk_info *tpi,struct metadata_dst *tun_dst,bool log_ecn_error);
@@ -405,22 +406,23 @@ static inline int ip_encap_hlen(struct ip_tunnel_encap *e)return hlen; } -static inline int ip_tunnel_encap (struct sk_buff *skb,struct ip_tunnel *t, +static inline int ip_tunnel_encap (struct sk_buff *skb, +struct ip_tunnel_encap *e,u8 *protocol,struct flowi4 *fl4) {const struct ip_tunnel_encap_ops *ops;int ret = -EINVAL ; -if (t->encap.type ==TUNNEL_ENCAP_NONE ) +if (e->type ==TUNNEL_ENCAP_NONE )return 0 ; -if (t->encap.type >=MAX_IPTUN_ENCAP_OPS ) +if (e->type >=MAX_IPTUN_ENCAP_OPS )return -EINVAL ;rcu_read_lock (); - ops =rcu_dereference (iptun_encaps[t->encap.type]); + ops =rcu_dereference (iptun_encaps[e->type]);if (likely (ops && ops->build_header)) - ret = ops->build_header (skb, &t->encap, protocol, fl4); + ret = ops->build_header (skb, e, protocol, fl4);rcu_read_unlock ();return ret;
include/net/netfilter/nf_tables.h +5 -2
@@ -706,15 +706,18 @@ struct nft_set_ext_tmpl {/** * struct nft_set_ext - set extensions * -* @genmask: generation mask +* @genmask: generation mask, but also flags (see NFT_SET_ELEM_DEAD_BIT) * @offset: offsets of individual extension types * @data: beginning of extension data +* +* This structure must be aligned to word size, otherwise atomic bitops +* on genmask field can cause alignment failure on some archs. */ struct nft_set_ext {u8 genmask;u8 offset[NFT_SET_EXT_NUM ];char data[]; -}; +}__aligned(BITS_PER_LONG / 8) ;static inline void nft_set_ext_prepare (struct nft_set_ext_tmpl *tmpl) {
kernel/bpf/core.c +5 -1
@@ -523,6 +523,8 @@ struct bpf_prog *bpf_patch_insn_single(struct bpf_prog *prog, u32 off,int bpf_remove_insns (struct bpf_prog *prog,u32 off,u32 cnt) { +int err; +/* Branch offsets can't overflow when program is shrinking, no need * to call bpf_adj_branches(..., true) here */
@@ -530,7 +532,9 @@ int bpf_remove_insns(struct bpf_prog *prog, u32 off, u32 cnt) sizeof(struct bpf_insn) * (prog->len - off - cnt)); prog->len -= cnt; -return WARN_ON_ONCE (bpf_adj_branches (prog, off, off + cnt, off, false)); + err =bpf_adj_branches (prog, off, off + cnt, off, false); +WARN_ON_ONCE (err); +return err; }static void bpf_prog_kallsyms_del_subprogs (struct bpf_prog *fp)
kernel/kcov.c +1 -1
@@ -165,7 +165,7 @@ static void kcov_remote_area_put(struct kcov_remote_area *area,* Unlike in_serving_softirq(), this function returns false when called during * a hardirq or an NMI that happened in the softirq context. */ -static inline bool in_softirq_really (void ) +static __always_inline bool in_softirq_really(void) {return in_serving_softirq () && !in_hardirq () && !in_nmi (); }
kernel/trace/trace_events.c +12 -0
@@ -358,6 +358,18 @@ static bool process_string(const char *fmt, int len, struct trace_event_call *ca s = r +1 ; }while (s < e); +/* +* Check for arrays. If the argument has: foo[REC->val] +* then it is very likely that foo is an array of strings +* that are safe to use. +*/ + r =strstr (s,"[" ); +if (r && r < e) { + r =strstr (r,"REC->" ); +if (r && r < e) +return true; + } +/* * If there's any strings in the argument consider this arg OK as it * could be: REC->field ? "foo" : "bar" and we don't want to get into
mm/readahead.c +5 -1
@@ -599,7 +599,11 @@ static void ondemand_readahead(struct readahead_control *ractl, 1UL << order);if (index == expected || index == (ra->start + ra->size)) { ra->start += ra->size; - ra->size =get_next_ra_size (ra, max_pages); +/* +* In the case of MADV_HUGEPAGE, the actual size might exceed +* the readahead window. +*/ + ra->size =max (ra->size,get_next_ra_size (ra, max_pages)); ra->async_size = ra->size; goto readit; }
mm/vmscan.c +8 -1
@@ -588,7 +588,14 @@ unsigned long zone_reclaimable_pages(struct zone *zone)if (can_reclaim_anon_pages (NULL ,zone_to_nid (zone),NULL )) nr +=zone_page_state_snapshot (zone,NR_ZONE_INACTIVE_ANON ) +zone_page_state_snapshot (zone,NR_ZONE_ACTIVE_ANON ); - +/* +* If there are no reclaimable file-backed or anonymous pages, +* ensure zones with sufficient free pages are not skipped. +* This prevents zones like DMA32 from being ignored in reclaim +* scenarios where they can still help alleviate memory pressure. +*/ +if (nr ==0 ) + nr =zone_page_state_snapshot (zone,NR_FREE_PAGES );return nr; }
net/bluetooth/hci_core.c +3 -7
@@ -58,7 +58,6 @@ DEFINE_RWLOCK(hci_dev_list_lock);/* HCI callback list */ LIST_HEAD (hci_cb_list); -DEFINE_MUTEX (hci_cb_list_lock);/* HCI ID Numbering */ static DEFINE_IDA (hci_index_ida);
@@ -2978,9 +2977,7 @@ int hci_register_cb(struct hci_cb *cb) {BT_DBG ("%p name %s" , cb, cb->name); -mutex_lock (&hci_cb_list_lock); -list_add_tail (&cb->list, &hci_cb_list); -mutex_unlock (&hci_cb_list_lock); +list_add_tail_rcu (&cb->list, &hci_cb_list);return 0 ; }
@@ -2990,9 +2987,8 @@ int hci_unregister_cb(struct hci_cb *cb) {BT_DBG ("%p name %s" , cb, cb->name); -mutex_lock (&hci_cb_list_lock); -list_del (&cb->list); -mutex_unlock (&hci_cb_list_lock); +list_del_rcu (&cb->list); +synchronize_rcu ();return 0 ; }
net/bluetooth/iso.c +6 -0
@@ -1579,6 +1579,11 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)return lm; } +static bool iso_match (struct hci_conn *hcon) +{ +return hcon->type ==ISO_LINK || hcon->type ==LE_LINK ; +} +static void iso_connect_cfm (struct hci_conn *hcon,__u8 status) {if (hcon->type !=ISO_LINK ) {
@@ -1748,6 +1753,7 @@ void iso_recv(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)static struct hci_cb iso_cb = { .name ="ISO" , + .match = iso_match, .connect_cfm = iso_connect_cfm, .disconn_cfm = iso_disconn_cfm, };
net/bluetooth/l2cap_core.c +6 -6
@@ -8273,6 +8273,11 @@ static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,return NULL ; } +static bool l2cap_match (struct hci_conn *hcon) +{ +return hcon->type ==ACL_LINK || hcon->type ==LE_LINK ; +} +static void l2cap_connect_cfm (struct hci_conn *hcon,u8 status) {struct hci_dev *hdev = hcon->hdev;
@@ -8280,9 +8285,6 @@ static void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)struct l2cap_chan *pchan;u8 dst_type; -if (hcon->type !=ACL_LINK && hcon->type !=LE_LINK ) -return ; -BT_DBG ("hcon %p bdaddr %pMR status %d" , hcon, &hcon->dst, status);if (status) {
@@ -8347,9 +8349,6 @@ int l2cap_disconn_ind(struct hci_conn *hcon)static void l2cap_disconn_cfm (struct hci_conn *hcon,u8 reason) { -if (hcon->type !=ACL_LINK && hcon->type !=LE_LINK ) -return ; -BT_DBG ("hcon %p reason %d" , hcon, reason);l2cap_conn_del (hcon,bt_to_errno (reason));
@@ -8637,6 +8636,7 @@ void l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)static struct hci_cb l2cap_cb = { .name ="L2CAP" , + .match = l2cap_match, .connect_cfm = l2cap_connect_cfm, .disconn_cfm = l2cap_disconn_cfm, .security_cfm = l2cap_security_cfm,
net/bluetooth/rfcomm/core.c +6 -0
@@ -2130,6 +2130,11 @@ static int rfcomm_run(void *unused)return 0 ; } +static bool rfcomm_match (struct hci_conn *hcon) +{ +return hcon->type ==ACL_LINK ; +} +static void rfcomm_security_cfm (struct hci_conn *conn,u8 status,u8 encrypt) {struct rfcomm_session *s;
@@ -2176,6 +2181,7 @@ static void rfcomm_security_cfm(struct hci_conn *conn, u8 status, u8 encrypt)static struct hci_cb rfcomm_cb = { .name ="RFCOMM" , + .match = rfcomm_match, .security_cfm = rfcomm_security_cfm };
net/bluetooth/sco.c +6 -6
@@ -1367,11 +1367,13 @@ int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)return lm; } -static void sco_connect_cfm (struct hci_conn *hcon,__u8 status) +static bool sco_match (struct hci_conn *hcon) { -if (hcon->type !=SCO_LINK && hcon->type !=ESCO_LINK ) -return ; +return hcon->type ==SCO_LINK || hcon->type ==ESCO_LINK ; +} +static void sco_connect_cfm (struct hci_conn *hcon,__u8 status) +{BT_DBG ("hcon %p bdaddr %pMR status %u" , hcon, &hcon->dst, status);if (!status) {
@@ -1386,9 +1388,6 @@ static void sco_connect_cfm(struct hci_conn *hcon, __u8 status)static void sco_disconn_cfm (struct hci_conn *hcon,__u8 reason) { -if (hcon->type !=SCO_LINK && hcon->type !=ESCO_LINK ) -return ; -BT_DBG ("hcon %p reason %d" , hcon, reason);sco_conn_del (hcon,bt_to_errno (reason));
@@ -1414,6 +1413,7 @@ void sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)static struct hci_cb sco_cb = { .name ="SCO" , + .match = sco_match, .connect_cfm = sco_connect_cfm, .disconn_cfm = sco_disconn_cfm, };
net/core/dev.c +3 -1
@@ -3679,8 +3679,10 @@ int skb_csum_hwoffload_help(struct sk_buff *skb,if (features & (NETIF_F_IP_CSUM |NETIF_F_IPV6_CSUM )) {if (vlan_get_protocol (skb) ==htons (ETH_P_IPV6 ) && -skb_network_header_len (skb) !=sizeof (struct ipv6hdr )) +skb_network_header_len (skb) !=sizeof (struct ipv6hdr ) && + !ipv6_has_hopopt_jumbo (skb)) goto sw_checksum; +switch (skb->csum_offset) {case offsetof(struct tcphdr , check):case offsetof(struct udphdr , check):
net/core/sock.c +4 -1
@@ -1122,7 +1122,10 @@ int sk_setsockopt(struct sock *sk, int level, int optname, sk->sk_reuse = (valbool ?SK_CAN_REUSE :SK_NO_REUSE );break ;case SO_REUSEPORT : - sk->sk_reuseport = valbool; +if (valbool && !sk_is_inet (sk)) + ret = -EOPNOTSUPP ; +else + sk->sk_reuseport = valbool;break ;case SO_TYPE :case SO_PROTOCOL :
net/ipv4/ip_tunnel.c +39 -21
139 lines not on this page · raw message
net/ipv4/ipip.c +1 -0
@@ -241,6 +241,7 @@ static int ipip_tunnel_rcv(struct sk_buff *skb, u8 ipproto) tun_dst =ip_tun_rx_dst (skb,0 ,0 ,0 );if (!tun_dst)return 0 ; +ip_tunnel_md_udp_encap (skb, &tun_dst->u.tun_info); }skb_reset_mac_header (skb);
net/ipv4/tcp_input.c +1 -0
@@ -7124,6 +7124,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,if (unlikely (!inet_csk_reqsk_queue_hash_add (sk, req, req->timeout))) {reqsk_free (req); +dst_release (dst);return 0 ; }
net/ipv6/ila/ila_xlat.c +11 -5
@@ -201,6 +201,8 @@ static const struct nf_hook_ops ila_nf_hook_ops[] = { }, }; +static DEFINE_MUTEX (ila_mutex); +static int ila_add_mapping (struct net *net,struct ila_xlat_params *xp) {struct ila_net *ilan =net_generic (net, ila_net_id);
@@ -208,16 +210,20 @@ static int ila_add_mapping(struct net *net, struct ila_xlat_params *xp)spinlock_t *lock =ila_get_lock (ilan, xp->ip.locator_match);int err =0 , order; -if (!ilan->xlat.hooks_registered) { +if (!READ_ONCE (ilan->xlat.hooks_registered)) {/* We defer registering net hooks in the namespace until the * first mapping is added. */ - err =nf_register_net_hooks (net, ila_nf_hook_ops, -ARRAY_SIZE (ila_nf_hook_ops)); +mutex_lock (&ila_mutex); +if (!ilan->xlat.hooks_registered) { + err =nf_register_net_hooks (net, ila_nf_hook_ops, +ARRAY_SIZE (ila_nf_hook_ops)); +if (!err) +WRITE_ONCE (ilan->xlat.hooks_registered, true); + } +mutex_unlock (&ila_mutex);if (err)return err; - - ilan->xlat.hooks_registered = true; } ila =kzalloc (sizeof (*ila),GFP_KERNEL );
net/ipv6/sit.c +1 -1
@@ -1024,7 +1024,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb, ttl = iph6->hop_limit; tos =INET_ECN_encapsulate (tos,ipv6_get_dsfield (iph6)); -if (ip_tunnel_encap (skb, tunnel, &protocol, &fl4) <0 ) { +if (ip_tunnel_encap (skb, &tunnel->encap, &protocol, &fl4) <0 ) {ip_rt_put (rt); goto tx_error; }
net/llc/llc_input.c +1 -1
@@ -124,8 +124,8 @@ static inline int llc_fixup_skb(struct sk_buff *skb)if (unlikely (!pskb_may_pull (skb, llc_len)))return 0 ; - skb->transport_header += llc_len;skb_pull (skb, llc_len); +skb_reset_transport_header (skb);if (skb->protocol ==htons (ETH_P_802_2 )) {__be16 pdulen;s32 data_size;
net/mac80211/util.c +3 -0
@@ -2436,6 +2436,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)WARN (1 ,"Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue.\n" ); else WARN(1, "Hardware became unavailable during restart.\n"); +ieee80211_wake_queues_by_reason (hw,IEEE80211_MAX_QUEUE_MAP , +IEEE80211_QUEUE_STOP_REASON_SUSPEND , + false);ieee80211_handle_reconfig_failure (local);return res; }
net/mctp/route.c +26 -10
@@ -334,8 +334,13 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb) msk =NULL ; rc = -EINVAL ; -/* we may be receiving a locally-routed packet; drop source sk -* accounting +/* We may be receiving a locally-routed packet; drop source sk +* accounting. +* +* From here, we will either queue the skb - either to a frag_queue, or +* to a receiving socket. When that succeeds, we clear the skb pointer; +* a non-NULL skb on exit will be otherwise unowned, and hence +* kfree_skb()-ed. */ skb_orphan (skb);
@@ -389,7 +394,9 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)* pending key. */ if (flags &MCTP_HDR_FLAG_EOM ) { -sock_queue_rcv_skb (&msk->sk, skb); + rc =sock_queue_rcv_skb (&msk->sk, skb); +if (!rc) + skb =NULL ;if (key) {/* we've hit a pending reassembly; not much we * can do but drop it
@@ -398,7 +405,6 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb) MCTP_TRACE_KEY_REPLIED); key =NULL ; } - rc =0 ; goto out_unlock; }
@@ -425,8 +431,10 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)* this function. */ rc =mctp_key_add (key, msk); -if (!rc) +if (!rc) {trace_mctp_key_acquire (key); + skb =NULL ; + }/* we don't need to release key->lock on exit, so * clean up here and suppress the unlock via
@@ -444,6 +452,8 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb) key =NULL ; }else { rc =mctp_frag_queue (key, skb); +if (!rc) + skb =NULL ; } }
@@ -458,12 +468,19 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)else rc =mctp_frag_queue (key, skb); +if (rc) + goto out_unlock; + +/* we've queued; the queue owns the skb now */ + skb =NULL ; +/* end of message? deliver to socket, and we're done with * the reassembly/response key */ -if (!rc && flags &MCTP_HDR_FLAG_EOM ) { -sock_queue_rcv_skb (key->sk, key->reasm_head); - key->reasm_head =NULL ; +if (flags &MCTP_HDR_FLAG_EOM ) { + rc =sock_queue_rcv_skb (key->sk, key->reasm_head); +if (!rc) + key->reasm_head =NULL ;__mctp_key_done_in (key, net, f,MCTP_TRACE_KEY_REPLIED ); key =NULL ; }
@@ -482,8 +499,7 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)if (any_key)mctp_key_unref (any_key); out: -if (rc) -kfree_skb (skb); +kfree_skb (skb);return rc; }
net/mptcp/options.c +7 -0
@@ -665,8 +665,15 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff * &echo, &drop_other_suboptions))return false; +/* +* Later on, mptcp_write_options() will enforce mutually exclusion with +* DSS, bail out if such option is set and we can't drop it. +*/ if (drop_other_suboptions) remaining += opt_size; +else if (opts->suboptions &OPTION_MPTCP_DSS ) +return false; + len =mptcp_add_addr_len (opts->addr.family, echo, !!opts->addr.port);if (remaining < len)return false;
net/mptcp/protocol.c +11 -11
@@ -538,13 +538,13 @@ static void mptcp_send_ack(struct mptcp_sock *msk)mptcp_subflow_send_ack (mptcp_subflow_tcp_sock (subflow)); } -static void mptcp_subflow_cleanup_rbuf (struct sock *ssk) +static void mptcp_subflow_cleanup_rbuf (struct sock *ssk,int copied) {bool slow; slow =lock_sock_fast (ssk);if (tcp_can_send_ack (ssk)) -tcp_cleanup_rbuf (ssk,1 ); +tcp_cleanup_rbuf (ssk, copied);unlock_sock_fast (ssk, slow); }
@@ -561,7 +561,7 @@ static bool mptcp_subflow_could_cleanup(const struct sock *ssk, bool rx_empty) (ICSK_ACK_PUSHED2 | ICSK_ACK_PUSHED))); } -static void mptcp_cleanup_rbuf (struct mptcp_sock *msk) +static void mptcp_cleanup_rbuf (struct mptcp_sock *msk,int copied) {int old_space =READ_ONCE (msk->old_wspace);struct mptcp_subflow_context *subflow;
@@ -569,14 +569,14 @@ static void mptcp_cleanup_rbuf(struct mptcp_sock *msk)int space =__mptcp_space (sk);bool cleanup, rx_empty; - cleanup = (space >0 ) && (space >= (old_space <<1 )); - rx_empty = !__mptcp_rmem (sk); + cleanup = (space >0 ) && (space >= (old_space <<1 )) && copied; + rx_empty = !__mptcp_rmem (sk) && copied;mptcp_for_each_subflow (msk, subflow) {struct sock *ssk =mptcp_subflow_tcp_sock (subflow);if (cleanup ||mptcp_subflow_could_cleanup (ssk, rx_empty)) -mptcp_subflow_cleanup_rbuf (ssk); +mptcp_subflow_cleanup_rbuf (ssk, copied); } }
@@ -1917,6 +1917,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) goto out; } +static void mptcp_rcv_space_adjust (struct mptcp_sock *msk,int copied); + static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk, struct msghdr *msg, size_t len, int flags,
@@ -1968,6 +1970,7 @@ static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,break ; } +mptcp_rcv_space_adjust (msk, copied);return copied; }
@@ -2192,9 +2195,6 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, copied += bytes_read; -/* be sure to advertise window change */ -mptcp_cleanup_rbuf (msk); -if (skb_queue_empty (&msk->receive_queue) &&__mptcp_move_skbs (msk))continue ;
@@ -2246,7 +2246,7 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, }pr_debug ("block timeout %ld\n" , timeo); -mptcp_rcv_space_adjust (msk, copied); +mptcp_cleanup_rbuf (msk, copied); err =sk_wait_data (sk, &timeo,NULL );if (err <0 ) { err = copied ? : err;
@@ -2254,7 +2254,7 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, } } -mptcp_rcv_space_adjust (msk, copied); +mptcp_cleanup_rbuf (msk, copied); out_err:if (cmsg_flags && copied >=0 ) {
net/netrom/nr_route.c +6 -0
@@ -754,6 +754,12 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)int ret;struct sk_buff *skbn; +/* +* Reject malformed packets early. Check that it contains at least 2 +* addresses and 1 byte more for Time-To-Live +*/ +if (skb->len <2 *sizeof (ax25_address) +1 ) +return 0 ; nr_src = (ax25_address *)(skb->data +0 ); nr_dest = (ax25_address *)(skb->data +7 );
net/packet/af_packet.c +7 -21
@@ -541,10 +541,8 @@ static void *packet_current_frame(struct packet_sock *po,return packet_lookup_frame (po, rb, rb->head, status); } -static u16 vlan_get_tci (struct sk_buff *skb,struct net_device *dev) +static u16 vlan_get_tci (const struct sk_buff *skb,struct net_device *dev) { -u8 *skb_orig_data = skb->data; -int skb_orig_len = skb->len;struct vlan_hdr vhdr, *vh;unsigned int header_len;
@@ -565,33 +563,21 @@ static u16 vlan_get_tci(struct sk_buff *skb, struct net_device *dev)else return 0 ; -skb_push (skb, skb->data -skb_mac_header (skb)); - vh =skb_header_pointer (skb, header_len,sizeof (vhdr), &vhdr); -if (skb_orig_data != skb->data) { - skb->data = skb_orig_data; - skb->len = skb_orig_len; - } + vh =skb_header_pointer (skb,skb_mac_offset (skb) + header_len, +sizeof (vhdr), &vhdr);if (unlikely (!vh))return 0 ;return ntohs (vh->h_vlan_TCI); } -static __be16 vlan_get_protocol_dgram (struct sk_buff *skb) +static __be16 vlan_get_protocol_dgram (const struct sk_buff *skb) {__be16 proto = skb->protocol; -if (unlikely (eth_type_vlan (proto))) { -u8 *skb_orig_data = skb->data; -int skb_orig_len = skb->len; - -skb_push (skb, skb->data -skb_mac_header (skb)); - proto =__vlan_get_protocol (skb, proto,NULL ); -if (skb_orig_data != skb->data) { - skb->data = skb_orig_data; - skb->len = skb_orig_len; - } - } +if (unlikely (eth_type_vlan (proto))) + proto =__vlan_get_protocol_offset (skb, proto, +skb_mac_offset (skb),NULL );return proto; }
net/sctp/associola.c +2 -1
@@ -137,7 +137,8 @@ static struct sctp_association *sctp_association_init( = 5 * asoc->rto_max; asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK ] = asoc->sackdelay; - asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE ] = sp->autoclose *HZ ; + asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE ] = + (unsigned long )sp->autoclose *HZ ;/* Initializes the timers */ for (i =SCTP_EVENT_TIMEOUT_NONE ; i <SCTP_NUM_TIMEOUT_TYPES ; ++i)
scripts/mod/file2alias.c +2 -2
@@ -741,8 +741,8 @@ static void do_input(char *alias,for (i = min /BITS_PER_LONG ; i < max /BITS_PER_LONG +1 ; i++) arr[i] =TO_NATIVE (arr[i]); -for (i = min; i < max; i++) -if (arr[i /BITS_PER_LONG ] & (1L << (i%BITS_PER_LONG ))) +for (i = min; i <= max; i++) +if (arr[i /BITS_PER_LONG ] & (1ULL << (i%BITS_PER_LONG )))sprintf (alias +strlen (alias),"%X,*" , i); }
security/selinux/ss/services.c +6 -2
@@ -969,7 +969,10 @@ void services_compute_xperms_decision(struct extended_perms_decision *xpermd, xpermd->driver))return ;
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.