Merge keystone/android12-5.10-keystone-qcom-release.110+ (b92ac32
) into msm-5.10
* refs/heads/tmp-b92ac32: FROMGIT: usb: gadget: uvc: calculate the number of request depending on framesize ANDROID: GKI: Add tracing_is_on interface into symbol list UPSTREAM: usb: gadget: f_mass_storage: Make CD-ROM emulation work with Mac OS-X BACKPORT: io_uring: fix race between timeout flush and removal BACKPORT: net/sched: cls_u32: fix netns refcount changes in u32_change() UPSTREAM: io_uring: always use original task when preparing req identity FROMLIST: remoteproc: Fix dma_mem leak after rproc_shutdown FROMLIST: dma-mapping: Add dma_release_coherent_memory to DMA API ANDROID: Update QCOM symbol list for __reset_control_get ANDROID: vendor_hooks: Add hooks for mutex BACKPORT: can: ems_usb: ems_usb_start_xmit(): fix double dev_kfree_skb() in error path ANDROID: fix up abi issue with struct snd_pcm_runtime, again Revert "coredump: Snapshot the vmas in do_coredump" Revert "coredump: Remove the WARN_ON in dump_vma_snapshot" Revert "coredump: Use the vma snapshot in fill_files_note" Revert "pstore: Don't use semaphores in always-atomic-context code" Revert "PCI: Reduce warnings on possible RW1C corruption" ANDROID: GKI: fix crc issue with commitce1927b8cf
("block: don't merge across cgroup boundaries if blkcg is enabled") ANDROID: remove CONFIG_HW_RANDOM_CAVIUM from arm64 gki_defconfig Linux 5.10.110 PCI: xgene: Revert "PCI: xgene: Use inbound resources for setup" arm64: Do not defer reserve_crashkernel() for platforms with no DMA memory zones coredump: Use the vma snapshot in fill_files_note coredump/elf: Pass coredump_params into fill_note_info coredump: Remove the WARN_ON in dump_vma_snapshot coredump: Snapshot the vmas in do_coredump can: usb_8dev: usb_8dev_start_xmit(): fix double dev_kfree_skb() in error path can: m_can: m_can_tx_handler(): fix use after free of skb KVM: x86/mmu: do compare-and-exchange of gPTE via the user address openvswitch: Fixed nd target mask field in the flow dump. docs: sysctl/kernel: add missing bit to panic_print um: Fix uml_mconsole stop/go ARM: dts: spear13xx: Update SPI dma properties ARM: dts: spear1340: Update serial node properties ASoC: topology: Allow TLV control to be either read or write ubi: fastmap: Return error code if memory allocation fails in add_aeb() dt-bindings: spi: mxic: The interrupt property is not mandatory dt-bindings: mtd: nand-controller: Fix a comment in the examples dt-bindings: mtd: nand-controller: Fix the reg property description bpf: Fix comment for helper bpf_current_task_under_cgroup() bpf: Adjust BPF stack helper functions to accommodate skip > 0 mm/usercopy: return 1 from hardened_usercopy __setup() handler mm/memcontrol: return 1 from cgroup.memory __setup() handler ARM: 9187/1: JIVE: fix return value of __setup handler mm/mmap: return 1 from stack_guard_gap __setup() handler batman-adv: Check ptr for NULL before reducing its refcnt ASoC: soc-compress: Change the check for codec_dai staging: mt7621-dts: fix pinctrl-0 items to be size-1 items on ethernet proc: bootconfig: Add null pointer check can: isotp: restore accidentally removed MSG_PEEK feature platform/chrome: cros_ec_typec: Check for EC device ACPI: CPPC: Avoid out of bounds access when parsing _CPC data riscv module: remove (NOLOAD) io_uring: fix memory leak of uid in files registration ARM: iop32x: offset IRQ numbers by 1 ubi: Fix race condition between ctrl_cdev_ioctl and ubi_cdev_ioctl ASoC: mediatek: mt6358: add missing EXPORT_SYMBOLs pinctrl: nuvoton: npcm7xx: Use %zu printk format for ARRAY_SIZE() pinctrl: nuvoton: npcm7xx: Rename DS() macro to DSTR() watchdog: rti-wdt: Add missing pm_runtime_disable() in probe function pinctrl: pinconf-generic: Print arguments for bias-pull-* watch_queue: Free the page array when watch_queue is dismantled crypto: arm/aes-neonbs-cbc - Select generic cbc and aes mailbox: imx: fix wakeup failure from freeze mode rxrpc: Fix call timer start racing with call destruction net: hns3: fix software vlan talbe of vlan 0 inconsistent with hardware gfs2: Make sure FITRIM minlen is rounded up to fs block size rtc: check if __rtc_read_time was successful XArray: Update the LRU list in xas_split() can: mcp251xfd: mcp251xfd_register_get_dev_id(): fix return of error value can: mcba_usb: properly check endpoint type can: mcba_usb: mcba_usb_start_xmit(): fix double dev_kfree_skb in error path XArray: Fix xas_create_range() when multi-order entry present wireguard: socket: ignore v6 endpoints when ipv6 is disabled wireguard: socket: free skb in send6 when ipv6 is disabled wireguard: queueing: use CFI-safe ptr_ring cleanup function ubifs: rename_whiteout: correct old_dir size computing ubifs: Fix to add refcount once page is set private ubifs: Fix read out-of-bounds in ubifs_wbuf_write_nolock() ubifs: setflags: Make dirtied_ino_d 8 bytes aligned ubifs: Add missing iput if do_tmpfile() failed in rename whiteout ubifs: Fix deadlock in concurrent rename whiteout and inode writeback ubifs: rename_whiteout: Fix double free for whiteout_ui->data ASoC: SOF: Intel: Fix NULL ptr dereference when ENOMEM KVM: SVM: fix panic on out-of-bounds guest IRQ KVM: x86: fix sending PV IPI KVM: Prevent module exit until all VMs are freed KVM: x86: Forbid VMM to set SYNIC/STIMER MSRs when SynIC wasn't activated platform: chrome: Split trace include file scsi: qla2xxx: Use correct feature type field during RFF_ID processing scsi: qla2xxx: Reduce false trigger to login scsi: qla2xxx: Fix N2N inconsistent PLOGI scsi: qla2xxx: Fix missed DMA unmap for NVMe ls requests scsi: qla2xxx: Fix hang due to session stuck scsi: qla2xxx: Fix incorrect reporting of task management failure scsi: qla2xxx: Fix disk failure to rediscover scsi: qla2xxx: Suppress a kernel complaint in qla_create_qpair() scsi: qla2xxx: Check for firmware dump already collected scsi: qla2xxx: Add devids and conditionals for 28xx scsi: qla2xxx: Fix device reconnect in loop topology scsi: qla2xxx: Fix warning for missing error code scsi: qla2xxx: Fix wrong FDMI data for 64G adapter scsi: qla2xxx: Fix scheduling while atomic scsi: qla2xxx: Fix stuck session in gpdb powerpc: Fix build errors with newer binutils powerpc/lib/sstep: Fix build errors with newer binutils powerpc/lib/sstep: Fix 'sthcx' instruction powerpc/kasan: Fix early region not updated correctly KVM: x86/mmu: Check for present SPTE when clearing dirty bit in TDP MMU ALSA: hda/realtek: Add alc256-samsung-headphone fixup media: atomisp: fix bad usage at error handling logic mmc: host: Return an error when ->enable_sdio_irq() ops is missing media: hdpvr: initialize dev->worker at hdpvr_register_videodev media: Revert "media: em28xx: add missing em28xx_close_extension" video: fbdev: sm712fb: Fix crash in smtcfb_write() ARM: mmp: Fix failure to remove sram device ARM: tegra: tamonten: Fix I2C3 pad setting lib/test_lockup: fix kernel pointer check for separate address spaces uaccess: fix type mismatch warnings from access_ok() media: cx88-mpeg: clear interrupt status register before streaming video ASoC: soc-core: skip zero num_dai component in searching dai name ARM: dts: bcm2711: Add the missing L1/L2 cache information video: fbdev: udlfb: replace snprintf in show functions with sysfs_emit video: fbdev: omapfb: panel-tpo-td043mtea1: Use sysfs_emit() instead of snprintf() video: fbdev: omapfb: panel-dsi-cm: Use sysfs_emit() instead of snprintf() arm64: defconfig: build imx-sdma as a module ARM: dts: imx7: Use audio_mclk_post_div instead audio_mclk_root_clk ARM: ftrace: avoid redundant loads or clobbering IP media: atomisp: fix dummy_ptr check to avoid duplicate active_bo media: atomisp_gmin_platform: Add DMI quirk to not turn AXP ELDO2 regulator off on some boards ASoC: madera: Add dependencies on MFD ARM: dts: bcm2837: Add the missing L1/L2 cache information ARM: dts: qcom: fix gic_irq_domain_translate warnings for msm8960 video: fbdev: omapfb: acx565akm: replace snprintf with sysfs_emit video: fbdev: cirrusfb: check pixclock to avoid divide by zero video: fbdev: w100fb: Reset global state video: fbdev: nvidiafb: Use strscpy() to prevent buffer overflow media: ir_toy: free before error exiting media: staging: media: zoran: fix various V4L2 compliance errors media: staging: media: zoran: calculate the right buffer number for zoran_reap_stat_com media: staging: media: zoran: move videodev alloc ntfs: add sanity check on allocation size f2fs: compress: fix to print raw data size in error path of lz4 decompression NFSD: Fix nfsd_breaker_owns_lease() return values f2fs: fix to do sanity check on curseg->alloc_type ext4: don't BUG if someone dirty pages without asking ext4 first ext4: fix ext4_mb_mark_bb() with flex_bg with fast_commit ext4: correct cluster len and clusters changed accounting in ext4_mb_mark_bb locking/lockdep: Iterate lock_classes directly when reading lockdep files spi: tegra20: Use of_device_get_match_data() nvme-tcp: lockdep: annotate in-kernel sockets parisc: Fix handling off probe non-access faults PM: core: keep irq flags in device_pm_check_callbacks() ACPI/APEI: Limit printable size of BERT table data Revert "Revert "block, bfq: honor already-setup queue merges"" lib/raid6/test/Makefile: Use $(pound) instead of \# for Make 4.3 ACPICA: Avoid walking the ACPI Namespace if it is not there bfq: fix use-after-free in bfq_dispatch_request fs/binfmt_elf: Fix AT_PHDR for unusual ELF files irqchip/nvic: Release nvic_base upon failure irqchip/qcom-pdc: Fix broken locking Fix incorrect type in assignment of ipv6 port for audit loop: use sysfs_emit() in the sysfs xxx show() selinux: allow FIOCLEX and FIONCLEX with policy capability selinux: use correct type for context length block, bfq: don't move oom_bfqq pinctrl: npcm: Fix broken references to chip->parent_device gcc-plugins/stackleak: Exactly match strings instead of prefixes regulator: rpi-panel: Handle I2C errors/timing to the Atmel LSM: general protection fault in legacy_parse_param fs: fix fd table size alignment properly lib/test: use after free in register_test_dev_kmod() fs: fd tables have to be multiples of BITS_PER_LONG net: dsa: bcm_sf2_cfp: fix an incorrect NULL check on list iterator NFSv4/pNFS: Fix another issue with a list iterator pointing to the head net/x25: Fix null-ptr-deref caused by x25_disconnect qlcnic: dcb: default to returning -EOPNOTSUPP selftests: test_vxlan_under_vrf: Fix broken test case net: phy: broadcom: Fix brcm_fet_config_init() net: hns3: fix bug when PF set the duplicate MAC address for VFs net: enetc: report software timestamping via SO_TIMESTAMPING xen: fix is_xen_pmu() clk: Initialize orphan req_rate clk: qcom: gcc-msm8994: Fix gpll4 width kdb: Fix the putarea helper function NFSv4.1: don't retry BIND_CONN_TO_SESSION on session error netfilter: nf_conntrack_tcp: preserve liberal flag in tcp options jfs: fix divide error in dbNextAG driver core: dd: fix return value of __setup handler firmware: google: Properly state IOMEM dependency kgdbts: fix return value of __setup handler serial: 8250: fix XOFF/XON sending when DMA is used kgdboc: fix return value of __setup handler tty: hvc: fix return value of __setup handler pinctrl/rockchip: Add missing of_node_put() in rockchip_pinctrl_probe pinctrl: nomadik: Add missing of_node_put() in nmk_pinctrl_probe pinctrl: mediatek: paris: Skip custom extra pin config dump for virtual GPIOs pinctrl: mediatek: paris: Fix pingroup pin config state readback pinctrl: mediatek: paris: Fix "argument" argument type for mtk_pinconf_get() pinctrl: mediatek: paris: Fix PIN_CONFIG_BIAS_* readback pinctrl: mediatek: Fix missing of_node_put() in mtk_pctrl_init staging: mt7621-dts: fix GB-PC2 devicetree staging: mt7621-dts: fix pinctrl properties for ethernet staging: mt7621-dts: fix formatting staging: mt7621-dts: fix LEDs and pinctrl on GB-PC1 devicetree NFS: remove unneeded check in decode_devicenotify_args() clk: tegra: tegra124-emc: Fix missing put_device() call in emc_ensure_emc_driver clk: clps711x: Terminate clk_div_table with sentinel element clk: loongson1: Terminate clk_div_table with sentinel element clk: actions: Terminate clk_div_table with sentinel element nvdimm/region: Fix default alignment for small regions remoteproc: qcom_q6v5_mss: Fix some leaks in q6v5_alloc_memory_region remoteproc: qcom_wcnss: Add missing of_node_put() in wcnss_alloc_memory_region remoteproc: qcom: Fix missing of_node_put in adsp_alloc_memory_region dmaengine: hisi_dma: fix MSI allocate fail when reload hisi_dma clk: qcom: clk-rcg2: Update the frac table for pixel clock clk: qcom: clk-rcg2: Update logic to calculate D value for RCG clk: at91: sama7g5: fix parents of PDMCs' GCLK clk: imx7d: Remove audio_mclk_root_clk dma-debug: fix return value of __setup handlers NFS: Return valid errors from nfs2/3_decode_dirent() habanalabs: Add check for pci_enable_device iio: adc: Add check for devm_request_threaded_irq serial: 8250: Fix race condition in RTS-after-send handling NFS: Use of mapping_set_error() results in spurious errors serial: 8250_lpss: Balance reference count for PCI DMA device serial: 8250_mid: Balance reference count for PCI DMA device phy: dphy: Correct lpx parameter and its derivatives(ta_{get,go,sure}) clk: qcom: ipq8074: Use floor ops for SDCC1 clock pinctrl: renesas: checker: Fix miscalculation of number of states pinctrl: renesas: r8a77470: Reduce size for narrow VIN1 channel staging:iio:adc:ad7280a: Fix handing of device address bit reversing. iio: mma8452: Fix probe failing when an i2c_device_id is used clk: qcom: ipq8074: fix PCI-E clock oops soundwire: intel: fix wrong register name in intel_shim_wake cpufreq: qcom-cpufreq-nvmem: fix reading of PVS Valid fuse misc: alcor_pci: Fix an error handling path fsi: Aspeed: Fix a potential double free fsi: aspeed: convert to devm_platform_ioremap_resource pwm: lpc18xx-sct: Initialize driver data and hardware before pwmchip_add() mxser: fix xmit_buf leak in activate when LSR == 0xff mfd: asic3: Add missing iounmap() on error asic3_mfd_probe tipc: fix the timer expires after interval 100ms openvswitch: always update flow key after nat tcp: ensure PMTU updates are processed during fastopen net: bcmgenet: Use stronger register read/writes to assure ordering PCI: Avoid broken MSI on SB600 USB devices selftests/bpf/test_lirc_mode2.sh: Exit with proper code i2c: mux: demux-pinctrl: do not deactivate a master that is not active i2c: meson: Fix wrong speed use from probe af_netlink: Fix shift out of bounds in group mask calculation ipv4: Fix route lookups when handling ICMP redirects and PMTU updates Bluetooth: btmtksdio: Fix kernel oops in btmtksdio_interrupt Bluetooth: call hci_le_conn_failed with hdev lock in hci_le_conn_failed selftests/bpf: Fix error reporting from sock_fields programs bareudp: use ipv6_mod_enabled to check if IPv6 enabled can: isotp: support MSG_TRUNC flag when reading from socket can: isotp: return -EADDRNOTAVAIL when reading from unbound socket USB: storage: ums-realtek: fix error code in rts51x_read_mem() samples/bpf, xdpsock: Fix race when running for fix duration of time bpf, sockmap: Fix double uncharge the mem of sk_msg bpf, sockmap: Fix more uncharged while msg has more_data bpf, sockmap: Fix memleak in tcp_bpf_sendmsg while sk msg is full RDMA/mlx5: Fix memory leak in error flow for subscribe event routine mtd: rawnand: atmel: fix refcount issue in atmel_nand_controller_init MIPS: pgalloc: fix memory leak caused by pgd_free() MIPS: RB532: fix return value of __setup handler mips: cdmm: Fix refcount leak in mips_cdmm_phys_base ath10k: Fix error handling in ath10k_setup_msa_resources vxcan: enable local echo for sent CAN frames powerpc: 8xx: fix a return value error in mpc8xx_pic_init platform/x86: huawei-wmi: check the return value of device_create_file() selftests/bpf: Make test_lwt_ip_encap more stable and faster libbpf: Unmap rings when umem deleted mfd: mc13xxx: Add check for mc13xxx_irq_request powerpc/sysdev: fix incorrect use to determine if list is empty mips: DEC: honor CONFIG_MIPS_FP_SUPPORT=n net: axienet: fix RX ring refill allocation failure handling PCI: Reduce warnings on possible RW1C corruption IB/hfi1: Allow larger MTU without AIP power: supply: wm8350-power: Add missing free in free_charger_irq power: supply: wm8350-power: Handle error for wm8350_register_irq i2c: xiic: Make bus names unique hv_balloon: rate-limit "Unhandled message" warning KVM: x86/emulator: Defer not-present segment check in __load_segment_descriptor() KVM: x86: Fix emulation in writing cr8 powerpc/Makefile: Don't pass -mcpu=powerpc64 when building 32-bit powerpc/mm/numa: skip NUMA_NO_NODE onlining in parse_numa_properties() libbpf: Skip forward declaration when counting duplicated type names gpu: host1x: Fix a memory leak in 'host1x_remove()' bpf, arm64: Feed byte-offset into bpf line info bpf, arm64: Call build_prologue() first in first JIT pass drm/bridge: cdns-dsi: Make sure to to create proper aliases for dt scsi: hisi_sas: Change permission of parameter prot_mask power: supply: bq24190_charger: Fix bq24190_vbus_is_enabled() wrong false return drm/tegra: Fix reference leak in tegra_dsi_ganged_probe ext2: correct max file size computing TOMOYO: fix __setup handlers return values drm/amd/display: Remove vupdate_int_entry definition RDMA/mlx5: Fix the flow of a miss in the allocation of a cache ODP MR scsi: pm8001: Fix abort all task initialization scsi: pm8001: Fix NCQ NON DATA command completion handling scsi: pm8001: Fix NCQ NON DATA command task initialization scsi: pm8001: Fix le32 values handling in pm80xx_chip_sata_req() scsi: pm8001: Fix le32 values handling in pm80xx_chip_ssp_io_req() scsi: pm8001: Fix payload initialization in pm80xx_encrypt_update() scsi: pm8001: Fix le32 values handling in pm80xx_set_sas_protocol_timer_config() scsi: pm8001: Fix payload initialization in pm80xx_set_thermal_config() scsi: pm8001: Fix command initialization in pm8001_chip_ssp_tm_req() scsi: pm8001: Fix command initialization in pm80XX_send_read_log() dm crypt: fix get_key_size compiler warning if !CONFIG_KEYS drm/msm/dpu: fix dp audio condition drm/msm/dpu: add DSPP blocks teardown drm/msm/dp: populate connector of struct dp_panel iwlwifi: mvm: Fix an error code in iwl_mvm_up() iwlwifi: Fix -EIO error code that is never returned dax: make sure inodes are flushed before destroy cache IB/cma: Allow XRC INI QPs to set their local ACK timeout drm/amd/display: Add affected crtcs to atomic state for dsc mst unplug drm/amd/pm: enable pm sysfs write for one VF mode iommu/ipmmu-vmsa: Check for error num after setting mask HID: i2c-hid: fix GET/SET_REPORT for unnumbered reports power: supply: ab8500: Fix memory leak in ab8500_fg_sysfs_init drm/bridge: dw-hdmi: use safe format when first in bridge chain PCI: aardvark: Fix reading PCI_EXP_RTSTA_PME bit on emulated bridge livepatch: Fix build failure on 32 bits processors scripts/dtc: Call pkg-config POSIXly correct net: dsa: mv88e6xxx: Enable port policy support on 6097 mt76: mt7615: check sta_rates pointer in mt7615_sta_rate_tbl_update mt76: mt7603: check sta_rates pointer in mt7603_sta_rate_tbl_update mt76: mt7915: use proper aid value in mt7915_mcu_sta_basic_tlv mt76: mt7915: use proper aid value in mt7915_mcu_wtbl_generic_tlv in sta mode powerpc/perf: Don't use perf_hw_context for trace IMC PMU KVM: PPC: Book3S HV: Check return value of kvmppc_radix_init powerpc: dts: t1040rdb: fix ports names for Seville Ethernet switch ray_cs: Check ioremap return value power: reset: gemini-poweroff: Fix IRQ check in gemini_poweroff_probe i40e: respect metadata on XSK Rx to skb i40e: don't reserve excessive XDP_PACKET_HEADROOM on XSK Rx to skb KVM: PPC: Fix vmx/vsx mixup in mmio emulation RDMA/core: Set MR type in ib_reg_user_mr ath9k_htc: fix uninit value bugs drm/amd/pm: return -ENOTSUPP if there is no get_dpm_ultimate_freq function drm/amd/display: Fix a NULL pointer dereference in amdgpu_dm_connector_add_common_modes() drm/nouveau/acr: Fix undefined behavior in nvkm_acr_hsfw_load_bl() ionic: fix type complaint in ionic_dev_cmd_clean() drm/edid: Don't clear formats if using deep color mtd: rawnand: gpmi: fix controller timings setting mtd: onenand: Check for error irq Bluetooth: hci_serdev: call init_rwsem() before p->open() udmabuf: validate ubuf->pagecount libbpf: Fix possible NULL pointer dereference when destroying skeleton drm/panfrost: Check for error num after setting mask ath10k: fix memory overwrite of the WoWLAN wakeup packet pattern drm: bridge: adv7511: Fix ADV7535 HPD enablement drm/bridge: nwl-dsi: Fix PM disable depth imbalance in nwl_dsi_probe drm/bridge: Add missing pm_runtime_disable() in __dw_mipi_dsi_probe drm/bridge: Fix free wrong object in sii8620_init_rcp_input_dev drm/meson: osd_afbcd: Add an exit callback to struct meson_afbcd_ops ARM: configs: multi_v5_defconfig: re-enable CONFIG_V4L_PLATFORM_DRIVERS ASoC: codecs: wcd934x: Add missing of_node_put() in wcd934x_codec_parse_data ASoC: msm8916-wcd-analog: Fix error handling in pm8916_wcd_analog_spmi_probe ASoC: atmel: Fix error handling in sam9x5_wm8731_driver_probe ASoC: atmel: sam9x5_wm8731: use devm_snd_soc_register_card() mmc: davinci_mmc: Handle error for clk_enable ASoC: msm8916-wcd-digital: Fix missing clk_disable_unprepare() in msm8916_wcd_digital_probe ASoC: imx-es8328: Fix error return code in imx_es8328_probe() ASoC: fsl_spdif: Disable TX clock when stop ASoC: mxs: Fix error handling in mxs_sgtl5000_probe ASoC: dmaengine: do not use a NULL prepare_slave_config() callback ASoC: SOF: Add missing of_node_put() in imx8m_probe ASoC: rockchip: i2s: Fix missing clk_disable_unprepare() in rockchip_i2s_probe ASoC: rockchip: i2s: Use devm_platform_get_and_ioremap_resource() ivtv: fix incorrect device_caps for ivtvfb media: saa7134: fix incorrect use to determine if list is empty media: saa7134: convert list_for_each to entry variant video: fbdev: omapfb: Add missing of_node_put() in dvic_probe_of ASoC: fsi: Add check for clk_enable ASoC: wm8350: Handle error for wm8350_register_irq ASoC: atmel: Add missing of_node_put() in at91sam9g20ek_audio_probe media: vidtv: Check for null return of vzalloc media: stk1160: If start stream fails, return buffers with VB2_BUF_STATE_QUEUED m68k: coldfire/device.c: only build for MCF_EDMA when h/w macros are defined arm64: dts: rockchip: Fix SDIO regulator supply properties on rk3399-firefly ALSA: firewire-lib: fix uninitialized flag for AV/C deferred transaction memory: emif: check the pointer temp in get_device_details() memory: emif: Add check for setup_interrupts ASoC: soc-compress: prevent the potentially use of null pointer ASoC: dwc-i2s: Handle errors for clk_enable ASoC: atmel_ssc_dai: Handle errors for clk_enable ASoC: mxs-saif: Handle errors for clk_enable printk: fix return value of printk.devkmsg __setup handler arm64: dts: broadcom: Fix sata nodename arm64: dts: ns2: Fix spi-cpol and spi-cpha property ALSA: spi: Add check for clk_enable() ASoC: ti: davinci-i2s: Add check for clk_enable() ASoC: rt5663: check the return value of devm_kzalloc() in rt5663_parse_dp() uaccess: fix nios2 and microblaze get_user_8() ASoC: codecs: wcd934x: fix return value of wcd934x_rx_hph_mode_put media: cedrus: h264: Fix neighbour info buffer size media: cedrus: H265: Fix neighbour info buffer size media: usb: go7007: s2250-board: fix leak in probe() media: em28xx: initialize refcount before kref_get media: video/hdmi: handle short reads of hdmi info frame. ARM: dts: imx: Add missing LVDS decoder on M53Menlo ARM: dts: sun8i: v3s: Move the csi1 block to follow address order soc: ti: wkup_m3_ipc: Fix IRQ check in wkup_m3_ipc_probe firmware: ti_sci: Fix compilation failure when CONFIG_TI_SCI_PROTOCOL is not defined arm64: dts: qcom: sm8150: Correct TCS configuration for apps rsc arm64: dts: qcom: sdm845: fix microphone bias properties and values soc: qcom: aoss: remove spurious IRQF_ONESHOT flags soc: qcom: ocmem: Fix missing put_device() call in of_get_ocmem soc: qcom: rpmpd: Check for null return of devm_kcalloc ARM: dts: qcom: ipq4019: fix sleep clock firmware: qcom: scm: Remove reassignment to desc following initializer video: fbdev: fbcvt.c: fix printing in fb_cvt_print_name() video: fbdev: atmel_lcdfb: fix an error code in atmel_lcdfb_probe() video: fbdev: smscufx: Fix null-ptr-deref in ufx_usb_probe() video: fbdev: controlfb: Fix COMPILE_TEST build video: fbdev: controlfb: Fix set but not used warnings video: fbdev: matroxfb: set maxvram of vbG200eW to the same as vbG200 to avoid black screen media: aspeed: Correct value for h-total-pixels media: hantro: Fix overfill bottom register field name media: meson: vdec: potential dereference of null pointer media: coda: Fix missing put_device() call in coda_get_vdoa_data ASoC: generic: simple-card-utils: remove useless assignment ASoC: xilinx: xlnx_formatter_pcm: Handle sysclk setting media: bttv: fix WARNING regression on tunerless devices media: mtk-vcodec: potential dereference of null pointer media: v4l2-mem2mem: Apply DST_QUEUE_OFF_BASE on MMAP buffers across ioctls media: staging: media: zoran: fix usage of vb2_dma_contig_set_max_seg_size kunit: make kunit_test_timeout compatible with comment selftests, x86: fix how check_cc.sh is being invoked f2fs: fix compressed file start atomic write may cause data corruption f2fs: compress: remove unneeded read when rewrite whole cluster btrfs: fix unexpected error path when reflinking an inline extent f2fs: fix to avoid potential deadlock nfsd: more robust allocation failure handling in nfsd_file_cache_init f2fs: fix missing free nid in f2fs_handle_failed_inode perf/x86/intel/pt: Fix address filter config for 32-bit kernel perf/core: Fix address filter parser for multiple filters rseq: Remove broken uapi field layout on 32-bit little endian rseq: Optimise rseq_get_rseq_cs() and clear_rseq_cs() sched/core: Export pelt_thermal_tp sched/debug: Remove mpol_get/put and task_lock/unlock from sched_show_numa f2fs: fix to enable ATGC correctly via gc_idle sysfs interface watch_queue: Actually free the watch watch_queue: Fix NULL dereference in error cleanup io_uring: terminate manual loop iterator loop correctly for non-vecs clocksource: acpi_pm: fix return value of __setup handler hwmon: (pmbus) Add Vin unit off handling hwrng: nomadik - Change clk_disable to clk_disable_unprepare amba: Make the remove callback return void vfio: platform: simplify device removal crypto: ccree - Fix use after free in cc_cipher_exit() crypto: ccp - ccp_dmaengine_unregister release dma channels ACPI: APEI: fix return value of __setup handlers clocksource/drivers/timer-of: Check return value of of_iomap in timer_of_base_init() clocksource/drivers/timer-microchip-pit64b: Use notrace clocksource/drivers/exynos_mct: Handle DTS with higher number of interrupts clocksource/drivers/exynos_mct: Refactor resources allocation clocksource/drivers/timer-ti-dm: Fix regression from errata i940 fix crypto: vmx - add missing dependencies crypto: amlogic - call finalize with bh disabled crypto: sun8i-ce - call finalize with bh disabled crypto: sun8i-ss - call finalize with bh disabled hwrng: atmel - disable trng on failure path spi: spi-zynqmp-gqspi: Handle error for dma_set_mask PM: suspend: fix return value of __setup handler PM: hibernate: fix __setup handler error handling block: don't delete queue kobject before its children nvme: cleanup __nvme_check_ids hwmon: (sch56xx-common) Replace WDOG_ACTIVE with WDOG_HW_RUNNING hwmon: (pmbus) Add mutex to regulator ops spi: pxa2xx-pci: Balance reference count for PCI DMA device crypto: ccree - don't attempt 0 len DMA mappings EVM: fix the evm= __setup handler return value audit: log AUDIT_TIME_* records only from rules crypto: rockchip - ECB does not need IV selftests/x86: Add validity check and allow field splitting arm64/mm: avoid fixmap race condition when create pud mapping spi: tegra114: Add missing IRQ check in tegra_spi_probe thermal: int340x: Check for NULL after calling kmemdup() crypto: mxs-dcp - Fix scatterlist processing crypto: authenc - Fix sleep in atomic context in decrypt_tail crypto: sun8i-ss - really disable hash on A80 hwrng: cavium - HW_RANDOM_CAVIUM should depend on ARCH_THUNDER hwrng: cavium - Check health status while reading random data selinux: check return value of sel_make_avc_files regulator: qcom_smd: fix for_each_child.cocci warnings PCI: xgene: Revert "PCI: xgene: Fix IB window setup" PCI: pciehp: Clear cmd_busy bit in polling mode drm/i915/gem: add missing boundary check in vm_access drm/i915/opregion: check port number bounds for SWSCI display power state brcmfmac: pcie: Fix crashes due to early IRQs brcmfmac: pcie: Replace brcmf_pcie_copy_mem_todev with memcpy_toio brcmfmac: pcie: Release firmwares in the brcmf_pcie_setup error path brcmfmac: firmware: Allocate space for default boardrev in nvram xtensa: fix xtensa_wsr always writing 0 xtensa: fix stop_machine_cpuslocked call in patch_text media: davinci: vpif: fix unbalanced runtime PM enable media: davinci: vpif: fix unbalanced runtime PM get media: gpio-ir-tx: fix transmit with long spaces on Orange Pi PC DEC: Limit PMAX memory probing to R3k systems bcache: fixup multiple threads crash crypto: rsa-pkcs1pad - fix buffer overread in pkcs1pad_verify_complete() crypto: rsa-pkcs1pad - restore signature length check crypto: rsa-pkcs1pad - correctly get hash from source scatterlist crypto: rsa-pkcs1pad - only allow with rsa exec: Force single empty string when argv is empty lib/raid6/test: fix multiple definition linking error thermal: int340x: Increase bitmap size pstore: Don't use semaphores in always-atomic-context code carl9170: fix missing bit-wise or operator for tx_params mgag200 fix memmapsl configuration in GCTL6 register ARM: dts: exynos: add missing HDMI supplies on SMDK5420 ARM: dts: exynos: add missing HDMI supplies on SMDK5250 ARM: dts: exynos: fix UART3 pins configuration in Exynos5250 ARM: dts: at91: sama5d2: Fix PMERRLOC resource size video: fbdev: atari: Atari 2 bpp (STe) palette bugfix video: fbdev: sm712fb: Fix crash in smtcfb_read() drm/edid: check basic audio support on CEA extension block block: don't merge across cgroup boundaries if blkcg is enabled block: limit request dispatch loop duration mailbox: tegra-hsp: Flush whole channel drivers: hamradio: 6pack: fix UAF bug caused by mod_timer() ext4: fix fs corruption when tring to remove a non-empty directory with IO error ext4: fix ext4_fc_stats trace point coredump: Also dump first pages of non-executable ELF libraries ACPI: properties: Consistently return -ENOENT if there are no more references arm64: dts: ti: k3-j7200: Fix gic-v3 compatible regs arm64: dts: ti: k3-j721e: Fix gic-v3 compatible regs arm64: dts: ti: k3-am65: Fix gic-v3 compatible regs arm64: signal: nofpsimd: Do not allocate fp/simd context when not available udp: call udp_encap_enable for v6 sockets when enabling encap powerpc/kvm: Fix kvm_use_magic_page can: isotp: sanitize CAN ID checks in isotp_bind() drbd: fix potential silent data corruption dm integrity: set journal entry unused when shrinking device mm/kmemleak: reset tag when compare object pointer mm,hwpoison: unmap poisoned page before invalidation Revert "mm: madvise: skip unmapped vma holes passed to process_madvise" mm: madvise: return correct bytes advised with process_madvise mm: madvise: skip unmapped vma holes passed to process_madvise ALSA: hda/realtek: Fix audio regression on Mi Notebook Pro 2020 ALSA: pcm: Fix potential AB/BA lock with buffer_mutex and mmap_lock ALSA: hda: Avoid unsol event during RPM suspending ALSA: cs4236: fix an incorrect NULL check on list iterator cifs: fix NULL ptr dereference in smb2_ioctl_query_info() cifs: prevent bad output lengths in smb2_ioctl_query_info() Revert "Input: clear BTN_RIGHT/MIDDLE on buttonpads" riscv: Increase stack size under KASAN riscv: Fix fill_callchain return value qed: validate and restrict untrusted VFs vlan promisc mode qed: display VF trust config scsi: libsas: Fix sas_ata_qc_issue() handling of NCQ NON DATA commands mempolicy: mbind_range() set_policy() after vma_merge() mm: invalidate hwpoison page cache page in fault path mm/pages_alloc.c: don't create ZONE_MOVABLE beyond the end of a node jffs2: fix memory leak in jffs2_scan_medium jffs2: fix memory leak in jffs2_do_mount_fs jffs2: fix use-after-free in jffs2_clear_xattr_subsystem can: ems_usb: ems_usb_start_xmit(): fix double dev_kfree_skb() in error path mtd: rawnand: protect access to rawnand devices while in suspend spi: mxic: Fix the transmit path pinctrl: samsung: drop pin banks references on error paths remoteproc: Fix count check in rproc_coredump_write() f2fs: fix to do sanity check on .cp_pack_total_block_count f2fs: quota: fix loop condition at f2fs_quota_sync() f2fs: fix to unlock page correctly in error path of is_alive() NFSD: prevent integer overflow on 32 bit systems NFSD: prevent underflow in nfssvc_decode_writeargs() SUNRPC: avoid race between mod_timer() and del_timer_sync() HID: intel-ish-hid: Use dma_alloc_coherent for firmware update firmware: stratix10-svc: add missing callback parameter on RSU Documentation: update stable tree link Documentation: add link to stable release candidate tree KEYS: fix length validation in keyctl_pkey_params_get_2() ptrace: Check PTRACE_O_SUSPEND_SECCOMP permission on PTRACE_SEIZE clk: uniphier: Fix fixed-rate initialization greybus: svc: fix an error handling bug in gb_svc_hello() iio: inkern: make a best effort on offset calculation iio: inkern: apply consumer scale when no channel scale is available iio: inkern: apply consumer scale on IIO_VAL_INT cases iio: afe: rescale: use s64 for temporary scale calculations coresight: Fix TRCCONFIGR.QE sysfs interface mei: avoid iterator usage outside of list_for_each_entry mei: me: add Alder Lake N device id. xhci: fix uninitialized string returned by xhci_decode_ctrl_ctx() xhci: make xhci_handshake timeout for xhci_reset() adjustable xhci: fix runtime PM imbalance in USB2 resume xhci: fix garbage USBSTS being logged in some cases USB: usb-storage: Fix use of bitfields for hardware data in ene_ub6250.c virtio-blk: Use blk_validate_block_size() to validate block size tpm: fix reference counting for struct tpm_chip iommu/iova: Improve 32-bit free space estimate locking/lockdep: Avoid potential access of invalid memory in lock_class net: dsa: microchip: add spi_device_id tables af_key: add __GFP_ZERO flag for compose_sadb_supported in function pfkey_register Input: zinitix - do not report shadow fingers spi: Fix erroneous sgs value with min_t() Revert "gpio: Revert regression in sysfs-gpio (gpiolib.c)" net:mcf8390: Use platform_get_irq() to get the interrupt spi: Fix invalid sgs value gpio: Revert regression in sysfs-gpio (gpiolib.c) ethernet: sun: Free the coherent when failing in probing tools/virtio: fix virtio_test execution vdpa/mlx5: should verify CTRL_VQ feature exists for MQ virtio_console: break out of buf poll on remove ARM: mstar: Select HAVE_ARM_ARCH_TIMER xfrm: fix tunnel model fragmentation behavior HID: logitech-dj: add new lightspeed receiver id netdevice: add the case if dev is NULL hv: utils: add PTP_1588_CLOCK to Kconfig to fix build USB: serial: simple: add Nokia phone driver USB: serial: pl2303: add IBM device IDs swiotlb: fix info leak with DMA_FROM_DEVICE ANDROID: fix up abi issue with struct snd_pcm_runtime Linux 5.10.109 llc: only change llc->dev when bind() succeeds nds32: fix access_ok() checks in get/put_user wcn36xx: Differentiate wcn3660 from wcn3620 tpm: use try_get_ops() in tpm-space.c mac80211: fix potential double free on mesh join rcu: Don't deboost before reporting expedited quiescent state Revert "ath: add support for special 0x0 regulatory domain" crypto: qat - disable registration of algorithms ACPI: video: Force backlight native for Clevo NL5xRU and NL5xNU ACPI: battery: Add device HID and quirk for Microsoft Surface Go 3 ACPI / x86: Work around broken XSDT on Advantech DAC-BJ01 board netfilter: nf_tables: initialize registers in nft_do_chain() drivers: net: xgene: Fix regression in CRC stripping ALSA: pci: fix reading of swapped values from pcmreg in AC97 codec ALSA: cmipci: Restore aux vol on suspend/resume ALSA: usb-audio: Add mute TLV for playback volumes on RODE NT-USB ALSA: pcm: Add stream lock during PCM reset ioctl operations ALSA: pcm: Fix races among concurrent prealloc proc writes ALSA: pcm: Fix races among concurrent prepare and hw_params/hw_free calls ALSA: pcm: Fix races among concurrent read/write and buffer changes ALSA: pcm: Fix races among concurrent hw_params and hw_free calls ALSA: hda/realtek: Add quirk for ASUS GA402 ALSA: hda/realtek - Fix headset mic problem for a HP machine with alc671 ALSA: hda/realtek: Add quirk for Clevo NP50PNJ ALSA: hda/realtek: Add quirk for Clevo NP70PNJ ALSA: usb-audio: add mapping for new Corsair Virtuoso SE ALSA: oss: Fix PCM OSS buffer allocation overflow ASoC: sti: Fix deadlock via snd_pcm_stop_xrun() call llc: fix netdevice reference leaks in llc_ui_bind() staging: fbtft: fb_st7789v: reset display before initialization tpm: Fix error handling in async work cgroup-v1: Correct privileges check in release_agent writes cgroup: Use open-time cgroup namespace for process migration perm checks cgroup: Allocate cgroup_file_ctx for kernfs_open_file->priv exfat: avoid incorrectly releasing for root inode net: ipv6: fix skb_over_panic in __ip6_append_data nfc: st21nfca: Fix potential buffer overflows in EVT_TRANSACTION Revert "vsock: each transport cycles only on its own sockets" Linux 5.10.108 Revert "selftests/bpf: Add test for bpf_timer overwriting crash" esp: Fix possible buffer overflow in ESP transformation smsc95xx: Ignore -ENODEV errors when device is unplugged net: usb: Correct reset handling of smsc95xx net: usb: Correct PHY handling of smsc95xx perf symbols: Fix symbol size calculation condition Input: aiptek - properly check endpoint type scsi: mpt3sas: Page fault in reply q processing usb: usbtmc: Fix bug in pipe direction for control transfers usb: gadget: Fix use-after-free bug by not setting udc->dev.driver usb: gadget: rndis: prevent integer overflow in rndis_set_response() arm64: fix clang warning about TRAMP_VALIAS net: mscc: ocelot: fix backwards compatibility with single-chain tc-flower offload net: bcmgenet: skip invalid partial checksums bnx2x: fix built-in kernel driver load failure net: phy: mscc: Add MODULE_FIRMWARE macros net: dsa: Add missing of_node_put() in dsa_port_parse_of net: handle ARPHRD_PIMREG in dev_is_mac_header_xmit() drm/panel: simple: Fix Innolux G070Y2-L01 BPP settings drm/imx: parallel-display: Remove bus flags check in imx_pd_bridge_atomic_check() hv_netvsc: Add check for kvmalloc_array atm: eni: Add check for dma_map_single net/packet: fix slab-out-of-bounds access in packet_recvmsg() net: phy: marvell: Fix invalid comparison in the resume and suspend functions esp6: fix check on ipv6_skip_exthdr's return value vsock: each transport cycles only on its own sockets efi: fix return value of __setup handlers mm: swap: get rid of livelock in swapin readahead ocfs2: fix crash when initialize filecheck kobj fails crypto: qcom-rng - ensure buffer for generate is completely filled Linux 5.10.107 arm64: kvm: Fix copy-and-paste error in bhb templates for v5.10 stable io_uring: return back safer resurrect kselftest/vm: fix tests build with old libc sfc: extend the locking on mcdi->seqno tcp: make tcp_read_sock() more robust nl80211: Update bss channel on channel switch for P2P_CLIENT drm/vrr: Set VRR capable prop only if it is attached to connector iwlwifi: don't advertise TWT support atm: firestream: check the return value of ioremap() in fs_init() can: rcar_canfd: rcar_canfd_channel_probe(): register the CAN device when fully ready ARM: 9178/1: fix unmet dependency on BITREVERSE for HAVE_ARCH_BITREVERSE MIPS: smp: fill in sibling and core maps earlier mac80211: refuse aggregations sessions before authorized ARM: dts: rockchip: fix a typo on rk3288 crypto-controller ARM: dts: rockchip: reorder rk322x hmdi clocks arm64: dts: agilex: use the compatible "intel,socfpga-agilex-hsotg" arm64: dts: rockchip: reorder rk3399 hdmi clocks arm64: dts: rockchip: fix rk3399-puma eMMC HS400 signal integrity xfrm: Fix xfrm migrate issues when address family changes xfrm: Check if_id in xfrm_migrate sctp: fix the processing for INIT chunk Revert "xfrm: state and policy should fail if XFRMA_IF_ID 0" UPSTREAM: arm64: proton-pack: Include unprivileged eBPF status in Spectre v2 mitigation reporting UPSTREAM: arm64: Use the clearbhb instruction in mitigations UPSTREAM: KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated UPSTREAM: arm64: Mitigate spectre style branch history side channels UPSTREAM: arm64: Do not include __READ_ONCE() block in assembly files UPSTREAM: KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A UPSTREAM: arm64: proton-pack: Report Spectre-BHB vulnerabilities as part of Spectre-v2 UPSTREAM: arm64: Add percpu vectors for EL1 Linux 5.10.106 watch_queue: Fix filter limit check ARM: fix Thumb2 regression with Spectre BHB ext4: add check to prevent attempting to resize an fs with sparse_super2 x86/traps: Mark do_int3() NOKPROBE_SYMBOL x86/boot: Add setup_indirect support in early_memremap_is_setup_data() x86/boot: Fix memremap of setup_indirect structures watch_queue: Make comment about setting ->defunct more accurate watch_queue: Fix lack of barrier/sync/lock between post and read watch_queue: Free the alloc bitmap when the watch_queue is torn down watch_queue: Fix the alloc bitmap size to reflect notes allocated watch_queue: Fix to always request a pow-of-2 pipe ring size watch_queue: Fix to release page in ->release() watch_queue, pipe: Free watchqueue state after clearing pipe ring virtio: acknowledge all features before access virtio: unexport virtio_finalize_features arm64: dts: marvell: armada-37xx: Remap IO space to bus address 0x0 riscv: Fix auipc+jalr relocation range checks mmc: meson: Fix usage of meson_mmc_post_req() net: macb: Fix lost RX packet wakeup race in NAPI receive staging: gdm724x: fix use after free in gdm_lte_rx() staging: rtl8723bs: Fix access-point mode deadlock fuse: fix pipe buffer lifetime for direct_io ARM: Spectre-BHB: provide empty stub for non-config selftests/memfd: clean up mapping in mfd_fail_write selftest/vm: fix map_fixed_noreplace test failure tracing: Ensure trace buffer is at least 4096 bytes large ipv6: prevent a possible race condition with lifetimes Revert "xen-netback: Check for hotplug-status existence before watching" Revert "xen-netback: remove 'hotplug-status' once it has served its purpose" gpio: Return EPROBE_DEFER if gc->to_irq is NULL hwmon: (pmbus) Clear pmbus fault/warning bits after read net-sysfs: add check for netdevice being present to speed_show spi: rockchip: terminate dma transmission when slave abort spi: rockchip: Fix error in getting num-cs property selftests/bpf: Add test for bpf_timer overwriting crash net: bcmgenet: Don't claim WOL when its not available sctp: fix kernel-infoleak for SCTP sockets net: phy: DP83822: clear MISR2 register to disable interrupts gianfar: ethtool: Fix refcount leak in gfar_get_ts_info gpio: ts4900: Do not set DAT and OE together selftests: pmtu.sh: Kill tcpdump processes launched by subshell. NFC: port100: fix use-after-free in port100_send_complete net/mlx5e: Lag, Only handle events from highest priority multipath entry net/mlx5: Fix a race on command flush flow net/mlx5: Fix size field in bufferx_reg struct ax25: Fix NULL pointer dereference in ax25_kill_by_device net: ethernet: lpc_eth: Handle error for clk_enable net: ethernet: ti: cpts: Handle error for clk_enable tipc: fix incorrect order of state message data sanity check ethernet: Fix error handling in xemaclite_of_probe ice: Fix curr_link_speed advertised speed ice: Rename a couple of variables ice: Remove unnecessary checker loop ice: Align macro names to the specification ice: stop disabling VFs due to PF error responses i40e: stop disabling VFs due to PF error responses ARM: dts: aspeed: Fix AST2600 quad spi group net: dsa: mt7530: fix incorrect test in mt753x_phylink_validate() drm/sun4i: mixer: Fix P010 and P210 format numbers qed: return status of qed_iov_get_link esp: Fix BEET mode inter address family tunneling on GSO net: qlogic: check the return value of dma_alloc_coherent() in qed_vf_hw_prepare() isdn: hfcpci: check the return value of dma_set_mask() in setup_hw() virtio-blk: Don't use MAX_DISCARD_SEGMENTS if max_discard_seg is zero mISDN: Fix memory leak in dsp_pipeline_build() mISDN: Remove obsolete PIPELINE_DEBUG debugging information tipc: fix kernel panic when enabling bearer arm64: dts: armada-3720-turris-mox: Add missing ethernet0 alias HID: vivaldi: fix sysfs attributes leak clk: qcom: gdsc: Add support to update GDSC transition delay ARM: boot: dts: bcm2711: Fix HVS register range UPSTREAM: ARM: fix Thumb2 regression with Spectre BHB UPSTREAM: ARM: Spectre-BHB: provide empty stub for non-config UPSTREAM: ARM: fix build warning in proc-v7-bugs.c UPSTREAM: ARM: Do not use NOCROSSREFS directive with ld.lld UPSTREAM: ARM: fix co-processor register typo UPSTREAM: ARM: fix build error when BPF_SYSCALL is disabled ANDROID: fix up rndis ABI breakage Linux 5.10.105 Revert "ACPI: PM: s2idle: Cancel wakeup before dispatching EC GPE" xen/netfront: react properly to failing gnttab_end_foreign_access_ref() xen/gnttab: fix gnttab_end_foreign_access() without page specified xen/pvcalls: use alloc/free_pages_exact() xen/9p: use alloc/free_pages_exact() xen: remove gnttab_query_foreign_access() xen/gntalloc: don't use gnttab_query_foreign_access() xen/scsifront: don't use gnttab_query_foreign_access() for mapped status xen/netfront: don't use gnttab_query_foreign_access() for mapped status xen/blkfront: don't use gnttab_query_foreign_access() for mapped status xen/grant-table: add gnttab_try_end_foreign_access() xen/xenbus: don't let xenbus_grant_ring() remove grants in error case arm64: proton-pack: Include unprivileged eBPF status in Spectre v2 mitigation reporting ARM: fix build warning in proc-v7-bugs.c arm64: Use the clearbhb instruction in mitigations ARM: Do not use NOCROSSREFS directive with ld.lld KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated ARM: fix co-processor register typo arm64: Mitigate spectre style branch history side channels ARM: fix build error when BPF_SYSCALL is disabled KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A arm64: proton-pack: Report Spectre-BHB vulnerabilities as part of Spectre-v2 arm64: entry: Add macro for reading symbol addresses from the trampoline arm64: Add percpu vectors for EL1 arm64: entry: Add vectors that have the bhb mitigation sequences arm64: entry: Add non-kpti __bp_harden_el1_vectors for mitigations arm64: entry: Allow the trampoline text to occupy multiple pages arm64: entry: Make the kpti trampoline's kpti sequence optional arm64: entry: Move trampoline macros out of ifdef'd section arm64: entry: Don't assume tramp_vectors is the start of the vectors arm64: entry: Allow tramp_alias to access symbols after the 4K boundary arm64: entry: Move the trampoline data page before the text page arm64: entry: Free up another register on kpti's tramp_exit path arm64: Add HWCAP for self-synchronising virtual counter arm64: Add Cortex-A510 CPU part definition arm64: Add Neoverse-N2, Cortex-A710 CPU part definition arm64: entry: Make the trampoline cleanup optional arm64: Add Cortex-X2 CPU part definition arm64: spectre: Rename spectre_v4_patch_fw_mitigation_conduit arm64: entry.S: Add ventry overflow sanity checks arm64: cpufeature: add HWCAP for FEAT_RPRES arm64: cpufeature: add HWCAP for FEAT_AFP arm64: add ID_AA64ISAR2_EL1 sys register ARM: include unprivileged BPF status in Spectre V2 reporting x86/speculation: Warn about eIBRS + LFENCE + Unprivileged eBPF + SMT arm64: cputype: Add CPU implementor & types for the Apple M1 cores ARM: Spectre-BHB workaround x86/speculation: Warn about Spectre v2 LFENCE mitigation ARM: use LOADADDR() to get load address of sections x86/speculation: Update link to AMD speculation whitepaper ARM: early traps initialisation x86/speculation: Use generic retpoline by default on AMD ARM: report Spectre v2 status through sysfs x86/speculation: Include unprivileged eBPF status in Spectre v2 mitigation reporting Documentation/hw-vuln: Update spectre doc x86/speculation: Add eIBRS + Retpoline options x86/speculation: Rename RETPOLINE_AMD to RETPOLINE_LFENCE x86,bugs: Unconditionally allow spectre_v2=retpoline,amd Linux 5.10.104 hamradio: fix macro redefine warning Revert "xfrm: xfrm_state_mtu should return at least 1280 for ipv6" btrfs: add missing run of delayed items after unlink during log replay btrfs: qgroup: fix deadlock between rescan worker and remove qgroup btrfs: fix lost prealloc extents beyond eof after full fsync tracing: Fix return value of __setup handlers tracing/histogram: Fix sorting on old "cpu" value HID: add mapping for KEY_ALL_APPLICATIONS HID: add mapping for KEY_DICTATE Input: samsung-keypad - properly state IOMEM dependency Input: elan_i2c - fix regulator enable count imbalance after suspend/resume Input: elan_i2c - move regulator_[en|dis]able() out of elan_[en|dis]able_power() net: dcb: disable softirqs in dcbnl_flush_dev() drm/amdgpu: fix suspend/resume hang regression nl80211: Handle nla_memdup failures in handle_nan_filter iavf: Refactor iavf state machine tracking net: chelsio: cxgb3: check the return value of pci_find_capability() ibmvnic: complete init_done on transport events ARM: tegra: Move panels to AUX bus soc: fsl: qe: Check of ioremap return value soc: fsl: guts: Add a missing memory allocation failure check soc: fsl: guts: Revert commit3c0d64e867
ARM: dts: Use 32KiHz oscillator on devkit8000 ARM: dts: switch timer config to common devkit8000 devicetree s390/extable: fix exception table sorting memfd: fix F_SEAL_WRITE after shmem huge page allocated ibmvnic: free reset-work-item when flushing igc: igc_write_phy_reg_gpy: drop premature return pinctrl: sunxi: Use unique lockdep classes for IRQs selftests: mlxsw: tc_police_scale: Make test more robust ARM: 9182/1: mmu: fix returns from early_param() and __setup() functions ARM: Fix kgdb breakpoint for Thumb2 igc: igc_read_phy_reg_gpy: drop premature return arm64: dts: rockchip: Switch RK3399-Gru DP to SPDIF output can: gs_usb: change active_channels's type from atomic_t to u8 ASoC: cs4265: Fix the duplicated control name firmware: arm_scmi: Remove space in MODULE_ALIAS name efivars: Respect "block" flag in efivar_entry_set_safe() ixgbe: xsk: change !netif_carrier_ok() handling in ixgbe_xmit_zc() net: arcnet: com20020: Fix null-ptr-deref in com20020pci_probe() ibmvnic: register netdev after init of adapter net: sxgbe: fix return value of __setup handler iavf: Fix missing check for running netdev mac80211: treat some SAE auth steps as final net: stmmac: fix return value of __setup handler mac80211: fix forwarded mesh frames AC & queue selection ia64: ensure proper NUMA distance and possible map initialization sched/topology: Fix sched_domain_topology_level alloc in sched_init_numa() sched/topology: Make sched_init_numa() use a set for the deduplicating sort ice: fix concurrent reset and removal of VFs ice: Fix race conditions between virtchnl handling and VF ndo ops rcu/nocb: Fix missed nocb_timer requeue net/smc: fix unexpected SMC_CLC_DECL_ERR_REGRMB error cause by server net/smc: fix unexpected SMC_CLC_DECL_ERR_REGRMB error generated by client net/smc: fix connection leak net: dcb: flush lingering app table entries for unregistered devices net: ipv6: ensure we call ipv6_mc_down() at most once batman-adv: Don't expect inter-netns unique iflink indices batman-adv: Request iflink once in batadv_get_real_netdevice batman-adv: Request iflink once in batadv-on-batadv check netfilter: nf_queue: handle socket prefetch netfilter: nf_queue: fix possible use-after-free netfilter: nf_queue: don't assume sk is full socket net: fix up skbs delta_truesize in UDP GRO frag_list e1000e: Correct NVM checksum verification flow xfrm: enforce validity of offload input flags xfrm: fix the if_id check in changelink bpf, sockmap: Do not ignore orig_len parameter netfilter: fix use-after-free in __nf_register_net_hook() xfrm: fix MTU regression mm: Consider __GFP_NOWARN flag for oversized kvmalloc() calls ntb: intel: fix port config status offset for SPR thermal: core: Fix TZ_GET_TRIP NULL pointer dereference xen/netfront: destroy queues before real_num_tx_queues is zeroed drm/i915: s/JSP2/ICP2/ PCH iommu/amd: Recover from event log overflow ASoC: ops: Shift tested values in snd_soc_put_volsw() by +min riscv: Fix config KASAN && DEBUG_VIRTUAL riscv: Fix config KASAN && SPARSEMEM && !SPARSE_VMEMMAP riscv/efi_stub: Fix get_boot_hartid_from_fdt() return value ALSA: intel_hdmi: Fix reference to PCM buffer address tracing: Add ustring operation to filtering string pointers drm/amdgpu: check vm ready by amdgpu_vm->evicting flag ata: pata_hpt37x: fix PCI clock detection serial: stm32: prevent TDR register overwrite when sending x_char tracing: Add test for user space strings when filtering on string pointers exfat: fix i_blocks for files truncated over 4 GiB exfat: reuse exfat_inode_info variable instead of calling EXFAT_I() usb: gadget: clear related members when goto fail usb: gadget: don't release an existing dev->buf net: usb: cdc_mbim: avoid altsetting toggling for Telit FN990 i2c: qup: allow COMPILE_TEST i2c: cadence: allow COMPILE_TEST dmaengine: shdma: Fix runtime PM imbalance on error selftests/seccomp: Fix seccomp failure by adding missing headers cifs: fix double free race when mount fails in cifs_get_root() tipc: fix a bit overflow in tipc_crypto_key_rcv() KVM: arm64: vgic: Read HW interrupt pending state from the HW Input: clear BTN_RIGHT/MIDDLE on buttonpads regulator: core: fix false positive in regulator_late_cleanup() ASoC: rt5682: do not block workqueue if card is unbound ASoC: rt5668: do not block workqueue if card is unbound i2c: bcm2835: Avoid clock stretching timeouts mac80211_hwsim: initialize ieee80211_tx_info at hw_scan_work mac80211_hwsim: report NOACK frames in tx_status Linux 5.10.103 memblock: use kfree() to release kmalloced memblock regions gpio: tegra186: Fix chip_data type confusion tty: n_gsm: fix deadlock in gsmtty_open() tty: n_gsm: fix wrong tty control line for flow control tty: n_gsm: fix NULL pointer access due to DLCI release tty: n_gsm: fix proper link termination after failed open tty: n_gsm: fix encoding of control signal octet bit DV riscv: fix oops caused by irqsoff latency tracer thermal: int340x: fix memory leak in int3400_notify() RDMA/cma: Do not change route.addr.src_addr outside state checks driver core: Free DMA range map when device is released xhci: Prevent futile URB re-submissions due to incorrect return value. xhci: re-initialize the HC during resume if HCE was set usb: dwc3: gadget: Let the interrupt handler disable bottom halves. usb: dwc3: pci: Fix Bay Trail phy GPIO mappings usb: dwc2: drd: fix soft connect when gadget is unconfigured USB: serial: option: add Telit LE910R1 compositions USB: serial: option: add support for DW5829e tracefs: Set the group ownership in apply_options() not parse_options() USB: gadget: validate endpoint index for xilinx udc usb: gadget: rndis: add spinlock for rndis response list Revert "USB: serial: ch341: add new Product ID for CH341A" ata: pata_hpt37x: disable primary channel on HPT371 sc16is7xx: Fix for incorrect data being transmitted iio: Fix error handling for PM iio: imu: st_lsm6dsx: wait for settling time in st_lsm6dsx_read_oneshot iio: adc: ad7124: fix mask used for setting AIN_BUFP & AIN_BUFM bits iio: adc: men_z188_adc: Fix a resource leak in an error handling path tracing: Have traceon and traceoff trigger honor the instance RDMA/ib_srp: Fix a deadlock configfs: fix a race in configfs_{,un}register_subsystem() RDMA/rtrs-clt: Move free_permit from free_clt to rtrs_clt_close RDMA/rtrs-clt: Kill wait_for_inflight_permits RDMA/rtrs-clt: Fix possible double free in error case regmap-irq: Update interrupt clear register for proper reset spi: spi-zynq-qspi: Fix a NULL pointer dereference in zynq_qspi_exec_mem_op() net/mlx5e: kTLS, Use CHECKSUM_UNNECESSARY for device-offloaded packets net/mlx5: Fix wrong limitation of metadata match on ecpf net/mlx5: Fix possible deadlock on rule deletion udp_tunnel: Fix end of loop test in udp_tunnel_nic_unregister() surface: surface3_power: Fix battery readings on batteries without a serial number net/smc: Use a mutex for locking "struct smc_pnettable" netfilter: nf_tables: fix memory leak during stateful obj update nfp: flower: Fix a potential leak in nfp_tunnel_add_shared_mac() net: Force inlining of checksum functions in net/checksum.h net: ll_temac: check the return value of devm_kmalloc() net/sched: act_ct: Fix flow table lookup after ct clear or switching zones net/mlx5e: Fix wrong return value on ioctl EEPROM query failure drm/edid: Always set RGB444 openvswitch: Fix setting ipv6 fields causing hw csum failure gso: do not skip outer ip header in case of ipip and net_failover tipc: Fix end of loop tests for list_for_each_entry() net: __pskb_pull_tail() & pskb_carve_frag_list() drop_monitor friends io_uring: add a schedule point in io_add_buffers() bpf: Add schedule points in batch ops selftests: bpf: Check bpf_msg_push_data return value bpf: Do not try bpf_msg_push_data with len 0 hwmon: Handle failure to register sensor with thermal zone correctly bnxt_en: Fix active FEC reporting to ethtool bnx2x: fix driver load from initrd perf data: Fix double free in perf_session__delete() ping: remove pr_err from ping_lookup optee: use driver internal tee_context for some rpc tee: export teedev_open() and teedev_close_context() x86/fpu: Correct pkru/xstate inconsistency netfilter: nf_tables_offload: incorrect flow offload action array size CDC-NCM: avoid overflow in sanity checking USB: zaurus: support another broken Zaurus sr9700: sanity check for packet length drm/i915: Correctly populate use_sagv_wm for all pipes drm/amdgpu: disable MMHUB PG for Picasso KVM: x86/mmu: make apf token non-zero to fix bug parisc/unaligned: Fix ldw() and stw() unalignment handlers parisc/unaligned: Fix fldd and fstd unaligned handlers on 32-bit kernel vhost/vsock: don't check owner in vhost_vsock_stop() while releasing clk: jz4725b: fix mmc0 clock gating btrfs: tree-checker: check item_size for dev_item btrfs: tree-checker: check item_size for inode_item cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug Revert "ipv6: per-netns exclusive flowlabel checks" Linux 5.10.102 lockdep: Correct lock_classes index mapping i2c: brcmstb: fix support for DSL and CM variants copy_process(): Move fd_install() out of sighand->siglock critical section i2c: qcom-cci: don't put a device tree node before i2c_add_adapter() i2c: qcom-cci: don't delete an unregistered adapter dmaengine: sh: rcar-dmac: Check for error num after dma_set_max_seg_size dmaengine: stm32-dmamux: Fix PM disable depth imbalance in stm32_dmamux_probe dmaengine: sh: rcar-dmac: Check for error num after setting mask net: sched: limit TC_ACT_REPEAT loops EDAC: Fix calculation of returned address and next offset in edac_align_ptr() scsi: lpfc: Fix pt2pt NVMe PRLI reject LOGO loop kconfig: fix failing to generate auto.conf net: macb: Align the dma and coherent dma masks net: usb: qmi_wwan: Add support for Dell DW5829e tracing: Fix tp_printk option related with tp_printk_stop_on_boot drm/rockchip: dw_hdmi: Do not leave clock enabled in error case xprtrdma: fix pointer derefs in error cases of rpcrdma_ep_create soc: aspeed: lpc-ctrl: Block error printing on probe defer cases ata: libata-core: Disable TRIM on M88V29 lib/iov_iter: initialize "flags" in new pipe_buffer kconfig: let 'shell' return enough output for deep path names selftests: fixup build warnings in pidfd / clone3 tests pidfd: fix test failure due to stack overflow on some arches arm64: dts: meson-g12: drop BL32 region from SEI510/SEI610 arm64: dts: meson-g12: add ATF BL32 reserved-memory region arm64: dts: meson-gx: add ATF BL32 reserved-memory region netfilter: conntrack: don't refresh sctp entries in closed state irqchip/sifive-plic: Add missing thead,c900-plic match string phy: usb: Leave some clocks running during suspend ARM: OMAP2+: adjust the location of put_device() call in omapdss_init_of ARM: OMAP2+: hwmod: Add of_node_put() before break NFS: Don't set NFS_INO_INVALID_XATTR if there is no xattr cache KVM: x86/pmu: Use AMD64_RAW_EVENT_MASK for PERF_TYPE_RAW KVM: x86/pmu: Don't truncate the PerfEvtSeln MSR when creating a perf event KVM: x86/pmu: Refactoring find_arch_event() to pmc_perf_hw_id() Drivers: hv: vmbus: Fix memory leak in vmbus_add_channel_kobj mtd: rawnand: brcmnand: Fixed incorrect sub-page ECC status mtd: rawnand: qcom: Fix clock sequencing in qcom_nandc_probe() tty: n_tty: do not look ahead for EOL character past the end of the buffer NFS: Do not report writeback errors in nfs_getattr() NFS: LOOKUP_DIRECTORY is also ok with symlinks block/wbt: fix negative inflight counter when remove scsi device ASoC: tas2770: Insert post reset delay KVM: SVM: Never reject emulation due to SMAP errata for !SEV guests mtd: rawnand: gpmi: don't leak PM reference in error path powerpc/lib/sstep: fix 'ptesync' build error ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw_range() ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw() ALSA: hda: Fix missing codec probe on Shenker Dock 15 ALSA: hda: Fix regression on forced probe mask option ALSA: hda/realtek: Fix deadlock by COEF mutex ALSA: hda/realtek: Add quirk for Legion Y9000X 2019 selftests/exec: Add non-regular to TEST_GEN_PROGS perf bpf: Defer freeing string after possible strlen() on it dpaa2-eth: Initialize mutex used in one step timestamping path libsubcmd: Fix use-after-free for realloc(..., 0) bonding: fix data-races around agg_select_timer net_sched: add __rcu annotation to netdev->qdisc drop_monitor: fix data-race in dropmon_net_event / trace_napi_poll_hit bonding: force carrier update when releasing slave ping: fix the dif and sdif check in ping_lookup net: ieee802154: ca8210: Fix lifs/sifs periods net: dsa: lantiq_gswip: fix use after free in gswip_remove() net: dsa: lan9303: fix reset on probe ipv6: per-netns exclusive flowlabel checks netfilter: nft_synproxy: unregister hooks on init error path selftests: netfilter: fix exit value for nft_concat_range iwlwifi: pcie: gen2: fix locking when "HW not ready" iwlwifi: pcie: fix locking when "HW not ready" drm/i915/gvt: Make DRM_I915_GVT depend on X86 vsock: remove vsock from connected table when connect is interrupted by a signal drm/i915/opregion: check port number bounds for SWSCI display power state drm/radeon: Fix backlight control on iMac 12,1 iwlwifi: fix use-after-free kbuild: lto: Merge module sections if and only if CONFIG_LTO_CLANG is enabled kbuild: lto: merge module sections random: wake up /dev/random writers after zap gcc-plugins/stackleak: Use noinstr in favor of notrace Revert "module, async: async_synchronize_full() on module init iff async is used" x86/Xen: streamline (and fix) PV CPU enumeration drm/amdgpu: fix logic inversion in check nvme-rdma: fix possible use-after-free in transport error_recovery work nvme-tcp: fix possible use-after-free in transport error_recovery work nvme: fix a possible use-after-free in controller reset during load scsi: pm8001: Fix use-after-free for aborted SSP/STP sas_task scsi: pm8001: Fix use-after-free for aborted TMF sas_task quota: make dquot_quota_sync return errors from ->sync_fs vfs: make freeze_super abort when sync_filesystem returns error ax25: improve the incomplete fix to avoid UAF and NPD bugs selftests: skip mincore.check_file_mmap when fs lacks needed support selftests: openat2: Skip testcases that fail with EOPNOTSUPP selftests: openat2: Add missing dependency in Makefile selftests: openat2: Print also errno in failure messages selftests/zram: Adapt the situation that /dev/zram0 is being used selftests/zram01.sh: Fix compression ratio calculation selftests/zram: Skip max_comp_streams interface on newer kernel net: ieee802154: at86rf230: Stop leaking skb's kselftest: signal all child processes selftests: rtc: Increase test timeout so that all tests run platform/x86: ISST: Fix possible circular locking dependency detected platform/x86: touchscreen_dmi: Add info for the RWC NANOTE P8 AY07J 2-in-1 btrfs: send: in case of IO error log it parisc: Add ioread64_lo_hi() and iowrite64_lo_hi() PCI: hv: Fix NUMA node assignment when kernel boots with custom NUMA topology mm: don't try to NUMA-migrate COW pages that have other uses mmc: block: fix read single on recovery logic parisc: Fix sglist access in ccio-dma.c parisc: Fix data TLB miss in sba_unmap_sg parisc: Drop __init from map_pages declaration serial: parisc: GSC: fix build when IOSAPIC is not set Revert "svm: Add warning message for AVIC IPI invalid target" HID:Add support for UGTABLET WP5540 scsi: lpfc: Fix mailbox command failure during driver initialization can: isotp: add SF_BROADCAST support for functional addressing can: isotp: prevent race between isotp_bind() and isotp_setsockopt() fs/proc: task_mmu.c: don't read mapcount for migration entry fget: clarify and improve __fget_files() implementation rcu: Do not report strict GPs for outgoing CPUs mm: memcg: synchronize objcg lists with a dedicated spinlock drm/nouveau/pmu/gm200-: use alternate falcon reset sequence Conflicts: Documentation/devicetree/bindings Documentation/devicetree/bindings/mtd/nand-controller.yaml Documentation/devicetree/bindings/spi/spi-mxic.txt drivers/clk/qcom/clk-rcg2.c drivers/irqchip/qcom-pdc.c Change-Id: Ib0f6438a4f0ce0db27881a4d07a50a0835d6f270 Signed-off-by: Sivasri Kumar, Vanka <quic_svanka@quicinc.com>
This commit is contained in:
@@ -205,9 +205,6 @@ async_cookie_t async_schedule_node_domain(async_func_t func, void *data,
|
||||
atomic_inc(&entry_count);
|
||||
spin_unlock_irqrestore(&async_lock, flags);
|
||||
|
||||
/* mark that this task has queued an async job, used by module init */
|
||||
current->flags |= PF_USED_ASYNC;
|
||||
|
||||
/* schedule for execution */
|
||||
queue_work_node(node, system_unbound_wq, &entry->work);
|
||||
|
||||
|
@@ -191,6 +191,10 @@ struct audit_context {
|
||||
struct {
|
||||
char *name;
|
||||
} module;
|
||||
struct {
|
||||
struct audit_ntp_data ntp_data;
|
||||
struct timespec64 tk_injoffset;
|
||||
} time;
|
||||
};
|
||||
int fds[2];
|
||||
struct audit_proctitle proctitle;
|
||||
|
@@ -1214,6 +1214,53 @@ static void audit_log_fcaps(struct audit_buffer *ab, struct audit_names *name)
|
||||
from_kuid(&init_user_ns, name->fcap.rootid));
|
||||
}
|
||||
|
||||
static void audit_log_time(struct audit_context *context, struct audit_buffer **ab)
|
||||
{
|
||||
const struct audit_ntp_data *ntp = &context->time.ntp_data;
|
||||
const struct timespec64 *tk = &context->time.tk_injoffset;
|
||||
static const char * const ntp_name[] = {
|
||||
"offset",
|
||||
"freq",
|
||||
"status",
|
||||
"tai",
|
||||
"tick",
|
||||
"adjust",
|
||||
};
|
||||
int type;
|
||||
|
||||
if (context->type == AUDIT_TIME_ADJNTPVAL) {
|
||||
for (type = 0; type < AUDIT_NTP_NVALS; type++) {
|
||||
if (ntp->vals[type].newval != ntp->vals[type].oldval) {
|
||||
if (!*ab) {
|
||||
*ab = audit_log_start(context,
|
||||
GFP_KERNEL,
|
||||
AUDIT_TIME_ADJNTPVAL);
|
||||
if (!*ab)
|
||||
return;
|
||||
}
|
||||
audit_log_format(*ab, "op=%s old=%lli new=%lli",
|
||||
ntp_name[type],
|
||||
ntp->vals[type].oldval,
|
||||
ntp->vals[type].newval);
|
||||
audit_log_end(*ab);
|
||||
*ab = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tk->tv_sec != 0 || tk->tv_nsec != 0) {
|
||||
if (!*ab) {
|
||||
*ab = audit_log_start(context, GFP_KERNEL,
|
||||
AUDIT_TIME_INJOFFSET);
|
||||
if (!*ab)
|
||||
return;
|
||||
}
|
||||
audit_log_format(*ab, "sec=%lli nsec=%li",
|
||||
(long long)tk->tv_sec, tk->tv_nsec);
|
||||
audit_log_end(*ab);
|
||||
*ab = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void show_special(struct audit_context *context, int *call_panic)
|
||||
{
|
||||
struct audit_buffer *ab;
|
||||
@@ -1319,6 +1366,11 @@ static void show_special(struct audit_context *context, int *call_panic)
|
||||
audit_log_format(ab, "(null)");
|
||||
|
||||
break;
|
||||
case AUDIT_TIME_ADJNTPVAL:
|
||||
case AUDIT_TIME_INJOFFSET:
|
||||
/* this call deviates from the rest, eating the buffer */
|
||||
audit_log_time(context, &ab);
|
||||
break;
|
||||
}
|
||||
audit_log_end(ab);
|
||||
}
|
||||
@@ -2560,31 +2612,26 @@ void __audit_fanotify(unsigned int response)
|
||||
|
||||
void __audit_tk_injoffset(struct timespec64 offset)
|
||||
{
|
||||
audit_log(audit_context(), GFP_KERNEL, AUDIT_TIME_INJOFFSET,
|
||||
"sec=%lli nsec=%li",
|
||||
(long long)offset.tv_sec, offset.tv_nsec);
|
||||
}
|
||||
struct audit_context *context = audit_context();
|
||||
|
||||
static void audit_log_ntp_val(const struct audit_ntp_data *ad,
|
||||
const char *op, enum audit_ntp_type type)
|
||||
{
|
||||
const struct audit_ntp_val *val = &ad->vals[type];
|
||||
|
||||
if (val->newval == val->oldval)
|
||||
return;
|
||||
|
||||
audit_log(audit_context(), GFP_KERNEL, AUDIT_TIME_ADJNTPVAL,
|
||||
"op=%s old=%lli new=%lli", op, val->oldval, val->newval);
|
||||
/* only set type if not already set by NTP */
|
||||
if (!context->type)
|
||||
context->type = AUDIT_TIME_INJOFFSET;
|
||||
memcpy(&context->time.tk_injoffset, &offset, sizeof(offset));
|
||||
}
|
||||
|
||||
void __audit_ntp_log(const struct audit_ntp_data *ad)
|
||||
{
|
||||
audit_log_ntp_val(ad, "offset", AUDIT_NTP_OFFSET);
|
||||
audit_log_ntp_val(ad, "freq", AUDIT_NTP_FREQ);
|
||||
audit_log_ntp_val(ad, "status", AUDIT_NTP_STATUS);
|
||||
audit_log_ntp_val(ad, "tai", AUDIT_NTP_TAI);
|
||||
audit_log_ntp_val(ad, "tick", AUDIT_NTP_TICK);
|
||||
audit_log_ntp_val(ad, "adjust", AUDIT_NTP_ADJUST);
|
||||
struct audit_context *context = audit_context();
|
||||
int type;
|
||||
|
||||
for (type = 0; type < AUDIT_NTP_NVALS; type++)
|
||||
if (ad->vals[type].newval != ad->vals[type].oldval) {
|
||||
/* unconditionally set type, overwriting TK */
|
||||
context->type = AUDIT_TIME_ADJNTPVAL;
|
||||
memcpy(&context->time.ntp_data, ad, sizeof(*ad));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void __audit_log_nfcfg(const char *name, u8 af, unsigned int nentries,
|
||||
|
@@ -358,7 +358,7 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs,
|
||||
}
|
||||
|
||||
static struct perf_callchain_entry *
|
||||
get_callchain_entry_for_task(struct task_struct *task, u32 init_nr)
|
||||
get_callchain_entry_for_task(struct task_struct *task, u32 max_depth)
|
||||
{
|
||||
#ifdef CONFIG_STACKTRACE
|
||||
struct perf_callchain_entry *entry;
|
||||
@@ -369,9 +369,8 @@ get_callchain_entry_for_task(struct task_struct *task, u32 init_nr)
|
||||
if (!entry)
|
||||
return NULL;
|
||||
|
||||
entry->nr = init_nr +
|
||||
stack_trace_save_tsk(task, (unsigned long *)(entry->ip + init_nr),
|
||||
sysctl_perf_event_max_stack - init_nr, 0);
|
||||
entry->nr = stack_trace_save_tsk(task, (unsigned long *)entry->ip,
|
||||
max_depth, 0);
|
||||
|
||||
/* stack_trace_save_tsk() works on unsigned long array, while
|
||||
* perf_callchain_entry uses u64 array. For 32-bit systems, it is
|
||||
@@ -383,7 +382,7 @@ get_callchain_entry_for_task(struct task_struct *task, u32 init_nr)
|
||||
int i;
|
||||
|
||||
/* copy data from the end to avoid using extra buffer */
|
||||
for (i = entry->nr - 1; i >= (int)init_nr; i--)
|
||||
for (i = entry->nr - 1; i >= 0; i--)
|
||||
to[i] = (u64)(from[i]);
|
||||
}
|
||||
|
||||
@@ -400,27 +399,19 @@ static long __bpf_get_stackid(struct bpf_map *map,
|
||||
{
|
||||
struct bpf_stack_map *smap = container_of(map, struct bpf_stack_map, map);
|
||||
struct stack_map_bucket *bucket, *new_bucket, *old_bucket;
|
||||
u32 max_depth = map->value_size / stack_map_data_size(map);
|
||||
/* stack_map_alloc() checks that max_depth <= sysctl_perf_event_max_stack */
|
||||
u32 init_nr = sysctl_perf_event_max_stack - max_depth;
|
||||
u32 skip = flags & BPF_F_SKIP_FIELD_MASK;
|
||||
u32 hash, id, trace_nr, trace_len;
|
||||
bool user = flags & BPF_F_USER_STACK;
|
||||
u64 *ips;
|
||||
bool hash_matches;
|
||||
|
||||
/* get_perf_callchain() guarantees that trace->nr >= init_nr
|
||||
* and trace-nr <= sysctl_perf_event_max_stack, so trace_nr <= max_depth
|
||||
*/
|
||||
trace_nr = trace->nr - init_nr;
|
||||
|
||||
if (trace_nr <= skip)
|
||||
if (trace->nr <= skip)
|
||||
/* skipping more than usable stack trace */
|
||||
return -EFAULT;
|
||||
|
||||
trace_nr -= skip;
|
||||
trace_nr = trace->nr - skip;
|
||||
trace_len = trace_nr * sizeof(u64);
|
||||
ips = trace->ip + skip + init_nr;
|
||||
ips = trace->ip + skip;
|
||||
hash = jhash2((u32 *)ips, trace_len / sizeof(u32), 0);
|
||||
id = hash & (smap->n_buckets - 1);
|
||||
bucket = READ_ONCE(smap->buckets[id]);
|
||||
@@ -477,8 +468,7 @@ BPF_CALL_3(bpf_get_stackid, struct pt_regs *, regs, struct bpf_map *, map,
|
||||
u64, flags)
|
||||
{
|
||||
u32 max_depth = map->value_size / stack_map_data_size(map);
|
||||
/* stack_map_alloc() checks that max_depth <= sysctl_perf_event_max_stack */
|
||||
u32 init_nr = sysctl_perf_event_max_stack - max_depth;
|
||||
u32 skip = flags & BPF_F_SKIP_FIELD_MASK;
|
||||
bool user = flags & BPF_F_USER_STACK;
|
||||
struct perf_callchain_entry *trace;
|
||||
bool kernel = !user;
|
||||
@@ -487,8 +477,12 @@ BPF_CALL_3(bpf_get_stackid, struct pt_regs *, regs, struct bpf_map *, map,
|
||||
BPF_F_FAST_STACK_CMP | BPF_F_REUSE_STACKID)))
|
||||
return -EINVAL;
|
||||
|
||||
trace = get_perf_callchain(regs, init_nr, kernel, user,
|
||||
sysctl_perf_event_max_stack, false, false);
|
||||
max_depth += skip;
|
||||
if (max_depth > sysctl_perf_event_max_stack)
|
||||
max_depth = sysctl_perf_event_max_stack;
|
||||
|
||||
trace = get_perf_callchain(regs, 0, kernel, user, max_depth,
|
||||
false, false);
|
||||
|
||||
if (unlikely(!trace))
|
||||
/* couldn't fetch the stack trace */
|
||||
@@ -579,7 +573,7 @@ static long __bpf_get_stack(struct pt_regs *regs, struct task_struct *task,
|
||||
struct perf_callchain_entry *trace_in,
|
||||
void *buf, u32 size, u64 flags)
|
||||
{
|
||||
u32 init_nr, trace_nr, copy_len, elem_size, num_elem;
|
||||
u32 trace_nr, copy_len, elem_size, num_elem, max_depth;
|
||||
bool user_build_id = flags & BPF_F_USER_BUILD_ID;
|
||||
u32 skip = flags & BPF_F_SKIP_FIELD_MASK;
|
||||
bool user = flags & BPF_F_USER_STACK;
|
||||
@@ -604,30 +598,28 @@ static long __bpf_get_stack(struct pt_regs *regs, struct task_struct *task,
|
||||
goto err_fault;
|
||||
|
||||
num_elem = size / elem_size;
|
||||
if (sysctl_perf_event_max_stack < num_elem)
|
||||
init_nr = 0;
|
||||
else
|
||||
init_nr = sysctl_perf_event_max_stack - num_elem;
|
||||
max_depth = num_elem + skip;
|
||||
if (sysctl_perf_event_max_stack < max_depth)
|
||||
max_depth = sysctl_perf_event_max_stack;
|
||||
|
||||
if (trace_in)
|
||||
trace = trace_in;
|
||||
else if (kernel && task)
|
||||
trace = get_callchain_entry_for_task(task, init_nr);
|
||||
trace = get_callchain_entry_for_task(task, max_depth);
|
||||
else
|
||||
trace = get_perf_callchain(regs, init_nr, kernel, user,
|
||||
sysctl_perf_event_max_stack,
|
||||
trace = get_perf_callchain(regs, 0, kernel, user, max_depth,
|
||||
false, false);
|
||||
if (unlikely(!trace))
|
||||
goto err_fault;
|
||||
|
||||
trace_nr = trace->nr - init_nr;
|
||||
if (trace_nr < skip)
|
||||
if (trace->nr < skip)
|
||||
goto err_fault;
|
||||
|
||||
trace_nr -= skip;
|
||||
trace_nr = trace->nr - skip;
|
||||
trace_nr = (trace_nr <= num_elem) ? trace_nr : num_elem;
|
||||
copy_len = trace_nr * elem_size;
|
||||
ips = trace->ip + skip + init_nr;
|
||||
|
||||
ips = trace->ip + skip;
|
||||
if (user && user_build_id)
|
||||
stack_map_get_build_id_offset(buf, ips, trace_nr, user);
|
||||
else
|
||||
|
@@ -1310,6 +1310,7 @@ int generic_map_delete_batch(struct bpf_map *map,
|
||||
maybe_wait_bpf_programs(map);
|
||||
if (err)
|
||||
break;
|
||||
cond_resched();
|
||||
}
|
||||
if (copy_to_user(&uattr->batch.count, &cp, sizeof(cp)))
|
||||
err = -EFAULT;
|
||||
@@ -1367,6 +1368,7 @@ int generic_map_update_batch(struct bpf_map *map,
|
||||
|
||||
if (err)
|
||||
break;
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
if (copy_to_user(&uattr->batch.count, &cp, sizeof(cp)))
|
||||
@@ -1464,6 +1466,7 @@ int generic_map_lookup_batch(struct bpf_map *map,
|
||||
swap(prev_key, key);
|
||||
retry = MAP_LOOKUP_RETRIES;
|
||||
cp++;
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
if (err == -EFAULT)
|
||||
|
@@ -65,6 +65,25 @@ static inline struct cgroup_fs_context *cgroup_fc2context(struct fs_context *fc)
|
||||
return container_of(kfc, struct cgroup_fs_context, kfc);
|
||||
}
|
||||
|
||||
struct cgroup_pidlist;
|
||||
|
||||
struct cgroup_file_ctx {
|
||||
struct cgroup_namespace *ns;
|
||||
|
||||
struct {
|
||||
void *trigger;
|
||||
} psi;
|
||||
|
||||
struct {
|
||||
bool started;
|
||||
struct css_task_iter iter;
|
||||
} procs;
|
||||
|
||||
struct {
|
||||
struct cgroup_pidlist *pidlist;
|
||||
} procs1;
|
||||
};
|
||||
|
||||
/*
|
||||
* A cgroup can be associated with multiple css_sets as different tasks may
|
||||
* belong to different cgroups on different hierarchies. In the other
|
||||
|
@@ -394,6 +394,7 @@ static void *cgroup_pidlist_start(struct seq_file *s, loff_t *pos)
|
||||
* next pid to display, if any
|
||||
*/
|
||||
struct kernfs_open_file *of = s->private;
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct cgroup *cgrp = seq_css(s)->cgroup;
|
||||
struct cgroup_pidlist *l;
|
||||
enum cgroup_filetype type = seq_cft(s)->private;
|
||||
@@ -403,25 +404,24 @@ static void *cgroup_pidlist_start(struct seq_file *s, loff_t *pos)
|
||||
mutex_lock(&cgrp->pidlist_mutex);
|
||||
|
||||
/*
|
||||
* !NULL @of->priv indicates that this isn't the first start()
|
||||
* after open. If the matching pidlist is around, we can use that.
|
||||
* Look for it. Note that @of->priv can't be used directly. It
|
||||
* could already have been destroyed.
|
||||
* !NULL @ctx->procs1.pidlist indicates that this isn't the first
|
||||
* start() after open. If the matching pidlist is around, we can use
|
||||
* that. Look for it. Note that @ctx->procs1.pidlist can't be used
|
||||
* directly. It could already have been destroyed.
|
||||
*/
|
||||
if (of->priv)
|
||||
of->priv = cgroup_pidlist_find(cgrp, type);
|
||||
if (ctx->procs1.pidlist)
|
||||
ctx->procs1.pidlist = cgroup_pidlist_find(cgrp, type);
|
||||
|
||||
/*
|
||||
* Either this is the first start() after open or the matching
|
||||
* pidlist has been destroyed inbetween. Create a new one.
|
||||
*/
|
||||
if (!of->priv) {
|
||||
ret = pidlist_array_load(cgrp, type,
|
||||
(struct cgroup_pidlist **)&of->priv);
|
||||
if (!ctx->procs1.pidlist) {
|
||||
ret = pidlist_array_load(cgrp, type, &ctx->procs1.pidlist);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
l = of->priv;
|
||||
l = ctx->procs1.pidlist;
|
||||
|
||||
if (pid) {
|
||||
int end = l->length;
|
||||
@@ -449,7 +449,8 @@ static void *cgroup_pidlist_start(struct seq_file *s, loff_t *pos)
|
||||
static void cgroup_pidlist_stop(struct seq_file *s, void *v)
|
||||
{
|
||||
struct kernfs_open_file *of = s->private;
|
||||
struct cgroup_pidlist *l = of->priv;
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct cgroup_pidlist *l = ctx->procs1.pidlist;
|
||||
|
||||
if (l)
|
||||
mod_delayed_work(cgroup_pidlist_destroy_wq, &l->destroy_dwork,
|
||||
@@ -460,7 +461,8 @@ static void cgroup_pidlist_stop(struct seq_file *s, void *v)
|
||||
static void *cgroup_pidlist_next(struct seq_file *s, void *v, loff_t *pos)
|
||||
{
|
||||
struct kernfs_open_file *of = s->private;
|
||||
struct cgroup_pidlist *l = of->priv;
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct cgroup_pidlist *l = ctx->procs1.pidlist;
|
||||
pid_t *p = v;
|
||||
pid_t *end = l->list + l->length;
|
||||
/*
|
||||
@@ -545,6 +547,7 @@ static ssize_t cgroup_release_agent_write(struct kernfs_open_file *of,
|
||||
char *buf, size_t nbytes, loff_t off)
|
||||
{
|
||||
struct cgroup *cgrp;
|
||||
struct cgroup_file_ctx *ctx;
|
||||
|
||||
BUILD_BUG_ON(sizeof(cgrp->root->release_agent_path) < PATH_MAX);
|
||||
|
||||
@@ -552,8 +555,9 @@ static ssize_t cgroup_release_agent_write(struct kernfs_open_file *of,
|
||||
* Release agent gets called with all capabilities,
|
||||
* require capabilities to set release agent.
|
||||
*/
|
||||
if ((of->file->f_cred->user_ns != &init_user_ns) ||
|
||||
!capable(CAP_SYS_ADMIN))
|
||||
ctx = of->priv;
|
||||
if ((ctx->ns->user_ns != &init_user_ns) ||
|
||||
!file_ns_capable(of->file, &init_user_ns, CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
cgrp = cgroup_kn_lock_live(of->kn, false);
|
||||
|
@@ -3617,6 +3617,7 @@ static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v)
|
||||
static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
|
||||
size_t nbytes, enum psi_res res)
|
||||
{
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct psi_trigger *new;
|
||||
struct cgroup *cgrp;
|
||||
struct psi_group *psi;
|
||||
@@ -3629,7 +3630,7 @@ static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
|
||||
cgroup_kn_unlock(of->kn);
|
||||
|
||||
/* Allow only one trigger per file descriptor */
|
||||
if (of->priv) {
|
||||
if (ctx->psi.trigger) {
|
||||
cgroup_put(cgrp);
|
||||
return -EBUSY;
|
||||
}
|
||||
@@ -3641,7 +3642,7 @@ static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
|
||||
return PTR_ERR(new);
|
||||
}
|
||||
|
||||
smp_store_release(&of->priv, new);
|
||||
smp_store_release(&ctx->psi.trigger, new);
|
||||
cgroup_put(cgrp);
|
||||
|
||||
return nbytes;
|
||||
@@ -3671,12 +3672,15 @@ static ssize_t cgroup_cpu_pressure_write(struct kernfs_open_file *of,
|
||||
static __poll_t cgroup_pressure_poll(struct kernfs_open_file *of,
|
||||
poll_table *pt)
|
||||
{
|
||||
return psi_trigger_poll(&of->priv, of->file, pt);
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
return psi_trigger_poll(&ctx->psi.trigger, of->file, pt);
|
||||
}
|
||||
|
||||
static void cgroup_pressure_release(struct kernfs_open_file *of)
|
||||
{
|
||||
psi_trigger_destroy(of->priv);
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
|
||||
psi_trigger_destroy(ctx->psi.trigger);
|
||||
}
|
||||
|
||||
bool cgroup_psi_enabled(void)
|
||||
@@ -3729,24 +3733,43 @@ static ssize_t cgroup_freeze_write(struct kernfs_open_file *of,
|
||||
static int cgroup_file_open(struct kernfs_open_file *of)
|
||||
{
|
||||
struct cftype *cft = of->kn->priv;
|
||||
struct cgroup_file_ctx *ctx;
|
||||
int ret;
|
||||
|
||||
if (cft->open)
|
||||
return cft->open(of);
|
||||
return 0;
|
||||
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
ctx->ns = current->nsproxy->cgroup_ns;
|
||||
get_cgroup_ns(ctx->ns);
|
||||
of->priv = ctx;
|
||||
|
||||
if (!cft->open)
|
||||
return 0;
|
||||
|
||||
ret = cft->open(of);
|
||||
if (ret) {
|
||||
put_cgroup_ns(ctx->ns);
|
||||
kfree(ctx);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void cgroup_file_release(struct kernfs_open_file *of)
|
||||
{
|
||||
struct cftype *cft = of->kn->priv;
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
|
||||
if (cft->release)
|
||||
cft->release(of);
|
||||
put_cgroup_ns(ctx->ns);
|
||||
kfree(ctx);
|
||||
}
|
||||
|
||||
static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf,
|
||||
size_t nbytes, loff_t off)
|
||||
{
|
||||
struct cgroup_namespace *ns = current->nsproxy->cgroup_ns;
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct cgroup *cgrp = of->kn->parent->priv;
|
||||
struct cftype *cft = of->kn->priv;
|
||||
struct cgroup_subsys_state *css;
|
||||
@@ -3763,7 +3786,7 @@ static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf,
|
||||
*/
|
||||
if ((cgrp->root->flags & CGRP_ROOT_NS_DELEGATE) &&
|
||||
!(cft->flags & CFTYPE_NS_DELEGATABLE) &&
|
||||
ns != &init_cgroup_ns && ns->root_cset->dfl_cgrp == cgrp)
|
||||
ctx->ns != &init_cgroup_ns && ctx->ns->root_cset->dfl_cgrp == cgrp)
|
||||
return -EPERM;
|
||||
|
||||
if (cft->write)
|
||||
@@ -4671,21 +4694,21 @@ void css_task_iter_end(struct css_task_iter *it)
|
||||
|
||||
static void cgroup_procs_release(struct kernfs_open_file *of)
|
||||
{
|
||||
if (of->priv) {
|
||||
css_task_iter_end(of->priv);
|
||||
kfree(of->priv);
|
||||
}
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
|
||||
if (ctx->procs.started)
|
||||
css_task_iter_end(&ctx->procs.iter);
|
||||
}
|
||||
|
||||
static void *cgroup_procs_next(struct seq_file *s, void *v, loff_t *pos)
|
||||
{
|
||||
struct kernfs_open_file *of = s->private;
|
||||
struct css_task_iter *it = of->priv;
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
|
||||
if (pos)
|
||||
(*pos)++;
|
||||
|
||||
return css_task_iter_next(it);
|
||||
return css_task_iter_next(&ctx->procs.iter);
|
||||
}
|
||||
|
||||
static void *__cgroup_procs_start(struct seq_file *s, loff_t *pos,
|
||||
@@ -4693,21 +4716,18 @@ static void *__cgroup_procs_start(struct seq_file *s, loff_t *pos,
|
||||
{
|
||||
struct kernfs_open_file *of = s->private;
|
||||
struct cgroup *cgrp = seq_css(s)->cgroup;
|
||||
struct css_task_iter *it = of->priv;
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct css_task_iter *it = &ctx->procs.iter;
|
||||
|
||||
/*
|
||||
* When a seq_file is seeked, it's always traversed sequentially
|
||||
* from position 0, so we can simply keep iterating on !0 *pos.
|
||||
*/
|
||||
if (!it) {
|
||||
if (!ctx->procs.started) {
|
||||
if (WARN_ON_ONCE((*pos)))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
it = kzalloc(sizeof(*it), GFP_KERNEL);
|
||||
if (!it)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
of->priv = it;
|
||||
css_task_iter_start(&cgrp->self, iter_flags, it);
|
||||
ctx->procs.started = true;
|
||||
} else if (!(*pos)) {
|
||||
css_task_iter_end(it);
|
||||
css_task_iter_start(&cgrp->self, iter_flags, it);
|
||||
@@ -4758,9 +4778,9 @@ static int cgroup_may_write(const struct cgroup *cgrp, struct super_block *sb)
|
||||
|
||||
static int cgroup_procs_write_permission(struct cgroup *src_cgrp,
|
||||
struct cgroup *dst_cgrp,
|
||||
struct super_block *sb)
|
||||
struct super_block *sb,
|
||||
struct cgroup_namespace *ns)
|
||||
{
|
||||
struct cgroup_namespace *ns = current->nsproxy->cgroup_ns;
|
||||
struct cgroup *com_cgrp = src_cgrp;
|
||||
int ret;
|
||||
|
||||
@@ -4789,11 +4809,12 @@ static int cgroup_procs_write_permission(struct cgroup *src_cgrp,
|
||||
|
||||
static int cgroup_attach_permissions(struct cgroup *src_cgrp,
|
||||
struct cgroup *dst_cgrp,
|
||||
struct super_block *sb, bool threadgroup)
|
||||
struct super_block *sb, bool threadgroup,
|
||||
struct cgroup_namespace *ns)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = cgroup_procs_write_permission(src_cgrp, dst_cgrp, sb);
|
||||
ret = cgroup_procs_write_permission(src_cgrp, dst_cgrp, sb, ns);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -4810,6 +4831,7 @@ static int cgroup_attach_permissions(struct cgroup *src_cgrp,
|
||||
static ssize_t cgroup_procs_write(struct kernfs_open_file *of,
|
||||
char *buf, size_t nbytes, loff_t off)
|
||||
{
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct cgroup *src_cgrp, *dst_cgrp;
|
||||
struct task_struct *task;
|
||||
ssize_t ret;
|
||||
@@ -4830,7 +4852,8 @@ static ssize_t cgroup_procs_write(struct kernfs_open_file *of,
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
|
||||
ret = cgroup_attach_permissions(src_cgrp, dst_cgrp,
|
||||
of->file->f_path.dentry->d_sb, true);
|
||||
of->file->f_path.dentry->d_sb, true,
|
||||
ctx->ns);
|
||||
if (ret)
|
||||
goto out_finish;
|
||||
|
||||
@@ -4852,6 +4875,7 @@ static void *cgroup_threads_start(struct seq_file *s, loff_t *pos)
|
||||
static ssize_t cgroup_threads_write(struct kernfs_open_file *of,
|
||||
char *buf, size_t nbytes, loff_t off)
|
||||
{
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct cgroup *src_cgrp, *dst_cgrp;
|
||||
struct task_struct *task;
|
||||
ssize_t ret;
|
||||
@@ -4875,7 +4899,8 @@ static ssize_t cgroup_threads_write(struct kernfs_open_file *of,
|
||||
|
||||
/* thread migrations follow the cgroup.procs delegation rule */
|
||||
ret = cgroup_attach_permissions(src_cgrp, dst_cgrp,
|
||||
of->file->f_path.dentry->d_sb, false);
|
||||
of->file->f_path.dentry->d_sb, false,
|
||||
ctx->ns);
|
||||
if (ret)
|
||||
goto out_finish;
|
||||
|
||||
@@ -6058,7 +6083,8 @@ static int cgroup_css_set_fork(struct kernel_clone_args *kargs)
|
||||
goto err;
|
||||
|
||||
ret = cgroup_attach_permissions(cset->dfl_cgrp, dst_cgrp, sb,
|
||||
!(kargs->flags & CLONE_THREAD));
|
||||
!(kargs->flags & CLONE_THREAD),
|
||||
current->nsproxy->cgroup_ns);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@@ -2238,6 +2238,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)
|
||||
cgroup_taskset_first(tset, &css);
|
||||
cs = css_cs(css);
|
||||
|
||||
cpus_read_lock();
|
||||
mutex_lock(&cpuset_mutex);
|
||||
|
||||
guarantee_online_mems(cs, &cpuset_attach_nodemask_to);
|
||||
@@ -2291,6 +2292,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)
|
||||
wake_up(&cpuset_attach_wq);
|
||||
|
||||
mutex_unlock(&cpuset_mutex);
|
||||
cpus_read_unlock();
|
||||
}
|
||||
|
||||
/* The various types of files and directories in a cpuset file system */
|
||||
|
@@ -350,7 +350,7 @@ int kdb_getarea_size(void *res, unsigned long addr, size_t size)
|
||||
*/
|
||||
int kdb_putarea_size(unsigned long addr, void *res, size_t size)
|
||||
{
|
||||
int ret = copy_from_kernel_nofault((char *)addr, (char *)res, size);
|
||||
int ret = copy_to_kernel_nofault((char *)addr, (char *)res, size);
|
||||
if (ret) {
|
||||
if (!KDB_STATE(SUPPRESS)) {
|
||||
kdb_printf("kdb_putarea: Bad address 0x%lx\n", addr);
|
||||
|
@@ -84,7 +84,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void dma_release_coherent_memory(struct dma_coherent_mem *mem)
|
||||
static void _dma_release_coherent_memory(struct dma_coherent_mem *mem)
|
||||
{
|
||||
if (!mem)
|
||||
return;
|
||||
@@ -136,10 +136,16 @@ int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
|
||||
|
||||
ret = dma_assign_coherent_memory(dev, mem);
|
||||
if (ret)
|
||||
dma_release_coherent_memory(mem);
|
||||
_dma_release_coherent_memory(mem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void dma_release_coherent_memory(struct device *dev)
|
||||
{
|
||||
if (dev)
|
||||
_dma_release_coherent_memory(dev->dma_mem);
|
||||
}
|
||||
|
||||
static void *__dma_alloc_from_coherent(struct device *dev,
|
||||
struct dma_coherent_mem *mem,
|
||||
ssize_t size, dma_addr_t *dma_handle)
|
||||
|
@@ -928,7 +928,7 @@ static __init int dma_debug_cmdline(char *str)
|
||||
global_disable = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static __init int dma_debug_entries_cmdline(char *str)
|
||||
@@ -937,7 +937,7 @@ static __init int dma_debug_entries_cmdline(char *str)
|
||||
return -EINVAL;
|
||||
if (!get_option(&str, &nr_prealloc_entries))
|
||||
nr_prealloc_entries = PREALLOC_DMA_DEBUG_ENTRIES;
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("dma_debug=", dma_debug_cmdline);
|
||||
|
@@ -647,7 +647,8 @@ phys_addr_t swiotlb_tbl_map_single(struct device *dev, phys_addr_t orig_addr,
|
||||
|
||||
tlb_addr = slot_addr(io_tlb_start, index) + offset;
|
||||
if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC) &&
|
||||
(dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL))
|
||||
(!(attrs & DMA_ATTR_OVERWRITE) || dir == DMA_TO_DEVICE ||
|
||||
dir == DMA_BIDIRECTIONAL))
|
||||
swiotlb_bounce(orig_addr, tlb_addr, mapping_size, DMA_TO_DEVICE);
|
||||
return tlb_addr;
|
||||
}
|
||||
|
@@ -10220,8 +10220,11 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
|
||||
}
|
||||
|
||||
/* ready to consume more filters */
|
||||
kfree(filename);
|
||||
filename = NULL;
|
||||
state = IF_STATE_ACTION;
|
||||
filter = NULL;
|
||||
kernel = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2315,10 +2315,6 @@ static __latent_entropy struct task_struct *copy_process(
|
||||
goto bad_fork_cancel_cgroup;
|
||||
}
|
||||
|
||||
/* past the last point of failure */
|
||||
if (pidfile)
|
||||
fd_install(pidfd, pidfile);
|
||||
|
||||
init_task_pid_links(p);
|
||||
if (likely(p->pid)) {
|
||||
ptrace_init_task(p, (clone_flags & CLONE_PTRACE) || trace);
|
||||
@@ -2367,6 +2363,9 @@ static __latent_entropy struct task_struct *copy_process(
|
||||
syscall_tracepoint_update(p);
|
||||
write_unlock_irq(&tasklist_lock);
|
||||
|
||||
if (pidfile)
|
||||
fd_install(pidfd, pidfile);
|
||||
|
||||
proc_fork_connector(p);
|
||||
sched_post_fork(p);
|
||||
cgroup_post_fork(p, args);
|
||||
|
@@ -191,7 +191,7 @@ static int klp_find_object_symbol(const char *objname, const char *name,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int klp_resolve_symbols(Elf64_Shdr *sechdrs, const char *strtab,
|
||||
static int klp_resolve_symbols(Elf_Shdr *sechdrs, const char *strtab,
|
||||
unsigned int symndx, Elf_Shdr *relasec,
|
||||
const char *sec_objname)
|
||||
{
|
||||
@@ -219,7 +219,7 @@ static int klp_resolve_symbols(Elf64_Shdr *sechdrs, const char *strtab,
|
||||
relas = (Elf_Rela *) relasec->sh_addr;
|
||||
/* For each rela in this klp relocation section */
|
||||
for (i = 0; i < relasec->sh_size / sizeof(Elf_Rela); i++) {
|
||||
sym = (Elf64_Sym *)sechdrs[symndx].sh_addr + ELF_R_SYM(relas[i].r_info);
|
||||
sym = (Elf_Sym *)sechdrs[symndx].sh_addr + ELF_R_SYM(relas[i].r_info);
|
||||
if (sym->st_shndx != SHN_LIVEPATCH) {
|
||||
pr_err("symbol %s is not marked as a livepatch symbol\n",
|
||||
strtab + sym->st_name);
|
||||
|
@@ -182,11 +182,9 @@ static DECLARE_BITMAP(list_entries_in_use, MAX_LOCKDEP_ENTRIES);
|
||||
static struct hlist_head lock_keys_hash[KEYHASH_SIZE];
|
||||
unsigned long nr_lock_classes;
|
||||
unsigned long nr_zapped_classes;
|
||||
#ifndef CONFIG_DEBUG_LOCKDEP
|
||||
static
|
||||
#endif
|
||||
unsigned long max_lock_class_idx;
|
||||
struct lock_class lock_classes[MAX_LOCKDEP_KEYS];
|
||||
static DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS);
|
||||
DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS);
|
||||
|
||||
static inline struct lock_class *hlock_class(struct held_lock *hlock)
|
||||
{
|
||||
@@ -337,7 +335,7 @@ static inline void lock_release_holdtime(struct held_lock *hlock)
|
||||
* elements. These elements are linked together by the lock_entry member in
|
||||
* struct lock_class.
|
||||
*/
|
||||
LIST_HEAD(all_lock_classes);
|
||||
static LIST_HEAD(all_lock_classes);
|
||||
static LIST_HEAD(free_lock_classes);
|
||||
|
||||
/**
|
||||
@@ -1239,6 +1237,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
|
||||
struct lockdep_subclass_key *key;
|
||||
struct hlist_head *hash_head;
|
||||
struct lock_class *class;
|
||||
int idx;
|
||||
|
||||
DEBUG_LOCKS_WARN_ON(!irqs_disabled());
|
||||
|
||||
@@ -1304,6 +1303,9 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
|
||||
* of classes.
|
||||
*/
|
||||
list_move_tail(&class->lock_entry, &all_lock_classes);
|
||||
idx = class - lock_classes;
|
||||
if (idx > max_lock_class_idx)
|
||||
max_lock_class_idx = idx;
|
||||
|
||||
if (verbose(class)) {
|
||||
graph_unlock();
|
||||
@@ -3387,7 +3389,7 @@ struct lock_class *lock_chain_get_class(struct lock_chain *chain, int i)
|
||||
u16 chain_hlock = chain_hlocks[chain->base + i];
|
||||
unsigned int class_idx = chain_hlock_class_idx(chain_hlock);
|
||||
|
||||
return lock_classes + class_idx - 1;
|
||||
return lock_classes + class_idx;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3455,7 +3457,7 @@ static void print_chain_keys_chain(struct lock_chain *chain)
|
||||
hlock_id = chain_hlocks[chain->base + i];
|
||||
chain_key = print_chain_key_iteration(hlock_id, chain_key);
|
||||
|
||||
print_lock_name(lock_classes + chain_hlock_class_idx(hlock_id) - 1);
|
||||
print_lock_name(lock_classes + chain_hlock_class_idx(hlock_id));
|
||||
printk("\n");
|
||||
}
|
||||
}
|
||||
@@ -5919,6 +5921,8 @@ static void zap_class(struct pending_free *pf, struct lock_class *class)
|
||||
WRITE_ONCE(class->name, NULL);
|
||||
nr_lock_classes--;
|
||||
__clear_bit(class - lock_classes, lock_classes_in_use);
|
||||
if (class - lock_classes == max_lock_class_idx)
|
||||
max_lock_class_idx--;
|
||||
} else {
|
||||
WARN_ONCE(true, "%s() failed for class %s\n", __func__,
|
||||
class->name);
|
||||
|
@@ -121,7 +121,6 @@ static const unsigned long LOCKF_USED_IN_IRQ_READ =
|
||||
|
||||
#define MAX_LOCKDEP_CHAIN_HLOCKS (MAX_LOCKDEP_CHAINS*5)
|
||||
|
||||
extern struct list_head all_lock_classes;
|
||||
extern struct lock_chain lock_chains[];
|
||||
|
||||
#define LOCK_USAGE_CHARS (2*XXX_LOCK_USAGE_STATES + 1)
|
||||
@@ -151,6 +150,10 @@ extern unsigned int nr_large_chain_blocks;
|
||||
|
||||
extern unsigned int max_lockdep_depth;
|
||||
extern unsigned int max_bfs_queue_depth;
|
||||
extern unsigned long max_lock_class_idx;
|
||||
|
||||
extern struct lock_class lock_classes[MAX_LOCKDEP_KEYS];
|
||||
extern unsigned long lock_classes_in_use[];
|
||||
|
||||
#ifdef CONFIG_PROVE_LOCKING
|
||||
extern unsigned long lockdep_count_forward_deps(struct lock_class *);
|
||||
@@ -205,7 +208,6 @@ struct lockdep_stats {
|
||||
};
|
||||
|
||||
DECLARE_PER_CPU(struct lockdep_stats, lockdep_stats);
|
||||
extern struct lock_class lock_classes[MAX_LOCKDEP_KEYS];
|
||||
|
||||
#define __debug_atomic_inc(ptr) \
|
||||
this_cpu_inc(lockdep_stats.ptr);
|
||||
|
@@ -24,14 +24,33 @@
|
||||
|
||||
#include "lockdep_internals.h"
|
||||
|
||||
/*
|
||||
* Since iteration of lock_classes is done without holding the lockdep lock,
|
||||
* it is not safe to iterate all_lock_classes list directly as the iteration
|
||||
* may branch off to free_lock_classes or the zapped list. Iteration is done
|
||||
* directly on the lock_classes array by checking the lock_classes_in_use
|
||||
* bitmap and max_lock_class_idx.
|
||||
*/
|
||||
#define iterate_lock_classes(idx, class) \
|
||||
for (idx = 0, class = lock_classes; idx <= max_lock_class_idx; \
|
||||
idx++, class++)
|
||||
|
||||
static void *l_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
{
|
||||
return seq_list_next(v, &all_lock_classes, pos);
|
||||
struct lock_class *class = v;
|
||||
|
||||
++class;
|
||||
*pos = class - lock_classes;
|
||||
return (*pos > max_lock_class_idx) ? NULL : class;
|
||||
}
|
||||
|
||||
static void *l_start(struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
return seq_list_start_head(&all_lock_classes, *pos);
|
||||
unsigned long idx = *pos;
|
||||
|
||||
if (idx > max_lock_class_idx)
|
||||
return NULL;
|
||||
return lock_classes + idx;
|
||||
}
|
||||
|
||||
static void l_stop(struct seq_file *m, void *v)
|
||||
@@ -57,14 +76,16 @@ static void print_name(struct seq_file *m, struct lock_class *class)
|
||||
|
||||
static int l_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct lock_class *class = list_entry(v, struct lock_class, lock_entry);
|
||||
struct lock_class *class = v;
|
||||
struct lock_list *entry;
|
||||
char usage[LOCK_USAGE_CHARS];
|
||||
int idx = class - lock_classes;
|
||||
|
||||
if (v == &all_lock_classes) {
|
||||
if (v == lock_classes)
|
||||
seq_printf(m, "all lock classes:\n");
|
||||
|
||||
if (!test_bit(idx, lock_classes_in_use))
|
||||
return 0;
|
||||
}
|
||||
|
||||
seq_printf(m, "%p", class->key);
|
||||
#ifdef CONFIG_DEBUG_LOCKDEP
|
||||
@@ -218,8 +239,11 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
|
||||
|
||||
#ifdef CONFIG_PROVE_LOCKING
|
||||
struct lock_class *class;
|
||||
unsigned long idx;
|
||||
|
||||
list_for_each_entry(class, &all_lock_classes, lock_entry) {
|
||||
iterate_lock_classes(idx, class) {
|
||||
if (!test_bit(idx, lock_classes_in_use))
|
||||
continue;
|
||||
|
||||
if (class->usage_mask == 0)
|
||||
nr_unused++;
|
||||
@@ -252,6 +276,7 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
|
||||
|
||||
sum_forward_deps += lockdep_count_forward_deps(class);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_LOCKDEP
|
||||
DEBUG_LOCKS_WARN_ON(debug_atomic_read(nr_unused_locks) != nr_unused);
|
||||
#endif
|
||||
@@ -343,6 +368,8 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
|
||||
seq_printf(m, " max bfs queue depth: %11u\n",
|
||||
max_bfs_queue_depth);
|
||||
#endif
|
||||
seq_printf(m, " max lock class index: %11lu\n",
|
||||
max_lock_class_idx);
|
||||
lockdep_stats_debug_show(m);
|
||||
seq_printf(m, " debug_locks: %11u\n",
|
||||
debug_locks);
|
||||
@@ -620,12 +647,16 @@ static int lock_stat_open(struct inode *inode, struct file *file)
|
||||
if (!res) {
|
||||
struct lock_stat_data *iter = data->stats;
|
||||
struct seq_file *m = file->private_data;
|
||||
unsigned long idx;
|
||||
|
||||
list_for_each_entry(class, &all_lock_classes, lock_entry) {
|
||||
iterate_lock_classes(idx, class) {
|
||||
if (!test_bit(idx, lock_classes_in_use))
|
||||
continue;
|
||||
iter->class = class;
|
||||
iter->stats = lock_stats(class);
|
||||
iter++;
|
||||
}
|
||||
|
||||
data->iter_end = iter;
|
||||
|
||||
sort(data->stats, data->iter_end - data->stats,
|
||||
@@ -643,6 +674,7 @@ static ssize_t lock_stat_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct lock_class *class;
|
||||
unsigned long idx;
|
||||
char c;
|
||||
|
||||
if (count) {
|
||||
@@ -652,8 +684,11 @@ static ssize_t lock_stat_write(struct file *file, const char __user *buf,
|
||||
if (c != '0')
|
||||
return count;
|
||||
|
||||
list_for_each_entry(class, &all_lock_classes, lock_entry)
|
||||
iterate_lock_classes(idx, class) {
|
||||
if (!test_bit(idx, lock_classes_in_use))
|
||||
continue;
|
||||
clear_lock_stats(class);
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
@@ -1049,6 +1049,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
|
||||
goto err;
|
||||
}
|
||||
|
||||
trace_android_vh_mutex_start_check_new_owner(lock);
|
||||
spin_unlock(&lock->wait_lock);
|
||||
schedule_preempt_disabled();
|
||||
|
||||
|
@@ -3739,12 +3739,6 @@ static noinline int do_init_module(struct module *mod)
|
||||
}
|
||||
freeinit->module_init = mod->init_layout.base;
|
||||
|
||||
/*
|
||||
* We want to find out whether @mod uses async during init. Clear
|
||||
* PF_USED_ASYNC. async_schedule*() will set it.
|
||||
*/
|
||||
current->flags &= ~PF_USED_ASYNC;
|
||||
|
||||
do_mod_ctors(mod);
|
||||
/* Start the module */
|
||||
if (mod->init != NULL)
|
||||
@@ -3770,22 +3764,13 @@ static noinline int do_init_module(struct module *mod)
|
||||
|
||||
/*
|
||||
* We need to finish all async code before the module init sequence
|
||||
* is done. This has potential to deadlock. For example, a newly
|
||||
* detected block device can trigger request_module() of the
|
||||
* default iosched from async probing task. Once userland helper
|
||||
* reaches here, async_synchronize_full() will wait on the async
|
||||
* task waiting on request_module() and deadlock.
|
||||
* is done. This has potential to deadlock if synchronous module
|
||||
* loading is requested from async (which is not allowed!).
|
||||
*
|
||||
* This deadlock is avoided by perfomring async_synchronize_full()
|
||||
* iff module init queued any async jobs. This isn't a full
|
||||
* solution as it will deadlock the same if module loading from
|
||||
* async jobs nests more than once; however, due to the various
|
||||
* constraints, this hack seems to be the best option for now.
|
||||
* Please refer to the following thread for details.
|
||||
*
|
||||
* http://thread.gmane.org/gmane.linux.kernel/1420814
|
||||
* See commit 0fdff3ec6d87 ("async, kmod: warn on synchronous
|
||||
* request_module() from async workers") for more details.
|
||||
*/
|
||||
if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
|
||||
if (!mod->async_probe_requested)
|
||||
async_synchronize_full();
|
||||
|
||||
ftrace_free_mem(mod, mod->init_layout.base, mod->init_layout.base +
|
||||
|
@@ -1323,7 +1323,7 @@ static int __init resumedelay_setup(char *str)
|
||||
int rc = kstrtouint(str, 0, &resume_delay);
|
||||
|
||||
if (rc)
|
||||
return rc;
|
||||
pr_warn("resumedelay: bad option string '%s'\n", str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@@ -157,22 +157,22 @@ static int __init setup_test_suspend(char *value)
|
||||
value++;
|
||||
suspend_type = strsep(&value, ",");
|
||||
if (!suspend_type)
|
||||
return 0;
|
||||
return 1;
|
||||
|
||||
repeat = strsep(&value, ",");
|
||||
if (repeat) {
|
||||
if (kstrtou32(repeat, 0, &test_repeat_count_max))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++)
|
||||
if (!strcmp(pm_labels[i], suspend_type)) {
|
||||
test_state_label = pm_labels[i];
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
printk(warn_bad_state, suspend_type);
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("test_suspend", setup_test_suspend);
|
||||
|
||||
|
@@ -149,8 +149,10 @@ static int __control_devkmsg(char *str)
|
||||
|
||||
static int __init control_devkmsg(char *str)
|
||||
{
|
||||
if (__control_devkmsg(str) < 0)
|
||||
if (__control_devkmsg(str) < 0) {
|
||||
pr_warn("printk.devkmsg: bad option string '%s'\n", str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set sysctl string accordingly:
|
||||
@@ -169,7 +171,7 @@ static int __init control_devkmsg(char *str)
|
||||
*/
|
||||
devkmsg_log |= DEVKMSG_LOG_MASK_LOCK;
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("printk.devkmsg=", control_devkmsg);
|
||||
|
||||
|
@@ -370,6 +370,26 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode)
|
||||
return !err;
|
||||
}
|
||||
|
||||
static int check_ptrace_options(unsigned long data)
|
||||
{
|
||||
if (data & ~(unsigned long)PTRACE_O_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(data & PTRACE_O_SUSPEND_SECCOMP)) {
|
||||
if (!IS_ENABLED(CONFIG_CHECKPOINT_RESTORE) ||
|
||||
!IS_ENABLED(CONFIG_SECCOMP))
|
||||
return -EINVAL;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (seccomp_mode(¤t->seccomp) != SECCOMP_MODE_DISABLED ||
|
||||
current->ptrace & PT_SUSPEND_SECCOMP)
|
||||
return -EPERM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ptrace_attach(struct task_struct *task, long request,
|
||||
unsigned long addr,
|
||||
unsigned long flags)
|
||||
@@ -381,8 +401,16 @@ static int ptrace_attach(struct task_struct *task, long request,
|
||||
if (seize) {
|
||||
if (addr != 0)
|
||||
goto out;
|
||||
/*
|
||||
* This duplicates the check in check_ptrace_options() because
|
||||
* ptrace_attach() and ptrace_setoptions() have historically
|
||||
* used different error codes for unknown ptrace options.
|
||||
*/
|
||||
if (flags & ~(unsigned long)PTRACE_O_MASK)
|
||||
goto out;
|
||||
retval = check_ptrace_options(flags);
|
||||
if (retval)
|
||||
return retval;
|
||||
flags = PT_PTRACED | PT_SEIZED | (flags << PT_OPT_FLAG_SHIFT);
|
||||
} else {
|
||||
flags = PT_PTRACED;
|
||||
@@ -655,22 +683,11 @@ int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long ds
|
||||
static int ptrace_setoptions(struct task_struct *child, unsigned long data)
|
||||
{
|
||||
unsigned flags;
|
||||
int ret;
|
||||
|
||||
if (data & ~(unsigned long)PTRACE_O_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(data & PTRACE_O_SUSPEND_SECCOMP)) {
|
||||
if (!IS_ENABLED(CONFIG_CHECKPOINT_RESTORE) ||
|
||||
!IS_ENABLED(CONFIG_SECCOMP))
|
||||
return -EINVAL;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (seccomp_mode(¤t->seccomp) != SECCOMP_MODE_DISABLED ||
|
||||
current->ptrace & PT_SUSPEND_SECCOMP)
|
||||
return -EPERM;
|
||||
}
|
||||
ret = check_ptrace_options(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Avoid intermediate state when all opts are cleared */
|
||||
flags = child->ptrace;
|
||||
|
@@ -541,6 +541,7 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, unsigned long flags)
|
||||
/* Unboost if we were boosted. */
|
||||
if (IS_ENABLED(CONFIG_RCU_BOOST) && drop_boost_mutex)
|
||||
rt_mutex_futex_unlock(&rnp->boost_mtx);
|
||||
|
||||
} else {
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
@@ -628,7 +629,7 @@ static void rcu_read_unlock_special(struct task_struct *t)
|
||||
set_tsk_need_resched(current);
|
||||
set_preempt_need_resched();
|
||||
if (IS_ENABLED(CONFIG_IRQ_WORK) && irqs_were_disabled &&
|
||||
!rdp->defer_qs_iw_pending && exp) {
|
||||
!rdp->defer_qs_iw_pending && exp && cpu_online(rdp->cpu)) {
|
||||
// Get scheduler to re-evaluate and call hooks.
|
||||
// If !IRQ_WORK, FQS scan will eventually IPI.
|
||||
init_irq_work(&rdp->defer_qs_iw,
|
||||
@@ -1646,7 +1647,11 @@ static void wake_nocb_gp(struct rcu_data *rdp, bool force,
|
||||
rcu_nocb_unlock_irqrestore(rdp, flags);
|
||||
return;
|
||||
}
|
||||
del_timer(&rdp->nocb_timer);
|
||||
|
||||
if (READ_ONCE(rdp->nocb_defer_wakeup) > RCU_NOCB_WAKE_NOT) {
|
||||
WRITE_ONCE(rdp->nocb_defer_wakeup, RCU_NOCB_WAKE_NOT);
|
||||
del_timer(&rdp->nocb_timer);
|
||||
}
|
||||
rcu_nocb_unlock_irqrestore(rdp, flags);
|
||||
raw_spin_lock_irqsave(&rdp_gp->nocb_gp_lock, flags);
|
||||
if (force || READ_ONCE(rdp_gp->nocb_gp_sleep)) {
|
||||
@@ -2164,7 +2169,6 @@ static void do_nocb_deferred_wakeup_common(struct rcu_data *rdp)
|
||||
return;
|
||||
}
|
||||
ndw = READ_ONCE(rdp->nocb_defer_wakeup);
|
||||
WRITE_ONCE(rdp->nocb_defer_wakeup, RCU_NOCB_WAKE_NOT);
|
||||
wake_nocb_gp(rdp, ndw == RCU_NOCB_WAKE_FORCE, flags);
|
||||
trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("DeferredWake"));
|
||||
}
|
||||
|
@@ -120,8 +120,13 @@ static int rseq_get_rseq_cs(struct task_struct *t, struct rseq_cs *rseq_cs)
|
||||
u32 sig;
|
||||
int ret;
|
||||
|
||||
if (copy_from_user(&ptr, &t->rseq->rseq_cs.ptr64, sizeof(ptr)))
|
||||
#ifdef CONFIG_64BIT
|
||||
if (get_user(ptr, &t->rseq->rseq_cs))
|
||||
return -EFAULT;
|
||||
#else
|
||||
if (copy_from_user(&ptr, &t->rseq->rseq_cs, sizeof(ptr)))
|
||||
return -EFAULT;
|
||||
#endif
|
||||
if (!ptr) {
|
||||
memset(rseq_cs, 0, sizeof(*rseq_cs));
|
||||
return 0;
|
||||
@@ -204,9 +209,13 @@ static int clear_rseq_cs(struct task_struct *t)
|
||||
*
|
||||
* Set rseq_cs to NULL.
|
||||
*/
|
||||
if (clear_user(&t->rseq->rseq_cs.ptr64, sizeof(t->rseq->rseq_cs.ptr64)))
|
||||
#ifdef CONFIG_64BIT
|
||||
return put_user(0UL, &t->rseq->rseq_cs);
|
||||
#else
|
||||
if (clear_user(&t->rseq->rseq_cs, sizeof(t->rseq->rseq_cs)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -39,6 +39,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(pelt_rt_tp);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(pelt_dl_tp);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(pelt_irq_tp);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(pelt_se_tp);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(pelt_thermal_tp);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(sched_cpu_capacity_tp);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(sched_overutilized_tp);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(sched_util_est_cfs_tp);
|
||||
|
@@ -910,25 +910,15 @@ void print_numa_stats(struct seq_file *m, int node, unsigned long tsf,
|
||||
static void sched_show_numa(struct task_struct *p, struct seq_file *m)
|
||||
{
|
||||
#ifdef CONFIG_NUMA_BALANCING
|
||||
struct mempolicy *pol;
|
||||
|
||||
if (p->mm)
|
||||
P(mm->numa_scan_seq);
|
||||
|
||||
task_lock(p);
|
||||
pol = p->mempolicy;
|
||||
if (pol && !(pol->flags & MPOL_F_MORON))
|
||||
pol = NULL;
|
||||
mpol_get(pol);
|
||||
task_unlock(p);
|
||||
|
||||
P(numa_pages_migrated);
|
||||
P(numa_preferred_nid);
|
||||
P(total_numa_faults);
|
||||
SEQ_printf(m, "current_node=%d, numa_group_id=%d\n",
|
||||
task_node(p), task_numa_group_id(p));
|
||||
show_numa_stats(p, m);
|
||||
mpol_put(pol);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -1542,66 +1542,58 @@ static void init_numa_topology_type(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define NR_DISTANCE_VALUES (1 << DISTANCE_BITS)
|
||||
|
||||
void sched_init_numa(void)
|
||||
{
|
||||
int next_distance, curr_distance = node_distance(0, 0);
|
||||
struct sched_domain_topology_level *tl;
|
||||
int level = 0;
|
||||
int i, j, k;
|
||||
|
||||
sched_domains_numa_distance = kzalloc(sizeof(int) * (nr_node_ids + 1), GFP_KERNEL);
|
||||
if (!sched_domains_numa_distance)
|
||||
return;
|
||||
|
||||
/* Includes NUMA identity node at level 0. */
|
||||
sched_domains_numa_distance[level++] = curr_distance;
|
||||
sched_domains_numa_levels = level;
|
||||
unsigned long *distance_map;
|
||||
int nr_levels = 0;
|
||||
int i, j;
|
||||
|
||||
/*
|
||||
* O(nr_nodes^2) deduplicating selection sort -- in order to find the
|
||||
* unique distances in the node_distance() table.
|
||||
*
|
||||
* Assumes node_distance(0,j) includes all distances in
|
||||
* node_distance(i,j) in order to avoid cubic time.
|
||||
*/
|
||||
next_distance = curr_distance;
|
||||
distance_map = bitmap_alloc(NR_DISTANCE_VALUES, GFP_KERNEL);
|
||||
if (!distance_map)
|
||||
return;
|
||||
|
||||
bitmap_zero(distance_map, NR_DISTANCE_VALUES);
|
||||
for (i = 0; i < nr_node_ids; i++) {
|
||||
for (j = 0; j < nr_node_ids; j++) {
|
||||
for (k = 0; k < nr_node_ids; k++) {
|
||||
int distance = node_distance(i, k);
|
||||
int distance = node_distance(i, j);
|
||||
|
||||
if (distance > curr_distance &&
|
||||
(distance < next_distance ||
|
||||
next_distance == curr_distance))
|
||||
next_distance = distance;
|
||||
|
||||
/*
|
||||
* While not a strong assumption it would be nice to know
|
||||
* about cases where if node A is connected to B, B is not
|
||||
* equally connected to A.
|
||||
*/
|
||||
if (sched_debug() && node_distance(k, i) != distance)
|
||||
sched_numa_warn("Node-distance not symmetric");
|
||||
|
||||
if (sched_debug() && i && !find_numa_distance(distance))
|
||||
sched_numa_warn("Node-0 not representative");
|
||||
if (distance < LOCAL_DISTANCE || distance >= NR_DISTANCE_VALUES) {
|
||||
sched_numa_warn("Invalid distance value range");
|
||||
return;
|
||||
}
|
||||
if (next_distance != curr_distance) {
|
||||
sched_domains_numa_distance[level++] = next_distance;
|
||||
sched_domains_numa_levels = level;
|
||||
curr_distance = next_distance;
|
||||
} else break;
|
||||
}
|
||||
|
||||
/*
|
||||
* In case of sched_debug() we verify the above assumption.
|
||||
*/
|
||||
if (!sched_debug())
|
||||
break;
|
||||
bitmap_set(distance_map, distance, 1);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* We can now figure out how many unique distance values there are and
|
||||
* allocate memory accordingly.
|
||||
*/
|
||||
nr_levels = bitmap_weight(distance_map, NR_DISTANCE_VALUES);
|
||||
|
||||
sched_domains_numa_distance = kcalloc(nr_levels, sizeof(int), GFP_KERNEL);
|
||||
if (!sched_domains_numa_distance) {
|
||||
bitmap_free(distance_map);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0, j = 0; i < nr_levels; i++, j++) {
|
||||
j = find_next_bit(distance_map, NR_DISTANCE_VALUES, j);
|
||||
sched_domains_numa_distance[i] = j;
|
||||
}
|
||||
|
||||
bitmap_free(distance_map);
|
||||
|
||||
/*
|
||||
* 'level' contains the number of unique distances
|
||||
* 'nr_levels' contains the number of unique distances
|
||||
*
|
||||
* The sched_domains_numa_distance[] array includes the actual distance
|
||||
* numbers.
|
||||
@@ -1610,15 +1602,15 @@ void sched_init_numa(void)
|
||||
/*
|
||||
* Here, we should temporarily reset sched_domains_numa_levels to 0.
|
||||
* If it fails to allocate memory for array sched_domains_numa_masks[][],
|
||||
* the array will contain less then 'level' members. This could be
|
||||
* the array will contain less then 'nr_levels' members. This could be
|
||||
* dangerous when we use it to iterate array sched_domains_numa_masks[][]
|
||||
* in other functions.
|
||||
*
|
||||
* We reset it to 'level' at the end of this function.
|
||||
* We reset it to 'nr_levels' at the end of this function.
|
||||
*/
|
||||
sched_domains_numa_levels = 0;
|
||||
|
||||
sched_domains_numa_masks = kzalloc(sizeof(void *) * level, GFP_KERNEL);
|
||||
sched_domains_numa_masks = kzalloc(sizeof(void *) * nr_levels, GFP_KERNEL);
|
||||
if (!sched_domains_numa_masks)
|
||||
return;
|
||||
|
||||
@@ -1626,7 +1618,7 @@ void sched_init_numa(void)
|
||||
* Now for each level, construct a mask per node which contains all
|
||||
* CPUs of nodes that are that many hops away from us.
|
||||
*/
|
||||
for (i = 0; i < level; i++) {
|
||||
for (i = 0; i < nr_levels; i++) {
|
||||
sched_domains_numa_masks[i] =
|
||||
kzalloc(nr_node_ids * sizeof(void *), GFP_KERNEL);
|
||||
if (!sched_domains_numa_masks[i])
|
||||
@@ -1634,12 +1626,17 @@ void sched_init_numa(void)
|
||||
|
||||
for (j = 0; j < nr_node_ids; j++) {
|
||||
struct cpumask *mask = kzalloc(cpumask_size(), GFP_KERNEL);
|
||||
int k;
|
||||
|
||||
if (!mask)
|
||||
return;
|
||||
|
||||
sched_domains_numa_masks[i][j] = mask;
|
||||
|
||||
for_each_node(k) {
|
||||
if (sched_debug() && (node_distance(j, k) != node_distance(k, j)))
|
||||
sched_numa_warn("Node-distance not symmetric");
|
||||
|
||||
if (node_distance(j, k) > sched_domains_numa_distance[i])
|
||||
continue;
|
||||
|
||||
@@ -1651,7 +1648,7 @@ void sched_init_numa(void)
|
||||
/* Compute default topology size */
|
||||
for (i = 0; sched_domain_topology[i].mask; i++);
|
||||
|
||||
tl = kzalloc((i + level + 1) *
|
||||
tl = kzalloc((i + nr_levels + 1) *
|
||||
sizeof(struct sched_domain_topology_level), GFP_KERNEL);
|
||||
if (!tl)
|
||||
return;
|
||||
@@ -1674,7 +1671,7 @@ void sched_init_numa(void)
|
||||
/*
|
||||
* .. and append 'j' levels of NUMA goodness.
|
||||
*/
|
||||
for (j = 1; j < level; i++, j++) {
|
||||
for (j = 1; j < nr_levels; i++, j++) {
|
||||
tl[i] = (struct sched_domain_topology_level){
|
||||
.mask = sd_numa_mask,
|
||||
.sd_flags = cpu_numa_flags,
|
||||
@@ -1686,8 +1683,8 @@ void sched_init_numa(void)
|
||||
|
||||
sched_domain_topology = tl;
|
||||
|
||||
sched_domains_numa_levels = level;
|
||||
sched_max_numa_distance = sched_domains_numa_distance[level - 1];
|
||||
sched_domains_numa_levels = nr_levels;
|
||||
sched_max_numa_distance = sched_domains_numa_distance[nr_levels - 1];
|
||||
|
||||
init_numa_topology_type();
|
||||
}
|
||||
|
@@ -48,7 +48,7 @@ int stack_erasing_sysctl(struct ctl_table *table, int write,
|
||||
#define skip_erasing() false
|
||||
#endif /* CONFIG_STACKLEAK_RUNTIME_DISABLE */
|
||||
|
||||
asmlinkage void notrace stackleak_erase(void)
|
||||
asmlinkage void noinstr stackleak_erase(void)
|
||||
{
|
||||
/* It would be nice not to have 'kstack_ptr' and 'boundary' on stack */
|
||||
unsigned long kstack_ptr = current->lowest_stack;
|
||||
@@ -102,9 +102,8 @@ asmlinkage void notrace stackleak_erase(void)
|
||||
/* Reset the 'lowest_stack' value for the next syscall */
|
||||
current->lowest_stack = current_top_of_stack() - THREAD_SIZE/64;
|
||||
}
|
||||
NOKPROBE_SYMBOL(stackleak_erase);
|
||||
|
||||
void __used __no_caller_saved_registers notrace stackleak_track_stack(void)
|
||||
void __used __no_caller_saved_registers noinstr stackleak_track_stack(void)
|
||||
{
|
||||
unsigned long sp = current_stack_pointer;
|
||||
|
||||
|
@@ -234,7 +234,7 @@ static char trace_boot_options_buf[MAX_TRACER_SIZE] __initdata;
|
||||
static int __init set_trace_boot_options(char *str)
|
||||
{
|
||||
strlcpy(trace_boot_options_buf, str, MAX_TRACER_SIZE);
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("trace_options=", set_trace_boot_options);
|
||||
|
||||
@@ -245,12 +245,16 @@ static int __init set_trace_boot_clock(char *str)
|
||||
{
|
||||
strlcpy(trace_boot_clock_buf, str, MAX_TRACER_SIZE);
|
||||
trace_boot_clock = trace_boot_clock_buf;
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("trace_clock=", set_trace_boot_clock);
|
||||
|
||||
static int __init set_tracepoint_printk(char *str)
|
||||
{
|
||||
/* Ignore the "tp_printk_stop_on_boot" param */
|
||||
if (*str == '_')
|
||||
return 0;
|
||||
|
||||
if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0))
|
||||
tracepoint_printk = 1;
|
||||
return 1;
|
||||
@@ -1487,10 +1491,12 @@ static int __init set_buf_size(char *str)
|
||||
if (!str)
|
||||
return 0;
|
||||
buf_size = memparse(str, &str);
|
||||
/* nr_entries can not be zero */
|
||||
if (buf_size == 0)
|
||||
return 0;
|
||||
trace_buf_size = buf_size;
|
||||
/*
|
||||
* nr_entries can not be zero and the startup
|
||||
* tests require some buffer space. Therefore
|
||||
* ensure we have at least 4096 bytes of buffer.
|
||||
*/
|
||||
trace_buf_size = max(4096UL, buf_size);
|
||||
return 1;
|
||||
}
|
||||
__setup("trace_buf_size=", set_buf_size);
|
||||
|
@@ -5,6 +5,7 @@
|
||||
* Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com>
|
||||
*/
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/mutex.h>
|
||||
@@ -654,6 +655,52 @@ DEFINE_EQUALITY_PRED(32);
|
||||
DEFINE_EQUALITY_PRED(16);
|
||||
DEFINE_EQUALITY_PRED(8);
|
||||
|
||||
/* user space strings temp buffer */
|
||||
#define USTRING_BUF_SIZE 1024
|
||||
|
||||
struct ustring_buffer {
|
||||
char buffer[USTRING_BUF_SIZE];
|
||||
};
|
||||
|
||||
static __percpu struct ustring_buffer *ustring_per_cpu;
|
||||
|
||||
static __always_inline char *test_string(char *str)
|
||||
{
|
||||
struct ustring_buffer *ubuf;
|
||||
char *kstr;
|
||||
|
||||
if (!ustring_per_cpu)
|
||||
return NULL;
|
||||
|
||||
ubuf = this_cpu_ptr(ustring_per_cpu);
|
||||
kstr = ubuf->buffer;
|
||||
|
||||
/* For safety, do not trust the string pointer */
|
||||
if (!strncpy_from_kernel_nofault(kstr, str, USTRING_BUF_SIZE))
|
||||
return NULL;
|
||||
return kstr;
|
||||
}
|
||||
|
||||
static __always_inline char *test_ustring(char *str)
|
||||
{
|
||||
struct ustring_buffer *ubuf;
|
||||
char __user *ustr;
|
||||
char *kstr;
|
||||
|
||||
if (!ustring_per_cpu)
|
||||
return NULL;
|
||||
|
||||
ubuf = this_cpu_ptr(ustring_per_cpu);
|
||||
kstr = ubuf->buffer;
|
||||
|
||||
/* user space address? */
|
||||
ustr = (char __user *)str;
|
||||
if (!strncpy_from_user_nofault(kstr, ustr, USTRING_BUF_SIZE))
|
||||
return NULL;
|
||||
|
||||
return kstr;
|
||||
}
|
||||
|
||||
/* Filter predicate for fixed sized arrays of characters */
|
||||
static int filter_pred_string(struct filter_pred *pred, void *event)
|
||||
{
|
||||
@@ -667,19 +714,43 @@ static int filter_pred_string(struct filter_pred *pred, void *event)
|
||||
return match;
|
||||
}
|
||||
|
||||
/* Filter predicate for char * pointers */
|
||||
static int filter_pred_pchar(struct filter_pred *pred, void *event)
|
||||
static __always_inline int filter_pchar(struct filter_pred *pred, char *str)
|
||||
{
|
||||
char **addr = (char **)(event + pred->offset);
|
||||
int cmp, match;
|
||||
int len = strlen(*addr) + 1; /* including tailing '\0' */
|
||||
int len;
|
||||
|
||||
cmp = pred->regex.match(*addr, &pred->regex, len);
|
||||
len = strlen(str) + 1; /* including tailing '\0' */
|
||||
cmp = pred->regex.match(str, &pred->regex, len);
|
||||
|
||||
match = cmp ^ pred->not;
|
||||
|
||||
return match;
|
||||
}
|
||||
/* Filter predicate for char * pointers */
|
||||
static int filter_pred_pchar(struct filter_pred *pred, void *event)
|
||||
{
|
||||
char **addr = (char **)(event + pred->offset);
|
||||
char *str;
|
||||
|
||||
str = test_string(*addr);
|
||||
if (!str)
|
||||
return 0;
|
||||
|
||||
return filter_pchar(pred, str);
|
||||
}
|
||||
|
||||
/* Filter predicate for char * pointers in user space*/
|
||||
static int filter_pred_pchar_user(struct filter_pred *pred, void *event)
|
||||
{
|
||||
char **addr = (char **)(event + pred->offset);
|
||||
char *str;
|
||||
|
||||
str = test_ustring(*addr);
|
||||
if (!str)
|
||||
return 0;
|
||||
|
||||
return filter_pchar(pred, str);
|
||||
}
|
||||
|
||||
/*
|
||||
* Filter predicate for dynamic sized arrays of characters.
|
||||
@@ -1158,6 +1229,7 @@ static int parse_pred(const char *str, void *data,
|
||||
struct filter_pred *pred = NULL;
|
||||
char num_buf[24]; /* Big enough to hold an address */
|
||||
char *field_name;
|
||||
bool ustring = false;
|
||||
char q;
|
||||
u64 val;
|
||||
int len;
|
||||
@@ -1192,6 +1264,12 @@ static int parse_pred(const char *str, void *data,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* See if the field is a user space string */
|
||||
if ((len = str_has_prefix(str + i, ".ustring"))) {
|
||||
ustring = true;
|
||||
i += len;
|
||||
}
|
||||
|
||||
while (isspace(str[i]))
|
||||
i++;
|
||||
|
||||
@@ -1320,8 +1398,20 @@ static int parse_pred(const char *str, void *data,
|
||||
|
||||
} else if (field->filter_type == FILTER_DYN_STRING)
|
||||
pred->fn = filter_pred_strloc;
|
||||
else
|
||||
pred->fn = filter_pred_pchar;
|
||||
else {
|
||||
|
||||
if (!ustring_per_cpu) {
|
||||
/* Once allocated, keep it around for good */
|
||||
ustring_per_cpu = alloc_percpu(struct ustring_buffer);
|
||||
if (!ustring_per_cpu)
|
||||
goto err_mem;
|
||||
}
|
||||
|
||||
if (ustring)
|
||||
pred->fn = filter_pred_pchar_user;
|
||||
else
|
||||
pred->fn = filter_pred_pchar;
|
||||
}
|
||||
/* go past the last quote */
|
||||
i++;
|
||||
|
||||
@@ -1387,6 +1477,9 @@ static int parse_pred(const char *str, void *data,
|
||||
err_free:
|
||||
kfree(pred);
|
||||
return -EINVAL;
|
||||
err_mem:
|
||||
kfree(pred);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
enum {
|
||||
|
@@ -1985,9 +1985,9 @@ parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file,
|
||||
/*
|
||||
* For backward compatibility, if field_name
|
||||
* was "cpu", then we treat this the same as
|
||||
* common_cpu.
|
||||
* common_cpu. This also works for "CPU".
|
||||
*/
|
||||
if (strcmp(field_name, "cpu") == 0) {
|
||||
if (field && field->filter_type == FILTER_CPU) {
|
||||
*flags |= HIST_FIELD_FL_CPU;
|
||||
} else {
|
||||
hist_err(tr, HIST_ERR_FIELD_NOT_FOUND,
|
||||
@@ -4365,7 +4365,7 @@ static int create_tracing_map_fields(struct hist_trigger_data *hist_data)
|
||||
|
||||
if (hist_field->flags & HIST_FIELD_FL_STACKTRACE)
|
||||
cmp_fn = tracing_map_cmp_none;
|
||||
else if (!field)
|
||||
else if (!field || hist_field->flags & HIST_FIELD_FL_CPU)
|
||||
cmp_fn = tracing_map_cmp_num(hist_field->size,
|
||||
hist_field->is_signed);
|
||||
else if (is_string_field(field))
|
||||
|
@@ -940,6 +940,16 @@ static void
|
||||
traceon_trigger(struct event_trigger_data *data, void *rec,
|
||||
struct ring_buffer_event *event)
|
||||
{
|
||||
struct trace_event_file *file = data->private_data;
|
||||
|
||||
if (file) {
|
||||
if (tracer_tracing_is_on(file->tr))
|
||||
return;
|
||||
|
||||
tracer_tracing_on(file->tr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tracing_is_on())
|
||||
return;
|
||||
|
||||
@@ -950,8 +960,15 @@ static void
|
||||
traceon_count_trigger(struct event_trigger_data *data, void *rec,
|
||||
struct ring_buffer_event *event)
|
||||
{
|
||||
if (tracing_is_on())
|
||||
return;
|
||||
struct trace_event_file *file = data->private_data;
|
||||
|
||||
if (file) {
|
||||
if (tracer_tracing_is_on(file->tr))
|
||||
return;
|
||||
} else {
|
||||
if (tracing_is_on())
|
||||
return;
|
||||
}
|
||||
|
||||
if (!data->count)
|
||||
return;
|
||||
@@ -959,13 +976,26 @@ traceon_count_trigger(struct event_trigger_data *data, void *rec,
|
||||
if (data->count != -1)
|
||||
(data->count)--;
|
||||
|
||||
tracing_on();
|
||||
if (file)
|
||||
tracer_tracing_on(file->tr);
|
||||
else
|
||||
tracing_on();
|
||||
}
|
||||
|
||||
static void
|
||||
traceoff_trigger(struct event_trigger_data *data, void *rec,
|
||||
struct ring_buffer_event *event)
|
||||
{
|
||||
struct trace_event_file *file = data->private_data;
|
||||
|
||||
if (file) {
|
||||
if (!tracer_tracing_is_on(file->tr))
|
||||
return;
|
||||
|
||||
tracer_tracing_off(file->tr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!tracing_is_on())
|
||||
return;
|
||||
|
||||
@@ -976,8 +1006,15 @@ static void
|
||||
traceoff_count_trigger(struct event_trigger_data *data, void *rec,
|
||||
struct ring_buffer_event *event)
|
||||
{
|
||||
if (!tracing_is_on())
|
||||
return;
|
||||
struct trace_event_file *file = data->private_data;
|
||||
|
||||
if (file) {
|
||||
if (!tracer_tracing_is_on(file->tr))
|
||||
return;
|
||||
} else {
|
||||
if (!tracing_is_on())
|
||||
return;
|
||||
}
|
||||
|
||||
if (!data->count)
|
||||
return;
|
||||
@@ -985,7 +1022,10 @@ traceoff_count_trigger(struct event_trigger_data *data, void *rec,
|
||||
if (data->count != -1)
|
||||
(data->count)--;
|
||||
|
||||
tracing_off();
|
||||
if (file)
|
||||
tracer_tracing_off(file->tr);
|
||||
else
|
||||
tracing_off();
|
||||
}
|
||||
|
||||
static int
|
||||
|
@@ -31,7 +31,7 @@ static int __init set_kprobe_boot_events(char *str)
|
||||
strlcpy(kprobe_boot_events_buf, str, COMMAND_LINE_SIZE);
|
||||
disable_tracing_selftest("running kprobe events");
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("kprobe_event=", set_kprobe_boot_events);
|
||||
|
||||
|
@@ -54,6 +54,7 @@ static void watch_queue_pipe_buf_release(struct pipe_inode_info *pipe,
|
||||
bit += page->index;
|
||||
|
||||
set_bit(bit, wqueue->notes_bitmap);
|
||||
generic_pipe_buf_release(pipe, buf);
|
||||
}
|
||||
|
||||
// No try_steal function => no stealing
|
||||
@@ -112,7 +113,7 @@ static bool post_one_notification(struct watch_queue *wqueue,
|
||||
buf->offset = offset;
|
||||
buf->len = len;
|
||||
buf->flags = PIPE_BUF_FLAG_WHOLE;
|
||||
pipe->head = head + 1;
|
||||
smp_store_release(&pipe->head, head + 1); /* vs pipe_read() */
|
||||
|
||||
if (!test_and_clear_bit(note, wqueue->notes_bitmap)) {
|
||||
spin_unlock_irq(&pipe->rd_wait.lock);
|
||||
@@ -243,7 +244,8 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = pipe_resize_ring(pipe, nr_notes);
|
||||
nr_notes = nr_pages * WATCH_QUEUE_NOTES_PER_PAGE;
|
||||
ret = pipe_resize_ring(pipe, roundup_pow_of_two(nr_notes));
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
@@ -268,11 +270,11 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
|
||||
wqueue->notes = pages;
|
||||
wqueue->notes_bitmap = bitmap;
|
||||
wqueue->nr_pages = nr_pages;
|
||||
wqueue->nr_notes = nr_pages * WATCH_QUEUE_NOTES_PER_PAGE;
|
||||
wqueue->nr_notes = nr_notes;
|
||||
return 0;
|
||||
|
||||
error_p:
|
||||
for (i = 0; i < nr_pages; i++)
|
||||
while (--i >= 0)
|
||||
__free_page(pages[i]);
|
||||
kfree(pages);
|
||||
error:
|
||||
@@ -320,7 +322,7 @@ long watch_queue_set_filter(struct pipe_inode_info *pipe,
|
||||
tf[i].info_mask & WATCH_INFO_LENGTH)
|
||||
goto err_filter;
|
||||
/* Ignore any unknown types */
|
||||
if (tf[i].type >= sizeof(wfilter->type_filter) * 8)
|
||||
if (tf[i].type >= WATCH_TYPE__NR)
|
||||
continue;
|
||||
nr_filter++;
|
||||
}
|
||||
@@ -336,7 +338,7 @@ long watch_queue_set_filter(struct pipe_inode_info *pipe,
|
||||
|
||||
q = wfilter->filters;
|
||||
for (i = 0; i < filter.nr_filters; i++) {
|
||||
if (tf[i].type >= sizeof(wfilter->type_filter) * BITS_PER_LONG)
|
||||
if (tf[i].type >= WATCH_TYPE__NR)
|
||||
continue;
|
||||
|
||||
q->type = tf[i].type;
|
||||
@@ -371,6 +373,8 @@ static void __put_watch_queue(struct kref *kref)
|
||||
|
||||
for (i = 0; i < wqueue->nr_pages; i++)
|
||||
__free_page(wqueue->notes[i]);
|
||||
kfree(wqueue->notes);
|
||||
bitmap_free(wqueue->notes_bitmap);
|
||||
|
||||
wfilter = rcu_access_pointer(wqueue->filter);
|
||||
if (wfilter)
|
||||
@@ -395,6 +399,7 @@ static void free_watch(struct rcu_head *rcu)
|
||||
put_watch_queue(rcu_access_pointer(watch->queue));
|
||||
atomic_dec(&watch->cred->user->nr_watches);
|
||||
put_cred(watch->cred);
|
||||
kfree(watch);
|
||||
}
|
||||
|
||||
static void __put_watch(struct kref *kref)
|
||||
@@ -566,7 +571,7 @@ void watch_queue_clear(struct watch_queue *wqueue)
|
||||
rcu_read_lock();
|
||||
spin_lock_bh(&wqueue->lock);
|
||||
|
||||
/* Prevent new additions and prevent notifications from happening */
|
||||
/* Prevent new notifications from being stored. */
|
||||
wqueue->defunct = true;
|
||||
|
||||
while (!hlist_empty(&wqueue->watches)) {
|
||||
|
Reference in New Issue
Block a user