[PATCH RFC 00/33] Compile-time thread-safety checking

Bart Van Assche posted 33 patches 10 months, 1 week ago
Documentation/locking/mutex-design.rst        |   2 +-
arch/arm64/kvm/arm.c                          |   2 +
arch/powerpc/kernel/rtas.c                    |   1 +
arch/powerpc/platforms/powermac/low_i2c.c     |   6 +
arch/powerpc/platforms/pseries/papr-vpd.c     |   2 +
arch/x86/events/core.c                        |   1 +
arch/x86/kernel/cpu/resctrl/pseudo_lock.c     |   1 +
arch/x86/kernel/cpu/resctrl/rdtgroup.c        |   2 +
arch/x86/kernel/cpu/sgx/encl.c                |   2 +
arch/x86/kernel/ftrace.c                      |   2 +
arch/x86/kernel/module.c                      |   1 +
arch/x86/kvm/svm/sev.c                        |   6 +
block/bdev.c                                  |   3 +
block/blk-cgroup.c                            |   2 +
block/ioctl.c                                 |   1 +
drivers/accel/amdxdna/aie2_error.c            |   5 +-
drivers/accel/qaic/qaic_control.c             |   1 +
drivers/acpi/scan.c                           |   5 +
drivers/ata/libata-core.c                     |  31 +++-
drivers/ata/libata-eh.c                       |   2 +
drivers/ata/libata.h                          |   6 +-
drivers/base/bus.c                            |   1 +
drivers/base/core.c                           |   7 +
drivers/base/dd.c                             |   2 +
drivers/base/power/clock_ops.c                |   4 +
drivers/base/power/main.c                     |   2 +
drivers/base/regmap/regmap-irq.c              |   2 +
drivers/base/regmap/regmap.c                  |   2 +
drivers/block/drbd/drbd_bitmap.c              |   2 +
drivers/block/drbd/drbd_main.c                |   7 +
drivers/block/drbd/drbd_nl.c                  |   1 +
drivers/block/drbd/drbd_receiver.c            |   1 +
drivers/block/drbd/drbd_state.c               |   4 +
drivers/block/loop.c                          |   2 +
drivers/block/nbd.c                           |   3 +
drivers/block/null_blk/zoned.c                |   2 +
drivers/block/rnbd/rnbd-clt.c                 |   2 +
drivers/bus/fsl-mc/mc-sys.c                   |   1 +
drivers/bus/vexpress-config.c                 |   2 +
drivers/cdx/cdx_msi.c                         |   2 +
drivers/char/ipmi/ipmi_msghandler.c           |   1 +
drivers/char/misc.c                           |   2 +
drivers/char/powernv-op-panel.c               |   2 +
drivers/char/tpm/tpm-chip.c                   |   3 +
drivers/char/xillybus/xillybus_core.c         |   1 +
drivers/clk/clk.c                             |   4 +
drivers/comedi/comedi_fops.c                  |   2 +
drivers/comedi/drivers.c                      |   1 +
drivers/comedi/drivers/usbduxsigma.c          |   1 +
drivers/counter/rz-mtu3-cnt.c                 |   3 +
drivers/cpuidle/cpuidle.c                     |   2 +
drivers/crypto/exynos-rng.c                   |   1 +
drivers/crypto/hisilicon/qm.c                 |   4 +
drivers/crypto/intel/qat/qat_common/adf_cfg.c |   2 +
.../qat/qat_common/adf_transport_debug.c      |   4 +
drivers/cxl/core/port.c                       |   2 +
drivers/devfreq/devfreq.c                     |   1 +
drivers/dpll/dpll_netlink.c                   |   6 +
drivers/firmware/arm_ffa/driver.c             |   1 +
drivers/firmware/arm_scmi/notify.c            |   1 +
.../firmware/arm_scmi/transports/mailbox.c    |   2 +
drivers/firmware/arm_scmi/transports/optee.c  |   2 +
.../firmware/qcom/qcom_qseecom_uefisecapp.c   |   2 +
drivers/fpga/fpga-bridge.c                    |   2 +
drivers/fpga/fpga-region.c                    |   3 +
drivers/gpio/gpio-adnp.c                      |   2 +
drivers/gpio/gpio-crystalcove.c               |   2 +
drivers/gpio/gpio-dln2.c                      |   2 +
drivers/gpio/gpio-ljca.c                      |   2 +
drivers/gpio/gpio-max77620.c                  |   2 +
drivers/gpio/gpio-mlxbf2.c                    |   6 +-
drivers/gpio/gpio-pca953x.c                   |   2 +
drivers/gpio/gpio-pcf857x.c                   |   2 +
drivers/gpio/gpio-pmic-eic-sprd.c             |   2 +
drivers/gpio/gpio-stmpe.c                     |   2 +
drivers/gpio/gpio-tc3589x.c                   |   2 +
drivers/gpio/gpio-virtio.c                    |   2 +
drivers/gpio/gpio-wcove.c                     |   2 +
drivers/gpu/drm/amd/amdgpu/aldebaran.c        |   1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c       |   1 +
.../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c    |   4 +
.../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c  |   4 +
.../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c    |   4 +
.../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v12.c    |   4 +
.../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c |   4 +
.../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c |   4 +
.../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c |   8 +
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c        |   3 +
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |   2 +
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |   1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c       |   2 +
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c       |   1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c       |   1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h       |   2 +
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c       |   2 +
drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c    |  14 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c       |   5 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c     |   1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.h  |   2 +
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c        |   1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h        |   3 +
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c     |   2 +
drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c       |   1 +
drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c        |   3 +-
drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.c    |   2 +
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c         |   4 +-
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c      |   4 +
.../drm/amd/amdkfd/kfd_device_queue_manager.c |   5 +
.../drm/amd/amdkfd/kfd_device_queue_manager.h |   2 +
drivers/gpu/drm/amd/amdkfd/kfd_svm.h          |   2 +
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |   2 +
.../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    |   1 +
drivers/gpu/drm/ast/ast_ddc.c                 |   2 +
.../drm/bridge/cadence/cdns-mhdp8546-core.c   |   9 +-
drivers/gpu/drm/bridge/lontium-lt9611uxc.c    |   2 +
drivers/gpu/drm/clients/drm_log.c             |   2 +
drivers/gpu/drm/display/drm_dp_helper.c       |   3 +
drivers/gpu/drm/display/drm_dp_mst_topology.c |   2 +
drivers/gpu/drm/drm_atomic_helper.c           |   3 +
drivers/gpu/drm/drm_auth.c                    |   2 +
drivers/gpu/drm/drm_client_modeset.c          |   1 +
drivers/gpu/drm/drm_color_mgmt.c              |   1 +
drivers/gpu/drm/drm_crtc.c                    |   1 +
drivers/gpu/drm/drm_drv.c                     |   1 +
drivers/gpu/drm/drm_fb_helper.c               |   1 +
drivers/gpu/drm/drm_file.c                    |   4 +
drivers/gpu/drm/drm_gem.c                     |   4 +-
drivers/gpu/drm/drm_mode_object.c             |   2 +
drivers/gpu/drm/drm_modeset_lock.c            |   2 +
drivers/gpu/drm/drm_plane.c                   |   1 +
drivers/gpu/drm/drm_prime.c                   |   1 +
drivers/gpu/drm/i915/display/intel_cdclk.c    |   1 +
.../drm/i915/display/intel_display_reset.c    |   2 +
drivers/gpu/drm/i915/display/intel_gmbus.c    |   3 +
drivers/gpu/drm/i915/display/intel_pps.c      |   2 +
drivers/gpu/drm/i915/display/intel_psr.c      |   3 +
drivers/gpu/drm/i915/display/intel_tc.c       |   4 +
drivers/gpu/drm/i915/gem/i915_gem_context.h   |   2 +
.../gpu/drm/i915/gem/i915_gem_execbuffer.c    |   1 +
drivers/gpu/drm/i915/gt/intel_context.h       |   4 +
drivers/gpu/drm/i915/gt/selftest_context.c    |   1 +
drivers/gpu/drm/i915/gt/selftest_timeline.c   |   1 +
drivers/gpu/drm/i915/gvt/vgpu.c               |   1 +
drivers/gpu/drm/i915/i915_request.c           |   1 +
drivers/gpu/drm/i915/i915_vma.c               |   3 +-
drivers/gpu/drm/i915/intel_sbi.c              |   2 +
drivers/gpu/drm/i915/intel_wakeref.c          |   2 +
drivers/gpu/drm/i915/intel_wakeref.h          |   2 +
drivers/gpu/drm/i915/pxp/intel_pxp_cmd.c      |   1 +
drivers/gpu/drm/i915/vlv_sideband.c           |   2 +
drivers/gpu/drm/ingenic/ingenic-drm-drv.c     |   1 +
drivers/gpu/drm/mgag200/mgag200_ddc.c         |   2 +
drivers/gpu/drm/msm/msm_atomic.c              |   2 +
drivers/gpu/drm/nouveau/dispnv50/disp.c       |   2 +
drivers/gpu/drm/nouveau/nouveau_abi16.c       |   2 +
drivers/gpu/drm/nouveau/nouveau_uvmm.h        |   2 +
drivers/gpu/drm/nouveau/nvkm/core/subdev.c    |   1 +
.../gpu/drm/nouveau/nvkm/engine/fifo/chan.c   |   3 +-
.../gpu/drm/nouveau/nvkm/engine/fifo/uchan.c  |   1 +
drivers/gpu/drm/nouveau/nvkm/falcon/cmdq.c    |   3 +
.../gpu/drm/nouveau/nvkm/subdev/i2c/auxch.c   |   2 +
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c |   2 +
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/pad.c |   2 +
.../drm/nouveau/nvkm/subdev/instmem/nv50.c    |  24 +--
drivers/gpu/drm/panthor/panthor_mmu.c         |   1 +
drivers/gpu/drm/qxl/qxl_cmd.c                 |   1 +
drivers/gpu/drm/qxl/qxl_display.c             |   2 +
drivers/gpu/drm/radeon/radeon_i2c.c           |   2 +
drivers/gpu/drm/radeon/radeon_ring.c          |   3 +
drivers/gpu/drm/rockchip/cdn-dp-core.c        |   1 +
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c  |   2 +
drivers/gpu/drm/tegra/hdmi.c                  |   2 +
drivers/gpu/drm/ttm/tests/ttm_bo_test.c       |   1 +
drivers/gpu/drm/vmwgfx/vmwgfx_cmd.c           |   7 +-
drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c        |   5 +
drivers/gpu/drm/vmwgfx/vmwgfx_validation.c    |   3 +
drivers/gpu/drm/xe/xe_migrate.c               |   1 +
drivers/gpu/drm/xe/xe_pcode.c                 |   1 +
drivers/gpu/drm/xlnx/zynqmp_dp.c              |   2 +-
drivers/gpu/host1x/bus.c                      |   2 +
drivers/gpu/host1x/cdma.c                     |   6 +
drivers/gpu/host1x/context.c                  |   1 +
drivers/gpu/host1x/mipi.c                     |   2 +
drivers/hid/hid-wiimote.h                     |   3 +
drivers/hv/channel.c                          |   2 +
drivers/hwmon/abituguru.c                     |   2 +
drivers/hwmon/abituguru3.c                    |   2 +
drivers/hwmon/asus_rog_ryujin.c               |   4 +-
drivers/hwmon/gigabyte_waterforce.c           |   2 +-
drivers/hwmon/it87.c                          |   6 +-
drivers/hwmon/lm78.c                          |   1 +
drivers/hwmon/nct7904.c                       |   2 +
drivers/hwmon/nzxt-kraken3.c                  |   2 +-
drivers/hwmon/pmbus/pmbus_core.c              |   1 +
drivers/hwmon/w83781d.c                       |   1 +
drivers/hwtracing/intel_th/msu.c              |   1 +
drivers/hwtracing/stm/policy.c                |   2 +
drivers/i2c/busses/i2c-amd-mp2-pci.c          |   2 +
drivers/i2c/busses/i2c-xiic.c                 |   1 +
drivers/i2c/i2c-atr.c                         |   3 +
drivers/iio/accel/kionix-kx022a.c             |   3 +
drivers/iio/adc/meson_saradc.c                |   2 +
drivers/iio/buffer/industrialio-buffer-dma.c  |   2 +
drivers/iio/industrialio-core.c               |   4 +
drivers/iio/light/opt3001.c                   |   1 +
drivers/infiniband/core/cma.c                 |   5 +
drivers/infiniband/core/security.c            |   1 +
drivers/infiniband/core/umem_odp.c            |   1 +
drivers/infiniband/hw/hns/hns_roce_hem.c      |   2 +
drivers/infiniband/hw/mlx4/main.c             |   2 +
drivers/infiniband/hw/mlx5/mr.c               |   1 +
drivers/infiniband/hw/mlx5/odp.c              |   1 +
drivers/infiniband/hw/mlx5/umr.c              |   2 +
drivers/infiniband/ulp/srp/ib_srp.c           |   2 +-
drivers/infiniband/ulp/srpt/ib_srpt.c         |   4 +-
drivers/input/input.c                         |   3 +
drivers/input/joystick/pxrc.c                 |   2 +
drivers/input/keyboard/adp5588-keys.c         |   2 +
drivers/input/misc/ati_remote2.c              |   2 +
drivers/input/misc/cm109.c                    |   2 +
drivers/input/mouse/psmouse-base.c            |   1 +
drivers/input/mouse/synaptics_usb.c           |   2 +
drivers/input/rmi4/rmi_f54.c                  |   5 +-
drivers/input/serio/i8042.c                   |   2 +
drivers/input/serio/libps2.c                  |   2 +
drivers/iommu/iommufd/device.c                |   2 +
drivers/iommu/iommufd/hw_pagetable.c          |   1 +
drivers/leds/leds-blinkm.c                    |   2 +-
drivers/md/bcache/alloc.c                     |   2 +
drivers/md/bcache/btree.c                     |   1 +
drivers/md/bcache/super.c                     |   2 +
drivers/md/dm-bufio.c                         |   2 +
drivers/md/dm-crypt.c                         |   1 +
drivers/md/dm-vdo/indexer/index-session.c     |   1 +
drivers/md/dm-vdo/indexer/volume-index.c      |   3 +
drivers/md/dm-vdo/indexer/volume.c            |   1 +
drivers/md/dm-writecache.c                    |   6 +
drivers/md/dm-zoned-metadata.c                |   6 +
drivers/md/dm.c                               |   5 +
drivers/md/md-cluster.c                       |  12 +-
drivers/md/md.c                               |   8 +
drivers/md/md.h                               |   9 +-
drivers/md/raid0.c                            |   4 +-
drivers/md/raid1.c                            |   4 +-
drivers/md/raid10.c                           |   4 +-
drivers/media/cec/core/cec-adap.c             |   5 +
.../media/common/videobuf2/videobuf2-core.c   |   2 +
.../media/common/videobuf2/videobuf2-v4l2.c   |   7 +
drivers/media/dvb-core/dvb_frontend.c         |   1 +
drivers/media/dvb-core/dvb_vb2.c              |   2 +
drivers/media/dvb-frontends/bcm3510.c         |   2 +-
drivers/media/dvb-frontends/dib0070.c         |   4 +-
drivers/media/dvb-frontends/dib0090.c         |   8 +-
drivers/media/dvb-frontends/dib7000m.c        |   4 +-
drivers/media/dvb-frontends/dib7000p.c        |   4 +-
drivers/media/dvb-frontends/dib8000.c         |  10 +-
drivers/media/dvb-frontends/dib9000.c         |  43 +++---
drivers/media/dvb-frontends/dibx000_common.c  |  10 +-
drivers/media/dvb-frontends/stv090x.c         |   2 +
drivers/media/dvb-frontends/stv0910.c         |   1 +
drivers/media/dvb-frontends/ts2020.c          |   2 +
drivers/media/mc/mc-device.c                  |   1 +
drivers/media/mc/mc-entity.c                  |   1 +
drivers/media/pci/cx18/cx18-alsa.h            |   2 +
drivers/media/pci/ddbridge/ddbridge-core.c    |   1 +
drivers/media/pci/ivtv/ivtv-alsa.h            |   2 +
drivers/media/pci/ivtv/ivtv-fileops.c         |   2 +
drivers/media/pci/ivtv/ivtv-ioctl.c           |   3 +
drivers/media/pci/ivtv/ivtv-yuv.c             |   3 +
drivers/media/platform/amphion/vpu_v4l2.c     |   3 +
.../platform/chips-media/coda/coda-jpeg.c     |   1 +
.../mediatek/vcodec/decoder/mtk_vcodec_dec.c  |   2 +
.../vcodec/decoder/mtk_vcodec_dec_pm.c        |   2 +
.../mediatek/vcodec/encoder/mtk_vcodec_enc.c  |   2 +
.../media/platform/nvidia/tegra-vde/h264.c    |   5 +
drivers/media/platform/nvidia/tegra-vde/vde.c |   2 +
.../platform/samsung/exynos4-is/media-dev.h   |   2 +
.../media/platform/samsung/s5p-mfc/s5p_mfc.c  |   2 +
drivers/media/platform/st/sti/hva/hva-hw.c    |   1 +
drivers/media/platform/ti/omap3isp/ispvideo.c |   2 +
.../test-drivers/vivid/vivid-kthread-cap.c    |   1 +
drivers/media/usb/dvb-usb-v2/af9035.c         |   2 +-
drivers/media/usb/dvb-usb-v2/anysee.c         |   2 +-
drivers/media/usb/dvb-usb-v2/au6610.c         |   2 +-
drivers/media/usb/dvb-usb-v2/az6007.c         |   6 +-
drivers/media/usb/dvb-usb-v2/ce6230.c         |   2 +-
drivers/media/usb/dvb-usb-v2/dvbsky.c         |   2 +-
drivers/media/usb/dvb-usb-v2/ec168.c          |   2 +-
drivers/media/usb/dvb-usb-v2/lmedm04.c        |   2 +-
drivers/media/usb/dvb-usb-v2/mxl111sf-i2c.c   |   2 +-
drivers/media/usb/dvb-usb-v2/mxl111sf.c       |   2 +
drivers/media/usb/dvb-usb-v2/rtl28xxu.c       |   2 +-
drivers/media/usb/dvb-usb/af9005.c            |   2 +-
drivers/media/usb/dvb-usb/az6027.c            |   2 +-
drivers/media/usb/dvb-usb/cxusb-analog.c      |   1 +
drivers/media/usb/dvb-usb/cxusb.c             |   3 +-
drivers/media/usb/dvb-usb/dib0700_core.c      |  20 +--
drivers/media/usb/dvb-usb/dibusb-common.c     |   2 +-
drivers/media/usb/dvb-usb/digitv.c            |   2 +-
drivers/media/usb/dvb-usb/dtv5100.c           |   2 +-
drivers/media/usb/dvb-usb/dvb-usb-urb.c       |   3 +-
drivers/media/usb/dvb-usb/dw2102.c            |  16 +-
drivers/media/usb/dvb-usb/gp8psk.c            |   6 +-
drivers/media/usb/dvb-usb/m920x.c             |   2 +-
drivers/media/usb/dvb-usb/opera1.c            |   4 +-
drivers/media/usb/dvb-usb/pctv452e.c          |   4 +-
drivers/media/usb/dvb-usb/technisat-usb2.c    |  10 +-
drivers/media/usb/dvb-usb/ttusb2.c            |   2 +-
drivers/media/usb/dvb-usb/vp702x.c            |   5 +-
drivers/media/usb/go7007/go7007-i2c.c         |   3 +
drivers/media/usb/gspca/finepix.c             |   1 +
drivers/media/usb/gspca/jl2005bcd.c           |   1 +
drivers/media/usb/gspca/sn9c20x.c             |   1 +
drivers/media/usb/gspca/sonixj.c              |   1 +
drivers/media/usb/gspca/sq905.c               |   2 +
drivers/media/usb/gspca/sq905c.c              |   1 +
drivers/media/usb/gspca/vicam.c               |   1 +
drivers/media/usb/gspca/zc3xx.c               |   1 +
drivers/media/usb/hdpvr/hdpvr-video.c         |   1 +
drivers/media/usb/pvrusb2/pvrusb2-context.c   |   2 +
.../media/usb/ttusb-budget/dvb-ttusb-budget.c |   4 +-
drivers/media/usb/uvc/uvc_ctrl.c              |   7 +-
drivers/media/v4l2-core/v4l2-event.c          |   1 +
drivers/media/v4l2-core/v4l2-ioctl.c          |   1 +
drivers/media/v4l2-core/v4l2-mem2mem.c        |   1 +
drivers/media/v4l2-core/v4l2-subdev.c         |   1 +
drivers/message/fusion/mptctl.c               |  11 +-
drivers/message/fusion/mptscsih.c             |   4 +-
drivers/mfd/88pm860x-core.c                   |   2 +
drivers/mfd/atc260x-core.c                    |   2 +
drivers/mfd/kempld-core.c                     |   2 +
drivers/mfd/lp8788-irq.c                      |   2 +
drivers/mfd/max8925-core.c                    |   2 +
drivers/mfd/max8997-irq.c                     |   2 +
drivers/mfd/max8998-irq.c                     |   2 +
drivers/mfd/mc13xxx-core.c                    |   2 +
drivers/mfd/mt6358-irq.c                      |   2 +
drivers/mfd/mt6397-irq.c                      |   2 +
drivers/mfd/rc5t583-irq.c                     |   2 +
drivers/mfd/stmfx.c                           |   2 +
drivers/mfd/stmpe.c                           |   2 +
drivers/mfd/tps65217.c                        |   2 +
drivers/mfd/tps6586x.c                        |   2 +
drivers/mfd/twl4030-irq.c                     |   2 +
drivers/mfd/wm831x-irq.c                      |   2 +
drivers/mfd/wm8350-irq.c                      |   2 +
drivers/misc/cardreader/rtsx_usb.c            |   2 +
drivers/misc/mei/client.c                     |   7 +
drivers/misc/mei/hbm.c                        |   1 +
drivers/misc/mei/hw-me.c                      |   9 ++
drivers/misc/mei/hw-txe.c                     |   4 +
drivers/misc/mei/main.c                       |   1 +
drivers/misc/nsm.c                            |   2 +-
drivers/misc/ntsync.c                         |   2 +
drivers/misc/sgi-gru/grufault.c               |   3 +
drivers/misc/sgi-gru/grumain.c                |   1 +
drivers/misc/vmw_vmci/vmci_queue_pair.c       |   2 +
drivers/mmc/host/vub300.c                     |   2 +
drivers/mtd/chips/cfi_cmdset_0001.c           |   4 +
drivers/mtd/chips/cfi_cmdset_0002.c           |   6 +
drivers/mtd/lpddr/lpddr_cmds.c                |   4 +
drivers/mtd/nand/ecc-mtk.c                    |   2 +
drivers/mtd/nand/ecc-mxic.c                   |   2 +
drivers/mtd/nand/raw/atmel/pmecc.c            |   2 +
drivers/mtd/nand/raw/nand_base.c              |   4 +
drivers/mtd/spi-nor/controllers/hisi-sfc.c    |   2 +
drivers/mtd/spi-nor/core.c                    |   6 +
drivers/net/can/softing/softing_main.c        |   1 +
drivers/net/dsa/microchip/ksz_common.c        |   2 +
drivers/net/dsa/microchip/ksz_common.h        |   2 +
drivers/net/dsa/microchip/ksz_ptp.c           |   2 +
drivers/net/dsa/mt7530-mdio.c                 |   2 +
drivers/net/dsa/mt7530.c                      |   2 +
drivers/net/dsa/mv88e6xxx/chip.c              |   3 +
drivers/net/dsa/mv88e6xxx/chip.h              |   2 +
drivers/net/dsa/mv88e6xxx/global2.c           |   2 +
drivers/net/dsa/mv88e6xxx/pcs-6352.c          |   2 +
drivers/net/dsa/mv88e6xxx/phy.c               |   2 +
drivers/net/dsa/qca/ar9331.c                  |   2 +
drivers/net/dsa/realtek/rtl83xx.c             |   2 +
drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c   |   2 +
.../net/ethernet/broadcom/bnx2x/bnx2x_cmn.c   |   2 +
.../net/ethernet/broadcom/bnx2x/bnx2x_sriov.c |   2 +
.../net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c  |   2 +
.../net/ethernet/broadcom/bnxt/bnxt_hwrm.c    |   2 +
drivers/net/ethernet/broadcom/tg3.c           |   1 +
drivers/net/ethernet/davicom/dm9000.c         |   1 +
drivers/net/ethernet/davicom/dm9051.c         |   2 +
drivers/net/ethernet/emulex/benet/be_cmds.c   |   2 +
.../net/ethernet/freescale/dpaa2/dpaa2-eth.c  |   2 +
drivers/net/ethernet/hisilicon/hns3/hnae3.c   |   2 +
.../hisilicon/hns3/hns3pf/hclge_main.c        |   1 +
drivers/net/ethernet/intel/e1000e/82571.c     |   3 +
drivers/net/ethernet/intel/e1000e/ich8lan.c   |   2 +
drivers/net/ethernet/intel/iavf/iavf_main.c   |   3 +-
drivers/net/ethernet/intel/ice/ice_common.c   |   1 +
drivers/net/ethernet/intel/ice/ice_dcb_lib.c  |  49 +++---
drivers/net/ethernet/intel/ice/ice_ddp.c      |   2 +
drivers/net/ethernet/intel/ice/ice_ethtool.c  |   1 +
drivers/net/ethernet/intel/ice/ice_main.c     |   1 +
drivers/net/ethernet/intel/ice/ice_vf_lib.c   |   1 +
drivers/net/ethernet/intel/idpf/idpf.h        |   2 +
.../ethernet/marvell/octeontx2/af/rvu_nix.c   |   3 +
.../marvell/octeontx2/af/rvu_npc_fs.c         |   1 +
.../ethernet/marvell/octeontx2/nic/otx2_pf.c  |   2 +-
.../net/ethernet/marvell/octeontx2/nic/rep.c  |   1 +
.../marvell/prestera/prestera_counter.c       |   4 +
.../ethernet/marvell/prestera/prestera_pci.c  |   2 +
drivers/net/ethernet/mellanox/mlx4/cmd.c      |   2 +
drivers/net/ethernet/mellanox/mlx4/port.c     |   5 +
.../ethernet/mellanox/mlx5/core/en/mod_hdr.c  |   1 +
.../mellanox/mlx5/core/en/reporter_rx.c       |   2 +
.../mellanox/mlx5/core/en/tc/ct_fs_hmfs.c     |   1 +
.../mellanox/mlx5/core/en/tc/ct_fs_smfs.c     |   1 +
.../mellanox/mlx5/core/en/tc/int_port.c       |   1 +
.../mellanox/mlx5/core/en/tc_tun_encap.c      |   3 +
.../mellanox/mlx5/core/en_accel/macsec.c      |  62 +++-----
.../net/ethernet/mellanox/mlx5/core/en_tc.c   |   1 +
.../net/ethernet/mellanox/mlx5/core/esw/qos.c |   2 +
.../net/ethernet/mellanox/mlx5/core/main.c    |   2 +
.../mellanox/mlx5/core/steering/hws/bwc.c     |   2 +
.../mlx5/core/steering/sws/dr_types.h         |   6 +
drivers/net/ethernet/mellanox/mlxsw/i2c.c     |   4 +-
drivers/net/ethernet/micrel/ks8851_spi.c      |   2 +
.../ethernet/microchip/encx24j600-regmap.c    |   2 +
.../net/ethernet/microchip/vcap/vcap_api.c    |   4 +
.../netronome/nfp/nfpcore/nfp_cppcore.c       |   2 +
drivers/net/ethernet/qlogic/qed/qed_ll2.c     |   1 +
drivers/net/ethernet/qlogic/qed/qed_vf.c      |   4 +-
drivers/net/ethernet/qlogic/qede/qede_main.c  |   7 +
drivers/net/ethernet/sfc/ef10_sriov.c         |   1 +
drivers/net/ethernet/sfc/efx_common.c         |   5 +
drivers/net/ethernet/sfc/falcon/efx.c         |   2 +
drivers/net/ethernet/sfc/mcdi_filters.c       |   1 +
drivers/net/ethernet/sfc/siena/efx_common.c   |   3 +
drivers/net/ethernet/xilinx/xilinx_axienet.h  |   2 +
drivers/net/macsec.c                          |   1 +
drivers/net/mctp/mctp-i3c.c                   |   7 +-
drivers/net/phy/dp83640.c                     |   2 +
drivers/net/phy/phy-core.c                    |   3 +
drivers/net/phy/phy_device.c                  |   1 +
drivers/net/phy/sfp-bus.c                     |   1 +
drivers/net/pse-pd/pse_core.c                 |   2 +-
drivers/net/team/team_core.c                  |   2 +
drivers/net/tun.c                             |   1 +
drivers/net/usb/cdc_subset.c                  |   2 +-
drivers/net/usb/hso.c                         |   2 +
drivers/net/usb/lan78xx.c                     |   2 +
drivers/net/wireless/ath/ath12k/core.c        |   4 +-
drivers/net/wireless/ath/ath6kl/sdio.c        |   1 +
drivers/net/wireless/ath/ath9k/hif_usb.c      |   1 +
drivers/net/wireless/ath/wil6210/main.c       |   1 +
drivers/net/wireless/ath/wil6210/p2p.c        |   2 +
drivers/net/wireless/broadcom/b43/main.c      |   1 +
.../net/wireless/broadcom/b43legacy/main.c    |   1 +
.../broadcom/brcm80211/brcmfmac/fwvid.c       |   2 +
drivers/net/wireless/intel/iwlwifi/dvm/lib.c  |   1 +
drivers/net/wireless/intel/iwlwifi/mvm/d3.c   |   3 +
drivers/net/wireless/intel/iwlwifi/mvm/ops.c  |   3 +
.../wireless/intel/iwlwifi/mvm/time-event.c   |   2 +
drivers/net/wireless/intersil/p54/p54pci.c    |   1 +
drivers/net/wireless/intersil/p54/p54usb.c    |   3 +-
drivers/net/wireless/marvell/mwl8k.c          |   2 +
.../wireless/mediatek/mt76/mt7615/testmode.c  |   1 +
.../net/wireless/mediatek/mt76/mt76_connac.h  |   2 +
.../net/wireless/mediatek/mt76/mt7915/main.c  |   1 +
.../wireless/mediatek/mt76/mt7915/testmode.c  |   5 +
.../net/wireless/mediatek/mt76/mt7925/main.c  |   6 +-
.../net/wireless/microchip/wilc1000/wlan.c    |   2 +
drivers/net/wireless/quantenna/qtnfmac/bus.h  |   2 +
drivers/net/wireless/realtek/rtw88/main.c     |   1 +
drivers/net/wireless/realtek/rtw89/core.c     |   1 +
drivers/net/wireless/realtek/rtw89/mac80211.c |   2 +
drivers/net/wireless/realtek/rtw89/wow.c      |   4 +
drivers/net/wireless/realtek/rtw89/wow.h      |   2 +-
drivers/net/wireless/rsi/rsi_91x_hal.c        |   1 +
drivers/net/wireless/st/cw1200/pm.c           |   2 +
drivers/net/wireless/ti/wl12xx/main.c         |   1 +
drivers/net/wireless/ti/wlcore/main.c         |   4 +
drivers/net/wireless/ti/wlcore/sysfs.c        |   2 +-
drivers/net/wireless/zydas/zd1211rw/zd_usb.c  |   2 +
drivers/nvdimm/bus.c                          |   1 +
drivers/nvdimm/core.c                         |   2 +
drivers/nvdimm/namespace_devs.c               |   1 +
drivers/nvme/host/core.c                      |   2 +
drivers/nvme/host/pci.c                       |   1 +
drivers/nvmem/sc27xx-efuse.c                  |   2 +
drivers/nvmem/sprd-efuse.c                    |   2 +
drivers/of/dynamic.c                          |   4 +
drivers/of/overlay.c                          |   2 +
drivers/opp/core.c                            |   2 +
drivers/pci/pci.c                             |  10 ++
drivers/pci/pcie/bwctrl.c                     |   1 +
drivers/pci/probe.c                           |   2 +
drivers/pci/switch/switchtec.c                |   1 +
drivers/pcmcia/rsrc_nonstatic.c               |   1 +
drivers/perf/arm-cci.c                        |   1 +
drivers/pinctrl/pinctrl-aw9523.c              |   2 +
drivers/pinctrl/pinctrl-cy8c95x0.c            |   2 +
drivers/pinctrl/pinctrl-mcp23s08.c            |   2 +
drivers/pinctrl/pinctrl-stmfx.c               |   2 +
drivers/pinctrl/pinctrl-sx150x.c              |   2 +
drivers/platform/chrome/cros_ec_lpc_mec.c     |   2 +
.../platform/cznic/turris-omnia-mcu-gpio.c    |   2 +
.../platform/x86/intel/crystal_cove_charger.c |   2 +
drivers/platform/x86/thinkpad_acpi.c          |  12 +-
drivers/pmdomain/core.c                       |   4 +
drivers/pmdomain/rockchip/pm-domains.c        |   2 +
drivers/pnp/isapnp/core.c                     |  18 ++-
drivers/power/supply/da9150-fg.c              |   2 +
drivers/power/supply/power_supply_core.c      |   1 +
drivers/pwm/core.c                            |   8 +
drivers/regulator/core.c                      |   2 +
drivers/remoteproc/mtk_scp_ipi.c              |   2 +
drivers/s390/char/tape_std.h                  |   2 +
drivers/scsi/aacraid/aachba.c                 |   4 +-
drivers/scsi/aacraid/commctrl.c               |   1 +
drivers/scsi/arm/acornscsi.c                  |   2 +-
drivers/scsi/fnic/fnic_scsi.c                 |   1 +
drivers/scsi/hpsa.c                           |   2 +-
drivers/scsi/ips.c                            |   8 +-
drivers/scsi/libfc/fc_disc.c                  |   6 +-
drivers/scsi/libiscsi.c                       |   1 +
drivers/scsi/megaraid.c                       |  10 +-
drivers/scsi/megaraid/megaraid_mbox.c         |  10 +-
drivers/scsi/megaraid/megaraid_sas.h          |   3 +-
drivers/scsi/megaraid/megaraid_sas_base.c     |  20 ++-
drivers/scsi/megaraid/megaraid_sas_fusion.c   |   2 +
drivers/scsi/mpi3mr/mpi3mr_app.c              |   1 +
drivers/scsi/mpt3sas/mpt3sas_base.c           |  12 +-
drivers/scsi/scsi_transport_iscsi.c           |   1 +
drivers/scsi/sg.c                             |   1 +
drivers/scsi/smartpqi/smartpqi_init.c         |  18 +++
drivers/siox/siox-core.c                      |   2 +
drivers/soc/qcom/qcom_pd_mapper.c             |   1 +
drivers/soc/tegra/pmc.c                       |   1 +
drivers/soundwire/stream.c                    |   3 +
drivers/spi/spi-mem.c                         |   2 +
drivers/spi/spi.c                             |   3 +
drivers/ssb/main.c                            |   2 +
drivers/staging/Makefile                      |   2 +
.../gpib/lpvo_usb_gpib/lpvo_usb_gpib.c        |   4 +-
drivers/staging/greybus/light.c               |   2 +
.../interface/vchiq_arm/vchiq_core.c          |   1 +
drivers/target/iscsi/iscsi_target_tpg.c       |   1 +
drivers/target/target_core_device.c           |   9 +-
drivers/target/target_core_pr.c               |   6 +-
drivers/target/target_core_spc.c              |  20 +--
drivers/tee/amdtee/core.c                     |   1 +
drivers/thermal/mediatek/auxadc_thermal.c     |   2 +
drivers/thermal/tegra/soctherm.c              |   2 +
drivers/thermal/thermal_debugfs.c             |   4 +
drivers/tty/n_tty.c                           |   1 +
drivers/tty/serial/sc16is7xx.c                |   2 +
drivers/tty/tty_buffer.c                      |   2 +
drivers/tty/tty_io.c                          |   8 +-
drivers/tty/tty_mutex.c                       |   5 +
drivers/ufs/core/ufshcd.c                     |   4 +
drivers/usb/class/cdc-wdm.c                   |   6 +-
drivers/usb/class/usblp.c                     |   5 +-
drivers/usb/class/usbtmc.c                    |   3 +
drivers/usb/core/devio.c                      |   7 +
drivers/usb/core/hcd-pci.c                    |   2 +
drivers/usb/core/hub.c                        |   7 +
drivers/usb/core/message.c                    |   2 +-
drivers/usb/core/sysfs.c                      |  24 +--
drivers/usb/gadget/configfs.c                 |   6 +
drivers/usb/gadget/function/f_fs.c            |  14 +-
drivers/usb/gadget/function/f_mass_storage.c  |   4 +-
drivers/usb/gadget/function/u_fs.h            |   2 +
drivers/usb/gadget/legacy/inode.c             |  14 +-
drivers/usb/misc/yurex.c                      |   2 +-
drivers/usb/serial/mos7720.c                  |   2 +
drivers/usb/serial/usb-serial.c               |   3 +
drivers/usb/storage/debug.c                   |   4 +-
drivers/usb/storage/transport.c               |   3 +-
drivers/usb/storage/usb.c                     |   2 +
drivers/usb/typec/tcpm/tcpm.c                 |  16 ++
drivers/usb/usb-skeleton.c                    |   2 +-
drivers/usb/usbip/stub_dev.c                  |   2 +-
drivers/usb/usbip/stub_main.c                 |   1 +
drivers/usb/usbip/stub_rx.c                   |   2 +-
drivers/vdpa/vdpa_sim/vdpa_sim_blk.c          |   2 +
drivers/vfio/group.c                          |   1 +
drivers/vfio/pci/mlx5/cmd.h                   |   3 +-
drivers/vfio/pci/virtio/migrate.c             |   1 +
drivers/vfio/vfio_iommu_type1.c               |   1 +
drivers/vhost/vhost.c                         |   3 +
drivers/video/fbdev/core/fb_procfs.c          |   2 +
drivers/video/fbdev/smscufx.c                 |   1 +
drivers/video/fbdev/udlfb.c                   |   1 +
drivers/virt/vboxguest/vboxguest_linux.c      |   2 +
drivers/virtio/virtio_mem.c                   |   5 +
drivers/w1/masters/omap_hdq.c                 |   8 +-
drivers/w1/slaves/w1_therm.c                  |   9 ++
drivers/w1/w1.c                               |   3 +
drivers/w1/w1_netlink.c                       |   1 +
drivers/xen/balloon.c                         |   2 +
drivers/xen/xen-pciback/passthrough.c         |   1 +
drivers/xen/xen-pciback/vpci.c                |   1 +
drivers/xen/xenbus/xenbus_comms.c             |   1 +
drivers/xen/xenbus/xenbus_xs.c                |   4 +
fs/affs/affs.h                                |   6 +
fs/afs/validation.c                           |   3 +-
fs/afs/vl_alias.c                             |   6 +-
fs/autofs/waitq.c                             |   3 +
fs/bcachefs/alloc_foreground.c                |   4 +
fs/bcachefs/alloc_foreground.h                |   1 +
fs/bcachefs/btree_locking.c                   |   1 +
fs/bcachefs/btree_write_buffer.c              |   4 +
fs/bcachefs/debug.c                           |   2 +
fs/bcachefs/ec.c                              |   3 +
fs/bcachefs/fs-ioctl.c                        |   1 +
fs/bcachefs/fs.c                              |   4 +
fs/bcachefs/io_write.c                        |   3 +
fs/bcachefs/journal.c                         |   2 +
fs/bcachefs/quota.c                           |   2 +
fs/bcachefs/seqmutex.h                        |   4 +
fs/btrfs/block-group.c                        |   2 +
fs/btrfs/delayed-ref.c                        |   4 +
fs/btrfs/delayed-ref.h                        |   1 +
fs/btrfs/extent-tree.c                        |   1 +
fs/btrfs/free-space-cache.c                   |   1 +
fs/btrfs/ioctl.c                              |   2 +
fs/btrfs/qgroup.c                             |   1 +
fs/btrfs/scrub.c                              |   2 +
fs/btrfs/tests/delayed-refs-tests.c           |   1 +
fs/btrfs/tree-log.c                           |   2 +
fs/btrfs/volumes.c                            |   4 +
fs/btrfs/zoned.h                              |   4 +
fs/ceph/caps.c                                |   4 +
fs/ceph/mds_client.c                          |   1 +
fs/coda/upcall.c                              |   1 +
fs/dcache.c                                   |   1 +
fs/dlm/recoverd.c                             |   2 +
fs/ecryptfs/main.c                            |   1 +
fs/ecryptfs/messaging.c                       |   1 +
fs/erofs/zdata.c                              |   3 +
fs/eventpoll.c                                |   3 +
fs/exec.c                                     |   4 +
fs/ext4/fast_commit.c                         |   1 +
fs/ext4/mballoc.c                             |   2 +
fs/f2fs/data.c                                |   1 +
fs/fat/fatent.c                               |   2 +
fs/fat/inode.c                                |   2 +
fs/file.c                                     |   2 +
fs/fsopen.c                                   |   2 +-
fs/fuse/inode.c                               |   2 +
fs/gfs2/rgrp.c                                |   2 +
fs/gfs2/util.c                                |   1 +
fs/hfs/bfind.c                                |   2 +
fs/hfsplus/bfind.c                            |   2 +
fs/hfsplus/extents.c                          |   2 +
fs/hpfs/hpfs_fn.h                             |   2 +
fs/jbd2/checkpoint.c                          |   2 +
fs/jbd2/commit.c                              |   1 +
fs/jbd2/journal.c                             |   5 +
fs/jbd2/transaction.c                         |   2 +
fs/jffs2/dir.c                                |   4 +
fs/jffs2/fs.c                                 |   1 +
fs/jffs2/gc.c                                 |   1 +
fs/jffs2/nodemgmt.c                           |   2 +
fs/jffs2/write.c                              |   2 +
fs/jfs/namei.c                                |   1 +
fs/kernfs/file.c                              |   9 ++
fs/lockd/host.c                               |   1 +
fs/lockd/svclock.c                            |   1 +
fs/namei.c                                    |   4 +
fs/namespace.c                                |   2 +-
fs/netfs/write_issue.c                        |   2 +
fs/nfsd/nfs4layouts.c                         |   2 +
fs/nfsd/nfs4proc.c                            |   2 +
fs/nfsd/nfs4state.c                           |  11 ++
fs/ntfs3/frecord.c                            |   4 +-
fs/ntfs3/inode.c                              |   1 +
fs/ntfs3/namei.c                              |   2 +
fs/ntfs3/ntfs_fs.h                            |   4 +
fs/ntfs3/record.c                             |   1 +
fs/ntfs3/xattr.c                              |   2 +
fs/ocfs2/cluster/nodemanager.c                |   2 +
fs/ocfs2/dlmglue.c                            |   2 +
fs/ocfs2/inode.c                              |   2 +
fs/ocfs2/refcounttree.c                       |   2 +
fs/orangefs/devorangefs-req.c                 |   2 +-
fs/orangefs/orangefs-debugfs.c                |   2 +
fs/orangefs/waitqueue.c                       |   1 +
fs/overlayfs/overlayfs.h                      |   3 +
fs/pipe.c                                     |   2 +
fs/proc/base.c                                |   2 +-
fs/proc/proc_tty.c                            |   2 +
fs/pstore/zone.c                              |   1 +
fs/smb/client/cifsglob.h                      |   2 +
fs/smb/client/connect.c                       |   3 +-
fs/smb/client/fs_context.h                    |   2 +
fs/smb/client/smbdirect.c                     |   2 +
fs/smb/client/smbdirect.h                     |   2 +-
fs/smb/server/connection.h                    |   6 +-
fs/super.c                                    |   6 +
fs/ubifs/compress.c                           |   2 +
fs/ubifs/dir.c                                |   4 +
fs/ubifs/file.c                               |   6 +
fs/ubifs/journal.c                            |   3 +
fs/ubifs/misc.h                               |   2 +
fs/xfs/scrub/dirtree.c                        |   2 +
fs/xfs/scrub/dirtree_repair.c                 |   3 +
fs/xfs/scrub/quota.c                          |   1 +
fs/xfs/scrub/quota_repair.c                   |   3 +
fs/xfs/scrub/quotacheck_repair.c              |   3 +
fs/xfs/scrub/rmap_repair.c                    |   1 +
fs/xfs/scrub/rtrmap_repair.c                  |   1 +
fs/xfs/xfs_dquot.c                            |   7 +
fs/xfs/xfs_dquot.h                            |  10 +-
fs/xfs/xfs_dquot_item.c                       |   2 +
fs/xfs/xfs_qm.c                               |   3 +
fs/xfs/xfs_qm_syscalls.c                      |   1 +
fs/xfs/xfs_trans_dquot.c                      |   3 +
include/linux/blkdev.h                        |  11 +-
include/linux/cgroup.h                        |   2 +
include/linux/cleanup.h                       |  34 ++++-
include/linux/device.h                        |  13 +-
include/linux/fb.h                            |   2 +
include/linux/fpga/fpga-bridge.h              |   2 +-
include/linux/fpga/fpga-mgr.h                 |   4 +-
include/linux/fsnotify_backend.h              |   2 +
include/linux/gameport.h                      |   1 +
include/linux/kref.h                          |   3 +
include/linux/memory_hotplug.h                |   2 +
include/linux/mfd/si476x-core.h               |   2 +
include/linux/mutex.h                         |  46 +++---
include/linux/mutex_types.h                   |   5 +-
include/linux/netdevice.h                     |   2 +
include/linux/phy.h                           |   2 +
include/linux/refcount.h                      |   5 +-
include/linux/thread_safety.h                 | 141 ++++++++++++++++++
include/linux/usb.h                           |   3 +-
include/media/v4l2-ctrls.h                    |   2 +
include/media/v4l2-subdev.h                   |   5 +
include/net/bluetooth/l2cap.h                 |   2 +
include/net/cfg80211.h                        |   2 +
include/scsi/scsi_proto.h                     |   4 +-
include/sound/emu10k1.h                       |  12 +-
include/sound/i2c.h                           |   2 +
include/sound/soc-card.h                      |   3 +
include/sound/soc.h                           |  14 ++
include/trace/events/scsi.h                   |   4 +-
include/trace/events/target.h                 |   4 +-
io_uring/cancel.c                             |   1 +
io_uring/fdinfo.c                             |   1 +
io_uring/io_uring.c                           |   5 +
io_uring/io_uring.h                           |   2 +
io_uring/msg_ring.c                           |   3 +
io_uring/register.c                           |   6 +
io_uring/rsrc.c                               |   3 +
io_uring/sqpoll.c                             |   3 +
io_uring/tctx.c                               |   1 +
kernel/acct.c                                 |   3 +
kernel/audit.c                                |   2 +
kernel/audit_tree.c                           |   2 +
kernel/audit_watch.c                          |   1 +
kernel/bpf/btf.c                              |   1 +
kernel/bpf/cgroup_iter.c                      |   2 +
kernel/bpf/verifier.c                         |   1 +
kernel/cgroup/cgroup-v1.c                     |   4 +
kernel/cgroup/cgroup.c                        |  18 +++
kernel/cgroup/cpuset.c                        |   2 +
kernel/cpu.c                                  |   2 +
kernel/events/callchain.c                     |   1 +
kernel/events/core.c                          |   9 ++
kernel/events/hw_breakpoint.c                 |   2 +
kernel/fail_function.c                        |   2 +
kernel/futex/core.c                           |   3 +
kernel/irq/autoprobe.c                        |   3 +
kernel/irq/irqdesc.c                          |   2 +
kernel/irq/msi.c                              |   2 +
kernel/jump_label.c                           |   2 +
kernel/kprobes.c                              |   3 +
kernel/locking/locktorture.c                  |   4 +
kernel/locking/mutex.c                        |  20 ++-
kernel/module/main.c                          |   1 +
kernel/module/procfs.c                        |   2 +
kernel/params.c                               |   2 +
kernel/power/autosleep.c                      |   2 +
kernel/power/main.c                           |   2 +
kernel/printk/printk.c                        |   2 +
kernel/rcu/srcutree.c                         |   4 +-
kernel/rcu/tree_exp.h                         |   1 +
kernel/sched/core.c                           |   1 +
kernel/seccomp.c                              |  11 +-
kernel/static_call_inline.c                   |   2 +
kernel/torture.c                              |   2 +
kernel/trace/ftrace.c                         |   7 +
kernel/trace/ring_buffer.c                    |   2 +
kernel/trace/rv/rv.c                          |   3 +
kernel/trace/rv/rv_reactors.c                 |   2 +
kernel/trace/trace.c                          |  12 ++
kernel/trace/trace_dynevent.c                 |   2 +
kernel/trace/trace_events.c                   |  10 ++
kernel/trace/trace_events_trigger.c           |   2 +
kernel/trace/trace_events_user.c              |   1 +
kernel/trace/trace_hwlat.c                    |   2 +
kernel/trace/trace_osnoise.c                  |   2 +
kernel/trace/trace_printk.c                   |   8 +
kernel/trace/trace_recursion_record.c         |   2 +
kernel/trace/trace_stat.c                     |   2 +
kernel/trace/trace_uprobe.c                   |   2 +
kernel/workqueue.c                            |   2 +
lib/Makefile                                  |   2 +
lib/dynamic_debug.c                           |   2 +
lib/error-inject.c                            |   2 +
lib/kunit/platform.c                          |   1 +
lib/once.c                                    |   2 +
mm/damon/sysfs.c                              |   3 +
mm/hugetlb.c                                  |   4 +
mm/kmemleak.c                                 |   6 +-
mm/ksm.c                                      |   1 +
mm/oom_kill.c                                 |   1 +
mm/page_alloc.c                               |   4 +
mm/percpu.c                                   |   1 +
mm/slab_common.c                              |   2 +
mm/swap_slots.c                               |   2 +
mm/swapfile.c                                 |   2 +
mm/vma.c                                      |   2 +
mm/zswap.c                                    |   2 +
net/atm/resources.c                           |   2 +
net/bluetooth/l2cap_core.c                    |   9 ++
net/bluetooth/l2cap_sock.c                    |   2 +
net/bluetooth/rfcomm/sock.c                   |   1 +
net/bridge/netfilter/ebtables.c               |   5 +
net/caif/caif_socket.c                        |   2 +
net/can/j1939/main.c                          |   2 +
net/ceph/messenger.c                          |   3 +
net/ceph/messenger_v1.c                       |   2 +
net/ceph/messenger_v2.c                       |  14 ++
net/core/dev.c                                |   4 +
net/core/drop_monitor.c                       |   2 +
net/core/netdev-genl.c                        |   5 +
net/core/pktgen.c                             |   1 +
net/core/rtnetlink.c                          |  12 ++
net/core/sock.c                               |   2 +
net/devlink/core.c                            |   3 +
net/devlink/devl_internal.h                   |   2 +
net/ethtool/ioctl.c                           |   1 +
net/ipv6/mcast.c                              |   1 +
net/mac802154/cfg.c                           |   2 +
net/mac802154/mib.c                           |   2 +
net/netfilter/ipset/ip_set_core.c             |   2 +
net/netfilter/ipvs/ip_vs_app.c                |   2 +
net/netfilter/nf_log.c                        |   2 +
net/netfilter/nf_tables_api.c                 |   5 +
net/netfilter/nfnetlink.c                     |   2 +
net/netfilter/x_tables.c                      |   8 +
net/netfilter/xt_hashlimit.c                  |   1 +
net/netlink/af_netlink.c                      |   2 +
net/netlink/genetlink.c                       |   7 +
net/openvswitch/datapath.c                    |   2 +
net/phonet/socket.c                           |   2 +
net/qrtr/af_qrtr.c                            |   1 +
net/rds/ib_cm.c                               |   1 +
net/rds/rdma_transport.c                      |   1 +
net/rds/tcp_listen.c                          |   1 +
net/rxrpc/af_rxrpc.c                          |   1 +
net/rxrpc/call_object.c                       |   1 +
net/rxrpc/recvmsg.c                           |   2 +-
net/rxrpc/sendmsg.c                           |   5 +-
net/sched/act_api.c                           |   1 +
net/sched/cls_api.c                           |   1 +
net/shaper/shaper.c                           |   2 +
net/smc/af_smc.c                              |   1 +
net/sunrpc/rpc_pipe.c                         |   2 +
net/sunrpc/svc_xprt.c                         |   2 +
net/unix/af_unix.c                            |   1 +
net/unix/unix_bpf.c                           |   1 +
net/wireless/nl80211.c                        |   9 ++
samples/vfio-mdev/mtty.c                      |   1 +
scripts/Makefile.clang                        |   3 +
security/apparmor/apparmorfs.c                |   3 +
security/integrity/ima/ima_fs.c               |   2 +-
security/integrity/ima/ima_main.c             |   1 +
security/keys/keyring.c                       |   3 +
security/tomoyo/gc.c                          |   3 +
sound/core/compress_offload.c                 |   3 +
sound/core/oss/pcm_oss.c                      |   9 ++
sound/core/pcm_native.c                       |   8 +
sound/core/seq/oss/seq_oss.c                  |   1 +
sound/core/seq/seq_clientmgr.c                |   2 +
sound/core/seq/seq_memory.c                   |   1 +
sound/core/sound.c                            |   1 +
sound/isa/gus/gus_mem.c                       |   3 +
sound/pci/ac97/ac97_codec.c                   |   2 +
sound/pci/hda/hda_intel.c                     |   1 +
sound/pci/hda/patch_realtek.c                 |   2 +
sound/pci/hda/tas2781_hda_i2c.c               |   1 +
sound/pci/ice1712/ak4xxx.c                    |   2 +
sound/pci/ice1712/delta.c                     |   4 +
sound/pci/ice1712/ews.c                       |   6 +
sound/pci/ice1712/hoontech.c                  |   1 +
sound/pci/ice1712/ice1712.h                   |   2 +
sound/pci/ice1712/prodigy192.c                |   2 +
sound/pci/ice1712/revo.c                      |   4 +
sound/pci/oxygen/oxygen_lib.c                 |   2 +-
sound/pci/pcxhr/pcxhr_core.c                  |   1 +
sound/soc/codecs/rt5677.c                     |   2 +
sound/soc/codecs/wcd-mbhc-v2.c                |   7 +-
sound/soc/soc-dapm.c                          |   9 ++
sound/soc/soc-pcm.c                           |  25 ++++
sound/soc/sof/intel/hda-mlink.c               |   2 +
sound/soc/sof/ipc3-control.c                  |   1 +
sound/soc/sof/ipc4-control.c                  |   1 +
sound/synth/emux/soundfont.c                  |   2 +
virt/kvm/kvm_main.c                           |   3 +
910 files changed, 2635 insertions(+), 422 deletions(-)
create mode 100644 include/linux/thread_safety.h
[PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Bart Van Assche 10 months, 1 week ago
Hi Peter,

As you may know the Clang compiler can perform certain thread-safety checks at
compile time. This includes checking whether locking calls in a function match
the function attributes and also whether annotated structure members are
protected by the synchronization objects declared with GUARDED_BY(). As one can
see this patch series includes a significant number of fixes for locking bugs.
All these locking bugs have been discovered by the Clang thread-safety checker.
I think this shows that it is useful to enable compile-time thread-safety
checks.

The Clang thread-safety infrastructure is not new. Some user space code in the
kernel tree already uses it. See also the header file tools/perf/util/mutex.h.
There are other projects that started using this infrastructure a while ago,
e.g. Qemu. The header file include/qemu/clang-tsa.h was added more than two
years ago to the Qemu project.

This patch series has been posted as an RFC because at this stage my goal is to
gather feedback about the following:
 - Whether or not to enable compile-time thread-safety checking in the Linux
   kernel.
 - The names of the macros in header file include/linux/thread_safety.h. The
   proposed names come from the Clang documentation (ACQUIRE(), RELEASE(),
   REQUIRES(), ...). In the Qemu header file for thread-safety support these
   macros have a prefix (TSA_ = Thread-Safety Analysis).
 - The changes made in header file include/linux/cleanup.h that support
   annotating constructor functions with function attributes.
 - Whether or not to split the two treewide patches in this series into one
   patch per kernel driver.
 - How to merge this patch series. The second last patch in this series modifies
   888 source files. If it is split into one patch per driver, this patch series
   will become too large to be posted as a single patch series.

Annotating struct mutex is a first step. Once struct mutex is annotated, driver
contributors and/or maintainers can annotate structure members with GUARDED_BY()
where this is considered useful.

There are more synchronization objects that can be annotated with thread-safety
attributes, e.g. spinlocks. This patch series only annotates struct mutex
because annotating other synchronization objects too would have made this patch
series too large.

Thanks,

Bart.

Bart Van Assche (33):
  scsi, usb: Rename the RESERVE and RELEASE constants
  s390: Comment out the RELEASE constant
  locking: Introduce <linux/thread_safety.h>
  include/linux/cleanup.h: Support thread-safety analysis
  locking/mutex: Change the atomic_dec_and_mutex_lock() return type
  locking/mutex: Annotate struct mutex and mutex functions
  driver core: Annotate locking functions in <linux/device.h>
  kref: Add thread-safety annotations in <linux/kref.h>
  refcount: Add thread-safety annotations in <linux/refcount.h>
  treewide: Modify mutex_lock_interruptible() return value checks
  PNP: isapnp: Check the isapnp_cfg_begin() return value
  scsi: mpi3mr: Fix locking in an error path
  scsi: mpt3sas: Fix a locking bug in an error path
  ice: Split ice_dcb_rebuild()
  ice: Fix a locking bug in an error path
  net/mlx5e: Make the code easier to analyze
  Input: synaptics-rmi4 - fix a locking bug in an error path
  misc: nsm: Fix a locking bug in an error path
  drm/amdgpu: Unlock a mutex before destroying it
  drm/amdgpu: Fix a locking bug in an error path
  drm/amdgpu: Fix locking bugs in error paths
  drm: bridge: cdns-mhdp8546: Fix a locking bug in an error path
  drm: bridge: cdns-mhdp8546: Fix a locking bug in an error path
  drm: zynqmp_dp: Fix a deadlock in zynqmp_dp_ignore_hpd_set()
  wifi: ath12k: Fix locking in error paths
  mctp i3c: Fix locking in error paths
  iavf: Fix a locking bug in an error path
  wifi: mt76: mt7925: Fix a locking bug in an error path
  hwmon: (it87) Check the it87_lock() return value
  drivers/net/ethernet/marvell/octeontx2/nic: Fix locking in an error
    path
  md/raid*: Fix raid*_set_queue_limits()
  treewide: Annotate all struct mutex users
  kbuild: clang: Unconditionally enable thread-safety checking

 Documentation/locking/mutex-design.rst        |   2 +-
 arch/arm64/kvm/arm.c                          |   2 +
 arch/powerpc/kernel/rtas.c                    |   1 +
 arch/powerpc/platforms/powermac/low_i2c.c     |   6 +
 arch/powerpc/platforms/pseries/papr-vpd.c     |   2 +
 arch/x86/events/core.c                        |   1 +
 arch/x86/kernel/cpu/resctrl/pseudo_lock.c     |   1 +
 arch/x86/kernel/cpu/resctrl/rdtgroup.c        |   2 +
 arch/x86/kernel/cpu/sgx/encl.c                |   2 +
 arch/x86/kernel/ftrace.c                      |   2 +
 arch/x86/kernel/module.c                      |   1 +
 arch/x86/kvm/svm/sev.c                        |   6 +
 block/bdev.c                                  |   3 +
 block/blk-cgroup.c                            |   2 +
 block/ioctl.c                                 |   1 +
 drivers/accel/amdxdna/aie2_error.c            |   5 +-
 drivers/accel/qaic/qaic_control.c             |   1 +
 drivers/acpi/scan.c                           |   5 +
 drivers/ata/libata-core.c                     |  31 +++-
 drivers/ata/libata-eh.c                       |   2 +
 drivers/ata/libata.h                          |   6 +-
 drivers/base/bus.c                            |   1 +
 drivers/base/core.c                           |   7 +
 drivers/base/dd.c                             |   2 +
 drivers/base/power/clock_ops.c                |   4 +
 drivers/base/power/main.c                     |   2 +
 drivers/base/regmap/regmap-irq.c              |   2 +
 drivers/base/regmap/regmap.c                  |   2 +
 drivers/block/drbd/drbd_bitmap.c              |   2 +
 drivers/block/drbd/drbd_main.c                |   7 +
 drivers/block/drbd/drbd_nl.c                  |   1 +
 drivers/block/drbd/drbd_receiver.c            |   1 +
 drivers/block/drbd/drbd_state.c               |   4 +
 drivers/block/loop.c                          |   2 +
 drivers/block/nbd.c                           |   3 +
 drivers/block/null_blk/zoned.c                |   2 +
 drivers/block/rnbd/rnbd-clt.c                 |   2 +
 drivers/bus/fsl-mc/mc-sys.c                   |   1 +
 drivers/bus/vexpress-config.c                 |   2 +
 drivers/cdx/cdx_msi.c                         |   2 +
 drivers/char/ipmi/ipmi_msghandler.c           |   1 +
 drivers/char/misc.c                           |   2 +
 drivers/char/powernv-op-panel.c               |   2 +
 drivers/char/tpm/tpm-chip.c                   |   3 +
 drivers/char/xillybus/xillybus_core.c         |   1 +
 drivers/clk/clk.c                             |   4 +
 drivers/comedi/comedi_fops.c                  |   2 +
 drivers/comedi/drivers.c                      |   1 +
 drivers/comedi/drivers/usbduxsigma.c          |   1 +
 drivers/counter/rz-mtu3-cnt.c                 |   3 +
 drivers/cpuidle/cpuidle.c                     |   2 +
 drivers/crypto/exynos-rng.c                   |   1 +
 drivers/crypto/hisilicon/qm.c                 |   4 +
 drivers/crypto/intel/qat/qat_common/adf_cfg.c |   2 +
 .../qat/qat_common/adf_transport_debug.c      |   4 +
 drivers/cxl/core/port.c                       |   2 +
 drivers/devfreq/devfreq.c                     |   1 +
 drivers/dpll/dpll_netlink.c                   |   6 +
 drivers/firmware/arm_ffa/driver.c             |   1 +
 drivers/firmware/arm_scmi/notify.c            |   1 +
 .../firmware/arm_scmi/transports/mailbox.c    |   2 +
 drivers/firmware/arm_scmi/transports/optee.c  |   2 +
 .../firmware/qcom/qcom_qseecom_uefisecapp.c   |   2 +
 drivers/fpga/fpga-bridge.c                    |   2 +
 drivers/fpga/fpga-region.c                    |   3 +
 drivers/gpio/gpio-adnp.c                      |   2 +
 drivers/gpio/gpio-crystalcove.c               |   2 +
 drivers/gpio/gpio-dln2.c                      |   2 +
 drivers/gpio/gpio-ljca.c                      |   2 +
 drivers/gpio/gpio-max77620.c                  |   2 +
 drivers/gpio/gpio-mlxbf2.c                    |   6 +-
 drivers/gpio/gpio-pca953x.c                   |   2 +
 drivers/gpio/gpio-pcf857x.c                   |   2 +
 drivers/gpio/gpio-pmic-eic-sprd.c             |   2 +
 drivers/gpio/gpio-stmpe.c                     |   2 +
 drivers/gpio/gpio-tc3589x.c                   |   2 +
 drivers/gpio/gpio-virtio.c                    |   2 +
 drivers/gpio/gpio-wcove.c                     |   2 +
 drivers/gpu/drm/amd/amdgpu/aldebaran.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c       |   1 +
 .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c    |   4 +
 .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c  |   4 +
 .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c    |   4 +
 .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v12.c    |   4 +
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c |   4 +
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c |   4 +
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c |   8 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c        |   3 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c       |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_job.c       |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c       |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h       |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c       |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c    |  14 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c       |   5 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c     |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.h  |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h        |   3 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c     |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c       |   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c        |   3 +-
 drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.c    |   2 +
 drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c         |   4 +-
 drivers/gpu/drm/amd/amdkfd/kfd_chardev.c      |   4 +
 .../drm/amd/amdkfd/kfd_device_queue_manager.c |   5 +
 .../drm/amd/amdkfd/kfd_device_queue_manager.h |   2 +
 drivers/gpu/drm/amd/amdkfd/kfd_svm.h          |   2 +
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |   2 +
 .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    |   1 +
 drivers/gpu/drm/ast/ast_ddc.c                 |   2 +
 .../drm/bridge/cadence/cdns-mhdp8546-core.c   |   9 +-
 drivers/gpu/drm/bridge/lontium-lt9611uxc.c    |   2 +
 drivers/gpu/drm/clients/drm_log.c             |   2 +
 drivers/gpu/drm/display/drm_dp_helper.c       |   3 +
 drivers/gpu/drm/display/drm_dp_mst_topology.c |   2 +
 drivers/gpu/drm/drm_atomic_helper.c           |   3 +
 drivers/gpu/drm/drm_auth.c                    |   2 +
 drivers/gpu/drm/drm_client_modeset.c          |   1 +
 drivers/gpu/drm/drm_color_mgmt.c              |   1 +
 drivers/gpu/drm/drm_crtc.c                    |   1 +
 drivers/gpu/drm/drm_drv.c                     |   1 +
 drivers/gpu/drm/drm_fb_helper.c               |   1 +
 drivers/gpu/drm/drm_file.c                    |   4 +
 drivers/gpu/drm/drm_gem.c                     |   4 +-
 drivers/gpu/drm/drm_mode_object.c             |   2 +
 drivers/gpu/drm/drm_modeset_lock.c            |   2 +
 drivers/gpu/drm/drm_plane.c                   |   1 +
 drivers/gpu/drm/drm_prime.c                   |   1 +
 drivers/gpu/drm/i915/display/intel_cdclk.c    |   1 +
 .../drm/i915/display/intel_display_reset.c    |   2 +
 drivers/gpu/drm/i915/display/intel_gmbus.c    |   3 +
 drivers/gpu/drm/i915/display/intel_pps.c      |   2 +
 drivers/gpu/drm/i915/display/intel_psr.c      |   3 +
 drivers/gpu/drm/i915/display/intel_tc.c       |   4 +
 drivers/gpu/drm/i915/gem/i915_gem_context.h   |   2 +
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    |   1 +
 drivers/gpu/drm/i915/gt/intel_context.h       |   4 +
 drivers/gpu/drm/i915/gt/selftest_context.c    |   1 +
 drivers/gpu/drm/i915/gt/selftest_timeline.c   |   1 +
 drivers/gpu/drm/i915/gvt/vgpu.c               |   1 +
 drivers/gpu/drm/i915/i915_request.c           |   1 +
 drivers/gpu/drm/i915/i915_vma.c               |   3 +-
 drivers/gpu/drm/i915/intel_sbi.c              |   2 +
 drivers/gpu/drm/i915/intel_wakeref.c          |   2 +
 drivers/gpu/drm/i915/intel_wakeref.h          |   2 +
 drivers/gpu/drm/i915/pxp/intel_pxp_cmd.c      |   1 +
 drivers/gpu/drm/i915/vlv_sideband.c           |   2 +
 drivers/gpu/drm/ingenic/ingenic-drm-drv.c     |   1 +
 drivers/gpu/drm/mgag200/mgag200_ddc.c         |   2 +
 drivers/gpu/drm/msm/msm_atomic.c              |   2 +
 drivers/gpu/drm/nouveau/dispnv50/disp.c       |   2 +
 drivers/gpu/drm/nouveau/nouveau_abi16.c       |   2 +
 drivers/gpu/drm/nouveau/nouveau_uvmm.h        |   2 +
 drivers/gpu/drm/nouveau/nvkm/core/subdev.c    |   1 +
 .../gpu/drm/nouveau/nvkm/engine/fifo/chan.c   |   3 +-
 .../gpu/drm/nouveau/nvkm/engine/fifo/uchan.c  |   1 +
 drivers/gpu/drm/nouveau/nvkm/falcon/cmdq.c    |   3 +
 .../gpu/drm/nouveau/nvkm/subdev/i2c/auxch.c   |   2 +
 drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c |   2 +
 drivers/gpu/drm/nouveau/nvkm/subdev/i2c/pad.c |   2 +
 .../drm/nouveau/nvkm/subdev/instmem/nv50.c    |  24 +--
 drivers/gpu/drm/panthor/panthor_mmu.c         |   1 +
 drivers/gpu/drm/qxl/qxl_cmd.c                 |   1 +
 drivers/gpu/drm/qxl/qxl_display.c             |   2 +
 drivers/gpu/drm/radeon/radeon_i2c.c           |   2 +
 drivers/gpu/drm/radeon/radeon_ring.c          |   3 +
 drivers/gpu/drm/rockchip/cdn-dp-core.c        |   1 +
 drivers/gpu/drm/rockchip/rockchip_drm_vop2.c  |   2 +
 drivers/gpu/drm/tegra/hdmi.c                  |   2 +
 drivers/gpu/drm/ttm/tests/ttm_bo_test.c       |   1 +
 drivers/gpu/drm/vmwgfx/vmwgfx_cmd.c           |   7 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c        |   5 +
 drivers/gpu/drm/vmwgfx/vmwgfx_validation.c    |   3 +
 drivers/gpu/drm/xe/xe_migrate.c               |   1 +
 drivers/gpu/drm/xe/xe_pcode.c                 |   1 +
 drivers/gpu/drm/xlnx/zynqmp_dp.c              |   2 +-
 drivers/gpu/host1x/bus.c                      |   2 +
 drivers/gpu/host1x/cdma.c                     |   6 +
 drivers/gpu/host1x/context.c                  |   1 +
 drivers/gpu/host1x/mipi.c                     |   2 +
 drivers/hid/hid-wiimote.h                     |   3 +
 drivers/hv/channel.c                          |   2 +
 drivers/hwmon/abituguru.c                     |   2 +
 drivers/hwmon/abituguru3.c                    |   2 +
 drivers/hwmon/asus_rog_ryujin.c               |   4 +-
 drivers/hwmon/gigabyte_waterforce.c           |   2 +-
 drivers/hwmon/it87.c                          |   6 +-
 drivers/hwmon/lm78.c                          |   1 +
 drivers/hwmon/nct7904.c                       |   2 +
 drivers/hwmon/nzxt-kraken3.c                  |   2 +-
 drivers/hwmon/pmbus/pmbus_core.c              |   1 +
 drivers/hwmon/w83781d.c                       |   1 +
 drivers/hwtracing/intel_th/msu.c              |   1 +
 drivers/hwtracing/stm/policy.c                |   2 +
 drivers/i2c/busses/i2c-amd-mp2-pci.c          |   2 +
 drivers/i2c/busses/i2c-xiic.c                 |   1 +
 drivers/i2c/i2c-atr.c                         |   3 +
 drivers/iio/accel/kionix-kx022a.c             |   3 +
 drivers/iio/adc/meson_saradc.c                |   2 +
 drivers/iio/buffer/industrialio-buffer-dma.c  |   2 +
 drivers/iio/industrialio-core.c               |   4 +
 drivers/iio/light/opt3001.c                   |   1 +
 drivers/infiniband/core/cma.c                 |   5 +
 drivers/infiniband/core/security.c            |   1 +
 drivers/infiniband/core/umem_odp.c            |   1 +
 drivers/infiniband/hw/hns/hns_roce_hem.c      |   2 +
 drivers/infiniband/hw/mlx4/main.c             |   2 +
 drivers/infiniband/hw/mlx5/mr.c               |   1 +
 drivers/infiniband/hw/mlx5/odp.c              |   1 +
 drivers/infiniband/hw/mlx5/umr.c              |   2 +
 drivers/infiniband/ulp/srp/ib_srp.c           |   2 +-
 drivers/infiniband/ulp/srpt/ib_srpt.c         |   4 +-
 drivers/input/input.c                         |   3 +
 drivers/input/joystick/pxrc.c                 |   2 +
 drivers/input/keyboard/adp5588-keys.c         |   2 +
 drivers/input/misc/ati_remote2.c              |   2 +
 drivers/input/misc/cm109.c                    |   2 +
 drivers/input/mouse/psmouse-base.c            |   1 +
 drivers/input/mouse/synaptics_usb.c           |   2 +
 drivers/input/rmi4/rmi_f54.c                  |   5 +-
 drivers/input/serio/i8042.c                   |   2 +
 drivers/input/serio/libps2.c                  |   2 +
 drivers/iommu/iommufd/device.c                |   2 +
 drivers/iommu/iommufd/hw_pagetable.c          |   1 +
 drivers/leds/leds-blinkm.c                    |   2 +-
 drivers/md/bcache/alloc.c                     |   2 +
 drivers/md/bcache/btree.c                     |   1 +
 drivers/md/bcache/super.c                     |   2 +
 drivers/md/dm-bufio.c                         |   2 +
 drivers/md/dm-crypt.c                         |   1 +
 drivers/md/dm-vdo/indexer/index-session.c     |   1 +
 drivers/md/dm-vdo/indexer/volume-index.c      |   3 +
 drivers/md/dm-vdo/indexer/volume.c            |   1 +
 drivers/md/dm-writecache.c                    |   6 +
 drivers/md/dm-zoned-metadata.c                |   6 +
 drivers/md/dm.c                               |   5 +
 drivers/md/md-cluster.c                       |  12 +-
 drivers/md/md.c                               |   8 +
 drivers/md/md.h                               |   9 +-
 drivers/md/raid0.c                            |   4 +-
 drivers/md/raid1.c                            |   4 +-
 drivers/md/raid10.c                           |   4 +-
 drivers/media/cec/core/cec-adap.c             |   5 +
 .../media/common/videobuf2/videobuf2-core.c   |   2 +
 .../media/common/videobuf2/videobuf2-v4l2.c   |   7 +
 drivers/media/dvb-core/dvb_frontend.c         |   1 +
 drivers/media/dvb-core/dvb_vb2.c              |   2 +
 drivers/media/dvb-frontends/bcm3510.c         |   2 +-
 drivers/media/dvb-frontends/dib0070.c         |   4 +-
 drivers/media/dvb-frontends/dib0090.c         |   8 +-
 drivers/media/dvb-frontends/dib7000m.c        |   4 +-
 drivers/media/dvb-frontends/dib7000p.c        |   4 +-
 drivers/media/dvb-frontends/dib8000.c         |  10 +-
 drivers/media/dvb-frontends/dib9000.c         |  43 +++---
 drivers/media/dvb-frontends/dibx000_common.c  |  10 +-
 drivers/media/dvb-frontends/stv090x.c         |   2 +
 drivers/media/dvb-frontends/stv0910.c         |   1 +
 drivers/media/dvb-frontends/ts2020.c          |   2 +
 drivers/media/mc/mc-device.c                  |   1 +
 drivers/media/mc/mc-entity.c                  |   1 +
 drivers/media/pci/cx18/cx18-alsa.h            |   2 +
 drivers/media/pci/ddbridge/ddbridge-core.c    |   1 +
 drivers/media/pci/ivtv/ivtv-alsa.h            |   2 +
 drivers/media/pci/ivtv/ivtv-fileops.c         |   2 +
 drivers/media/pci/ivtv/ivtv-ioctl.c           |   3 +
 drivers/media/pci/ivtv/ivtv-yuv.c             |   3 +
 drivers/media/platform/amphion/vpu_v4l2.c     |   3 +
 .../platform/chips-media/coda/coda-jpeg.c     |   1 +
 .../mediatek/vcodec/decoder/mtk_vcodec_dec.c  |   2 +
 .../vcodec/decoder/mtk_vcodec_dec_pm.c        |   2 +
 .../mediatek/vcodec/encoder/mtk_vcodec_enc.c  |   2 +
 .../media/platform/nvidia/tegra-vde/h264.c    |   5 +
 drivers/media/platform/nvidia/tegra-vde/vde.c |   2 +
 .../platform/samsung/exynos4-is/media-dev.h   |   2 +
 .../media/platform/samsung/s5p-mfc/s5p_mfc.c  |   2 +
 drivers/media/platform/st/sti/hva/hva-hw.c    |   1 +
 drivers/media/platform/ti/omap3isp/ispvideo.c |   2 +
 .../test-drivers/vivid/vivid-kthread-cap.c    |   1 +
 drivers/media/usb/dvb-usb-v2/af9035.c         |   2 +-
 drivers/media/usb/dvb-usb-v2/anysee.c         |   2 +-
 drivers/media/usb/dvb-usb-v2/au6610.c         |   2 +-
 drivers/media/usb/dvb-usb-v2/az6007.c         |   6 +-
 drivers/media/usb/dvb-usb-v2/ce6230.c         |   2 +-
 drivers/media/usb/dvb-usb-v2/dvbsky.c         |   2 +-
 drivers/media/usb/dvb-usb-v2/ec168.c          |   2 +-
 drivers/media/usb/dvb-usb-v2/lmedm04.c        |   2 +-
 drivers/media/usb/dvb-usb-v2/mxl111sf-i2c.c   |   2 +-
 drivers/media/usb/dvb-usb-v2/mxl111sf.c       |   2 +
 drivers/media/usb/dvb-usb-v2/rtl28xxu.c       |   2 +-
 drivers/media/usb/dvb-usb/af9005.c            |   2 +-
 drivers/media/usb/dvb-usb/az6027.c            |   2 +-
 drivers/media/usb/dvb-usb/cxusb-analog.c      |   1 +
 drivers/media/usb/dvb-usb/cxusb.c             |   3 +-
 drivers/media/usb/dvb-usb/dib0700_core.c      |  20 +--
 drivers/media/usb/dvb-usb/dibusb-common.c     |   2 +-
 drivers/media/usb/dvb-usb/digitv.c            |   2 +-
 drivers/media/usb/dvb-usb/dtv5100.c           |   2 +-
 drivers/media/usb/dvb-usb/dvb-usb-urb.c       |   3 +-
 drivers/media/usb/dvb-usb/dw2102.c            |  16 +-
 drivers/media/usb/dvb-usb/gp8psk.c            |   6 +-
 drivers/media/usb/dvb-usb/m920x.c             |   2 +-
 drivers/media/usb/dvb-usb/opera1.c            |   4 +-
 drivers/media/usb/dvb-usb/pctv452e.c          |   4 +-
 drivers/media/usb/dvb-usb/technisat-usb2.c    |  10 +-
 drivers/media/usb/dvb-usb/ttusb2.c            |   2 +-
 drivers/media/usb/dvb-usb/vp702x.c            |   5 +-
 drivers/media/usb/go7007/go7007-i2c.c         |   3 +
 drivers/media/usb/gspca/finepix.c             |   1 +
 drivers/media/usb/gspca/jl2005bcd.c           |   1 +
 drivers/media/usb/gspca/sn9c20x.c             |   1 +
 drivers/media/usb/gspca/sonixj.c              |   1 +
 drivers/media/usb/gspca/sq905.c               |   2 +
 drivers/media/usb/gspca/sq905c.c              |   1 +
 drivers/media/usb/gspca/vicam.c               |   1 +
 drivers/media/usb/gspca/zc3xx.c               |   1 +
 drivers/media/usb/hdpvr/hdpvr-video.c         |   1 +
 drivers/media/usb/pvrusb2/pvrusb2-context.c   |   2 +
 .../media/usb/ttusb-budget/dvb-ttusb-budget.c |   4 +-
 drivers/media/usb/uvc/uvc_ctrl.c              |   7 +-
 drivers/media/v4l2-core/v4l2-event.c          |   1 +
 drivers/media/v4l2-core/v4l2-ioctl.c          |   1 +
 drivers/media/v4l2-core/v4l2-mem2mem.c        |   1 +
 drivers/media/v4l2-core/v4l2-subdev.c         |   1 +
 drivers/message/fusion/mptctl.c               |  11 +-
 drivers/message/fusion/mptscsih.c             |   4 +-
 drivers/mfd/88pm860x-core.c                   |   2 +
 drivers/mfd/atc260x-core.c                    |   2 +
 drivers/mfd/kempld-core.c                     |   2 +
 drivers/mfd/lp8788-irq.c                      |   2 +
 drivers/mfd/max8925-core.c                    |   2 +
 drivers/mfd/max8997-irq.c                     |   2 +
 drivers/mfd/max8998-irq.c                     |   2 +
 drivers/mfd/mc13xxx-core.c                    |   2 +
 drivers/mfd/mt6358-irq.c                      |   2 +
 drivers/mfd/mt6397-irq.c                      |   2 +
 drivers/mfd/rc5t583-irq.c                     |   2 +
 drivers/mfd/stmfx.c                           |   2 +
 drivers/mfd/stmpe.c                           |   2 +
 drivers/mfd/tps65217.c                        |   2 +
 drivers/mfd/tps6586x.c                        |   2 +
 drivers/mfd/twl4030-irq.c                     |   2 +
 drivers/mfd/wm831x-irq.c                      |   2 +
 drivers/mfd/wm8350-irq.c                      |   2 +
 drivers/misc/cardreader/rtsx_usb.c            |   2 +
 drivers/misc/mei/client.c                     |   7 +
 drivers/misc/mei/hbm.c                        |   1 +
 drivers/misc/mei/hw-me.c                      |   9 ++
 drivers/misc/mei/hw-txe.c                     |   4 +
 drivers/misc/mei/main.c                       |   1 +
 drivers/misc/nsm.c                            |   2 +-
 drivers/misc/ntsync.c                         |   2 +
 drivers/misc/sgi-gru/grufault.c               |   3 +
 drivers/misc/sgi-gru/grumain.c                |   1 +
 drivers/misc/vmw_vmci/vmci_queue_pair.c       |   2 +
 drivers/mmc/host/vub300.c                     |   2 +
 drivers/mtd/chips/cfi_cmdset_0001.c           |   4 +
 drivers/mtd/chips/cfi_cmdset_0002.c           |   6 +
 drivers/mtd/lpddr/lpddr_cmds.c                |   4 +
 drivers/mtd/nand/ecc-mtk.c                    |   2 +
 drivers/mtd/nand/ecc-mxic.c                   |   2 +
 drivers/mtd/nand/raw/atmel/pmecc.c            |   2 +
 drivers/mtd/nand/raw/nand_base.c              |   4 +
 drivers/mtd/spi-nor/controllers/hisi-sfc.c    |   2 +
 drivers/mtd/spi-nor/core.c                    |   6 +
 drivers/net/can/softing/softing_main.c        |   1 +
 drivers/net/dsa/microchip/ksz_common.c        |   2 +
 drivers/net/dsa/microchip/ksz_common.h        |   2 +
 drivers/net/dsa/microchip/ksz_ptp.c           |   2 +
 drivers/net/dsa/mt7530-mdio.c                 |   2 +
 drivers/net/dsa/mt7530.c                      |   2 +
 drivers/net/dsa/mv88e6xxx/chip.c              |   3 +
 drivers/net/dsa/mv88e6xxx/chip.h              |   2 +
 drivers/net/dsa/mv88e6xxx/global2.c           |   2 +
 drivers/net/dsa/mv88e6xxx/pcs-6352.c          |   2 +
 drivers/net/dsa/mv88e6xxx/phy.c               |   2 +
 drivers/net/dsa/qca/ar9331.c                  |   2 +
 drivers/net/dsa/realtek/rtl83xx.c             |   2 +
 drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c   |   2 +
 .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.c   |   2 +
 .../net/ethernet/broadcom/bnx2x/bnx2x_sriov.c |   2 +
 .../net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c  |   2 +
 .../net/ethernet/broadcom/bnxt/bnxt_hwrm.c    |   2 +
 drivers/net/ethernet/broadcom/tg3.c           |   1 +
 drivers/net/ethernet/davicom/dm9000.c         |   1 +
 drivers/net/ethernet/davicom/dm9051.c         |   2 +
 drivers/net/ethernet/emulex/benet/be_cmds.c   |   2 +
 .../net/ethernet/freescale/dpaa2/dpaa2-eth.c  |   2 +
 drivers/net/ethernet/hisilicon/hns3/hnae3.c   |   2 +
 .../hisilicon/hns3/hns3pf/hclge_main.c        |   1 +
 drivers/net/ethernet/intel/e1000e/82571.c     |   3 +
 drivers/net/ethernet/intel/e1000e/ich8lan.c   |   2 +
 drivers/net/ethernet/intel/iavf/iavf_main.c   |   3 +-
 drivers/net/ethernet/intel/ice/ice_common.c   |   1 +
 drivers/net/ethernet/intel/ice/ice_dcb_lib.c  |  49 +++---
 drivers/net/ethernet/intel/ice/ice_ddp.c      |   2 +
 drivers/net/ethernet/intel/ice/ice_ethtool.c  |   1 +
 drivers/net/ethernet/intel/ice/ice_main.c     |   1 +
 drivers/net/ethernet/intel/ice/ice_vf_lib.c   |   1 +
 drivers/net/ethernet/intel/idpf/idpf.h        |   2 +
 .../ethernet/marvell/octeontx2/af/rvu_nix.c   |   3 +
 .../marvell/octeontx2/af/rvu_npc_fs.c         |   1 +
 .../ethernet/marvell/octeontx2/nic/otx2_pf.c  |   2 +-
 .../net/ethernet/marvell/octeontx2/nic/rep.c  |   1 +
 .../marvell/prestera/prestera_counter.c       |   4 +
 .../ethernet/marvell/prestera/prestera_pci.c  |   2 +
 drivers/net/ethernet/mellanox/mlx4/cmd.c      |   2 +
 drivers/net/ethernet/mellanox/mlx4/port.c     |   5 +
 .../ethernet/mellanox/mlx5/core/en/mod_hdr.c  |   1 +
 .../mellanox/mlx5/core/en/reporter_rx.c       |   2 +
 .../mellanox/mlx5/core/en/tc/ct_fs_hmfs.c     |   1 +
 .../mellanox/mlx5/core/en/tc/ct_fs_smfs.c     |   1 +
 .../mellanox/mlx5/core/en/tc/int_port.c       |   1 +
 .../mellanox/mlx5/core/en/tc_tun_encap.c      |   3 +
 .../mellanox/mlx5/core/en_accel/macsec.c      |  62 +++-----
 .../net/ethernet/mellanox/mlx5/core/en_tc.c   |   1 +
 .../net/ethernet/mellanox/mlx5/core/esw/qos.c |   2 +
 .../net/ethernet/mellanox/mlx5/core/main.c    |   2 +
 .../mellanox/mlx5/core/steering/hws/bwc.c     |   2 +
 .../mlx5/core/steering/sws/dr_types.h         |   6 +
 drivers/net/ethernet/mellanox/mlxsw/i2c.c     |   4 +-
 drivers/net/ethernet/micrel/ks8851_spi.c      |   2 +
 .../ethernet/microchip/encx24j600-regmap.c    |   2 +
 .../net/ethernet/microchip/vcap/vcap_api.c    |   4 +
 .../netronome/nfp/nfpcore/nfp_cppcore.c       |   2 +
 drivers/net/ethernet/qlogic/qed/qed_ll2.c     |   1 +
 drivers/net/ethernet/qlogic/qed/qed_vf.c      |   4 +-
 drivers/net/ethernet/qlogic/qede/qede_main.c  |   7 +
 drivers/net/ethernet/sfc/ef10_sriov.c         |   1 +
 drivers/net/ethernet/sfc/efx_common.c         |   5 +
 drivers/net/ethernet/sfc/falcon/efx.c         |   2 +
 drivers/net/ethernet/sfc/mcdi_filters.c       |   1 +
 drivers/net/ethernet/sfc/siena/efx_common.c   |   3 +
 drivers/net/ethernet/xilinx/xilinx_axienet.h  |   2 +
 drivers/net/macsec.c                          |   1 +
 drivers/net/mctp/mctp-i3c.c                   |   7 +-
 drivers/net/phy/dp83640.c                     |   2 +
 drivers/net/phy/phy-core.c                    |   3 +
 drivers/net/phy/phy_device.c                  |   1 +
 drivers/net/phy/sfp-bus.c                     |   1 +
 drivers/net/pse-pd/pse_core.c                 |   2 +-
 drivers/net/team/team_core.c                  |   2 +
 drivers/net/tun.c                             |   1 +
 drivers/net/usb/cdc_subset.c                  |   2 +-
 drivers/net/usb/hso.c                         |   2 +
 drivers/net/usb/lan78xx.c                     |   2 +
 drivers/net/wireless/ath/ath12k/core.c        |   4 +-
 drivers/net/wireless/ath/ath6kl/sdio.c        |   1 +
 drivers/net/wireless/ath/ath9k/hif_usb.c      |   1 +
 drivers/net/wireless/ath/wil6210/main.c       |   1 +
 drivers/net/wireless/ath/wil6210/p2p.c        |   2 +
 drivers/net/wireless/broadcom/b43/main.c      |   1 +
 .../net/wireless/broadcom/b43legacy/main.c    |   1 +
 .../broadcom/brcm80211/brcmfmac/fwvid.c       |   2 +
 drivers/net/wireless/intel/iwlwifi/dvm/lib.c  |   1 +
 drivers/net/wireless/intel/iwlwifi/mvm/d3.c   |   3 +
 drivers/net/wireless/intel/iwlwifi/mvm/ops.c  |   3 +
 .../wireless/intel/iwlwifi/mvm/time-event.c   |   2 +
 drivers/net/wireless/intersil/p54/p54pci.c    |   1 +
 drivers/net/wireless/intersil/p54/p54usb.c    |   3 +-
 drivers/net/wireless/marvell/mwl8k.c          |   2 +
 .../wireless/mediatek/mt76/mt7615/testmode.c  |   1 +
 .../net/wireless/mediatek/mt76/mt76_connac.h  |   2 +
 .../net/wireless/mediatek/mt76/mt7915/main.c  |   1 +
 .../wireless/mediatek/mt76/mt7915/testmode.c  |   5 +
 .../net/wireless/mediatek/mt76/mt7925/main.c  |   6 +-
 .../net/wireless/microchip/wilc1000/wlan.c    |   2 +
 drivers/net/wireless/quantenna/qtnfmac/bus.h  |   2 +
 drivers/net/wireless/realtek/rtw88/main.c     |   1 +
 drivers/net/wireless/realtek/rtw89/core.c     |   1 +
 drivers/net/wireless/realtek/rtw89/mac80211.c |   2 +
 drivers/net/wireless/realtek/rtw89/wow.c      |   4 +
 drivers/net/wireless/realtek/rtw89/wow.h      |   2 +-
 drivers/net/wireless/rsi/rsi_91x_hal.c        |   1 +
 drivers/net/wireless/st/cw1200/pm.c           |   2 +
 drivers/net/wireless/ti/wl12xx/main.c         |   1 +
 drivers/net/wireless/ti/wlcore/main.c         |   4 +
 drivers/net/wireless/ti/wlcore/sysfs.c        |   2 +-
 drivers/net/wireless/zydas/zd1211rw/zd_usb.c  |   2 +
 drivers/nvdimm/bus.c                          |   1 +
 drivers/nvdimm/core.c                         |   2 +
 drivers/nvdimm/namespace_devs.c               |   1 +
 drivers/nvme/host/core.c                      |   2 +
 drivers/nvme/host/pci.c                       |   1 +
 drivers/nvmem/sc27xx-efuse.c                  |   2 +
 drivers/nvmem/sprd-efuse.c                    |   2 +
 drivers/of/dynamic.c                          |   4 +
 drivers/of/overlay.c                          |   2 +
 drivers/opp/core.c                            |   2 +
 drivers/pci/pci.c                             |  10 ++
 drivers/pci/pcie/bwctrl.c                     |   1 +
 drivers/pci/probe.c                           |   2 +
 drivers/pci/switch/switchtec.c                |   1 +
 drivers/pcmcia/rsrc_nonstatic.c               |   1 +
 drivers/perf/arm-cci.c                        |   1 +
 drivers/pinctrl/pinctrl-aw9523.c              |   2 +
 drivers/pinctrl/pinctrl-cy8c95x0.c            |   2 +
 drivers/pinctrl/pinctrl-mcp23s08.c            |   2 +
 drivers/pinctrl/pinctrl-stmfx.c               |   2 +
 drivers/pinctrl/pinctrl-sx150x.c              |   2 +
 drivers/platform/chrome/cros_ec_lpc_mec.c     |   2 +
 .../platform/cznic/turris-omnia-mcu-gpio.c    |   2 +
 .../platform/x86/intel/crystal_cove_charger.c |   2 +
 drivers/platform/x86/thinkpad_acpi.c          |  12 +-
 drivers/pmdomain/core.c                       |   4 +
 drivers/pmdomain/rockchip/pm-domains.c        |   2 +
 drivers/pnp/isapnp/core.c                     |  18 ++-
 drivers/power/supply/da9150-fg.c              |   2 +
 drivers/power/supply/power_supply_core.c      |   1 +
 drivers/pwm/core.c                            |   8 +
 drivers/regulator/core.c                      |   2 +
 drivers/remoteproc/mtk_scp_ipi.c              |   2 +
 drivers/s390/char/tape_std.h                  |   2 +
 drivers/scsi/aacraid/aachba.c                 |   4 +-
 drivers/scsi/aacraid/commctrl.c               |   1 +
 drivers/scsi/arm/acornscsi.c                  |   2 +-
 drivers/scsi/fnic/fnic_scsi.c                 |   1 +
 drivers/scsi/hpsa.c                           |   2 +-
 drivers/scsi/ips.c                            |   8 +-
 drivers/scsi/libfc/fc_disc.c                  |   6 +-
 drivers/scsi/libiscsi.c                       |   1 +
 drivers/scsi/megaraid.c                       |  10 +-
 drivers/scsi/megaraid/megaraid_mbox.c         |  10 +-
 drivers/scsi/megaraid/megaraid_sas.h          |   3 +-
 drivers/scsi/megaraid/megaraid_sas_base.c     |  20 ++-
 drivers/scsi/megaraid/megaraid_sas_fusion.c   |   2 +
 drivers/scsi/mpi3mr/mpi3mr_app.c              |   1 +
 drivers/scsi/mpt3sas/mpt3sas_base.c           |  12 +-
 drivers/scsi/scsi_transport_iscsi.c           |   1 +
 drivers/scsi/sg.c                             |   1 +
 drivers/scsi/smartpqi/smartpqi_init.c         |  18 +++
 drivers/siox/siox-core.c                      |   2 +
 drivers/soc/qcom/qcom_pd_mapper.c             |   1 +
 drivers/soc/tegra/pmc.c                       |   1 +
 drivers/soundwire/stream.c                    |   3 +
 drivers/spi/spi-mem.c                         |   2 +
 drivers/spi/spi.c                             |   3 +
 drivers/ssb/main.c                            |   2 +
 drivers/staging/Makefile                      |   2 +
 .../gpib/lpvo_usb_gpib/lpvo_usb_gpib.c        |   4 +-
 drivers/staging/greybus/light.c               |   2 +
 .../interface/vchiq_arm/vchiq_core.c          |   1 +
 drivers/target/iscsi/iscsi_target_tpg.c       |   1 +
 drivers/target/target_core_device.c           |   9 +-
 drivers/target/target_core_pr.c               |   6 +-
 drivers/target/target_core_spc.c              |  20 +--
 drivers/tee/amdtee/core.c                     |   1 +
 drivers/thermal/mediatek/auxadc_thermal.c     |   2 +
 drivers/thermal/tegra/soctherm.c              |   2 +
 drivers/thermal/thermal_debugfs.c             |   4 +
 drivers/tty/n_tty.c                           |   1 +
 drivers/tty/serial/sc16is7xx.c                |   2 +
 drivers/tty/tty_buffer.c                      |   2 +
 drivers/tty/tty_io.c                          |   8 +-
 drivers/tty/tty_mutex.c                       |   5 +
 drivers/ufs/core/ufshcd.c                     |   4 +
 drivers/usb/class/cdc-wdm.c                   |   6 +-
 drivers/usb/class/usblp.c                     |   5 +-
 drivers/usb/class/usbtmc.c                    |   3 +
 drivers/usb/core/devio.c                      |   7 +
 drivers/usb/core/hcd-pci.c                    |   2 +
 drivers/usb/core/hub.c                        |   7 +
 drivers/usb/core/message.c                    |   2 +-
 drivers/usb/core/sysfs.c                      |  24 +--
 drivers/usb/gadget/configfs.c                 |   6 +
 drivers/usb/gadget/function/f_fs.c            |  14 +-
 drivers/usb/gadget/function/f_mass_storage.c  |   4 +-
 drivers/usb/gadget/function/u_fs.h            |   2 +
 drivers/usb/gadget/legacy/inode.c             |  14 +-
 drivers/usb/misc/yurex.c                      |   2 +-
 drivers/usb/serial/mos7720.c                  |   2 +
 drivers/usb/serial/usb-serial.c               |   3 +
 drivers/usb/storage/debug.c                   |   4 +-
 drivers/usb/storage/transport.c               |   3 +-
 drivers/usb/storage/usb.c                     |   2 +
 drivers/usb/typec/tcpm/tcpm.c                 |  16 ++
 drivers/usb/usb-skeleton.c                    |   2 +-
 drivers/usb/usbip/stub_dev.c                  |   2 +-
 drivers/usb/usbip/stub_main.c                 |   1 +
 drivers/usb/usbip/stub_rx.c                   |   2 +-
 drivers/vdpa/vdpa_sim/vdpa_sim_blk.c          |   2 +
 drivers/vfio/group.c                          |   1 +
 drivers/vfio/pci/mlx5/cmd.h                   |   3 +-
 drivers/vfio/pci/virtio/migrate.c             |   1 +
 drivers/vfio/vfio_iommu_type1.c               |   1 +
 drivers/vhost/vhost.c                         |   3 +
 drivers/video/fbdev/core/fb_procfs.c          |   2 +
 drivers/video/fbdev/smscufx.c                 |   1 +
 drivers/video/fbdev/udlfb.c                   |   1 +
 drivers/virt/vboxguest/vboxguest_linux.c      |   2 +
 drivers/virtio/virtio_mem.c                   |   5 +
 drivers/w1/masters/omap_hdq.c                 |   8 +-
 drivers/w1/slaves/w1_therm.c                  |   9 ++
 drivers/w1/w1.c                               |   3 +
 drivers/w1/w1_netlink.c                       |   1 +
 drivers/xen/balloon.c                         |   2 +
 drivers/xen/xen-pciback/passthrough.c         |   1 +
 drivers/xen/xen-pciback/vpci.c                |   1 +
 drivers/xen/xenbus/xenbus_comms.c             |   1 +
 drivers/xen/xenbus/xenbus_xs.c                |   4 +
 fs/affs/affs.h                                |   6 +
 fs/afs/validation.c                           |   3 +-
 fs/afs/vl_alias.c                             |   6 +-
 fs/autofs/waitq.c                             |   3 +
 fs/bcachefs/alloc_foreground.c                |   4 +
 fs/bcachefs/alloc_foreground.h                |   1 +
 fs/bcachefs/btree_locking.c                   |   1 +
 fs/bcachefs/btree_write_buffer.c              |   4 +
 fs/bcachefs/debug.c                           |   2 +
 fs/bcachefs/ec.c                              |   3 +
 fs/bcachefs/fs-ioctl.c                        |   1 +
 fs/bcachefs/fs.c                              |   4 +
 fs/bcachefs/io_write.c                        |   3 +
 fs/bcachefs/journal.c                         |   2 +
 fs/bcachefs/quota.c                           |   2 +
 fs/bcachefs/seqmutex.h                        |   4 +
 fs/btrfs/block-group.c                        |   2 +
 fs/btrfs/delayed-ref.c                        |   4 +
 fs/btrfs/delayed-ref.h                        |   1 +
 fs/btrfs/extent-tree.c                        |   1 +
 fs/btrfs/free-space-cache.c                   |   1 +
 fs/btrfs/ioctl.c                              |   2 +
 fs/btrfs/qgroup.c                             |   1 +
 fs/btrfs/scrub.c                              |   2 +
 fs/btrfs/tests/delayed-refs-tests.c           |   1 +
 fs/btrfs/tree-log.c                           |   2 +
 fs/btrfs/volumes.c                            |   4 +
 fs/btrfs/zoned.h                              |   4 +
 fs/ceph/caps.c                                |   4 +
 fs/ceph/mds_client.c                          |   1 +
 fs/coda/upcall.c                              |   1 +
 fs/dcache.c                                   |   1 +
 fs/dlm/recoverd.c                             |   2 +
 fs/ecryptfs/main.c                            |   1 +
 fs/ecryptfs/messaging.c                       |   1 +
 fs/erofs/zdata.c                              |   3 +
 fs/eventpoll.c                                |   3 +
 fs/exec.c                                     |   4 +
 fs/ext4/fast_commit.c                         |   1 +
 fs/ext4/mballoc.c                             |   2 +
 fs/f2fs/data.c                                |   1 +
 fs/fat/fatent.c                               |   2 +
 fs/fat/inode.c                                |   2 +
 fs/file.c                                     |   2 +
 fs/fsopen.c                                   |   2 +-
 fs/fuse/inode.c                               |   2 +
 fs/gfs2/rgrp.c                                |   2 +
 fs/gfs2/util.c                                |   1 +
 fs/hfs/bfind.c                                |   2 +
 fs/hfsplus/bfind.c                            |   2 +
 fs/hfsplus/extents.c                          |   2 +
 fs/hpfs/hpfs_fn.h                             |   2 +
 fs/jbd2/checkpoint.c                          |   2 +
 fs/jbd2/commit.c                              |   1 +
 fs/jbd2/journal.c                             |   5 +
 fs/jbd2/transaction.c                         |   2 +
 fs/jffs2/dir.c                                |   4 +
 fs/jffs2/fs.c                                 |   1 +
 fs/jffs2/gc.c                                 |   1 +
 fs/jffs2/nodemgmt.c                           |   2 +
 fs/jffs2/write.c                              |   2 +
 fs/jfs/namei.c                                |   1 +
 fs/kernfs/file.c                              |   9 ++
 fs/lockd/host.c                               |   1 +
 fs/lockd/svclock.c                            |   1 +
 fs/namei.c                                    |   4 +
 fs/namespace.c                                |   2 +-
 fs/netfs/write_issue.c                        |   2 +
 fs/nfsd/nfs4layouts.c                         |   2 +
 fs/nfsd/nfs4proc.c                            |   2 +
 fs/nfsd/nfs4state.c                           |  11 ++
 fs/ntfs3/frecord.c                            |   4 +-
 fs/ntfs3/inode.c                              |   1 +
 fs/ntfs3/namei.c                              |   2 +
 fs/ntfs3/ntfs_fs.h                            |   4 +
 fs/ntfs3/record.c                             |   1 +
 fs/ntfs3/xattr.c                              |   2 +
 fs/ocfs2/cluster/nodemanager.c                |   2 +
 fs/ocfs2/dlmglue.c                            |   2 +
 fs/ocfs2/inode.c                              |   2 +
 fs/ocfs2/refcounttree.c                       |   2 +
 fs/orangefs/devorangefs-req.c                 |   2 +-
 fs/orangefs/orangefs-debugfs.c                |   2 +
 fs/orangefs/waitqueue.c                       |   1 +
 fs/overlayfs/overlayfs.h                      |   3 +
 fs/pipe.c                                     |   2 +
 fs/proc/base.c                                |   2 +-
 fs/proc/proc_tty.c                            |   2 +
 fs/pstore/zone.c                              |   1 +
 fs/smb/client/cifsglob.h                      |   2 +
 fs/smb/client/connect.c                       |   3 +-
 fs/smb/client/fs_context.h                    |   2 +
 fs/smb/client/smbdirect.c                     |   2 +
 fs/smb/client/smbdirect.h                     |   2 +-
 fs/smb/server/connection.h                    |   6 +-
 fs/super.c                                    |   6 +
 fs/ubifs/compress.c                           |   2 +
 fs/ubifs/dir.c                                |   4 +
 fs/ubifs/file.c                               |   6 +
 fs/ubifs/journal.c                            |   3 +
 fs/ubifs/misc.h                               |   2 +
 fs/xfs/scrub/dirtree.c                        |   2 +
 fs/xfs/scrub/dirtree_repair.c                 |   3 +
 fs/xfs/scrub/quota.c                          |   1 +
 fs/xfs/scrub/quota_repair.c                   |   3 +
 fs/xfs/scrub/quotacheck_repair.c              |   3 +
 fs/xfs/scrub/rmap_repair.c                    |   1 +
 fs/xfs/scrub/rtrmap_repair.c                  |   1 +
 fs/xfs/xfs_dquot.c                            |   7 +
 fs/xfs/xfs_dquot.h                            |  10 +-
 fs/xfs/xfs_dquot_item.c                       |   2 +
 fs/xfs/xfs_qm.c                               |   3 +
 fs/xfs/xfs_qm_syscalls.c                      |   1 +
 fs/xfs/xfs_trans_dquot.c                      |   3 +
 include/linux/blkdev.h                        |  11 +-
 include/linux/cgroup.h                        |   2 +
 include/linux/cleanup.h                       |  34 ++++-
 include/linux/device.h                        |  13 +-
 include/linux/fb.h                            |   2 +
 include/linux/fpga/fpga-bridge.h              |   2 +-
 include/linux/fpga/fpga-mgr.h                 |   4 +-
 include/linux/fsnotify_backend.h              |   2 +
 include/linux/gameport.h                      |   1 +
 include/linux/kref.h                          |   3 +
 include/linux/memory_hotplug.h                |   2 +
 include/linux/mfd/si476x-core.h               |   2 +
 include/linux/mutex.h                         |  46 +++---
 include/linux/mutex_types.h                   |   5 +-
 include/linux/netdevice.h                     |   2 +
 include/linux/phy.h                           |   2 +
 include/linux/refcount.h                      |   5 +-
 include/linux/thread_safety.h                 | 141 ++++++++++++++++++
 include/linux/usb.h                           |   3 +-
 include/media/v4l2-ctrls.h                    |   2 +
 include/media/v4l2-subdev.h                   |   5 +
 include/net/bluetooth/l2cap.h                 |   2 +
 include/net/cfg80211.h                        |   2 +
 include/scsi/scsi_proto.h                     |   4 +-
 include/sound/emu10k1.h                       |  12 +-
 include/sound/i2c.h                           |   2 +
 include/sound/soc-card.h                      |   3 +
 include/sound/soc.h                           |  14 ++
 include/trace/events/scsi.h                   |   4 +-
 include/trace/events/target.h                 |   4 +-
 io_uring/cancel.c                             |   1 +
 io_uring/fdinfo.c                             |   1 +
 io_uring/io_uring.c                           |   5 +
 io_uring/io_uring.h                           |   2 +
 io_uring/msg_ring.c                           |   3 +
 io_uring/register.c                           |   6 +
 io_uring/rsrc.c                               |   3 +
 io_uring/sqpoll.c                             |   3 +
 io_uring/tctx.c                               |   1 +
 kernel/acct.c                                 |   3 +
 kernel/audit.c                                |   2 +
 kernel/audit_tree.c                           |   2 +
 kernel/audit_watch.c                          |   1 +
 kernel/bpf/btf.c                              |   1 +
 kernel/bpf/cgroup_iter.c                      |   2 +
 kernel/bpf/verifier.c                         |   1 +
 kernel/cgroup/cgroup-v1.c                     |   4 +
 kernel/cgroup/cgroup.c                        |  18 +++
 kernel/cgroup/cpuset.c                        |   2 +
 kernel/cpu.c                                  |   2 +
 kernel/events/callchain.c                     |   1 +
 kernel/events/core.c                          |   9 ++
 kernel/events/hw_breakpoint.c                 |   2 +
 kernel/fail_function.c                        |   2 +
 kernel/futex/core.c                           |   3 +
 kernel/irq/autoprobe.c                        |   3 +
 kernel/irq/irqdesc.c                          |   2 +
 kernel/irq/msi.c                              |   2 +
 kernel/jump_label.c                           |   2 +
 kernel/kprobes.c                              |   3 +
 kernel/locking/locktorture.c                  |   4 +
 kernel/locking/mutex.c                        |  20 ++-
 kernel/module/main.c                          |   1 +
 kernel/module/procfs.c                        |   2 +
 kernel/params.c                               |   2 +
 kernel/power/autosleep.c                      |   2 +
 kernel/power/main.c                           |   2 +
 kernel/printk/printk.c                        |   2 +
 kernel/rcu/srcutree.c                         |   4 +-
 kernel/rcu/tree_exp.h                         |   1 +
 kernel/sched/core.c                           |   1 +
 kernel/seccomp.c                              |  11 +-
 kernel/static_call_inline.c                   |   2 +
 kernel/torture.c                              |   2 +
 kernel/trace/ftrace.c                         |   7 +
 kernel/trace/ring_buffer.c                    |   2 +
 kernel/trace/rv/rv.c                          |   3 +
 kernel/trace/rv/rv_reactors.c                 |   2 +
 kernel/trace/trace.c                          |  12 ++
 kernel/trace/trace_dynevent.c                 |   2 +
 kernel/trace/trace_events.c                   |  10 ++
 kernel/trace/trace_events_trigger.c           |   2 +
 kernel/trace/trace_events_user.c              |   1 +
 kernel/trace/trace_hwlat.c                    |   2 +
 kernel/trace/trace_osnoise.c                  |   2 +
 kernel/trace/trace_printk.c                   |   8 +
 kernel/trace/trace_recursion_record.c         |   2 +
 kernel/trace/trace_stat.c                     |   2 +
 kernel/trace/trace_uprobe.c                   |   2 +
 kernel/workqueue.c                            |   2 +
 lib/Makefile                                  |   2 +
 lib/dynamic_debug.c                           |   2 +
 lib/error-inject.c                            |   2 +
 lib/kunit/platform.c                          |   1 +
 lib/once.c                                    |   2 +
 mm/damon/sysfs.c                              |   3 +
 mm/hugetlb.c                                  |   4 +
 mm/kmemleak.c                                 |   6 +-
 mm/ksm.c                                      |   1 +
 mm/oom_kill.c                                 |   1 +
 mm/page_alloc.c                               |   4 +
 mm/percpu.c                                   |   1 +
 mm/slab_common.c                              |   2 +
 mm/swap_slots.c                               |   2 +
 mm/swapfile.c                                 |   2 +
 mm/vma.c                                      |   2 +
 mm/zswap.c                                    |   2 +
 net/atm/resources.c                           |   2 +
 net/bluetooth/l2cap_core.c                    |   9 ++
 net/bluetooth/l2cap_sock.c                    |   2 +
 net/bluetooth/rfcomm/sock.c                   |   1 +
 net/bridge/netfilter/ebtables.c               |   5 +
 net/caif/caif_socket.c                        |   2 +
 net/can/j1939/main.c                          |   2 +
 net/ceph/messenger.c                          |   3 +
 net/ceph/messenger_v1.c                       |   2 +
 net/ceph/messenger_v2.c                       |  14 ++
 net/core/dev.c                                |   4 +
 net/core/drop_monitor.c                       |   2 +
 net/core/netdev-genl.c                        |   5 +
 net/core/pktgen.c                             |   1 +
 net/core/rtnetlink.c                          |  12 ++
 net/core/sock.c                               |   2 +
 net/devlink/core.c                            |   3 +
 net/devlink/devl_internal.h                   |   2 +
 net/ethtool/ioctl.c                           |   1 +
 net/ipv6/mcast.c                              |   1 +
 net/mac802154/cfg.c                           |   2 +
 net/mac802154/mib.c                           |   2 +
 net/netfilter/ipset/ip_set_core.c             |   2 +
 net/netfilter/ipvs/ip_vs_app.c                |   2 +
 net/netfilter/nf_log.c                        |   2 +
 net/netfilter/nf_tables_api.c                 |   5 +
 net/netfilter/nfnetlink.c                     |   2 +
 net/netfilter/x_tables.c                      |   8 +
 net/netfilter/xt_hashlimit.c                  |   1 +
 net/netlink/af_netlink.c                      |   2 +
 net/netlink/genetlink.c                       |   7 +
 net/openvswitch/datapath.c                    |   2 +
 net/phonet/socket.c                           |   2 +
 net/qrtr/af_qrtr.c                            |   1 +
 net/rds/ib_cm.c                               |   1 +
 net/rds/rdma_transport.c                      |   1 +
 net/rds/tcp_listen.c                          |   1 +
 net/rxrpc/af_rxrpc.c                          |   1 +
 net/rxrpc/call_object.c                       |   1 +
 net/rxrpc/recvmsg.c                           |   2 +-
 net/rxrpc/sendmsg.c                           |   5 +-
 net/sched/act_api.c                           |   1 +
 net/sched/cls_api.c                           |   1 +
 net/shaper/shaper.c                           |   2 +
 net/smc/af_smc.c                              |   1 +
 net/sunrpc/rpc_pipe.c                         |   2 +
 net/sunrpc/svc_xprt.c                         |   2 +
 net/unix/af_unix.c                            |   1 +
 net/unix/unix_bpf.c                           |   1 +
 net/wireless/nl80211.c                        |   9 ++
 samples/vfio-mdev/mtty.c                      |   1 +
 scripts/Makefile.clang                        |   3 +
 security/apparmor/apparmorfs.c                |   3 +
 security/integrity/ima/ima_fs.c               |   2 +-
 security/integrity/ima/ima_main.c             |   1 +
 security/keys/keyring.c                       |   3 +
 security/tomoyo/gc.c                          |   3 +
 sound/core/compress_offload.c                 |   3 +
 sound/core/oss/pcm_oss.c                      |   9 ++
 sound/core/pcm_native.c                       |   8 +
 sound/core/seq/oss/seq_oss.c                  |   1 +
 sound/core/seq/seq_clientmgr.c                |   2 +
 sound/core/seq/seq_memory.c                   |   1 +
 sound/core/sound.c                            |   1 +
 sound/isa/gus/gus_mem.c                       |   3 +
 sound/pci/ac97/ac97_codec.c                   |   2 +
 sound/pci/hda/hda_intel.c                     |   1 +
 sound/pci/hda/patch_realtek.c                 |   2 +
 sound/pci/hda/tas2781_hda_i2c.c               |   1 +
 sound/pci/ice1712/ak4xxx.c                    |   2 +
 sound/pci/ice1712/delta.c                     |   4 +
 sound/pci/ice1712/ews.c                       |   6 +
 sound/pci/ice1712/hoontech.c                  |   1 +
 sound/pci/ice1712/ice1712.h                   |   2 +
 sound/pci/ice1712/prodigy192.c                |   2 +
 sound/pci/ice1712/revo.c                      |   4 +
 sound/pci/oxygen/oxygen_lib.c                 |   2 +-
 sound/pci/pcxhr/pcxhr_core.c                  |   1 +
 sound/soc/codecs/rt5677.c                     |   2 +
 sound/soc/codecs/wcd-mbhc-v2.c                |   7 +-
 sound/soc/soc-dapm.c                          |   9 ++
 sound/soc/soc-pcm.c                           |  25 ++++
 sound/soc/sof/intel/hda-mlink.c               |   2 +
 sound/soc/sof/ipc3-control.c                  |   1 +
 sound/soc/sof/ipc4-control.c                  |   1 +
 sound/synth/emux/soundfont.c                  |   2 +
 virt/kvm/kvm_main.c                           |   3 +
 910 files changed, 2635 insertions(+), 422 deletions(-)
 create mode 100644 include/linux/thread_safety.h
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Marco Elver 10 months, 1 week ago
On Thu, 6 Feb 2025 at 18:52, Bart Van Assche <bvanassche@acm.org> wrote:
>
> Hi Peter,
>
> As you may know the Clang compiler can perform certain thread-safety checks at
> compile time. This includes checking whether locking calls in a function match
> the function attributes and also whether annotated structure members are
> protected by the synchronization objects declared with GUARDED_BY(). As one can
> see this patch series includes a significant number of fixes for locking bugs.
> All these locking bugs have been discovered by the Clang thread-safety checker.
> I think this shows that it is useful to enable compile-time thread-safety
> checks.
>
> The Clang thread-safety infrastructure is not new. Some user space code in the
> kernel tree already uses it. See also the header file tools/perf/util/mutex.h.
> There are other projects that started using this infrastructure a while ago,
> e.g. Qemu. The header file include/qemu/clang-tsa.h was added more than two
> years ago to the Qemu project.
>
> This patch series has been posted as an RFC because at this stage my goal is to
> gather feedback about the following:
>  - Whether or not to enable compile-time thread-safety checking in the Linux
>    kernel.
>  - The names of the macros in header file include/linux/thread_safety.h. The
>    proposed names come from the Clang documentation (ACQUIRE(), RELEASE(),
>    REQUIRES(), ...). In the Qemu header file for thread-safety support these
>    macros have a prefix (TSA_ = Thread-Safety Analysis).
>  - The changes made in header file include/linux/cleanup.h that support
>    annotating constructor functions with function attributes.
>  - Whether or not to split the two treewide patches in this series into one
>    patch per kernel driver.
>  - How to merge this patch series. The second last patch in this series modifies
>    888 source files. If it is split into one patch per driver, this patch series
>    will become too large to be posted as a single patch series.
>
> Annotating struct mutex is a first step. Once struct mutex is annotated, driver
> contributors and/or maintainers can annotate structure members with GUARDED_BY()
> where this is considered useful.
>
> There are more synchronization objects that can be annotated with thread-safety
> attributes, e.g. spinlocks. This patch series only annotates struct mutex
> because annotating other synchronization objects too would have made this patch
> series too large.

Thanks Bart, for posting your approach.
I will also discuss my approach, as it will give everyone a clearer
picture of the design space here.

Bart and I have concurrently been working on this feature, and only in
recent days learned we both have been working on bringing
-Wthread-safety (aka. Clang's ThreadSafety Analysis [1], aka.
Capability analysis) to the Linux kernel. I have heard there have been
prior attempts, but only recently did Clang make -Wthread-safety
properly work with C code [2].

[1] https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
[2] https://github.com/llvm/llvm-project/issues/20777

However, we also realized there are 2 ways to bring this feature to the kernel:

1. Tree-wide all-or-nothing approach (this RFC). Adding support for
more "capabilities" - initially primarily synchronization primitives -
becomes incredibly hard after the first capability (currently "mutex"
only). This approach comes with all the known caveats of adding a new
tree-wide static analysis to the kernel.

In fact, what it really is, is yet another dialect of C with a
"capability system", with its own constraints. I dislike Clang's
naming and the notion this is about "thread safety only" - it's not.
It's a simple capability system, that can do much more.

In that vein, because we can't change the programming language (even
if from one C dialect to another) of the kernel overnight, a different
approach might cause less friction.

