Merge 6.6.95 into android15-6.6-lts
GKI (arm64) relevant 63 out of 289 changes, affecting 78 files +564/-2210df5e4c7de
configfs: Do not override creating attribute file failure in populate_attrs() [1 file, +1/-1]a8b5ef3554
io_uring: account drain memory to cgroup [1 file, +1/-1]0257c26bbc
io_uring/kbuf: account ring io_buffer_list memory [1 file, +1/-1]2e7c64d7a9
jbd2: fix data-race and null-ptr-deref in jbd2_journal_dirty_metadata() [1 file, +3/-2]ae7b143e05
media: v4l2-dev: fix error handling in __video_register_device() [1 file, +7/-7]17cb043ea1
media: videobuf2: use sgtable-based scatterlist wrappers [1 file, +2/-2]d314f99b6f
media: uvcvideo: Return the number of processed controls [1 file, +10/-1]c51c0a0be2
media: uvcvideo: Send control events for partial succeeds [1 file, +9/-3]a31dce9b56
media: uvcvideo: Fix deferred probing error [1 file, +19/-8]12cffd5bd1
arm64/mm: Close theoretical race where stale TLB entry remains valid [1 file, +5/-4]48f35a3294
cgroup,freezer: fix incomplete freezing when attaching tasks [1 file, +1/-2]26e09d1859
ext4: inline: fix len overflow in ext4_prepare_inline_data [1 file, +1/-1]223091c989
ext4: fix calculation of credits for extent tree modification [1 file, +6/-5]3e8a5163bc
ext4: ensure i_size is smaller than maxbytes [1 file, +2/-1]cf6a4c4ac7
ext4: only dirty folios when data journaling regular files [1 file, +6/-1]0f7100e8d9
Input: gpio-keys - fix possible concurrent access in gpio_keys_irq_timer() [1 file, +2/-0]aaddc6c696
f2fs: fix to do sanity check on ino and xnid [1 file, +6/-0]a87cbcc909
f2fs: prevent kernel warning due to negative i_nlink from corrupted image [1 file, +9/-0]79ef8a6c4e
f2fs: fix to do sanity check on sit_bitmap_size [1 file, +8/-0]442e80dcf6
watchdog: fix watchdog may detect false positive of softlockup [1 file, +27/-14]d3abf0066b
mm: fix ratelimit_pages update error in dirty_ratio_handler() [1 file, +1/-1]df4918c0bb
dm-verity: fix a memory leak if some arguments are specified multiple times [3 files, +24/-5]9515d74c9d
remoteproc: core: Cleanup acquired resources when rproc_handle_resources() fails in rproc_attach() [1 file, +2/-3]3ee979709e
remoteproc: core: Release rproc->clean_table after rproc_attach() fails [1 file, +1/-0]7f6a2d3784
PCI: Add ACS quirk for Loongson PCIe [1 file, +23/-0]0b522796a8
PCI: Fix lock symmetry in pci_slot_unlock() [1 file, +2/-1]1c24a73897
clocksource: Fix the CPUs' choice in the watchdog per CPU verification [1 file, +1/-1]8621fbeb4d
ACPI: Add missing prototype for non CONFIG_SUSPEND/CONFIG_X86 case [1 file, +8/-1]6a7c583f56
gpiolib: of: Add polarity quirk for s5m8767 [1 file, +9/-0]6635356483
PM: runtime: fix denying of auto suspend in pm_suspend_timer_fn() [1 file, +1/-1]92dbc2a2e2
tipc: use kfree_sensitive() for aead cleanup [1 file, +1/-1]61fc32485d
f2fs: use vmalloc instead of kvmalloc in .init_{,de}compress_ctx [2 files, +15/-13]7bf4461f1c
bpf: Check rcu_read_lock_trace_held() in bpf_map_lookup_percpu_elem() [1 file, +2/-1]762325441e
cpufreq: scmi: Skip SCMI devices that aren't used by the CPUs [1 file, +35/-1]156b6bac76
tcp: always seek for minimal rtt in tcp_rcv_rtt_update() [1 file, +8/-14]c1025a5428
tcp: fix initial tp->rcvq_space.space value for passive TS enabled flows [1 file, +3/-3]9121c2ddd1
ipv4/route: Use this_cpu_inc() for stats on PREEMPT_RT [1 file, +4/-0]b4c83b3749
net: bridge: mcast: re-implement br_multicast_{enable, disable}_port functions [1 file, +69/-8]f9397cf7bf
software node: Correct a OOB check in software_node_get_reference_args() [1 file, +1/-1]52a16bafda
sock: Correct error checking condition for (assign|release)_proto_idx() [1 file, +2/-2]bdb4da9e19
f2fs: fix to set atomic write status more clear [3 files, +12/-2]38c4106cb4
bpf, sockmap: Fix data lost during EAGAIN retries [1 file, +2/-1]7d71ba5b0a
fs/xattr.c: fix simple_xattr_list() [1 file, +1/-0]675d90ee87
io_uring: fix task leak issue in io_wq_create() [1 file, +3/-1]0357da9149
net_sched: sch_sfq: reject invalid perturb period [1 file, +8/-2]bfa4d86e13
net: clear the dst when changing skb protocol [1 file, +13/-6]3902205ead
atm: Revert atm_account_tx() if copy_from_iter_full() fails. [3 files, +8/-1]6562806f32
arm64: Restrict pagetable teardown to avoid false warning [1 file, +2/-1]af6cfcd0ef
mm/hugetlb: unshare page tables during VMA split, not before [3 files, +53/-16]3977946f61
mm/huge_memory: fix dereferencing invalid pmd migration entry [1 file, +6/-5]f6393e5cb9
net: Fix checksum update for ILA adj-transport [4 files, +7/-7]2536810df1
bpf: Fix L4 csum update on IPv6 in CHECKSUM_COMPLETE [3 files, +7/-2]5e5d2ad976
erofs: remove unused trace event erofs_destroy_inode [1 file, +0/-18]43e3433a48
ptp: allow reading of currently dialed frequency to succeed on free-running clocks [1 file, +2/-1]9d0ddfb574
tcp: fix tcp_packet_delayed() for tcp_is_non_sack_preventing_reopen() behavior [1 file, +25/-12]d3dfe821df
tipc: fix null-ptr-deref when acquiring remote ip of ethernet bearer [1 file, +2/-2]235aa081e2
tcp: fix passive TFO socket having invalid NAPI ID [1 file, +3/-0]3162d8235c
ublk: santizize the arguments from userspace when adding a device [1 file, +3/-0]cfa7fa0207
net: make for_each_netdev_dump() a little more bug-proof [1 file, +2/-1]2ee6044a69
perf: Fix sample vs do_exit() [2 files, +16/-8]bddec73050
perf: Fix cgroup state vs ERROR [1 file, +30/-21]7c631e5cd3
perf/core: Fix WARN in perf_cgroup_switch() [1 file, +20/-2]21da6d3561
arm64/ptrace: Fix stack-out-of-bounds read in regs_get_kernel_stack_nth() [1 file, +1/-1] Changes in 6.6.95 configfs: Do not override creating attribute file failure in populate_attrs() crypto: marvell/cesa - Do not chain submitted requests gfs2: move msleep to sleepable context ASoC: qcom: sdm845: Add error handling in sdm845_slim_snd_hw_params() ASoC: meson: meson-card-utils: use of_property_present() for DT parsing io_uring: account drain memory to cgroup io_uring/kbuf: account ring io_buffer_list memory powerpc/pseries/msi: Avoid reading PCI device registers in reduced power states regulator: max20086: Fix MAX200086 chip id regulator: max20086: Change enable gpio to optional net/mlx5_core: Add error handling inmlx5_query_nic_vport_qkey_viol_cntr() net/mlx5: Add error handling in mlx5_query_nic_vport_node_guid() wifi: p54: prevent buffer-overflow in p54_rx_eeprom_readback() wifi: ath11k: fix rx completion meta data corruption wifi: ath11k: fix ring-buffer corruption nfsd: nfsd4_spo_must_allow() must check this is a v4 compound request nfsd: Initialize ssc before laundromat_work to prevent NULL dereference SUNRPC: Prevent hang on NFS mount with xprtsec=[m]tls fs/nfs/read: fix double-unlock bug in nfs_return_empty_folio() wifi: ath12k: fix ring-buffer corruption jbd2: fix data-race and null-ptr-deref in jbd2_journal_dirty_metadata() wifi: rtw88: usb: Reduce control message timeout to 500 ms wifi: rtlwifi: disable ASPM for RTL8723BE with subsystem ID 11ad:1723 media: ov8856: suppress probe deferral errors media: ov5675: suppress probe deferral errors media: nxp: imx8-isi: better handle the m2m usage_count media: i2c: ds90ub913: Fix returned fmt from .set_fmt() media: ccs-pll: Start VT pre-PLL multiplier search from correct value media: ccs-pll: Start OP pre-PLL multiplier search from correct value media: ccs-pll: Correct the upper limit of maximum op_pre_pll_clk_div media: ccs-pll: Check for too high VT PLL multiplier in dual PLL case media: cxusb: no longer judge rbuf when the write fails media: davinci: vpif: Fix memory leak in probe error path media: gspca: Add error handling for stv06xx_read_sensor() media: mediatek: vcodec: Correct vsi_core framebuffer size media: omap3isp: use sgtable-based scatterlist wrappers media: v4l2-dev: fix error handling in __video_register_device() media: venus: Fix probe error handling media: videobuf2: use sgtable-based scatterlist wrappers media: vidtv: Terminating the subsequent process of initialization failure media: vivid: Change the siize of the composing media: imx-jpeg: Drop the first error frames media: imx-jpeg: Move mxc_jpeg_free_slot_data() ahead media: imx-jpeg: Reset slot data pointers when freed media: imx-jpeg: Cleanup after an allocation error media: uvcvideo: Return the number of processed controls media: uvcvideo: Send control events for partial succeeds media: uvcvideo: Fix deferred probing error arm64/mm: Close theoretical race where stale TLB entry remains valid ARM: 9447/1: arm/memremap: fix arch_memremap_can_ram_remap() ARM: omap: pmic-cpcap: do not mess around without CPCAP or OMAP4 bus: mhi: ep: Update read pointer only after buffer is written bus: mhi: host: Fix conflict between power_up and SYSERR can: tcan4x5x: fix power regulator retrieval during probe ceph: set superblock s_magic for IMA fsmagic matching cgroup,freezer: fix incomplete freezing when attaching tasks ata: pata_via: Force PIO for ATAPI devices on VT6415/VT6330 bus: fsl-mc: do not add a device-link for the UAPI used DPMCP device bus: fsl-mc: fix GET/SET_TAILDROP command ids ext4: inline: fix len overflow in ext4_prepare_inline_data ext4: fix calculation of credits for extent tree modification ext4: factor out ext4_get_maxbytes() ext4: ensure i_size is smaller than maxbytes ext4: only dirty folios when data journaling regular files Input: ims-pcu - check record size in ims_pcu_flash_firmware() Input: gpio-keys - fix possible concurrent access in gpio_keys_irq_timer() f2fs: fix to do sanity check on ino and xnid f2fs: prevent kernel warning due to negative i_nlink from corrupted image f2fs: fix to do sanity check on sit_bitmap_size hwmon: (ftsteutates) Fix TOCTOU race in fts_read() NFC: nci: uart: Set tty->disc_data only in success path net/sched: fix use-after-free in taprio_dev_notifier net: ftgmac100: select FIXED_PHY fbdev: Fix do_register_framebuffer to prevent null-ptr-deref in fb_videomode_to_var EDAC/altera: Use correct write width with the INTTEST register fbdev: Fix fb_set_var to prevent null-ptr-deref in fb_videomode_to_var parisc/unaligned: Fix hex output to show 8 hex chars vgacon: Add check for vc_origin address range in vgacon_scroll() parisc: fix building with gcc-15 clk: meson-g12a: add missing fclk_div2 to spicc ipc: fix to protect IPCS lookups using RCU watchdog: fix watchdog may detect false positive of softlockup RDMA/iwcm: Fix use-after-free of work objects after cm_id destruction mm: fix ratelimit_pages update error in dirty_ratio_handler() mtd: rawnand: sunxi: Add randomizer configuration in sunxi_nfc_hw_ecc_write_chunk mtd: nand: sunxi: Add randomizer configuration before randomizer enable KVM: SVM: Clear current_vmcb during vCPU free for all *possible* CPUs KVM: VMX: Flush shadow VMCS on emergency reboot dm-mirror: fix a tiny race condition dm-verity: fix a memory leak if some arguments are specified multiple times mtd: rawnand: qcom: Fix read len for onfi param page ftrace: Fix UAF when lookup kallsym after ftrace disabled phy: fsl-imx8mq-usb: fix phy_tx_vboost_level_from_property() net: ch9200: fix uninitialised access during mii_nway_restart KVM: s390: rename PROT_NONE to PROT_TYPE_DUMMY video: screen_info: Relocate framebuffers behind PCI bridges staging: iio: ad5933: Correct settling cycles encoding per datasheet mips: Add -std= flag specified in KBUILD_CFLAGS to vdso CFLAGS regulator: max14577: Add error check for max14577_read_reg() remoteproc: core: Cleanup acquired resources when rproc_handle_resources() fails in rproc_attach() remoteproc: core: Release rproc->clean_table after rproc_attach() fails cifs: reset connections for all channels when reconnect requested cifs: update dstaddr whenever channel iface is updated cifs: dns resolution is needed only for primary channel smb: client: add NULL check in automount_fullpath Drivers: hv: Allocate interrupt and monitor pages aligned to system page boundary uio_hv_generic: Use correct size for interrupt and monitor pages PCI: cadence-ep: Correct PBA offset in .set_msix() callback PCI: Add ACS quirk for Loongson PCIe PCI: Fix lock symmetry in pci_slot_unlock() PCI: dw-rockchip: Fix PHY function call sequence in rockchip_pcie_phy_deinit() iio: accel: fxls8962af: Fix temperature scan element sign mm/hugetlb: fix huge_pmd_unshare() vs GUP-fast race iio: imu: inv_icm42600: Fix temperature calculation iio: adc: ad7606_spi: fix reg write value mask ACPICA: fix acpi operand cache leak in dswstate.c ASoC: amd: yc: Add quirk for Lenovo Yoga Pro 7 14ASP9 clocksource: Fix the CPUs' choice in the watchdog per CPU verification power: supply: collie: Fix wakeup source leaks on device unbind mmc: Add quirk to disable DDR50 tuning ACPICA: Avoid sequence overread in call to strncmp() ASoC: tas2770: Power cycle amp on ISENSE/VSENSE change ACPI: bus: Bail out if acpi_kobj registration fails ACPI: Add missing prototype for non CONFIG_SUSPEND/CONFIG_X86 case ACPICA: fix acpi parse and parseext cache leaks power: supply: bq27xxx: Retrieve again when busy ACPICA: utilities: Fix overflow check in vsnprintf() ASoC: tegra210_ahub: Add check to of_device_get_match_data() gpiolib: of: Add polarity quirk for s5m8767 PM: runtime: fix denying of auto suspend in pm_suspend_timer_fn() ACPI: battery: negate current when discharging net: macb: Check return value of dma_set_mask_and_coherent() net: lan743x: Modify the EEPROM and OTP size for PCI1xxxx devices tipc: use kfree_sensitive() for aead cleanup f2fs: use vmalloc instead of kvmalloc in .init_{,de}compress_ctx bpf: Check rcu_read_lock_trace_held() in bpf_map_lookup_percpu_elem() i2c: designware: Invoke runtime suspend on quick slave re-registration wifi: mt76: mt7996: drop fragments with multicast or broadcast RA emulex/benet: correct command version selection in be_cmd_get_stats() wifi: mt76: mt76x2: Add support for LiteOn WN4516R,WN4519R wifi: mt76: mt7921: add 160 MHz AP for mt7922 device sctp: Do not wake readers in __sctp_write_space() cpufreq: scmi: Skip SCMI devices that aren't used by the CPUs i2c: tegra: check msg length in SMBUS block read i2c: npcm: Add clock toggle recovery net: dlink: add synchronization for stats update wifi: ath12k: fix macro definition HAL_RX_MSDU_PKT_LENGTH_GET wifi: ath12k: fix a possible dead lock caused by ab->base_lock wifi: ath11k: Fix QMI memory reuse logic wifi: rtw89: leave idle mode when setting WEP encryption for AP mode tcp: always seek for minimal rtt in tcp_rcv_rtt_update() tcp: fix initial tp->rcvq_space.space value for passive TS enabled flows x86/sgx: Prevent attempts to reclaim poisoned pages ipv4/route: Use this_cpu_inc() for stats on PREEMPT_RT net: atlantic: generate software timestamp just before the doorbell pinctrl: armada-37xx: propagate error from armada_37xx_pmx_set_by_name() pinctrl: armada-37xx: propagate error from armada_37xx_gpio_get_direction() pinctrl: armada-37xx: propagate error from armada_37xx_pmx_gpio_set_direction() pinctrl: armada-37xx: propagate error from armada_37xx_gpio_get() net: mlx4: add SOF_TIMESTAMPING_TX_SOFTWARE flag when getting ts info net: vertexcom: mse102x: Return code for mse102x_rx_pkt_spi wireless: purelifi: plfxlc: fix memory leak in plfxlc_usb_wreq_asyn() wifi: mac80211: do not offer a mesh path if forwarding is disabled clk: rockchip: rk3036: mark ddrphy as critical libbpf: Add identical pointer detection to btf_dedup_is_equiv() scsi: lpfc: Fix lpfc_check_sli_ndlp() handling for GEN_REQUEST64 commands iommu/amd: Ensure GA log notifier callbacks finish running before module unload wifi: iwlwifi: pcie: make sure to lock rxq->read wifi: mac80211_hwsim: Prevent tsf from setting if beacon is disabled wifi: mac80211: VLAN traffic in multicast path wifi: iwlwifi: Add missing MODULE_FIRMWARE for Qu-c0-jf-b0 net: bridge: mcast: update multicast contex when vlan state is changed net: bridge: mcast: re-implement br_multicast_{enable, disable}_port functions vxlan: Do not treat dst cache initialization errors as fatal net: ethernet: ti: am65-cpsw: handle -EPROBE_DEFER software node: Correct a OOB check in software_node_get_reference_args() pinctrl: mcp23s08: Reset all pins to input at probe wifi: ath12k: fix failed to set mhi state error during reboot with hardware grouping scsi: lpfc: Use memcpy() for BIOS version sock: Correct error checking condition for (assign|release)_proto_idx() i40e: fix MMIO write access to an invalid page in i40e_clear_hw ice: fix check for existing switch rule usbnet: asix AX88772: leave the carrier control to phylink f2fs: fix to set atomic write status more clear bpf, sockmap: Fix data lost during EAGAIN retries net: ethernet: cortina: Use TOE/TSO on all TCP octeontx2-pf: Add error log forcn10k_map_unmap_rq_policer() wifi: ath11k: determine PM policy based on machine model wifi: ath12k: fix link valid field initialization in the monitor Rx wifi: ath12k: fix incorrect CE addresses wifi: ath12k: Pass correct values of center freq1 and center freq2 for 160 MHz fbcon: Make sure modelist not set on unregistered console watchdog: da9052_wdt: respect TWDMIN bus: fsl-mc: increase MC_CMD_COMPLETION_TIMEOUT_MS value ARM: OMAP2+: Fix l4ls clk domain handling in STANDBY tee: Prevent size calculation wraparound on 32-bit kernels Revert "bus: ti-sysc: Probe for l4_wkup and l4_cfg interconnect devices first" fs/xattr.c: fix simple_xattr_list() platform/x86/amd: pmc: Clear metrics table at start of cycle platform/x86: dell_rbu: Fix list usage platform/x86: dell_rbu: Stop overwriting data buffer powerpc/vdso: Fix build of VDSO32 with pcrel powerpc/eeh: Fix missing PE bridge reconfiguration during VFIO EEH recovery Revert "x86/bugs: Make spectre user default depend on MITIGATION_SPECTRE_V2" on v6.6 and older io_uring: fix task leak issue in io_wq_create() drivers/rapidio/rio_cm.c: prevent possible heap overwrite platform/loongarch: laptop: Get brightness setting from EC on probe platform/loongarch: laptop: Unregister generic_sub_drivers on exit LoongArch: Avoid using $r0/$r1 as "mask" for csrxchg LoongArch: Fix panic caused by NULL-PMD in huge_pte_offset() jffs2: check that raw node were preallocated before writing summary jffs2: check jffs2_prealloc_raw_node_refs() result in few other places cifs: deal with the channel loading lag while picking channels cifs: serialize other channels when query server interfaces is pending cifs: do not disable interface polling on failure smb: improve directory cache reuse for readdir operations scsi: storvsc: Increase the timeouts to storvsc_timeout scsi: s390: zfcp: Ensure synchronous unit_add net_sched: sch_sfq: reject invalid perturb period net: clear the dst when changing skb protocol udmabuf: use sgtable-based scatterlist wrappers selftests/x86: Add a test to detect infinite SIGTRAP handler loop ksmbd: fix null pointer dereference in destroy_previous_session selinux: fix selinux_xfrm_alloc_user() to set correct ctx_len platform/x86/intel-uncore-freq: Fail module load when plat_info is NULL atm: Revert atm_account_tx() if copy_from_iter_full() fails. Input: sparcspkr - avoid unannotated fall-through wifi: cfg80211: init wiphy_work before allocating rfkill fails wifi: rtw89: pci: use DBI function for 8852AE/8852BE/8851BE arm64: Restrict pagetable teardown to avoid false warning ALSA: usb-audio: Rename ALSA kcontrol PCM and PCM1 for the KTMicro sound card ALSA: hda/intel: Add Thinkpad E15 to PM deny list ALSA: hda/realtek: enable headset mic on Latitude 5420 Rugged iio: accel: fxls8962af: Fix temperature calculation mm/hugetlb: unshare page tables during VMA split, not before mm/huge_memory: fix dereferencing invalid pmd migration entry net: Fix checksum update for ILA adj-transport bpf: Fix L4 csum update on IPv6 in CHECKSUM_COMPLETE erofs: remove unused trace event erofs_destroy_inode sunrpc: handle SVC_GARBAGE during svc auth processing as auth error smb: fix secondary channel creation issue with kerberos by populating hostname when adding channels drm/msm/disp: Correct porch timing for SDM845 drm/msm/dsi/dsi_phy_10nm: Fix missing initial VCO rate ionic: Prevent driver/fw getting out of sync on devcmd(s) drm/nouveau/bl: increase buffer size to avoid truncate warning drm/i915/pmu: Fix build error with GCOV and AutoFDO enabled hwmon: (occ) Rework attribute registration for stack usage hwmon: (occ) fix unaligned accesses pldmfw: Select CRC32 when PLDMFW is selected aoe: clean device rq_list in aoedev_downdev() net: ice: Perform accurate aRFS flow match e1000e: set fixed clock frequency indication for Nahum 11 and Nahum 13 ptp: fix breakage after ptp_vclock_in_use() rework ptp: allow reading of currently dialed frequency to succeed on free-running clocks wifi: carl9170: do not ping device which has failed to load firmware mpls: Use rcu_dereference_rtnl() in mpls_route_input_rcu(). atm: atmtcp: Free invalid length skb in atmtcp_c_send(). tcp: fix tcp_packet_delayed() for tcp_is_non_sack_preventing_reopen() behavior tipc: fix null-ptr-deref when acquiring remote ip of ethernet bearer tcp: fix passive TFO socket having invalid NAPI ID net: microchip: lan743x: Reduce PTP timeout on HW failure net: lan743x: fix potential out-of-bounds write in lan743x_ptp_io_event_clock_get() ublk: santizize the arguments from userspace when adding a device calipso: Fix null-ptr-deref in calipso_req_{set,del}attr(). net: atm: add lec_mutex net: atm: fix /proc/net/atm/lec handling EDAC/amd64: Correct number of UMCs for family 19h models 70h-7fh dt-bindings: i2c: nvidia,tegra20-i2c: Specify the required properties smb: Log an error when close_all_cached_dirs fails net: make for_each_netdev_dump() a little more bug-proof serial: sh-sci: Increment the runtime usage counter for the earlycon device platform/x86: ideapad-laptop: add missing Ideapad Pro 5 fn keys ARM: dts: am335x-bone-common: Increase MDIO reset deassert time ARM: dts: am335x-bone-common: Increase MDIO reset deassert delay to 50ms Revert "cpufreq: tegra186: Share policy per cluster" smb: client: fix first command failure during re-negotiation platform/loongarch: laptop: Add backlight power control support s390/pci: Fix __pcilg_mio_inuser() inline assembly perf: Fix sample vs do_exit() perf: Fix cgroup state vs ERROR perf/core: Fix WARN in perf_cgroup_switch() arm64/ptrace: Fix stack-out-of-bounds read in regs_get_kernel_stack_nth() scsi: elx: efct: Fix memory leak in efct_hw_parse_filter() RISC-V: KVM: Fix the size parameter check in SBI SFENCE calls RISC-V: KVM: Don't treat SBI HFENCE calls as NOPs perf evsel: Missed close() when probing hybrid core PMUs gpio: mlxbf3: only get IRQ for device instance 0 cifs: Remove duplicate fattr->cf_dtype assignment from wsl_to_fattr() function Linux 6.6.95 Change-Id: If290a48b9ba8409227c0161905600a42b13cc14e Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -103,7 +103,10 @@ properties:
|
||||
|
||||
resets:
|
||||
items:
|
||||
- description: module reset
|
||||
- description:
|
||||
Module reset. This property is optional for controllers in Tegra194,
|
||||
Tegra234 etc where an internal software reset is available as an
|
||||
alternative.
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
@@ -119,6 +122,13 @@ properties:
|
||||
- const: rx
|
||||
- const: tx
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml
|
||||
- if:
|
||||
@@ -172,6 +182,18 @@ allOf:
|
||||
items:
|
||||
- description: phandle to the VENC power domain
|
||||
|
||||
- if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- nvidia,tegra194-i2c
|
||||
then:
|
||||
required:
|
||||
- resets
|
||||
- reset-names
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
|
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 94
|
||||
SUBLEVEL = 95
|
||||
EXTRAVERSION =
|
||||
NAME = Pinguïn Aangedreven
|
||||
|
||||
|
@@ -385,7 +385,7 @@
|
||||
/* Support GPIO reset on revision C3 boards */
|
||||
reset-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>;
|
||||
reset-assert-us = <300>;
|
||||
reset-deassert-us = <6500>;
|
||||
reset-deassert-us = <50000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -141,7 +141,7 @@ unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n)
|
||||
|
||||
addr += n;
|
||||
if (regs_within_kernel_stack(regs, (unsigned long)addr))
|
||||
return *addr;
|
||||
return READ_ONCE_NOCHECK(*addr);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
@@ -103,7 +103,7 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run
|
||||
kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_FENCE_I_SENT);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA:
|
||||
if (cp->a2 == 0 && cp->a3 == 0)
|
||||
if ((cp->a2 == 0 && cp->a3 == 0) || cp->a3 == -1UL)
|
||||
kvm_riscv_hfence_vvma_all(vcpu->kvm, hbase, hmask);
|
||||
else
|
||||
kvm_riscv_hfence_vvma_gva(vcpu->kvm, hbase, hmask,
|
||||
@@ -111,7 +111,7 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run
|
||||
kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_HFENCE_VVMA_SENT);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID:
|
||||
if (cp->a2 == 0 && cp->a3 == 0)
|
||||
if ((cp->a2 == 0 && cp->a3 == 0) || cp->a3 == -1UL)
|
||||
kvm_riscv_hfence_vvma_asid_all(vcpu->kvm,
|
||||
hbase, hmask, cp->a4);
|
||||
else
|
||||
@@ -127,9 +127,9 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run
|
||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID:
|
||||
/*
|
||||
* Until nested virtualization is implemented, the
|
||||
* SBI HFENCE calls should be treated as NOPs
|
||||
* SBI HFENCE calls should return not supported
|
||||
* hence fallthrough.
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
retdata->err_val = SBI_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
@@ -223,7 +223,7 @@ static inline int __pcilg_mio_inuser(
|
||||
[ioaddr_len] "+&d" (ioaddr_len.pair),
|
||||
[cc] "+d" (cc), [val] "=d" (val),
|
||||
[dst] "+a" (dst), [cnt] "+d" (cnt), [tmp] "=d" (tmp),
|
||||
[shift] "+d" (shift)
|
||||
[shift] "+a" (shift)
|
||||
:: "cc", "memory");
|
||||
|
||||
/* did we write everything to the user space buffer? */
|
||||
|
@@ -288,7 +288,9 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
|
||||
struct sk_buff *new_skb;
|
||||
int result = 0;
|
||||
|
||||
if (!skb->len) return 0;
|
||||
if (skb->len < sizeof(struct atmtcp_hdr))
|
||||
goto done;
|
||||
|
||||
dev = vcc->dev_data;
|
||||
hdr = (struct atmtcp_hdr *) skb->data;
|
||||
if (hdr->length == ATMTCP_HDR_MAGIC) {
|
||||
|
@@ -198,6 +198,7 @@ aoedev_downdev(struct aoedev *d)
|
||||
{
|
||||
struct aoetgt *t, **tt, **te;
|
||||
struct list_head *head, *pos, *nx;
|
||||
struct request *rq, *rqnext;
|
||||
int i;
|
||||
|
||||
d->flags &= ~DEVFL_UP;
|
||||
@@ -223,6 +224,13 @@ aoedev_downdev(struct aoedev *d)
|
||||
/* clean out the in-process request (if any) */
|
||||
aoe_failip(d);
|
||||
|
||||
/* clean out any queued block requests */
|
||||
list_for_each_entry_safe(rq, rqnext, &d->rq_list, queuelist) {
|
||||
list_del_init(&rq->queuelist);
|
||||
blk_mq_start_request(rq);
|
||||
blk_mq_end_request(rq, BLK_STS_IOERR);
|
||||
}
|
||||
|
||||
/* fast fail all pending I/O */
|
||||
if (d->blkq) {
|
||||
/* UP is cleared, freeze+quiesce to insure all are errored */
|
||||
|
@@ -2323,6 +2323,9 @@ static int ublk_ctrl_add_dev(struct io_uring_cmd *cmd)
|
||||
if (copy_from_user(&info, argp, sizeof(info)))
|
||||
return -EFAULT;
|
||||
|
||||
if (info.queue_depth > UBLK_MAX_QUEUE_DEPTH || info.nr_hw_queues > UBLK_MAX_NR_QUEUES)
|
||||
return -EINVAL;
|
||||
|
||||
if (capable(CAP_SYS_ADMIN))
|
||||
info.flags &= ~UBLK_F_UNPRIVILEGED_DEV;
|
||||
else if (!(info.flags & UBLK_F_UNPRIVILEGED_DEV))
|
||||
|
@@ -73,18 +73,11 @@ static int tegra186_cpufreq_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct tegra186_cpufreq_data *data = cpufreq_get_driver_data();
|
||||
unsigned int cluster = data->cpus[policy->cpu].bpmp_cluster_id;
|
||||
u32 cpu;
|
||||
|
||||
policy->freq_table = data->clusters[cluster].table;
|
||||
policy->cpuinfo.transition_latency = 300 * 1000;
|
||||
policy->driver_data = NULL;
|
||||
|
||||
/* set same policy for all cpus in a cluster */
|
||||
for (cpu = 0; cpu < ARRAY_SIZE(tegra186_cpus); cpu++) {
|
||||
if (data->cpus[cpu].bpmp_cluster_id == cluster)
|
||||
cpumask_set_cpu(cpu, policy->cpus);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -4130,6 +4130,7 @@ static int per_family_init(struct amd64_pvt *pvt)
|
||||
break;
|
||||
case 0x70 ... 0x7f:
|
||||
pvt->ctl_name = "F19h_M70h";
|
||||
pvt->max_mcs = 4;
|
||||
pvt->flags.zn_regs_v2 = 1;
|
||||
break;
|
||||
case 0xa0 ... 0xaf:
|
||||
|
@@ -190,7 +190,9 @@ static int mlxbf3_gpio_probe(struct platform_device *pdev)
|
||||
struct mlxbf3_gpio_context *gs;
|
||||
struct gpio_irq_chip *girq;
|
||||
struct gpio_chip *gc;
|
||||
char *colon_ptr;
|
||||
int ret, irq;
|
||||
long num;
|
||||
|
||||
gs = devm_kzalloc(dev, sizeof(*gs), GFP_KERNEL);
|
||||
if (!gs)
|
||||
@@ -227,6 +229,19 @@ static int mlxbf3_gpio_probe(struct platform_device *pdev)
|
||||
gc->owner = THIS_MODULE;
|
||||
gc->add_pin_ranges = mlxbf3_gpio_add_pin_ranges;
|
||||
|
||||
colon_ptr = strchr(dev_name(dev), ':');
|
||||
if (!colon_ptr) {
|
||||
dev_err(dev, "invalid device name format\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = kstrtol(++colon_ptr, 16, &num);
|
||||
if (ret) {
|
||||
dev_err(dev, "invalid device instance\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!num) {
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq >= 0) {
|
||||
girq = &gs->gc.irq;
|
||||
@@ -247,6 +262,7 @@ static int mlxbf3_gpio_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "failed to request IRQ");
|
||||
}
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, gs);
|
||||
|
||||
|
@@ -105,7 +105,7 @@ static u32 config_mask(const u64 config)
|
||||
{
|
||||
unsigned int bit = config_bit(config);
|
||||
|
||||
if (__builtin_constant_p(config))
|
||||
if (__builtin_constant_p(bit))
|
||||
BUILD_BUG_ON(bit >
|
||||
BITS_PER_TYPE(typeof_member(struct i915_pmu,
|
||||
enable)) - 1);
|
||||
@@ -114,7 +114,7 @@ static u32 config_mask(const u64 config)
|
||||
BITS_PER_TYPE(typeof_member(struct i915_pmu,
|
||||
enable)) - 1);
|
||||
|
||||
return BIT(config_bit(config));
|
||||
return BIT(bit);
|
||||
}
|
||||
|
||||
static bool is_engine_event(struct perf_event *event)
|
||||
|
@@ -93,17 +93,21 @@ static void drm_mode_to_intf_timing_params(
|
||||
timing->vsync_polarity = 0;
|
||||
}
|
||||
|
||||
/* for DP/EDP, Shift timings to align it to bottom right */
|
||||
if (phys_enc->hw_intf->cap->type == INTF_DP) {
|
||||
timing->wide_bus_en = dpu_encoder_is_widebus_enabled(phys_enc->parent);
|
||||
timing->compression_en = dpu_encoder_is_dsc_enabled(phys_enc->parent);
|
||||
|
||||
/*
|
||||
* For DP/EDP, Shift timings to align it to bottom right.
|
||||
* wide_bus_en is set for everything excluding SDM845 &
|
||||
* porch changes cause DisplayPort failure and HDMI tearing.
|
||||
*/
|
||||
if (phys_enc->hw_intf->cap->type == INTF_DP && timing->wide_bus_en) {
|
||||
timing->h_back_porch += timing->h_front_porch;
|
||||
timing->h_front_porch = 0;
|
||||
timing->v_back_porch += timing->v_front_porch;
|
||||
timing->v_front_porch = 0;
|
||||
}
|
||||
|
||||
timing->wide_bus_en = dpu_encoder_is_widebus_enabled(phys_enc->parent);
|
||||
timing->compression_en = dpu_encoder_is_dsc_enabled(phys_enc->parent);
|
||||
|
||||
/*
|
||||
* for DP, divide the horizonal parameters by 2 when
|
||||
* widebus is enabled
|
||||
|
@@ -716,6 +716,13 @@ static int dsi_pll_10nm_init(struct msm_dsi_phy *phy)
|
||||
/* TODO: Remove this when we have proper display handover support */
|
||||
msm_dsi_phy_pll_save_state(phy);
|
||||
|
||||
/*
|
||||
* Store also proper vco_current_rate, because its value will be used in
|
||||
* dsi_10nm_pll_restore_state().
|
||||
*/
|
||||
if (!dsi_pll_10nm_vco_recalc_rate(&pll_10nm->clk_hw, VCO_REF_CLK_RATE))
|
||||
pll_10nm->vco_current_rate = pll_10nm->phy->cfg->min_pll_rate;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -42,7 +42,7 @@
|
||||
#include "nouveau_acpi.h"
|
||||
|
||||
static struct ida bl_ida;
|
||||
#define BL_NAME_SIZE 15 // 12 for name + 2 for digits + 1 for '\0'
|
||||
#define BL_NAME_SIZE 24 // 12 for name + 11 for digits + 1 for '\0'
|
||||
|
||||
static bool
|
||||
nouveau_get_backlight_name(char backlight_name[BL_NAME_SIZE],
|
||||
|
@@ -459,12 +459,10 @@ static ssize_t occ_show_power_1(struct device *dev,
|
||||
return sysfs_emit(buf, "%llu\n", val);
|
||||
}
|
||||
|
||||
static u64 occ_get_powr_avg(u64 *accum, u32 *samples)
|
||||
static u64 occ_get_powr_avg(u64 accum, u32 samples)
|
||||
{
|
||||
u64 divisor = get_unaligned_be32(samples);
|
||||
|
||||
return (divisor == 0) ? 0 :
|
||||
div64_u64(get_unaligned_be64(accum) * 1000000ULL, divisor);
|
||||
return (samples == 0) ? 0 :
|
||||
mul_u64_u32_div(accum, 1000000UL, samples);
|
||||
}
|
||||
|
||||
static ssize_t occ_show_power_2(struct device *dev,
|
||||
@@ -489,8 +487,8 @@ static ssize_t occ_show_power_2(struct device *dev,
|
||||
get_unaligned_be32(&power->sensor_id),
|
||||
power->function_id, power->apss_channel);
|
||||
case 1:
|
||||
val = occ_get_powr_avg(&power->accumulator,
|
||||
&power->update_tag);
|
||||
val = occ_get_powr_avg(get_unaligned_be64(&power->accumulator),
|
||||
get_unaligned_be32(&power->update_tag));
|
||||
break;
|
||||
case 2:
|
||||
val = (u64)get_unaligned_be32(&power->update_tag) *
|
||||
@@ -527,8 +525,8 @@ static ssize_t occ_show_power_a0(struct device *dev,
|
||||
return sysfs_emit(buf, "%u_system\n",
|
||||
get_unaligned_be32(&power->sensor_id));
|
||||
case 1:
|
||||
val = occ_get_powr_avg(&power->system.accumulator,
|
||||
&power->system.update_tag);
|
||||
val = occ_get_powr_avg(get_unaligned_be64(&power->system.accumulator),
|
||||
get_unaligned_be32(&power->system.update_tag));
|
||||
break;
|
||||
case 2:
|
||||
val = (u64)get_unaligned_be32(&power->system.update_tag) *
|
||||
@@ -541,8 +539,8 @@ static ssize_t occ_show_power_a0(struct device *dev,
|
||||
return sysfs_emit(buf, "%u_proc\n",
|
||||
get_unaligned_be32(&power->sensor_id));
|
||||
case 5:
|
||||
val = occ_get_powr_avg(&power->proc.accumulator,
|
||||
&power->proc.update_tag);
|
||||
val = occ_get_powr_avg(get_unaligned_be64(&power->proc.accumulator),
|
||||
get_unaligned_be32(&power->proc.update_tag));
|
||||
break;
|
||||
case 6:
|
||||
val = (u64)get_unaligned_be32(&power->proc.update_tag) *
|
||||
@@ -555,8 +553,8 @@ static ssize_t occ_show_power_a0(struct device *dev,
|
||||
return sysfs_emit(buf, "%u_vdd\n",
|
||||
get_unaligned_be32(&power->sensor_id));
|
||||
case 9:
|
||||
val = occ_get_powr_avg(&power->vdd.accumulator,
|
||||
&power->vdd.update_tag);
|
||||
val = occ_get_powr_avg(get_unaligned_be64(&power->vdd.accumulator),
|
||||
get_unaligned_be32(&power->vdd.update_tag));
|
||||
break;
|
||||
case 10:
|
||||
val = (u64)get_unaligned_be32(&power->vdd.update_tag) *
|
||||
@@ -569,8 +567,8 @@ static ssize_t occ_show_power_a0(struct device *dev,
|
||||
return sysfs_emit(buf, "%u_vdn\n",
|
||||
get_unaligned_be32(&power->sensor_id));
|
||||
case 13:
|
||||
val = occ_get_powr_avg(&power->vdn.accumulator,
|
||||
&power->vdn.update_tag);
|
||||
val = occ_get_powr_avg(get_unaligned_be64(&power->vdn.accumulator),
|
||||
get_unaligned_be32(&power->vdn.update_tag));
|
||||
break;
|
||||
case 14:
|
||||
val = (u64)get_unaligned_be32(&power->vdn.update_tag) *
|
||||
@@ -747,28 +745,29 @@ static ssize_t occ_show_extended(struct device *dev,
|
||||
}
|
||||
|
||||
/*
|
||||
* Some helper macros to make it easier to define an occ_attribute. Since these
|
||||
* are dynamically allocated, we shouldn't use the existing kernel macros which
|
||||
* A helper to make it easier to define an occ_attribute. Since these
|
||||
* are dynamically allocated, we cannot use the existing kernel macros which
|
||||
* stringify the name argument.
|
||||
*/
|
||||
#define ATTR_OCC(_name, _mode, _show, _store) { \
|
||||
.attr = { \
|
||||
.name = _name, \
|
||||
.mode = VERIFY_OCTAL_PERMISSIONS(_mode), \
|
||||
}, \
|
||||
.show = _show, \
|
||||
.store = _store, \
|
||||
}
|
||||
static void occ_init_attribute(struct occ_attribute *attr, int mode,
|
||||
ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf),
|
||||
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count),
|
||||
int nr, int index, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
#define SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index) { \
|
||||
.dev_attr = ATTR_OCC(_name, _mode, _show, _store), \
|
||||
.index = _index, \
|
||||
.nr = _nr, \
|
||||
}
|
||||
va_start(args, fmt);
|
||||
vsnprintf(attr->name, sizeof(attr->name), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
#define OCC_INIT_ATTR(_name, _mode, _show, _store, _nr, _index) \
|
||||
((struct sensor_device_attribute_2) \
|
||||
SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index))
|
||||
attr->sensor.dev_attr.attr.name = attr->name;
|
||||
attr->sensor.dev_attr.attr.mode = mode;
|
||||
attr->sensor.dev_attr.show = show;
|
||||
attr->sensor.dev_attr.store = store;
|
||||
attr->sensor.index = index;
|
||||
attr->sensor.nr = nr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate and instatiate sensor_device_attribute_2s. It's most efficient to
|
||||
@@ -855,14 +854,15 @@ static int occ_setup_sensor_attrs(struct occ *occ)
|
||||
sensors->extended.num_sensors = 0;
|
||||
}
|
||||
|
||||
occ->attrs = devm_kzalloc(dev, sizeof(*occ->attrs) * num_attrs,
|
||||
occ->attrs = devm_kcalloc(dev, num_attrs, sizeof(*occ->attrs),
|
||||
GFP_KERNEL);
|
||||
if (!occ->attrs)
|
||||
return -ENOMEM;
|
||||
|
||||
/* null-terminated list */
|
||||
occ->group.attrs = devm_kzalloc(dev, sizeof(*occ->group.attrs) *
|
||||
num_attrs + 1, GFP_KERNEL);
|
||||
occ->group.attrs = devm_kcalloc(dev, num_attrs + 1,
|
||||
sizeof(*occ->group.attrs),
|
||||
GFP_KERNEL);
|
||||
if (!occ->group.attrs)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -872,43 +872,33 @@ static int occ_setup_sensor_attrs(struct occ *occ)
|
||||
s = i + 1;
|
||||
temp = ((struct temp_sensor_2 *)sensors->temp.data) + i;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "temp%d_label", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL,
|
||||
0, i);
|
||||
occ_init_attribute(attr, 0444, show_temp, NULL,
|
||||
0, i, "temp%d_label", s);
|
||||
attr++;
|
||||
|
||||
if (sensors->temp.version == 2 &&
|
||||
temp->fru_type == OCC_FRU_TYPE_VRM) {
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"temp%d_alarm", s);
|
||||
occ_init_attribute(attr, 0444, show_temp, NULL,
|
||||
1, i, "temp%d_alarm", s);
|
||||
} else {
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"temp%d_input", s);
|
||||
occ_init_attribute(attr, 0444, show_temp, NULL,
|
||||
1, i, "temp%d_input", s);
|
||||
}
|
||||
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL,
|
||||
1, i);
|
||||
attr++;
|
||||
|
||||
if (sensors->temp.version > 1) {
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"temp%d_fru_type", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_temp, NULL, 2, i);
|
||||
occ_init_attribute(attr, 0444, show_temp, NULL,
|
||||
2, i, "temp%d_fru_type", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"temp%d_fault", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_temp, NULL, 3, i);
|
||||
occ_init_attribute(attr, 0444, show_temp, NULL,
|
||||
3, i, "temp%d_fault", s);
|
||||
attr++;
|
||||
|
||||
if (sensors->temp.version == 0x10) {
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"temp%d_max", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_temp, NULL,
|
||||
4, i);
|
||||
occ_init_attribute(attr, 0444, show_temp, NULL,
|
||||
4, i, "temp%d_max", s);
|
||||
attr++;
|
||||
}
|
||||
}
|
||||
@@ -917,14 +907,12 @@ static int occ_setup_sensor_attrs(struct occ *occ)
|
||||
for (i = 0; i < sensors->freq.num_sensors; ++i) {
|
||||
s = i + 1;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "freq%d_label", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL,
|
||||
0, i);
|
||||
occ_init_attribute(attr, 0444, show_freq, NULL,
|
||||
0, i, "freq%d_label", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "freq%d_input", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL,
|
||||
1, i);
|
||||
occ_init_attribute(attr, 0444, show_freq, NULL,
|
||||
1, i, "freq%d_input", s);
|
||||
attr++;
|
||||
}
|
||||
|
||||
@@ -940,32 +928,24 @@ static int occ_setup_sensor_attrs(struct occ *occ)
|
||||
s = (i * 4) + 1;
|
||||
|
||||
for (j = 0; j < 4; ++j) {
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
occ_init_attribute(attr, 0444, show_power,
|
||||
NULL, nr++, i,
|
||||
"power%d_label", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_power, NULL,
|
||||
nr++, i);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
occ_init_attribute(attr, 0444, show_power,
|
||||
NULL, nr++, i,
|
||||
"power%d_average", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_power, NULL,
|
||||
nr++, i);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
occ_init_attribute(attr, 0444, show_power,
|
||||
NULL, nr++, i,
|
||||
"power%d_average_interval", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_power, NULL,
|
||||
nr++, i);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
occ_init_attribute(attr, 0444, show_power,
|
||||
NULL, nr++, i,
|
||||
"power%d_input", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_power, NULL,
|
||||
nr++, i);
|
||||
attr++;
|
||||
|
||||
s++;
|
||||
@@ -977,28 +957,20 @@ static int occ_setup_sensor_attrs(struct occ *occ)
|
||||
for (i = 0; i < sensors->power.num_sensors; ++i) {
|
||||
s = i + 1;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"power%d_label", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_power, NULL, 0, i);
|
||||
occ_init_attribute(attr, 0444, show_power, NULL,
|
||||
0, i, "power%d_label", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"power%d_average", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_power, NULL, 1, i);
|
||||
occ_init_attribute(attr, 0444, show_power, NULL,
|
||||
1, i, "power%d_average", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"power%d_average_interval", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_power, NULL, 2, i);
|
||||
occ_init_attribute(attr, 0444, show_power, NULL,
|
||||
2, i, "power%d_average_interval", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"power%d_input", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_power, NULL, 3, i);
|
||||
occ_init_attribute(attr, 0444, show_power, NULL,
|
||||
3, i, "power%d_input", s);
|
||||
attr++;
|
||||
}
|
||||
|
||||
@@ -1006,56 +978,43 @@ static int occ_setup_sensor_attrs(struct occ *occ)
|
||||
}
|
||||
|
||||
if (sensors->caps.num_sensors >= 1) {
|
||||
snprintf(attr->name, sizeof(attr->name), "power%d_label", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
|
||||
0, 0);
|
||||
occ_init_attribute(attr, 0444, show_caps, NULL,
|
||||
0, 0, "power%d_label", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "power%d_cap", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
|
||||
1, 0);
|
||||
occ_init_attribute(attr, 0444, show_caps, NULL,
|
||||
1, 0, "power%d_cap", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "power%d_input", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
|
||||
2, 0);
|
||||
occ_init_attribute(attr, 0444, show_caps, NULL,
|
||||
2, 0, "power%d_input", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"power%d_cap_not_redundant", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
|
||||
3, 0);
|
||||
occ_init_attribute(attr, 0444, show_caps, NULL,
|
||||
3, 0, "power%d_cap_not_redundant", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "power%d_cap_max", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
|
||||
4, 0);
|
||||
occ_init_attribute(attr, 0444, show_caps, NULL,
|
||||
4, 0, "power%d_cap_max", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "power%d_cap_min", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
|
||||
5, 0);
|
||||
occ_init_attribute(attr, 0444, show_caps, NULL,
|
||||
5, 0, "power%d_cap_min", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "power%d_cap_user",
|
||||
s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0644, show_caps,
|
||||
occ_store_caps_user, 6, 0);
|
||||
occ_init_attribute(attr, 0644, show_caps, occ_store_caps_user,
|
||||
6, 0, "power%d_cap_user", s);
|
||||
attr++;
|
||||
|
||||
if (sensors->caps.version > 1) {
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
"power%d_cap_user_source", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_caps, NULL, 7, 0);
|
||||
occ_init_attribute(attr, 0444, show_caps, NULL,
|
||||
7, 0, "power%d_cap_user_source", s);
|
||||
attr++;
|
||||
|
||||
if (sensors->caps.version > 2) {
|
||||
snprintf(attr->name, sizeof(attr->name),
|
||||
occ_init_attribute(attr, 0444, show_caps, NULL,
|
||||
8, 0,
|
||||
"power%d_cap_min_soft", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
show_caps, NULL,
|
||||
8, 0);
|
||||
attr++;
|
||||
}
|
||||
}
|
||||
@@ -1064,19 +1023,16 @@ static int occ_setup_sensor_attrs(struct occ *occ)
|
||||
for (i = 0; i < sensors->extended.num_sensors; ++i) {
|
||||
s = i + 1;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "extn%d_label", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
occ_show_extended, NULL, 0, i);
|
||||
occ_init_attribute(attr, 0444, occ_show_extended, NULL,
|
||||
0, i, "extn%d_label", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "extn%d_flags", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
occ_show_extended, NULL, 1, i);
|
||||
occ_init_attribute(attr, 0444, occ_show_extended, NULL,
|
||||
1, i, "extn%d_flags", s);
|
||||
attr++;
|
||||
|
||||
snprintf(attr->name, sizeof(attr->name), "extn%d_input", s);
|
||||
attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
|
||||
occ_show_extended, NULL, 2, i);
|
||||
occ_init_attribute(attr, 0444, occ_show_extended, NULL,
|
||||
2, i, "extn%d_input", s);
|
||||
attr++;
|
||||
}
|
||||
|
||||
|
@@ -3540,9 +3540,6 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)
|
||||
case e1000_pch_cnp:
|
||||
case e1000_pch_tgp:
|
||||
case e1000_pch_adp:
|
||||
case e1000_pch_mtp:
|
||||
case e1000_pch_lnp:
|
||||
case e1000_pch_ptp:
|
||||
case e1000_pch_nvp:
|
||||
if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) {
|
||||
/* Stable 24MHz frequency */
|
||||
@@ -3558,6 +3555,17 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)
|
||||
adapter->cc.shift = shift;
|
||||
}
|
||||
break;
|
||||
case e1000_pch_mtp:
|
||||
case e1000_pch_lnp:
|
||||
case e1000_pch_ptp:
|
||||
/* System firmware can misreport this value, so set it to a
|
||||
* stable 38400KHz frequency.
|
||||
*/
|
||||
incperiod = INCPERIOD_38400KHZ;
|
||||
incvalue = INCVALUE_38400KHZ;
|
||||
shift = INCVALUE_SHIFT_38400KHZ;
|
||||
adapter->cc.shift = shift;
|
||||
break;
|
||||
case e1000_82574:
|
||||
case e1000_82583:
|
||||
/* Stable 25MHz frequency */
|
||||
|
@@ -294,15 +294,17 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)
|
||||
case e1000_pch_cnp:
|
||||
case e1000_pch_tgp:
|
||||
case e1000_pch_adp:
|
||||
case e1000_pch_mtp:
|
||||
case e1000_pch_lnp:
|
||||
case e1000_pch_ptp:
|
||||
case e1000_pch_nvp:
|
||||
if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI)
|
||||
adapter->ptp_clock_info.max_adj = MAX_PPB_24MHZ;
|
||||
else
|
||||
adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ;
|
||||
break;
|
||||
case e1000_pch_mtp:
|
||||
case e1000_pch_lnp:
|
||||
case e1000_pch_ptp:
|
||||
adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ;
|
||||
break;
|
||||
case e1000_82574:
|
||||
case e1000_82583:
|
||||
adapter->ptp_clock_info.max_adj = MAX_PPB_25MHZ;
|
||||
|
@@ -376,6 +376,50 @@ ice_arfs_is_perfect_flow_set(struct ice_hw *hw, __be16 l3_proto, u8 l4_proto)
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_arfs_cmp - Check if aRFS filter matches this flow.
|
||||
* @fltr_info: filter info of the saved ARFS entry.
|
||||
* @fk: flow dissector keys.
|
||||
* @n_proto: One of htons(ETH_P_IP) or htons(ETH_P_IPV6).
|
||||
* @ip_proto: One of IPPROTO_TCP or IPPROTO_UDP.
|
||||
*
|
||||
* Since this function assumes limited values for n_proto and ip_proto, it
|
||||
* is meant to be called only from ice_rx_flow_steer().
|
||||
*
|
||||
* Return:
|
||||
* * true - fltr_info refers to the same flow as fk.
|
||||
* * false - fltr_info and fk refer to different flows.
|
||||
*/
|
||||
static bool
|
||||
ice_arfs_cmp(const struct ice_fdir_fltr *fltr_info, const struct flow_keys *fk,
|
||||
__be16 n_proto, u8 ip_proto)
|
||||
{
|
||||
/* Determine if the filter is for IPv4 or IPv6 based on flow_type,
|
||||
* which is one of ICE_FLTR_PTYPE_NONF_IPV{4,6}_{TCP,UDP}.
|
||||
*/
|
||||
bool is_v4 = fltr_info->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
|
||||
fltr_info->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP;
|
||||
|
||||
/* Following checks are arranged in the quickest and most discriminative
|
||||
* fields first for early failure.
|
||||
*/
|
||||
if (is_v4)
|
||||
return n_proto == htons(ETH_P_IP) &&
|
||||
fltr_info->ip.v4.src_port == fk->ports.src &&
|
||||
fltr_info->ip.v4.dst_port == fk->ports.dst &&
|
||||
fltr_info->ip.v4.src_ip == fk->addrs.v4addrs.src &&
|
||||
fltr_info->ip.v4.dst_ip == fk->addrs.v4addrs.dst &&
|
||||
fltr_info->ip.v4.proto == ip_proto;
|
||||
|
||||
return fltr_info->ip.v6.src_port == fk->ports.src &&
|
||||
fltr_info->ip.v6.dst_port == fk->ports.dst &&
|
||||
fltr_info->ip.v6.proto == ip_proto &&
|
||||
!memcmp(&fltr_info->ip.v6.src_ip, &fk->addrs.v6addrs.src,
|
||||
sizeof(struct in6_addr)) &&
|
||||
!memcmp(&fltr_info->ip.v6.dst_ip, &fk->addrs.v6addrs.dst,
|
||||
sizeof(struct in6_addr));
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_rx_flow_steer - steer the Rx flow to where application is being run
|
||||
* @netdev: ptr to the netdev being adjusted
|
||||
@@ -447,6 +491,10 @@ ice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb,
|
||||
continue;
|
||||
|
||||
fltr_info = &arfs_entry->fltr_info;
|
||||
|
||||
if (!ice_arfs_cmp(fltr_info, &fk, n_proto, ip_proto))
|
||||
continue;
|
||||
|
||||
ret = fltr_info->fltr_id;
|
||||
|
||||
if (fltr_info->q_index == rxq_idx ||
|
||||
|
@@ -58,7 +58,7 @@ int lan743x_gpio_init(struct lan743x_adapter *adapter)
|
||||
static void lan743x_ptp_wait_till_cmd_done(struct lan743x_adapter *adapter,
|
||||
u32 bit_mask)
|
||||
{
|
||||
int timeout = 1000;
|
||||
int timeout = PTP_CMD_CTL_TIMEOUT_CNT;
|
||||
u32 data = 0;
|
||||
|
||||
while (timeout &&
|
||||
|
@@ -18,9 +18,10 @@
|
||||
*/
|
||||
#define LAN743X_PTP_N_EVENT_CHAN 2
|
||||
#define LAN743X_PTP_N_PEROUT LAN743X_PTP_N_EVENT_CHAN
|
||||
#define LAN743X_PTP_N_EXTTS 4
|
||||
#define LAN743X_PTP_N_PPS 0
|
||||
#define PCI11X1X_PTP_IO_MAX_CHANNELS 8
|
||||
#define LAN743X_PTP_N_EXTTS PCI11X1X_PTP_IO_MAX_CHANNELS
|
||||
#define LAN743X_PTP_N_PPS 0
|
||||
#define PTP_CMD_CTL_TIMEOUT_CNT 50
|
||||
|
||||
struct lan743x_adapter;
|
||||
|
||||
|
@@ -464,9 +464,9 @@ static int __ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds,
|
||||
unsigned long start_time;
|
||||
unsigned long max_wait;
|
||||
unsigned long duration;
|
||||
int done = 0;
|
||||
bool fw_up;
|
||||
int opcode;
|
||||
bool done;
|
||||
int err;
|
||||
|
||||
/* Wait for dev cmd to complete, retrying if we get EAGAIN,
|
||||
@@ -474,6 +474,7 @@ static int __ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds,
|
||||
*/
|
||||
max_wait = jiffies + (max_seconds * HZ);
|
||||
try_again:
|
||||
done = false;
|
||||
opcode = idev->opcode;
|
||||
start_time = jiffies;
|
||||
for (fw_up = ionic_is_fw_running(idev);
|
||||
|
@@ -438,14 +438,21 @@ static void carl9170_usb_rx_complete(struct urb *urb)
|
||||
|
||||
if (atomic_read(&ar->rx_anch_urbs) == 0) {
|
||||
/*
|
||||
* The system is too slow to cope with
|
||||
* the enormous workload. We have simply
|
||||
* run out of active rx urbs and this
|
||||
* unfortunately leads to an unpredictable
|
||||
* device.
|
||||
* At this point, either the system is too slow to
|
||||
* cope with the enormous workload (so we have simply
|
||||
* run out of active rx urbs and this unfortunately
|
||||
* leads to an unpredictable device), or the device
|
||||
* is not fully functional after an unsuccessful
|
||||
* firmware loading attempts (so it doesn't pass
|
||||
* ieee80211_register_hw() and there is no internal
|
||||
* workqueue at all).
|
||||
*/
|
||||
|
||||
if (ar->registered)
|
||||
ieee80211_queue_work(ar->hw, &ar->ping_work);
|
||||
else
|
||||
pr_warn_once("device %s is not registered\n",
|
||||
dev_name(&ar->udev->dev));
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
|
@@ -56,8 +56,7 @@ static struct input_dev *generic_inputdev;
|
||||
static acpi_handle hotkey_handle;
|
||||
static struct key_entry hotkey_keycode_map[GENERIC_HOTKEY_MAP_MAX];
|
||||
|
||||
int loongson_laptop_turn_on_backlight(void);
|
||||
int loongson_laptop_turn_off_backlight(void);
|
||||
static bool bl_powered;
|
||||
static int loongson_laptop_backlight_update(struct backlight_device *bd);
|
||||
|
||||
/* 2. ACPI Helpers and device model */
|
||||
@@ -354,16 +353,42 @@ static int ec_backlight_level(u8 level)
|
||||
return level;
|
||||
}
|
||||
|
||||
static int ec_backlight_set_power(bool state)
|
||||
{
|
||||
int status;
|
||||
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
|
||||
struct acpi_object_list args = { 1, &arg0 };
|
||||
|
||||
arg0.integer.value = state;
|
||||
status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_info("Loongson lvds error: 0x%x\n", status);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int loongson_laptop_backlight_update(struct backlight_device *bd)
|
||||
{
|
||||
int lvl = ec_backlight_level(bd->props.brightness);
|
||||
bool target_powered = !backlight_is_blank(bd);
|
||||
int ret = 0, lvl = ec_backlight_level(bd->props.brightness);
|
||||
|
||||
if (lvl < 0)
|
||||
return -EIO;
|
||||
|
||||
if (ec_set_brightness(lvl))
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
if (target_powered != bl_powered) {
|
||||
ret = ec_backlight_set_power(target_powered);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
bl_powered = target_powered;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int loongson_laptop_get_brightness(struct backlight_device *bd)
|
||||
@@ -384,7 +409,7 @@ static const struct backlight_ops backlight_laptop_ops = {
|
||||
|
||||
static int laptop_backlight_register(void)
|
||||
{
|
||||
int status = 0;
|
||||
int status = 0, ret;
|
||||
struct backlight_properties props;
|
||||
|
||||
memset(&props, 0, sizeof(props));
|
||||
@@ -392,44 +417,20 @@ static int laptop_backlight_register(void)
|
||||
if (!acpi_evalf(hotkey_handle, &status, "ECLL", "d"))
|
||||
return -EIO;
|
||||
|
||||
ret = ec_backlight_set_power(true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
bl_powered = true;
|
||||
|
||||
props.max_brightness = status;
|
||||
props.brightness = ec_get_brightness();
|
||||
props.power = FB_BLANK_UNBLANK;
|
||||
props.type = BACKLIGHT_PLATFORM;
|
||||
|
||||
backlight_device_register("loongson_laptop",
|
||||
NULL, NULL, &backlight_laptop_ops, &props);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int loongson_laptop_turn_on_backlight(void)
|
||||
{
|
||||
int status;
|
||||
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
|
||||
struct acpi_object_list args = { 1, &arg0 };
|
||||
|
||||
arg0.integer.value = 1;
|
||||
status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_info("Loongson lvds error: 0x%x\n", status);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int loongson_laptop_turn_off_backlight(void)
|
||||
{
|
||||
int status;
|
||||
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
|
||||
struct acpi_object_list args = { 1, &arg0 };
|
||||
|
||||
arg0.integer.value = 0;
|
||||
status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_info("Loongson lvds error: 0x%x\n", status);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -1101,6 +1101,9 @@ static const struct key_entry ideapad_keymap[] = {
|
||||
{ KE_KEY, 0x27 | IDEAPAD_WMI_KEY, { KEY_HELP } },
|
||||
/* Refresh Rate Toggle */
|
||||
{ KE_KEY, 0x0a | IDEAPAD_WMI_KEY, { KEY_DISPLAYTOGGLE } },
|
||||
/* Specific to some newer models */
|
||||
{ KE_KEY, 0x3e | IDEAPAD_WMI_KEY, { KEY_MICMUTE } },
|
||||
{ KE_KEY, 0x3f | IDEAPAD_WMI_KEY, { KEY_RFKILL } },
|
||||
|
||||
{ KE_END },
|
||||
};
|
||||
|
@@ -104,7 +104,8 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx)
|
||||
struct ptp_clock_info *ops;
|
||||
int err = -EOPNOTSUPP;
|
||||
|
||||
if (ptp_clock_freerun(ptp)) {
|
||||
if (tx->modes & (ADJ_SETOFFSET | ADJ_FREQUENCY | ADJ_OFFSET) &&
|
||||
ptp_clock_freerun(ptp)) {
|
||||
pr_err("ptp: physical clock is free running\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
@@ -89,7 +89,27 @@ static inline int queue_cnt(const struct timestamp_event_queue *q)
|
||||
/* Check if ptp virtual clock is in use */
|
||||
static inline bool ptp_vclock_in_use(struct ptp_clock *ptp)
|
||||
{
|
||||
return !ptp->is_virtual_clock;
|
||||
bool in_use = false;
|
||||
|
||||
/* Virtual clocks can't be stacked on top of virtual clocks.
|
||||
* Avoid acquiring the n_vclocks_mux on virtual clocks, to allow this
|
||||
* function to be called from code paths where the n_vclocks_mux of the
|
||||
* parent physical clock is already held. Functionally that's not an
|
||||
* issue, but lockdep would complain, because they have the same lock
|
||||
* class.
|
||||
*/
|
||||
if (ptp->is_virtual_clock)
|
||||
return false;
|
||||
|
||||
if (mutex_lock_interruptible(&ptp->n_vclocks_mux))
|
||||
return true;
|
||||
|
||||
if (ptp->n_vclocks)
|
||||
in_use = true;
|
||||
|
||||
mutex_unlock(&ptp->n_vclocks_mux);
|
||||
|
||||
return in_use;
|
||||
}
|
||||
|
||||
/* Check if ptp clock shall be free running */
|
||||
|
@@ -1120,7 +1120,7 @@ int
|
||||
efct_hw_parse_filter(struct efct_hw *hw, void *value)
|
||||
{
|
||||
int rc = 0;
|
||||
char *p = NULL;
|
||||
char *p = NULL, *pp = NULL;
|
||||
char *token;
|
||||
u32 idx = 0;
|
||||
|
||||
@@ -1132,6 +1132,7 @@ efct_hw_parse_filter(struct efct_hw *hw, void *value)
|
||||
efc_log_err(hw->os, "p is NULL\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
pp = p;
|
||||
|
||||
idx = 0;
|
||||
while ((token = strsep(&p, ",")) && *token) {
|
||||
@@ -1144,7 +1145,7 @@ efct_hw_parse_filter(struct efct_hw *hw, void *value)
|
||||
if (idx == ARRAY_SIZE(hw->config.filter_def))
|
||||
break;
|
||||
}
|
||||
kfree(p);
|
||||
kfree(pp);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@@ -3424,6 +3424,22 @@ static int sci_probe_single(struct platform_device *dev,
|
||||
}
|
||||
|
||||
if (sci_uart_earlycon && sci_ports[0].port.mapbase == sci_res->start) {
|
||||
/*
|
||||
* In case:
|
||||
* - this is the earlycon port (mapped on index 0 in sci_ports[]) and
|
||||
* - it now maps to an alias other than zero and
|
||||
* - the earlycon is still alive (e.g., "earlycon keep_bootcon" is
|
||||
* available in bootargs)
|
||||
*
|
||||
* we need to avoid disabling clocks and PM domains through the runtime
|
||||
* PM APIs called in __device_attach(). For this, increment the runtime
|
||||
* PM reference counter (the clocks and PM domains were already enabled
|
||||
* by the bootloader). Otherwise the earlycon may access the HW when it
|
||||
* has no clocks enabled leading to failures (infinite loop in
|
||||
* sci_poll_put_char()).
|
||||
*/
|
||||
pm_runtime_get_noresume(&dev->dev);
|
||||
|
||||
/*
|
||||
* Skip cleanup the sci_port[0] in early_console_exit(), this
|
||||
* port is the same as the earlycon one.
|
||||
|
@@ -484,8 +484,17 @@ void close_all_cached_dirs(struct cifs_sb_info *cifs_sb)
|
||||
spin_lock(&cfids->cfid_list_lock);
|
||||
list_for_each_entry(cfid, &cfids->entries, entry) {
|
||||
tmp_list = kmalloc(sizeof(*tmp_list), GFP_ATOMIC);
|
||||
if (tmp_list == NULL)
|
||||
break;
|
||||
if (tmp_list == NULL) {
|
||||
/*
|
||||
* If the malloc() fails, we won't drop all
|
||||
* dentries, and unmounting is likely to trigger
|
||||
* a 'Dentry still in use' error.
|
||||
*/
|
||||
cifs_tcon_dbg(VFS, "Out of memory while dropping dentries\n");
|
||||
spin_unlock(&cfids->cfid_list_lock);
|
||||
spin_unlock(&cifs_sb->tlink_tree_lock);
|
||||
goto done;
|
||||
}
|
||||
spin_lock(&cfid->fid_lock);
|
||||
tmp_list->dentry = cfid->dentry;
|
||||
cfid->dentry = NULL;
|
||||
@@ -497,6 +506,7 @@ void close_all_cached_dirs(struct cifs_sb_info *cifs_sb)
|
||||
}
|
||||
spin_unlock(&cifs_sb->tlink_tree_lock);
|
||||
|
||||
done:
|
||||
list_for_each_entry_safe(tmp_list, q, &entry, entry) {
|
||||
list_del(&tmp_list->entry);
|
||||
dput(tmp_list->dentry);
|
||||
|
@@ -3982,6 +3982,7 @@ retry:
|
||||
return 0;
|
||||
}
|
||||
|
||||
server->lstrp = jiffies;
|
||||
server->tcpStatus = CifsInNegotiate;
|
||||
spin_unlock(&server->srv_lock);
|
||||
|
||||
|
@@ -738,7 +738,6 @@ out:
|
||||
if (!have_xattr_dev && (tag == IO_REPARSE_TAG_LX_CHR || tag == IO_REPARSE_TAG_LX_BLK))
|
||||
return false;
|
||||
|
||||
fattr->cf_dtype = S_DT(fattr->cf_mode);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -558,8 +558,7 @@ cifs_ses_add_channel(struct cifs_ses *ses,
|
||||
ctx->domainauto = ses->domainAuto;
|
||||
ctx->domainname = ses->domainName;
|
||||
|
||||
/* no hostname for extra channels */
|
||||
ctx->server_hostname = "";
|
||||
ctx->server_hostname = ses->server->hostname;
|
||||
|
||||
ctx->username = ses->user_name;
|
||||
ctx->password = ses->password;
|
||||
|
@@ -3075,7 +3075,8 @@ extern rwlock_t dev_base_lock; /* Device list lock */
|
||||
#define net_device_entry(lh) list_entry(lh, struct net_device, dev_list)
|
||||
|
||||
#define for_each_netdev_dump(net, d, ifindex) \
|
||||
xa_for_each_start(&(net)->dev_by_index, (ifindex), (d), (ifindex))
|
||||
for (; (d = xa_find(&(net)->dev_by_index, &ifindex, \
|
||||
ULONG_MAX, XA_PRESENT)); ifindex++)
|
||||
|
||||
static inline struct net_device *next_net_device(struct net_device *dev)
|
||||
{
|
||||
|
@@ -158,7 +158,7 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
|
||||
const __be32 *from, const __be32 *to,
|
||||
bool pseudohdr);
|
||||
void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb,
|
||||
__wsum diff, bool pseudohdr);
|
||||
__wsum diff, bool pseudohdr, bool ipv6);
|
||||
|
||||
static __always_inline
|
||||
void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb,
|
||||
|
@@ -237,24 +237,6 @@ DEFINE_EVENT(erofs__map_blocks_exit, z_erofs_map_blocks_iter_exit,
|
||||
TP_ARGS(inode, map, flags, ret)
|
||||
);
|
||||
|
||||
TRACE_EVENT(erofs_destroy_inode,
|
||||
TP_PROTO(struct inode *inode),
|
||||
|
||||
TP_ARGS(inode),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( dev_t, dev )
|
||||
__field( erofs_nid_t, nid )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->nid = EROFS_I(inode)->nid;
|
||||
),
|
||||
|
||||
TP_printk("dev = (%d,%d), nid = %llu", show_dev_nid(__entry))
|
||||
);
|
||||
|
||||
#endif /* _TRACE_EROFS_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
@@ -1923,6 +1923,7 @@ union bpf_attr {
|
||||
* for updates resulting in a null checksum the value is set to
|
||||
* **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates
|
||||
* the checksum is to be computed against a pseudo-header.
|
||||
* Flag **BPF_F_IPV6** should be set for IPv6 packets.
|
||||
*
|
||||
* This helper works in combination with **bpf_csum_diff**\ (),
|
||||
* which does not update the checksum in-place, but offers more
|
||||
@@ -5930,6 +5931,7 @@ enum {
|
||||
BPF_F_PSEUDO_HDR = (1ULL << 4),
|
||||
BPF_F_MARK_MANGLED_0 = (1ULL << 5),
|
||||
BPF_F_MARK_ENFORCE = (1ULL << 6),
|
||||
BPF_F_IPV6 = (1ULL << 7),
|
||||
};
|
||||
|
||||
/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
|
||||
|
@@ -172,6 +172,19 @@ static void perf_ctx_unlock(struct perf_cpu_context *cpuctx,
|
||||
raw_spin_unlock(&cpuctx->ctx.lock);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
struct perf_cpu_context *cpuctx;
|
||||
struct perf_event_context *ctx;
|
||||
} class_perf_ctx_lock_t;
|
||||
|
||||
static inline void class_perf_ctx_lock_destructor(class_perf_ctx_lock_t *_T)
|
||||
{ perf_ctx_unlock(_T->cpuctx, _T->ctx); }
|
||||
|
||||
static inline class_perf_ctx_lock_t
|
||||
class_perf_ctx_lock_constructor(struct perf_cpu_context *cpuctx,
|
||||
struct perf_event_context *ctx)
|
||||
{ perf_ctx_lock(cpuctx, ctx); return (class_perf_ctx_lock_t){ cpuctx, ctx }; }
|
||||
|
||||
#define TASK_TOMBSTONE ((void *)-1L)
|
||||
|
||||
static bool is_kernel_event(struct perf_event *event)
|
||||
@@ -867,7 +880,13 @@ static void perf_cgroup_switch(struct task_struct *task)
|
||||
if (READ_ONCE(cpuctx->cgrp) == cgrp)
|
||||
return;
|
||||
|
||||
perf_ctx_lock(cpuctx, cpuctx->task_ctx);
|
||||
guard(perf_ctx_lock)(cpuctx, cpuctx->task_ctx);
|
||||
/*
|
||||
* Re-check, could've raced vs perf_remove_from_context().
|
||||
*/
|
||||
if (READ_ONCE(cpuctx->cgrp) == NULL)
|
||||
return;
|
||||
|
||||
perf_ctx_disable(&cpuctx->ctx, true);
|
||||
|
||||
ctx_sched_out(&cpuctx->ctx, EVENT_ALL|EVENT_CGROUP);
|
||||
@@ -885,7 +904,6 @@ static void perf_cgroup_switch(struct task_struct *task)
|
||||
ctx_sched_in(&cpuctx->ctx, EVENT_ALL|EVENT_CGROUP);
|
||||
|
||||
perf_ctx_enable(&cpuctx->ctx, true);
|
||||
perf_ctx_unlock(cpuctx, cpuctx->task_ctx);
|
||||
}
|
||||
|
||||
static int perf_cgroup_ensure_storage(struct perf_event *event,
|
||||
@@ -2061,8 +2079,9 @@ perf_aux_output_match(struct perf_event *event, struct perf_event *aux_event)
|
||||
}
|
||||
|
||||
static void put_event(struct perf_event *event);
|
||||
static void event_sched_out(struct perf_event *event,
|
||||
struct perf_event_context *ctx);
|
||||
static void __event_disable(struct perf_event *event,
|
||||
struct perf_event_context *ctx,
|
||||
enum perf_event_state state);
|
||||
|
||||
static void perf_put_aux_event(struct perf_event *event)
|
||||
{
|
||||
@@ -2095,8 +2114,7 @@ static void perf_put_aux_event(struct perf_event *event)
|
||||
* state so that we don't try to schedule it again. Note
|
||||
* that perf_event_enable() will clear the ERROR status.
|
||||
*/
|
||||
event_sched_out(iter, ctx);
|
||||
perf_event_set_state(event, PERF_EVENT_STATE_ERROR);
|
||||
__event_disable(iter, ctx, PERF_EVENT_STATE_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2150,18 +2168,6 @@ static inline struct list_head *get_event_list(struct perf_event *event)
|
||||
&event->pmu_ctx->flexible_active;
|
||||
}
|
||||
|
||||
/*
|
||||
* Events that have PERF_EV_CAP_SIBLING require being part of a group and
|
||||
* cannot exist on their own, schedule them out and move them into the ERROR
|
||||
* state. Also see _perf_event_enable(), it will not be able to recover
|
||||
* this ERROR state.
|
||||
*/
|
||||
static inline void perf_remove_sibling_event(struct perf_event *event)
|
||||
{
|
||||
event_sched_out(event, event->ctx);
|
||||
perf_event_set_state(event, PERF_EVENT_STATE_ERROR);
|
||||
}
|
||||
|
||||
static void perf_group_detach(struct perf_event *event)
|
||||
{
|
||||
struct perf_event *leader = event->group_leader;
|
||||
@@ -2197,8 +2203,15 @@ static void perf_group_detach(struct perf_event *event)
|
||||
*/
|
||||
list_for_each_entry_safe(sibling, tmp, &event->sibling_list, sibling_list) {
|
||||
|
||||
/*
|
||||
* Events that have PERF_EV_CAP_SIBLING require being part of
|
||||
* a group and cannot exist on their own, schedule them out
|
||||
* and move them into the ERROR state. Also see
|
||||
* _perf_event_enable(), it will not be able to recover this
|
||||
* ERROR state.
|
||||
*/
|
||||
if (sibling->event_caps & PERF_EV_CAP_SIBLING)
|
||||
perf_remove_sibling_event(sibling);
|
||||
__event_disable(sibling, ctx, PERF_EVENT_STATE_ERROR);
|
||||
|
||||
sibling->group_leader = sibling;
|
||||
list_del_init(&sibling->sibling_list);
|
||||
@@ -2432,6 +2445,15 @@ static void perf_remove_from_context(struct perf_event *event, unsigned long fla
|
||||
event_function_call(event, __perf_remove_from_context, (void *)flags);
|
||||
}
|
||||
|
||||
static void __event_disable(struct perf_event *event,
|
||||
struct perf_event_context *ctx,
|
||||
enum perf_event_state state)
|
||||
{
|
||||
event_sched_out(event, ctx);
|
||||
perf_cgroup_event_disable(event, ctx);
|
||||
perf_event_set_state(event, state);
|
||||
}
|
||||
|
||||
/*
|
||||
* Cross CPU call to disable a performance event
|
||||
*/
|
||||
@@ -2450,13 +2472,18 @@ static void __perf_event_disable(struct perf_event *event,
|
||||
|
||||
perf_pmu_disable(event->pmu_ctx->pmu);
|
||||
|
||||
/*
|
||||
* When disabling a group leader, the whole group becomes ineligible
|
||||
* to run, so schedule out the full group.
|
||||
*/
|
||||
if (event == event->group_leader)
|
||||
group_sched_out(event, ctx);
|
||||
else
|
||||
event_sched_out(event, ctx);
|
||||
|
||||
perf_event_set_state(event, PERF_EVENT_STATE_OFF);
|
||||
perf_cgroup_event_disable(event, ctx);
|
||||
/*
|
||||
* But only mark the leader OFF; the siblings will remain
|
||||
* INACTIVE.
|
||||
*/
|
||||
__event_disable(event, ctx, PERF_EVENT_STATE_OFF);
|
||||
|
||||
perf_pmu_enable(event->pmu_ctx->pmu);
|
||||
}
|
||||
@@ -6943,6 +6970,10 @@ perf_sample_ustack_size(u16 stack_size, u16 header_size,
|
||||
if (!regs)
|
||||
return 0;
|
||||
|
||||
/* No mm, no stack, no dump. */
|
||||
if (!current->mm)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Check if we fit in with the requested stack size into the:
|
||||
* - TASK_SIZE
|
||||
@@ -7640,6 +7671,9 @@ perf_callchain(struct perf_event *event, struct pt_regs *regs)
|
||||
const u32 max_stack = event->attr.sample_max_stack;
|
||||
struct perf_callchain_entry *callchain;
|
||||
|
||||
if (!current->mm)
|
||||
user = false;
|
||||
|
||||
if (!kernel && !user)
|
||||
return &__empty_callchain;
|
||||
|
||||
|
@@ -864,6 +864,15 @@ void __noreturn do_exit(long code)
|
||||
tsk->exit_code = code;
|
||||
taskstats_exit(tsk, group_dead);
|
||||
|
||||
/*
|
||||
* Since sampling can touch ->mm, make sure to stop everything before we
|
||||
* tear it down.
|
||||
*
|
||||
* Also flushes inherited counters to the parent - before the parent
|
||||
* gets woken up by child-exit notifications.
|
||||
*/
|
||||
perf_event_exit_task(tsk);
|
||||
|
||||
exit_mm();
|
||||
|
||||
if (group_dead)
|
||||
@@ -880,14 +889,6 @@ void __noreturn do_exit(long code)
|
||||
exit_task_work(tsk);
|
||||
exit_thread(tsk);
|
||||
|
||||
/*
|
||||
* Flush inherited counters to the parent - before the parent
|
||||
* gets woken up by child-exit notifications.
|
||||
*
|
||||
* because of cgroup mode, must be called before cgroup_exit()
|
||||
*/
|
||||
perf_event_exit_task(tsk);
|
||||
|
||||
sched_autogroup_exit_task(tsk);
|
||||
cgroup_exit(tsk);
|
||||
|
||||
|
@@ -751,6 +751,7 @@ config GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||
|
||||
config PLDMFW
|
||||
bool
|
||||
select CRC32
|
||||
default n
|
||||
|
||||
config ASN1_ENCODER
|
||||
|
@@ -124,6 +124,7 @@ static unsigned char bus_mac[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
/* Device structures */
|
||||
static struct net_device *dev_lec[MAX_LEC_ITF];
|
||||
static DEFINE_MUTEX(lec_mutex);
|
||||
|
||||
#if IS_ENABLED(CONFIG_BRIDGE)
|
||||
static void lec_handle_bridge(struct sk_buff *skb, struct net_device *dev)
|
||||
@@ -685,6 +686,7 @@ static int lec_vcc_attach(struct atm_vcc *vcc, void __user *arg)
|
||||
int bytes_left;
|
||||
struct atmlec_ioc ioc_data;
|
||||
|
||||
lockdep_assert_held(&lec_mutex);
|
||||
/* Lecd must be up in this case */
|
||||
bytes_left = copy_from_user(&ioc_data, arg, sizeof(struct atmlec_ioc));
|
||||
if (bytes_left != 0)
|
||||
@@ -710,6 +712,7 @@ static int lec_vcc_attach(struct atm_vcc *vcc, void __user *arg)
|
||||
|
||||
static int lec_mcast_attach(struct atm_vcc *vcc, int arg)
|
||||
{
|
||||
lockdep_assert_held(&lec_mutex);
|
||||
if (arg < 0 || arg >= MAX_LEC_ITF)
|
||||
return -EINVAL;
|
||||
arg = array_index_nospec(arg, MAX_LEC_ITF);
|
||||
@@ -725,6 +728,7 @@ static int lecd_attach(struct atm_vcc *vcc, int arg)
|
||||
int i;
|
||||
struct lec_priv *priv;
|
||||
|
||||
lockdep_assert_held(&lec_mutex);
|
||||
if (arg < 0)
|
||||
arg = 0;
|
||||
if (arg >= MAX_LEC_ITF)
|
||||
@@ -742,6 +746,7 @@ static int lecd_attach(struct atm_vcc *vcc, int arg)
|
||||
snprintf(dev_lec[i]->name, IFNAMSIZ, "lec%d", i);
|
||||
if (register_netdev(dev_lec[i])) {
|
||||
free_netdev(dev_lec[i]);
|
||||
dev_lec[i] = NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -904,7 +909,6 @@ static void *lec_itf_walk(struct lec_state *state, loff_t *l)
|
||||
v = (dev && netdev_priv(dev)) ?
|
||||
lec_priv_walk(state, l, netdev_priv(dev)) : NULL;
|
||||
if (!v && dev) {
|
||||
dev_put(dev);
|
||||
/* Partial state reset for the next time we get called */
|
||||
dev = NULL;
|
||||
}
|
||||
@@ -928,6 +932,7 @@ static void *lec_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
{
|
||||
struct lec_state *state = seq->private;
|
||||
|
||||
mutex_lock(&lec_mutex);
|
||||
state->itf = 0;
|
||||
state->dev = NULL;
|
||||
state->locked = NULL;
|
||||
@@ -945,8 +950,9 @@ static void lec_seq_stop(struct seq_file *seq, void *v)
|
||||
if (state->dev) {
|
||||
spin_unlock_irqrestore(&state->locked->lec_arp_lock,
|
||||
state->flags);
|
||||
dev_put(state->dev);
|
||||
state->dev = NULL;
|
||||
}
|
||||
mutex_unlock(&lec_mutex);
|
||||
}
|
||||
|
||||
static void *lec_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
@@ -1003,6 +1009,7 @@ static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
mutex_lock(&lec_mutex);
|
||||
switch (cmd) {
|
||||
case ATMLEC_CTRL:
|
||||
err = lecd_attach(vcc, (int)arg);
|
||||
@@ -1017,6 +1024,7 @@ static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&lec_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@@ -1976,10 +1976,11 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset,
|
||||
bool is_pseudo = flags & BPF_F_PSEUDO_HDR;
|
||||
bool is_mmzero = flags & BPF_F_MARK_MANGLED_0;
|
||||
bool do_mforce = flags & BPF_F_MARK_ENFORCE;
|
||||
bool is_ipv6 = flags & BPF_F_IPV6;
|
||||
__sum16 *ptr;
|
||||
|
||||
if (unlikely(flags & ~(BPF_F_MARK_MANGLED_0 | BPF_F_MARK_ENFORCE |
|
||||
BPF_F_PSEUDO_HDR | BPF_F_HDR_FIELD_MASK)))
|
||||
BPF_F_PSEUDO_HDR | BPF_F_HDR_FIELD_MASK | BPF_F_IPV6)))
|
||||
return -EINVAL;
|
||||
if (unlikely(offset > 0xffff || offset & 1))
|
||||
return -EFAULT;
|
||||
@@ -1995,7 +1996,7 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset,
|
||||
if (unlikely(from != 0))
|
||||
return -EINVAL;
|
||||
|
||||
inet_proto_csum_replace_by_diff(ptr, skb, to, is_pseudo);
|
||||
inet_proto_csum_replace_by_diff(ptr, skb, to, is_pseudo, is_ipv6);
|
||||
break;
|
||||
case 2:
|
||||
inet_proto_csum_replace2(ptr, skb, from, to, is_pseudo);
|
||||
|
@@ -473,11 +473,11 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
|
||||
EXPORT_SYMBOL(inet_proto_csum_replace16);
|
||||
|
||||
void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb,
|
||||
__wsum diff, bool pseudohdr)
|
||||
__wsum diff, bool pseudohdr, bool ipv6)
|
||||
{
|
||||
if (skb->ip_summed != CHECKSUM_PARTIAL) {
|
||||
csum_replace_by_diff(sum, diff);
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr)
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr && !ipv6)
|
||||
skb->csum = ~csum_sub(diff, skb->csum);
|
||||
} else if (pseudohdr) {
|
||||
*sum = ~csum_fold(csum_add(diff, csum_unfold(*sum)));
|
||||
|
@@ -3,6 +3,7 @@
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <net/tcp.h>
|
||||
#include <net/busy_poll.h>
|
||||
|
||||
void tcp_fastopen_init_key_once(struct net *net)
|
||||
{
|
||||
@@ -278,6 +279,8 @@ static struct sock *tcp_fastopen_create_child(struct sock *sk,
|
||||
|
||||
refcount_set(&req->rsk_refcnt, 2);
|
||||
|
||||
sk_mark_napi_id_set(child, skb);
|
||||
|
||||
/* Now finish processing the fastopen child socket. */
|
||||
tcp_init_transfer(child, BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, skb);
|
||||
|
||||
|
@@ -2462,20 +2462,33 @@ static inline bool tcp_packet_delayed(const struct tcp_sock *tp)
|
||||
{
|
||||
const struct sock *sk = (const struct sock *)tp;
|
||||
|
||||
if (tp->retrans_stamp &&
|
||||
tcp_tsopt_ecr_before(tp, tp->retrans_stamp))
|
||||
return true; /* got echoed TS before first retransmission */
|
||||
/* Received an echoed timestamp before the first retransmission? */
|
||||
if (tp->retrans_stamp)
|
||||
return tcp_tsopt_ecr_before(tp, tp->retrans_stamp);
|
||||
|
||||
/* Check if nothing was retransmitted (retrans_stamp==0), which may
|
||||
* happen in fast recovery due to TSQ. But we ignore zero retrans_stamp
|
||||
* in TCP_SYN_SENT, since when we set FLAG_SYN_ACKED we also clear
|
||||
* retrans_stamp even if we had retransmitted the SYN.
|
||||
/* We set tp->retrans_stamp upon the first retransmission of a loss
|
||||
* recovery episode, so normally if tp->retrans_stamp is 0 then no
|
||||
* retransmission has happened yet (likely due to TSQ, which can cause
|
||||
* fast retransmits to be delayed). So if snd_una advanced while
|
||||
* (tp->retrans_stamp is 0 then apparently a packet was merely delayed,
|
||||
* not lost. But there are exceptions where we retransmit but then
|
||||
* clear tp->retrans_stamp, so we check for those exceptions.
|
||||
*/
|
||||
if (!tp->retrans_stamp && /* no record of a retransmit/SYN? */
|
||||
sk->sk_state != TCP_SYN_SENT) /* not the FLAG_SYN_ACKED case? */
|
||||
return true; /* nothing was retransmitted */
|
||||
|
||||
/* (1) For non-SACK connections, tcp_is_non_sack_preventing_reopen()
|
||||
* clears tp->retrans_stamp when snd_una == high_seq.
|
||||
*/
|
||||
if (!tcp_is_sack(tp) && !before(tp->snd_una, tp->high_seq))
|
||||
return false;
|
||||
|
||||
/* (2) In TCP_SYN_SENT tcp_clean_rtx_queue() clears tp->retrans_stamp
|
||||
* when setting FLAG_SYN_ACKED is set, even if the SYN was
|
||||
* retransmitted.
|
||||
*/
|
||||
if (sk->sk_state == TCP_SYN_SENT)
|
||||
return false;
|
||||
|
||||
return true; /* tp->retrans_stamp is zero; no retransmit yet */
|
||||
}
|
||||
|
||||
/* Undo procedures. */
|
||||
|
@@ -1210,6 +1210,10 @@ static int calipso_req_setattr(struct request_sock *req,
|
||||
struct ipv6_opt_hdr *old, *new;
|
||||
struct sock *sk = sk_to_full_sk(req_to_sk(req));
|
||||
|
||||
/* sk is NULL for SYN+ACK w/ SYN Cookie */
|
||||
if (!sk)
|
||||
return -ENOMEM;
|
||||
|
||||
if (req_inet->ipv6_opt && req_inet->ipv6_opt->hopopt)
|
||||
old = req_inet->ipv6_opt->hopopt;
|
||||
else
|
||||
@@ -1250,6 +1254,10 @@ static void calipso_req_delattr(struct request_sock *req)
|
||||
struct ipv6_txoptions *txopts;
|
||||
struct sock *sk = sk_to_full_sk(req_to_sk(req));
|
||||
|
||||
/* sk is NULL for SYN+ACK w/ SYN Cookie */
|
||||
if (!sk)
|
||||
return;
|
||||
|
||||
if (!req_inet->ipv6_opt || !req_inet->ipv6_opt->hopopt)
|
||||
return;
|
||||
|
||||
|
@@ -86,7 +86,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb,
|
||||
|
||||
diff = get_csum_diff(ip6h, p);
|
||||
inet_proto_csum_replace_by_diff(&th->check, skb,
|
||||
diff, true);
|
||||
diff, true, true);
|
||||
}
|
||||
break;
|
||||
case NEXTHDR_UDP:
|
||||
@@ -97,7 +97,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb,
|
||||
if (uh->check || skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
diff = get_csum_diff(ip6h, p);
|
||||
inet_proto_csum_replace_by_diff(&uh->check, skb,
|
||||
diff, true);
|
||||
diff, true, true);
|
||||
if (!uh->check)
|
||||
uh->check = CSUM_MANGLED_0;
|
||||
}
|
||||
@@ -111,7 +111,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb,
|
||||
|
||||
diff = get_csum_diff(ip6h, p);
|
||||
inet_proto_csum_replace_by_diff(&ih->icmp6_cksum, skb,
|
||||
diff, true);
|
||||
diff, true, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@@ -81,8 +81,8 @@ static struct mpls_route *mpls_route_input_rcu(struct net *net, unsigned index)
|
||||
|
||||
if (index < net->mpls.platform_labels) {
|
||||
struct mpls_route __rcu **platform_label =
|
||||
rcu_dereference(net->mpls.platform_label);
|
||||
rt = rcu_dereference(platform_label[index]);
|
||||
rcu_dereference_rtnl(net->mpls.platform_label);
|
||||
rt = rcu_dereference_rtnl(platform_label[index]);
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
|
@@ -1344,7 +1344,8 @@ svc_process_common(struct svc_rqst *rqstp)
|
||||
case SVC_OK:
|
||||
break;
|
||||
case SVC_GARBAGE:
|
||||
goto err_garbage_args;
|
||||
rqstp->rq_auth_stat = rpc_autherr_badcred;
|
||||
goto err_bad_auth;
|
||||
case SVC_SYSERR:
|
||||
goto err_system_err;
|
||||
case SVC_DENIED:
|
||||
@@ -1485,14 +1486,6 @@ err_bad_proc:
|
||||
*rqstp->rq_accept_statp = rpc_proc_unavail;
|
||||
goto sendit;
|
||||
|
||||
err_garbage_args:
|
||||
svc_printk(rqstp, "failed to decode RPC header\n");
|
||||
|
||||
if (serv->sv_stats)
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
*rqstp->rq_accept_statp = rpc_garbage_args;
|
||||
goto sendit;
|
||||
|
||||
err_system_err:
|
||||
if (serv->sv_stats)
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
|
@@ -489,7 +489,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
|
||||
rtnl_lock();
|
||||
b = tipc_bearer_find(net, bname);
|
||||
if (!b) {
|
||||
if (!b || b->bcast_addr.media_id != TIPC_MEDIA_TYPE_UDP) {
|
||||
rtnl_unlock();
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -500,7 +500,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
|
||||
rtnl_lock();
|
||||
b = rtnl_dereference(tn->bearer_list[bid]);
|
||||
if (!b) {
|
||||
if (!b || b->bcast_addr.media_id != TIPC_MEDIA_TYPE_UDP) {
|
||||
rtnl_unlock();
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@@ -1913,6 +1913,7 @@ union bpf_attr {
|
||||
* for updates resulting in a null checksum the value is set to
|
||||
* **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates
|
||||
* the checksum is to be computed against a pseudo-header.
|
||||
* Flag **BPF_F_IPV6** should be set for IPv6 packets.
|
||||
*
|
||||
* This helper works in combination with **bpf_csum_diff**\ (),
|
||||
* which does not update the checksum in-place, but offers more
|
||||
@@ -5920,6 +5921,7 @@ enum {
|
||||
BPF_F_PSEUDO_HDR = (1ULL << 4),
|
||||
BPF_F_MARK_MANGLED_0 = (1ULL << 5),
|
||||
BPF_F_MARK_ENFORCE = (1ULL << 6),
|
||||
BPF_F_IPV6 = (1ULL << 7),
|
||||
};
|
||||
|
||||
/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */
|
||||
|
@@ -271,6 +271,7 @@ bool is_event_supported(u8 type, u64 config)
|
||||
ret = evsel__open(evsel, NULL, tmap) >= 0;
|
||||
}
|
||||
|
||||
evsel__close(evsel);
|
||||
evsel__delete(evsel);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user