1. 22 Dec, 2022 4 commits
    • Linus Torvalds's avatar
      Merge tag 'trace-probes-v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace · af9b3fa1
      Linus Torvalds authored
      Pull trace probes updates from Steven Rostedt:
      
       - New "symstr" type for dynamic events that writes the name of the
         function+offset into the ring buffer and not just the address
      
       - Prevent kernel symbol processing on addresses in user space probes
         (uprobes).
      
       - And minor fixes and clean ups
      
      * tag 'trace-probes-v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
        tracing/probes: Reject symbol/symstr type for uprobe
        tracing/probes: Add symstr type for dynamic events
        kprobes: kretprobe events missing on 2-core KVM guest
        kprobes: Fix check for probe enabled in kill_kprobe()
        test_kprobes: Fix implicit declaration error of test_kprobes
        tracing: Fix race where eprobes can be called before the event
      af9b3fa1
    • Linus Torvalds's avatar
      Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm · 7a5189c5
      Linus Torvalds authored
      Pull RISC-V kvm updates from Paolo Bonzini:
      
       - Allow unloading KVM module
      
       - Allow KVM user-space to set mvendorid, marchid, and mimpid
      
       - Several fixes and cleanups
      
      * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
        RISC-V: KVM: Add ONE_REG interface for mvendorid, marchid, and mimpid
        RISC-V: KVM: Save mvendorid, marchid, and mimpid when creating VCPU
        RISC-V: Export sbi_get_mvendorid() and friends
        RISC-V: KVM: Move sbi related struct and functions to kvm_vcpu_sbi.h
        RISC-V: KVM: Use switch-case in kvm_riscv_vcpu_set/get_reg()
        RISC-V: KVM: Remove redundant includes of asm/csr.h
        RISC-V: KVM: Remove redundant includes of asm/kvm_vcpu_timer.h
        RISC-V: KVM: Fix reg_val check in kvm_riscv_vcpu_set_reg_config()
        RISC-V: KVM: Simplify kvm_arch_prepare_memory_region()
        RISC-V: KVM: Exit run-loop immediately if xfer_to_guest fails
        RISC-V: KVM: use vma_lookup() instead of find_vma_intersection()
        RISC-V: KVM: Add exit logic to main.c
      7a5189c5
    • Linus Torvalds's avatar
      Merge tag 'block-6.2-2022-12-19' of git://git.kernel.dk/linux · 569c3a28
      Linus Torvalds authored
      Pull block fixes from Jens Axboe:
      
       - Various fixes for BFQ (Yu, Yuwei)
      
       - Fix for loop command line parsing (Isaac)
      
       - No need to specifically clear REQ_ALLOC_CACHE on IOPOLL downgrade
         anymore (me)
      
       - blk-iocost enum fix for newer gcc (Jiri)
      
       - UAF fix for queue release (Ming)
      
       - blk-iolatency error handling memory leak fix (Tejun)
      
      * tag 'block-6.2-2022-12-19' of git://git.kernel.dk/linux:
        block: don't clear REQ_ALLOC_CACHE for non-polled requests
        block: fix use-after-free of q->q_usage_counter
        block, bfq: only do counting of pending-request for BFQ_GROUP_IOSCHED
        blk-iolatency: Fix memory leak on add_disk() failures
        loop: Fix the max_loop commandline argument treatment when it is set to 0
        block/blk-iocost (gcc13): keep large values in a new enum
        block, bfq: replace 0/1 with false/true in bic apis
        block, bfq: don't return bfqg from __bfq_bic_change_cgroup()
        block, bfq: fix possible uaf for 'bfqq->bic'
      569c3a28
    • Linus Torvalds's avatar
      Merge tag 'io_uring-6.2-2022-12-19' of git://git.kernel.dk/linux · 5d4740fc
      Linus Torvalds authored
      Pull io_uring fixes from Jens Axboe:
      
       - Improve the locking for timeouts. This was originally queued up for
         the initial pull, but I messed up and it got missed. (Pavel)
      
       - Fix an issue with running task_work from the wait path, causing some
         inefficiencies (me)
      
       - Add a clear of ->free_iov upfront in the 32-bit compat data
         importing, so we ensure that it's always sane at completion time (me)
      
       - Use call_rcu_hurry() for the eventfd signaling (Dylan)
      
       - Ordering fix for multishot recv completions (Pavel)
      
       - Add the io_uring trace header to the MAINTAINERS entry (Ammar)
      
      * tag 'io_uring-6.2-2022-12-19' of git://git.kernel.dk/linux:
        MAINTAINERS: io_uring: Add include/trace/events/io_uring.h
        io_uring/net: fix cleanup after recycle
        io_uring/net: ensure compat import handlers clear free_iov
        io_uring: include task_work run after scheduling in wait for events
        io_uring: don't use TIF_NOTIFY_SIGNAL to test for availability of task_work
        io_uring: use call_rcu_hurry if signaling an eventfd
        io_uring: fix overflow handling regression
        io_uring: ease timeout flush locking requirements
        io_uring: revise completion_lock locking
        io_uring: protect cq_timeouts with timeout_lock
      5d4740fc
  2. 21 Dec, 2022 16 commits
    • Linus Torvalds's avatar
      Merge tag '6.2-rc-smb3-client-fixes-part2' of git://git.samba.org/sfrench/cifs-2.6 · 0a924817
      Linus Torvalds authored
      Pull cifs fixes from Steve French:
       "cifs/smb3 client fixes, mostly related to reconnect and/or DFS:
      
         - two important reconnect fixes: cases where status of recently
           connected IPCs and shares were not being updated leaving them in an
           incorrect state
      
         - fix for older Windows servers that would return
           STATUS_OBJECT_NAME_INVALID to query info requests on DFS links in a
           namespace that contained non-ASCII characters, reducing number of
           wasted roundtrips.
      
         - fix for leaked -ENOMEM to userspace when cifs.ko couldn't perform
           I/O due to a disconnected server, expired or deleted session.
      
         - removal of all unneeded DFS related mount option string parsing
           (now using fs_context for automounts)
      
         - improve clarity/readability, moving various DFS related functions
           out of fs/cifs/connect.c (which was getting too big to be readable)
           to new file.
      
         - Fix problem when large number of DFS connections. Allow sharing of
           DFS connections and fix how the referral paths are matched
      
         - Referral caching fix: Instead of looking up ipc connections to
           refresh cached referrals, store direct dfs root server's IPC
           pointer in new sessions so it can simply be accessed to either
           refresh or create a new referral that such connections belong to.
      
         - Fix to allow dfs root server's connections to also failover
      
         - Optimized reconnect of nested DFS links
      
         - Set correct status of IPC connections marked for reconnect"
      
      * tag '6.2-rc-smb3-client-fixes-part2' of git://git.samba.org/sfrench/cifs-2.6:
        cifs: update internal module number
        cifs: don't leak -ENOMEM in smb2_open_file()
        cifs: use origin fullpath for automounts
        cifs: set correct status of tcon ipc when reconnecting
        cifs: optimize reconnect of nested links
        cifs: fix source pathname comparison of dfs supers
        cifs: fix confusing debug message
        cifs: don't block in dfs_cache_noreq_update_tgthint()
        cifs: refresh root referrals
        cifs: fix refresh of cached referrals
        cifs: don't refresh cached referrals from unactive mounts
        cifs: share dfs connections and supers
        cifs: split out ses and tcon retrieval from mount_get_conns()
        cifs: set resolved ip in sockaddr
        cifs: remove unused smb3_fs_context::mount_options
        cifs: get rid of mount options string parsing
        cifs: use fs_context for automounts
        cifs: reduce roundtrips on create/qinfo requests
        cifs: set correct ipc status after initial tree connect
        cifs: set correct tcon status after initial tree connect
      0a924817
    • Linus Torvalds's avatar
      Merge tag 'ntfs3_for_6.2' of https://github.com/Paragon-Software-Group/linux-ntfs3 · 6022ec6e
      Linus Torvalds authored
      Pull ntfs3 updates from Konstantin Komarov:
      
       - added mount options 'hidedotfiles', 'nocase' and 'windows_names'
      
       - fixed xfstests (tested on x86_64): generic/083 generic/263
         generic/307 generic/465
      
       - fix some logic errors
      
       - code refactoring and dead code removal
      
      * tag 'ntfs3_for_6.2' of https://github.com/Paragon-Software-Group/linux-ntfs3: (61 commits)
        fs/ntfs3: Make if more readable
        fs/ntfs3: Improve checking of bad clusters
        fs/ntfs3: Fix wrong if in hdr_first_de
        fs/ntfs3: Use ALIGN kernel macro
        fs/ntfs3: Fix incorrect if in ntfs_set_acl_ex
        fs/ntfs3: Check fields while reading
        fs/ntfs3: Correct ntfs_check_for_free_space
        fs/ntfs3: Restore correct state after ENOSPC in attr_data_get_block
        fs/ntfs3: Changing locking in ntfs_rename
        fs/ntfs3: Fixing wrong logic in attr_set_size and ntfs_fallocate
        fs/ntfs3: atomic_open implementation
        fs/ntfs3: Fix wrong indentations
        fs/ntfs3: Change new sparse cluster processing
        fs/ntfs3: Fixing work with sparse clusters
        fs/ntfs3: Simplify ntfs_update_mftmirr function
        fs/ntfs3: Remove unused functions
        fs/ntfs3: Fix sparse problems
        fs/ntfs3: Add ntfs_bitmap_weight_le function and refactoring
        fs/ntfs3: Use _le variants of bitops functions
        fs/ntfs3: Add functions to modify LE bitmaps
        ...
      6022ec6e
    • Linus Torvalds's avatar
      Merge tag 'fs.mount.propagation.fix.v6.2-rc1' of... · 04065c12
      Linus Torvalds authored
      Merge tag 'fs.mount.propagation.fix.v6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping
      
      Pull mount propagation fix from Christian Brauner:
       "The propagate_mnt() function handles mount propagation when creating
        mounts and propagates the source mount tree @source_mnt to all
        applicable nodes of the destination propagation mount tree headed by
        @dest_mnt.
      
        Unfortunately it contains a bug where it fails to terminate at peers
        of @source_mnt when looking up copies of the source mount that become
        masters for copies of the source mount tree mounted on top of slaves
        in the destination propagation tree causing a NULL dereference.
      
        This fixes that bug (with a long commit message for a seven character
        fix but hopefully it'll help us fix issues faster in the future rather
        than having to go through the pain of having to relearn everything
        once more)"
      
      * tag 'fs.mount.propagation.fix.v6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping:
        pnode: terminate at peers of source
      04065c12
    • Linus Torvalds's avatar
      Merge tag 'for-linus-2022122101' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid · d264dd3b
      Linus Torvalds authored
      Pull HID updates from Benjamin Tissoires:
      
       - Four potential NULL pointers dereferences (Bastien Nocera, Enrik
         Berkhan, Jiasheng Jiang and Roderick Colenbrander)
      
       - Allow Wacom devices in bootloader mode to be flashed (Jason Gerecke)
      
       - Some assorted devices quirks (José Expósito and Terry Junge)
      
      * tag 'for-linus-2022122101' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
        HID: sony: Fix unused function warning
        HID: plantronics: Additional PIDs for double volume key presses quirk
        HID: multitouch: fix Asus ExpertBook P2 P2451FA trackpoint
        HID: Ignore HP Envy x360 eu0009nv stylus battery
        HID: wacom: Ensure bootloader PID is usable in hidraw mode
        HID: amd_sfh: Add missing check for dma_alloc_coherent
        HID: playstation: fix free of uninialized pointer for DS4 in Bluetooth.
        HID: mcp2221: don't connect hidraw
        HID: logitech-hidpp: Guard FF init code against non-USB devices
      d264dd3b
    • Linus Torvalds's avatar
      Merge tag 'media/v6.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media · 5461e079
      Linus Torvalds authored
      Pull media fixes from Mauro Carvalho Chehab:
      
       - A regression at V4L2 core breaking string controls
      
       - Build warning fixes on sun6i drivers when building with clang
      
      * tag 'media/v6.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
        media: sun6i-isp: params: Unregister pending buffer on cleanup
        media: sun6i-isp: params: Fix incorrect indentation
        media: sun6i-isp: capture: Fix uninitialized variable use
        media: sun6i-isp: proc: Declare subdev ops as static
        media: sun6i-isp: proc: Error out on invalid port to fix warning
        media: sun6i-isp: proc: Fix return code handling in stream off path
        media: sun8i-a83t-mipi-csi2: Clarify return code handling in stream off path
        media: sun6i-mipi-csi2: Clarify return code handling in stream off path
        media: sun6i-csi: capture: Remove useless ret initialization
        media: sun6i-csi: bridge: Error out on invalid port to fix warning
        media: v4l2-ctrls-api.c: add back dropped ctrl->is_new = 1
      5461e079
    • Linus Torvalds's avatar
      Merge tag 'pwm/for-6.2-rc1' of... · 7a693ea7
      Linus Torvalds authored
      Merge tag 'pwm/for-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm
      
      Pull pwm updates from Thierry Reding:
       "Various changes across the board, mostly improvements and cleanups"
      
      * tag 'pwm/for-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm: (42 commits)
        pwm: pca9685: Convert to i2c's .probe_new()
        pwm: sun4i: Propagate errors in .get_state() to the caller
        pwm: Handle .get_state() failures
        pwm: sprd: Propagate errors in .get_state() to the caller
        pwm: rockchip: Propagate errors in .get_state() to the caller
        pwm: mtk-disp: Propagate errors in .get_state() to the caller
        pwm: imx27: Propagate errors in .get_state() to the caller
        pwm: cros-ec: Propagate errors in .get_state() to the caller
        pwm: crc: Propagate errors in .get_state() to the caller
        leds: qcom-lpg: Propagate errors in .get_state() to the caller
        drm/bridge: ti-sn65dsi86: Propagate errors in .get_state() to the caller
        pwm/tracing: Also record trace events for failed API calls
        pwm: Make .get_state() callback return an error code
        pwm: pxa: Enable for MMP platform
        pwm: pxa: Add reference manual link and limitations
        pwm: pxa: Use abrupt shutdown mode
        pwm: pxa: Remove clk enable/disable from pxa_pwm_config
        pwm: pxa: Set duty cycle to 0 when disabling PWM
        pwm: pxa: Remove pxa_pwm_enable/disable
        pwm: mediatek: Add support for MT7986
        ...
      7a693ea7
    • Linus Torvalds's avatar
      Merge tag 'rproc-v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux · 9cf5b508
      Linus Torvalds authored
      Pull remoteproc updates from Bjorn Andersson:
       "rproc-virtio device names are now auto generated, to avoid conflicts
        between remoteproc instances.
      
        The imx_rproc driver is extended with support for communicating with
        and attaching to a running M4 on i.MX8QXP, as well as support for
        attaching to the M4 after self-recovering from a crash. Support is
        added for i.MX8QM and mailbox channels are reconnected during the
        recovery process, in order to avoid data corruption.
      
        The Xilinx Zynqmp firmware interface is extended and support for the
        Xilinx R5 RPU is introduced.
      
        Various resources leaks, primarily in error paths, throughout the
        Qualcomm drivers are corrected.
      
        Lastly a fix to ensure that pm_relax is invoked even if the remoteproc
        instance is stopped between a crash is being reported and the recovery
        handler is scheduled"
      
      * tag 'rproc-v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux: (25 commits)
        remoteproc: core: Do pm_relax when in RPROC_OFFLINE state
        remoteproc: qcom: q6v5: Fix missing clk_disable_unprepare() in q6v5_wcss_qcs404_power_on()
        remoteproc: qcom_q6v5_pas: Fix missing of_node_put() in adsp_alloc_memory_region()
        remoteproc: qcom_q6v5_pas: detach power domains on remove
        remoteproc: qcom_q6v5_pas: disable wakeup on probe fail or remove
        remoteproc: qcom: q6v5: Fix potential null-ptr-deref in q6v5_wcss_init_mmio()
        remoteproc: sysmon: fix memory leak in qcom_add_sysmon_subdev()
        remoteproc: sysmon: Make QMI message rules const
        drivers: remoteproc: Add Xilinx r5 remoteproc driver
        firmware: xilinx: Add RPU configuration APIs
        firmware: xilinx: Add shutdown/wakeup APIs
        firmware: xilinx: Add ZynqMP firmware ioctl enums for RPU configuration.
        arm64: dts: xilinx: zynqmp: Add RPU subsystem device node
        dt-bindings: remoteproc: Add Xilinx RPU subsystem bindings
        remoteproc: core: Use device_match_of_node()
        remoteproc: imx_rproc: Correct i.MX93 DRAM mapping
        remoteproc: imx_rproc: Enable attach recovery for i.MX8QM/QXP
        remoteproc: imx_rproc: Request mbox channel later
        remoteproc: imx_rproc: Support i.MX8QM
        remoteproc: imx_rproc: Support kicking Mcore from Linux for i.MX8QXP
        ...
      9cf5b508
    • Linus Torvalds's avatar
      Merge tag 'mailbox-v6.2' of git://git.linaro.org/landing-teams/working/fujitsu/integration · f2855eec
      Linus Torvalds authored
      Pull mailbox updates from Jassi Brar:
      
       - qcom: enable sc8280xp, sm8550 and sm4250 support
      
       - ti: default to ARCH_K3 for msg manager
      
       - mediatek:
          - add mt8188 and mt8186 support
          - request irq only after got ready
      
       - zynq-ipi: fix error handling after device_register
      
       - mpfs: check sys-con status
      
       - rockchip: simplify by using device_get_match_data
      
      * tag 'mailbox-v6.2' of git://git.linaro.org/landing-teams/working/fujitsu/integration:
        dt-bindings: mailbox: qcom-ipcc: Add compatible for SM8550
        mailbox: mtk-cmdq: Do not request irq until we are ready
        mailbox: zynq-ipi: fix error handling while device_register() fails
        mailbox: mtk-cmdq-mailbox: Use platform data directly instead of copying
        mailbox: arm_mhuv2: Fix return value check in mhuv2_probe()
        dt-bindings: mailbox: mediatek,gce-mailbox: add mt8188 compatible name
        dt-bindings: mailbox: add GCE header file for mt8188
        mailbox: mpfs: read the system controller's status
        mailbox: mtk-cmdq: add MT8186 support
        mailbox: mtk-cmdq: add gce ddr enable support flow
        mailbox: mtk-cmdq: add gce software ddr enable private data
        mailbox: mtk-cmdq: Use GCE_CTRL_BY_SW definition instead of number
        mailbox: rockchip: Use device_get_match_data() to simplify the code
        dt-bindings: mailbox: qcom-ipcc: Add sc8280xp compatible
        mailbox: config: ti-msgmgr: Default set to ARCH_K3 for TI msg manager
        mailbox: qcom-apcs-ipc: Add SM4250 APCS IPC support
        dt-bindings: mailbox: qcom: Add SM4250 APCS compatible
      f2855eec
    • Linus Torvalds's avatar
      Merge tag 'backlight-next-6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight · ec34c2b4
      Linus Torvalds authored
      Pull backlight update from Lee Jones:
       "Convert a bunch of I2C class drivers over to .probe_new()"
      
      * tag 'backlight-next-6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight:
        backlight: tosa: Convert to i2c's .probe_new()
        backlight: lv5207lp: Convert to i2c's .probe_new()
        backlight: lp855x: Convert to i2c's .probe_new()
        backlight: lm3639: Convert to i2c's .probe_new()
        backlight: lm3630a: Convert to i2c's .probe_new()
        backlight: bd6107: Convert to i2c's .probe_new()
        backlight: arcxcnn: Convert to i2c's .probe_new()
        backlight: adp8870: Convert to i2c's .probe_new()
        backlight: adp8860: Convert to i2c's .probe_new()
      ec34c2b4
    • Linus Torvalds's avatar
      Merge tag 'mfd-next-6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd · 7406fd75
      Linus Torvalds authored
      Pull MFD updates from Lee Jones:
       "New Drivers:
         - Add support for Ampere Computing SMpro
         - Add support for TI TPS65219 PMIC
      
        New Functionality:
         - Add support for multiple devices of the same type; rk808
      
        Fix-ups:
         - Convert a bunch of I2C class drivers over to .probe_new()
         - Remove superfluous includes; mc13xxx-*, palmas, timberdale
         - Use correct includes for GPIO handling; madera-core
         - Convert to GPIOD; twl6040
         - Remove unused platform data handling; twl6040
         - Device Tree changes; many
         - Remove unused drivers; dm355evm_msp, davinci_voicecodec, htc-i2cpld
         - Add support for modules; palmas
         - Enable COMPILE_TEST support; intel_soc_pmic*
         - Trivial: spelling / whitespace fixes; mc13xxx-spi
         - Replace old PM helpers with new ones; many
         - Convert deprecated mask_invert usage to unmask_base; many
         - Use devm_*() calls; qcom_rpm
         - MAINTAINER fix-ups
         - Make use of improved / replaced APIs; palmas, fsl-imx25-tsadc,
           stm32-lptimer, qcom_rpm, rohm-*
      
        Bug Fixes:
         - Add bounds / error checking; mt6360-core
         - No sleeping inside critical sections; axp20x
         - Fix missing dependencies; ROHM_BD957XMUF
         - Repair error paths; qcom-pm8008"
      
      * tag 'mfd-next-6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (161 commits)
        dt-bindings: mfd: da9062: Correct file name for watchdog
        mfd: pm8008: Fix return value check in pm8008_probe()
        mfd: rohm: Use dev_err_probe()
        mfd: Drop obsolete dependencies on COMPILE_TEST
        dt-bindings: mfd: da9062: Move IRQ to optional properties
        mfd: qcom_rpm: Use devm_of_platform_populate() to simplify code
        mfd: qcom_rpm: Fix an error handling path in qcom_rpm_probe()
        mfd: stm32-lptimer: Use devm_platform_get_and_ioremap_resource()
        mfd: rohm-bd9576: Convert to i2c's .probe_new()
        mfd: fsl-imx25-tsadc: Use devm_platform_get_and_ioremap_resource()
        dt-bindings: Fix maintainer email for a few ROHM ICs
        mfd: palmas: Use device_get_match_data() to simplify the code
        Input: Add tps65219 interrupt driven powerbutton
        mfd: tps65219: Add driver for TI TPS65219 PMIC
        mfd: bd957x: Fix Kconfig dependency on REGMAP_IRQ
        mfd: wcd934x: Convert irq chip to config regs
        mfd: tps65090: Replace irqchip mask_invert with unmask_base
        mfd: sun4i-gpadc: Replace irqchip mask_invert with unmask_base
        mfd: stpmic1: Fix swapped mask/unmask in irq chip
        mfd: sprd-sc27xx-spi: Replace irqchip mask_invert with unmask_base
        ...
      7406fd75
    • Linus Torvalds's avatar
      m68k: remove broken strcmp implementation · 7c084612
      Linus Torvalds authored
      The m68 hand-written assembler version of strcmp() has always been
      broken: it returns the difference between the first non-matching byte
      done as a 8-bit subtraction.
      
      That is _almost_ right, but is broken for the overflow case.  The
      strcmp() function should indeed return the sign of the difference
      between the first byte that differs, but the subtraction needs to be
      done in a wider type than 'char'.  Otherwise the ordering isn't actually
      stable.
      
      This went unnoticed for basically forever, because nobody ever cares
      about non-US-ASCII orderings in the kernel (in fact, most users only
      care about "exact match or not"), so overflows don't really happen in
      practice, even if it was very very wrong.
      
      But that mostly unnoticeable bug becomes very noticeable by the recent
      change to make 'char' be unsigned in the kernel across all architectures
      (commit 3bc753c0: "kbuild: treat char as always unsigned"). Because
      the code not only did the subtraction in the wrong type width, it also
      used 'char' to then make the compiler expand the result from an 8-bit
      difference to the 'int' return value.
      
      So now with an unsigned char that incorrect arithmetic width was then
      not even sign-expanded, and always returned just a positive integer.
      
      We could re-instate the old broken code by just turning the 'char' into
      'signed char' as has been done elsewhere where people depended on the
      signedness of 'char', but since the whole function was broken to begin
      with, and we have a non-broken default fallback implementation, let's
      just remove this broken function entirely.
      Reported-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Link: https://lore.kernel.org/lkml/20221221145332.GA2399037@roeck-us.net/
      Cc: Jason Donenfeld <Jason@zx2c4.com>
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      7c084612
    • Linus Torvalds's avatar
      Merge tag 'net-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net · 609d3bc6
      Linus Torvalds authored
      Pull networking fixes from Jakub Kicinski:
       "Including fixes from bpf, netfilter and can.
      
        Current release - regressions:
      
         - bpf: synchronize dispatcher update with bpf_dispatcher_xdp_func
      
         - rxrpc:
            - fix security setting propagation
            - fix null-deref in rxrpc_unuse_local()
            - fix switched parameters in peer tracing
      
        Current release - new code bugs:
      
         - rxrpc:
            - fix I/O thread startup getting skipped
            - fix locking issues in rxrpc_put_peer_locked()
            - fix I/O thread stop
            - fix uninitialised variable in rxperf server
            - fix the return value of rxrpc_new_incoming_call()
      
         - microchip: vcap: fix initialization of value and mask
      
         - nfp: fix unaligned io read of capabilities word
      
        Previous releases - regressions:
      
         - stop in-kernel socket users from corrupting socket's task_frag
      
         - stream: purge sk_error_queue in sk_stream_kill_queues()
      
         - openvswitch: fix flow lookup to use unmasked key
      
         - dsa: mv88e6xxx: avoid reg_lock deadlock in mv88e6xxx_setup_port()
      
         - devlink:
            - hold region lock when flushing snapshots
            - protect devlink dump by the instance lock
      
        Previous releases - always broken:
      
         - bpf:
            - prevent leak of lsm program after failed attach
            - resolve fext program type when checking map compatibility
      
         - skbuff: account for tail adjustment during pull operations
      
         - macsec: fix net device access prior to holding a lock
      
         - bonding: switch back when high prio link up
      
         - netfilter: flowtable: really fix NAT IPv6 offload
      
         - enetc: avoid buffer leaks on xdp_do_redirect() failure
      
         - unix: fix race in SOCK_SEQPACKET's unix_dgram_sendmsg()
      
         - dsa: microchip: remove IRQF_TRIGGER_FALLING in
           request_threaded_irq"
      
      * tag 'net-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (64 commits)
        net: fec: check the return value of build_skb()
        net: simplify sk_page_frag
        Treewide: Stop corrupting socket's task_frag
        net: Introduce sk_use_task_frag in struct sock.
        mctp: Remove device type check at unregister
        net: dsa: microchip: remove IRQF_TRIGGER_FALLING in request_threaded_irq
        can: kvaser_usb: hydra: help gcc-13 to figure out cmd_len
        can: flexcan: avoid unbalanced pm_runtime_enable warning
        Documentation: devlink: add missing toc entry for etas_es58x devlink doc
        mctp: serial: Fix starting value for frame check sequence
        nfp: fix unaligned io read of capabilities word
        net: stream: purge sk_error_queue in sk_stream_kill_queues()
        myri10ge: Fix an error handling path in myri10ge_probe()
        net: microchip: vcap: Fix initialization of value and mask
        rxrpc: Fix the return value of rxrpc_new_incoming_call()
        rxrpc: rxperf: Fix uninitialised variable
        rxrpc: Fix I/O thread stop
        rxrpc: Fix switched parameters in peer tracing
        rxrpc: Fix locking issues in rxrpc_put_peer_locked()
        rxrpc: Fix I/O thread startup getting skipped
        ...
      609d3bc6
    • Linus Torvalds's avatar
      Merge tag 'fs.vfsuid.ima.v6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping · 878cf96f
      Linus Torvalds authored
      Pull vfsuid cleanup from Christian Brauner:
       "This moves the ima specific vfs{g,u}id_t comparison helpers out of the
        header and into the one file in ima where they are used.
      
        We shouldn't incentivize people to use them by placing them into the
        header. As discussed and suggested by Linus in [1] let's just define
        them locally in the one file in ima where they are used"
      
      Link: https://lore.kernel.org/lkml/CAHk-=wj4BpEwUd=OkTv1F9uykvSrsBNZJVHMp+p_+e2kiV71_A@mail.gmail.com [1]
      
      * tag 'fs.vfsuid.ima.v6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping:
        mnt_idmapping: move ima-only helpers to ima
      878cf96f
    • Linus Torvalds's avatar
      Merge tag 'random-6.2-rc1-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random · 222882c2
      Linus Torvalds authored
      Pull more random number generator updates from Jason Donenfeld:
       "Two remaining changes that are now possible after you merged a few
        other trees:
      
         - #include <asm/archrandom.h> can be removed from random.h now,
           making the direct use of the arch_random_* API more of a private
           implementation detail between the archs and random.c, rather than
           something for general consumers.
      
         - Two additional uses of prandom_u32_max() snuck in during the
           initial phase of pulls, so these have been converted to
           get_random_u32_below(), and now the deprecated prandom_u32_max()
           alias -- which was just a wrapper around get_random_u32_below() --
           can be removed.
      
        In addition, there is one fix:
      
         - Check efi_rt_services_supported() before attempting to use an EFI
           runtime function.
      
           This affected EFI systems that disable runtime services yet still
           boot via EFI (e.g. the reporter's Lenovo Thinkpad X13s laptop), as
           well systems where EFI runtime services have been forcibly
           disabled, such as on PREEMPT_RT.
      
           On those machines, a very early and hard to diagnose crash would
           happen, preventing boot"
      
      * tag 'random-6.2-rc1-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random:
        prandom: remove prandom_u32_max()
        efi: random: fix NULL-deref when refreshing seed
        random: do not include <asm/archrandom.h> from random.h
      222882c2
    • Linus Torvalds's avatar
      Merge tag 'rcu-urgent.2022.12.17a' of... · 19822e3e
      Linus Torvalds authored
      Merge tag 'rcu-urgent.2022.12.17a' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu
      
      Pull RCU fix from Paul McKenney:
       "This fixes a lockdep false positive in synchronize_rcu() that can
        otherwise occur during early boot.
      
        The fix simply avoids invoking lockdep if the scheduler has not yet
        been initialized, that is, during that portion of boot when interrupts
        are disabled"
      
      * tag 'rcu-urgent.2022.12.17a' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu:
        rcu: Don't assert interrupts enabled too early in boot
      19822e3e
    • Christian Brauner's avatar
      pnode: terminate at peers of source · 11933cf1
      Christian Brauner authored
      The propagate_mnt() function handles mount propagation when creating
      mounts and propagates the source mount tree @source_mnt to all
      applicable nodes of the destination propagation mount tree headed by
      @dest_mnt.
      
      Unfortunately it contains a bug where it fails to terminate at peers of
      @source_mnt when looking up copies of the source mount that become
      masters for copies of the source mount tree mounted on top of slaves in
      the destination propagation tree causing a NULL dereference.
      
      Once the mechanics of the bug are understood it's easy to trigger.
      Because of unprivileged user namespaces it is available to unprivileged
      users.
      
      While fixing this bug we've gotten confused multiple times due to
      unclear terminology or missing concepts. So let's start this with some
      clarifications:
      
      * The terms "master" or "peer" denote a shared mount. A shared mount
        belongs to a peer group.
      
      * A peer group is a set of shared mounts that propagate to each other.
        They are identified by a peer group id. The peer group id is available
        in @shared_mnt->mnt_group_id.
        Shared mounts within the same peer group have the same peer group id.
        The peers in a peer group can be reached via @shared_mnt->mnt_share.
      
      * The terms "slave mount" or "dependent mount" denote a mount that
        receives propagation from a peer in a peer group. IOW, shared mounts
        may have slave mounts and slave mounts have shared mounts as their
        master. Slave mounts of a given peer in a peer group are listed on
        that peers slave list available at @shared_mnt->mnt_slave_list.
      
      * The term "master mount" denotes a mount in a peer group. IOW, it
        denotes a shared mount or a peer mount in a peer group. The term
        "master mount" - or "master" for short - is mostly used when talking
        in the context of slave mounts that receive propagation from a master
        mount. A master mount of a slave identifies the closest peer group a
        slave mount receives propagation from. The master mount of a slave can
        be identified via @slave_mount->mnt_master. Different slaves may point
        to different masters in the same peer group.
      
      * Multiple peers in a peer group can have non-empty ->mnt_slave_lists.
        Non-empty ->mnt_slave_lists of peers don't intersect. Consequently, to
        ensure all slave mounts of a peer group are visited the
        ->mnt_slave_lists of all peers in a peer group have to be walked.
      
      * Slave mounts point to a peer in the closest peer group they receive
        propagation from via @slave_mnt->mnt_master (see above). Together with
        these peers they form a propagation group (see below). The closest
        peer group can thus be identified through the peer group id
        @slave_mnt->mnt_master->mnt_group_id of the peer/master that a slave
        mount receives propagation from.
      
      * A shared-slave mount is a slave mount to a peer group pg1 while also
        a peer in another peer group pg2. IOW, a peer group may receive
        propagation from another peer group.
      
        If a peer group pg1 is a slave to another peer group pg2 then all
        peers in peer group pg1 point to the same peer in peer group pg2 via
        ->mnt_master. IOW, all peers in peer group pg1 appear on the same
        ->mnt_slave_list. IOW, they cannot be slaves to different peer groups.
      
      * A pure slave mount is a slave mount that is a slave to a peer group
        but is not a peer in another peer group.
      
      * A propagation group denotes the set of mounts consisting of a single
        peer group pg1 and all slave mounts and shared-slave mounts that point
        to a peer in that peer group via ->mnt_master. IOW, all slave mounts
        such that @slave_mnt->mnt_master->mnt_group_id is equal to
        @shared_mnt->mnt_group_id.
      
        The concept of a propagation group makes it easier to talk about a
        single propagation level in a propagation tree.
      
        For example, in propagate_mnt() the immediate peers of @dest_mnt and
        all slaves of @dest_mnt's peer group form a propagation group propg1.
        So a shared-slave mount that is a slave in propg1 and that is a peer
        in another peer group pg2 forms another propagation group propg2
        together with all slaves that point to that shared-slave mount in
        their ->mnt_master.
      
      * A propagation tree refers to all mounts that receive propagation
        starting from a specific shared mount.
      
        For example, for propagate_mnt() @dest_mnt is the start of a
        propagation tree. The propagation tree ecompasses all mounts that
        receive propagation from @dest_mnt's peer group down to the leafs.
      
      With that out of the way let's get to the actual algorithm.
      
      We know that @dest_mnt is guaranteed to be a pure shared mount or a
      shared-slave mount. This is guaranteed by a check in
      attach_recursive_mnt(). So propagate_mnt() will first propagate the
      source mount tree to all peers in @dest_mnt's peer group:
      
      for (n = next_peer(dest_mnt); n != dest_mnt; n = next_peer(n)) {
              ret = propagate_one(n);
              if (ret)
                     goto out;
      }
      
      Notice, that the peer propagation loop of propagate_mnt() doesn't
      propagate @dest_mnt itself. @dest_mnt is mounted directly in
      attach_recursive_mnt() after we propagated to the destination
      propagation tree.
      
      The mount that will be mounted on top of @dest_mnt is @source_mnt. This
      copy was created earlier even before we entered attach_recursive_mnt()
      and doesn't concern us a lot here.
      
      It's just important to notice that when propagate_mnt() is called
      @source_mnt will not yet have been mounted on top of @dest_mnt. Thus,
      @source_mnt->mnt_parent will either still point to @source_mnt or - in
      the case @source_mnt is moved and thus already attached - still to its
      former parent.
      
      For each peer @M in @dest_mnt's peer group propagate_one() will create a
      new copy of the source mount tree and mount that copy @child on @M such
      that @child->mnt_parent points to @M after propagate_one() returns.
      
      propagate_one() will stash the last destination propagation node @M in
      @last_dest and the last copy it created for the source mount tree in
      @last_source.
      
      Hence, if we call into propagate_one() again for the next destination
      propagation node @M, @last_dest will point to the previous destination
      propagation node and @last_source will point to the previous copy of the
      source mount tree and mounted on @last_dest.
      
      Each new copy of the source mount tree is created from the previous copy
      of the source mount tree. This will become important later.
      
      The peer loop in propagate_mnt() is straightforward. We iterate through
      the peers copying and updating @last_source and @last_dest as we go
      through them and mount each copy of the source mount tree @child on a
      peer @M in @dest_mnt's peer group.
      
      After propagate_mnt() handled the peers in @dest_mnt's peer group
      propagate_mnt() will propagate the source mount tree down the
      propagation tree that @dest_mnt's peer group propagates to:
      
      for (m = next_group(dest_mnt, dest_mnt); m;
                      m = next_group(m, dest_mnt)) {
              /* everything in that slave group */
              n = m;
              do {
                      ret = propagate_one(n);
                      if (ret)
                              goto out;
                      n = next_peer(n);
              } while (n != m);
      }
      
      The next_group() helper will recursively walk the destination
      propagation tree, descending into each propagation group of the
      propagation tree.
      
      The important part is that it takes care to propagate the source mount
      tree to all peers in the peer group of a propagation group before it
      propagates to the slaves to those peers in the propagation group. IOW,
      it creates and mounts copies of the source mount tree that become
      masters before it creates and mounts copies of the source mount tree
      that become slaves to these masters.
      
      It is important to remember that propagating the source mount tree to
      each mount @M in the destination propagation tree simply means that we
      create and mount new copies @child of the source mount tree on @M such
      that @child->mnt_parent points to @M.
      
      Since we know that each node @M in the destination propagation tree
      headed by @dest_mnt's peer group will be overmounted with a copy of the
      source mount tree and since we know that the propagation properties of
      each copy of the source mount tree we create and mount at @M will mostly
      mirror the propagation properties of @M. We can use that information to
      create and mount the copies of the source mount tree that become masters
      before their slaves.
      
      The easy case is always when @M and @last_dest are peers in a peer group
      of a given propagation group. In that case we know that we can simply
      copy @last_source without having to figure out what the master for the
      new copy @child of the source mount tree needs to be as we've done that
      in a previous call to propagate_one().
      
      The hard case is when we're dealing with a slave mount or a shared-slave
      mount @M in a destination propagation group that we need to create and
      mount a copy of the source mount tree on.
      
      For each propagation group in the destination propagation tree we
      propagate the source mount tree to we want to make sure that the copies
      @child of the source mount tree we create and mount on slaves @M pick an
      ealier copy of the source mount tree that we mounted on a master @M of
      the destination propagation group as their master. This is a mouthful
      but as far as we can tell that's the core of it all.
      
      But, if we keep track of the masters in the destination propagation tree
      @M we can use the information to find the correct master for each copy
      of the source mount tree we create and mount at the slaves in the
      destination propagation tree @M.
      
      Let's walk through the base case as that's still fairly easy to grasp.
      
      If we're dealing with the first slave in the propagation group that
      @dest_mnt is in then we don't yet have marked any masters in the
      destination propagation tree.
      
      We know the master for the first slave to @dest_mnt's peer group is
      simple @dest_mnt. So we expect this algorithm to yield a copy of the
      source mount tree that was mounted on a peer in @dest_mnt's peer group
      as the master for the copy of the source mount tree we want to mount at
      the first slave @M:
      
      for (n = m; ; n = p) {
              p = n->mnt_master;
              if (p == dest_master || IS_MNT_MARKED(p))
                      break;
      }
      
      For the first slave we walk the destination propagation tree all the way
      up to a peer in @dest_mnt's peer group. IOW, the propagation hierarchy
      can be walked by walking up the @mnt->mnt_master hierarchy of the
      destination propagation tree @M. We will ultimately find a peer in
      @dest_mnt's peer group and thus ultimately @dest_mnt->mnt_master.
      
      Btw, here the assumption we listed at the beginning becomes important.
      Namely, that peers in a peer group pg1 that are slaves in another peer
      group pg2 appear on the same ->mnt_slave_list. IOW, all slaves who are
      peers in peer group pg1 point to the same peer in peer group pg2 via
      their ->mnt_master. Otherwise the termination condition in the code
      above would be wrong and next_group() would be broken too.
      
      So the first iteration sets:
      
      n = m;
      p = n->mnt_master;
      
      such that @p now points to a peer or @dest_mnt itself. We walk up one
      more level since we don't have any marked mounts. So we end up with:
      
      n = dest_mnt;
      p = dest_mnt->mnt_master;
      
      If @dest_mnt's peer group is not slave to another peer group then @p is
      now NULL. If @dest_mnt's peer group is a slave to another peer group
      then @p now points to @dest_mnt->mnt_master points which is a master
      outside the propagation tree we're dealing with.
      
      Now we need to figure out the master for the copy of the source mount
      tree we're about to create and mount on the first slave of @dest_mnt's
      peer group:
      
      do {
              struct mount *parent = last_source->mnt_parent;
              if (last_source == first_source)
                      break;
              done = parent->mnt_master == p;
              if (done && peers(n, parent))
                      break;
              last_source = last_source->mnt_master;
      } while (!done);
      
      We know that @last_source->mnt_parent points to @last_dest and
      @last_dest is the last peer in @dest_mnt's peer group we propagated to
      in the peer loop in propagate_mnt().
      
      Consequently, @last_source is the last copy we created and mount on that
      last peer in @dest_mnt's peer group. So @last_source is the master we
      want to pick.
      
      We know that @last_source->mnt_parent->mnt_master points to
      @last_dest->mnt_master. We also know that @last_dest->mnt_master is
      either NULL or points to a master outside of the destination propagation
      tree and so does @p. Hence:
      
      done = parent->mnt_master == p;
      
      is trivially true in the base condition.
      
      We also know that for the first slave mount of @dest_mnt's peer group
      that @last_dest either points @dest_mnt itself because it was
      initialized to:
      
      last_dest = dest_mnt;
      
      at the beginning of propagate_mnt() or it will point to a peer of
      @dest_mnt in its peer group. In both cases it is guaranteed that on the
      first iteration @n and @parent are peers (Please note the check for
      peers here as that's important.):
      
      if (done && peers(n, parent))
              break;
      
      So, as we expected, we select @last_source, which referes to the last
      copy of the source mount tree we mounted on the last peer in @dest_mnt's
      peer group, as the master of the first slave in @dest_mnt's peer group.
      The rest is taken care of by clone_mnt(last_source, ...). We'll skip
      over that part otherwise this becomes a blogpost.
      
      At the end of propagate_mnt() we now mark @m->mnt_master as the first
      master in the destination propagation tree that is distinct from
      @dest_mnt->mnt_master. IOW, we mark @dest_mnt itself as a master.
      
      By marking @dest_mnt or one of it's peers we are able to easily find it
      again when we later lookup masters for other copies of the source mount
      tree we mount copies of the source mount tree on slaves @M to
      @dest_mnt's peer group. This, in turn allows us to find the master we
      selected for the copies of the source mount tree we mounted on master in
      the destination propagation tree again.
      
      The important part is to realize that the code makes use of the fact
      that the last copy of the source mount tree stashed in @last_source was
      mounted on top of the previous destination propagation node @last_dest.
      What this means is that @last_source allows us to walk the destination
      propagation hierarchy the same way each destination propagation node @M
      does.
      
      If we take @last_source, which is the copy of @source_mnt we have
      mounted on @last_dest in the previous iteration of propagate_one(), then
      we know @last_source->mnt_parent points to @last_dest but we also know
      that as we walk through the destination propagation tree that
      @last_source->mnt_master will point to an earlier copy of the source
      mount tree we mounted one an earlier destination propagation node @M.
      
      IOW, @last_source->mnt_parent will be our hook into the destination
      propagation tree and each consecutive @last_source->mnt_master will lead
      us to an earlier propagation node @M via
      @last_source->mnt_master->mnt_parent.
      
      Hence, by walking up @last_source->mnt_master, each of which is mounted
      on a node that is a master @M in the destination propagation tree we can
      also walk up the destination propagation hierarchy.
      
      So, for each new destination propagation node @M we use the previous
      copy of @last_source and the fact it's mounted on the previous
      propagation node @last_dest via @last_source->mnt_master->mnt_parent to
      determine what the master of the new copy of @last_source needs to be.
      
      The goal is to find the _closest_ master that the new copy of the source
      mount tree we are about to create and mount on a slave @M in the
      destination propagation tree needs to pick. IOW, we want to find a
      suitable master in the propagation group.
      
      As the propagation structure of the source mount propagation tree we
      create mirrors the propagation structure of the destination propagation
      tree we can find @M's closest master - i.e., a marked master - which is
      a peer in the closest peer group that @M receives propagation from. We
      store that closest master of @M in @p as before and record the slave to
      that master in @n
      
      We then search for this master @p via @last_source by walking up the
      master hierarchy starting from the last copy of the source mount tree
      stored in @last_source that we created and mounted on the previous
      destination propagation node @M.
      
      We will try to find the master by walking @last_source->mnt_master and
      by comparing @last_source->mnt_master->mnt_parent->mnt_master to @p. If
      we find @p then we can figure out what earlier copy of the source mount
      tree needs to be the master for the new copy of the source mount tree
      we're about to create and mount at the current destination propagation
      node @M.
      
      If @last_source->mnt_master->mnt_parent and @n are peers then we know
      that the closest master they receive propagation from is
      @last_source->mnt_master->mnt_parent->mnt_master. If not then the
      closest immediate peer group that they receive propagation from must be
      one level higher up.
      
      This builds on the earlier clarification at the beginning that all peers
      in a peer group which are slaves of other peer groups all point to the
      same ->mnt_master, i.e., appear on the same ->mnt_slave_list, of the
      closest peer group that they receive propagation from.
      
      However, terminating the walk has corner cases.
      
      If the closest marked master for a given destination node @M cannot be
      found by walking up the master hierarchy via @last_source->mnt_master
      then we need to terminate the walk when we encounter @source_mnt again.
      
      This isn't an arbitrary termination. It simply means that the new copy
      of the source mount tree we're about to create has a copy of the source
      mount tree we created and mounted on a peer in @dest_mnt's peer group as
      its master. IOW, @source_mnt is the peer in the closest peer group that
      the new copy of the source mount tree receives propagation from.
      
      We absolutely have to stop @source_mnt because @last_source->mnt_master
      either points outside the propagation hierarchy we're dealing with or it
      is NULL because @source_mnt isn't a shared-slave.
      
      So continuing the walk past @source_mnt would cause a NULL dereference
      via @last_source->mnt_master->mnt_parent. And so we have to stop the
      walk when we encounter @source_mnt again.
      
      One scenario where this can happen is when we first handled a series of
      slaves of @dest_mnt's peer group and then encounter peers in a new peer
      group that is a slave to @dest_mnt's peer group. We handle them and then
      we encounter another slave mount to @dest_mnt that is a pure slave to
      @dest_mnt's peer group. That pure slave will have a peer in @dest_mnt's
      peer group as its master. Consequently, the new copy of the source mount
      tree will need to have @source_mnt as it's master. So we walk the
      propagation hierarchy all the way up to @source_mnt based on
      @last_source->mnt_master.
      
      So terminate on @source_mnt, easy peasy. Except, that the check misses
      something that the rest of the algorithm already handles.
      
      If @dest_mnt has peers in it's peer group the peer loop in
      propagate_mnt():
      
      for (n = next_peer(dest_mnt); n != dest_mnt; n = next_peer(n)) {
              ret = propagate_one(n);
              if (ret)
                      goto out;
      }
      
      will consecutively update @last_source with each previous copy of the
      source mount tree we created and mounted at the previous peer in
      @dest_mnt's peer group. So after that loop terminates @last_source will
      point to whatever copy of the source mount tree was created and mounted
      on the last peer in @dest_mnt's peer group.
      
      Furthermore, if there is even a single additional peer in @dest_mnt's
      peer group then @last_source will __not__ point to @source_mnt anymore.
      Because, as we mentioned above, @dest_mnt isn't even handled in this
      loop but directly in attach_recursive_mnt(). So it can't even accidently
      come last in that peer loop.
      
      So the first time we handle a slave mount @M of @dest_mnt's peer group
      the copy of the source mount tree we create will make the __last copy of
      the source mount tree we created and mounted on the last peer in
      @dest_mnt's peer group the master of the new copy of the source mount
      tree we create and mount on the first slave of @dest_mnt's peer group__.
      
      But this means that the termination condition that checks for
      @source_mnt is wrong. The @source_mnt cannot be found anymore by
      propagate_one(). Instead it will find the last copy of the source mount
      tree we created and mounted for the last peer of @dest_mnt's peer group
      again. And that is a peer of @source_mnt not @source_mnt itself.
      
      IOW, we fail to terminate the loop correctly and ultimately dereference
      @last_source->mnt_master->mnt_parent. When @source_mnt's peer group
      isn't slave to another peer group then @last_source->mnt_master is NULL
      causing the splat below.
      
      For example, assume @dest_mnt is a pure shared mount and has three peers
      in its peer group:
      
      ===================================================================================
                                               mount-id   mount-parent-id   peer-group-id
      ===================================================================================
      (@dest_mnt) mnt_master[216]              309        297               shared:216
          \
           (@source_mnt) mnt_master[218]:      609        609               shared:218
      
      (1) mnt_master[216]:                     607        605               shared:216
          \
           (P1) mnt_master[218]:               624        607               shared:218
      
      (2) mnt_master[216]:                     576        574               shared:216
          \
           (P2) mnt_master[218]:               625        576               shared:218
      
      (3) mnt_master[216]:                     545        543               shared:216
          \
           (P3) mnt_master[218]:               626        545               shared:218
      
      After this sequence has been processed @last_source will point to (P3),
      the copy generated for the third peer in @dest_mnt's peer group we
      handled. So the copy of the source mount tree (P4) we create and mount
      on the first slave of @dest_mnt's peer group:
      
      ===================================================================================
                                               mount-id   mount-parent-id   peer-group-id
      ===================================================================================
          mnt_master[216]                      309        297               shared:216
         /
        /
      (S0) mnt_slave                           483        481               master:216
        \
         \    (P3) mnt_master[218]             626        545               shared:218
          \  /
           \/
          (P4) mnt_slave                       627        483               master:218
      
      will pick the last copy of the source mount tree (P3) as master, not (S0).
      
      When walking the propagation hierarchy via @last_source's master
      hierarchy we encounter (P3) but not (S0), i.e., @source_mnt.
      
      We can fix this in multiple ways:
      
      (1) By setting @last_source to @source_mnt after we processed the peers
          in @dest_mnt's peer group right after the peer loop in
          propagate_mnt().
      
      (2) By changing the termination condition that relies on finding exactly
          @source_mnt to finding a peer of @source_mnt.
      
      (3) By only moving @last_source when we actually venture into a new peer
          group or some clever variant thereof.
      
      The first two options are minimally invasive and what we want as a fix.
      The third option is more intrusive but something we'd like to explore in
      the near future.
      
      This passes all LTP tests and specifically the mount propagation
      testsuite part of it. It also holds up against all known reproducers of
      this issues.
      
      Final words.
      First, this is a clever but __worringly__ underdocumented algorithm.
      There isn't a single detailed comment to be found in next_group(),
      propagate_one() or anywhere else in that file for that matter. This has
      been a giant pain to understand and work through and a bug like this is
      insanely difficult to fix without a detailed understanding of what's
      happening. Let's not talk about the amount of time that was sunk into
      fixing this.
      
      Second, all the cool kids with access to
      unshare --mount --user --map-root --propagation=unchanged
      are going to have a lot of fun. IOW, triggerable by unprivileged users
      while namespace_lock() lock is held.
      
      [  115.848393] BUG: kernel NULL pointer dereference, address: 0000000000000010
      [  115.848967] #PF: supervisor read access in kernel mode
      [  115.849386] #PF: error_code(0x0000) - not-present page
      [  115.849803] PGD 0 P4D 0
      [  115.850012] Oops: 0000 [#1] PREEMPT SMP PTI
      [  115.850354] CPU: 0 PID: 15591 Comm: mount Not tainted 6.1.0-rc7 #3
      [  115.850851] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS
      VirtualBox 12/01/2006
      [  115.851510] RIP: 0010:propagate_one.part.0+0x7f/0x1a0
      [  115.851924] Code: 75 eb 4c 8b 05 c2 25 37 02 4c 89 ca 48 8b 4a 10
      49 39 d0 74 1e 48 3b 81 e0 00 00 00 74 26 48 8b 92 e0 00 00 00 be 01
      00 00 00 <48> 8b 4a 10 49 39 d0 75 e2 40 84 f6 74 38 4c 89 05 84 25 37
      02 4d
      [  115.853441] RSP: 0018:ffffb8d5443d7d50 EFLAGS: 00010282
      [  115.853865] RAX: ffff8e4d87c41c80 RBX: ffff8e4d88ded780 RCX: ffff8e4da4333a00
      [  115.854458] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8e4d88ded780
      [  115.855044] RBP: ffff8e4d88ded780 R08: ffff8e4da4338000 R09: ffff8e4da43388c0
      [  115.855693] R10: 0000000000000002 R11: ffffb8d540158000 R12: ffffb8d5443d7da8
      [  115.856304] R13: ffff8e4d88ded780 R14: 0000000000000000 R15: 0000000000000000
      [  115.856859] FS:  00007f92c90c9800(0000) GS:ffff8e4dfdc00000(0000)
      knlGS:0000000000000000
      [  115.857531] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  115.858006] CR2: 0000000000000010 CR3: 0000000022f4c002 CR4: 00000000000706f0
      [  115.858598] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  115.859393] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [  115.860099] Call Trace:
      [  115.860358]  <TASK>
      [  115.860535]  propagate_mnt+0x14d/0x190
      [  115.860848]  attach_recursive_mnt+0x274/0x3e0
      [  115.861212]  path_mount+0x8c8/0xa60
      [  115.861503]  __x64_sys_mount+0xf6/0x140
      [  115.861819]  do_syscall_64+0x5b/0x80
      [  115.862117]  ? do_faccessat+0x123/0x250
      [  115.862435]  ? syscall_exit_to_user_mode+0x17/0x40
      [  115.862826]  ? do_syscall_64+0x67/0x80
      [  115.863133]  ? syscall_exit_to_user_mode+0x17/0x40
      [  115.863527]  ? do_syscall_64+0x67/0x80
      [  115.863835]  ? do_syscall_64+0x67/0x80
      [  115.864144]  ? do_syscall_64+0x67/0x80
      [  115.864452]  ? exc_page_fault+0x70/0x170
      [  115.864775]  entry_SYSCALL_64_after_hwframe+0x63/0xcd
      [  115.865187] RIP: 0033:0x7f92c92b0ebe
      [  115.865480] Code: 48 8b 0d 75 4f 0c 00 f7 d8 64 89 01 48 83 c8 ff
      c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 49 89 ca b8 a5 00 00
      00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 42 4f 0c 00 f7 d8 64 89
      01 48
      [  115.866984] RSP: 002b:00007fff000aa728 EFLAGS: 00000246 ORIG_RAX:
      00000000000000a5
      [  115.867607] RAX: ffffffffffffffda RBX: 000055a77888d6b0 RCX: 00007f92c92b0ebe
      [  115.868240] RDX: 000055a77888d8e0 RSI: 000055a77888e6e0 RDI: 000055a77888e620
      [  115.868823] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000001
      [  115.869403] R10: 0000000000001000 R11: 0000000000000246 R12: 000055a77888e620
      [  115.869994] R13: 000055a77888d8e0 R14: 00000000ffffffff R15: 00007f92c93e4076
      [  115.870581]  </TASK>
      [  115.870763] Modules linked in: nft_fib_inet nft_fib_ipv4
      nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6
      nft_reject nft_ct nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6
      nf_defrag_ipv4 ip_set rfkill nf_tables nfnetlink qrtr snd_intel8x0
      sunrpc snd_ac97_codec ac97_bus snd_pcm snd_timer intel_rapl_msr
      intel_rapl_common snd vboxguest intel_powerclamp video rapl joydev
      soundcore i2c_piix4 wmi fuse zram xfs vmwgfx crct10dif_pclmul
      crc32_pclmul crc32c_intel polyval_clmulni polyval_generic
      drm_ttm_helper ttm e1000 ghash_clmulni_intel serio_raw ata_generic
      pata_acpi scsi_dh_rdac scsi_dh_emc scsi_dh_alua dm_multipath
      [  115.875288] CR2: 0000000000000010
      [  115.875641] ---[ end trace 0000000000000000 ]---
      [  115.876135] RIP: 0010:propagate_one.part.0+0x7f/0x1a0
      [  115.876551] Code: 75 eb 4c 8b 05 c2 25 37 02 4c 89 ca 48 8b 4a 10
      49 39 d0 74 1e 48 3b 81 e0 00 00 00 74 26 48 8b 92 e0 00 00 00 be 01
      00 00 00 <48> 8b 4a 10 49 39 d0 75 e2 40 84 f6 74 38 4c 89 05 84 25 37
      02 4d
      [  115.878086] RSP: 0018:ffffb8d5443d7d50 EFLAGS: 00010282
      [  115.878511] RAX: ffff8e4d87c41c80 RBX: ffff8e4d88ded780 RCX: ffff8e4da4333a00
      [  115.879128] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8e4d88ded780
      [  115.879715] RBP: ffff8e4d88ded780 R08: ffff8e4da4338000 R09: ffff8e4da43388c0
      [  115.880359] R10: 0000000000000002 R11: ffffb8d540158000 R12: ffffb8d5443d7da8
      [  115.880962] R13: ffff8e4d88ded780 R14: 0000000000000000 R15: 0000000000000000
      [  115.881548] FS:  00007f92c90c9800(0000) GS:ffff8e4dfdc00000(0000)
      knlGS:0000000000000000
      [  115.882234] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  115.882713] CR2: 0000000000000010 CR3: 0000000022f4c002 CR4: 00000000000706f0
      [  115.883314] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  115.883966] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      
      Fixes: f2ebb3a9 ("smarter propagate_mnt()")
      Fixes: 5ec0811d ("propogate_mnt: Handle the first propogated copy being a slave")
      Cc: <stable@vger.kernel.org>
      Reported-by: default avatarDitang Chen <ditang.c@gmail.com>
      Signed-off-by: default avatarSeth Forshee (Digital Ocean) <sforshee@kernel.org>
      Signed-off-by: default avatarChristian Brauner (Microsoft) <brauner@kernel.org>
      ---
      If there are no big objections I'll get this to Linus rather sooner than later.
      11933cf1
  3. 20 Dec, 2022 20 commits
    • Wei Fang's avatar
      net: fec: check the return value of build_skb() · 19e72b06
      Wei Fang authored
      The build_skb might return a null pointer but there is no check on the
      return value in the fec_enet_rx_queue(). So a null pointer dereference
      might occur. To avoid this, we check the return value of build_skb. If
      the return value is a null pointer, the driver will recycle the page and
      update the statistic of ndev. Then jump to rx_processing_done to clear
      the status flags of the BD so that the hardware can recycle the BD.
      
      Fixes: 95698ff6 ("net: fec: using page pool to manage RX buffers")
      Signed-off-by: default avatarWei Fang <wei.fang@nxp.com>
      Reviewed-by: default avatarShenwei Wang <Shenwei.wang@nxp.com>
      Reviewed-by: default avatarAlexander Duyck <alexanderduyck@fb.com>
      Link: https://lore.kernel.org/r/20221219022755.1047573-1-wei.fang@nxp.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      19e72b06
    • Linus Torvalds's avatar
      Merge tag 'm68knommu-for-v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu · b6bb9676
      Linus Torvalds authored
      Pull m68knommu update from Greg Ungerer:
       "Only a single change to use the safer strscpy() instead of strncpy()
        when setting up the cmdline"
      
      * tag 'm68knommu-for-v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu:
        m68k: use strscpy() to instead of strncpy()
      b6bb9676
    • Linus Torvalds's avatar
      Merge tag 'spdx-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/spdx · 32d528c4
      Linus Torvalds authored
      Pull SPDX/License additions from Greg KH:
       "Here are two small updates for LICENSES and some kernel files that add
        the Copyleft-next license and use it in a SPDX tag as a dual-license
        for some kernel files.
      
        These have been discussed thoroughly in public on the linux-spdx
        mailing list, and have the needed acks on them, as well as having been
        in linux-next with no reported issues for quite some time"
      
      * tag 'spdx-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/spdx:
        testing: use the copyleft-next-0.3.1 SPDX tag
        LICENSES: Add the copyleft-next-0.3.1 license
      32d528c4
    • Linus Torvalds's avatar
      Merge tag 'devicetree-for-6.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux · 3e0caea7
      Linus Torvalds authored
      Pull more devicetree updates from Rob Herring:
       "This is mostly a treewide clean-up from Krzysztof. There's also a
        couple of fixes and things that fell thru the cracks.
      
        I must say this has been a nice merge window without bindings dumped
        in at the last minute introducing warnings.
      
        Summary:
      
         - Treewide dropping of redundant 'binding' or 'schema' from schema
           titles. This will be followed up with a automated check to catch
           these.
      
         - Re-sort vendor-prefies
      
         - Convert GPIO based watchdog to schema
      
         - Handle all the variations for clocks, resets, power domains in i.MX
           PCIe binding
      
         - Document missing 'power-domains' property in mxsfb
      
         - Fix error with path references in Tegra XUSB example
      
         - Honor CONFIG_CMDLINE* even without /chosen node"
      
      * tag 'devicetree-for-6.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux:
        dt-bindings: drop redundant part of title (manual)
        dt-bindings: clock: drop redundant part of title
        dt-bindings: drop redundant part of title (beginning)
        dt-bindings: drop redundant part of title (end, part three)
        dt-bindings: drop redundant part of title (end, part two)
        dt-bindings: drop redundant part of title (end)
        dt-bindings: clock: st,stm32mp1-rcc: add proper title
        dt-bindings: memory-controllers: ti,gpmc-child: drop redundant part of title
        dt-bindings: drop redundant part of title of shared bindings
        dt-bindings: watchdog: gpio: Convert bindings to YAML
        dt-bindings: imx6q-pcie: Handle more resets on legacy platforms
        dt-bindings: imx6q-pcie: Handle various PD configurations
        dt-bindings: imx6q-pcie: Handle various clock configurations
        dt-bindings: hwmon: ntc-thermistor: drop Naveen Krishna Chatradhi from maintainers
        dt-bindings: mxsfb: Document i.MX8M/i.MX6SX/i.MX6SL power-domains property
        dt-bindings: vendor-prefixes: sort entries alphabetically
        dt-bindings: usb: tegra-xusb: Remove path references
        of: fdt: Honor CONFIG_CMDLINE* even without /chosen node
      3e0caea7
    • Linus Torvalds's avatar
      Merge tag 'parisc-for-6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux · 35f79d0e
      Linus Torvalds authored
      Pull parisc updates from Helge Deller:
       "There is one noteable patch, which allows the parisc kernel to use the
        same MADV_xxx constants as the other architectures going forward. With
        that change only alpha has one entry left (MADV_DONTNEED is 6 vs 4 on
        others) which is different. To prevent an ABI breakage, a wrapper is
        included which translates old MADV values to the new ones, so existing
        userspace isn't affected. Reason for that patch is, that some
        applications wrongly used the standard MADV_xxx values even on some
        non-x86 platforms and as such those programs failed to run correctly
        on parisc (examples are qemu-user, tor browser and boringssl).
      
        Then the kgdb console and the LED code received some fixes, and some
        0-day warnings are now gone. Finally, the very last compile warning
        which was visible during a kernel build is now fixed too (in the vDSO
        code).
      
        The majority of the patches are tagged for stable series and in
        summary this patchset is quite small and drops more code than it adds:
      
      Fixes:
         - Fix potential null-ptr-deref in start_task()
         - Fix kgdb console on serial port
         - Add missing FORCE prerequisites in Makefile
         - Drop PMD_SHIFT from calculation in pgtable.h
      
        Enhancements:
         - Implement a wrapper to align madvise() MADV_* constants with other
           architectures
         - If machine supports running MPE/XL, show the MPE model string
      
        Cleanups:
         - Drop duplicate kgdb console code
         - Indenting fixes in setup_cmdline()"
      
      * tag 'parisc-for-6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
        parisc: Show MPE/iX model string at bootup
        parisc: Add missing FORCE prerequisites in Makefile
        parisc: Move pdc_result struct to firmware.c
        parisc: Drop locking in pdc console code
        parisc: Drop duplicate kgdb_pdc console
        parisc: Fix locking in pdc_iodc_print() firmware call
        parisc: Drop PMD_SHIFT from calculation in pgtable.h
        parisc: Align parisc MADV_XXX constants with all other architectures
        parisc: led: Fix potential null-ptr-deref in start_task()
        parisc: Fix inconsistent indenting in setup_cmdline()
      35f79d0e
    • José Expósito's avatar
      HID: sony: Fix unused function warning · 54f27dc5
      José Expósito authored
      Compiling this driver without setting "CONFIG_SONY_FF" generates the
      following warning:
      
      	drivers/hid/hid-sony.c:2358:20: warning: unused function
      	'sony_send_output_report' [-Wunused-function]
      	static inline void sony_send_output_report(struct sony_sc *sc)
      	                   ^
      	1 warning generated.
      
      Add the missing preprocessor check to fix it.
      Signed-off-by: default avatarJosé Expósito <jose.exposito89@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      54f27dc5
    • Terry Junge's avatar
      HID: plantronics: Additional PIDs for double volume key presses quirk · 3d57f36c
      Terry Junge authored
      I no longer work for Plantronics (aka Poly, aka HP) and do not have
      access to the headsets in order to test. However, as noted by Maxim,
      the other 32xx models that share the same base code set as the 3220
      would need the same quirk. This patch adds the PIDs for the rest of
      the Blackwire 32XX product family that require the quirk.
      
      Plantronics Blackwire 3210 Series (047f:c055)
      Plantronics Blackwire 3215 Series (047f:c057)
      Plantronics Blackwire 3225 Series (047f:c058)
      
      Quote from previous patch by Maxim Mikityanskiy
      Plantronics Blackwire 3220 Series (047f:c056) sends HID reports twice
      for each volume key press. This patch adds a quirk to hid-plantronics
      for this product ID, which will ignore the second volume key press if
      it happens within 5 ms from the last one that was handled.
      
      The patch was tested on the mentioned model only, it shouldn't affect
      other models, however, this quirk might be needed for them too.
      Auto-repeat (when a key is held pressed) is not affected, because the
      rate is about 3 times per second, which is far less frequent than once
      in 5 ms.
      End quote
      Signed-off-by: default avatarTerry Junge <linuxhid@cosmicgizmosystems.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      3d57f36c
    • José Expósito's avatar
      HID: multitouch: fix Asus ExpertBook P2 P2451FA trackpoint · 4eab1c2f
      José Expósito authored
      The HID descriptor of this device contains two mouse collections, one
      for mouse emulation and the other for the trackpoint.
      
      Both collections get merged and, because the first one defines X and Y,
      the movemenent events reported by the trackpoint collection are
      ignored.
      
      Set the MT_CLS_WIN_8_FORCE_MULTI_INPUT class for this device to be able
      to receive its reports.
      
      This fix is similar to/based on commit 40d5bb87 ("HID: multitouch:
      enable multi-input as a quirk for some devices").
      
      Link: https://gitlab.freedesktop.org/libinput/libinput/-/issues/825Reported-by: default avatarAkito <the@akito.ooo>
      Tested-by: default avatarAkito <the@akito.ooo>
      Signed-off-by: default avatarJosé Expósito <jose.exposito89@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      4eab1c2f
    • José Expósito's avatar
      HID: Ignore HP Envy x360 eu0009nv stylus battery · cec827d6
      José Expósito authored
      Battery status is reported for the HP Envy x360 eu0009nv stylus even
      though it does not have battery.
      
      Prevent it from always reporting the battery as low (1%).
      
      Link: https://gitlab.freedesktop.org/libinput/libinput/-/issues/823Reported-by: default avatarIoannis Iliopoulos <jxftw2424@gmail.com>
      Tested-by: default avatarIoannis Iliopoulos <jxftw2424@gmail.com>
      Signed-off-by: default avatarJosé Expósito <jose.exposito89@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      cec827d6
    • Linus Torvalds's avatar
      Merge tag 'asm-generic-6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic · 70b07bec
      Linus Torvalds authored
      Pull asm-generic updates from Arnd Bergmann:
       "There are only three fairly simple patches.
      
        The #include change to linux/swab.h addresses a userspace build issue,
        and the change to the mmio tracing logic helps provide more useful
        traces"
      
      * tag 'asm-generic-6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic:
        uapi: Add missing _UAPI prefix to <asm-generic/types.h> include guard
        asm-generic/io: Add _RET_IP_ to MMIO trace for more accurate debug info
        include/uapi/linux/swab: Fix potentially missing __always_inline
      70b07bec
    • Jason Gerecke's avatar
      HID: wacom: Ensure bootloader PID is usable in hidraw mode · 1db1f392
      Jason Gerecke authored
      Some Wacom devices have a special "bootloader" mode that is used for
      firmware flashing. When operating in this mode, the device cannot be
      used for input, and the HID descriptor is not able to be processed by
      the driver. The driver generates an "Unknown device_type" warning and
      then returns an error code from wacom_probe(). This is a problem because
      userspace still needs to be able to interact with the device via hidraw
      to perform the firmware flash.
      
      This commit adds a non-generic device definition for 056a:0094 which
      is used when devices are in "bootloader" mode. It marks the devices
      with a special BOOTLOADER type that is recognized by wacom_probe() and
      wacom_raw_event(). When we see this type we ensure a hidraw device is
      created and otherwise keep our hands off so that userspace is in full
      control.
      Signed-off-by: default avatarJason Gerecke <jason.gerecke@wacom.com>
      Tested-by: default avatarTatsunosuke Tobita <tatsunosuke.tobita@wacom.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      1db1f392
    • Jiasheng Jiang's avatar
      HID: amd_sfh: Add missing check for dma_alloc_coherent · 53ffa6a9
      Jiasheng Jiang authored
      Add check for the return value of the dma_alloc_coherent since
      it may return NULL pointer if allocation fails.
      
      Fixes: 4b2c53d9 ("SFH:Transport Driver to add support of AMD Sensor Fusion Hub (SFH)")
      Signed-off-by: default avatarJiasheng Jiang <jiasheng@iscas.ac.cn>
      Acked-by: default avatarBasavaraj Natikar <Basavaraj.Natikar@amd.com>
      Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
      Link: https://lore.kernel.org/r/20221220024921.21992-1-jiasheng@iscas.ac.cn
      53ffa6a9
    • Jason A. Donenfeld's avatar
      prandom: remove prandom_u32_max() · 3c202d14
      Jason A. Donenfeld authored
      Convert the final two users of prandom_u32_max() that slipped in during
      6.2-rc1 to use get_random_u32_below().
      
      Then, with no more users left, we can finally remove the deprecated
      function.
      Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
      3c202d14
    • Johan Hovold's avatar
      efi: random: fix NULL-deref when refreshing seed · 41a15855
      Johan Hovold authored
      Do not try to refresh the RNG seed in case the firmware does not support
      setting variables.
      
      This is specifically needed to prevent a NULL-pointer dereference on the
      Lenovo X13s with some firmware revisions, or more generally, whenever
      the runtime services have been disabled (e.g. efi=noruntime or with
      PREEMPT_RT).
      
      Fixes: e7b813b3 ("efi: random: refresh non-volatile random seed when RNG is initialized")
      Reported-by: default avatarSteev Klimaszewski <steev@kali.org>
      Reported-by: default avatarBjorn Andersson <andersson@kernel.org>
      Tested-by: default avatarSteev Klimaszewski <steev@kali.org>
      Tested-by: Andrew Halaney <ahalaney@redhat.com> # sc8280xp-lenovo-thinkpad-x13s
      Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
      Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
      41a15855
    • Jason A. Donenfeld's avatar
      random: do not include <asm/archrandom.h> from random.h · 6bb20c15
      Jason A. Donenfeld authored
      The <asm/archrandom.h> header is a random.c private detail, not
      something to be called by other code. As such, don't make it
      automatically available by way of random.h.
      
      Cc: Michael Ellerman <mpe@ellerman.id.au>
      Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      Reviewed-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
      Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
      6bb20c15
    • Jakub Kicinski's avatar
      Merge tag 'linux-can-fixes-for-6.2-20221219' of... · 4be84df3
      Jakub Kicinski authored
      Merge tag 'linux-can-fixes-for-6.2-20221219' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
      
      Marc Kleine-Budde says:
      
      ====================
      pull-request: can 2022-12-19
      
      The first patch is by Vincent Mailhol and adds the etas_es58x
      devlink documentation to the index.
      
      Haibo Chen's patch for the flexcan driver fixes a unbalanced
      pm_runtime_enable warning.
      
      The last patch is by me, targets the kvaser_usb driver and fixes
      an error occurring with gcc-13.
      
      * tag 'linux-can-fixes-for-6.2-20221219' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can:
        can: kvaser_usb: hydra: help gcc-13 to figure out cmd_len
        can: flexcan: avoid unbalanced pm_runtime_enable warning
        Documentation: devlink: add missing toc entry for etas_es58x devlink doc
      ====================
      
      Link: https://lore.kernel.org/r/20221219155210.1143439-1-mkl@pengutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      4be84df3
    • Jakub Kicinski's avatar
      Merge branch 'stop-corrupting-socket-s-task_frag' · 918fb1aa
      Jakub Kicinski authored
      Benjamin Coddington says:
      
      ====================
      Stop corrupting socket's task_frag
      
      The networking code uses flags in sk_allocation to determine if it can use
      current->task_frag, however in-kernel users of sockets may stop setting
      sk_allocation when they convert to the preferred memalloc_nofs_save/restore,
      as SUNRPC has done in commit a1231fda ("SUNRPC: Set memalloc_nofs_save()
      on all rpciod/xprtiod jobs").
      
      This will cause corruption in current->task_frag when recursing into the
      network layer for those subsystems during page fault or reclaim.  The
      corruption is difficult to diagnose because stack traces may not contain the
      offending subsystem at all.  The corruption is unlikely to show up in
      testing because it requires memory pressure, and so subsystems that
      convert to memalloc_nofs_save/restore are likely to continue to run into
      this issue.
      
      Previous reports and proposed fixes:
      https://lore.kernel.org/netdev/96a18bd00cbc6cb554603cc0d6ef1c551965b078.1663762494.git.gnault@redhat.com/
      https://lore.kernel.org/netdev/b4d8cb09c913d3e34f853736f3f5628abfd7f4b6.1656699567.git.gnault@redhat.com/
      https://lore.kernel.org/linux-nfs/de6d99321d1dcaa2ad456b92b3680aa77c07a747.1665401788.git.gnault@redhat.com/
      
      Guilluame Nault has done all of the hard work tracking this problem down and
      finding the best fix for this issue.  I'm just taking a turn posting another
      fix.
      ====================
      
      Link: https://lore.kernel.org/r/cover.1671194454.git.bcodding@redhat.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      918fb1aa
    • Benjamin Coddington's avatar
      net: simplify sk_page_frag · 08f65892
      Benjamin Coddington authored
      Now that in-kernel socket users that may recurse during reclaim have benn
      converted to sk_use_task_frag = false, we can have sk_page_frag() simply
      check that value.
      Signed-off-by: default avatarBenjamin Coddington <bcodding@redhat.com>
      Reviewed-by: default avatarGuillaume Nault <gnault@redhat.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      08f65892
    • Benjamin Coddington's avatar
      Treewide: Stop corrupting socket's task_frag · 98123866
      Benjamin Coddington authored
      Since moving to memalloc_nofs_save/restore, SUNRPC has stopped setting the
      GFP_NOIO flag on sk_allocation which the networking system uses to decide
      when it is safe to use current->task_frag.  The results of this are
      unexpected corruption in task_frag when SUNRPC is involved in memory
      reclaim.
      
      The corruption can be seen in crashes, but the root cause is often
      difficult to ascertain as a crashing machine's stack trace will have no
      evidence of being near NFS or SUNRPC code.  I believe this problem to
      be much more pervasive than reports to the community may indicate.
      
      Fix this by having kernel users of sockets that may corrupt task_frag due
      to reclaim set sk_use_task_frag = false.  Preemptively correcting this
      situation for users that still set sk_allocation allows them to convert to
      memalloc_nofs_save/restore without the same unexpected corruptions that are
      sure to follow, unlikely to show up in testing, and difficult to bisect.
      
      CC: Philipp Reisner <philipp.reisner@linbit.com>
      CC: Lars Ellenberg <lars.ellenberg@linbit.com>
      CC: "Christoph Böhmwalder" <christoph.boehmwalder@linbit.com>
      CC: Jens Axboe <axboe@kernel.dk>
      CC: Josef Bacik <josef@toxicpanda.com>
      CC: Keith Busch <kbusch@kernel.org>
      CC: Christoph Hellwig <hch@lst.de>
      CC: Sagi Grimberg <sagi@grimberg.me>
      CC: Lee Duncan <lduncan@suse.com>
      CC: Chris Leech <cleech@redhat.com>
      CC: Mike Christie <michael.christie@oracle.com>
      CC: "James E.J. Bottomley" <jejb@linux.ibm.com>
      CC: "Martin K. Petersen" <martin.petersen@oracle.com>
      CC: Valentina Manea <valentina.manea.m@gmail.com>
      CC: Shuah Khan <shuah@kernel.org>
      CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      CC: David Howells <dhowells@redhat.com>
      CC: Marc Dionne <marc.dionne@auristor.com>
      CC: Steve French <sfrench@samba.org>
      CC: Christine Caulfield <ccaulfie@redhat.com>
      CC: David Teigland <teigland@redhat.com>
      CC: Mark Fasheh <mark@fasheh.com>
      CC: Joel Becker <jlbec@evilplan.org>
      CC: Joseph Qi <joseph.qi@linux.alibaba.com>
      CC: Eric Van Hensbergen <ericvh@gmail.com>
      CC: Latchesar Ionkov <lucho@ionkov.net>
      CC: Dominique Martinet <asmadeus@codewreck.org>
      CC: Ilya Dryomov <idryomov@gmail.com>
      CC: Xiubo Li <xiubli@redhat.com>
      CC: Chuck Lever <chuck.lever@oracle.com>
      CC: Jeff Layton <jlayton@kernel.org>
      CC: Trond Myklebust <trond.myklebust@hammerspace.com>
      CC: Anna Schumaker <anna@kernel.org>
      CC: Steffen Klassert <steffen.klassert@secunet.com>
      CC: Herbert Xu <herbert@gondor.apana.org.au>
      Suggested-by: default avatarGuillaume Nault <gnault@redhat.com>
      Signed-off-by: default avatarBenjamin Coddington <bcodding@redhat.com>
      Reviewed-by: default avatarGuillaume Nault <gnault@redhat.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      98123866
    • Guillaume Nault's avatar
      net: Introduce sk_use_task_frag in struct sock. · fb87bd47
      Guillaume Nault authored
      Sockets that can be used while recursing into memory reclaim, like
      those used by network block devices and file systems, mustn't use
      current->task_frag: if the current process is already using it, then
      the inner memory reclaim call would corrupt the task_frag structure.
      
      To avoid this, sk_page_frag() uses ->sk_allocation to detect sockets
      that mustn't use current->task_frag, assuming that those used during
      memory reclaim had their allocation constraints reflected in
      ->sk_allocation.
      
      This unfortunately doesn't cover all cases: in an attempt to remove all
      usage of GFP_NOFS and GFP_NOIO, sunrpc stopped setting these flags in
      ->sk_allocation, and used memalloc_nofs critical sections instead.
      This breaks the sk_page_frag() heuristic since the allocation
      constraints are now stored in current->flags, which sk_page_frag()
      can't read without risking triggering a cache miss and slowing down
      TCP's fast path.
      
      This patch creates a new field in struct sock, named sk_use_task_frag,
      which sockets with memory reclaim constraints can set to false if they
      can't safely use current->task_frag. In such cases, sk_page_frag() now
      always returns the socket's page_frag (->sk_frag). The first user is
      sunrpc, which needs to avoid using current->task_frag but can keep
      ->sk_allocation set to GFP_KERNEL otherwise.
      
      Eventually, it might be possible to simplify sk_page_frag() by only
      testing ->sk_use_task_frag and avoid relying on the ->sk_allocation
      heuristic entirely (assuming other sockets will set ->sk_use_task_frag
      according to their constraints in the future).
      
      The new ->sk_use_task_frag field is placed in a hole in struct sock and
      belongs to a cache line shared with ->sk_shutdown. Therefore it should
      be hot and shouldn't have negative performance impacts on TCP's fast
      path (sk_shutdown is tested just before the while() loop in
      tcp_sendmsg_locked()).
      
      Link: https://lore.kernel.org/netdev/b4d8cb09c913d3e34f853736f3f5628abfd7f4b6.1656699567.git.gnault@redhat.com/Signed-off-by: default avatarGuillaume Nault <gnault@redhat.com>
      Reviewed-by: default avatarBenjamin Coddington <bcodding@redhat.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      fb87bd47