2. A selective, incremental, and much less intrusive approach.
Maintainers of subsystems opt in their modules or directories into
"capability analysis" (via Makefile directive
"CAPABILITY_ANALYSIS_foo.o := y" or "CAPABILITY_ANALYSIS := y"). Most
(eventually all) synchronization primitives and more capabilities
(including ones that could track "irq disabled", "preemption"
disabled, etc.) could be supported.

A prototype of approach #2 can be found here:
https://git.kernel.org/pub/scm/linux/kernel/git/melver/linux.git/log/?h=cap-analysis
Here's the RFC:
https://lore.kernel.org/all/20250206181711.1902989-1-elver@google.com/T/#u

Combining approach #1 and #2 may somehow be possible, but it is
currently eluding me. Clearly, based on the bugs that Bart found, some
way to do tree-wide analysis is very useful!
One idea was to have "capability-selective tree-wide analysis" (such
as mutex only) be controllable via a Kconfig option - the
implementation of that (without excessive ifdefs sprinkled
everywhere), however, most likely requires compiler support.

Depending on the feedback that results from these RFCs, I think we
will be able to plan better which direction things should go.

Thanks,
-- Marco
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Christoph Hellwig 10 months, 1 week ago
On Thu, Feb 06, 2025 at 07:20:33PM +0100, Marco Elver wrote:
> Combining approach #1 and #2 may somehow be possible, but it is
> currently eluding me. Clearly, based on the bugs that Bart found, some
> way to do tree-wide analysis is very useful!
> One idea was to have "capability-selective tree-wide analysis" (such
> as mutex only) be controllable via a Kconfig option - the
> implementation of that (without excessive ifdefs sprinkled
> everywhere), however, most likely requires compiler support.
> 
> Depending on the feedback that results from these RFCs, I think we
> will be able to plan better which direction things should go.

Opt-in just means some code will never get it.  So I think we'll
need to eventually force all the useful capabilities everywhere.

Doing that step by step by opt-in/opt-out for early adopters sounds
fine.
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Bart Van Assche 10 months, 1 week ago
On 2/6/25 10:20 AM, Marco Elver wrote:
> Combining approach #1 and #2 may somehow be possible, but it is
> currently eluding me. Clearly, based on the bugs that Bart found, some
> way to do tree-wide analysis is very useful!
> One idea was to have "capability-selective tree-wide analysis" (such
> as mutex only) be controllable via a Kconfig option - the
> implementation of that (without excessive ifdefs sprinkled
> everywhere), however, most likely requires compiler support.
> 
> Depending on the feedback that results from these RFCs, I think we
> will be able to plan better which direction things should go.

Thank you Marco for having explained clearly and in detail what the
possible paths are for enabling thread-safety support in the Linux
kernel. I agree that there are at least two possible approaches (maybe
there are even more possible approaches?). I'm interested in enabling
the Clang compiler flag -Wthread-safety across the entire kernel. Hence
the choice to start with annotating struct mutex only and to make the
necessary changes across the entire kernel tree.

I'm looking forward to the feedback from others about what their opinion
is about how to enable thread-safety checking in the Linux kernel.

Thanks,

Bart.
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Peter Zijlstra 10 months, 1 week ago
On Thu, Feb 06, 2025 at 10:34:09AM -0800, Bart Van Assche wrote:

> I'm looking forward to the feedback from others about what their opinion
> is about how to enable thread-safety checking in the Linux kernel.

So Bart's patches are rather SHOUTING A LOT:-(, which I find really
jarring to look at.

Also, however much I despise the sparse thing, that is something we
already have some of, so we might as well adapt that.

But I should probably go read up on the whole clang feature first. 

I've seen both have a __guarded_by() variant for structure members, can
you stack those?

Eg. perf has locking where a structure has both a raw_spinlock_t and a
mutex and modification requires holding both, but holding either is
sufficient for reading.
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Marco Elver 10 months, 1 week ago
On Fri, Feb 07, 2025 at 09:42AM +0100, Peter Zijlstra wrote:
> On Thu, Feb 06, 2025 at 10:34:09AM -0800, Bart Van Assche wrote:
> 
> > I'm looking forward to the feedback from others about what their opinion
> > is about how to enable thread-safety checking in the Linux kernel.
> 
> So Bart's patches are rather SHOUTING A LOT:-(, which I find really
> jarring to look at.
> 
> Also, however much I despise the sparse thing, that is something we
> already have some of, so we might as well adapt that.
> 
> But I should probably go read up on the whole clang feature first. 
> 
> I've seen both have a __guarded_by() variant for structure members, can
> you stack those?
> 
> Eg. perf has locking where a structure has both a raw_spinlock_t and a
> mutex and modification requires holding both, but holding either is
> sufficient for reading.

Yes, you can add multiple guarded_by. But it's just going to enforce
that you need to hold both locks before you access the member. If you
want the rules to be more complex, the best way to express that is with
some helpers. E.g. something like this (tested on top my series)

--- a/lib/test_capability-analysis.c
+++ b/lib/test_capability-analysis.c
@@ -479,3 +479,53 @@ static void __used test_local_lock_guard(void)
 	{ guard(local_lock_irqsave)(&test_local_lock_data.lock); this_cpu_add(test_local_lock_data.counter, 1); }
 	{ guard(local_lock_nested_bh)(&test_local_lock_data.lock); this_cpu_add(test_local_lock_data.counter, 1); }
 }
+
+struct some_data {
+	spinlock_t lock;
+	struct mutex mtx;
+	int counter __var_guarded_by(&lock) __var_guarded_by(&mtx);
+};
+
+static void some_data_read_lock_via_lock(struct some_data *d)
+	__acquires(&d->lock) __acquires_shared(&d->mtx)
+{
+	spin_lock(&d->lock);
+	__acquire_shared(&d->mtx);
+}
+
+static void some_data_read_unlock_via_lock(struct some_data *d)
+	__releases(&d->lock) __releases_shared(&d->mtx)
+{
+	__release_shared(&d->mtx);
+	spin_unlock(&d->lock);
+}
+
+static void some_data_read_lock_via_mtx(struct some_data *d)
+	__acquires(&d->mtx) __acquires_shared(&d->lock)
+{
+	mutex_lock(&d->mtx);
+	__acquire_shared(&d->lock);
+}
+
+static void some_data_read_unlock_via_mtx(struct some_data *d)
+	__releases(&d->mtx) __releases_shared(&d->lock)
+{
+	__release_shared(&d->lock);
+	mutex_unlock(&d->mtx);
+}
+
+static void __used foo_1(struct some_data *d)
+{
+	some_data_read_lock_via_lock(d);
+	(void)d->counter;
+	// d->counter++;  // error, because mtx only held shared
+	some_data_read_unlock_via_lock(d);
+}
+
+static void __used foo_2(struct some_data *d)
+{
+	some_data_read_lock_via_mtx(d);
+	(void)d->counter;
+	// d->counter++;  // error, because lock only held shared
+	some_data_read_unlock_via_mtx(d);
+}
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Peter Zijlstra 10 months, 1 week ago
On Fri, Feb 07, 2025 at 10:05:47AM +0100, Marco Elver wrote:

> Yes, you can add multiple guarded_by. But it's just going to enforce
> that you need to hold both locks before you access the member. If you
> want the rules to be more complex, the best way to express that is with
> some helpers. E.g. something like this (tested on top my series)

Oh gawd, this is going to be a pain, isn't it :/
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Bart Van Assche 10 months, 1 week ago
On 2/7/25 1:08 AM, Peter Zijlstra wrote:
> On Fri, Feb 07, 2025 at 10:05:47AM +0100, Marco Elver wrote:
>> Yes, you can add multiple guarded_by. But it's just going to enforce
>> that you need to hold both locks before you access the member. If you
>> want the rules to be more complex, the best way to express that is with
>> some helpers. E.g. something like this (tested on top my series)
> 
> Oh gawd, this is going to be a pain, isn't it :/

The Clang thread-safety annotations are used widely so behavior of
existing attributes must be preserved. I propose to introduce new
thread-safety attributes when useful to annotate kernel code. As an
example, the Clang try_acquire_capability function attribute does not
support functions that return pointers although this is a common pattern
in the Linux kernel. I think that introducing a new function attribute
to support functions that return pointers is a better solution than
trying to annotate such functions with any of the existing Clang
thread-safety attributes.

Thanks,

Bart.
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Marco Elver 10 months, 1 week ago
On Fri, 7 Feb 2025 at 18:46, Bart Van Assche <bvanassche@acm.org> wrote:
>
> On 2/7/25 1:08 AM, Peter Zijlstra wrote:
> > On Fri, Feb 07, 2025 at 10:05:47AM +0100, Marco Elver wrote:
> >> Yes, you can add multiple guarded_by. But it's just going to enforce
> >> that you need to hold both locks before you access the member. If you
> >> want the rules to be more complex, the best way to express that is with
> >> some helpers. E.g. something like this (tested on top my series)
> >
> > Oh gawd, this is going to be a pain, isn't it :/
>
> The Clang thread-safety annotations are used widely so behavior of
> existing attributes must be preserved. I propose to introduce new
> thread-safety attributes when useful to annotate kernel code.

Agreed - we can't change the existing semantics, but if absolutely
necessary we could think about extensions (which I already started for
something else: https://github.com/llvm/llvm-project/pull/123063)

> As an
> example, the Clang try_acquire_capability function attribute does not
> support functions that return pointers although this is a common pattern
> in the Linux kernel. I think that introducing a new function attribute
> to support functions that return pointers is a better solution than
> trying to annotate such functions with any of the existing Clang
> thread-safety attributes.

try_acquire_capability / __cond_acquires(cond, capability) is happy
with pointer-returning functions when using int-literals for "cond"
i.e. 0 or 1 (Clang's documentation says it only wants bool, but that's
wrong). I just tested this on a pointer-returning function, and it
works.
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Bart Van Assche 10 months, 1 week ago
On 2/7/25 10:24 AM, Marco Elver wrote:
> On Fri, 7 Feb 2025 at 18:46, Bart Van Assche <bvanassche@acm.org> wrote:
>> As an
>> example, the Clang try_acquire_capability function attribute does not
>> support functions that return pointers although this is a common pattern
>> in the Linux kernel. I think that introducing a new function attribute
>> to support functions that return pointers is a better solution than
>> trying to annotate such functions with any of the existing Clang
>> thread-safety attributes.
> 
> try_acquire_capability / __cond_acquires(cond, capability) is happy
> with pointer-returning functions when using int-literals for "cond"
> i.e. 0 or 1 (Clang's documentation says it only wants bool, but that's
> wrong). I just tested this on a pointer-returning function, and it
> works.

The first argument of the try_acquire_capability function annotation
must be the value that indicates that the capability has been acquired.
I'm not aware of any function in the Linux kernel that returns a pointer
and where returning a NULL pointer indicates success. Additionally,
return ERR_PTR() is used widely. Neither pattern can be annotated with
try_acquire_capability today. This is why I wrote that we need a new
function attribute for functions that return a pointer.

Thanks,

Bart.
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Marco Elver 10 months, 1 week ago
On Fri, 7 Feb 2025 at 19:35, Bart Van Assche <bvanassche@acm.org> wrote:
>
> On 2/7/25 10:24 AM, Marco Elver wrote:
> > On Fri, 7 Feb 2025 at 18:46, Bart Van Assche <bvanassche@acm.org> wrote:
> >> As an
> >> example, the Clang try_acquire_capability function attribute does not
> >> support functions that return pointers although this is a common pattern
> >> in the Linux kernel. I think that introducing a new function attribute
> >> to support functions that return pointers is a better solution than
> >> trying to annotate such functions with any of the existing Clang
> >> thread-safety attributes.
> >
> > try_acquire_capability / __cond_acquires(cond, capability) is happy
> > with pointer-returning functions when using int-literals for "cond"
> > i.e. 0 or 1 (Clang's documentation says it only wants bool, but that's
> > wrong). I just tested this on a pointer-returning function, and it
> > works.
>
> The first argument of the try_acquire_capability function annotation
> must be the value that indicates that the capability has been acquired.
> I'm not aware of any function in the Linux kernel that returns a pointer
> and where returning a NULL pointer indicates success. Additionally,
> return ERR_PTR() is used widely. Neither pattern can be annotated with
> try_acquire_capability today. This is why I wrote that we need a new
> function attribute for functions that return a pointer.

The static analysis doesn't care about the precise value. If a
non-null pointer indicates successful acquisition, then using the
literal "1" works. ERR_PTR() is a problem given that non-null may
indicate error and success. Type-safety of ERR_PTR() is debatable, and
by that fact alone it's unclear to me how to teach that to the static
analysis, because it doesn't operate on concrete values, but an
abstract state. In this case, it just cares if the branch was taken or
not based on the value of a try_acquire_capability-annotated function,
and the hint on try_acquire_capability tells it which branch is the
one that will have the capability acquired. Code is around here:
https://github.com/llvm/llvm-project/blob/5a0075adbb623c8661862b9af1272b8f430d9e5c/clang/lib/Analysis/ThreadSafety.cpp#L1381
Re: [PATCH RFC 00/33] Compile-time thread-safety checking
Posted by Marco Elver 10 months, 1 week ago
On Fri, 7 Feb 2025 at 10:08, Peter Zijlstra <peterz@infradead.org> wrote:
>
> On Fri, Feb 07, 2025 at 10:05:47AM +0100, Marco Elver wrote:
>
> > Yes, you can add multiple guarded_by. But it's just going to enforce
> > that you need to hold both locks before you access the member. If you
> > want the rules to be more complex, the best way to express that is with
> > some helpers. E.g. something like this (tested on top my series)
>
> Oh gawd, this is going to be a pain, isn't it :/

For complex locking patterns, yes. :-/

Which is why I'm proposing it to be opt-in but relatively complete
(most primitives supported), so that either we have time to work out
how to deal with more complex patterns, or just leave some things
opted-out.