Compare commits
12 Commits
4cb7006cd5
...
main
Author | SHA1 | Date | |
---|---|---|---|
818a459fa3 | |||
bbfd90d5dc | |||
8a22827345 | |||
44cb6acc9c | |||
86c5c0ef41 | |||
720355d977 | |||
28be96caa2 | |||
4d05ae4de6 | |||
48372baf14 | |||
01b98c3c62 | |||
492ec3ca82 | |||
8df072e89b |
1
debian/.gitignore
vendored
1
debian/.gitignore
vendored
@@ -27,6 +27,7 @@
|
||||
/rules.gen
|
||||
!/linux-bpf-dev.*
|
||||
!/linux-cpupower.*
|
||||
!/linux-misc-tools.*
|
||||
!/linux-perf.*
|
||||
|
||||
# Ignore compiled Python files
|
||||
|
4
debian/bin/gencontrol.py
vendored
4
debian/bin/gencontrol.py
vendored
@@ -62,7 +62,7 @@ class Gencontrol(Base):
|
||||
super().do_main_setup(config, vars, makeflags)
|
||||
makeflags.update({
|
||||
'VERSION': self.version.linux_version,
|
||||
'UPSTREAMVERSION': self.version.linux_upstream,
|
||||
'UPSTREAMVERSION': self.version.linux_upstream_full,
|
||||
'ABINAME': self.abiname,
|
||||
'SOURCEVERSION': self.version.complete,
|
||||
})
|
||||
@@ -353,7 +353,7 @@ class Gencontrol(Base):
|
||||
self.abiname = f'{version.linux_upstream_full}'
|
||||
|
||||
self.vars = {
|
||||
'upstreamversion': self.version.linux_upstream,
|
||||
'upstreamversion': self.version.linux_upstream_full,
|
||||
'version': self.version.linux_version,
|
||||
'version_complete': self.version.complete,
|
||||
'source_basename': re.sub(r'-[\d.]+$', '',
|
||||
|
2
debian/bin/genpatch-pf
vendored
2
debian/bin/genpatch-pf
vendored
@@ -7,7 +7,7 @@ w=$(git rev-parse --path-format=absolute --show-toplevel) ; : "${w:?}" ; cd "$w"
|
||||
|
||||
dst='debian/patches/tmp-pf'
|
||||
src='../linux-extras'
|
||||
branches='fixes archlinux cpuidle kbuild nfs smb xfs'
|
||||
branches='archlinux bbr3 cpuidle kbuild steady'
|
||||
|
||||
if [ -d "${dst}" ] ; then rm -rf "${dst}" ; fi
|
||||
mkdir -p "${dst}"
|
||||
|
2
debian/bin/genpatch-zen
vendored
2
debian/bin/genpatch-zen
vendored
@@ -7,7 +7,7 @@ w=$(git rev-parse --path-format=absolute --show-toplevel) ; : "${w:?}" ; cd "$w"
|
||||
|
||||
dst='debian/patches/tmp-zen'
|
||||
src='../linux-extras'
|
||||
branches='zen-sauce fixes'
|
||||
branches='bbr3 fixes zen-sauce'
|
||||
|
||||
if [ -d "${dst}" ] ; then rm -rf "${dst}" ; fi
|
||||
mkdir -p "${dst}"
|
||||
|
31
debian/changelog
vendored
31
debian/changelog
vendored
@@ -1,15 +1,30 @@
|
||||
linux (6.15.3-1) sid; urgency=medium
|
||||
linux (6.16.6-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.15.3
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.16.6
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 19 Jun 2025 17:46:46 +0300
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Tue, 09 Sep 2025 20:27:56 +0300
|
||||
|
||||
linux (6.15.2-1) sid; urgency=medium
|
||||
linux (6.16.5-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.15.1
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.15.2
|
||||
* New upstream release: https://kernelnewbies.org/Linux_6.15
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.16.5
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Tue, 17 Jun 2025 12:18:45 +0300
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 04 Sep 2025 18:03:41 +0300
|
||||
|
||||
linux (6.16.4-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.16.4
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 28 Aug 2025 22:38:27 +0300
|
||||
|
||||
linux (6.16.3-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.16.1
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.16.2
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.16.3
|
||||
* New upstream release: https://kernelnewbies.org/Linux_6.16
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Sun, 24 Aug 2025 20:54:35 +0300
|
||||
|
42
debian/config/amd64/config.cloud
vendored
42
debian/config/amd64/config.cloud
vendored
@@ -91,6 +91,7 @@ CONFIG_IO_DELAY_NONE=y
|
||||
##
|
||||
## file: crypto/Kconfig
|
||||
##
|
||||
# CONFIG_CRYPTO_BENCHMARK is not set
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
@@ -131,7 +132,8 @@ CONFIG_CRYPTO_ZSTD=m
|
||||
CONFIG_ATA=m
|
||||
# CONFIG_ATA_ACPI is not set
|
||||
# CONFIG_SATA_PMP is not set
|
||||
# CONFIG_SATA_AHCI is not set
|
||||
CONFIG_SATA_AHCI=m
|
||||
CONFIG_SATA_MOBILE_LPM_POLICY=0
|
||||
# CONFIG_SATA_AHCI_PLATFORM is not set
|
||||
# CONFIG_AHCI_DWC is not set
|
||||
# CONFIG_SATA_ACARD_AHCI is not set
|
||||
@@ -200,6 +202,7 @@ CONFIG_ATA=m
|
||||
## file: drivers/block/Kconfig
|
||||
##
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
# CONFIG_BLK_DEV_ZONED_LOOP is not set
|
||||
|
||||
##
|
||||
## file: drivers/block/mtip32xx/Kconfig
|
||||
@@ -294,6 +297,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
|
||||
# CONFIG_CRYPTO_DEV_QAT_C62X is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_4XXX is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_420XX is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_6XXX is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set
|
||||
@@ -473,7 +477,6 @@ CONFIG_HWMON=m
|
||||
# CONFIG_SENSORS_NCT6683 is not set
|
||||
# CONFIG_SENSORS_NCT6775 is not set
|
||||
# CONFIG_SENSORS_NPCM7XX is not set
|
||||
# CONFIG_SENSORS_OXP is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
@@ -825,6 +828,7 @@ CONFIG_FUSION_FC=m
|
||||
##
|
||||
## file: drivers/net/Kconfig
|
||||
##
|
||||
# CONFIG_OVPN is not set
|
||||
# CONFIG_FUJITSU_ES is not set
|
||||
|
||||
##
|
||||
@@ -1222,6 +1226,7 @@ CONFIG_FBNIC=m
|
||||
##
|
||||
## file: drivers/net/phy/Kconfig
|
||||
##
|
||||
# CONFIG_AS21XXX_PHY is not set
|
||||
# CONFIG_AIR_EN8811H_PHY is not set
|
||||
# CONFIG_AMD_PHY is not set
|
||||
# CONFIG_ADIN_PHY is not set
|
||||
@@ -1244,6 +1249,7 @@ CONFIG_FBNIC=m
|
||||
# CONFIG_MARVELL_88Q2XXX_PHY is not set
|
||||
# CONFIG_MARVELL_88X2222_PHY is not set
|
||||
# CONFIG_MAXLINEAR_GPHY is not set
|
||||
# CONFIG_MAXLINEAR_86110_PHY is not set
|
||||
# CONFIG_MICREL_PHY is not set
|
||||
# CONFIG_MICROCHIP_T1S_PHY is not set
|
||||
# CONFIG_MICROCHIP_PHY is not set
|
||||
@@ -1388,7 +1394,7 @@ CONFIG_PCIEASPM_DEFAULT=y
|
||||
##
|
||||
## file: drivers/pci/pwrctrl/Kconfig
|
||||
##
|
||||
# CONFIG_PCI_PWRCTL_SLOT is not set
|
||||
# CONFIG_PCI_PWRCTRL_SLOT is not set
|
||||
|
||||
##
|
||||
## file: drivers/pci/switch/Kconfig
|
||||
@@ -1761,6 +1767,7 @@ CONFIG_SOFT_WATCHDOG_PRETIMEOUT=y
|
||||
# CONFIG_IBMASR is not set
|
||||
# CONFIG_WAFER_WDT is not set
|
||||
# CONFIG_IE6XX_WDT is not set
|
||||
# CONFIG_INTEL_OC_WATCHDOG is not set
|
||||
# CONFIG_IT8712F_WDT is not set
|
||||
# CONFIG_IT87_WDT is not set
|
||||
# CONFIG_HP_WATCHDOG is not set
|
||||
@@ -1831,6 +1838,11 @@ CONFIG_SOFT_WATCHDOG_PRETIMEOUT=y
|
||||
##
|
||||
# CONFIG_EFS_FS is not set
|
||||
|
||||
##
|
||||
## file: fs/erofs/Kconfig
|
||||
##
|
||||
# CONFIG_EROFS_FS_ZIP_ACCEL is not set
|
||||
|
||||
##
|
||||
## file: fs/f2fs/Kconfig
|
||||
##
|
||||
@@ -1966,6 +1978,11 @@ CONFIG_PROC_VMCORE=y
|
||||
##
|
||||
# CONFIG_CIFS is not set
|
||||
|
||||
##
|
||||
## file: fs/squashfs/Kconfig
|
||||
##
|
||||
# CONFIG_SQUASHFS_COMP_CACHE_FULL is not set
|
||||
|
||||
##
|
||||
## file: fs/ufs/Kconfig
|
||||
##
|
||||
@@ -1995,6 +2012,7 @@ CONFIG_KEXEC_SIG=y
|
||||
CONFIG_KEXEC_BZIMAGE_VERIFY_SIG=y
|
||||
CONFIG_KEXEC_JUMP=y
|
||||
CONFIG_CRASH_DUMP=y
|
||||
# CONFIG_CRASH_DM_CRYPT is not set
|
||||
CONFIG_CRASH_HOTPLUG=y
|
||||
CONFIG_CRASH_MAX_MEMORY_RANGES=8192
|
||||
|
||||
@@ -2096,7 +2114,7 @@ CONFIG_MAX_SKB_FRAGS=19
|
||||
##
|
||||
## file: net/9p/Kconfig
|
||||
##
|
||||
# CONFIG_NET_9P is not set
|
||||
CONFIG_NET_9P_RDMA=m
|
||||
|
||||
##
|
||||
## file: net/appletalk/Kconfig
|
||||
@@ -2134,17 +2152,6 @@ CONFIG_MAX_SKB_FRAGS=19
|
||||
##
|
||||
# CONFIG_CAN is not set
|
||||
|
||||
##
|
||||
## file: net/dccp/Kconfig
|
||||
##
|
||||
# CONFIG_IP_DCCP_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: net/dccp/ccids/Kconfig
|
||||
##
|
||||
# CONFIG_IP_DCCP_CCID2_DEBUG is not set
|
||||
# CONFIG_IP_DCCP_CCID3_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: net/ieee802154/Kconfig
|
||||
##
|
||||
@@ -2350,10 +2357,7 @@ CONFIG_CRYPTO_LIB_AESCFB=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA_INTERNAL=m
|
||||
CONFIG_CRYPTO_LIB_POLY1305=m
|
||||
CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_POLY1305_INTERNAL=m
|
||||
CONFIG_CRYPTO_POLY1305_X86_64=m
|
||||
CONFIG_CXL_PORT=y
|
||||
CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y
|
||||
@@ -2372,8 +2376,8 @@ CONFIG_LZ4_COMPRESS=m
|
||||
CONFIG_MFD_CORE=m
|
||||
CONFIG_ND_BTT=m
|
||||
CONFIG_ND_PFN=m
|
||||
CONFIG_NETFS_SUPPORT=m
|
||||
# CONFIG_NVMEM_LAYOUTS is not set
|
||||
CONFIG_PLDMFW=y
|
||||
CONFIG_PREEMPT_NONE_BUILD=y
|
||||
CONFIG_RATIONAL=m
|
||||
CONFIG_SCSI_COMMON=m
|
||||
|
159
debian/config/amd64/config.mobile
vendored
159
debian/config/amd64/config.mobile
vendored
@@ -31,7 +31,7 @@ CONFIG_MODIFY_LDT_SYSCALL=y
|
||||
##
|
||||
## file: arch/x86/Kconfig.cpu
|
||||
##
|
||||
CONFIG_X86_64_VERSION=2
|
||||
CONFIG_X86_64_VERSION=3
|
||||
|
||||
##
|
||||
## file: arch/x86/Kconfig.debug
|
||||
@@ -107,6 +107,7 @@ CONFIG_SYSTEM_BLACKLIST_AUTH_UPDATE=y
|
||||
##
|
||||
## file: crypto/Kconfig
|
||||
##
|
||||
CONFIG_CRYPTO_BENCHMARK=m
|
||||
CONFIG_CRYPTO_ECDH=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_842=y
|
||||
@@ -320,6 +321,7 @@ CONFIG_BCMA_DRIVER_GPIO=y
|
||||
## file: drivers/block/Kconfig
|
||||
##
|
||||
CONFIG_ATA_OVER_ETH=m
|
||||
CONFIG_BLK_DEV_ZONED_LOOP=m
|
||||
|
||||
##
|
||||
## file: drivers/block/mtip32xx/Kconfig
|
||||
@@ -332,7 +334,6 @@ CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m
|
||||
CONFIG_BT_HCIBTUSB=m
|
||||
CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y
|
||||
CONFIG_BT_HCIBTUSB_POLL_SYNC=y
|
||||
CONFIG_BT_HCIBTUSB_AUTO_ISOC_ALT=y
|
||||
CONFIG_BT_HCIBTUSB_BCM=y
|
||||
CONFIG_BT_HCIBTUSB_MTK=y
|
||||
CONFIG_BT_HCIBTUSB_RTL=y
|
||||
@@ -545,6 +546,7 @@ CONFIG_CRYPTO_DEV_QAT_C3XXX=m
|
||||
CONFIG_CRYPTO_DEV_QAT_C62X=m
|
||||
CONFIG_CRYPTO_DEV_QAT_4XXX=m
|
||||
CONFIG_CRYPTO_DEV_QAT_420XX=m
|
||||
CONFIG_CRYPTO_DEV_QAT_6XXX=m
|
||||
CONFIG_CRYPTO_DEV_QAT_DH895xCCVF=m
|
||||
CONFIG_CRYPTO_DEV_QAT_C3XXXVF=m
|
||||
CONFIG_CRYPTO_DEV_QAT_C62XVF=m
|
||||
@@ -556,6 +558,7 @@ CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION=y
|
||||
CONFIG_CXL_BUS=m
|
||||
CONFIG_CXL_MEM_RAW_COMMANDS=y
|
||||
CONFIG_CXL_FEATURES=y
|
||||
# CONFIG_CXL_EDAC_MEM_FEATURES is not set
|
||||
|
||||
##
|
||||
## file: drivers/devfreq/Kconfig
|
||||
@@ -711,6 +714,14 @@ CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=m
|
||||
CONFIG_GOOGLE_FRAMEBUFFER_COREBOOT=y
|
||||
# CONFIG_GOOGLE_VPD is not set
|
||||
|
||||
##
|
||||
## file: drivers/firmware/qcom/Kconfig
|
||||
##
|
||||
## choice: TrustZone interface memory allocator mode
|
||||
CONFIG_QCOM_TZMEM_MODE_GENERIC=y
|
||||
# CONFIG_QCOM_TZMEM_MODE_SHMBRIDGE is not set
|
||||
## end choice
|
||||
|
||||
##
|
||||
## file: drivers/fsi/Kconfig
|
||||
##
|
||||
@@ -809,6 +820,7 @@ CONFIG_GPIO_LP87565=m
|
||||
CONFIG_GPIO_MADERA=m
|
||||
CONFIG_GPIO_MAX77620=m
|
||||
CONFIG_GPIO_MAX77650=m
|
||||
CONFIG_GPIO_MAX77759=m
|
||||
CONFIG_GPIO_PALMAS=y
|
||||
CONFIG_GPIO_RC5T583=y
|
||||
CONFIG_GPIO_STMPE=y
|
||||
@@ -855,14 +867,18 @@ CONFIG_GPIO_VIRTUSER=m
|
||||
## file: drivers/gpu/drm/Kconfig
|
||||
##
|
||||
CONFIG_DRM=y
|
||||
# CONFIG_DRM_DEBUG_MM is not set
|
||||
# CONFIG_DRM_PANIC is not set
|
||||
# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
|
||||
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
|
||||
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
|
||||
CONFIG_DRM_VGEM=m
|
||||
CONFIG_DRM_HYPERV=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/Kconfig.debug
|
||||
##
|
||||
# CONFIG_DRM_WERROR is not set
|
||||
# CONFIG_DRM_DEBUG_MM is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/amd/acp/Kconfig
|
||||
@@ -1059,7 +1075,7 @@ CONFIG_NOUVEAU_DEBUG_DEFAULT=3
|
||||
# CONFIG_NOUVEAU_DEBUG_PUSH is not set
|
||||
CONFIG_DRM_NOUVEAU_BACKLIGHT=y
|
||||
# CONFIG_DRM_NOUVEAU_SVM is not set
|
||||
# CONFIG_DRM_NOUVEAU_GSP_DEFAULT is not set
|
||||
CONFIG_DRM_NOUVEAU_GSP_DEFAULT=y
|
||||
CONFIG_DRM_NOUVEAU_CH7006=m
|
||||
CONFIG_DRM_NOUVEAU_SIL164=m
|
||||
|
||||
@@ -1072,6 +1088,7 @@ CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596=m
|
||||
CONFIG_DRM_PANEL_AUO_A030JTN01=m
|
||||
CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0=m
|
||||
CONFIG_DRM_PANEL_BOE_HIMAX8279D=m
|
||||
CONFIG_DRM_PANEL_BOE_TD4320=m
|
||||
CONFIG_DRM_PANEL_BOE_TH101MB31UIG002_28A=m
|
||||
CONFIG_DRM_PANEL_BOE_TV101WUM_NL6=m
|
||||
CONFIG_DRM_PANEL_BOE_TV101WUM_LL2=m
|
||||
@@ -1081,6 +1098,7 @@ CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02=m
|
||||
CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D=m
|
||||
CONFIG_DRM_PANEL_DSI_CM=m
|
||||
CONFIG_DRM_PANEL_LVDS=m
|
||||
CONFIG_DRM_PANEL_HIMAX_HX8279=m
|
||||
CONFIG_DRM_PANEL_HIMAX_HX83102=m
|
||||
CONFIG_DRM_PANEL_HIMAX_HX83112A=m
|
||||
CONFIG_DRM_PANEL_HIMAX_HX8394=m
|
||||
@@ -1115,6 +1133,7 @@ CONFIG_DRM_PANEL_NOVATEK_NT35950=m
|
||||
CONFIG_DRM_PANEL_NOVATEK_NT36523=m
|
||||
CONFIG_DRM_PANEL_NOVATEK_NT36672A=m
|
||||
CONFIG_DRM_PANEL_NOVATEK_NT36672E=m
|
||||
CONFIG_DRM_PANEL_NOVATEK_NT37801=m
|
||||
CONFIG_DRM_PANEL_NOVATEK_NT39016=m
|
||||
CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO=m
|
||||
CONFIG_DRM_PANEL_ORISETECH_OTA5601A=m
|
||||
@@ -1168,6 +1187,7 @@ CONFIG_DRM_PANEL_TPO_TD028TTEC1=m
|
||||
CONFIG_DRM_PANEL_TPO_TD043MTEA1=m
|
||||
CONFIG_DRM_PANEL_TPO_TPG110=m
|
||||
# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set
|
||||
CONFIG_DRM_PANEL_VISIONOX_G2647FB105=m
|
||||
CONFIG_DRM_PANEL_VISIONOX_R66451=m
|
||||
# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set
|
||||
CONFIG_DRM_PANEL_VISIONOX_RM692E5=m
|
||||
@@ -1186,6 +1206,13 @@ CONFIG_DRM_QXL=m
|
||||
CONFIG_DRM_RADEON=m
|
||||
CONFIG_DRM_RADEON_USERPTR=y
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/sitronix/Kconfig
|
||||
##
|
||||
CONFIG_DRM_ST7571_I2C=m
|
||||
CONFIG_DRM_ST7586=m
|
||||
CONFIG_DRM_ST7735R=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/solomon/Kconfig
|
||||
##
|
||||
@@ -1193,6 +1220,13 @@ CONFIG_DRM_SSD130X=m
|
||||
CONFIG_DRM_SSD130X_I2C=m
|
||||
CONFIG_DRM_SSD130X_SPI=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/sysfb/Kconfig
|
||||
##
|
||||
CONFIG_DRM_EFIDRM=m
|
||||
# CONFIG_DRM_SIMPLEDRM is not set
|
||||
CONFIG_DRM_VESADRM=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/tiny/Kconfig
|
||||
##
|
||||
@@ -1202,7 +1236,6 @@ CONFIG_DRM_BOCHS=m
|
||||
CONFIG_DRM_CIRRUS_QEMU=m
|
||||
CONFIG_DRM_GM12U320=m
|
||||
CONFIG_DRM_PANEL_MIPI_DBI=m
|
||||
# CONFIG_DRM_SIMPLEDRM is not set
|
||||
CONFIG_TINYDRM_HX8357D=m
|
||||
CONFIG_TINYDRM_ILI9163=m
|
||||
CONFIG_TINYDRM_ILI9225=m
|
||||
@@ -1211,8 +1244,6 @@ CONFIG_TINYDRM_ILI9486=m
|
||||
CONFIG_TINYDRM_MI0283QT=m
|
||||
CONFIG_TINYDRM_REPAPER=m
|
||||
CONFIG_TINYDRM_SHARP_MEMORY=m
|
||||
CONFIG_TINYDRM_ST7586=m
|
||||
CONFIG_TINYDRM_ST7735R=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/udl/Kconfig
|
||||
@@ -1247,6 +1278,7 @@ CONFIG_DRM_VMWGFX=m
|
||||
CONFIG_DRM_XE=m
|
||||
CONFIG_DRM_XE_DISPLAY=y
|
||||
CONFIG_DRM_XE_DP_TUNNEL=y
|
||||
CONFIG_DRM_XE_GPUSVM=y
|
||||
CONFIG_DRM_XE_DEVMEM_MIRROR=y
|
||||
CONFIG_DRM_XE_FORCE_PROBE=""
|
||||
|
||||
@@ -1528,6 +1560,8 @@ CONFIG_SENSORS_ASUS_ROG_RYUJIN=m
|
||||
CONFIG_SENSORS_AXI_FAN_CONTROL=m
|
||||
CONFIG_SENSORS_K8TEMP=m
|
||||
CONFIG_SENSORS_K10TEMP=m
|
||||
CONFIG_SENSORS_KBATT=m
|
||||
CONFIG_SENSORS_KFAN=m
|
||||
CONFIG_SENSORS_FAM15H_POWER=m
|
||||
CONFIG_SENSORS_APPLESMC=m
|
||||
CONFIG_SENSORS_ASB100=m
|
||||
@@ -1601,6 +1635,7 @@ CONFIG_SENSORS_MAX6639=m
|
||||
CONFIG_SENSORS_MAX6650=m
|
||||
CONFIG_SENSORS_MAX6697=m
|
||||
CONFIG_SENSORS_MAX31790=m
|
||||
CONFIG_SENSORS_MAX77705=m
|
||||
CONFIG_SENSORS_MC34VR500=m
|
||||
CONFIG_SENSORS_MCP3021=m
|
||||
CONFIG_SENSORS_TC654=m
|
||||
@@ -1636,13 +1671,11 @@ CONFIG_SENSORS_NPCM7XX=m
|
||||
CONFIG_SENSORS_NZXT_KRAKEN2=m
|
||||
CONFIG_SENSORS_NZXT_KRAKEN3=m
|
||||
CONFIG_SENSORS_NZXT_SMART2=m
|
||||
CONFIG_SENSORS_OXP=m
|
||||
CONFIG_SENSORS_PCF8591=m
|
||||
CONFIG_SENSORS_PT5161L=m
|
||||
CONFIG_SENSORS_PWM_FAN=m
|
||||
CONFIG_SENSORS_QNAP_MCU_HWMON=m
|
||||
CONFIG_SENSORS_SBTSI=m
|
||||
CONFIG_SENSORS_SBRMI=m
|
||||
CONFIG_SENSORS_SHT15=m
|
||||
CONFIG_SENSORS_SHT21=m
|
||||
CONFIG_SENSORS_SHT3x=m
|
||||
@@ -1742,6 +1775,8 @@ CONFIG_SENSORS_IRPS5401=m
|
||||
CONFIG_SENSORS_ISL68137=m
|
||||
CONFIG_SENSORS_LM25066=m
|
||||
CONFIG_SENSORS_LM25066_REGULATOR=y
|
||||
CONFIG_SENSORS_LT3074=m
|
||||
CONFIG_SENSORS_LT3074_REGULATOR=m
|
||||
CONFIG_SENSORS_LT7182S=m
|
||||
CONFIG_SENSORS_LTC2978=m
|
||||
CONFIG_SENSORS_LTC2978_REGULATOR=y
|
||||
@@ -1856,6 +1891,7 @@ CONFIG_I2C_CGBC=m
|
||||
CONFIG_I2C_DESIGNWARE_CORE=y
|
||||
CONFIG_I2C_DESIGNWARE_SLAVE=y
|
||||
CONFIG_I2C_DESIGNWARE_PLATFORM=y
|
||||
CONFIG_I2C_DESIGNWARE_AMDISP=m
|
||||
CONFIG_I2C_DESIGNWARE_BAYTRAIL=y
|
||||
CONFIG_I2C_DESIGNWARE_PCI=m
|
||||
CONFIG_I2C_EMEV2=m
|
||||
@@ -2414,6 +2450,7 @@ CONFIG_LEDS_RT4505=m
|
||||
CONFIG_LEDS_RT8515=m
|
||||
CONFIG_LEDS_SGM3140=m
|
||||
CONFIG_LEDS_SY7802=m
|
||||
CONFIG_LEDS_TPS6131X=m
|
||||
|
||||
##
|
||||
## file: drivers/leds/rgb/Kconfig
|
||||
@@ -2907,6 +2944,7 @@ CONFIG_MFD_MAX77686=m
|
||||
CONFIG_MFD_MAX77693=m
|
||||
CONFIG_MFD_MAX77705=m
|
||||
CONFIG_MFD_MAX77714=m
|
||||
CONFIG_MFD_MAX77759=m
|
||||
CONFIG_MFD_MAX77843=y
|
||||
CONFIG_MFD_MAX8907=m
|
||||
CONFIG_MFD_MAX8925=y
|
||||
@@ -2931,7 +2969,7 @@ CONFIG_MFD_RC5T583=y
|
||||
CONFIG_MFD_RK8XX_I2C=m
|
||||
CONFIG_MFD_RK8XX_SPI=m
|
||||
CONFIG_MFD_RN5T618=m
|
||||
CONFIG_MFD_SEC_CORE=m
|
||||
CONFIG_MFD_SEC_I2C=m
|
||||
CONFIG_MFD_SI476X_CORE=m
|
||||
CONFIG_MFD_SM501=m
|
||||
CONFIG_MFD_SM501_GPIO=y
|
||||
@@ -3009,6 +3047,7 @@ CONFIG_AD525X_DPOT_SPI=m
|
||||
CONFIG_IBM_ASM=m
|
||||
CONFIG_PHANTOM=m
|
||||
CONFIG_RPMB=m
|
||||
CONFIG_TI_FPC202=m
|
||||
CONFIG_TIFM_CORE=m
|
||||
CONFIG_TIFM_7XX1=m
|
||||
CONFIG_ICS932S401=m
|
||||
@@ -3042,6 +3081,12 @@ CONFIG_MCHP_LAN966X_PCI=m
|
||||
##
|
||||
CONFIG_ALTERA_STAPL=m
|
||||
|
||||
##
|
||||
## file: drivers/misc/amd-sbi/Kconfig
|
||||
##
|
||||
CONFIG_AMD_SBRMI_I2C=m
|
||||
CONFIG_AMD_SBRMI_HWMON=y
|
||||
|
||||
##
|
||||
## file: drivers/misc/bcm-vk/Kconfig
|
||||
##
|
||||
@@ -3348,6 +3393,7 @@ CONFIG_MUX_MMIO=m
|
||||
##
|
||||
## file: drivers/net/Kconfig
|
||||
##
|
||||
CONFIG_OVPN=m
|
||||
CONFIG_NTB_NETDEV=m
|
||||
CONFIG_RIONET=m
|
||||
CONFIG_RIONET_TX_SIZE=128
|
||||
@@ -3709,6 +3755,11 @@ CONFIG_NET_VENDOR_HUAWEI=y
|
||||
##
|
||||
CONFIG_HINIC=m
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/huawei/hinic3/Kconfig
|
||||
##
|
||||
CONFIG_HINIC3=m
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/i825xx/Kconfig
|
||||
##
|
||||
@@ -4170,6 +4221,7 @@ CONFIG_PCS_XPCS=m
|
||||
##
|
||||
CONFIG_LED_TRIGGER_PHY=y
|
||||
CONFIG_SFP=m
|
||||
CONFIG_AS21XXX_PHY=m
|
||||
CONFIG_AIR_EN8811H_PHY=m
|
||||
CONFIG_AMD_PHY=m
|
||||
CONFIG_ADIN_PHY=m
|
||||
@@ -4192,6 +4244,7 @@ CONFIG_MARVELL_10G_PHY=m
|
||||
CONFIG_MARVELL_88Q2XXX_PHY=m
|
||||
CONFIG_MARVELL_88X2222_PHY=m
|
||||
CONFIG_MAXLINEAR_GPHY=m
|
||||
CONFIG_MAXLINEAR_86110_PHY=m
|
||||
CONFIG_MICREL_PHY=m
|
||||
CONFIG_MICROCHIP_T1S_PHY=m
|
||||
CONFIG_MICROCHIP_PHY=m
|
||||
@@ -4415,6 +4468,7 @@ CONFIG_ATH11K_SPECTRAL=y
|
||||
## file: drivers/net/wireless/ath/ath12k/Kconfig
|
||||
##
|
||||
CONFIG_ATH12K=m
|
||||
CONFIG_ATH12K_AHB=y
|
||||
CONFIG_ATH12K_DEBUG=y
|
||||
CONFIG_ATH12K_DEBUGFS=y
|
||||
# CONFIG_ATH12K_TRACING is not set
|
||||
@@ -5020,6 +5074,7 @@ CONFIG_NVME_HWMON=y
|
||||
##
|
||||
## file: drivers/nvmem/Kconfig
|
||||
##
|
||||
CONFIG_NVMEM_MAX77759=m
|
||||
CONFIG_NVMEM_RAVE_SP_EEPROM=m
|
||||
CONFIG_NVMEM_SPMI_SDAM=m
|
||||
CONFIG_NVMEM_U_BOOT_ENV=m
|
||||
@@ -5103,7 +5158,7 @@ CONFIG_PCIEASPM_POWERSAVE=y
|
||||
##
|
||||
## file: drivers/pci/pwrctrl/Kconfig
|
||||
##
|
||||
CONFIG_PCI_PWRCTL_SLOT=m
|
||||
CONFIG_PCI_PWRCTRL_SLOT=m
|
||||
|
||||
##
|
||||
## file: drivers/pci/switch/Kconfig
|
||||
@@ -5300,6 +5355,7 @@ CONFIG_MSI_LAPTOP=m
|
||||
CONFIG_MSI_WMI=m
|
||||
CONFIG_MSI_WMI_PLATFORM=m
|
||||
CONFIG_PCENGINES_APU2=m
|
||||
CONFIG_PORTWELL_EC=m
|
||||
CONFIG_BARCO_P50_GPIO=m
|
||||
CONFIG_SAMSUNG_GALAXYBOOK=m
|
||||
CONFIG_SAMSUNG_LAPTOP=m
|
||||
@@ -5318,6 +5374,7 @@ CONFIG_TOPSTAR_LAPTOP=m
|
||||
CONFIG_SERIAL_MULTI_INSTANTIATE=m
|
||||
CONFIG_INSPUR_PLATFORM_PROFILE=m
|
||||
CONFIG_LENOVO_WMI_CAMERA=m
|
||||
CONFIG_DASHARO_ACPI=m
|
||||
CONFIG_INTEL_IPS=m
|
||||
CONFIG_INTEL_SCU_PCI=y
|
||||
CONFIG_INTEL_SCU_PLATFORM=m
|
||||
@@ -5325,12 +5382,14 @@ CONFIG_INTEL_SCU_IPC_UTIL=m
|
||||
CONFIG_SILICOM_PLATFORM=m
|
||||
CONFIG_WINMATE_FM07_KEYS=m
|
||||
CONFIG_SEL3350_PLATFORM=m
|
||||
CONFIG_OXP_EC=m
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/amd/Kconfig
|
||||
##
|
||||
CONFIG_AMD_3D_VCACHE=m
|
||||
CONFIG_AMD_WBRF=y
|
||||
CONFIG_AMD_ISP_PLATFORM=m
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/amd/hsmp/Kconfig
|
||||
@@ -5466,6 +5525,11 @@ CONFIG_SIEMENS_SIMATIC_IPC_BATT_APOLLOLAKE=m
|
||||
CONFIG_SIEMENS_SIMATIC_IPC_BATT_ELKHARTLAKE=m
|
||||
CONFIG_SIEMENS_SIMATIC_IPC_BATT_F7188X=m
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/tuxedo/nb04/Kconfig
|
||||
##
|
||||
CONFIG_TUXEDO_NB04_WMI_AB=m
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/x86-android-tablets/Kconfig
|
||||
##
|
||||
@@ -5512,6 +5576,7 @@ CONFIG_TEST_POWER=m
|
||||
CONFIG_BATTERY_88PM860X=m
|
||||
CONFIG_CHARGER_ADP5061=m
|
||||
CONFIG_BATTERY_ACT8945A=m
|
||||
CONFIG_BATTERY_CHAGALL=m
|
||||
CONFIG_BATTERY_CW2015=m
|
||||
CONFIG_BATTERY_DS2760=m
|
||||
CONFIG_BATTERY_DS2780=m
|
||||
@@ -5547,6 +5612,7 @@ CONFIG_CHARGER_MAX77650=m
|
||||
CONFIG_CHARGER_MAX77693=m
|
||||
CONFIG_CHARGER_MAX77705=m
|
||||
CONFIG_CHARGER_MAX77976=m
|
||||
CONFIG_CHARGER_MAX8971=m
|
||||
CONFIG_CHARGER_MAX8997=m
|
||||
CONFIG_CHARGER_MAX8998=m
|
||||
CONFIG_CHARGER_MT6360=m
|
||||
@@ -5625,6 +5691,7 @@ CONFIG_PWM_IQS620A=m
|
||||
CONFIG_PWM_LP3943=m
|
||||
CONFIG_PWM_LPSS_PCI=m
|
||||
CONFIG_PWM_LPSS_PLATFORM=m
|
||||
CONFIG_PWM_MC33XS2410=m
|
||||
CONFIG_PWM_NTXEC=m
|
||||
CONFIG_PWM_PCA9685=m
|
||||
CONFIG_PWM_STMPE=y
|
||||
@@ -5682,6 +5749,7 @@ CONFIG_REGULATOR_88PM886=m
|
||||
CONFIG_REGULATOR_ACT8865=m
|
||||
CONFIG_REGULATOR_ACT8945A=m
|
||||
CONFIG_REGULATOR_AD5398=m
|
||||
CONFIG_REGULATOR_ADP5055=m
|
||||
CONFIG_REGULATOR_AAT2870=m
|
||||
CONFIG_REGULATOR_ARIZONA_LDO1=m
|
||||
CONFIG_REGULATOR_ARIZONA_MICSUPP=m
|
||||
@@ -6087,7 +6155,6 @@ CONFIG_SPI_OFFLOAD_TRIGGER_PWM=m
|
||||
## file: drivers/spmi/Kconfig
|
||||
##
|
||||
CONFIG_SPMI=m
|
||||
CONFIG_SPMI_HISI3670=m
|
||||
|
||||
##
|
||||
## file: drivers/ssb/Kconfig
|
||||
@@ -6506,13 +6573,9 @@ CONFIG_USB_RAW_GADGET=m
|
||||
CONFIG_USB_GR_UDC=m
|
||||
CONFIG_USB_R8A66597=m
|
||||
CONFIG_USB_PXA27X=m
|
||||
CONFIG_USB_MV_UDC=m
|
||||
CONFIG_USB_MV_U3D=m
|
||||
CONFIG_USB_SNP_UDC_PLAT=m
|
||||
CONFIG_USB_M66592=m
|
||||
CONFIG_USB_AMD5536UDC=m
|
||||
CONFIG_USB_NET2272=m
|
||||
# CONFIG_USB_NET2272_DMA is not set
|
||||
CONFIG_USB_NET2280=m
|
||||
CONFIG_USB_GOKU=m
|
||||
CONFIG_USB_EG20T=m
|
||||
@@ -6538,6 +6601,7 @@ CONFIG_USB_XHCI_HCD=m
|
||||
# CONFIG_USB_XHCI_DBGCAP is not set
|
||||
CONFIG_USB_XHCI_PCI_RENESAS=m
|
||||
CONFIG_USB_XHCI_PLATFORM=m
|
||||
CONFIG_USB_XHCI_SIDEBAND=y
|
||||
CONFIG_USB_EHCI_HCD=m
|
||||
CONFIG_USB_EHCI_ROOT_HUB_TT=y
|
||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||
@@ -6986,6 +7050,7 @@ CONFIG_IB700_WDT=m
|
||||
CONFIG_IBMASR=m
|
||||
CONFIG_WAFER_WDT=m
|
||||
CONFIG_IE6XX_WDT=m
|
||||
CONFIG_INTEL_OC_WATCHDOG=m
|
||||
CONFIG_IT8712F_WDT=m
|
||||
CONFIG_IT87_WDT=m
|
||||
CONFIG_HP_WATCHDOG=m
|
||||
@@ -7024,14 +7089,6 @@ CONFIG_XEN_SYMS=y
|
||||
##
|
||||
CONFIG_VALIDATE_FS_PARSER=y
|
||||
|
||||
##
|
||||
## file: fs/9p/Kconfig
|
||||
##
|
||||
CONFIG_9P_FS=m
|
||||
CONFIG_9P_FSCACHE=y
|
||||
CONFIG_9P_FS_POSIX_ACL=y
|
||||
CONFIG_9P_FS_SECURITY=y
|
||||
|
||||
##
|
||||
## file: fs/adfs/Kconfig
|
||||
##
|
||||
@@ -7088,6 +7145,11 @@ CONFIG_ECRYPT_FS_MESSAGING=y
|
||||
##
|
||||
CONFIG_EFS_FS=m
|
||||
|
||||
##
|
||||
## file: fs/erofs/Kconfig
|
||||
##
|
||||
CONFIG_EROFS_FS_ZIP_ACCEL=y
|
||||
|
||||
##
|
||||
## file: fs/f2fs/Kconfig
|
||||
##
|
||||
@@ -7285,6 +7347,11 @@ CONFIG_CIFS_SWN_UPCALL=y
|
||||
CONFIG_CIFS_FSCACHE=y
|
||||
# CONFIG_CIFS_COMPRESSION is not set
|
||||
|
||||
##
|
||||
## file: fs/squashfs/Kconfig
|
||||
##
|
||||
CONFIG_SQUASHFS_COMP_CACHE_FULL=y
|
||||
|
||||
##
|
||||
## file: fs/ubifs/Kconfig
|
||||
##
|
||||
@@ -7324,6 +7391,7 @@ CONFIG_LOG_CPU_MAX_BUF_SHIFT=14
|
||||
CONFIG_UCLAMP_TASK=y
|
||||
CONFIG_UCLAMP_BUCKETS_COUNT=10
|
||||
CONFIG_RT_GROUP_SCHED=y
|
||||
# CONFIG_RT_GROUP_SCHED_DEFAULT_DISABLED is not set
|
||||
CONFIG_UCLAMP_TASK_GROUP=y
|
||||
|
||||
##
|
||||
@@ -7534,12 +7602,7 @@ CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
##
|
||||
## file: net/9p/Kconfig
|
||||
##
|
||||
CONFIG_NET_9P=m
|
||||
CONFIG_NET_9P_FD=m
|
||||
CONFIG_NET_9P_VIRTIO=m
|
||||
CONFIG_NET_9P_XEN=m
|
||||
CONFIG_NET_9P_USBG=m
|
||||
# CONFIG_NET_9P_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: net/appletalk/Kconfig
|
||||
@@ -7626,17 +7689,6 @@ CONFIG_CAN_ISOTP=m
|
||||
##
|
||||
CONFIG_CAN_J1939=m
|
||||
|
||||
##
|
||||
## file: net/dccp/Kconfig
|
||||
##
|
||||
CONFIG_IP_DCCP_DEBUG=y
|
||||
|
||||
##
|
||||
## file: net/dccp/ccids/Kconfig
|
||||
##
|
||||
CONFIG_IP_DCCP_CCID2_DEBUG=y
|
||||
CONFIG_IP_DCCP_CCID3_DEBUG=y
|
||||
|
||||
##
|
||||
## file: net/ieee802154/Kconfig
|
||||
##
|
||||
@@ -7780,6 +7832,7 @@ CONFIG_AF_RXRPC_IPV6=y
|
||||
# CONFIG_AF_RXRPC_INJECT_RX_DELAY is not set
|
||||
# CONFIG_AF_RXRPC_DEBUG is not set
|
||||
CONFIG_RXKAD=y
|
||||
# CONFIG_RXGK is not set
|
||||
# CONFIG_RXPERF is not set
|
||||
|
||||
##
|
||||
@@ -8065,6 +8118,7 @@ CONFIG_SND_YMFPCI=m
|
||||
## file: sound/pci/hda/Kconfig
|
||||
##
|
||||
CONFIG_SND_HDA_INTEL=m
|
||||
CONFIG_SND_HDA_ACPI=m
|
||||
CONFIG_SND_HDA_HWDEP=y
|
||||
CONFIG_SND_HDA_RECONFIG=y
|
||||
CONFIG_SND_HDA_INPUT_BEEP=y
|
||||
@@ -8099,6 +8153,7 @@ CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM=y
|
||||
## file: sound/soc/Kconfig
|
||||
##
|
||||
CONFIG_SND_SOC=m
|
||||
CONFIG_SND_SOC_USB=m
|
||||
|
||||
##
|
||||
## file: sound/soc/adi/Kconfig
|
||||
@@ -8220,6 +8275,7 @@ CONFIG_SND_SOC_CS42XX8_I2C=m
|
||||
CONFIG_SND_SOC_CS43130=m
|
||||
CONFIG_SND_SOC_CS4341=m
|
||||
CONFIG_SND_SOC_CS4349=m
|
||||
CONFIG_SND_SOC_CS48L32=m
|
||||
CONFIG_SND_SOC_CS53L30=m
|
||||
CONFIG_SND_SOC_CS530X_I2C=m
|
||||
CONFIG_SND_SOC_CX2072X=m
|
||||
@@ -8233,6 +8289,8 @@ CONFIG_SND_SOC_ES8323=m
|
||||
CONFIG_SND_SOC_ES8326=m
|
||||
CONFIG_SND_SOC_ES8328_I2C=m
|
||||
CONFIG_SND_SOC_ES8328_SPI=m
|
||||
CONFIG_SND_SOC_ES8375=m
|
||||
CONFIG_SND_SOC_ES8389=m
|
||||
CONFIG_SND_SOC_FRAMER=m
|
||||
CONFIG_SND_SOC_GTM601=m
|
||||
CONFIG_SND_SOC_HDA=m
|
||||
@@ -8291,6 +8349,8 @@ CONFIG_SND_SOC_RT722_SDCA_SDW=m
|
||||
CONFIG_SND_SOC_RT715_SDW=m
|
||||
CONFIG_SND_SOC_RT715_SDCA_SDW=m
|
||||
CONFIG_SND_SOC_RT9120=m
|
||||
CONFIG_SND_SOC_RT9123=m
|
||||
CONFIG_SND_SOC_RT9123P=m
|
||||
CONFIG_SND_SOC_RTQ9128=m
|
||||
CONFIG_SND_SOC_SDW_MOCKUP=m
|
||||
CONFIG_SND_SOC_SGTL5000=m
|
||||
@@ -8368,6 +8428,7 @@ CONFIG_SND_SOC_WM8962=m
|
||||
CONFIG_SND_SOC_WM8974=m
|
||||
CONFIG_SND_SOC_WM8978=m
|
||||
CONFIG_SND_SOC_WM8985=m
|
||||
CONFIG_SND_SOC_WM8998=m
|
||||
CONFIG_SND_SOC_WSA881X=m
|
||||
CONFIG_SND_SOC_WSA883X=m
|
||||
CONFIG_SND_SOC_WSA884X=m
|
||||
@@ -8455,6 +8516,7 @@ CONFIG_SND_SOC_INTEL_AVS=m
|
||||
##
|
||||
## file: sound/soc/intel/avs/boards/Kconfig
|
||||
##
|
||||
# CONFIG_SND_SOC_INTEL_AVS_CARDNAME_OBSOLETE is not set
|
||||
CONFIG_SND_SOC_INTEL_AVS_MACH_DA7219=m
|
||||
CONFIG_SND_SOC_INTEL_AVS_MACH_DMIC=m
|
||||
CONFIG_SND_SOC_INTEL_AVS_MACH_ES8336=m
|
||||
@@ -8592,6 +8654,7 @@ CONFIG_SND_USB_US122L=m
|
||||
CONFIG_SND_USB_6FIRE=m
|
||||
CONFIG_SND_USB_HIFACE=m
|
||||
CONFIG_SND_BCD2000=m
|
||||
CONFIG_SND_USB_AUDIO_QMI=m
|
||||
|
||||
##
|
||||
## file: sound/usb/line6/Kconfig
|
||||
@@ -8696,10 +8759,7 @@ CONFIG_CRYPTO_LIB_ARC4=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA=y
|
||||
CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y
|
||||
CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y
|
||||
CONFIG_CRYPTO_LIB_CHACHA_INTERNAL=y
|
||||
CONFIG_CRYPTO_LIB_POLY1305=y
|
||||
CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
|
||||
CONFIG_CRYPTO_LIB_POLY1305_INTERNAL=y
|
||||
CONFIG_CRYPTO_POLY1305_X86_64=y
|
||||
CONFIG_CXL_PORT=m
|
||||
CONFIG_DCA=m
|
||||
@@ -8746,6 +8806,7 @@ CONFIG_DRM_PANEL_BRIDGE=y
|
||||
CONFIG_DRM_PRIVACY_SCREEN=y
|
||||
CONFIG_DRM_SCHED=m
|
||||
CONFIG_DRM_SUBALLOC_HELPER=m
|
||||
CONFIG_DRM_SYSFB_HELPER=m
|
||||
CONFIG_DRM_TTM=m
|
||||
CONFIG_DRM_TTM_HELPER=m
|
||||
CONFIG_DRM_VRAM_HELPER=m
|
||||
@@ -8790,6 +8851,7 @@ CONFIG_IGC_LEDS=y
|
||||
CONFIG_INTEL_ATOMISP2_PDX86=y
|
||||
CONFIG_INTEL_GTT=y
|
||||
CONFIG_INTEL_IDXD_BUS=m
|
||||
CONFIG_INTEL_PMC_SSRAM_TELEMETRY=m
|
||||
CONFIG_INTEL_PMT_CLASS=m
|
||||
CONFIG_INTEL_SCU=y
|
||||
CONFIG_INTEL_SCU_IPC=y
|
||||
@@ -8803,7 +8865,6 @@ CONFIG_IOMMUFD_DRIVER_CORE=y
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_IPMI_DMI_DECODE=y
|
||||
CONFIG_IPMI_PLAT_DATA=y
|
||||
CONFIG_IP_DCCP_TFRC_DEBUG=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_SIM=y
|
||||
CONFIG_ISA_BUS_API=y
|
||||
@@ -8843,6 +8904,7 @@ CONFIG_MFD_INTEL_LPSS=m
|
||||
CONFIG_MFD_INTEL_M10_BMC_CORE=m
|
||||
CONFIG_MFD_MC13XXX=m
|
||||
CONFIG_MFD_RK8XX=m
|
||||
CONFIG_MFD_SEC_CORE=m
|
||||
CONFIG_MFD_SIMPLE_MFD_I2C=m
|
||||
CONFIG_MFD_TPS65912=m
|
||||
CONFIG_MFD_TPS6594=m
|
||||
@@ -8885,7 +8947,6 @@ CONFIG_MTK_NET_PHYLIB=m
|
||||
CONFIG_MULTIPLEXER=m
|
||||
CONFIG_ND_BTT=y
|
||||
CONFIG_ND_PFN=y
|
||||
CONFIG_NETFS_SUPPORT=m
|
||||
CONFIG_NET_CLS=y
|
||||
CONFIG_NFC_MICROREAD=m
|
||||
CONFIG_NFC_MRVL=m
|
||||
@@ -8921,7 +8982,7 @@ CONFIG_PCIE_DW_PLAT=y
|
||||
CONFIG_PCIE_PLDA_HOST=y
|
||||
CONFIG_PCI_ECAM=y
|
||||
CONFIG_PCI_HOST_COMMON=y
|
||||
CONFIG_PCI_PWRCTL=m
|
||||
CONFIG_PCI_PWRCTRL=m
|
||||
CONFIG_PCS_LYNX=m
|
||||
CONFIG_PHYLIB_LEDS=y
|
||||
CONFIG_PINCTRL_CS47L15=y
|
||||
@@ -8948,10 +9009,13 @@ CONFIG_PREEMPT_COUNT=y
|
||||
CONFIG_PWM_DWC_CORE=m
|
||||
CONFIG_PWM_LPSS=m
|
||||
CONFIG_QCA7000=m
|
||||
CONFIG_QCOM_MDT_LOADER=m
|
||||
CONFIG_QCOM_NET_PHYLIB=m
|
||||
CONFIG_QCOM_PDR_HELPERS=m
|
||||
CONFIG_QCOM_PDR_MSG=m
|
||||
CONFIG_QCOM_QMI_HELPERS=m
|
||||
CONFIG_QCOM_SCM=m
|
||||
CONFIG_QCOM_TZMEM=m
|
||||
CONFIG_QTNFMAC=m
|
||||
CONFIG_RAID6_PQ=m
|
||||
CONFIG_RATIONAL=y
|
||||
@@ -9047,7 +9111,6 @@ CONFIG_SND_HDA=m
|
||||
CONFIG_SND_HDA_CIRRUS_SCODEC=m
|
||||
CONFIG_SND_HDA_COMPONENT=y
|
||||
CONFIG_SND_HDA_CORE=m
|
||||
CONFIG_SND_HDA_CS_DSP_CONTROLS=m
|
||||
CONFIG_SND_HDA_DSP_LOADER=y
|
||||
CONFIG_SND_HDA_EXT_CORE=m
|
||||
CONFIG_SND_HDA_GENERIC_LEDS=y
|
||||
@@ -9055,6 +9118,7 @@ CONFIG_SND_HDA_I915=y
|
||||
CONFIG_SND_HDA_SCODEC_COMPONENT=m
|
||||
CONFIG_SND_HDA_SCODEC_CS35L41=m
|
||||
CONFIG_SND_HDA_SCODEC_CS35L56=m
|
||||
CONFIG_SND_HDA_SCODEC_TAS2781=m
|
||||
CONFIG_SND_HWDEP=m
|
||||
CONFIG_SND_INTEL_DSP_CONFIG=m
|
||||
CONFIG_SND_INTEL_NHLT=y
|
||||
@@ -9197,6 +9261,7 @@ CONFIG_SND_SOC_SOF_XTENSA=m
|
||||
CONFIG_SND_SOC_SRC4XXX=m
|
||||
CONFIG_SND_SOC_SSM2602=m
|
||||
CONFIG_SND_SOC_TAS2781_COMLIB=m
|
||||
CONFIG_SND_SOC_TAS2781_COMLIB_I2C=m
|
||||
CONFIG_SND_SOC_TAS2781_FMWLIB=m
|
||||
CONFIG_SND_SOC_TLV320AIC23=m
|
||||
CONFIG_SND_SOC_TLV320AIC32X4=m
|
||||
|
94
debian/config/amd64/config.vm
vendored
94
debian/config/amd64/config.vm
vendored
@@ -96,6 +96,7 @@ CONFIG_IO_DELAY_NONE=y
|
||||
##
|
||||
## file: crypto/Kconfig
|
||||
##
|
||||
CONFIG_CRYPTO_BENCHMARK=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
@@ -146,7 +147,8 @@ CONFIG_ANDROID_BINDER_DEVICES="binder"
|
||||
CONFIG_ATA=m
|
||||
# CONFIG_ATA_ACPI is not set
|
||||
# CONFIG_SATA_PMP is not set
|
||||
# CONFIG_SATA_AHCI is not set
|
||||
CONFIG_SATA_AHCI=m
|
||||
CONFIG_SATA_MOBILE_LPM_POLICY=0
|
||||
# CONFIG_SATA_AHCI_PLATFORM is not set
|
||||
# CONFIG_AHCI_DWC is not set
|
||||
# CONFIG_SATA_ACARD_AHCI is not set
|
||||
@@ -215,6 +217,7 @@ CONFIG_ATA=m
|
||||
## file: drivers/block/Kconfig
|
||||
##
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
CONFIG_BLK_DEV_ZONED_LOOP=m
|
||||
|
||||
##
|
||||
## file: drivers/block/mtip32xx/Kconfig
|
||||
@@ -341,6 +344,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
|
||||
# CONFIG_CRYPTO_DEV_QAT_C62X is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_4XXX is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_420XX is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_6XXX is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set
|
||||
# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set
|
||||
@@ -550,14 +554,18 @@ CONFIG_GPIO_SIM=m
|
||||
## file: drivers/gpu/drm/Kconfig
|
||||
##
|
||||
CONFIG_DRM=y
|
||||
# CONFIG_DRM_DEBUG_MM is not set
|
||||
# CONFIG_DRM_PANIC is not set
|
||||
# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
|
||||
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
|
||||
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
|
||||
CONFIG_DRM_VGEM=m
|
||||
CONFIG_DRM_HYPERV=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/Kconfig.debug
|
||||
##
|
||||
# CONFIG_DRM_WERROR is not set
|
||||
# CONFIG_DRM_DEBUG_MM is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/amd/amdgpu/Kconfig
|
||||
@@ -635,11 +643,23 @@ CONFIG_DRM_QXL=m
|
||||
##
|
||||
# CONFIG_DRM_RADEON is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/sitronix/Kconfig
|
||||
##
|
||||
# CONFIG_DRM_ST7571_I2C is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/solomon/Kconfig
|
||||
##
|
||||
# CONFIG_DRM_SSD130X is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/sysfb/Kconfig
|
||||
##
|
||||
CONFIG_DRM_EFIDRM=m
|
||||
# CONFIG_DRM_SIMPLEDRM is not set
|
||||
CONFIG_DRM_VESADRM=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/tiny/Kconfig
|
||||
##
|
||||
@@ -647,7 +667,6 @@ CONFIG_DRM_QXL=m
|
||||
CONFIG_DRM_BOCHS=m
|
||||
CONFIG_DRM_CIRRUS_QEMU=m
|
||||
# CONFIG_DRM_GM12U320 is not set
|
||||
# CONFIG_DRM_SIMPLEDRM is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/udl/Kconfig
|
||||
@@ -972,11 +991,9 @@ CONFIG_HWMON=y
|
||||
# CONFIG_SENSORS_NZXT_KRAKEN2 is not set
|
||||
# CONFIG_SENSORS_NZXT_KRAKEN3 is not set
|
||||
# CONFIG_SENSORS_NZXT_SMART2 is not set
|
||||
# CONFIG_SENSORS_OXP is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_PT5161L is not set
|
||||
# CONFIG_SENSORS_SBTSI is not set
|
||||
# CONFIG_SENSORS_SBRMI is not set
|
||||
# CONFIG_SENSORS_SHT15 is not set
|
||||
# CONFIG_SENSORS_SHT21 is not set
|
||||
# CONFIG_SENSORS_SHT3x is not set
|
||||
@@ -1058,6 +1075,7 @@ CONFIG_SENSORS_PMBUS=m
|
||||
# CONFIG_SENSORS_IRPS5401 is not set
|
||||
# CONFIG_SENSORS_ISL68137 is not set
|
||||
# CONFIG_SENSORS_LM25066 is not set
|
||||
# CONFIG_SENSORS_LT3074 is not set
|
||||
# CONFIG_SENSORS_LT7182S is not set
|
||||
# CONFIG_SENSORS_LTC2978 is not set
|
||||
# CONFIG_SENSORS_LTC3815 is not set
|
||||
@@ -1703,6 +1721,7 @@ CONFIG_MFD_INTEL_PMC_BXT=m
|
||||
# CONFIG_AD525X_DPOT is not set
|
||||
# CONFIG_IBM_ASM is not set
|
||||
# CONFIG_PHANTOM is not set
|
||||
# CONFIG_TI_FPC202 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
# CONFIG_ICS932S401 is not set
|
||||
# CONFIG_ENCLOSURE_SERVICES is not set
|
||||
@@ -1725,6 +1744,12 @@ CONFIG_NTSYNC=m
|
||||
##
|
||||
# CONFIG_ALTERA_STAPL is not set
|
||||
|
||||
##
|
||||
## file: drivers/misc/amd-sbi/Kconfig
|
||||
##
|
||||
CONFIG_AMD_SBRMI_I2C=m
|
||||
CONFIG_AMD_SBRMI_HWMON=y
|
||||
|
||||
##
|
||||
## file: drivers/misc/bcm-vk/Kconfig
|
||||
##
|
||||
@@ -1794,6 +1819,7 @@ CONFIG_EEPROM_AT24=m
|
||||
##
|
||||
## file: drivers/net/Kconfig
|
||||
##
|
||||
CONFIG_OVPN=m
|
||||
# CONFIG_FUJITSU_ES is not set
|
||||
|
||||
##
|
||||
@@ -2200,6 +2226,7 @@ CONFIG_MCTP_TRANSPORT_USB=m
|
||||
## file: drivers/net/phy/Kconfig
|
||||
##
|
||||
# CONFIG_SFP is not set
|
||||
# CONFIG_AS21XXX_PHY is not set
|
||||
# CONFIG_AIR_EN8811H_PHY is not set
|
||||
# CONFIG_AMD_PHY is not set
|
||||
# CONFIG_ADIN_PHY is not set
|
||||
@@ -2222,6 +2249,7 @@ CONFIG_MCTP_TRANSPORT_USB=m
|
||||
# CONFIG_MARVELL_88Q2XXX_PHY is not set
|
||||
# CONFIG_MARVELL_88X2222_PHY is not set
|
||||
# CONFIG_MAXLINEAR_GPHY is not set
|
||||
# CONFIG_MAXLINEAR_86110_PHY is not set
|
||||
# CONFIG_MICREL_PHY is not set
|
||||
# CONFIG_MICROCHIP_T1S_PHY is not set
|
||||
# CONFIG_MICROCHIP_PHY is not set
|
||||
@@ -2392,7 +2420,7 @@ CONFIG_PCIEASPM_DEFAULT=y
|
||||
##
|
||||
## file: drivers/pci/pwrctrl/Kconfig
|
||||
##
|
||||
# CONFIG_PCI_PWRCTL_SLOT is not set
|
||||
CONFIG_PCI_PWRCTRL_SLOT=m
|
||||
|
||||
##
|
||||
## file: drivers/pci/switch/Kconfig
|
||||
@@ -2470,6 +2498,7 @@ CONFIG_WMI_BMOF=m
|
||||
CONFIG_ACPI_QUICKSTART=m
|
||||
# CONFIG_MEEGOPAD_ANX7428 is not set
|
||||
CONFIG_MSI_WMI_PLATFORM=m
|
||||
# CONFIG_PORTWELL_EC is not set
|
||||
# CONFIG_BARCO_P50_GPIO is not set
|
||||
# CONFIG_SAMSUNG_Q10 is not set
|
||||
# CONFIG_TOSHIBA_BT_RFKILL is not set
|
||||
@@ -2480,6 +2509,7 @@ CONFIG_MSI_WMI_PLATFORM=m
|
||||
CONFIG_SERIAL_MULTI_INSTANTIATE=m
|
||||
# CONFIG_INSPUR_PLATFORM_PROFILE is not set
|
||||
# CONFIG_LENOVO_WMI_CAMERA is not set
|
||||
# CONFIG_DASHARO_ACPI is not set
|
||||
# CONFIG_INTEL_IPS is not set
|
||||
# CONFIG_INTEL_SCU_PCI is not set
|
||||
# CONFIG_INTEL_SCU_PLATFORM is not set
|
||||
@@ -2490,6 +2520,7 @@ CONFIG_SERIAL_MULTI_INSTANTIATE=m
|
||||
##
|
||||
# CONFIG_AMD_3D_VCACHE is not set
|
||||
# CONFIG_AMD_WBRF is not set
|
||||
CONFIG_AMD_ISP_PLATFORM=m
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/amd/hsmp/Kconfig
|
||||
@@ -2560,6 +2591,11 @@ CONFIG_SERIAL_MULTI_INSTANTIATE=m
|
||||
##
|
||||
# CONFIG_SIEMENS_SIMATIC_IPC is not set
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/tuxedo/nb04/Kconfig
|
||||
##
|
||||
# CONFIG_TUXEDO_NB04_WMI_AB is not set
|
||||
|
||||
##
|
||||
## file: drivers/pnp/Kconfig
|
||||
##
|
||||
@@ -2600,6 +2636,7 @@ CONFIG_CHARGER_GPIO=m
|
||||
# CONFIG_CHARGER_LT3651 is not set
|
||||
# CONFIG_CHARGER_LTC4162L is not set
|
||||
# CONFIG_CHARGER_MAX77976 is not set
|
||||
# CONFIG_CHARGER_MAX8971 is not set
|
||||
# CONFIG_CHARGER_BQ2415X is not set
|
||||
# CONFIG_CHARGER_BQ24190 is not set
|
||||
# CONFIG_CHARGER_BQ24257 is not set
|
||||
@@ -2970,6 +3007,7 @@ CONFIG_USB_XHCI_HCD=m
|
||||
# CONFIG_USB_XHCI_DBGCAP is not set
|
||||
CONFIG_USB_XHCI_PCI_RENESAS=m
|
||||
CONFIG_USB_XHCI_PLATFORM=m
|
||||
# CONFIG_USB_XHCI_SIDEBAND is not set
|
||||
CONFIG_USB_EHCI_HCD=m
|
||||
CONFIG_USB_EHCI_ROOT_HUB_TT=y
|
||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||
@@ -3202,6 +3240,7 @@ CONFIG_SOFT_WATCHDOG_PRETIMEOUT=y
|
||||
# CONFIG_IBMASR is not set
|
||||
# CONFIG_WAFER_WDT is not set
|
||||
# CONFIG_IE6XX_WDT is not set
|
||||
# CONFIG_INTEL_OC_WATCHDOG is not set
|
||||
# CONFIG_IT8712F_WDT is not set
|
||||
# CONFIG_IT87_WDT is not set
|
||||
# CONFIG_HP_WATCHDOG is not set
|
||||
@@ -3229,14 +3268,6 @@ CONFIG_SOFT_WATCHDOG_PRETIMEOUT=y
|
||||
##
|
||||
# CONFIG_VALIDATE_FS_PARSER is not set
|
||||
|
||||
##
|
||||
## file: fs/9p/Kconfig
|
||||
##
|
||||
CONFIG_9P_FS=y
|
||||
CONFIG_9P_FSCACHE=y
|
||||
CONFIG_9P_FS_POSIX_ACL=y
|
||||
CONFIG_9P_FS_SECURITY=y
|
||||
|
||||
##
|
||||
## file: fs/adfs/Kconfig
|
||||
##
|
||||
@@ -3284,6 +3315,11 @@ CONFIG_ECRYPT_FS_MESSAGING=y
|
||||
##
|
||||
# CONFIG_EFS_FS is not set
|
||||
|
||||
##
|
||||
## file: fs/erofs/Kconfig
|
||||
##
|
||||
CONFIG_EROFS_FS_ZIP_ACCEL=y
|
||||
|
||||
##
|
||||
## file: fs/f2fs/Kconfig
|
||||
##
|
||||
@@ -3446,6 +3482,11 @@ CONFIG_CIFS_SWN_UPCALL=y
|
||||
CONFIG_CIFS_FSCACHE=y
|
||||
# CONFIG_CIFS_COMPRESSION is not set
|
||||
|
||||
##
|
||||
## file: fs/squashfs/Kconfig
|
||||
##
|
||||
CONFIG_SQUASHFS_COMP_CACHE_FULL=y
|
||||
|
||||
##
|
||||
## file: fs/ufs/Kconfig
|
||||
##
|
||||
@@ -3470,6 +3511,7 @@ CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
|
||||
CONFIG_UCLAMP_TASK=y
|
||||
CONFIG_UCLAMP_BUCKETS_COUNT=10
|
||||
CONFIG_RT_GROUP_SCHED=y
|
||||
# CONFIG_RT_GROUP_SCHED_DEFAULT_DISABLED is not set
|
||||
CONFIG_UCLAMP_TASK_GROUP=y
|
||||
|
||||
##
|
||||
@@ -3612,12 +3654,7 @@ CONFIG_NET_PKTGEN=m
|
||||
##
|
||||
## file: net/9p/Kconfig
|
||||
##
|
||||
CONFIG_NET_9P=y
|
||||
CONFIG_NET_9P_FD=y
|
||||
CONFIG_NET_9P_VIRTIO=y
|
||||
CONFIG_NET_9P_XEN=y
|
||||
CONFIG_NET_9P_RDMA=m
|
||||
# CONFIG_NET_9P_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: net/appletalk/Kconfig
|
||||
@@ -3655,17 +3692,6 @@ CONFIG_NET_9P_RDMA=m
|
||||
##
|
||||
# CONFIG_CAN is not set
|
||||
|
||||
##
|
||||
## file: net/dccp/Kconfig
|
||||
##
|
||||
# CONFIG_IP_DCCP_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: net/dccp/ccids/Kconfig
|
||||
##
|
||||
# CONFIG_IP_DCCP_CCID2_DEBUG is not set
|
||||
# CONFIG_IP_DCCP_CCID3_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: net/ieee802154/Kconfig
|
||||
##
|
||||
@@ -3773,6 +3799,7 @@ CONFIG_AF_RXRPC_IPV6=y
|
||||
# CONFIG_AF_RXRPC_INJECT_RX_DELAY is not set
|
||||
# CONFIG_AF_RXRPC_DEBUG is not set
|
||||
# CONFIG_RXKAD is not set
|
||||
# CONFIG_RXGK is not set
|
||||
# CONFIG_RXPERF is not set
|
||||
|
||||
##
|
||||
@@ -3922,10 +3949,7 @@ CONFIG_CRYPTO_LIB_ARC4=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_CHACHA_INTERNAL=m
|
||||
CONFIG_CRYPTO_LIB_POLY1305=m
|
||||
CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_POLY1305_INTERNAL=m
|
||||
CONFIG_CRYPTO_POLY1305_X86_64=m
|
||||
CONFIG_CXL_PORT=y
|
||||
CONFIG_DEV_SYNC_PROBE=m
|
||||
@@ -3940,6 +3964,7 @@ CONFIG_DRM_GEM_SHMEM_HELPER=m
|
||||
CONFIG_DRM_KMS_HELPER=m
|
||||
CONFIG_DRM_PANEL=y
|
||||
CONFIG_DRM_PANEL_BRIDGE=y
|
||||
CONFIG_DRM_SYSFB_HELPER=m
|
||||
CONFIG_DRM_TTM=m
|
||||
CONFIG_DRM_TTM_HELPER=m
|
||||
CONFIG_DRM_VRAM_HELPER=m
|
||||
@@ -3970,10 +3995,11 @@ CONFIG_MFD_CORE=m
|
||||
CONFIG_MOUSE_PS2_SMBUS=y
|
||||
CONFIG_ND_BTT=m
|
||||
CONFIG_ND_PFN=m
|
||||
CONFIG_NETFS_SUPPORT=y
|
||||
CONFIG_NET_CLS=y
|
||||
CONFIG_NLS_UCS2_UTILS=m
|
||||
# CONFIG_NVMEM_LAYOUTS is not set
|
||||
CONFIG_PCI_PWRCTRL=m
|
||||
CONFIG_PLDMFW=y
|
||||
CONFIG_PM_CLK=y
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_PM_SLEEP_DEBUG=y
|
||||
|
106
debian/config/config
vendored
106
debian/config/config
vendored
@@ -61,7 +61,6 @@ CONFIG_X86_VSYSCALL_EMULATION=y
|
||||
# CONFIG_MICROCODE_LATE_LOADING is not set
|
||||
CONFIG_X86_MSR=m
|
||||
CONFIG_X86_CPUID=m
|
||||
# CONFIG_X86_5LEVEL is not set
|
||||
# CONFIG_X86_CPA_STATISTICS is not set
|
||||
CONFIG_AMD_MEM_ENCRYPT=y
|
||||
CONFIG_NUMA=y
|
||||
@@ -116,6 +115,7 @@ CONFIG_MITIGATION_PAGE_TABLE_ISOLATION=y
|
||||
# CONFIG_MITIGATION_SPECTRE_V2 is not set
|
||||
# CONFIG_MITIGATION_SRBDS is not set
|
||||
# CONFIG_MITIGATION_SSB is not set
|
||||
# CONFIG_MITIGATION_TSA is not set
|
||||
CONFIG_PCI_MMCONFIG=y
|
||||
# CONFIG_ISA_BUS is not set
|
||||
CONFIG_ISA_DMA_API=y
|
||||
@@ -126,11 +126,9 @@ CONFIG_IA32_EMULATION=y
|
||||
##
|
||||
## file: arch/x86/Kconfig.cpu
|
||||
##
|
||||
## choice: x86_64 Compiler Build Optimization
|
||||
# CONFIG_X86_NATIVE_CPU is not set
|
||||
## choice: x86_64 Compiler Build Optimization
|
||||
CONFIG_GENERIC_CPU=y
|
||||
# CONFIG_MNATIVE_INTEL is not set
|
||||
# CONFIG_MNATIVE_AMD is not set
|
||||
# CONFIG_MK8 is not set
|
||||
# CONFIG_MK8SSE3 is not set
|
||||
# CONFIG_MK10 is not set
|
||||
@@ -171,6 +169,7 @@ CONFIG_GENERIC_CPU=y
|
||||
# CONFIG_MRAPTORLAKE is not set
|
||||
# CONFIG_MMETEORLAKE is not set
|
||||
# CONFIG_MEMERALDRAPIDS is not set
|
||||
# CONFIG_MDIAMONDRAPIDS is not set
|
||||
## end choice
|
||||
# CONFIG_PROCESSOR_SELECT is not set
|
||||
CONFIG_CPU_SUP_INTEL=y
|
||||
@@ -229,10 +228,8 @@ CONFIG_CRYPTO_ARIA_GFNI_AVX512_X86_64=m
|
||||
CONFIG_CRYPTO_AEGIS128_AESNI_SSE2=m
|
||||
CONFIG_CRYPTO_NHPOLY1305_SSE2=m
|
||||
CONFIG_CRYPTO_NHPOLY1305_AVX2=m
|
||||
CONFIG_CRYPTO_BLAKE2S_X86=y
|
||||
CONFIG_CRYPTO_POLYVAL_CLMUL_NI=m
|
||||
CONFIG_CRYPTO_SHA1_SSSE3=m
|
||||
CONFIG_CRYPTO_SHA256_SSSE3=m
|
||||
CONFIG_CRYPTO_SHA512_SSSE3=m
|
||||
CONFIG_CRYPTO_SM3_AVX_X86_64=m
|
||||
CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
|
||||
@@ -264,6 +261,11 @@ CONFIG_KVM_HYPERV=y
|
||||
# CONFIG_KVM_PROVE_MMU is not set
|
||||
CONFIG_KVM_MAX_NR_VCPUS=1024
|
||||
|
||||
##
|
||||
## file: arch/x86/lib/crypto/Kconfig
|
||||
##
|
||||
CONFIG_CRYPTO_BLAKE2S_X86=y
|
||||
|
||||
##
|
||||
## file: arch/x86/xen/Kconfig
|
||||
##
|
||||
@@ -324,15 +326,13 @@ CONFIG_SYSTEM_TRUSTED_KEYS=""
|
||||
## file: crypto/Kconfig
|
||||
##
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_USER=m
|
||||
CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
|
||||
# CONFIG_CRYPTO_SELFTESTS is not set
|
||||
CONFIG_CRYPTO_NULL=y
|
||||
CONFIG_CRYPTO_PCRYPT=m
|
||||
CONFIG_CRYPTO_CRYPTD=m
|
||||
CONFIG_CRYPTO_AUTHENC=m
|
||||
CONFIG_CRYPTO_KRB5ENC=m
|
||||
CONFIG_CRYPTO_TEST=m
|
||||
CONFIG_CRYPTO_RSA=y
|
||||
CONFIG_CRYPTO_DH=y
|
||||
CONFIG_CRYPTO_DH_RFC7919_GROUPS=y
|
||||
@@ -375,7 +375,6 @@ CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_POLY1305=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_SHA256=y
|
||||
@@ -627,6 +626,7 @@ CONFIG_TCG_TPM2_HMAC=y
|
||||
CONFIG_HW_RANDOM_TPM=y
|
||||
CONFIG_TCG_XEN=m
|
||||
CONFIG_TCG_VTPM_PROXY=m
|
||||
CONFIG_TCG_SVSM=m
|
||||
|
||||
##
|
||||
## file: drivers/comedi/Kconfig
|
||||
@@ -962,11 +962,6 @@ CONFIG_VMWARE_BALLOON=m
|
||||
# CONFIG_PCI_ENDPOINT_TEST is not set
|
||||
CONFIG_NSM=m
|
||||
|
||||
##
|
||||
## file: drivers/misc/echo/Kconfig
|
||||
##
|
||||
# CONFIG_ECHO is not set
|
||||
|
||||
##
|
||||
## file: drivers/misc/genwqe/Kconfig
|
||||
##
|
||||
@@ -1111,7 +1106,7 @@ CONFIG_HYPERV_NET=m
|
||||
##
|
||||
## file: drivers/net/mdio/Kconfig
|
||||
##
|
||||
CONFIG_MDIO_DEVICE=m
|
||||
CONFIG_MDIO_BUS=m
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/Kconfig
|
||||
@@ -1614,6 +1609,7 @@ CONFIG_VHOST_SCSI=m
|
||||
CONFIG_VHOST_VSOCK=m
|
||||
CONFIG_VHOST_VDPA=m
|
||||
# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
|
||||
CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y
|
||||
|
||||
##
|
||||
## file: drivers/video/console/Kconfig
|
||||
@@ -1732,6 +1728,9 @@ CONFIG_VIRTIO_INPUT=m
|
||||
CONFIG_VIRTIO_MMIO=m
|
||||
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
|
||||
# CONFIG_VIRTIO_DEBUG is not set
|
||||
CONFIG_VIRTIO_RTC=m
|
||||
CONFIG_VIRTIO_RTC_PTP=y
|
||||
CONFIG_VIRTIO_RTC_CLASS=y
|
||||
|
||||
##
|
||||
## file: drivers/watchdog/Kconfig
|
||||
@@ -1807,6 +1806,14 @@ CONFIG_BINFMT_SCRIPT=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_COREDUMP=y
|
||||
|
||||
##
|
||||
## file: fs/9p/Kconfig
|
||||
##
|
||||
CONFIG_9P_FS=y
|
||||
CONFIG_9P_FSCACHE=y
|
||||
CONFIG_9P_FS_POSIX_ACL=y
|
||||
CONFIG_9P_FS_SECURITY=y
|
||||
|
||||
##
|
||||
## file: fs/afs/Kconfig
|
||||
##
|
||||
@@ -2048,6 +2055,11 @@ CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_QFMT_V1 is not set
|
||||
CONFIG_QFMT_V2=m
|
||||
|
||||
##
|
||||
## file: fs/resctrl/Kconfig
|
||||
##
|
||||
CONFIG_RESCTRL_FS=y
|
||||
|
||||
##
|
||||
## file: fs/smb/server/Kconfig
|
||||
##
|
||||
@@ -2133,7 +2145,6 @@ CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_WATCH_QUEUE=y
|
||||
CONFIG_CROSS_MEMORY_ATTACH=y
|
||||
# CONFIG_USELIB is not set
|
||||
CONFIG_AUDIT=y
|
||||
## choice: Cputime accounting
|
||||
CONFIG_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
@@ -2179,6 +2190,7 @@ CONFIG_UTS_NS=y
|
||||
CONFIG_TIME_NS=y
|
||||
CONFIG_IPC_NS=y
|
||||
CONFIG_USER_NS=y
|
||||
CONFIG_USER_NS_UNPRIVILEGED=y
|
||||
CONFIG_PID_NS=y
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_CHECKPOINT_RESTORE=y
|
||||
@@ -2647,6 +2659,7 @@ CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
|
||||
# CONFIG_READ_ONLY_THP_FOR_FS is not set
|
||||
# CONFIG_NO_PAGE_MAPCOUNT is not set
|
||||
# CONFIG_CMA is not set
|
||||
CONFIG_PAGE_BLOCK_ORDER=10
|
||||
CONFIG_MEM_SOFT_DIRTY=y
|
||||
CONFIG_DEFERRED_STRUCT_PAGE_INIT=y
|
||||
# CONFIG_IDLE_PAGE_TRACKING is not set
|
||||
@@ -2721,6 +2734,15 @@ CONFIG_VLAN_8021Q=m
|
||||
# CONFIG_VLAN_8021Q_GVRP is not set
|
||||
# CONFIG_VLAN_8021Q_MVRP is not set
|
||||
|
||||
##
|
||||
## file: net/9p/Kconfig
|
||||
##
|
||||
CONFIG_NET_9P=y
|
||||
CONFIG_NET_9P_FD=y
|
||||
CONFIG_NET_9P_VIRTIO=y
|
||||
CONFIG_NET_9P_XEN=y
|
||||
# CONFIG_NET_9P_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: net/batman-adv/Kconfig
|
||||
##
|
||||
@@ -2762,16 +2784,6 @@ CONFIG_CEPH_LIB=m
|
||||
##
|
||||
# CONFIG_DCB is not set
|
||||
|
||||
##
|
||||
## file: net/dccp/Kconfig
|
||||
##
|
||||
CONFIG_IP_DCCP=m
|
||||
|
||||
##
|
||||
## file: net/dccp/ccids/Kconfig
|
||||
##
|
||||
CONFIG_IP_DCCP_CCID3=y
|
||||
|
||||
##
|
||||
## file: net/dns_resolver/Kconfig
|
||||
##
|
||||
@@ -3196,6 +3208,7 @@ CONFIG_NET_SCH_FQ_CODEL=y
|
||||
CONFIG_NET_SCH_CAKE=m
|
||||
CONFIG_NET_SCH_PIE=y
|
||||
CONFIG_NET_SCH_FQ_PIE=y
|
||||
CONFIG_NET_SCH_BPF=y
|
||||
CONFIG_NET_SCH_DEFAULT=y
|
||||
## choice: Default queuing discipline
|
||||
# CONFIG_DEFAULT_FQ is not set
|
||||
@@ -3256,11 +3269,11 @@ CONFIG_UNIX_DIAG=y
|
||||
##
|
||||
## file: net/vmw_vsock/Kconfig
|
||||
##
|
||||
CONFIG_VSOCKETS=m
|
||||
CONFIG_VSOCKETS_DIAG=m
|
||||
CONFIG_VSOCKETS_LOOPBACK=m
|
||||
CONFIG_VSOCKETS=y
|
||||
CONFIG_VSOCKETS_DIAG=y
|
||||
CONFIG_VSOCKETS_LOOPBACK=y
|
||||
CONFIG_VMWARE_VMCI_VSOCKETS=m
|
||||
CONFIG_VIRTIO_VSOCKETS=m
|
||||
CONFIG_VIRTIO_VSOCKETS=y
|
||||
CONFIG_HYPERV_VSOCKETS=m
|
||||
|
||||
##
|
||||
@@ -3442,6 +3455,7 @@ CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
|
||||
CONFIG_ACPI_LPIT=y
|
||||
CONFIG_ACPI_MADT_WAKEUP=y
|
||||
CONFIG_ACPI_MDIO=m
|
||||
CONFIG_ACPI_MRRM=y
|
||||
CONFIG_ACPI_NUMA=y
|
||||
CONFIG_ACPI_PROCESSOR_CSTATE=y
|
||||
CONFIG_ACPI_PROCESSOR_IDLE=y
|
||||
@@ -3474,6 +3488,7 @@ CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y
|
||||
CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y
|
||||
CONFIG_ARCH_HAS_CPU_PASID=y
|
||||
CONFIG_ARCH_HAS_CPU_RELAX=y
|
||||
CONFIG_ARCH_HAS_CPU_RESCTRL=y
|
||||
CONFIG_ARCH_HAS_CRC32=y
|
||||
CONFIG_ARCH_HAS_CRC64=y
|
||||
CONFIG_ARCH_HAS_CRC_T10DIF=y
|
||||
@@ -3545,6 +3560,7 @@ CONFIG_ARCH_SUPPORTS_INT128=y
|
||||
CONFIG_ARCH_SUPPORTS_KEXEC=y
|
||||
CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y
|
||||
CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y
|
||||
CONFIG_ARCH_SUPPORTS_KEXEC_HANDOVER=y
|
||||
CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y
|
||||
CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y
|
||||
CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y
|
||||
@@ -3583,6 +3599,7 @@ CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
|
||||
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||
CONFIG_ARCH_WANT_HUGETLB_VMEMMAP_PREINIT=y
|
||||
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
|
||||
CONFIG_ARCH_WANT_IRQS_OFF_ACTIVATE_MM=y
|
||||
CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
|
||||
CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y
|
||||
CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y
|
||||
@@ -3604,9 +3621,7 @@ CONFIG_BLK_CGROUP_RWSTAT=y
|
||||
CONFIG_BLK_DEV_BSG_COMMON=y
|
||||
CONFIG_BLK_DEV_DM_BUILTIN=y
|
||||
CONFIG_BLK_ICQ=y
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_BLK_MQ_STACKING=y
|
||||
CONFIG_BLK_MQ_VIRTIO=y
|
||||
CONFIG_BLK_PM=y
|
||||
CONFIG_BLK_RQ_ALLOC_TIME=y
|
||||
CONFIG_BLOCK_HOLDER_DEPRECATED=y
|
||||
@@ -3658,6 +3673,8 @@ CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y
|
||||
CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y
|
||||
CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=y
|
||||
CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y
|
||||
CONFIG_CRYPTO_ARCH_HAVE_LIB_SHA256=y
|
||||
CONFIG_CRYPTO_ARCH_HAVE_LIB_SHA256_SIMD=y
|
||||
CONFIG_CRYPTO_BLOWFISH_COMMON=m
|
||||
CONFIG_CRYPTO_CAST_COMMON=m
|
||||
CONFIG_CRYPTO_CURVE25519_X86=m
|
||||
@@ -3683,23 +3700,25 @@ CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_CURVE25519_INTERNAL=m
|
||||
CONFIG_CRYPTO_LIB_DES=m
|
||||
CONFIG_CRYPTO_LIB_GF128MUL=y
|
||||
CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
|
||||
CONFIG_CRYPTO_LIB_SHA1=y
|
||||
CONFIG_CRYPTO_LIB_SHA256=y
|
||||
CONFIG_CRYPTO_LIB_SHA256_GENERIC=y
|
||||
CONFIG_CRYPTO_LIB_SM3=m
|
||||
CONFIG_CRYPTO_LIB_UTILS=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_MANAGER2=y
|
||||
CONFIG_CRYPTO_NHPOLY1305=m
|
||||
CONFIG_CRYPTO_NULL2=y
|
||||
CONFIG_CRYPTO_POLYVAL=m
|
||||
CONFIG_CRYPTO_RNG=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_RNG_DEFAULT=y
|
||||
CONFIG_CRYPTO_SHA256_X86_64=y
|
||||
CONFIG_CRYPTO_SIG=y
|
||||
CONFIG_CRYPTO_SIG2=y
|
||||
CONFIG_CRYPTO_SIMD=m
|
||||
CONFIG_CRYPTO_SKCIPHER=y
|
||||
CONFIG_CRYPTO_SKCIPHER2=y
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_SM4=m
|
||||
CONFIG_CRYPTO_TWOFISH_COMMON=m
|
||||
CONFIG_CRYPTO_USER_API=m
|
||||
@@ -3741,7 +3760,6 @@ CONFIG_DYNAMIC_EVENTS=y
|
||||
CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y
|
||||
CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
|
||||
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
|
||||
CONFIG_DYNAMIC_MEMORY_LAYOUT=y
|
||||
CONFIG_DYNAMIC_PHYSICAL_MASK=y
|
||||
CONFIG_DYNAMIC_SIGFRAME=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
@@ -3792,6 +3810,7 @@ CONFIG_FUNCTION_ALIGNMENT_4B=y
|
||||
CONFIG_FUNCTION_PADDING_BYTES=16
|
||||
CONFIG_FUNCTION_PADDING_CFI=11
|
||||
CONFIG_FUNCTION_TRACE_ARGS=y
|
||||
CONFIG_FUTEX_MPOL=y
|
||||
CONFIG_FUTEX_PI=y
|
||||
CONFIG_FWNODE_MDIO=m
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
@@ -4011,7 +4030,6 @@ CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
|
||||
# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set
|
||||
CONFIG_INET6_TUNNEL=m
|
||||
CONFIG_INET6_XFRM_TUNNEL=m
|
||||
CONFIG_INET_DCCP_DIAG=m
|
||||
CONFIG_INET_MPTCP_DIAG=y
|
||||
CONFIG_INET_SCTP_DIAG=m
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
@@ -4039,7 +4057,6 @@ CONFIG_IPV6_FOU_TUNNEL=m
|
||||
CONFIG_IPV6_NDISC_NODETYPE=y
|
||||
CONFIG_IPV6_SEG6_BPF=y
|
||||
CONFIG_IPVLAN_L3S=y
|
||||
CONFIG_IP_DCCP_TFRC_LIB=y
|
||||
CONFIG_IP_MROUTE_COMMON=y
|
||||
CONFIG_IP_ROUTE_CLASSID=y
|
||||
CONFIG_IRQ_BYPASS_MANAGER=m
|
||||
@@ -4087,8 +4104,6 @@ CONFIG_LRU_GEN_WALKS_MMU=y
|
||||
CONFIG_LZ4_DECOMPRESS=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MDIO_BUS=m
|
||||
CONFIG_MDIO_DEVRES=m
|
||||
CONFIG_MEMORY_BALLOON=y
|
||||
CONFIG_MEMORY_ISOLATION=y
|
||||
CONFIG_MEMREGION=y
|
||||
@@ -4124,7 +4139,9 @@ CONFIG_NETFILTER_FAMILY_BRIDGE=y
|
||||
CONFIG_NETFILTER_NETLINK=y
|
||||
CONFIG_NETFILTER_SKIP_EGRESS=y
|
||||
CONFIG_NETFILTER_SYNPROXY=m
|
||||
CONFIG_NETFS_SUPPORT=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NET_CRC32C=y
|
||||
CONFIG_NET_DEVLINK=y
|
||||
CONFIG_NET_DEVMEM=y
|
||||
CONFIG_NET_EGRESS=y
|
||||
@@ -4206,7 +4223,7 @@ CONFIG_PCI_LOCKLESS_CONFIG=y
|
||||
CONFIG_PCI_XEN=y
|
||||
CONFIG_PER_VMA_LOCK=y
|
||||
CONFIG_PGTABLE_HAS_HUGE_LEAVES=y
|
||||
CONFIG_PGTABLE_LEVELS=4
|
||||
CONFIG_PGTABLE_LEVELS=5
|
||||
CONFIG_PHYLINK=m
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_PM_SLEEP=y
|
||||
@@ -4315,6 +4332,8 @@ CONFIG_TRACING=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
CONFIG_TSM_GUEST=y
|
||||
CONFIG_TSM_MEASUREMENTS=y
|
||||
CONFIG_TSM_REPORTS=m
|
||||
CONFIG_UCS2_STRING=y
|
||||
CONFIG_UEFI_CPER=y
|
||||
@@ -4342,7 +4361,7 @@ CONFIG_VIRTIO_ANCHOR=y
|
||||
CONFIG_VIRTIO_PCI_ADMIN_LEGACY=y
|
||||
CONFIG_VIRTIO_PCI_LIB=y
|
||||
CONFIG_VIRTIO_PCI_LIB_LEGACY=y
|
||||
CONFIG_VIRTIO_VSOCKETS_COMMON=m
|
||||
CONFIG_VIRTIO_VSOCKETS_COMMON=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
CONFIG_VMCORE_INFO=y
|
||||
CONFIG_VT_CONSOLE_SLEEP=y
|
||||
@@ -4360,7 +4379,6 @@ CONFIG_X86_DISABLED_FEATURE_CENTAUR_MCR=y
|
||||
CONFIG_X86_DISABLED_FEATURE_CYRIX_ARR=y
|
||||
CONFIG_X86_DISABLED_FEATURE_IBT=y
|
||||
CONFIG_X86_DISABLED_FEATURE_K6_MTRR=y
|
||||
CONFIG_X86_DISABLED_FEATURE_LA57=y
|
||||
CONFIG_X86_DISABLED_FEATURE_LAM=y
|
||||
CONFIG_X86_DISABLED_FEATURE_RETHUNK=y
|
||||
CONFIG_X86_DISABLED_FEATURE_RETPOLINE=y
|
||||
|
2
debian/config/defines.toml
vendored
2
debian/config/defines.toml
vendored
@@ -11,7 +11,7 @@ name = 'x86'
|
||||
name = 'none'
|
||||
|
||||
[build]
|
||||
compiler = 'gcc-14'
|
||||
compiler = 'gcc-15'
|
||||
|
||||
[relations.image]
|
||||
depends = [
|
||||
|
8
debian/lib/python/debian_linux/debian.py
vendored
8
debian/lib/python/debian_linux/debian.py
vendored
@@ -175,12 +175,6 @@ class VersionLinux(Version):
|
||||
.+?
|
||||
)
|
||||
)?
|
||||
(?:
|
||||
\.dfsg\.
|
||||
(?P<dfsg>
|
||||
\d+
|
||||
)
|
||||
)?
|
||||
$
|
||||
""", re.X)
|
||||
|
||||
@@ -192,7 +186,6 @@ $
|
||||
if up_match is None or rev_match is None:
|
||||
raise RuntimeError(u"Invalid debian linux version")
|
||||
d = up_match.groupdict()
|
||||
self.linux_modifier = d['modifier']
|
||||
self.linux_version = d['version']
|
||||
if d['modifier'] is not None:
|
||||
assert not d['update']
|
||||
@@ -200,7 +193,6 @@ $
|
||||
else:
|
||||
self.linux_upstream = d['version']
|
||||
self.linux_upstream_full = self.linux_upstream + d['update']
|
||||
self.linux_dfsg = d['dfsg']
|
||||
|
||||
|
||||
class PackageArchitecture(set[str]):
|
||||
|
2
debian/linux-misc-tools.manpages
vendored
Normal file
2
debian/linux-misc-tools.manpages
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
tools/thermal/thermometer/thermometer.8
|
||||
tools/thermal/tmon/tmon.8
|
45
debian/patches/bugfix/all/bootconfig-fix-negative-seeks-on-32-bit-with-lfs-ena.patch
vendored
Normal file
45
debian/patches/bugfix/all/bootconfig-fix-negative-seeks-on-32-bit-with-lfs-ena.patch
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
From: Ben Hutchings <benh@debian.org>
|
||||
Date: Sun, 17 Aug 2025 16:06:28 +0200
|
||||
Subject: bootconfig: Fix negative seeks on 32-bit with LFS enabled
|
||||
Forwarded: https://lore.kernel.org/linux-trace-kernel/aKHlevxeg6Y7UQrz@decadent.org.uk/T/
|
||||
|
||||
Commit 26dda5769509 "tools/bootconfig: Cleanup bootconfig footer size
|
||||
calculations" replaced some expressions of type int with the
|
||||
BOOTCONFIG_FOOTER_SIZE macro, which expands to an expression of type
|
||||
size_t, which is unsigned.
|
||||
|
||||
On 32-bit architectures with LFS enabled (i.e. off_t is 64-bit), the
|
||||
seek offset of -BOOTCONFIG_FOOTER_SIZE now turns into a positive
|
||||
value.
|
||||
|
||||
Fix this by casting the size to off_t before negating it.
|
||||
|
||||
Just in case someone changes BOOTCONFIG_MAGIC_LEN to have type size_t
|
||||
later, do the same thing to the seek offset of -BOOTCONFIG_MAGIC_LEN.
|
||||
|
||||
Fixes: 26dda5769509 ("tools/bootconfig: Cleanup bootconfig footer size calculations")
|
||||
Signed-off-by: Ben Hutchings <benh@debian.org>
|
||||
---
|
||||
tools/bootconfig/main.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/tools/bootconfig/main.c
|
||||
+++ b/tools/bootconfig/main.c
|
||||
@@ -193,7 +193,7 @@ static int load_xbc_from_initrd(int fd,
|
||||
if (stat.st_size < BOOTCONFIG_FOOTER_SIZE)
|
||||
return 0;
|
||||
|
||||
- if (lseek(fd, -BOOTCONFIG_MAGIC_LEN, SEEK_END) < 0)
|
||||
+ if (lseek(fd, -(off_t)BOOTCONFIG_MAGIC_LEN, SEEK_END) < 0)
|
||||
return pr_errno("Failed to lseek for magic", -errno);
|
||||
|
||||
if (read(fd, magic, BOOTCONFIG_MAGIC_LEN) < 0)
|
||||
@@ -203,7 +203,7 @@ static int load_xbc_from_initrd(int fd,
|
||||
if (memcmp(magic, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN) != 0)
|
||||
return 0;
|
||||
|
||||
- if (lseek(fd, -BOOTCONFIG_FOOTER_SIZE, SEEK_END) < 0)
|
||||
+ if (lseek(fd, -(off_t)BOOTCONFIG_FOOTER_SIZE, SEEK_END) < 0)
|
||||
return pr_errno("Failed to lseek for size", -errno);
|
||||
|
||||
if (read(fd, &size, sizeof(uint32_t)) < 0)
|
71
debian/patches/bugfix/all/bootconfig-fix-unaligned-access-when-building-footer.patch
vendored
Normal file
71
debian/patches/bugfix/all/bootconfig-fix-unaligned-access-when-building-footer.patch
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
From: Ben Hutchings <benh@debian.org>
|
||||
Date: Wed, 23 Jul 2025 12:17:14 +0200
|
||||
Subject: bootconfig: Fix unaligned access when building footer
|
||||
Forwarded: https://lore.kernel.org/linux-trace-kernel/aIC-NTw-cdm9ZGFw@decadent.org.uk/T/
|
||||
|
||||
Currently we add padding between the bootconfig text and footer to
|
||||
ensure that the footer is aligned within the initramfs image.
|
||||
However, because only the bootconfig data is held in memory, not the
|
||||
full initramfs image, the footer may not be naturally aligned in
|
||||
memory.
|
||||
|
||||
This can result in an alignment fault (SIGBUS) when writing the footer
|
||||
on some architectures, such as sparc.
|
||||
|
||||
Build the footer in a struct on the stack before adding it to the
|
||||
buffer.
|
||||
|
||||
References: https://buildd.debian.org/status/fetch.php?pkg=linux&arch=sparc64&ver=6.16%7Erc7-1%7Eexp1&stamp=1753209801&raw=0
|
||||
Signed-off-by: Ben Hutchings <benh@debian.org>
|
||||
---
|
||||
tools/bootconfig/main.c | 24 +++++++++++++-----------
|
||||
1 file changed, 13 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/tools/bootconfig/main.c
|
||||
+++ b/tools/bootconfig/main.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <endian.h>
|
||||
+#include <assert.h>
|
||||
|
||||
#include <linux/bootconfig.h>
|
||||
|
||||
@@ -363,7 +364,12 @@ static int delete_xbc(const char *path)
|
||||
|
||||
static int apply_xbc(const char *path, const char *xbc_path)
|
||||
{
|
||||
- char *buf, *data, *p;
|
||||
+ struct {
|
||||
+ uint32_t size;
|
||||
+ uint32_t csum;
|
||||
+ char magic[BOOTCONFIG_MAGIC_LEN];
|
||||
+ } footer;
|
||||
+ char *buf, *data;
|
||||
size_t total_size;
|
||||
struct stat stat;
|
||||
const char *msg;
|
||||
@@ -433,17 +439,13 @@ static int apply_xbc(const char *path, c
|
||||
size += pad;
|
||||
|
||||
/* Add a footer */
|
||||
- p = data + size;
|
||||
- *(uint32_t *)p = htole32(size);
|
||||
- p += sizeof(uint32_t);
|
||||
+ footer.size = htole32(size);
|
||||
+ footer.csum = htole32(csum);
|
||||
+ memcpy(footer.magic, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
|
||||
+ static_assert(sizeof(footer) == BOOTCONFIG_FOOTER_SIZE);
|
||||
+ memcpy(data + size, &footer, BOOTCONFIG_FOOTER_SIZE);
|
||||
|
||||
- *(uint32_t *)p = htole32(csum);
|
||||
- p += sizeof(uint32_t);
|
||||
-
|
||||
- memcpy(p, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
|
||||
- p += BOOTCONFIG_MAGIC_LEN;
|
||||
-
|
||||
- total_size = p - data;
|
||||
+ total_size = size + BOOTCONFIG_FOOTER_SIZE;
|
||||
|
||||
ret = write(fd, data, total_size);
|
||||
if (ret < total_size) {
|
@@ -18,7 +18,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/fs/btrfs/super.c
|
||||
+++ b/fs/btrfs/super.c
|
||||
@@ -2630,7 +2630,7 @@ module_exit(exit_btrfs_fs)
|
||||
@@ -2625,7 +2625,7 @@ module_exit(exit_btrfs_fs)
|
||||
|
||||
MODULE_DESCRIPTION("B-Tree File System (BTRFS)");
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -29,7 +29,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
MODULE_SOFTDEP("pre: blake2b-256");
|
||||
--- a/fs/jbd2/journal.c
|
||||
+++ b/fs/jbd2/journal.c
|
||||
@@ -3158,6 +3158,7 @@ static void __exit journal_exit(void)
|
||||
@@ -3157,6 +3157,7 @@ static void __exit journal_exit(void)
|
||||
|
||||
MODULE_DESCRIPTION("Generic filesystem journal-writing module");
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -39,7 +39,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/fs/nfsd/nfsctl.c
|
||||
+++ b/fs/nfsd/nfsctl.c
|
||||
@@ -2349,5 +2349,8 @@ static void __exit exit_nfsd(void)
|
||||
@@ -2353,5 +2353,8 @@ static void __exit exit_nfsd(void)
|
||||
MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>");
|
||||
MODULE_DESCRIPTION("In-kernel NFS server");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@@ -24,7 +24,7 @@ Signed-off-by: Ben Hutchings <benh@debian.org>
|
||||
pahole-flags-$(call test-ge, $(pahole-ver), 125) += --skip_encoding_btf_inconsistent_proto --btf_gen_optimized
|
||||
|
||||
else
|
||||
@@ -29,6 +27,18 @@ endif
|
||||
@@ -31,6 +29,18 @@ endif
|
||||
|
||||
endif
|
||||
|
||||
|
@@ -9,7 +9,7 @@ sources.
|
||||
|
||||
--- a/scripts/Makefile.build
|
||||
+++ b/scripts/Makefile.build
|
||||
@@ -184,6 +184,11 @@ cmd_record_mcount = $(if $(findstring $(
|
||||
@@ -268,6 +268,11 @@ cmd_record_mcount = $(if $(findstring $(
|
||||
$(sub_cmd_record_mcount))
|
||||
endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
||||
|
||||
|
90
debian/patches/bugfix/all/tools-bootconfig-cleanup-bootconfig-footer-size-calc.patch
vendored
Normal file
90
debian/patches/bugfix/all/tools-bootconfig-cleanup-bootconfig-footer-size-calc.patch
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
From: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
|
||||
Date: Thu, 10 Jul 2025 11:24:17 +0900
|
||||
Subject: tools/bootconfig: Cleanup bootconfig footer size calculations
|
||||
Origin: https://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git/commit?id=26dda57695090e05c1a99c3e8f802f862d1ac474
|
||||
|
||||
There are many same pattern of 8 + BOOTCONFIG_MAGIC_LEN for calculating
|
||||
the size of bootconfig footer. Use BOOTCONFIG_FOOTER_SIZE macro to
|
||||
clean up those magic numbers.
|
||||
|
||||
Link: https://lore.kernel.org/all/175211425693.2591046.16029516706923643510.stgit@mhiramat.tok.corp.google.com/
|
||||
|
||||
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
|
||||
---
|
||||
tools/bootconfig/main.c | 19 +++++++++++--------
|
||||
1 file changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/tools/bootconfig/main.c
|
||||
+++ b/tools/bootconfig/main.c
|
||||
@@ -16,6 +16,10 @@
|
||||
|
||||
#define pr_err(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
|
||||
|
||||
+/* Bootconfig footer is [size][csum][BOOTCONFIG_MAGIC]. */
|
||||
+#define BOOTCONFIG_FOOTER_SIZE \
|
||||
+ (sizeof(uint32_t) * 2 + BOOTCONFIG_MAGIC_LEN)
|
||||
+
|
||||
static int xbc_show_value(struct xbc_node *node, bool semicolon)
|
||||
{
|
||||
const char *val, *eol;
|
||||
@@ -185,7 +189,7 @@ static int load_xbc_from_initrd(int fd,
|
||||
if (ret < 0)
|
||||
return -errno;
|
||||
|
||||
- if (stat.st_size < 8 + BOOTCONFIG_MAGIC_LEN)
|
||||
+ if (stat.st_size < BOOTCONFIG_FOOTER_SIZE)
|
||||
return 0;
|
||||
|
||||
if (lseek(fd, -BOOTCONFIG_MAGIC_LEN, SEEK_END) < 0)
|
||||
@@ -198,7 +202,7 @@ static int load_xbc_from_initrd(int fd,
|
||||
if (memcmp(magic, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN) != 0)
|
||||
return 0;
|
||||
|
||||
- if (lseek(fd, -(8 + BOOTCONFIG_MAGIC_LEN), SEEK_END) < 0)
|
||||
+ if (lseek(fd, -BOOTCONFIG_FOOTER_SIZE, SEEK_END) < 0)
|
||||
return pr_errno("Failed to lseek for size", -errno);
|
||||
|
||||
if (read(fd, &size, sizeof(uint32_t)) < 0)
|
||||
@@ -210,12 +214,12 @@ static int load_xbc_from_initrd(int fd,
|
||||
csum = le32toh(csum);
|
||||
|
||||
/* Wrong size error */
|
||||
- if (stat.st_size < size + 8 + BOOTCONFIG_MAGIC_LEN) {
|
||||
+ if (stat.st_size < size + BOOTCONFIG_FOOTER_SIZE) {
|
||||
pr_err("bootconfig size is too big\n");
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
- if (lseek(fd, stat.st_size - (size + 8 + BOOTCONFIG_MAGIC_LEN),
|
||||
+ if (lseek(fd, stat.st_size - (size + BOOTCONFIG_FOOTER_SIZE),
|
||||
SEEK_SET) < 0)
|
||||
return pr_errno("Failed to lseek", -errno);
|
||||
|
||||
@@ -346,7 +350,7 @@ static int delete_xbc(const char *path)
|
||||
ret = fstat(fd, &stat);
|
||||
if (!ret)
|
||||
ret = ftruncate(fd, stat.st_size
|
||||
- - size - 8 - BOOTCONFIG_MAGIC_LEN);
|
||||
+ - size - BOOTCONFIG_FOOTER_SIZE);
|
||||
if (ret)
|
||||
ret = -errno;
|
||||
} /* Ignore if there is no boot config in initrd */
|
||||
@@ -376,8 +380,7 @@ static int apply_xbc(const char *path, c
|
||||
csum = xbc_calc_checksum(buf, size);
|
||||
|
||||
/* Backup the bootconfig data */
|
||||
- data = calloc(size + BOOTCONFIG_ALIGN +
|
||||
- sizeof(uint32_t) + sizeof(uint32_t) + BOOTCONFIG_MAGIC_LEN, 1);
|
||||
+ data = calloc(size + BOOTCONFIG_ALIGN + BOOTCONFIG_FOOTER_SIZE, 1);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
memcpy(data, buf, size);
|
||||
@@ -425,7 +428,7 @@ static int apply_xbc(const char *path, c
|
||||
}
|
||||
|
||||
/* To align up the total size to BOOTCONFIG_ALIGN, get padding size */
|
||||
- total_size = stat.st_size + size + sizeof(uint32_t) * 2 + BOOTCONFIG_MAGIC_LEN;
|
||||
+ total_size = stat.st_size + size + BOOTCONFIG_FOOTER_SIZE;
|
||||
pad = ((total_size + BOOTCONFIG_ALIGN - 1) & (~BOOTCONFIG_ALIGN_MASK)) - total_size;
|
||||
size += pad;
|
||||
|
@@ -69,7 +69,7 @@ Signed-off-by: Geoff Levand <geoff@infradead.org>
|
||||
* acpi_boot_table_init() called from setup_arch(), always.
|
||||
* 1. find RSDP and get its address, and then find XSDT
|
||||
* 2. extract all tables and checksums them all
|
||||
@@ -257,6 +286,8 @@ done:
|
||||
@@ -261,6 +290,8 @@ done:
|
||||
|
||||
if (IS_ENABLED(CONFIG_ACPI_BGRT))
|
||||
acpi_table_parse(ACPI_SIG_BGRT, acpi_parse_bgrt);
|
||||
|
@@ -26,7 +26,7 @@ Tested-by: Michal Kubecek <mkubecek@suse.cz>
|
||||
|
||||
--- a/arch/powerpc/boot/Makefile
|
||||
+++ b/arch/powerpc/boot/Makefile
|
||||
@@ -97,7 +97,7 @@ BOOTCFLAGS += -fno-stack-protector
|
||||
@@ -98,7 +98,7 @@ BOOTCFLAGS += -fno-stack-protector
|
||||
endif
|
||||
|
||||
BOOTCFLAGS += -include $(srctree)/include/linux/compiler_attributes.h
|
||||
|
@@ -1,89 +0,0 @@
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Mon, 07 Feb 2022 00:00:26 +0100
|
||||
Subject: sh: Do not use hyphen in exported variable names
|
||||
|
||||
arch/sh/Makefile defines and exports ld-bfd to be used by
|
||||
arch/sh/boot/Makefile and arch/sh/boot/compressed/Makefile. However
|
||||
some shells, including dash, will not pass through environment
|
||||
variables whose name includes a hyphen. Usually GNU make does not use
|
||||
a shell to recurse, but if e.g. $(srctree) contains '~' it will use a
|
||||
shell here.
|
||||
|
||||
Rename the variable to ld_bfd.
|
||||
|
||||
(Another instance of this problem was fixed upstream by commit
|
||||
82977af93a0d "sh: rename suffix-y to suffix_y".)
|
||||
|
||||
References: https://buildd.debian.org/status/fetch.php?pkg=linux&arch=sh4&ver=4.13%7Erc5-1%7Eexp1&stamp=1502943967&raw=0
|
||||
Fixes: ef9b542fce00 ("sh: bzip2/lzma uImage support.")
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
---
|
||||
arch/sh/Makefile | 10 +++++-----
|
||||
arch/sh/boot/compressed/Makefile | 4 ++--
|
||||
arch/sh/boot/romimage/Makefile | 4 ++--
|
||||
3 files changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/arch/sh/Makefile
|
||||
+++ b/arch/sh/Makefile
|
||||
@@ -102,16 +102,16 @@ UTS_MACHINE := sh
|
||||
LDFLAGS_vmlinux += -e _stext
|
||||
|
||||
ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
-ld-bfd := elf32-sh-linux
|
||||
-LDFLAGS_vmlinux += --defsym jiffies=jiffies_64 --oformat $(ld-bfd)
|
||||
+ld_bfd := elf32-sh-linux
|
||||
+LDFLAGS_vmlinux += --defsym jiffies=jiffies_64 --oformat $(ld_bfd)
|
||||
KBUILD_LDFLAGS += -EL
|
||||
else
|
||||
-ld-bfd := elf32-shbig-linux
|
||||
-LDFLAGS_vmlinux += --defsym jiffies=jiffies_64+4 --oformat $(ld-bfd)
|
||||
+ld_bfd := elf32-shbig-linux
|
||||
+LDFLAGS_vmlinux += --defsym jiffies=jiffies_64+4 --oformat $(ld_bfd)
|
||||
KBUILD_LDFLAGS += -EB
|
||||
endif
|
||||
|
||||
-export ld-bfd
|
||||
+export ld_bfd
|
||||
|
||||
# Mach groups
|
||||
machdir-$(CONFIG_SOLUTION_ENGINE) += mach-se
|
||||
--- a/arch/sh/boot/compressed/Makefile
|
||||
+++ b/arch/sh/boot/compressed/Makefile
|
||||
@@ -27,7 +27,7 @@ endif
|
||||
|
||||
ccflags-remove-$(CONFIG_MCOUNT) += -pg
|
||||
|
||||
-LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(IMAGE_OFFSET) -e startup \
|
||||
+LDFLAGS_vmlinux := --oformat $(ld_bfd) -Ttext $(IMAGE_OFFSET) -e startup \
|
||||
-T $(obj)/../../kernel/vmlinux.lds
|
||||
|
||||
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
||||
@@ -51,7 +51,7 @@ $(obj)/vmlinux.bin.lzo: $(obj)/vmlinux.b
|
||||
|
||||
OBJCOPYFLAGS += -R .empty_zero_page
|
||||
|
||||
-LDFLAGS_piggy.o := -r --format binary --oformat $(ld-bfd) -T
|
||||
+LDFLAGS_piggy.o := -r --format binary --oformat $(ld_bfd) -T
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix_y) FORCE
|
||||
$(call if_changed,ld)
|
||||
--- a/arch/sh/boot/romimage/Makefile
|
||||
+++ b/arch/sh/boot/romimage/Makefile
|
||||
@@ -13,7 +13,7 @@ mmcif-obj-$(CONFIG_CPU_SUBTYPE_SH7724) :
|
||||
load-$(CONFIG_ROMIMAGE_MMCIF) := $(mmcif-load-y)
|
||||
obj-$(CONFIG_ROMIMAGE_MMCIF) := $(mmcif-obj-y)
|
||||
|
||||
-LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(load-y) -e romstart \
|
||||
+LDFLAGS_vmlinux := --oformat $(ld_bfd) -Ttext $(load-y) -e romstart \
|
||||
-T $(obj)/../../kernel/vmlinux.lds
|
||||
|
||||
$(obj)/vmlinux: $(obj)/head.o $(obj-y) $(obj)/piggy.o FORCE
|
||||
@@ -24,7 +24,7 @@ OBJCOPYFLAGS += -j .empty_zero_page
|
||||
$(obj)/zeropage.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
-LDFLAGS_piggy.o := -r --format binary --oformat $(ld-bfd) -T
|
||||
+LDFLAGS_piggy.o := -r --format binary --oformat $(ld_bfd) -T
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/zeropage.bin arch/sh/boot/zImage FORCE
|
||||
$(call if_changed,ld)
|
@@ -21,7 +21,7 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
|
||||
--- a/kernel/fork.c
|
||||
+++ b/kernel/fork.c
|
||||
@@ -119,6 +119,12 @@
|
||||
@@ -122,6 +122,12 @@
|
||||
|
||||
#include <kunit/visibility.h>
|
||||
|
||||
@@ -34,7 +34,7 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
/*
|
||||
* Minimum number of threads to boot the kernel
|
||||
*/
|
||||
@@ -2194,6 +2200,10 @@ __latent_entropy struct task_struct *cop
|
||||
@@ -1933,6 +1939,10 @@ __latent_entropy struct task_struct *cop
|
||||
if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
@@ -45,7 +45,7 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
/*
|
||||
* Thread groups must share signals as well, and detached threads
|
||||
* can only be started up within the thread group.
|
||||
@@ -3354,6 +3364,12 @@ int ksys_unshare(unsigned long unshare_f
|
||||
@@ -3099,6 +3109,12 @@ int ksys_unshare(unsigned long unshare_f
|
||||
if (unshare_flags & CLONE_NEWNS)
|
||||
unshare_flags |= CLONE_FS;
|
||||
|
||||
@@ -60,7 +60,7 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
goto bad_unshare_out;
|
||||
--- a/kernel/sysctl.c
|
||||
+++ b/kernel/sysctl.c
|
||||
@@ -84,6 +84,10 @@ EXPORT_SYMBOL_GPL(sysctl_long_vals);
|
||||
@@ -77,6 +77,10 @@ EXPORT_SYMBOL_GPL(sysctl_long_vals);
|
||||
static const int ngroups_max = NGROUPS_MAX;
|
||||
static const int cap_last_cap = CAP_LAST_CAP;
|
||||
|
||||
@@ -71,10 +71,10 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
#ifdef CONFIG_PROC_SYSCTL
|
||||
|
||||
/**
|
||||
@@ -1595,6 +1599,15 @@ static const struct ctl_table kern_table
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
@@ -1581,6 +1585,15 @@ int proc_do_static_key(const struct ctl_
|
||||
}
|
||||
|
||||
static const struct ctl_table kern_table[] = {
|
||||
+#ifdef CONFIG_USER_NS
|
||||
+ {
|
||||
+ .procname = "unprivileged_userns_clone",
|
||||
|
@@ -1,90 +0,0 @@
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Fri, 22 Jun 2018 17:27:00 +0100
|
||||
Subject: android: Enable building ashmem and binder as modules
|
||||
Bug-Debian: https://bugs.debian.org/901492
|
||||
|
||||
We want to enable use of the Android ashmem and binder drivers to
|
||||
support Anbox, but they should not be built-in as that would waste
|
||||
resources and increase security attack surface on systems that don't
|
||||
need them.
|
||||
|
||||
- Add a MODULE_LICENSE declaration to ashmem
|
||||
- Change the Makefiles to build each driver as an object with the
|
||||
"_linux" suffix (which is what Anbox expects)
|
||||
- Change config symbol types to tristate
|
||||
|
||||
Update:
|
||||
In upstream commit 721412ed3d titled "staging: remove ashmem" the ashmem
|
||||
driver was removed entirely. Secondary commit message:
|
||||
"The mainline replacement for ashmem is memfd, so remove the legacy
|
||||
code from drivers/staging/"
|
||||
Consequently, the ashmem part of this patch has been removed.
|
||||
---
|
||||
drivers/android/Kconfig | 2 +-
|
||||
drivers/android/Makefile | 7 ++++---
|
||||
drivers/android/binder_alloc.c | 2 +-
|
||||
3 files changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/android/Kconfig
|
||||
+++ b/drivers/android/Kconfig
|
||||
@@ -2,7 +2,7 @@
|
||||
menu "Android"
|
||||
|
||||
config ANDROID_BINDER_IPC
|
||||
- bool "Android Binder IPC Driver"
|
||||
+ tristate "Android Binder IPC Driver"
|
||||
depends on MMU
|
||||
default n
|
||||
help
|
||||
--- a/drivers/android/Makefile
|
||||
+++ b/drivers/android/Makefile
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
ccflags-y += -I$(src) # needed for trace events
|
||||
|
||||
-obj-$(CONFIG_ANDROID_BINDERFS) += binderfs.o
|
||||
-obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o binder_alloc.o
|
||||
-obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o
|
||||
+obj-$(CONFIG_ANDROID_BINDER_IPC) += binder_linux.o
|
||||
+binder_linux-y := binder.o binder_alloc.o
|
||||
+binder_linux-$(CONFIG_ANDROID_BINDERFS) += binderfs.o
|
||||
+binder_linux-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o
|
||||
--- a/drivers/android/binder_alloc.c
|
||||
+++ b/drivers/android/binder_alloc.c
|
||||
@@ -38,7 +38,7 @@ enum {
|
||||
};
|
||||
static uint32_t binder_alloc_debug_mask = BINDER_DEBUG_USER_ERROR;
|
||||
|
||||
-module_param_named(debug_mask, binder_alloc_debug_mask,
|
||||
+module_param_named(alloc_debug_mask, binder_alloc_debug_mask,
|
||||
uint, 0644);
|
||||
|
||||
#define binder_alloc_debug(mask, x...) \
|
||||
--- a/mm/list_lru.c
|
||||
+++ b/mm/list_lru.c
|
||||
@@ -175,6 +175,7 @@ bool list_lru_add(struct list_lru *lru,
|
||||
unlock_list_lru(l, false);
|
||||
return false;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(list_lru_add);
|
||||
|
||||
bool list_lru_add_obj(struct list_lru *lru, struct list_head *item)
|
||||
{
|
||||
@@ -212,6 +213,7 @@ bool list_lru_del(struct list_lru *lru,
|
||||
unlock_list_lru(l, false);
|
||||
return false;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(list_lru_del);
|
||||
|
||||
bool list_lru_del_obj(struct list_lru *lru, struct list_head *item)
|
||||
{
|
||||
--- a/mm/memory.c
|
||||
+++ b/mm/memory.c
|
||||
@@ -6589,6 +6589,7 @@ inval:
|
||||
count_vm_vma_lock_event(VMA_LOCK_ABORT);
|
||||
return NULL;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(lock_vma_under_rcu);
|
||||
#endif /* CONFIG_PER_VMA_LOCK */
|
||||
|
||||
#ifndef __PAGETABLE_P4D_FOLDED
|
53
debian/patches/debian/android-enable-building-binder-as-module.patch
vendored
Normal file
53
debian/patches/debian/android-enable-building-binder-as-module.patch
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Tue, 08 Jul 2025 13:30:55 +0200
|
||||
Subject: android: Enable building binder as module
|
||||
Bug-Debian: https://bugs.debian.org/901492
|
||||
|
||||
We want to enable use of the Android binder driver to support
|
||||
Waydroid, but it should not be built-in as that would waste resources
|
||||
and increase security attack surface on systems that don't need it.
|
||||
|
||||
- Change the Makefiles to build the driver as an object with the
|
||||
"_linux" suffix (which is what Waydroid expects)
|
||||
- Change config symbol types to tristate
|
||||
---
|
||||
drivers/android/Kconfig | 2 +-
|
||||
drivers/android/Makefile | 7 ++++---
|
||||
drivers/android/binder_alloc.c | 2 +-
|
||||
3 files changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/android/Kconfig
|
||||
+++ b/drivers/android/Kconfig
|
||||
@@ -2,7 +2,7 @@
|
||||
menu "Android"
|
||||
|
||||
config ANDROID_BINDER_IPC
|
||||
- bool "Android Binder IPC Driver"
|
||||
+ tristate "Android Binder IPC Driver"
|
||||
depends on MMU
|
||||
default n
|
||||
help
|
||||
--- a/drivers/android/Makefile
|
||||
+++ b/drivers/android/Makefile
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
ccflags-y += -I$(src) # needed for trace events
|
||||
|
||||
-obj-$(CONFIG_ANDROID_BINDERFS) += binderfs.o
|
||||
-obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o binder_alloc.o
|
||||
-obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o
|
||||
+obj-$(CONFIG_ANDROID_BINDER_IPC) += binder_linux.o
|
||||
+binder_linux-y := binder.o binder_alloc.o
|
||||
+binder_linux-$(CONFIG_ANDROID_BINDERFS) += binderfs.o
|
||||
+binder_linux-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o
|
||||
--- a/drivers/android/binder_alloc.c
|
||||
+++ b/drivers/android/binder_alloc.c
|
||||
@@ -38,7 +38,7 @@ enum {
|
||||
};
|
||||
static uint32_t binder_alloc_debug_mask = BINDER_DEBUG_USER_ERROR;
|
||||
|
||||
-module_param_named(debug_mask, binder_alloc_debug_mask,
|
||||
+module_param_named(alloc_debug_mask, binder_alloc_debug_mask,
|
||||
uint, 0644);
|
||||
|
||||
#define binder_alloc_debug(mask, x...) \
|
@@ -22,7 +22,7 @@ implementation went from disk-io.c to super.c; forwarded the issue]
|
||||
|
||||
--- a/fs/btrfs/super.c
|
||||
+++ b/fs/btrfs/super.c
|
||||
@@ -769,6 +769,18 @@ static void set_device_specific_options(
|
||||
@@ -761,6 +761,18 @@ static void set_device_specific_options(
|
||||
btrfs_set_opt(fs_info->mount_opt, SSD);
|
||||
|
||||
/*
|
||||
|
@@ -1,41 +0,0 @@
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Thu, 16 Feb 2017 19:09:17 +0000
|
||||
Subject: dccp: Disable auto-loading as mitigation against local exploits
|
||||
Forwarded: not-needed
|
||||
|
||||
We can mitigate the effect of vulnerabilities in obscure protocols by
|
||||
preventing unprivileged users from loading the modules, so that they
|
||||
are only exploitable on systems where the administrator has chosen to
|
||||
load the protocol.
|
||||
|
||||
The 'dccp' protocol is not actively maintained or widely used.
|
||||
Therefore disable auto-loading.
|
||||
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
---
|
||||
--- a/net/dccp/ipv4.c
|
||||
+++ b/net/dccp/ipv4.c
|
||||
@@ -1094,8 +1094,8 @@ module_exit(dccp_v4_exit);
|
||||
* values directly, Also cover the case where the protocol is not specified,
|
||||
* i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP
|
||||
*/
|
||||
-MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 33, 6);
|
||||
-MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 0, 6);
|
||||
+/* MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 33, 6); */
|
||||
+/* MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 0, 6); */
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
|
||||
MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol");
|
||||
--- a/net/dccp/ipv6.c
|
||||
+++ b/net/dccp/ipv6.c
|
||||
@@ -1167,8 +1167,8 @@ module_exit(dccp_v6_exit);
|
||||
* values directly, Also cover the case where the protocol is not specified,
|
||||
* i.e. net-pf-PF_INET6-proto-0-type-SOCK_DCCP
|
||||
*/
|
||||
-MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 33, 6);
|
||||
-MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 0, 6);
|
||||
+/* MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 33, 6); */
|
||||
+/* MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 0, 6); */
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
|
||||
MODULE_DESCRIPTION("DCCPv6 - Datagram Congestion Controlled Protocol");
|
@@ -21,7 +21,7 @@ probably discontinued 10 years ago.
|
||||
|
||||
-config FB_NVIDIA
|
||||
- tristate "nVidia Framebuffer Support"
|
||||
- depends on FB && PCI
|
||||
- depends on FB && PCI && HAS_IOPORT
|
||||
- select FB_CFB_FILLRECT
|
||||
- select FB_CFB_COPYAREA
|
||||
- select FB_CFB_IMAGEBLIT
|
||||
|
@@ -10,7 +10,7 @@ Forwarded: not-needed
|
||||
|
||||
--- a/Documentation/Makefile
|
||||
+++ b/Documentation/Makefile
|
||||
@@ -118,7 +118,6 @@ $(YNL_RST_DIR)/%.rst: $(YNL_YAML_DIR)/%.
|
||||
@@ -119,7 +119,6 @@ $(YNL_RST_DIR)/%.rst: $(YNL_YAML_DIR)/%.
|
||||
htmldocs texinfodocs latexdocs epubdocs xmldocs: $(YNL_INDEX)
|
||||
|
||||
htmldocs:
|
||||
@@ -18,7 +18,7 @@ Forwarded: not-needed
|
||||
@+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,html,$(var),,$(var)))
|
||||
|
||||
# If Rust support is available and .config exists, add rustdoc generated contents.
|
||||
@@ -132,7 +131,6 @@ endif
|
||||
@@ -133,7 +132,6 @@ endif
|
||||
endif
|
||||
|
||||
texinfodocs:
|
||||
@@ -26,7 +26,7 @@ Forwarded: not-needed
|
||||
@+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,texinfo,$(var),texinfo,$(var)))
|
||||
|
||||
# Note: the 'info' Make target is generated by sphinx itself when
|
||||
@@ -144,7 +142,6 @@ linkcheckdocs:
|
||||
@@ -145,7 +143,6 @@ linkcheckdocs:
|
||||
@$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,linkcheck,$(var),,$(var)))
|
||||
|
||||
latexdocs:
|
||||
@@ -34,7 +34,7 @@ Forwarded: not-needed
|
||||
@+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,latex,$(var),latex,$(var)))
|
||||
|
||||
ifeq ($(HAVE_PDFLATEX),0)
|
||||
@@ -157,7 +154,6 @@ else # HAVE_PDFLATEX
|
||||
@@ -158,7 +155,6 @@ else # HAVE_PDFLATEX
|
||||
|
||||
pdfdocs: DENY_VF = XDG_CONFIG_HOME=$(FONTS_CONF_DENY_VF)
|
||||
pdfdocs: latexdocs
|
||||
@@ -42,7 +42,7 @@ Forwarded: not-needed
|
||||
$(foreach var,$(SPHINXDIRS), \
|
||||
$(MAKE) PDFLATEX="$(PDFLATEX)" LATEXOPTS="$(LATEXOPTS)" $(DENY_VF) -C $(BUILDDIR)/$(var)/latex || sh $(srctree)/scripts/check-variable-fonts.sh || exit; \
|
||||
mkdir -p $(BUILDDIR)/$(var)/pdf; \
|
||||
@@ -167,11 +163,9 @@ pdfdocs: latexdocs
|
||||
@@ -168,11 +164,9 @@ pdfdocs: latexdocs
|
||||
endif # HAVE_PDFLATEX
|
||||
|
||||
epubdocs:
|
||||
|
@@ -1,5 +1,5 @@
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Mon, 05 Aug 2024 03:26:48 +0200
|
||||
Date: Tue, 08 Jul 2025 13:32:21 +0200
|
||||
Subject: Export symbols needed by binder
|
||||
Bug-Debian: https://bugs.debian.org/901492
|
||||
|
||||
@@ -10,19 +10,21 @@ and increase security attack surface on systems that don't need it.
|
||||
Export the currently un-exported symbols it depends on.
|
||||
|
||||
---
|
||||
fs/file.c | 1 +
|
||||
ipc/msgutil.c | 1 +
|
||||
ipc/namespace.c | 1 +
|
||||
kernel/sched/syscalls.c | 1 +
|
||||
kernel/sched/wait.c | 1 +
|
||||
kernel/task_work.c | 1 +
|
||||
mm/memory.c | 1 +
|
||||
security/security.c | 4 ++++
|
||||
8 files changed, 11 insertions(+)
|
||||
fs/file.c | 1 +
|
||||
ipc/msgutil.c | 1 +
|
||||
ipc/namespace.c | 1 +
|
||||
kernel/sched/syscalls.c | 1 +
|
||||
kernel/sched/wait.c | 1 +
|
||||
kernel/task_work.c | 1 +
|
||||
mm/list_lru.c | 2 ++
|
||||
mm/memory.c | 1 +
|
||||
mm/mmap_lock.c | 1 +
|
||||
security/security.c | 4 ++++
|
||||
10 files changed, 14 insertions(+)
|
||||
|
||||
--- a/fs/file.c
|
||||
+++ b/fs/file.c
|
||||
@@ -843,6 +843,7 @@ struct file *file_close_fd(unsigned int
|
||||
@@ -858,6 +858,7 @@ struct file *file_close_fd(unsigned int
|
||||
|
||||
return file;
|
||||
}
|
||||
@@ -80,16 +82,44 @@ Export the currently un-exported symbols it depends on.
|
||||
|
||||
/**
|
||||
* task_work_cancel_match - cancel a pending work added by task_work_add()
|
||||
--- a/mm/list_lru.c
|
||||
+++ b/mm/list_lru.c
|
||||
@@ -175,6 +175,7 @@ bool list_lru_add(struct list_lru *lru,
|
||||
unlock_list_lru(l, false);
|
||||
return false;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(list_lru_add);
|
||||
|
||||
bool list_lru_add_obj(struct list_lru *lru, struct list_head *item)
|
||||
{
|
||||
@@ -212,6 +213,7 @@ bool list_lru_del(struct list_lru *lru,
|
||||
unlock_list_lru(l, false);
|
||||
return false;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(list_lru_del);
|
||||
|
||||
bool list_lru_del_obj(struct list_lru *lru, struct list_head *item)
|
||||
{
|
||||
--- a/mm/memory.c
|
||||
+++ b/mm/memory.c
|
||||
@@ -2020,6 +2020,7 @@ void zap_page_range_single(struct vm_are
|
||||
@@ -2050,6 +2050,7 @@ void zap_page_range_single(struct vm_are
|
||||
zap_page_range_single_batched(&tlb, vma, address, size, details);
|
||||
tlb_finish_mmu(&tlb);
|
||||
hugetlb_zap_end(vma, details);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(zap_page_range_single);
|
||||
|
||||
/**
|
||||
* zap_vma_ptes - remove ptes mapping the vma
|
||||
--- a/mm/mmap_lock.c
|
||||
+++ b/mm/mmap_lock.c
|
||||
@@ -177,6 +177,7 @@ inval:
|
||||
count_vm_vma_lock_event(VMA_LOCK_ABORT);
|
||||
return NULL;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(lock_vma_under_rcu);
|
||||
#endif /* CONFIG_PER_VMA_LOCK */
|
||||
|
||||
#ifdef CONFIG_LOCK_MM_AND_FIND_VMA
|
||||
--- a/security/security.c
|
||||
+++ b/security/security.c
|
||||
@@ -996,6 +996,7 @@ int security_binder_set_context_mgr(cons
|
@@ -12,7 +12,7 @@ actually used.
|
||||
---
|
||||
--- a/fs/notify/fanotify/fanotify_user.c
|
||||
+++ b/fs/notify/fanotify/fanotify_user.c
|
||||
@@ -1881,6 +1881,14 @@ static int do_fanotify_mark(int fanotify
|
||||
@@ -1878,6 +1878,14 @@ static int do_fanotify_mark(int fanotify
|
||||
umask = FANOTIFY_EVENT_FLAGS;
|
||||
}
|
||||
|
||||
|
@@ -37,7 +37,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
{
|
||||
--- a/net/rose/af_rose.c
|
||||
+++ b/net/rose/af_rose.c
|
||||
@@ -1638,7 +1638,7 @@ MODULE_PARM_DESC(rose_ndevs, "number of
|
||||
@@ -1639,7 +1639,7 @@ MODULE_PARM_DESC(rose_ndevs, "number of
|
||||
MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
|
||||
MODULE_DESCRIPTION("The amateur radio ROSE network layer protocol");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
2
debian/patches/debian/kernelvariables.patch
vendored
2
debian/patches/debian/kernelvariables.patch
vendored
@@ -56,7 +56,7 @@ use of $(ARCH) needs to be moved after this.
|
||||
KCONFIG_CONFIG ?= .config
|
||||
export KCONFIG_CONFIG
|
||||
|
||||
@@ -551,6 +521,35 @@ RUSTFLAGS_KERNEL =
|
||||
@@ -556,6 +526,35 @@ RUSTFLAGS_KERNEL =
|
||||
AFLAGS_KERNEL =
|
||||
LDFLAGS_vmlinux =
|
||||
|
||||
|
@@ -15,7 +15,7 @@ to the installed location.
|
||||
---
|
||||
--- a/tools/perf/builtin-report.c
|
||||
+++ b/tools/perf/builtin-report.c
|
||||
@@ -666,10 +666,12 @@ static int report__browse_hists(struct r
|
||||
@@ -669,10 +669,12 @@ static int report__browse_hists(struct r
|
||||
|
||||
path = system_path(TIPDIR);
|
||||
if (perf_tip(&help, path) || help == NULL) {
|
||||
@@ -30,7 +30,7 @@ to the installed location.
|
||||
free(path);
|
||||
--- a/tools/perf/tests/Build
|
||||
+++ b/tools/perf/tests/Build
|
||||
@@ -73,7 +73,7 @@ ifeq ($(SRCARCH),$(filter $(SRCARCH),x86
|
||||
@@ -74,7 +74,7 @@ ifeq ($(SRCARCH),$(filter $(SRCARCH),x86
|
||||
perf-test-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
|
||||
endif
|
||||
|
||||
|
@@ -31,7 +31,7 @@ cc: linux-efi@vger.kernel.org
|
||||
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -1127,19 +1127,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
@@ -1149,19 +1149,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Allocate bigger log buffer */
|
||||
setup_log_buf(1);
|
||||
|
||||
|
@@ -26,7 +26,7 @@ Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
|
||||
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -964,6 +964,8 @@ void __init setup_arch(char **cmdline_p)
|
||||
@@ -986,6 +986,8 @@ void __init setup_arch(char **cmdline_p)
|
||||
if (efi_enabled(EFI_BOOT))
|
||||
efi_init();
|
||||
|
||||
@@ -35,7 +35,7 @@ Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
|
||||
reserve_ibft_region();
|
||||
x86_init.resources.dmi_setup();
|
||||
|
||||
@@ -1127,8 +1129,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
@@ -1149,8 +1151,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Allocate bigger log buffer */
|
||||
setup_log_buf(1);
|
||||
|
||||
@@ -67,7 +67,7 @@ Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
|
||||
default:
|
||||
--- a/include/linux/security.h
|
||||
+++ b/include/linux/security.h
|
||||
@@ -574,6 +574,7 @@ int security_inode_notifysecctx(struct i
|
||||
@@ -573,6 +573,7 @@ int security_inode_notifysecctx(struct i
|
||||
int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen);
|
||||
int security_inode_getsecctx(struct inode *inode, struct lsm_context *cp);
|
||||
int security_locked_down(enum lockdown_reason what);
|
||||
@@ -75,7 +75,7 @@ Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
|
||||
int lsm_fill_user_ctx(struct lsm_ctx __user *uctx, u32 *uctx_len,
|
||||
void *val, size_t val_len, u64 id, u64 flags);
|
||||
int security_bdev_alloc(struct block_device *bdev);
|
||||
@@ -1580,6 +1581,11 @@ static inline int security_locked_down(e
|
||||
@@ -1574,6 +1575,11 @@ static inline int security_locked_down(e
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@@ -22,7 +22,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/include/linux/perf_event.h
|
||||
+++ b/include/linux/perf_event.h
|
||||
@@ -1684,6 +1684,11 @@ extern int sysctl_perf_event_sample_rate
|
||||
@@ -1761,6 +1761,11 @@ extern int sysctl_perf_event_sample_rate
|
||||
|
||||
extern void perf_sample_event_took(u64 sample_len_ns);
|
||||
|
||||
@@ -36,7 +36,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/kernel/events/core.c
|
||||
+++ b/kernel/events/core.c
|
||||
@@ -450,8 +450,13 @@ static struct kmem_cache *perf_event_cac
|
||||
@@ -463,8 +463,13 @@ static struct kmem_cache *perf_event_cac
|
||||
* 0 - disallow raw tracepoint access for unpriv
|
||||
* 1 - disallow cpu events for unpriv
|
||||
* 2 - disallow kernel profiling for unpriv
|
||||
@@ -50,7 +50,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
/* Minimum for 512 kiB + 1 user control page. 'free' kiB per user. */
|
||||
static int sysctl_perf_event_mlock __read_mostly = 512 + (PAGE_SIZE / 1024);
|
||||
@@ -13110,6 +13115,9 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||
@@ -13382,6 +13387,9 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@@ -22,7 +22,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/Documentation/admin-guide/kernel-parameters.txt
|
||||
+++ b/Documentation/admin-guide/kernel-parameters.txt
|
||||
@@ -2288,6 +2288,8 @@
|
||||
@@ -2306,6 +2306,8 @@
|
||||
bypassed by not enabling DMAR with this option. In
|
||||
this case, gfx device will use physical address for
|
||||
DMA.
|
||||
@@ -68,7 +68,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
} else if (!strncmp(str, "forcedac", 8)) {
|
||||
pr_warn("intel_iommu=forcedac deprecated; use iommu.forcedac instead\n");
|
||||
iommu_dma_forcedac = true;
|
||||
@@ -1935,6 +1943,9 @@ static int device_def_domain_type(struct
|
||||
@@ -1899,6 +1907,9 @@ static int device_def_domain_type(struct
|
||||
|
||||
if ((iommu_identity_mapping & IDENTMAP_AZALIA) && IS_AZALIA(pdev))
|
||||
return IOMMU_DOMAIN_IDENTITY;
|
||||
@@ -78,7 +78,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -2229,6 +2240,9 @@ static int __init init_dmars(void)
|
||||
@@ -2189,6 +2200,9 @@ static int __init init_dmars(void)
|
||||
iommu_set_root_entry(iommu);
|
||||
}
|
||||
|
||||
|
@@ -29,7 +29,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/Documentation/admin-guide/kernel-parameters.txt
|
||||
+++ b/Documentation/admin-guide/kernel-parameters.txt
|
||||
@@ -7044,6 +7044,10 @@
|
||||
@@ -7117,6 +7117,10 @@
|
||||
later by a loaded module cannot be set this way.
|
||||
Example: sysctl.vm.swappiness=40
|
||||
|
||||
@@ -42,7 +42,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
Ignore sysrq setting - this boot parameter will
|
||||
--- a/arch/x86/Kconfig
|
||||
+++ b/arch/x86/Kconfig
|
||||
@@ -3169,6 +3169,14 @@ config COMPAT_32
|
||||
@@ -3150,6 +3150,14 @@ config COMPAT_32
|
||||
select HAVE_UID16
|
||||
select OLD_SIGSUSPEND3
|
||||
|
||||
@@ -69,7 +69,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
typedef unsigned long elf_greg_t;
|
||||
|
||||
@@ -152,7 +155,8 @@ do { \
|
||||
@@ -148,7 +151,8 @@ do { \
|
||||
|
||||
#define compat_elf_check_arch(x) \
|
||||
((elf_check_arch_ia32(x) && ia32_enabled_verbose()) || \
|
||||
|
2
debian/patches/krd/0002-local-ports.patch
vendored
2
debian/patches/krd/0002-local-ports.patch
vendored
@@ -1,6 +1,6 @@
|
||||
--- a/net/ipv4/af_inet.c
|
||||
+++ b/net/ipv4/af_inet.c
|
||||
@@ -1790,7 +1790,7 @@ static __net_init int inet_init_net(stru
|
||||
@@ -1787,7 +1787,7 @@ static __net_init int inet_init_net(stru
|
||||
/*
|
||||
* Set defaults for local port range
|
||||
*/
|
||||
|
@@ -1,6 +1,6 @@
|
||||
--- a/net/bridge/br_input.c
|
||||
+++ b/net/bridge/br_input.c
|
||||
@@ -383,7 +383,11 @@ static rx_handler_result_t br_handle_fra
|
||||
@@ -384,7 +384,11 @@ static rx_handler_result_t br_handle_fra
|
||||
|
||||
case 0x01: /* IEEE MAC (Pause) */
|
||||
reason = SKB_DROP_REASON_MAC_IEEE_MAC_CONTROL;
|
||||
|
@@ -1,221 +0,0 @@
|
||||
This reverts commit 484a54c2e597dbc4ace79c1687022282905afba0. The CoDel
|
||||
parameter change essentially disables CoDel on slow stations, with some
|
||||
questionable assumptions, as Dave pointed out in [0]. Quoting from
|
||||
there:
|
||||
|
||||
But here are my pithy comments as to why this part of mac80211 is so
|
||||
wrong...
|
||||
|
||||
static void sta_update_codel_params(struct sta_info *sta, u32 thr)
|
||||
{
|
||||
- if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
|
||||
|
||||
1) sta->local->num_sta is the number of associated, rather than
|
||||
active, stations. "Active" stations in the last 50ms or so, might have
|
||||
been a better thing to use, but as most people have far more than that
|
||||
associated, we end up with really lousy codel parameters, all the
|
||||
time. Mistake numero uno!
|
||||
|
||||
2) The STA_SLOW_THRESHOLD was completely arbitrary in 2016.
|
||||
|
||||
- sta->cparams.target = MS2TIME(50);
|
||||
|
||||
This, by itself, was probably not too bad. 30ms might have been
|
||||
better, at the time, when we were battling powersave etc, but 20ms was
|
||||
enough, really, to cover most scenarios, even where we had low rate
|
||||
2Ghz multicast to cope with. Even then, codel has a hard time finding
|
||||
any sane drop rate at all, with a target this high.
|
||||
|
||||
- sta->cparams.interval = MS2TIME(300);
|
||||
|
||||
But this was horrible, a total mistake, that is leading to codel being
|
||||
completely ineffective in almost any scenario on clients or APS.
|
||||
100ms, even 80ms, here, would be vastly better than this insanity. I'm
|
||||
seeing 5+seconds of delay accumulated in a bunch of otherwise happily
|
||||
fq-ing APs....
|
||||
|
||||
100ms of observed jitter during a flow is enough. Certainly (in 2016)
|
||||
there were interactions with powersave that I did not understand, and
|
||||
still don't, but if you are transmitting in the first place, powersave
|
||||
shouldn't be a problemmmm.....
|
||||
|
||||
- sta->cparams.ecn = false;
|
||||
|
||||
At the time we were pretty nervous about ecn, I'm kind of sanguine
|
||||
about it now, and reliably indicating ecn seems better than turning it
|
||||
off for any reason.
|
||||
|
||||
[...]
|
||||
|
||||
In production, on p2p wireless, I've had 8ms and 80ms for target and
|
||||
interval for years now, and it works great.
|
||||
|
||||
I think Dave's arguments above are basically sound on the face of it,
|
||||
and various experimentation with tighter CoDel parameters in the OpenWrt
|
||||
community have show promising results[1]. So I don't think there's any
|
||||
reason to keep this parameter fiddling; hence this revert.
|
||||
|
||||
[0] https://lore.kernel.org/linux-wireless/CAA93jw6NJ2cmLmMauz0xAgC2MGbBq6n0ZiZzAdkK0u4b+O2yXg@mail.gmail.com/
|
||||
[1] https://forum.openwrt.org/t/reducing-multiplexing-latencies-still-further-in-wifi/133605/130
|
||||
|
||||
Suggested-By: Dave Taht <dave.taht@gmail.com>
|
||||
In-memory-of: Dave Taht <dave.taht@gmail.com>
|
||||
Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
|
||||
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -5347,22 +5347,6 @@ void ieee80211_get_tx_rates(struct ieee8
|
||||
int max_rates);
|
||||
|
||||
/**
|
||||
- * ieee80211_sta_set_expected_throughput - set the expected tpt for a station
|
||||
- *
|
||||
- * Call this function to notify mac80211 about a change in expected throughput
|
||||
- * to a station. A driver for a device that does rate control in firmware can
|
||||
- * call this function when the expected throughput estimate towards a station
|
||||
- * changes. The information is used to tune the CoDel AQM applied to traffic
|
||||
- * going towards that station (which can otherwise be too aggressive and cause
|
||||
- * slow stations to starve).
|
||||
- *
|
||||
- * @pubsta: the station to set throughput for.
|
||||
- * @thr: the current expected throughput in kbps.
|
||||
- */
|
||||
-void ieee80211_sta_set_expected_throughput(struct ieee80211_sta *pubsta,
|
||||
- u32 thr);
|
||||
-
|
||||
-/**
|
||||
* ieee80211_tx_rate_update - transmit rate update callback
|
||||
*
|
||||
* Drivers should call this functions with a non-NULL pub sta
|
||||
--- a/net/mac80211/debugfs_sta.c
|
||||
+++ b/net/mac80211/debugfs_sta.c
|
||||
@@ -152,12 +152,6 @@ static ssize_t sta_aqm_read(struct file
|
||||
|
||||
p += scnprintf(p,
|
||||
bufsz + buf - p,
|
||||
- "target %uus interval %uus ecn %s\n",
|
||||
- codel_time_to_us(sta->cparams.target),
|
||||
- codel_time_to_us(sta->cparams.interval),
|
||||
- sta->cparams.ecn ? "yes" : "no");
|
||||
- p += scnprintf(p,
|
||||
- bufsz + buf - p,
|
||||
"tid ac backlog-bytes backlog-packets new-flows drops marks overlimit collisions tx-bytes tx-packets flags\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
|
||||
--- a/net/mac80211/rate.c
|
||||
+++ b/net/mac80211/rate.c
|
||||
@@ -990,8 +990,6 @@ int rate_control_set_rates(struct ieee80
|
||||
if (sta->uploaded)
|
||||
drv_sta_rate_tbl_update(hw_to_local(hw), sta->sdata, pubsta);
|
||||
|
||||
- ieee80211_sta_set_expected_throughput(pubsta, sta_get_expected_throughput(sta));
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(rate_control_set_rates);
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
-#include <net/codel.h>
|
||||
#include <net/mac80211.h>
|
||||
#include "ieee80211_i.h"
|
||||
#include "driver-ops.h"
|
||||
@@ -702,13 +701,6 @@ __sta_info_alloc(struct ieee80211_sub_if
|
||||
}
|
||||
}
|
||||
|
||||
- sta->cparams.ce_threshold = CODEL_DISABLED_THRESHOLD;
|
||||
- sta->cparams.target = MS2TIME(20);
|
||||
- sta->cparams.interval = MS2TIME(100);
|
||||
- sta->cparams.ecn = true;
|
||||
- sta->cparams.ce_threshold_selector = 0;
|
||||
- sta->cparams.ce_threshold_mask = 0;
|
||||
-
|
||||
sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr);
|
||||
|
||||
return sta;
|
||||
@@ -2928,27 +2920,6 @@ unsigned long ieee80211_sta_last_active(
|
||||
return sta->deflink.status_stats.last_ack;
|
||||
}
|
||||
|
||||
-static void sta_update_codel_params(struct sta_info *sta, u32 thr)
|
||||
-{
|
||||
- if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
|
||||
- sta->cparams.target = MS2TIME(50);
|
||||
- sta->cparams.interval = MS2TIME(300);
|
||||
- sta->cparams.ecn = false;
|
||||
- } else {
|
||||
- sta->cparams.target = MS2TIME(20);
|
||||
- sta->cparams.interval = MS2TIME(100);
|
||||
- sta->cparams.ecn = true;
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-void ieee80211_sta_set_expected_throughput(struct ieee80211_sta *pubsta,
|
||||
- u32 thr)
|
||||
-{
|
||||
- struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
||||
-
|
||||
- sta_update_codel_params(sta, thr);
|
||||
-}
|
||||
-
|
||||
int ieee80211_sta_allocate_link(struct sta_info *sta, unsigned int link_id)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
--- a/net/mac80211/sta_info.h
|
||||
+++ b/net/mac80211/sta_info.h
|
||||
@@ -467,14 +467,6 @@ struct ieee80211_fragment_cache {
|
||||
unsigned int next;
|
||||
};
|
||||
|
||||
-/*
|
||||
- * The bandwidth threshold below which the per-station CoDel parameters will be
|
||||
- * scaled to be more lenient (to prevent starvation of slow stations). This
|
||||
- * value will be scaled by the number of active stations when it is being
|
||||
- * applied.
|
||||
- */
|
||||
-#define STA_SLOW_THRESHOLD 6000 /* 6 Mbps */
|
||||
-
|
||||
/**
|
||||
* struct link_sta_info - Link STA information
|
||||
* All link specific sta info are stored here for reference. This can be
|
||||
@@ -627,7 +619,6 @@ struct link_sta_info {
|
||||
* @sta: station information we share with the driver
|
||||
* @sta_state: duplicates information about station state (for debug)
|
||||
* @rcu_head: RCU head used for freeing this station struct
|
||||
- * @cparams: CoDel parameters for this station.
|
||||
* @reserved_tid: reserved TID (if any, otherwise IEEE80211_TID_UNRESERVED)
|
||||
* @amsdu_mesh_control: track the mesh A-MSDU format used by the peer:
|
||||
*
|
||||
@@ -718,8 +709,6 @@ struct sta_info {
|
||||
struct dentry *debugfs_dir;
|
||||
#endif
|
||||
|
||||
- struct codel_params cparams;
|
||||
-
|
||||
u8 reserved_tid;
|
||||
s8 amsdu_mesh_control;
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -1402,16 +1402,9 @@ static struct sk_buff *fq_tin_dequeue_fu
|
||||
|
||||
local = container_of(fq, struct ieee80211_local, fq);
|
||||
txqi = container_of(tin, struct txq_info, tin);
|
||||
+ cparams = &local->cparams;
|
||||
cstats = &txqi->cstats;
|
||||
|
||||
- if (txqi->txq.sta) {
|
||||
- struct sta_info *sta = container_of(txqi->txq.sta,
|
||||
- struct sta_info, sta);
|
||||
- cparams = &sta->cparams;
|
||||
- } else {
|
||||
- cparams = &local->cparams;
|
||||
- }
|
||||
-
|
||||
if (flow == &tin->default_flow)
|
||||
cvars = &txqi->def_cvars;
|
||||
else
|
@@ -18,7 +18,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -2474,6 +2474,13 @@ static void sta_stats_decode_rate(struct
|
||||
@@ -2468,6 +2468,13 @@ static void sta_stats_decode_rate(struct
|
||||
|
||||
sband = local->hw.wiphy->bands[band];
|
||||
|
@@ -28,7 +28,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -583,6 +583,7 @@ __sta_info_alloc(struct ieee80211_sub_if
|
||||
@@ -582,6 +582,7 @@ __sta_info_alloc(struct ieee80211_sub_if
|
||||
spin_lock_init(&sta->ps_lock);
|
||||
INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames);
|
||||
wiphy_work_init(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
|
@@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4084,7 +4084,7 @@ struct ieee80211_txq *ieee80211_next_txq
|
||||
@@ -4074,7 +4074,7 @@ struct ieee80211_txq *ieee80211_next_txq
|
||||
|
||||
if (deficit < 0)
|
||||
sta->airtime[txqi->txq.ac].deficit +=
|
||||
@@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
if (deficit < 0 || !aql_check) {
|
||||
list_move_tail(&txqi->schedule_order,
|
||||
@@ -4227,7 +4227,8 @@ bool ieee80211_txq_may_transmit(struct i
|
||||
@@ -4219,7 +4219,8 @@ bool ieee80211_txq_may_transmit(struct i
|
||||
}
|
||||
sta = container_of(iter->txq.sta, struct sta_info, sta);
|
||||
if (ieee80211_sta_deficit(sta, ac) < 0)
|
||||
@@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
list_move_tail(&iter->schedule_order, &local->active_txqs[ac]);
|
||||
}
|
||||
|
||||
@@ -4235,7 +4236,7 @@ bool ieee80211_txq_may_transmit(struct i
|
||||
@@ -4227,7 +4228,7 @@ bool ieee80211_txq_may_transmit(struct i
|
||||
if (sta->airtime[ac].deficit >= 0)
|
||||
goto out;
|
||||
|
@@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -3464,6 +3464,7 @@ enum wiphy_params_flags {
|
||||
@@ -3434,6 +3434,7 @@ enum wiphy_params_flags {
|
||||
/* The per TXQ device queue limit in airtime */
|
||||
#define IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L 5000
|
||||
#define IEEE80211_DEFAULT_AQL_TXQ_LIMIT_H 12000
|
||||
@@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -1368,10 +1368,12 @@ struct ieee80211_local {
|
||||
@@ -1392,10 +1392,12 @@ struct ieee80211_local {
|
||||
spinlock_t handle_wake_tx_queue_lock;
|
||||
|
||||
u16 airtime_flags;
|
||||
@@ -85,7 +85,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
const struct ieee80211_ops *ops;
|
||||
--- a/net/mac80211/main.c
|
||||
+++ b/net/mac80211/main.c
|
||||
@@ -959,6 +959,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
|
||||
@@ -970,6 +970,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
|
||||
spin_lock_init(&local->rx_path_lock);
|
||||
spin_lock_init(&local->queue_stop_reason_lock);
|
||||
|
||||
@@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
spin_lock_init(&local->active_txq_lock[i]);
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -2388,13 +2388,28 @@ EXPORT_SYMBOL(ieee80211_sta_recalc_aggre
|
||||
@@ -2382,13 +2382,28 @@ EXPORT_SYMBOL(ieee80211_sta_recalc_aggre
|
||||
|
||||
void ieee80211_sta_update_pending_airtime(struct ieee80211_local *local,
|
||||
struct sta_info *sta, u8 ac,
|
||||
@@ -127,7 +127,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
atomic_add(tx_airtime,
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -2556,7 +2556,7 @@ static u16 ieee80211_store_ack_skb(struc
|
||||
@@ -2546,7 +2546,7 @@ static u16 ieee80211_store_ack_skb(struc
|
||||
|
||||
spin_lock_irqsave(&local->ack_status_lock, flags);
|
||||
id = idr_alloc(&local->ack_status_frames, ack_skb,
|
||||
@@ -136,7 +136,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
spin_unlock_irqrestore(&local->ack_status_lock, flags);
|
||||
|
||||
if (id >= 0) {
|
||||
@@ -3985,20 +3985,20 @@ begin:
|
||||
@@ -3975,20 +3975,20 @@ begin:
|
||||
encap_out:
|
||||
info->control.vif = vif;
|
||||
|
||||
@@ -167,7 +167,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
}
|
||||
|
||||
return skb;
|
||||
@@ -4050,6 +4050,7 @@ struct ieee80211_txq *ieee80211_next_txq
|
||||
@@ -4040,6 +4040,7 @@ struct ieee80211_txq *ieee80211_next_txq
|
||||
struct ieee80211_txq *ret = NULL;
|
||||
struct txq_info *txqi = NULL, *head = NULL;
|
||||
bool found_eligible_txq = false;
|
||||
@@ -175,7 +175,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
spin_lock_bh(&local->active_txq_lock[ac]);
|
||||
|
||||
@@ -4073,26 +4074,26 @@ struct ieee80211_txq *ieee80211_next_txq
|
||||
@@ -4063,26 +4064,26 @@ struct ieee80211_txq *ieee80211_next_txq
|
||||
if (!head)
|
||||
head = txqi;
|
||||
|
||||
@@ -214,7 +214,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
if (txqi->schedule_round == local->schedule_round[ac])
|
||||
goto out;
|
||||
|
||||
@@ -4157,7 +4158,8 @@ bool ieee80211_txq_airtime_check(struct
|
||||
@@ -4149,7 +4150,8 @@ bool ieee80211_txq_airtime_check(struct
|
||||
return true;
|
||||
|
||||
if (!txq->sta)
|
||||
@@ -224,7 +224,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
if (unlikely(txq->tid == IEEE80211_NUM_TIDS))
|
||||
return true;
|
||||
@@ -4206,15 +4208,15 @@ bool ieee80211_txq_may_transmit(struct i
|
||||
@@ -4198,15 +4200,15 @@ bool ieee80211_txq_may_transmit(struct i
|
||||
|
||||
spin_lock_bh(&local->active_txq_lock[ac]);
|
||||
|
||||
@@ -245,7 +245,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
if (iter == txqi)
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -1238,8 +1238,8 @@ struct ieee80211_tx_info {
|
||||
@@ -1245,8 +1245,8 @@ struct ieee80211_tx_info {
|
||||
status_data_idr:1,
|
||||
status_data:13,
|
||||
hw_queue:4,
|
@@ -1,6 +1,6 @@
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -1599,8 +1599,8 @@ int ieee80211_txq_setup_flows(struct iee
|
||||
@@ -1596,8 +1596,8 @@ int ieee80211_txq_setup_flows(struct iee
|
||||
fq->memory_limit = 4 << 20; /* 4 Mbytes */
|
||||
|
||||
codel_params_init(&local->cparams);
|
@@ -1,6 +1,6 @@
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -3462,12 +3462,12 @@ enum wiphy_params_flags {
|
||||
@@ -3432,12 +3432,12 @@ enum wiphy_params_flags {
|
||||
#define IEEE80211_DEFAULT_AIRTIME_WEIGHT 256
|
||||
|
||||
/* The per TXQ device queue limit in airtime */
|
@@ -1,10 +1,6 @@
|
||||
From 906ed24dfc7e1bbceacc087ba38aecfd22a9890b Mon Sep 17 00:00:00 2001
|
||||
From 6b1d270f55e3143bcb3ad914adf920774351a6b9 Mon Sep 17 00:00:00 2001
|
||||
From: graysky <therealgraysky AT proton DOT me>
|
||||
Date: Mon, 16 Sep 2024 14:47:03 -0400
|
||||
|
||||
FEATURES
|
||||
This patch adds additional tunings via new x86-64 ISA levels and
|
||||
more micro-architecture options to the Linux kernel in three classes.
|
||||
Date: Mon, 18 Aug 2025 04:14:48 -0400
|
||||
|
||||
1. New generic x86-64 ISA levels
|
||||
|
||||
@@ -103,7 +99,7 @@ See the following experimental evidence supporting this statement:
|
||||
https://github.com/graysky2/kernel_compiler_patch?tab=readme-ov-file#benchmarks
|
||||
|
||||
REQUIREMENTS
|
||||
linux version 6.1.79+
|
||||
linux version 6.16+
|
||||
gcc version >=9.0 or clang version >=9.0
|
||||
|
||||
ACKNOWLEDGMENTS
|
||||
@@ -116,9 +112,9 @@ REFERENCES
|
||||
4. http://www.linuxforge.net/docs/linux/linux-gcc.php
|
||||
|
||||
---
|
||||
arch/x86/Kconfig.cpu | 462 ++++++++++++++++++++++++++++++++++++++++++-
|
||||
arch/x86/Makefile | 222 +++++++++++++++++++++
|
||||
2 files changed, 675 insertions(+), 9 deletions(-)
|
||||
arch/x86/Kconfig.cpu | 427 ++++++++++++++++++++++++++++++++++++++++++-
|
||||
arch/x86/Makefile | 213 ++++++++++++++++++++-
|
||||
2 files changed, 631 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/arch/x86/Kconfig.cpu
|
||||
+++ b/arch/x86/Kconfig.cpu
|
||||
@@ -163,38 +159,15 @@ REFERENCES
|
||||
|
||||
config MK6
|
||||
bool "K6/K6-II/K6-III"
|
||||
@@ -245,6 +260,435 @@ config MATOM
|
||||
@@ -281,6 +296,402 @@ config X86_GENERIC
|
||||
This is really intended for distributors who need more
|
||||
generic optimizations.
|
||||
|
||||
endchoice
|
||||
|
||||
+config CC_HAS_MARCH_NATIVE
|
||||
+ # This flag might not be available in cross-compilers:
|
||||
+ def_bool $(cc-option, -march=native)
|
||||
+ # LLVM 18 has an easily triggered internal compiler error in core
|
||||
+ # networking code with '-march=native' on certain systems:
|
||||
+ # https://github.com/llvm/llvm-project/issues/72026
|
||||
+ # LLVM 19 introduces an optimization that resolves some high stack
|
||||
+ # usage warnings that only appear wth '-march=native'.
|
||||
+ depends on CC_IS_GCC || CLANG_VERSION >= 190100
|
||||
+
|
||||
+choice
|
||||
+ prompt "x86_64 Compiler Build Optimization"
|
||||
+ depends on !X86_NATIVE_CPU
|
||||
+ default GENERIC_CPU
|
||||
+
|
||||
+config X86_NATIVE_CPU
|
||||
+ bool "Build and optimize for local/native CPU"
|
||||
+ depends on X86_64
|
||||
+ depends on CC_HAS_MARCH_NATIVE
|
||||
+ help
|
||||
+ Optimize for the current CPU used to compile the kernel.
|
||||
+ Use this option if you intend to build the kernel for your
|
||||
+ local machine.
|
||||
+
|
||||
+ Note that such a kernel might not work optimally on a
|
||||
+ different x86 machine.
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
+config GENERIC_CPU
|
||||
+ bool "Generic-x86-64"
|
||||
+ depends on X86_64
|
||||
@@ -202,26 +175,6 @@ REFERENCES
|
||||
+ Generic x86-64 CPU.
|
||||
+ Runs equally well on all x86-64 CPUs.
|
||||
+
|
||||
+config MNATIVE_INTEL
|
||||
+ bool "Intel-Native optimizations autodetected by the compiler"
|
||||
+ help
|
||||
+
|
||||
+ Clang 3.8, GCC 4.2 and above support -march=native, which automatically detects
|
||||
+ the optimum settings to use based on your processor. Do NOT use this
|
||||
+ for AMD CPUs. Intel Only!
|
||||
+
|
||||
+ Enables -march=native
|
||||
+
|
||||
+config MNATIVE_AMD
|
||||
+ bool "AMD-Native optimizations autodetected by the compiler"
|
||||
+ help
|
||||
+
|
||||
+ Clang 3.8, GCC 4.2 and above support -march=native, which automatically detects
|
||||
+ the optimum settings to use based on your processor. Do NOT use this
|
||||
+ for Intel CPUs. AMD Only!
|
||||
+
|
||||
+ Enables -march=native
|
||||
+
|
||||
+config MK8
|
||||
+ bool "AMD Opteron/Athlon64/Hammer/K8"
|
||||
+ help
|
||||
@@ -445,20 +398,20 @@ REFERENCES
|
||||
+ Enables -march=skylake
|
||||
+
|
||||
+config MSKYLAKEX
|
||||
+ bool "Intel Skylake X"
|
||||
+ bool "Intel Skylake-X (7th Gen Core i7/i9)"
|
||||
+ depends on X86_64
|
||||
+ help
|
||||
+
|
||||
+ Select this for 6th Gen Core processors in the Skylake X family.
|
||||
+ Select this for 7th Gen Core i7/i9 processors in the Skylake-X family.
|
||||
+
|
||||
+ Enables -march=skylake-avx512
|
||||
+
|
||||
+config MCANNONLAKE
|
||||
+ bool "Intel Cannon Lake"
|
||||
+ bool "Intel Coffee Lake/Kaby Lake Refresh (8th Gen Core i3/i5/i7)"
|
||||
+ depends on X86_64
|
||||
+ help
|
||||
+
|
||||
+ Select this for 8th Gen Core processors
|
||||
+ Select this for 8th Gen Core i3/i5/i7 processors in the Coffee Lake or Kaby Lake Refresh families.
|
||||
+
|
||||
+ Enables -march=cannonlake
|
||||
+
|
||||
@@ -472,11 +425,11 @@ REFERENCES
|
||||
+ Enables -march=icelake-client
|
||||
+
|
||||
+config MICELAKE_SERVER
|
||||
+ bool "Intel Ice Lake Server"
|
||||
+ bool "Intel Ice Lake-SP (3rd Gen Xeon Scalable)"
|
||||
+ depends on X86_64
|
||||
+ help
|
||||
+
|
||||
+ Select this for 10th Gen Core server processors in the Ice Lake family.
|
||||
+ Select this for 3rd Gen Xeon Scalable processors in the Ice Lake-SP family.
|
||||
+
|
||||
+ Enables -march=icelake-server
|
||||
+
|
||||
@@ -566,10 +519,20 @@ REFERENCES
|
||||
+ depends on (CC_IS_GCC && GCC_VERSION > 130000) || (CC_IS_CLANG && CLANG_VERSION >= 150500)
|
||||
+ help
|
||||
+
|
||||
+ Select this for fifth-generation 10 nm process processors in the Emerald Rapids family.
|
||||
+ Select this for fifth-generation Xeon Scalable processors in the Emerald Rapids family.
|
||||
+
|
||||
+ Enables -march=emeraldrapids
|
||||
+
|
||||
+config MDIAMONDRAPIDS
|
||||
+ bool "Intel Diamond Rapids (7th Gen Xeon Scalable)"
|
||||
+ depends on X86_64
|
||||
+ depends on (CC_IS_GCC && GCC_VERSION > 150000) || (CC_IS_CLANG && CLANG_VERSION >= 200000)
|
||||
+ help
|
||||
+
|
||||
+ Select this for seventh-generation Xeon Scalable processors in the Diamond Rapids family.
|
||||
+
|
||||
+ Enables -march=diamondrapids
|
||||
+
|
||||
+endchoice
|
||||
+
|
||||
+config X86_64_VERSION
|
||||
@@ -596,31 +559,31 @@ REFERENCES
|
||||
+ /lib/ld-linux-x86-64.so.2 --help | grep supported
|
||||
+ /lib64/ld-linux-x86-64.so.2 --help | grep supported
|
||||
+
|
||||
config X86_GENERIC
|
||||
bool "Generic x86 support"
|
||||
depends on X86_32
|
||||
@@ -266,8 +710,8 @@ config X86_INTERNODE_CACHE_SHIFT
|
||||
#
|
||||
# Define implied options from the CPU selection here
|
||||
config X86_INTERNODE_CACHE_SHIFT
|
||||
@@ -290,8 +701,8 @@ config X86_INTERNODE_CACHE_SHIFT
|
||||
|
||||
config X86_L1_CACHE_SHIFT
|
||||
int
|
||||
- default "7" if MPENTIUM4
|
||||
- default "6" if MK7 || MPENTIUMM || MATOM || MVIAC7 || X86_GENERIC || X86_64
|
||||
+ default "7" if MPENTIUM4 || MPSC
|
||||
+ default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MJAGUAR || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || MZEN3 || MZEN4 || MZEN5 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL || MNATIVE_AMD
|
||||
+ default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MJAGUAR || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || MZEN3 || MZEN4 || MZEN5 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MDIAMONDRAPIDS || X86_NATIVE_CPU
|
||||
default "4" if MELAN || M486SX || M486 || MGEODEGX1
|
||||
default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX
|
||||
|
||||
@@ -285,19 +729,19 @@ config X86_ALIGNMENT_16
|
||||
@@ -309,19 +720,19 @@ config X86_ALIGNMENT_16
|
||||
|
||||
config X86_INTEL_USERCOPY
|
||||
def_bool y
|
||||
- depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK7 || MEFFICEON
|
||||
+ depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL
|
||||
+ depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MDIAMONDRAPIDS
|
||||
|
||||
config X86_USE_PPRO_CHECKSUM
|
||||
def_bool y
|
||||
- depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MATOM
|
||||
+ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MJAGUAR || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || MZEN3 || MZEN4 || MZEN5 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL || MNATIVE_AMD
|
||||
+ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MJAGUAR || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || MZEN3 || MZEN4 || MZEN5 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MDIAMONDRAPIDS
|
||||
|
||||
config X86_TSC
|
||||
def_bool y
|
||||
@@ -634,7 +597,7 @@ REFERENCES
|
||||
|
||||
config X86_CX8
|
||||
def_bool y
|
||||
@@ -307,13 +751,13 @@ config X86_CX8
|
||||
@@ -331,12 +742,12 @@ config X86_CX8
|
||||
# generates cmov.
|
||||
config X86_CMOV
|
||||
def_bool y
|
||||
@@ -645,33 +608,16 @@ REFERENCES
|
||||
int
|
||||
default "64" if X86_64
|
||||
- default "6" if X86_32 && (MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MEFFICEON || MATOM || MK7)
|
||||
- default "5" if X86_32 && X86_CX8
|
||||
+ default "6" if X86_32 && (MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MEFFICEON || MATOM || MCORE2 || MK7 || MK8)
|
||||
+ default "5" if X86_32 && X86_CMPXCHG64
|
||||
default "5" if X86_32 && X86_CX8
|
||||
default "4"
|
||||
|
||||
config X86_DEBUGCTLMSR
|
||||
--- a/arch/x86/Makefile
|
||||
+++ b/arch/x86/Makefile
|
||||
@@ -173,8 +173,230 @@ else
|
||||
# Use -mskip-rax-setup if supported.
|
||||
KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup)
|
||||
|
||||
+ifdef CONFIG_X86_NATIVE_CPU
|
||||
+ KBUILD_CFLAGS += -march=native
|
||||
+ KBUILD_RUSTFLAGS += -Ctarget-cpu=native
|
||||
+endif
|
||||
+
|
||||
+ifdef CONFIG_MNATIVE_INTEL
|
||||
+ KBUILD_CFLAGS += -march=native
|
||||
+ KBUILD_RUSTFLAGS += -Ctarget-cpu=native
|
||||
+endif
|
||||
+
|
||||
+ifdef CONFIG_MNATIVE_AMD
|
||||
+ KBUILD_CFLAGS += -march=native
|
||||
+ KBUILD_RUSTFLAGS += -Ctarget-cpu=native
|
||||
+endif
|
||||
+
|
||||
@@ -177,10 +177,221 @@ ifdef CONFIG_X86_NATIVE_CPU
|
||||
KBUILD_CFLAGS += -march=native
|
||||
KBUILD_RUSTFLAGS += -Ctarget-cpu=native
|
||||
else
|
||||
+ifdef CONFIG_MK8
|
||||
+ KBUILD_CFLAGS += -march=k8
|
||||
+ KBUILD_RUSTFLAGS += -Ctarget-cpu=k8
|
||||
@@ -872,6 +818,11 @@ REFERENCES
|
||||
+ KBUILD_RUSTFLAGS += -Ctarget-cpu=emeraldrapids
|
||||
+endif
|
||||
+
|
||||
+ifdef CONFIG_MDIAMONDRAPIDS
|
||||
+ KBUILD_CFLAGS += -march=diamondrapids
|
||||
+ KBUILD_RUSTFLAGS += -Ctarget-cpu=diamondrapids
|
||||
+endif
|
||||
+
|
||||
+ifdef CONFIG_GENERIC_CPU
|
||||
+ifeq ($(CONFIG_X86_64_VERSION),1)
|
||||
KBUILD_CFLAGS += -march=x86-64 -mtune=generic
|
||||
@@ -879,8 +830,10 @@ REFERENCES
|
||||
+else
|
||||
+ KBUILD_CFLAGS +=-march=x86-64-v$(CONFIG_X86_64_VERSION)
|
||||
+ KBUILD_RUSTFLAGS += -Ctarget-cpu=x86-64-v$(CONFIG_X86_64_VERSION)
|
||||
+endif # CONFIG_X86_64_VERSION
|
||||
+endif # CONFIG_GENERIC_CPU
|
||||
|
||||
+endif
|
||||
+endif
|
||||
endif
|
||||
-
|
||||
KBUILD_CFLAGS += -mno-red-zone
|
||||
KBUILD_CFLAGS += -mcmodel=kernel
|
||||
KBUILD_RUSTFLAGS += -Cno-redzone=y
|
||||
|
@@ -13,7 +13,7 @@ dependency on CONFIG_ARC and adds RUSTFLAGS.
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -868,6 +868,9 @@ KBUILD_CFLAGS += -fno-delete-null-pointe
|
||||
@@ -873,6 +873,9 @@ KBUILD_CFLAGS += -fno-delete-null-pointe
|
||||
ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
KBUILD_CFLAGS += -O2
|
||||
KBUILD_RUSTFLAGS += -Copt-level=2
|
||||
@@ -25,7 +25,7 @@ dependency on CONFIG_ARC and adds RUSTFLAGS.
|
||||
KBUILD_RUSTFLAGS += -Copt-level=s
|
||||
--- a/init/Kconfig
|
||||
+++ b/init/Kconfig
|
||||
@@ -1479,6 +1479,12 @@ config CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
@@ -1498,6 +1498,12 @@ config CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
with the "-O2" compiler flag for best performance and most
|
||||
helpful compile-time warnings.
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -876,6 +876,10 @@ KBUILD_CFLAGS += -Os
|
||||
@@ -881,6 +881,10 @@ KBUILD_CFLAGS += -Os
|
||||
KBUILD_RUSTFLAGS += -Copt-level=s
|
||||
endif
|
||||
|
||||
|
@@ -11,7 +11,7 @@ Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -880,6 +880,13 @@ ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
@@ -885,6 +885,13 @@ ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
KBUILD_CFLAGS += $(call cc-option,-fivopts)
|
||||
endif
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 1cb9f09cead0ba384729bfdc74d6fa21d586530c Mon Sep 17 00:00:00 2001
|
||||
From 2f7f5a0cd283219e09f8b05b7bfef26b518685ee Mon Sep 17 00:00:00 2001
|
||||
From: Christian Loehle <christian.loehle@arm.com>
|
||||
Date: Thu, 5 Sep 2024 10:26:39 +0100
|
||||
Subject: cpuidle: Prefer teo over menu governor
|
||||
@@ -36,7 +36,7 @@ Signed-off-by: Christian Loehle <christian.loehle@arm.com>
|
||||
depends on KVM_GUEST
|
||||
--- a/drivers/cpuidle/governors/menu.c
|
||||
+++ b/drivers/cpuidle/governors/menu.c
|
||||
@@ -513,7 +513,7 @@ static int menu_enable_device(struct cpu
|
||||
@@ -521,7 +521,7 @@ static int menu_enable_device(struct cpu
|
||||
|
||||
static struct cpuidle_governor menu_governor = {
|
||||
.name = "menu",
|
||||
|
@@ -1,70 +0,0 @@
|
||||
From 1616d0edbdf3b36a8f4694d35bcf88fa1242c7e8 Mon Sep 17 00:00:00 2001
|
||||
From: Jinliang Zheng <alexjlzheng@tencent.com>
|
||||
Date: Tue, 15 Apr 2025 17:02:32 +0800
|
||||
Subject: mm: fix ratelimit_pages update error in dirty_ratio_handler()
|
||||
|
||||
In dirty_ratio_handler(), vm_dirty_bytes must be set to zero before
|
||||
calling writeback_set_ratelimit(), as global_dirty_limits() always
|
||||
prioritizes the value of vm_dirty_bytes.
|
||||
|
||||
It's domain_dirty_limits() that's relevant here, not node_dirty_ok:
|
||||
|
||||
dirty_ratio_handler
|
||||
writeback_set_ratelimit
|
||||
global_dirty_limits(&dirty_thresh) <- ratelimit_pages based on dirty_thresh
|
||||
domain_dirty_limits
|
||||
if (bytes) <- bytes = vm_dirty_bytes <--------+
|
||||
thresh = f1(bytes) <- prioritizes vm_dirty_bytes |
|
||||
else |
|
||||
thresh = f2(ratio) |
|
||||
ratelimit_pages = f3(dirty_thresh) |
|
||||
vm_dirty_bytes = 0 <- it's late! ---------------------+
|
||||
|
||||
This causes ratelimit_pages to still use the value calculated based on
|
||||
vm_dirty_bytes, which is wrong now.
|
||||
|
||||
|
||||
The impact visible to userspace is difficult to capture directly because
|
||||
there is no procfs/sysfs interface exported to user space. However, it
|
||||
will have a real impact on the balance of dirty pages.
|
||||
|
||||
For example:
|
||||
|
||||
1. On default, we have vm_dirty_ratio=40, vm_dirty_bytes=0
|
||||
|
||||
2. echo 8192 > dirty_bytes, then vm_dirty_bytes=8192,
|
||||
vm_dirty_ratio=0, and ratelimit_pages is calculated based on
|
||||
vm_dirty_bytes now.
|
||||
|
||||
3. echo 20 > dirty_ratio, then since vm_dirty_bytes is not reset to
|
||||
zero when writeback_set_ratelimit() -> global_dirty_limits() ->
|
||||
domain_dirty_limits() is called, reallimit_pages is still calculated
|
||||
based on vm_dirty_bytes instead of vm_dirty_ratio. This does not
|
||||
conform to the actual intent of the user.
|
||||
|
||||
Link: https://lkml.kernel.org/r/20250415090232.7544-1-alexjlzheng@tencent.com
|
||||
Fixes: 9d823e8f6b1b ("writeback: per task dirty rate limit")
|
||||
Signed-off-by: Jinliang Zheng <alexjlzheng@tencent.com>
|
||||
Reviewed-by: MengEn Sun <mengensun@tencent.com>
|
||||
Cc: Andrea Righi <andrea@betterlinux.com>
|
||||
Cc: Fenggaung Wu <fengguang.wu@intel.com>
|
||||
Cc: Jinliang Zheng <alexjlzheng@tencent.com>
|
||||
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
mm/page-writeback.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/mm/page-writeback.c
|
||||
+++ b/mm/page-writeback.c
|
||||
@@ -520,8 +520,8 @@ static int dirty_ratio_handler(const str
|
||||
|
||||
ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
if (ret == 0 && write && vm_dirty_ratio != old_ratio) {
|
||||
- writeback_set_ratelimit();
|
||||
vm_dirty_bytes = 0;
|
||||
+ writeback_set_ratelimit();
|
||||
}
|
||||
return ret;
|
||||
}
|
@@ -1,179 +0,0 @@
|
||||
From 87f7435508fde20e21c6b744723a3203e2045f46 Mon Sep 17 00:00:00 2001
|
||||
From: GONG Ruiqi <gongruiqi1@huawei.com>
|
||||
Date: Sun, 27 Apr 2025 10:53:03 +0800
|
||||
Subject: vgacon: Add check for vc_origin address range in vgacon_scroll()
|
||||
|
||||
Our in-house Syzkaller reported the following BUG (twice), which we
|
||||
believed was the same issue with [1]:
|
||||
|
||||
==================================================================
|
||||
BUG: KASAN: slab-out-of-bounds in vcs_scr_readw+0xc2/0xd0 drivers/tty/vt/vt.c:4740
|
||||
Read of size 2 at addr ffff88800f5bef60 by task syz.7.2620/12393
|
||||
...
|
||||
Call Trace:
|
||||
<TASK>
|
||||
__dump_stack lib/dump_stack.c:88 [inline]
|
||||
dump_stack_lvl+0x72/0xa0 lib/dump_stack.c:106
|
||||
print_address_description.constprop.0+0x6b/0x3d0 mm/kasan/report.c:364
|
||||
print_report+0xba/0x280 mm/kasan/report.c:475
|
||||
kasan_report+0xa9/0xe0 mm/kasan/report.c:588
|
||||
vcs_scr_readw+0xc2/0xd0 drivers/tty/vt/vt.c:4740
|
||||
vcs_write_buf_noattr drivers/tty/vt/vc_screen.c:493 [inline]
|
||||
vcs_write+0x586/0x840 drivers/tty/vt/vc_screen.c:690
|
||||
vfs_write+0x219/0x960 fs/read_write.c:584
|
||||
ksys_write+0x12e/0x260 fs/read_write.c:639
|
||||
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
|
||||
do_syscall_64+0x59/0x110 arch/x86/entry/common.c:81
|
||||
entry_SYSCALL_64_after_hwframe+0x78/0xe2
|
||||
...
|
||||
</TASK>
|
||||
|
||||
Allocated by task 5614:
|
||||
kasan_save_stack+0x20/0x40 mm/kasan/common.c:45
|
||||
kasan_set_track+0x25/0x30 mm/kasan/common.c:52
|
||||
____kasan_kmalloc mm/kasan/common.c:374 [inline]
|
||||
__kasan_kmalloc+0x8f/0xa0 mm/kasan/common.c:383
|
||||
kasan_kmalloc include/linux/kasan.h:201 [inline]
|
||||
__do_kmalloc_node mm/slab_common.c:1007 [inline]
|
||||
__kmalloc+0x62/0x140 mm/slab_common.c:1020
|
||||
kmalloc include/linux/slab.h:604 [inline]
|
||||
kzalloc include/linux/slab.h:721 [inline]
|
||||
vc_do_resize+0x235/0xf40 drivers/tty/vt/vt.c:1193
|
||||
vgacon_adjust_height+0x2d4/0x350 drivers/video/console/vgacon.c:1007
|
||||
vgacon_font_set+0x1f7/0x240 drivers/video/console/vgacon.c:1031
|
||||
con_font_set drivers/tty/vt/vt.c:4628 [inline]
|
||||
con_font_op+0x4da/0xa20 drivers/tty/vt/vt.c:4675
|
||||
vt_k_ioctl+0xa10/0xb30 drivers/tty/vt/vt_ioctl.c:474
|
||||
vt_ioctl+0x14c/0x1870 drivers/tty/vt/vt_ioctl.c:752
|
||||
tty_ioctl+0x655/0x1510 drivers/tty/tty_io.c:2779
|
||||
vfs_ioctl fs/ioctl.c:51 [inline]
|
||||
__do_sys_ioctl fs/ioctl.c:871 [inline]
|
||||
__se_sys_ioctl+0x12d/0x190 fs/ioctl.c:857
|
||||
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
|
||||
do_syscall_64+0x59/0x110 arch/x86/entry/common.c:81
|
||||
entry_SYSCALL_64_after_hwframe+0x78/0xe2
|
||||
|
||||
Last potentially related work creation:
|
||||
kasan_save_stack+0x20/0x40 mm/kasan/common.c:45
|
||||
__kasan_record_aux_stack+0x94/0xa0 mm/kasan/generic.c:492
|
||||
__call_rcu_common.constprop.0+0xc3/0xa10 kernel/rcu/tree.c:2713
|
||||
netlink_release+0x620/0xc20 net/netlink/af_netlink.c:802
|
||||
__sock_release+0xb5/0x270 net/socket.c:663
|
||||
sock_close+0x1e/0x30 net/socket.c:1425
|
||||
__fput+0x408/0xab0 fs/file_table.c:384
|
||||
__fput_sync+0x4c/0x60 fs/file_table.c:465
|
||||
__do_sys_close fs/open.c:1580 [inline]
|
||||
__se_sys_close+0x68/0xd0 fs/open.c:1565
|
||||
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
|
||||
do_syscall_64+0x59/0x110 arch/x86/entry/common.c:81
|
||||
entry_SYSCALL_64_after_hwframe+0x78/0xe2
|
||||
|
||||
Second to last potentially related work creation:
|
||||
kasan_save_stack+0x20/0x40 mm/kasan/common.c:45
|
||||
__kasan_record_aux_stack+0x94/0xa0 mm/kasan/generic.c:492
|
||||
__call_rcu_common.constprop.0+0xc3/0xa10 kernel/rcu/tree.c:2713
|
||||
netlink_release+0x620/0xc20 net/netlink/af_netlink.c:802
|
||||
__sock_release+0xb5/0x270 net/socket.c:663
|
||||
sock_close+0x1e/0x30 net/socket.c:1425
|
||||
__fput+0x408/0xab0 fs/file_table.c:384
|
||||
task_work_run+0x154/0x240 kernel/task_work.c:239
|
||||
exit_task_work include/linux/task_work.h:45 [inline]
|
||||
do_exit+0x8e5/0x1320 kernel/exit.c:874
|
||||
do_group_exit+0xcd/0x280 kernel/exit.c:1023
|
||||
get_signal+0x1675/0x1850 kernel/signal.c:2905
|
||||
arch_do_signal_or_restart+0x80/0x3b0 arch/x86/kernel/signal.c:310
|
||||
exit_to_user_mode_loop kernel/entry/common.c:111 [inline]
|
||||
exit_to_user_mode_prepare include/linux/entry-common.h:328 [inline]
|
||||
__syscall_exit_to_user_mode_work kernel/entry/common.c:207 [inline]
|
||||
syscall_exit_to_user_mode+0x1b3/0x1e0 kernel/entry/common.c:218
|
||||
do_syscall_64+0x66/0x110 arch/x86/entry/common.c:87
|
||||
entry_SYSCALL_64_after_hwframe+0x78/0xe2
|
||||
|
||||
The buggy address belongs to the object at ffff88800f5be000
|
||||
which belongs to the cache kmalloc-2k of size 2048
|
||||
The buggy address is located 2656 bytes to the right of
|
||||
allocated 1280-byte region [ffff88800f5be000, ffff88800f5be500)
|
||||
|
||||
...
|
||||
|
||||
Memory state around the buggy address:
|
||||
ffff88800f5bee00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
||||
ffff88800f5bee80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
||||
>ffff88800f5bef00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
||||
^
|
||||
ffff88800f5bef80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
||||
ffff88800f5bf000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
==================================================================
|
||||
|
||||
By analyzing the vmcore, we found that vc->vc_origin was somehow placed
|
||||
one line prior to vc->vc_screenbuf when vc was in KD_TEXT mode, and
|
||||
further writings to /dev/vcs caused out-of-bounds reads (and writes
|
||||
right after) in vcs_write_buf_noattr().
|
||||
|
||||
Our further experiments show that in most cases, vc->vc_origin equals to
|
||||
vga_vram_base when the console is in KD_TEXT mode, and it's around
|
||||
vc->vc_screenbuf for the KD_GRAPHICS mode. But via triggerring a
|
||||
TIOCL_SETVESABLANK ioctl beforehand, we can make vc->vc_origin be around
|
||||
vc->vc_screenbuf while the console is in KD_TEXT mode, and then by
|
||||
writing the special 'ESC M' control sequence to the tty certain times
|
||||
(depends on the value of `vc->state.y - vc->vc_top`), we can eventually
|
||||
move vc->vc_origin prior to vc->vc_screenbuf. Here's the PoC, tested on
|
||||
QEMU:
|
||||
|
||||
```
|
||||
int main() {
|
||||
const int RI_NUM = 10; // should be greater than `vc->state.y - vc->vc_top`
|
||||
int tty_fd, vcs_fd;
|
||||
const char *tty_path = "/dev/tty0";
|
||||
const char *vcs_path = "/dev/vcs";
|
||||
const char escape_seq[] = "\x1bM"; // ESC + M
|
||||
const char trigger_seq[] = "Let's trigger an OOB write.";
|
||||
struct vt_sizes vt_size = { 70, 2 };
|
||||
int blank = TIOCL_BLANKSCREEN;
|
||||
|
||||
tty_fd = open(tty_path, O_RDWR);
|
||||
|
||||
char vesa_mode[] = { TIOCL_SETVESABLANK, 1 };
|
||||
ioctl(tty_fd, TIOCLINUX, vesa_mode);
|
||||
|
||||
ioctl(tty_fd, TIOCLINUX, &blank);
|
||||
ioctl(tty_fd, VT_RESIZE, &vt_size);
|
||||
|
||||
for (int i = 0; i < RI_NUM; ++i)
|
||||
write(tty_fd, escape_seq, sizeof(escape_seq) - 1);
|
||||
|
||||
vcs_fd = open(vcs_path, O_RDWR);
|
||||
write(vcs_fd, trigger_seq, sizeof(trigger_seq));
|
||||
|
||||
close(vcs_fd);
|
||||
close(tty_fd);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
To solve this problem, add an address range validation check in
|
||||
vgacon_scroll(), ensuring vc->vc_origin never precedes vc_screenbuf.
|
||||
|
||||
Reported-by: syzbot+9c09fda97a1a65ea859b@syzkaller.appspotmail.com
|
||||
Closes: https://syzkaller.appspot.com/bug?extid=9c09fda97a1a65ea859b [1]
|
||||
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
|
||||
Cc: stable@vger.kernel.org
|
||||
Co-developed-by: Yi Yang <yiyang13@huawei.com>
|
||||
Signed-off-by: Yi Yang <yiyang13@huawei.com>
|
||||
Signed-off-by: GONG Ruiqi <gongruiqi1@huawei.com>
|
||||
Signed-off-by: Helge Deller <deller@gmx.de>
|
||||
---
|
||||
drivers/video/console/vgacon.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/video/console/vgacon.c
|
||||
+++ b/drivers/video/console/vgacon.c
|
||||
@@ -1168,7 +1168,7 @@ static bool vgacon_scroll(struct vc_data
|
||||
c->vc_screenbuf_size - delta);
|
||||
c->vc_origin = vga_vram_end - c->vc_screenbuf_size;
|
||||
vga_rolled_over = 0;
|
||||
- } else
|
||||
+ } else if (oldo - delta >= (unsigned long)c->vc_screenbuf)
|
||||
c->vc_origin -= delta;
|
||||
c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
|
||||
scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char,
|
@@ -1,102 +0,0 @@
|
||||
From 4aed4d2a911e165342a339c886101dbe3acad5e2 Mon Sep 17 00:00:00 2001
|
||||
From: Murad Masimov <m.masimov@mt-integration.ru>
|
||||
Date: Mon, 28 Apr 2025 18:34:06 +0300
|
||||
Subject: fbdev: Fix do_register_framebuffer to prevent null-ptr-deref in
|
||||
fb_videomode_to_var
|
||||
|
||||
If fb_add_videomode() in do_register_framebuffer() fails to allocate
|
||||
memory for fb_videomode, it will later lead to a null-ptr dereference in
|
||||
fb_videomode_to_var(), as the fb_info is registered while not having the
|
||||
mode in modelist that is expected to be there, i.e. the one that is
|
||||
described in fb_info->var.
|
||||
|
||||
================================================================
|
||||
general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN NOPTI
|
||||
KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
|
||||
CPU: 1 PID: 30371 Comm: syz-executor.1 Not tainted 5.10.226-syzkaller #0
|
||||
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
|
||||
RIP: 0010:fb_videomode_to_var+0x24/0x610 drivers/video/fbdev/core/modedb.c:901
|
||||
Call Trace:
|
||||
display_to_var+0x3a/0x7c0 drivers/video/fbdev/core/fbcon.c:929
|
||||
fbcon_resize+0x3e2/0x8f0 drivers/video/fbdev/core/fbcon.c:2071
|
||||
resize_screen drivers/tty/vt/vt.c:1176 [inline]
|
||||
vc_do_resize+0x53a/0x1170 drivers/tty/vt/vt.c:1263
|
||||
fbcon_modechanged+0x3ac/0x6e0 drivers/video/fbdev/core/fbcon.c:2720
|
||||
fbcon_update_vcs+0x43/0x60 drivers/video/fbdev/core/fbcon.c:2776
|
||||
do_fb_ioctl+0x6d2/0x740 drivers/video/fbdev/core/fbmem.c:1128
|
||||
fb_ioctl+0xe7/0x150 drivers/video/fbdev/core/fbmem.c:1203
|
||||
vfs_ioctl fs/ioctl.c:48 [inline]
|
||||
__do_sys_ioctl fs/ioctl.c:753 [inline]
|
||||
__se_sys_ioctl fs/ioctl.c:739 [inline]
|
||||
__x64_sys_ioctl+0x19a/0x210 fs/ioctl.c:739
|
||||
do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
|
||||
entry_SYSCALL_64_after_hwframe+0x67/0xd1
|
||||
================================================================
|
||||
|
||||
Even though fbcon_init() checks beforehand if fb_match_mode() in
|
||||
var_to_display() fails, it can not prevent the panic because fbcon_init()
|
||||
does not return error code. Considering this and the comment in the code
|
||||
about fb_match_mode() returning NULL - "This should not happen" - it is
|
||||
better to prevent registering the fb_info if its mode was not set
|
||||
successfully. Also move fb_add_videomode() closer to the beginning of
|
||||
do_register_framebuffer() to avoid having to do the cleanup on fail.
|
||||
|
||||
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
|
||||
|
||||
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Murad Masimov <m.masimov@mt-integration.ru>
|
||||
Signed-off-by: Helge Deller <deller@gmx.de>
|
||||
---
|
||||
drivers/video/fbdev/core/fbmem.c | 18 +++++++++++-------
|
||||
1 file changed, 11 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/video/fbdev/core/fbmem.c
|
||||
+++ b/drivers/video/fbdev/core/fbmem.c
|
||||
@@ -388,7 +388,7 @@ static int fb_check_foreignness(struct f
|
||||
|
||||
static int do_register_framebuffer(struct fb_info *fb_info)
|
||||
{
|
||||
- int i;
|
||||
+ int i, err = 0;
|
||||
struct fb_videomode mode;
|
||||
|
||||
if (fb_check_foreignness(fb_info))
|
||||
@@ -397,10 +397,18 @@ static int do_register_framebuffer(struc
|
||||
if (num_registered_fb == FB_MAX)
|
||||
return -ENXIO;
|
||||
|
||||
- num_registered_fb++;
|
||||
for (i = 0 ; i < FB_MAX; i++)
|
||||
if (!registered_fb[i])
|
||||
break;
|
||||
+
|
||||
+ if (!fb_info->modelist.prev || !fb_info->modelist.next)
|
||||
+ INIT_LIST_HEAD(&fb_info->modelist);
|
||||
+
|
||||
+ fb_var_to_videomode(&mode, &fb_info->var);
|
||||
+ err = fb_add_videomode(&mode, &fb_info->modelist);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
fb_info->node = i;
|
||||
refcount_set(&fb_info->count, 1);
|
||||
mutex_init(&fb_info->lock);
|
||||
@@ -426,16 +434,12 @@ static int do_register_framebuffer(struc
|
||||
if (bitmap_empty(fb_info->pixmap.blit_y, FB_MAX_BLIT_HEIGHT))
|
||||
bitmap_fill(fb_info->pixmap.blit_y, FB_MAX_BLIT_HEIGHT);
|
||||
|
||||
- if (!fb_info->modelist.prev || !fb_info->modelist.next)
|
||||
- INIT_LIST_HEAD(&fb_info->modelist);
|
||||
-
|
||||
if (fb_info->skip_vt_switch)
|
||||
pm_vt_switch_required(fb_info->device, false);
|
||||
else
|
||||
pm_vt_switch_required(fb_info->device, true);
|
||||
|
||||
- fb_var_to_videomode(&mode, &fb_info->var);
|
||||
- fb_add_videomode(&mode, &fb_info->modelist);
|
||||
+ num_registered_fb++;
|
||||
registered_fb[i] = fb_info;
|
||||
|
||||
#ifdef CONFIG_GUMSTIX_AM200EPD
|
@@ -1,65 +0,0 @@
|
||||
From 10c7fce24a1ad9197a8eabbba454a9a872f03d5c Mon Sep 17 00:00:00 2001
|
||||
From: Murad Masimov <m.masimov@mt-integration.ru>
|
||||
Date: Mon, 28 Apr 2025 18:34:07 +0300
|
||||
Subject: fbdev: Fix fb_set_var to prevent null-ptr-deref in
|
||||
fb_videomode_to_var
|
||||
|
||||
If fb_add_videomode() in fb_set_var() fails to allocate memory for
|
||||
fb_videomode, later it may lead to a null-ptr dereference in
|
||||
fb_videomode_to_var(), as the fb_info is registered while not having the
|
||||
mode in modelist that is expected to be there, i.e. the one that is
|
||||
described in fb_info->var.
|
||||
|
||||
================================================================
|
||||
general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN NOPTI
|
||||
KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
|
||||
CPU: 1 PID: 30371 Comm: syz-executor.1 Not tainted 5.10.226-syzkaller #0
|
||||
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
|
||||
RIP: 0010:fb_videomode_to_var+0x24/0x610 drivers/video/fbdev/core/modedb.c:901
|
||||
Call Trace:
|
||||
display_to_var+0x3a/0x7c0 drivers/video/fbdev/core/fbcon.c:929
|
||||
fbcon_resize+0x3e2/0x8f0 drivers/video/fbdev/core/fbcon.c:2071
|
||||
resize_screen drivers/tty/vt/vt.c:1176 [inline]
|
||||
vc_do_resize+0x53a/0x1170 drivers/tty/vt/vt.c:1263
|
||||
fbcon_modechanged+0x3ac/0x6e0 drivers/video/fbdev/core/fbcon.c:2720
|
||||
fbcon_update_vcs+0x43/0x60 drivers/video/fbdev/core/fbcon.c:2776
|
||||
do_fb_ioctl+0x6d2/0x740 drivers/video/fbdev/core/fbmem.c:1128
|
||||
fb_ioctl+0xe7/0x150 drivers/video/fbdev/core/fbmem.c:1203
|
||||
vfs_ioctl fs/ioctl.c:48 [inline]
|
||||
__do_sys_ioctl fs/ioctl.c:753 [inline]
|
||||
__se_sys_ioctl fs/ioctl.c:739 [inline]
|
||||
__x64_sys_ioctl+0x19a/0x210 fs/ioctl.c:739
|
||||
do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
|
||||
entry_SYSCALL_64_after_hwframe+0x67/0xd1
|
||||
================================================================
|
||||
|
||||
The reason is that fb_info->var is being modified in fb_set_var(), and
|
||||
then fb_videomode_to_var() is called. If it fails to add the mode to
|
||||
fb_info->modelist, fb_set_var() returns error, but does not restore the
|
||||
old value of fb_info->var. Restore fb_info->var on failure the same way
|
||||
it is done earlier in the function.
|
||||
|
||||
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
|
||||
|
||||
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Murad Masimov <m.masimov@mt-integration.ru>
|
||||
Signed-off-by: Helge Deller <deller@gmx.de>
|
||||
---
|
||||
drivers/video/fbdev/core/fbmem.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/video/fbdev/core/fbmem.c
|
||||
+++ b/drivers/video/fbdev/core/fbmem.c
|
||||
@@ -328,8 +328,10 @@ fb_set_var(struct fb_info *info, struct
|
||||
!list_empty(&info->modelist))
|
||||
ret = fb_add_videomode(&mode, &info->modelist);
|
||||
|
||||
- if (ret)
|
||||
+ if (ret) {
|
||||
+ info->var = old_var;
|
||||
return ret;
|
||||
+ }
|
||||
|
||||
event.info = info;
|
||||
event.data = &mode;
|
@@ -1,113 +0,0 @@
|
||||
From 13ccad7713b89e7693feb5346e7893dc8edce7a8 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Brauner <brauner@kernel.org>
|
||||
Date: Mon, 7 Apr 2025 11:54:15 +0200
|
||||
Subject: anon_inode: use a proper mode internally
|
||||
|
||||
This allows the VFS to not trip over anonymous inodes and we can add
|
||||
asserts based on the mode into the vfs. When we report it to userspace
|
||||
we can simply hide the mode to avoid regressions. I've audited all
|
||||
direct callers of alloc_anon_inode() and only secretmen overrides i_mode
|
||||
and i_op inode operations but it already uses a regular file.
|
||||
|
||||
Link: https://lore.kernel.org/20250407-work-anon_inode-v1-1-53a44c20d44e@kernel.org
|
||||
Fixes: af153bb63a336 ("vfs: catch invalid modes in may_open()")
|
||||
Reviewed-by: Jeff Layton <jlayton@kernel.org>
|
||||
Cc: stable@vger.kernel.org # all LTS kernels
|
||||
Reported-by: syzbot+5d8e79d323a13aa0b248@syzkaller.appspotmail.com
|
||||
Closes: https://lore.kernel.org/all/67ed3fb3.050a0220.14623d.0009.GAE@google.com
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
fs/anon_inodes.c | 36 ++++++++++++++++++++++++++++++++++++
|
||||
fs/internal.h | 3 +++
|
||||
fs/libfs.c | 8 +++++++-
|
||||
3 files changed, 46 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/fs/anon_inodes.c
|
||||
+++ b/fs/anon_inodes.c
|
||||
@@ -24,10 +24,44 @@
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
+#include "internal.h"
|
||||
+
|
||||
static struct vfsmount *anon_inode_mnt __ro_after_init;
|
||||
static struct inode *anon_inode_inode __ro_after_init;
|
||||
|
||||
/*
|
||||
+ * User space expects anonymous inodes to have no file type in st_mode.
|
||||
+ *
|
||||
+ * In particular, 'lsof' has this legacy logic:
|
||||
+ *
|
||||
+ * type = s->st_mode & S_IFMT;
|
||||
+ * switch (type) {
|
||||
+ * ...
|
||||
+ * case 0:
|
||||
+ * if (!strcmp(p, "anon_inode"))
|
||||
+ * Lf->ntype = Ntype = N_ANON_INODE;
|
||||
+ *
|
||||
+ * to detect our old anon_inode logic.
|
||||
+ *
|
||||
+ * Rather than mess with our internal sane inode data, just fix it
|
||||
+ * up here in getattr() by masking off the format bits.
|
||||
+ */
|
||||
+int anon_inode_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
+ struct kstat *stat, u32 request_mask,
|
||||
+ unsigned int query_flags)
|
||||
+{
|
||||
+ struct inode *inode = d_inode(path->dentry);
|
||||
+
|
||||
+ generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
+ stat->mode &= ~S_IFMT;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct inode_operations anon_inode_operations = {
|
||||
+ .getattr = anon_inode_getattr,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
* anon_inodefs_dname() is called from d_path().
|
||||
*/
|
||||
static char *anon_inodefs_dname(struct dentry *dentry, char *buffer, int buflen)
|
||||
@@ -66,6 +100,7 @@ static struct inode *anon_inode_make_sec
|
||||
if (IS_ERR(inode))
|
||||
return inode;
|
||||
inode->i_flags &= ~S_PRIVATE;
|
||||
+ inode->i_op = &anon_inode_operations;
|
||||
error = security_inode_init_security_anon(inode, &QSTR(name),
|
||||
context_inode);
|
||||
if (error) {
|
||||
@@ -313,6 +348,7 @@ static int __init anon_inode_init(void)
|
||||
anon_inode_inode = alloc_anon_inode(anon_inode_mnt->mnt_sb);
|
||||
if (IS_ERR(anon_inode_inode))
|
||||
panic("anon_inode_init() inode allocation failed (%ld)\n", PTR_ERR(anon_inode_inode));
|
||||
+ anon_inode_inode->i_op = &anon_inode_operations;
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/fs/internal.h
|
||||
+++ b/fs/internal.h
|
||||
@@ -343,3 +343,6 @@ static inline bool path_mounted(const st
|
||||
void file_f_owner_release(struct file *file);
|
||||
bool file_seek_cur_needs_f_lock(struct file *file);
|
||||
int statmount_mnt_idmap(struct mnt_idmap *idmap, struct seq_file *seq, bool uid_map);
|
||||
+int anon_inode_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
+ struct kstat *stat, u32 request_mask,
|
||||
+ unsigned int query_flags);
|
||||
--- a/fs/libfs.c
|
||||
+++ b/fs/libfs.c
|
||||
@@ -1647,7 +1647,13 @@ struct inode *alloc_anon_inode(struct su
|
||||
* that it already _is_ on the dirty list.
|
||||
*/
|
||||
inode->i_state = I_DIRTY;
|
||||
- inode->i_mode = S_IRUSR | S_IWUSR;
|
||||
+ /*
|
||||
+ * Historically anonymous inodes didn't have a type at all and
|
||||
+ * userspace has come to rely on this. Internally they're just
|
||||
+ * regular files but S_IFREG is masked off when reporting
|
||||
+ * information to userspace.
|
||||
+ */
|
||||
+ inode->i_mode = S_IFREG | S_IRUSR | S_IWUSR;
|
||||
inode->i_uid = current_fsuid();
|
||||
inode->i_gid = current_fsgid();
|
||||
inode->i_flags |= S_PRIVATE;
|
@@ -1,80 +0,0 @@
|
||||
From 5a3eea2c3e9675a8b713eef0d52b7c437f1f613b Mon Sep 17 00:00:00 2001
|
||||
From: Christian Brauner <brauner@kernel.org>
|
||||
Date: Mon, 7 Apr 2025 11:54:17 +0200
|
||||
Subject: anon_inode: explicitly block ->setattr()
|
||||
|
||||
It is currently possible to change the mode and owner of the single
|
||||
anonymous inode in the kernel:
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ret, sfd;
|
||||
sigset_t mask;
|
||||
struct signalfd_siginfo fdsi;
|
||||
|
||||
sigemptyset(&mask);
|
||||
sigaddset(&mask, SIGINT);
|
||||
sigaddset(&mask, SIGQUIT);
|
||||
|
||||
ret = sigprocmask(SIG_BLOCK, &mask, NULL);
|
||||
if (ret < 0)
|
||||
_exit(1);
|
||||
|
||||
sfd = signalfd(-1, &mask, 0);
|
||||
if (sfd < 0)
|
||||
_exit(2);
|
||||
|
||||
ret = fchown(sfd, 5555, 5555);
|
||||
if (ret < 0)
|
||||
_exit(3);
|
||||
|
||||
ret = fchmod(sfd, 0777);
|
||||
if (ret < 0)
|
||||
_exit(3);
|
||||
|
||||
_exit(4);
|
||||
}
|
||||
|
||||
This is a bug. It's not really a meaningful one because anonymous inodes
|
||||
don't really figure into path lookup and they cannot be reopened via
|
||||
/proc/<pid>/fd/<nr> and can't be used for lookup itself. So they can
|
||||
only ever serve as direct references.
|
||||
|
||||
But it is still completely bogus to allow the mode and ownership or any
|
||||
of the properties of the anonymous inode to be changed. Block this!
|
||||
|
||||
Link: https://lore.kernel.org/20250407-work-anon_inode-v1-3-53a44c20d44e@kernel.org
|
||||
Reviewed-by: Jeff Layton <jlayton@kernel.org>
|
||||
Cc: stable@vger.kernel.org # all LTS kernels
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
fs/anon_inodes.c | 7 +++++++
|
||||
fs/internal.h | 2 ++
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
--- a/fs/anon_inodes.c
|
||||
+++ b/fs/anon_inodes.c
|
||||
@@ -57,8 +57,15 @@ int anon_inode_getattr(struct mnt_idmap
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int anon_inode_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
|
||||
+ struct iattr *attr)
|
||||
+{
|
||||
+ return -EOPNOTSUPP;
|
||||
+}
|
||||
+
|
||||
static const struct inode_operations anon_inode_operations = {
|
||||
.getattr = anon_inode_getattr,
|
||||
+ .setattr = anon_inode_setattr,
|
||||
};
|
||||
|
||||
/*
|
||||
--- a/fs/internal.h
|
||||
+++ b/fs/internal.h
|
||||
@@ -346,3 +346,5 @@ int statmount_mnt_idmap(struct mnt_idmap
|
||||
int anon_inode_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
struct kstat *stat, u32 request_mask,
|
||||
unsigned int query_flags);
|
||||
+int anon_inode_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
|
||||
+ struct iattr *attr);
|
@@ -1,39 +0,0 @@
|
||||
From 8c9775d285f9755477a8b1f8b215102dce014ed2 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Brauner <brauner@kernel.org>
|
||||
Date: Mon, 7 Apr 2025 11:54:19 +0200
|
||||
Subject: anon_inode: raise SB_I_NODEV and SB_I_NOEXEC
|
||||
|
||||
It isn't possible to execute anonymous inodes because they cannot be
|
||||
opened in any way after they have been created. This includes execution:
|
||||
|
||||
execveat(fd_anon_inode, "", NULL, NULL, AT_EMPTY_PATH)
|
||||
|
||||
Anonymous inodes have inode->f_op set to no_open_fops which sets
|
||||
no_open() which returns ENXIO. That means any call to do_dentry_open()
|
||||
which is the endpoint of the do_open_execat() will fail. There's no
|
||||
chance to execute an anonymous inode. Unless a given subsystem overrides
|
||||
it ofc.
|
||||
|
||||
However, we should still harden this and raise SB_I_NODEV and
|
||||
SB_I_NOEXEC on the superblock itself so that no one gets any creative
|
||||
ideas.
|
||||
|
||||
Link: https://lore.kernel.org/20250407-work-anon_inode-v1-5-53a44c20d44e@kernel.org
|
||||
Reviewed-by: Jeff Layton <jlayton@kernel.org>
|
||||
Cc: stable@vger.kernel.org # all LTS kernels
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
fs/anon_inodes.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/fs/anon_inodes.c
|
||||
+++ b/fs/anon_inodes.c
|
||||
@@ -86,6 +86,8 @@ static int anon_inodefs_init_fs_context(
|
||||
struct pseudo_fs_context *ctx = init_pseudo(fc, ANON_INODE_FS_MAGIC);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
+ fc->s_iflags |= SB_I_NOEXEC;
|
||||
+ fc->s_iflags |= SB_I_NODEV;
|
||||
ctx->dops = &anon_inodefs_dentry_operations;
|
||||
return 0;
|
||||
}
|
@@ -1,136 +0,0 @@
|
||||
From d90681a50098e204f2e111b9433f6fc73a939854 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Brauner <brauner@kernel.org>
|
||||
Date: Mon, 21 Apr 2025 10:27:40 +0200
|
||||
Subject: fs: add S_ANON_INODE
|
||||
|
||||
This makes it easy to detect proper anonymous inodes and to ensure that
|
||||
we can detect them in codepaths such as readahead().
|
||||
|
||||
Readahead on anonymous inodes didn't work because they didn't have a
|
||||
proper mode. Now that they have we need to retain EINVAL being returned
|
||||
otherwise LTP will fail.
|
||||
|
||||
We also need to ensure that ioctls aren't simply fired like they are for
|
||||
regular files so things like inotify inodes continue to correctly call
|
||||
their own ioctl handlers as in [1].
|
||||
|
||||
Reported-by: Xilin Wu <sophon@radxa.com>
|
||||
Link: https://lore.kernel.org/3A9139D5CD543962+89831381-31b9-4392-87ec-a84a5b3507d8@radxa.com [1]
|
||||
Link: https://lore.kernel.org/7a1a7076-ff6b-4cb0-94e7-7218a0a44028@sirena.org.uk
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
fs/ioctl.c | 7 ++++---
|
||||
fs/libfs.c | 2 +-
|
||||
fs/pidfs.c | 2 +-
|
||||
include/linux/fs.h | 2 ++
|
||||
mm/readahead.c | 20 ++++++++++++++++----
|
||||
5 files changed, 24 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/fs/ioctl.c
|
||||
+++ b/fs/ioctl.c
|
||||
@@ -821,7 +821,8 @@ static int do_vfs_ioctl(struct file *fil
|
||||
return ioctl_fioasync(fd, filp, argp);
|
||||
|
||||
case FIOQSIZE:
|
||||
- if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) ||
|
||||
+ if (S_ISDIR(inode->i_mode) ||
|
||||
+ (S_ISREG(inode->i_mode) && !IS_ANON_FILE(inode)) ||
|
||||
S_ISLNK(inode->i_mode)) {
|
||||
loff_t res = inode_get_bytes(inode);
|
||||
return copy_to_user(argp, &res, sizeof(res)) ?
|
||||
@@ -856,7 +857,7 @@ static int do_vfs_ioctl(struct file *fil
|
||||
return ioctl_file_dedupe_range(filp, argp);
|
||||
|
||||
case FIONREAD:
|
||||
- if (!S_ISREG(inode->i_mode))
|
||||
+ if (!S_ISREG(inode->i_mode) || IS_ANON_FILE(inode))
|
||||
return vfs_ioctl(filp, cmd, arg);
|
||||
|
||||
return put_user(i_size_read(inode) - filp->f_pos,
|
||||
@@ -881,7 +882,7 @@ static int do_vfs_ioctl(struct file *fil
|
||||
return ioctl_get_fs_sysfs_path(filp, argp);
|
||||
|
||||
default:
|
||||
- if (S_ISREG(inode->i_mode))
|
||||
+ if (S_ISREG(inode->i_mode) && !IS_ANON_FILE(inode))
|
||||
return file_ioctl(filp, cmd, argp);
|
||||
break;
|
||||
}
|
||||
--- a/fs/libfs.c
|
||||
+++ b/fs/libfs.c
|
||||
@@ -1656,7 +1656,7 @@ struct inode *alloc_anon_inode(struct su
|
||||
inode->i_mode = S_IFREG | S_IRUSR | S_IWUSR;
|
||||
inode->i_uid = current_fsuid();
|
||||
inode->i_gid = current_fsgid();
|
||||
- inode->i_flags |= S_PRIVATE;
|
||||
+ inode->i_flags |= S_PRIVATE | S_ANON_INODE;
|
||||
simple_inode_init_ts(inode);
|
||||
return inode;
|
||||
}
|
||||
--- a/fs/pidfs.c
|
||||
+++ b/fs/pidfs.c
|
||||
@@ -826,7 +826,7 @@ static int pidfs_init_inode(struct inode
|
||||
const struct pid *pid = data;
|
||||
|
||||
inode->i_private = data;
|
||||
- inode->i_flags |= S_PRIVATE;
|
||||
+ inode->i_flags |= S_PRIVATE | S_ANON_INODE;
|
||||
inode->i_mode |= S_IRWXU;
|
||||
inode->i_op = &pidfs_inode_operations;
|
||||
inode->i_fop = &pidfs_file_operations;
|
||||
--- a/include/linux/fs.h
|
||||
+++ b/include/linux/fs.h
|
||||
@@ -2344,6 +2344,7 @@ struct super_operations {
|
||||
#define S_CASEFOLD (1 << 15) /* Casefolded file */
|
||||
#define S_VERITY (1 << 16) /* Verity file (using fs/verity/) */
|
||||
#define S_KERNEL_FILE (1 << 17) /* File is in use by the kernel (eg. fs/cachefiles) */
|
||||
+#define S_ANON_INODE (1 << 19) /* Inode is an anonymous inode */
|
||||
|
||||
/*
|
||||
* Note that nosuid etc flags are inode-specific: setting some file-system
|
||||
@@ -2400,6 +2401,7 @@ static inline bool sb_rdonly(const struc
|
||||
|
||||
#define IS_WHITEOUT(inode) (S_ISCHR(inode->i_mode) && \
|
||||
(inode)->i_rdev == WHITEOUT_DEV)
|
||||
+#define IS_ANON_FILE(inode) ((inode)->i_flags & S_ANON_INODE)
|
||||
|
||||
static inline bool HAS_UNMAPPED_ID(struct mnt_idmap *idmap,
|
||||
struct inode *inode)
|
||||
--- a/mm/readahead.c
|
||||
+++ b/mm/readahead.c
|
||||
@@ -690,9 +690,15 @@ EXPORT_SYMBOL_GPL(page_cache_async_ra);
|
||||
|
||||
ssize_t ksys_readahead(int fd, loff_t offset, size_t count)
|
||||
{
|
||||
+ struct file *file;
|
||||
+ const struct inode *inode;
|
||||
+
|
||||
CLASS(fd, f)(fd);
|
||||
+ if (fd_empty(f))
|
||||
+ return -EBADF;
|
||||
|
||||
- if (fd_empty(f) || !(fd_file(f)->f_mode & FMODE_READ))
|
||||
+ file = fd_file(f);
|
||||
+ if (!(file->f_mode & FMODE_READ))
|
||||
return -EBADF;
|
||||
|
||||
/*
|
||||
@@ -700,9 +706,15 @@ ssize_t ksys_readahead(int fd, loff_t of
|
||||
* that can execute readahead. If readahead is not possible
|
||||
* on this file, then we must return -EINVAL.
|
||||
*/
|
||||
- if (!fd_file(f)->f_mapping || !fd_file(f)->f_mapping->a_ops ||
|
||||
- (!S_ISREG(file_inode(fd_file(f))->i_mode) &&
|
||||
- !S_ISBLK(file_inode(fd_file(f))->i_mode)))
|
||||
+ if (!file->f_mapping)
|
||||
+ return -EINVAL;
|
||||
+ if (!file->f_mapping->a_ops)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ inode = file_inode(file);
|
||||
+ if (!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))
|
||||
+ return -EINVAL;
|
||||
+ if (IS_ANON_FILE(inode))
|
||||
return -EINVAL;
|
||||
|
||||
return vfs_fadvise(fd_file(f), offset, count, POSIX_FADV_WILLNEED);
|
@@ -1,35 +0,0 @@
|
||||
From c161e0ffb55a12b9b26819fa0ecf8217ab781e97 Mon Sep 17 00:00:00 2001
|
||||
From: Zijun Hu <quic_zijuhu@quicinc.com>
|
||||
Date: Wed, 7 May 2025 19:50:26 +0800
|
||||
Subject: configfs: Do not override creating attribute file failure in
|
||||
populate_attrs()
|
||||
|
||||
populate_attrs() may override failure for creating attribute files
|
||||
by success for creating subsequent bin attribute files, and have
|
||||
wrong return value.
|
||||
|
||||
Fix by creating bin attribute files under successfully creating
|
||||
attribute files.
|
||||
|
||||
Fixes: 03607ace807b ("configfs: implement binary attributes")
|
||||
Cc: stable@vger.kernel.org
|
||||
Reviewed-by: Joel Becker <jlbec@evilplan.org>
|
||||
Reviewed-by: Breno Leitao <leitao@debian.org>
|
||||
Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20250507-fix_configfs-v3-2-fe2d96de8dc4@quicinc.com
|
||||
Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
|
||||
---
|
||||
fs/configfs/dir.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/fs/configfs/dir.c
|
||||
+++ b/fs/configfs/dir.c
|
||||
@@ -619,7 +619,7 @@ static int populate_attrs(struct config_
|
||||
break;
|
||||
}
|
||||
}
|
||||
- if (t->ct_bin_attrs) {
|
||||
+ if (!error && t->ct_bin_attrs) {
|
||||
for (i = 0; (bin_attr = t->ct_bin_attrs[i]) != NULL; i++) {
|
||||
if (ops && ops->is_bin_visible && !ops->is_bin_visible(item, bin_attr, i))
|
||||
continue;
|
@@ -1,29 +0,0 @@
|
||||
From 9c2fdcdf9d8963a6fa30005a859816639d0bbf95 Mon Sep 17 00:00:00 2001
|
||||
From: Jens Axboe <axboe@kernel.dk>
|
||||
Date: Tue, 27 May 2025 07:28:54 -0600
|
||||
Subject: Revert "Disable FOP_DONTCACHE for now due to bugs"
|
||||
|
||||
This reverts commit 478ad02d6844217cc7568619aeb0809d93ade43d.
|
||||
|
||||
Both the read and write side dirty && writeback races should be resolved
|
||||
now, revert the commit that disabled FOP_DONTCACHE for filesystems.
|
||||
|
||||
Link: https://lore.kernel.org/linux-fsdevel/20250525083209.GS2023217@ZenIV/
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
Link: https://lore.kernel.org/20250527133255.452431-4-axboe@kernel.dk
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
include/linux/fs.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/include/linux/fs.h
|
||||
+++ b/include/linux/fs.h
|
||||
@@ -2186,7 +2186,7 @@ struct file_operations {
|
||||
/* Supports asynchronous lock callbacks */
|
||||
#define FOP_ASYNC_LOCK ((__force fop_flags_t)(1 << 6))
|
||||
/* File system supports uncached read/write buffered IO */
|
||||
-#define FOP_DONTCACHE 0 /* ((__force fop_flags_t)(1 << 7)) */
|
||||
+#define FOP_DONTCACHE ((__force fop_flags_t)(1 << 7))
|
||||
|
||||
/* Wrap a directory iterator that needs exclusive inode access */
|
||||
int wrap_directory_iterator(struct file *, struct dir_context *,
|
@@ -1,36 +0,0 @@
|
||||
From 0274339dc053815d099e9c336f11c1e9e5641792 Mon Sep 17 00:00:00 2001
|
||||
From: Jens Axboe <axboe@kernel.dk>
|
||||
Date: Tue, 27 May 2025 07:28:55 -0600
|
||||
Subject: mm/filemap: unify read/write dropbehind naming
|
||||
|
||||
The read side is filemap_end_dropbehind_read(), while the write side
|
||||
used folio_ as the prefix rather than filemap_. The read side makes more
|
||||
sense, unify the naming such that the write side follows that.
|
||||
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
Link: https://lore.kernel.org/20250527133255.452431-5-axboe@kernel.dk
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
mm/filemap.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/mm/filemap.c
|
||||
+++ b/mm/filemap.c
|
||||
@@ -1604,7 +1604,7 @@ static void filemap_end_dropbehind(struc
|
||||
* completes. Do that now. If we fail, it's likely because of a big folio -
|
||||
* just reset dropbehind for that case and latter completions should invalidate.
|
||||
*/
|
||||
-static void folio_end_dropbehind_write(struct folio *folio)
|
||||
+static void filemap_end_dropbehind_write(struct folio *folio)
|
||||
{
|
||||
/*
|
||||
* Hitting !in_task() should not happen off RWF_DONTCACHE writeback,
|
||||
@@ -1659,7 +1659,7 @@ void folio_end_writeback(struct folio *f
|
||||
acct_reclaim_writeback(folio);
|
||||
|
||||
if (folio_dropbehind)
|
||||
- folio_end_dropbehind_write(folio);
|
||||
+ filemap_end_dropbehind_write(folio);
|
||||
folio_put(folio);
|
||||
}
|
||||
EXPORT_SYMBOL(folio_end_writeback);
|
@@ -1,78 +0,0 @@
|
||||
From de09560d2e6fbb14ea586063217277e5ebc1bc71 Mon Sep 17 00:00:00 2001
|
||||
From: Jens Axboe <axboe@kernel.dk>
|
||||
Date: Tue, 27 May 2025 07:28:56 -0600
|
||||
Subject: mm/filemap: unify dropbehind flag testing and clearing
|
||||
|
||||
The read and write side does this a bit differently, unify it such that
|
||||
the _{read,write} helpers check the bit before locking, and the generic
|
||||
handler is in charge of clearing the bit and invalidating, once under
|
||||
the folio lock.
|
||||
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
Link: https://lore.kernel.org/20250527133255.452431-6-axboe@kernel.dk
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
mm/filemap.c | 21 +++++++++++----------
|
||||
1 file changed, 11 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/mm/filemap.c
|
||||
+++ b/mm/filemap.c
|
||||
@@ -1595,7 +1595,11 @@ static void filemap_end_dropbehind(struc
|
||||
|
||||
VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);
|
||||
|
||||
- if (mapping && !folio_test_writeback(folio) && !folio_test_dirty(folio))
|
||||
+ if (folio_test_writeback(folio) || folio_test_dirty(folio))
|
||||
+ return;
|
||||
+ if (!folio_test_clear_dropbehind(folio))
|
||||
+ return;
|
||||
+ if (mapping)
|
||||
folio_unmap_invalidate(mapping, folio, 0);
|
||||
}
|
||||
|
||||
@@ -1606,6 +1610,9 @@ static void filemap_end_dropbehind(struc
|
||||
*/
|
||||
static void filemap_end_dropbehind_write(struct folio *folio)
|
||||
{
|
||||
+ if (!folio_test_dropbehind(folio))
|
||||
+ return;
|
||||
+
|
||||
/*
|
||||
* Hitting !in_task() should not happen off RWF_DONTCACHE writeback,
|
||||
* but can happen if normal writeback just happens to find dirty folios
|
||||
@@ -1629,8 +1636,6 @@ static void filemap_end_dropbehind_write
|
||||
*/
|
||||
void folio_end_writeback(struct folio *folio)
|
||||
{
|
||||
- bool folio_dropbehind = false;
|
||||
-
|
||||
VM_BUG_ON_FOLIO(!folio_test_writeback(folio), folio);
|
||||
|
||||
/*
|
||||
@@ -1652,14 +1657,11 @@ void folio_end_writeback(struct folio *f
|
||||
* reused before the folio_wake_bit().
|
||||
*/
|
||||
folio_get(folio);
|
||||
- if (!folio_test_dirty(folio))
|
||||
- folio_dropbehind = folio_test_clear_dropbehind(folio);
|
||||
if (__folio_end_writeback(folio))
|
||||
folio_wake_bit(folio, PG_writeback);
|
||||
- acct_reclaim_writeback(folio);
|
||||
|
||||
- if (folio_dropbehind)
|
||||
- filemap_end_dropbehind_write(folio);
|
||||
+ filemap_end_dropbehind_write(folio);
|
||||
+ acct_reclaim_writeback(folio);
|
||||
folio_put(folio);
|
||||
}
|
||||
EXPORT_SYMBOL(folio_end_writeback);
|
||||
@@ -2651,8 +2653,7 @@ static void filemap_end_dropbehind_read(
|
||||
if (folio_test_writeback(folio) || folio_test_dirty(folio))
|
||||
return;
|
||||
if (folio_trylock(folio)) {
|
||||
- if (folio_test_clear_dropbehind(folio))
|
||||
- filemap_end_dropbehind(folio);
|
||||
+ filemap_end_dropbehind(folio);
|
||||
folio_unlock(folio);
|
||||
}
|
||||
}
|
@@ -1,98 +0,0 @@
|
||||
From c041325f222c774573ad73d35939451a4e221e52 Mon Sep 17 00:00:00 2001
|
||||
From: Shivank Garg <shivankg@amd.com>
|
||||
Date: Mon, 26 May 2025 18:28:18 +0000
|
||||
Subject: mm/khugepaged: fix race with folio split/free using temporary
|
||||
reference
|
||||
|
||||
hpage_collapse_scan_file() calls is_refcount_suitable(), which in turn
|
||||
calls folio_mapcount(). folio_mapcount() checks folio_test_large() before
|
||||
proceeding to folio_large_mapcount(), but there is a race window where the
|
||||
folio may get split/freed between these checks, triggering:
|
||||
|
||||
VM_WARN_ON_FOLIO(!folio_test_large(folio), folio)
|
||||
|
||||
Take a temporary reference to the folio in hpage_collapse_scan_file().
|
||||
This stabilizes the folio during refcount check and prevents incorrect
|
||||
large folio detection due to concurrent split/free. Use helper
|
||||
folio_expected_ref_count() + 1 to compare with folio_ref_count() instead
|
||||
of using is_refcount_suitable().
|
||||
|
||||
Link: https://lkml.kernel.org/r/20250526182818.37978-1-shivankg@amd.com
|
||||
Fixes: 05c5323b2a34 ("mm: track mapcount of large folios in single value")
|
||||
Signed-off-by: Shivank Garg <shivankg@amd.com>
|
||||
Reported-by: syzbot+2b99589e33edbe9475ca@syzkaller.appspotmail.com
|
||||
Closes: https://lore.kernel.org/all/6828470d.a70a0220.38f255.000c.GAE@google.com
|
||||
Suggested-by: David Hildenbrand <david@redhat.com>
|
||||
Acked-by: David Hildenbrand <david@redhat.com>
|
||||
Acked-by: Dev Jain <dev.jain@arm.com>
|
||||
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
|
||||
Cc: Bharata B Rao <bharata@amd.com>
|
||||
Cc: Fengwei Yin <fengwei.yin@intel.com>
|
||||
Cc: Liam Howlett <liam.howlett@oracle.com>
|
||||
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Cc: Mariano Pache <npache@redhat.com>
|
||||
Cc: Ryan Roberts <ryan.roberts@arm.com>
|
||||
Cc: Zi Yan <ziy@nvidia.com>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
mm/khugepaged.c | 18 +++++++++++++++++-
|
||||
1 file changed, 17 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/mm/khugepaged.c
|
||||
+++ b/mm/khugepaged.c
|
||||
@@ -2295,6 +2295,17 @@ static int hpage_collapse_scan_file(stru
|
||||
continue;
|
||||
}
|
||||
|
||||
+ if (!folio_try_get(folio)) {
|
||||
+ xas_reset(&xas);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (unlikely(folio != xas_reload(&xas))) {
|
||||
+ folio_put(folio);
|
||||
+ xas_reset(&xas);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
if (folio_order(folio) == HPAGE_PMD_ORDER &&
|
||||
folio->index == start) {
|
||||
/* Maybe PMD-mapped */
|
||||
@@ -2305,23 +2316,27 @@ static int hpage_collapse_scan_file(stru
|
||||
* it's safe to skip LRU and refcount checks before
|
||||
* returning.
|
||||
*/
|
||||
+ folio_put(folio);
|
||||
break;
|
||||
}
|
||||
|
||||
node = folio_nid(folio);
|
||||
if (hpage_collapse_scan_abort(node, cc)) {
|
||||
result = SCAN_SCAN_ABORT;
|
||||
+ folio_put(folio);
|
||||
break;
|
||||
}
|
||||
cc->node_load[node]++;
|
||||
|
||||
if (!folio_test_lru(folio)) {
|
||||
result = SCAN_PAGE_LRU;
|
||||
+ folio_put(folio);
|
||||
break;
|
||||
}
|
||||
|
||||
- if (!is_refcount_suitable(folio)) {
|
||||
+ if (folio_expected_ref_count(folio) + 1 != folio_ref_count(folio)) {
|
||||
result = SCAN_PAGE_COUNT;
|
||||
+ folio_put(folio);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2333,6 +2348,7 @@ static int hpage_collapse_scan_file(stru
|
||||
*/
|
||||
|
||||
present += folio_nr_pages(folio);
|
||||
+ folio_put(folio);
|
||||
|
||||
if (need_resched()) {
|
||||
xas_pause(&xas);
|
@@ -1,198 +0,0 @@
|
||||
From 76653593bdf5fda03717991681b5d60e2af015e9 Mon Sep 17 00:00:00 2001
|
||||
From: Shivank Garg <shivankg@amd.com>
|
||||
Date: Wed, 30 Apr 2025 10:01:51 +0000
|
||||
Subject: mm: add folio_expected_ref_count() for reference count calculation
|
||||
|
||||
Patch series " JFS: Implement migrate_folio for jfs_metapage_aops" v5.
|
||||
|
||||
This patchset addresses a warning that occurs during memory compaction due
|
||||
to JFS's missing migrate_folio operation. The warning was introduced by
|
||||
commit 7ee3647243e5 ("migrate: Remove call to ->writepage") which added
|
||||
explicit warnings when filesystem don't implement migrate_folio.
|
||||
|
||||
The syzbot reported following [1]:
|
||||
jfs_metapage_aops does not implement migrate_folio
|
||||
WARNING: CPU: 1 PID: 5861 at mm/migrate.c:955 fallback_migrate_folio mm/migrate.c:953 [inline]
|
||||
WARNING: CPU: 1 PID: 5861 at mm/migrate.c:955 move_to_new_folio+0x70e/0x840 mm/migrate.c:1007
|
||||
Modules linked in:
|
||||
CPU: 1 UID: 0 PID: 5861 Comm: syz-executor280 Not tainted 6.15.0-rc1-next-20250411-syzkaller #0 PREEMPT(full)
|
||||
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 02/12/2025
|
||||
RIP: 0010:fallback_migrate_folio mm/migrate.c:953 [inline]
|
||||
RIP: 0010:move_to_new_folio+0x70e/0x840 mm/migrate.c:1007
|
||||
|
||||
To fix this issue, this series implement metapage_migrate_folio() for JFS
|
||||
which handles both single and multiple metapages per page configurations.
|
||||
|
||||
While most filesystems leverage existing migration implementations like
|
||||
filemap_migrate_folio(), buffer_migrate_folio_norefs() or
|
||||
buffer_migrate_folio() (which internally used folio_expected_refs()),
|
||||
JFS's metapage architecture requires special handling of its private data
|
||||
during migration. To support this, this series introduce the
|
||||
folio_expected_ref_count(), which calculates external references to a
|
||||
folio from page/swap cache, private data, and page table mappings.
|
||||
|
||||
This standardized implementation replaces the previous ad-hoc
|
||||
folio_expected_refs() function and enables JFS to accurately determine
|
||||
whether a folio has unexpected references before attempting migration.
|
||||
|
||||
|
||||
|
||||
|
||||
Implement folio_expected_ref_count() to calculate expected folio reference
|
||||
counts from:
|
||||
- Page/swap cache (1 per page)
|
||||
- Private data (1)
|
||||
- Page table mappings (1 per map)
|
||||
|
||||
While originally needed for page migration operations, this improved
|
||||
implementation standardizes reference counting by consolidating all
|
||||
refcount contributors into a single, reusable function that can benefit
|
||||
any subsystem needing to detect unexpected references to folios.
|
||||
|
||||
The folio_expected_ref_count() returns the sum of these external
|
||||
references without including any reference the caller itself might hold.
|
||||
Callers comparing against the actual folio_ref_count() must account for
|
||||
their own references separately.
|
||||
|
||||
Link: https://syzkaller.appspot.com/bug?extid=8bb6fd945af4e0ad9299 [1]
|
||||
Link: https://lkml.kernel.org/r/20250430100150.279751-1-shivankg@amd.com
|
||||
Link: https://lkml.kernel.org/r/20250430100150.279751-2-shivankg@amd.com
|
||||
Signed-off-by: David Hildenbrand <david@redhat.com>
|
||||
Signed-off-by: Shivank Garg <shivankg@amd.com>
|
||||
Suggested-by: Matthew Wilcox <willy@infradead.org>
|
||||
Co-developed-by: David Hildenbrand <david@redhat.com>
|
||||
Cc: Alistair Popple <apopple@nvidia.com>
|
||||
Cc: Dave Kleikamp <shaggy@kernel.org>
|
||||
Cc: Donet Tom <donettom@linux.ibm.com>
|
||||
Cc: Jane Chu <jane.chu@oracle.com>
|
||||
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
|
||||
Cc: Zi Yan <ziy@nvidia.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
include/linux/mm.h | 55 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
mm/migrate.c | 22 ++++---------------
|
||||
2 files changed, 59 insertions(+), 18 deletions(-)
|
||||
|
||||
--- a/include/linux/mm.h
|
||||
+++ b/include/linux/mm.h
|
||||
@@ -2307,6 +2307,61 @@ static inline bool folio_maybe_mapped_sh
|
||||
return folio_test_large_maybe_mapped_shared(folio);
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * folio_expected_ref_count - calculate the expected folio refcount
|
||||
+ * @folio: the folio
|
||||
+ *
|
||||
+ * Calculate the expected folio refcount, taking references from the pagecache,
|
||||
+ * swapcache, PG_private and page table mappings into account. Useful in
|
||||
+ * combination with folio_ref_count() to detect unexpected references (e.g.,
|
||||
+ * GUP or other temporary references).
|
||||
+ *
|
||||
+ * Does currently not consider references from the LRU cache. If the folio
|
||||
+ * was isolated from the LRU (which is the case during migration or split),
|
||||
+ * the LRU cache does not apply.
|
||||
+ *
|
||||
+ * Calling this function on an unmapped folio -- !folio_mapped() -- that is
|
||||
+ * locked will return a stable result.
|
||||
+ *
|
||||
+ * Calling this function on a mapped folio will not result in a stable result,
|
||||
+ * because nothing stops additional page table mappings from coming (e.g.,
|
||||
+ * fork()) or going (e.g., munmap()).
|
||||
+ *
|
||||
+ * Calling this function without the folio lock will also not result in a
|
||||
+ * stable result: for example, the folio might get dropped from the swapcache
|
||||
+ * concurrently.
|
||||
+ *
|
||||
+ * However, even when called without the folio lock or on a mapped folio,
|
||||
+ * this function can be used to detect unexpected references early (for example,
|
||||
+ * if it makes sense to even lock the folio and unmap it).
|
||||
+ *
|
||||
+ * The caller must add any reference (e.g., from folio_try_get()) it might be
|
||||
+ * holding itself to the result.
|
||||
+ *
|
||||
+ * Returns the expected folio refcount.
|
||||
+ */
|
||||
+static inline int folio_expected_ref_count(const struct folio *folio)
|
||||
+{
|
||||
+ const int order = folio_order(folio);
|
||||
+ int ref_count = 0;
|
||||
+
|
||||
+ if (WARN_ON_ONCE(folio_test_slab(folio)))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (folio_test_anon(folio)) {
|
||||
+ /* One reference per page from the swapcache. */
|
||||
+ ref_count += folio_test_swapcache(folio) << order;
|
||||
+ } else if (!((unsigned long)folio->mapping & PAGE_MAPPING_FLAGS)) {
|
||||
+ /* One reference per page from the pagecache. */
|
||||
+ ref_count += !!folio->mapping << order;
|
||||
+ /* One reference from PG_private. */
|
||||
+ ref_count += folio_test_private(folio);
|
||||
+ }
|
||||
+
|
||||
+ /* One reference per page table mapping. */
|
||||
+ return ref_count + folio_mapcount(folio);
|
||||
+}
|
||||
+
|
||||
#ifndef HAVE_ARCH_MAKE_FOLIO_ACCESSIBLE
|
||||
static inline int arch_make_folio_accessible(struct folio *folio)
|
||||
{
|
||||
--- a/mm/migrate.c
|
||||
+++ b/mm/migrate.c
|
||||
@@ -445,20 +445,6 @@ unlock:
|
||||
}
|
||||
#endif
|
||||
|
||||
-static int folio_expected_refs(struct address_space *mapping,
|
||||
- struct folio *folio)
|
||||
-{
|
||||
- int refs = 1;
|
||||
- if (!mapping)
|
||||
- return refs;
|
||||
-
|
||||
- refs += folio_nr_pages(folio);
|
||||
- if (folio_test_private(folio))
|
||||
- refs++;
|
||||
-
|
||||
- return refs;
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* Replace the folio in the mapping.
|
||||
*
|
||||
@@ -601,7 +587,7 @@ static int __folio_migrate_mapping(struc
|
||||
int folio_migrate_mapping(struct address_space *mapping,
|
||||
struct folio *newfolio, struct folio *folio, int extra_count)
|
||||
{
|
||||
- int expected_count = folio_expected_refs(mapping, folio) + extra_count;
|
||||
+ int expected_count = folio_expected_ref_count(folio) + extra_count + 1;
|
||||
|
||||
if (folio_ref_count(folio) != expected_count)
|
||||
return -EAGAIN;
|
||||
@@ -618,7 +604,7 @@ int migrate_huge_page_move_mapping(struc
|
||||
struct folio *dst, struct folio *src)
|
||||
{
|
||||
XA_STATE(xas, &mapping->i_pages, folio_index(src));
|
||||
- int rc, expected_count = folio_expected_refs(mapping, src);
|
||||
+ int rc, expected_count = folio_expected_ref_count(src) + 1;
|
||||
|
||||
if (folio_ref_count(src) != expected_count)
|
||||
return -EAGAIN;
|
||||
@@ -749,7 +735,7 @@ static int __migrate_folio(struct addres
|
||||
struct folio *src, void *src_private,
|
||||
enum migrate_mode mode)
|
||||
{
|
||||
- int rc, expected_count = folio_expected_refs(mapping, src);
|
||||
+ int rc, expected_count = folio_expected_ref_count(src) + 1;
|
||||
|
||||
/* Check whether src does not have extra refs before we do more work */
|
||||
if (folio_ref_count(src) != expected_count)
|
||||
@@ -837,7 +823,7 @@ static int __buffer_migrate_folio(struct
|
||||
return migrate_folio(mapping, dst, src, mode);
|
||||
|
||||
/* Check whether page does not have extra refs before we do more work */
|
||||
- expected_count = folio_expected_refs(mapping, src);
|
||||
+ expected_count = folio_expected_ref_count(src) + 1;
|
||||
if (folio_ref_count(src) != expected_count)
|
||||
return -EAGAIN;
|
||||
|
@@ -1,129 +0,0 @@
|
||||
From 1e9a258def978a9388a50ae43c85557b0598a7d3 Mon Sep 17 00:00:00 2001
|
||||
From: Pu Lehui <pulehui@huawei.com>
|
||||
Date: Thu, 29 May 2025 15:56:47 +0000
|
||||
Subject: mm: fix uprobe pte be overwritten when expanding vma
|
||||
|
||||
Patch series "Fix uprobe pte be overwritten when expanding vma".
|
||||
|
||||
|
||||
This patch (of 4):
|
||||
|
||||
We encountered a BUG alert triggered by Syzkaller as follows:
|
||||
BUG: Bad rss-counter state mm:00000000b4a60fca type:MM_ANONPAGES val:1
|
||||
|
||||
And we can reproduce it with the following steps:
|
||||
1. register uprobe on file at zero offset
|
||||
2. mmap the file at zero offset:
|
||||
addr1 = mmap(NULL, 2 * 4096, PROT_NONE, MAP_PRIVATE, fd, 0);
|
||||
3. mremap part of vma1 to new vma2:
|
||||
addr2 = mremap(addr1, 4096, 2 * 4096, MREMAP_MAYMOVE);
|
||||
4. mremap back to orig addr1:
|
||||
mremap(addr2, 4096, 4096, MREMAP_MAYMOVE | MREMAP_FIXED, addr1);
|
||||
|
||||
In step 3, the vma1 range [addr1, addr1 + 4096] will be remap to new vma2
|
||||
with range [addr2, addr2 + 8192], and remap uprobe anon page from the vma1
|
||||
to vma2, then unmap the vma1 range [addr1, addr1 + 4096].
|
||||
|
||||
In step 4, the vma2 range [addr2, addr2 + 4096] will be remap back to the
|
||||
addr range [addr1, addr1 + 4096]. Since the addr range [addr1 + 4096,
|
||||
addr1 + 8192] still maps the file, it will take vma_merge_new_range to
|
||||
expand the range, and then do uprobe_mmap in vma_complete. Since the
|
||||
merged vma pgoff is also zero offset, it will install uprobe anon page to
|
||||
the merged vma. However, the upcomming move_page_tables step, which use
|
||||
set_pte_at to remap the vma2 uprobe pte to the merged vma, will overwrite
|
||||
the newly uprobe pte in the merged vma, and lead that pte to be orphan.
|
||||
|
||||
Since the uprobe pte will be remapped to the merged vma, we can remove the
|
||||
unnecessary uprobe_mmap upon merged vma.
|
||||
|
||||
This problem was first found in linux-6.6.y and also exists in the
|
||||
community syzkaller:
|
||||
https://lore.kernel.org/all/000000000000ada39605a5e71711@google.com/T/
|
||||
|
||||
Link: https://lkml.kernel.org/r/20250529155650.4017699-1-pulehui@huaweicloud.com
|
||||
Link: https://lkml.kernel.org/r/20250529155650.4017699-2-pulehui@huaweicloud.com
|
||||
Fixes: 2b1444983508 ("uprobes, mm, x86: Add the ability to install and remove uprobes breakpoints")
|
||||
Signed-off-by: Pu Lehui <pulehui@huawei.com>
|
||||
Suggested-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Acked-by: David Hildenbrand <david@redhat.com>
|
||||
Cc: Jann Horn <jannh@google.com>
|
||||
Cc: Liam Howlett <liam.howlett@oracle.com>
|
||||
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
|
||||
Cc: Oleg Nesterov <oleg@redhat.com>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Vlastimil Babka <vbabka@suse.cz>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
mm/vma.c | 20 +++++++++++++++++---
|
||||
mm/vma.h | 7 +++++++
|
||||
2 files changed, 24 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/mm/vma.c
|
||||
+++ b/mm/vma.c
|
||||
@@ -144,6 +144,9 @@ static void init_multi_vma_prep(struct v
|
||||
vp->file = vma->vm_file;
|
||||
if (vp->file)
|
||||
vp->mapping = vma->vm_file->f_mapping;
|
||||
+
|
||||
+ if (vmg && vmg->skip_vma_uprobe)
|
||||
+ vp->skip_vma_uprobe = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -333,10 +336,13 @@ static void vma_complete(struct vma_prep
|
||||
|
||||
if (vp->file) {
|
||||
i_mmap_unlock_write(vp->mapping);
|
||||
- uprobe_mmap(vp->vma);
|
||||
|
||||
- if (vp->adj_next)
|
||||
- uprobe_mmap(vp->adj_next);
|
||||
+ if (!vp->skip_vma_uprobe) {
|
||||
+ uprobe_mmap(vp->vma);
|
||||
+
|
||||
+ if (vp->adj_next)
|
||||
+ uprobe_mmap(vp->adj_next);
|
||||
+ }
|
||||
}
|
||||
|
||||
if (vp->remove) {
|
||||
@@ -1783,6 +1789,14 @@ struct vm_area_struct *copy_vma(struct v
|
||||
faulted_in_anon_vma = false;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * If the VMA we are copying might contain a uprobe PTE, ensure
|
||||
+ * that we do not establish one upon merge. Otherwise, when mremap()
|
||||
+ * moves page tables, it will orphan the newly created PTE.
|
||||
+ */
|
||||
+ if (vma->vm_file)
|
||||
+ vmg.skip_vma_uprobe = true;
|
||||
+
|
||||
new_vma = find_vma_prev(mm, addr, &vmg.prev);
|
||||
if (new_vma && new_vma->vm_start < addr + len)
|
||||
return NULL; /* should never get here */
|
||||
--- a/mm/vma.h
|
||||
+++ b/mm/vma.h
|
||||
@@ -19,6 +19,8 @@ struct vma_prepare {
|
||||
struct vm_area_struct *insert;
|
||||
struct vm_area_struct *remove;
|
||||
struct vm_area_struct *remove2;
|
||||
+
|
||||
+ bool skip_vma_uprobe :1;
|
||||
};
|
||||
|
||||
struct unlink_vma_file_batch {
|
||||
@@ -120,6 +122,11 @@ struct vma_merge_struct {
|
||||
*/
|
||||
bool give_up_on_oom :1;
|
||||
|
||||
+ /*
|
||||
+ * If set, skip uprobe_mmap upon merged vma.
|
||||
+ */
|
||||
+ bool skip_vma_uprobe :1;
|
||||
+
|
||||
/* Internal flags set during merge process: */
|
||||
|
||||
/*
|
@@ -1,217 +0,0 @@
|
||||
From 2d8c79ec421253aab9560a47a7e73d678c84585c Mon Sep 17 00:00:00 2001
|
||||
From: Jann Horn <jannh@google.com>
|
||||
Date: Tue, 27 May 2025 23:23:53 +0200
|
||||
Subject: mm/hugetlb: unshare page tables during VMA split, not before
|
||||
|
||||
Currently, __split_vma() triggers hugetlb page table unsharing through
|
||||
vm_ops->may_split(). This happens before the VMA lock and rmap locks are
|
||||
taken - which is too early, it allows racing VMA-locked page faults in our
|
||||
process and racing rmap walks from other processes to cause page tables to
|
||||
be shared again before we actually perform the split.
|
||||
|
||||
Fix it by explicitly calling into the hugetlb unshare logic from
|
||||
__split_vma() in the same place where THP splitting also happens. At that
|
||||
point, both the VMA and the rmap(s) are write-locked.
|
||||
|
||||
An annoying detail is that we can now call into the helper
|
||||
hugetlb_unshare_pmds() from two different locking contexts:
|
||||
|
||||
1. from hugetlb_split(), holding:
|
||||
- mmap lock (exclusively)
|
||||
- VMA lock
|
||||
- file rmap lock (exclusively)
|
||||
2. hugetlb_unshare_all_pmds(), which I think is designed to be able to
|
||||
call us with only the mmap lock held (in shared mode), but currently
|
||||
only runs while holding mmap lock (exclusively) and VMA lock
|
||||
|
||||
Backporting note:
|
||||
This commit fixes a racy protection that was introduced in commit
|
||||
b30c14cd6102 ("hugetlb: unshare some PMDs when splitting VMAs"); that
|
||||
commit claimed to fix an issue introduced in 5.13, but it should actually
|
||||
also go all the way back.
|
||||
|
||||
[jannh@google.com: v2]
|
||||
Link: https://lkml.kernel.org/r/20250528-hugetlb-fixes-splitrace-v2-1-1329349bad1a@google.com
|
||||
Link: https://lkml.kernel.org/r/20250528-hugetlb-fixes-splitrace-v2-0-1329349bad1a@google.com
|
||||
Link: https://lkml.kernel.org/r/20250527-hugetlb-fixes-splitrace-v1-1-f4136f5ec58a@google.com
|
||||
Fixes: 39dde65c9940 ("[PATCH] shared page table for hugetlb page")
|
||||
Signed-off-by: Jann Horn <jannh@google.com>
|
||||
Cc: Liam Howlett <liam.howlett@oracle.com>
|
||||
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Reviewed-by: Oscar Salvador <osalvador@suse.de>
|
||||
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Cc: Vlastimil Babka <vbabka@suse.cz>
|
||||
Cc: <stable@vger.kernel.org> [b30c14cd6102: hugetlb: unshare some PMDs when splitting VMAs]
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
include/linux/hugetlb.h | 3 ++
|
||||
mm/hugetlb.c | 60 +++++++++++++++++++++++---------
|
||||
mm/vma.c | 7 ++++
|
||||
tools/testing/vma/vma_internal.h | 2 ++
|
||||
4 files changed, 56 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/include/linux/hugetlb.h
|
||||
+++ b/include/linux/hugetlb.h
|
||||
@@ -276,6 +276,7 @@ bool is_hugetlb_entry_migration(pte_t pt
|
||||
bool is_hugetlb_entry_hwpoisoned(pte_t pte);
|
||||
void hugetlb_unshare_all_pmds(struct vm_area_struct *vma);
|
||||
void fixup_hugetlb_reservations(struct vm_area_struct *vma);
|
||||
+void hugetlb_split(struct vm_area_struct *vma, unsigned long addr);
|
||||
|
||||
#else /* !CONFIG_HUGETLB_PAGE */
|
||||
|
||||
@@ -473,6 +474,8 @@ static inline void fixup_hugetlb_reserva
|
||||
{
|
||||
}
|
||||
|
||||
+static inline void hugetlb_split(struct vm_area_struct *vma, unsigned long addr) {}
|
||||
+
|
||||
#endif /* !CONFIG_HUGETLB_PAGE */
|
||||
|
||||
#ifndef pgd_write
|
||||
--- a/mm/hugetlb.c
|
||||
+++ b/mm/hugetlb.c
|
||||
@@ -120,7 +120,7 @@ static void hugetlb_vma_lock_free(struct
|
||||
static void hugetlb_vma_lock_alloc(struct vm_area_struct *vma);
|
||||
static void __hugetlb_vma_unlock_write_free(struct vm_area_struct *vma);
|
||||
static void hugetlb_unshare_pmds(struct vm_area_struct *vma,
|
||||
- unsigned long start, unsigned long end);
|
||||
+ unsigned long start, unsigned long end, bool take_locks);
|
||||
static struct resv_map *vma_resv_map(struct vm_area_struct *vma);
|
||||
|
||||
static void hugetlb_free_folio(struct folio *folio)
|
||||
@@ -5426,26 +5426,40 @@ static int hugetlb_vm_op_split(struct vm
|
||||
{
|
||||
if (addr & ~(huge_page_mask(hstate_vma(vma))))
|
||||
return -EINVAL;
|
||||
+ return 0;
|
||||
+}
|
||||
|
||||
+void hugetlb_split(struct vm_area_struct *vma, unsigned long addr)
|
||||
+{
|
||||
/*
|
||||
* PMD sharing is only possible for PUD_SIZE-aligned address ranges
|
||||
* in HugeTLB VMAs. If we will lose PUD_SIZE alignment due to this
|
||||
* split, unshare PMDs in the PUD_SIZE interval surrounding addr now.
|
||||
+ * This function is called in the middle of a VMA split operation, with
|
||||
+ * MM, VMA and rmap all write-locked to prevent concurrent page table
|
||||
+ * walks (except hardware and gup_fast()).
|
||||
*/
|
||||
+ vma_assert_write_locked(vma);
|
||||
+ i_mmap_assert_write_locked(vma->vm_file->f_mapping);
|
||||
+
|
||||
if (addr & ~PUD_MASK) {
|
||||
- /*
|
||||
- * hugetlb_vm_op_split is called right before we attempt to
|
||||
- * split the VMA. We will need to unshare PMDs in the old and
|
||||
- * new VMAs, so let's unshare before we split.
|
||||
- */
|
||||
unsigned long floor = addr & PUD_MASK;
|
||||
unsigned long ceil = floor + PUD_SIZE;
|
||||
|
||||
- if (floor >= vma->vm_start && ceil <= vma->vm_end)
|
||||
- hugetlb_unshare_pmds(vma, floor, ceil);
|
||||
+ if (floor >= vma->vm_start && ceil <= vma->vm_end) {
|
||||
+ /*
|
||||
+ * Locking:
|
||||
+ * Use take_locks=false here.
|
||||
+ * The file rmap lock is already held.
|
||||
+ * The hugetlb VMA lock can't be taken when we already
|
||||
+ * hold the file rmap lock, and we don't need it because
|
||||
+ * its purpose is to synchronize against concurrent page
|
||||
+ * table walks, which are not possible thanks to the
|
||||
+ * locks held by our caller.
|
||||
+ */
|
||||
+ hugetlb_unshare_pmds(vma, floor, ceil, /* take_locks = */ false);
|
||||
+ }
|
||||
}
|
||||
-
|
||||
- return 0;
|
||||
}
|
||||
|
||||
static unsigned long hugetlb_vm_op_pagesize(struct vm_area_struct *vma)
|
||||
@@ -7884,9 +7898,16 @@ void move_hugetlb_state(struct folio *ol
|
||||
spin_unlock_irq(&hugetlb_lock);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * If @take_locks is false, the caller must ensure that no concurrent page table
|
||||
+ * access can happen (except for gup_fast() and hardware page walks).
|
||||
+ * If @take_locks is true, we take the hugetlb VMA lock (to lock out things like
|
||||
+ * concurrent page fault handling) and the file rmap lock.
|
||||
+ */
|
||||
static void hugetlb_unshare_pmds(struct vm_area_struct *vma,
|
||||
unsigned long start,
|
||||
- unsigned long end)
|
||||
+ unsigned long end,
|
||||
+ bool take_locks)
|
||||
{
|
||||
struct hstate *h = hstate_vma(vma);
|
||||
unsigned long sz = huge_page_size(h);
|
||||
@@ -7910,8 +7931,12 @@ static void hugetlb_unshare_pmds(struct
|
||||
mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, mm,
|
||||
start, end);
|
||||
mmu_notifier_invalidate_range_start(&range);
|
||||
- hugetlb_vma_lock_write(vma);
|
||||
- i_mmap_lock_write(vma->vm_file->f_mapping);
|
||||
+ if (take_locks) {
|
||||
+ hugetlb_vma_lock_write(vma);
|
||||
+ i_mmap_lock_write(vma->vm_file->f_mapping);
|
||||
+ } else {
|
||||
+ i_mmap_assert_write_locked(vma->vm_file->f_mapping);
|
||||
+ }
|
||||
for (address = start; address < end; address += PUD_SIZE) {
|
||||
ptep = hugetlb_walk(vma, address, sz);
|
||||
if (!ptep)
|
||||
@@ -7921,8 +7946,10 @@ static void hugetlb_unshare_pmds(struct
|
||||
spin_unlock(ptl);
|
||||
}
|
||||
flush_hugetlb_tlb_range(vma, start, end);
|
||||
- i_mmap_unlock_write(vma->vm_file->f_mapping);
|
||||
- hugetlb_vma_unlock_write(vma);
|
||||
+ if (take_locks) {
|
||||
+ i_mmap_unlock_write(vma->vm_file->f_mapping);
|
||||
+ hugetlb_vma_unlock_write(vma);
|
||||
+ }
|
||||
/*
|
||||
* No need to call mmu_notifier_arch_invalidate_secondary_tlbs(), see
|
||||
* Documentation/mm/mmu_notifier.rst.
|
||||
@@ -7937,7 +7964,8 @@ static void hugetlb_unshare_pmds(struct
|
||||
void hugetlb_unshare_all_pmds(struct vm_area_struct *vma)
|
||||
{
|
||||
hugetlb_unshare_pmds(vma, ALIGN(vma->vm_start, PUD_SIZE),
|
||||
- ALIGN_DOWN(vma->vm_end, PUD_SIZE));
|
||||
+ ALIGN_DOWN(vma->vm_end, PUD_SIZE),
|
||||
+ /* take_locks = */ true);
|
||||
}
|
||||
|
||||
/*
|
||||
--- a/mm/vma.c
|
||||
+++ b/mm/vma.c
|
||||
@@ -516,7 +516,14 @@ __split_vma(struct vma_iterator *vmi, st
|
||||
init_vma_prep(&vp, vma);
|
||||
vp.insert = new;
|
||||
vma_prepare(&vp);
|
||||
+
|
||||
+ /*
|
||||
+ * Get rid of huge pages and shared page tables straddling the split
|
||||
+ * boundary.
|
||||
+ */
|
||||
vma_adjust_trans_huge(vma, vma->vm_start, addr, NULL);
|
||||
+ if (is_vm_hugetlb_page(vma))
|
||||
+ hugetlb_split(vma, addr);
|
||||
|
||||
if (new_below) {
|
||||
vma->vm_start = addr;
|
||||
--- a/tools/testing/vma/vma_internal.h
|
||||
+++ b/tools/testing/vma/vma_internal.h
|
||||
@@ -793,6 +793,8 @@ static inline void vma_adjust_trans_huge
|
||||
(void)next;
|
||||
}
|
||||
|
||||
+static inline void hugetlb_split(struct vm_area_struct *, unsigned long) {}
|
||||
+
|
||||
static inline void vma_iter_free(struct vma_iterator *vmi)
|
||||
{
|
||||
mas_destroy(&vmi->mas);
|
@@ -1,50 +0,0 @@
|
||||
From e1280358284feaf844db5c6a76078b2c1738c5ae Mon Sep 17 00:00:00 2001
|
||||
From: Jann Horn <jannh@google.com>
|
||||
Date: Tue, 27 May 2025 23:23:54 +0200
|
||||
Subject: mm/hugetlb: fix huge_pmd_unshare() vs GUP-fast race
|
||||
|
||||
huge_pmd_unshare() drops a reference on a page table that may have
|
||||
previously been shared across processes, potentially turning it into a
|
||||
normal page table used in another process in which unrelated VMAs can
|
||||
afterwards be installed.
|
||||
|
||||
If this happens in the middle of a concurrent gup_fast(), gup_fast() could
|
||||
end up walking the page tables of another process. While I don't see any
|
||||
way in which that immediately leads to kernel memory corruption, it is
|
||||
really weird and unexpected.
|
||||
|
||||
Fix it with an explicit broadcast IPI through tlb_remove_table_sync_one(),
|
||||
just like we do in khugepaged when removing page tables for a THP
|
||||
collapse.
|
||||
|
||||
Link: https://lkml.kernel.org/r/20250528-hugetlb-fixes-splitrace-v2-2-1329349bad1a@google.com
|
||||
Link: https://lkml.kernel.org/r/20250527-hugetlb-fixes-splitrace-v1-2-f4136f5ec58a@google.com
|
||||
Fixes: 39dde65c9940 ("[PATCH] shared page table for hugetlb page")
|
||||
Signed-off-by: Jann Horn <jannh@google.com>
|
||||
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Cc: Liam Howlett <liam.howlett@oracle.com>
|
||||
Cc: Muchun Song <muchun.song@linux.dev>
|
||||
Cc: Oscar Salvador <osalvador@suse.de>
|
||||
Cc: Vlastimil Babka <vbabka@suse.cz>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
mm/hugetlb.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/mm/hugetlb.c
|
||||
+++ b/mm/hugetlb.c
|
||||
@@ -7628,6 +7628,13 @@ int huge_pmd_unshare(struct mm_struct *m
|
||||
return 0;
|
||||
|
||||
pud_clear(pud);
|
||||
+ /*
|
||||
+ * Once our caller drops the rmap lock, some other process might be
|
||||
+ * using this page table as a normal, non-hugetlb page table.
|
||||
+ * Wait for pending gup_fast() in other threads to finish before letting
|
||||
+ * that happen.
|
||||
+ */
|
||||
+ tlb_remove_table_sync_one();
|
||||
ptdesc_pmd_pts_dec(virt_to_ptdesc(ptep));
|
||||
mm_dec_nr_pmds(mm);
|
||||
return 1;
|
@@ -1,48 +0,0 @@
|
||||
From b36611870ea72c82eb78d90a017658394bdb9690 Mon Sep 17 00:00:00 2001
|
||||
From: SeongJae Park <sj@kernel.org>
|
||||
Date: Mon, 2 Jun 2025 10:49:26 -0700
|
||||
Subject: mm/madvise: handle madvise_lock() failure during race unwinding
|
||||
|
||||
When unwinding race on -ERESTARTNOINTR handling of process_madvise(),
|
||||
madvise_lock() failure is ignored. Check the failure and abort remaining
|
||||
works in the case.
|
||||
|
||||
Link: https://lkml.kernel.org/r/20250602174926.1074-1-sj@kernel.org
|
||||
Fixes: 4000e3d0a367 ("mm/madvise: remove redundant mmap_lock operations from process_madvise()")
|
||||
Signed-off-by: SeongJae Park <sj@kernel.org>
|
||||
Reported-by: Barry Song <21cnbao@gmail.com>
|
||||
Closes: https://lore.kernel.org/CAGsJ_4xJXXO0G+4BizhohSZ4yDteziPw43_uF8nPXPWxUVChzw@mail.gmail.com
|
||||
Reviewed-by: Jann Horn <jannh@google.com>
|
||||
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Acked-by: David Hildenbrand <david@redhat.com>
|
||||
Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev>
|
||||
Reviewed-by: Barry Song <baohua@kernel.org>
|
||||
Cc: Liam Howlett <liam.howlett@oracle.com>
|
||||
Cc: Vlastimil Babka <vbabka@suse.cz>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
mm/madvise.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/mm/madvise.c
|
||||
+++ b/mm/madvise.c
|
||||
@@ -1830,7 +1830,9 @@ static ssize_t vector_madvise(struct mm_
|
||||
|
||||
/* Drop and reacquire lock to unwind race. */
|
||||
madvise_unlock(mm, behavior);
|
||||
- madvise_lock(mm, behavior);
|
||||
+ ret = madvise_lock(mm, behavior);
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
continue;
|
||||
}
|
||||
if (ret < 0)
|
||||
@@ -1839,6 +1841,7 @@ static ssize_t vector_madvise(struct mm_
|
||||
}
|
||||
madvise_unlock(mm, behavior);
|
||||
|
||||
+out:
|
||||
ret = (total_len - iov_iter_count(iter)) ? : ret;
|
||||
|
||||
return ret;
|
@@ -1,164 +0,0 @@
|
||||
From f0ab226d0eae3aa7e26524efc040026a65ead640 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Zimmermann <tzimmermann@suse.de>
|
||||
Date: Wed, 28 May 2025 10:02:08 +0200
|
||||
Subject: video: screen_info: Relocate framebuffers behind PCI bridges
|
||||
|
||||
Apply PCI host-bridge window offsets to screen_info framebuffers. Fixes
|
||||
invalid access to I/O memory.
|
||||
|
||||
Resources behind a PCI host bridge can be relocated by a certain offset
|
||||
in the kernel's CPU address range used for I/O. The framebuffer memory
|
||||
range stored in screen_info refers to the CPU addresses as seen during
|
||||
boot (where the offset is 0). During boot up, firmware may assign a
|
||||
different memory offset to the PCI host bridge and thereby relocating
|
||||
the framebuffer address of the PCI graphics device as seen by the kernel.
|
||||
The information in screen_info must be updated as well.
|
||||
|
||||
The helper pcibios_bus_to_resource() performs the relocation of the
|
||||
screen_info's framebuffer resource (given in PCI bus addresses). The
|
||||
result matches the I/O-memory resource of the PCI graphics device (given
|
||||
in CPU addresses). As before, we store away the information necessary to
|
||||
later update the information in screen_info itself.
|
||||
|
||||
Commit 78aa89d1dfba ("firmware/sysfb: Update screen_info for relocated
|
||||
EFI framebuffers") added the code for updating screen_info. It is based
|
||||
on similar functionality that pre-existed in efifb. Efifb uses a pointer
|
||||
to the PCI resource, while the newer code does a memcpy of the region.
|
||||
Hence efifb sees any updates to the PCI resource and avoids the issue.
|
||||
|
||||
v3:
|
||||
- Only use struct pci_bus_region for PCI bus addresses (Bjorn)
|
||||
- Clarify address semantics in commit messages and comments (Bjorn)
|
||||
v2:
|
||||
- Fixed tags (Takashi, Ivan)
|
||||
- Updated information on efifb
|
||||
|
||||
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
|
||||
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Reported-by: "Ivan T. Ivanov" <iivanov@suse.de>
|
||||
Closes: https://bugzilla.suse.com/show_bug.cgi?id=1240696
|
||||
Tested-by: "Ivan T. Ivanov" <iivanov@suse.de>
|
||||
Fixes: 78aa89d1dfba ("firmware/sysfb: Update screen_info for relocated EFI framebuffers")
|
||||
Cc: dri-devel@lists.freedesktop.org
|
||||
Cc: <stable@vger.kernel.org> # v6.9+
|
||||
Link: https://lore.kernel.org/r/20250528080234.7380-1-tzimmermann@suse.de
|
||||
---
|
||||
drivers/video/screen_info_pci.c | 79 +++++++++++++++++++++------------
|
||||
1 file changed, 50 insertions(+), 29 deletions(-)
|
||||
|
||||
--- a/drivers/video/screen_info_pci.c
|
||||
+++ b/drivers/video/screen_info_pci.c
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
static struct pci_dev *screen_info_lfb_pdev;
|
||||
static size_t screen_info_lfb_bar;
|
||||
-static resource_size_t screen_info_lfb_offset;
|
||||
-static struct resource screen_info_lfb_res = DEFINE_RES_MEM(0, 0);
|
||||
+static resource_size_t screen_info_lfb_res_start; // original start of resource
|
||||
+static resource_size_t screen_info_lfb_offset; // framebuffer offset within resource
|
||||
|
||||
static bool __screen_info_relocation_is_valid(const struct screen_info *si, struct resource *pr)
|
||||
{
|
||||
@@ -31,7 +31,7 @@ void screen_info_apply_fixups(void)
|
||||
if (screen_info_lfb_pdev) {
|
||||
struct resource *pr = &screen_info_lfb_pdev->resource[screen_info_lfb_bar];
|
||||
|
||||
- if (pr->start != screen_info_lfb_res.start) {
|
||||
+ if (pr->start != screen_info_lfb_res_start) {
|
||||
if (__screen_info_relocation_is_valid(si, pr)) {
|
||||
/*
|
||||
* Only update base if we have an actual
|
||||
@@ -47,46 +47,67 @@ void screen_info_apply_fixups(void)
|
||||
}
|
||||
}
|
||||
|
||||
+static int __screen_info_lfb_pci_bus_region(const struct screen_info *si, unsigned int type,
|
||||
+ struct pci_bus_region *r)
|
||||
+{
|
||||
+ u64 base, size;
|
||||
+
|
||||
+ base = __screen_info_lfb_base(si);
|
||||
+ if (!base)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ size = __screen_info_lfb_size(si, type);
|
||||
+ if (!size)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ r->start = base;
|
||||
+ r->end = base + size - 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void screen_info_fixup_lfb(struct pci_dev *pdev)
|
||||
{
|
||||
unsigned int type;
|
||||
- struct resource res[SCREEN_INFO_MAX_RESOURCES];
|
||||
- size_t i, numres;
|
||||
+ struct pci_bus_region bus_region;
|
||||
int ret;
|
||||
+ struct resource r = {
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ };
|
||||
+ const struct resource *pr;
|
||||
const struct screen_info *si = &screen_info;
|
||||
|
||||
if (screen_info_lfb_pdev)
|
||||
return; // already found
|
||||
|
||||
type = screen_info_video_type(si);
|
||||
- if (type != VIDEO_TYPE_EFI)
|
||||
- return; // only applies to EFI
|
||||
+ if (!__screen_info_has_lfb(type))
|
||||
+ return; // only applies to EFI; maybe VESA
|
||||
|
||||
- ret = screen_info_resources(si, res, ARRAY_SIZE(res));
|
||||
+ ret = __screen_info_lfb_pci_bus_region(si, type, &bus_region);
|
||||
if (ret < 0)
|
||||
return;
|
||||
- numres = ret;
|
||||
|
||||
- for (i = 0; i < numres; ++i) {
|
||||
- struct resource *r = &res[i];
|
||||
- const struct resource *pr;
|
||||
-
|
||||
- if (!(r->flags & IORESOURCE_MEM))
|
||||
- continue;
|
||||
- pr = pci_find_resource(pdev, r);
|
||||
- if (!pr)
|
||||
- continue;
|
||||
-
|
||||
- /*
|
||||
- * We've found a PCI device with the framebuffer
|
||||
- * resource. Store away the parameters to track
|
||||
- * relocation of the framebuffer aperture.
|
||||
- */
|
||||
- screen_info_lfb_pdev = pdev;
|
||||
- screen_info_lfb_bar = pr - pdev->resource;
|
||||
- screen_info_lfb_offset = r->start - pr->start;
|
||||
- memcpy(&screen_info_lfb_res, r, sizeof(screen_info_lfb_res));
|
||||
- }
|
||||
+ /*
|
||||
+ * Translate the PCI bus address to resource. Account
|
||||
+ * for an offset if the framebuffer is behind a PCI host
|
||||
+ * bridge.
|
||||
+ */
|
||||
+ pcibios_bus_to_resource(pdev->bus, &r, &bus_region);
|
||||
+
|
||||
+ pr = pci_find_resource(pdev, &r);
|
||||
+ if (!pr)
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
+ * We've found a PCI device with the framebuffer
|
||||
+ * resource. Store away the parameters to track
|
||||
+ * relocation of the framebuffer aperture.
|
||||
+ */
|
||||
+ screen_info_lfb_pdev = pdev;
|
||||
+ screen_info_lfb_bar = pr - pdev->resource;
|
||||
+ screen_info_lfb_offset = r.start - pr->start;
|
||||
+ screen_info_lfb_res_start = bus_region.start;
|
||||
}
|
||||
DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY, 16,
|
||||
screen_info_fixup_lfb);
|
@@ -1,86 +0,0 @@
|
||||
From 717bcb42b8cd4119c88249fbfc26d08e25a2ca24 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Zimmermann <tzimmermann@suse.de>
|
||||
Date: Tue, 3 Jun 2025 17:48:20 +0200
|
||||
Subject: sysfb: Fix screen_info type check for VGA
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Use the helper screen_info_video_type() to get the framebuffer
|
||||
type from struct screen_info. Handle supported values in sorted
|
||||
switch statement.
|
||||
|
||||
Reading orig_video_isVGA is unreliable. On most systems it is a
|
||||
VIDEO_TYPE_ constant. On some systems with VGA it is simply set
|
||||
to 1 to signal the presence of a VGA output. See vga_probe() for
|
||||
an example. Retrieving the screen_info type with the helper
|
||||
screen_info_video_type() detects these cases and returns the
|
||||
appropriate VIDEO_TYPE_ constant. For VGA, sysfb creates a device
|
||||
named "vga-framebuffer".
|
||||
|
||||
The sysfb code has been taken from vga16fb, where it likely didn't
|
||||
work correctly either. With this bugfix applied, vga16fb loads for
|
||||
compatible vga-framebuffer devices.
|
||||
|
||||
Fixes: 0db5b61e0dc0 ("fbdev/vga16fb: Create EGA/VGA devices in sysfb code")
|
||||
Cc: Thomas Zimmermann <tzimmermann@suse.de>
|
||||
Cc: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Cc: Alex Deucher <alexander.deucher@amd.com>
|
||||
Cc: Tzung-Bi Shih <tzungbi@kernel.org>
|
||||
Cc: Helge Deller <deller@gmx.de>
|
||||
Cc: "Uwe Kleine-König" <u.kleine-koenig@baylibre.com>
|
||||
Cc: Zsolt Kajtar <soci@c64.rulez.org>
|
||||
Cc: <stable@vger.kernel.org> # v6.1+
|
||||
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
|
||||
Reviewed-by: Tzung-Bi Shih <tzungbi@kernel.org>
|
||||
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20250603154838.401882-1-tzimmermann@suse.de
|
||||
---
|
||||
drivers/firmware/sysfb.c | 26 ++++++++++++++++++--------
|
||||
1 file changed, 18 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/firmware/sysfb.c
|
||||
+++ b/drivers/firmware/sysfb.c
|
||||
@@ -143,6 +143,7 @@ static __init int sysfb_init(void)
|
||||
{
|
||||
struct screen_info *si = &screen_info;
|
||||
struct device *parent;
|
||||
+ unsigned int type;
|
||||
struct simplefb_platform_data mode;
|
||||
const char *name;
|
||||
bool compatible;
|
||||
@@ -170,17 +171,26 @@ static __init int sysfb_init(void)
|
||||
goto put_device;
|
||||
}
|
||||
|
||||
+ type = screen_info_video_type(si);
|
||||
+
|
||||
/* if the FB is incompatible, create a legacy framebuffer device */
|
||||
- if (si->orig_video_isVGA == VIDEO_TYPE_EFI)
|
||||
- name = "efi-framebuffer";
|
||||
- else if (si->orig_video_isVGA == VIDEO_TYPE_VLFB)
|
||||
- name = "vesa-framebuffer";
|
||||
- else if (si->orig_video_isVGA == VIDEO_TYPE_VGAC)
|
||||
- name = "vga-framebuffer";
|
||||
- else if (si->orig_video_isVGA == VIDEO_TYPE_EGAC)
|
||||
+ switch (type) {
|
||||
+ case VIDEO_TYPE_EGAC:
|
||||
name = "ega-framebuffer";
|
||||
- else
|
||||
+ break;
|
||||
+ case VIDEO_TYPE_VGAC:
|
||||
+ name = "vga-framebuffer";
|
||||
+ break;
|
||||
+ case VIDEO_TYPE_VLFB:
|
||||
+ name = "vesa-framebuffer";
|
||||
+ break;
|
||||
+ case VIDEO_TYPE_EFI:
|
||||
+ name = "efi-framebuffer";
|
||||
+ break;
|
||||
+ default:
|
||||
name = "platform-framebuffer";
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
pd = platform_device_alloc(name, 0);
|
||||
if (!pd) {
|
@@ -1,200 +0,0 @@
|
||||
From 08b1e02fc44abc04d813dbc827812db9ebca0dad Mon Sep 17 00:00:00 2001
|
||||
From: Luo Gengkun <luogengkun@huaweicloud.com>
|
||||
Date: Mon, 21 Apr 2025 03:50:21 +0000
|
||||
Subject: watchdog: fix watchdog may detect false positive of softlockup
|
||||
|
||||
When updating `watchdog_thresh`, there is a race condition between writing
|
||||
the new `watchdog_thresh` value and stopping the old watchdog timer. If
|
||||
the old timer triggers during this window, it may falsely detect a
|
||||
softlockup due to the old interval and the new `watchdog_thresh` value
|
||||
being used. The problem can be described as follow:
|
||||
|
||||
# We asuume previous watchdog_thresh is 60, so the watchdog timer is
|
||||
# coming every 24s.
|
||||
echo 10 > /proc/sys/kernel/watchdog_thresh (User space)
|
||||
|
|
||||
+------>+ update watchdog_thresh (We are in kernel now)
|
||||
|
|
||||
| # using old interval and new `watchdog_thresh`
|
||||
+------>+ watchdog hrtimer (irq context: detect softlockup)
|
||||
|
|
||||
|
|
||||
+-------+
|
||||
|
|
||||
|
|
||||
+ softlockup_stop_all
|
||||
|
||||
To fix this problem, introduce a shadow variable for `watchdog_thresh`.
|
||||
The update to the actual `watchdog_thresh` is delayed until after the old
|
||||
timer is stopped, preventing false positives.
|
||||
|
||||
The following testcase may help to understand this problem.
|
||||
|
||||
---------------------------------------------
|
||||
echo RT_RUNTIME_SHARE > /sys/kernel/debug/sched/features
|
||||
echo -1 > /proc/sys/kernel/sched_rt_runtime_us
|
||||
echo 0 > /sys/kernel/debug/sched/fair_server/cpu3/runtime
|
||||
echo 60 > /proc/sys/kernel/watchdog_thresh
|
||||
taskset -c 3 chrt -r 99 /bin/bash -c "while true;do true; done" &
|
||||
echo 10 > /proc/sys/kernel/watchdog_thresh &
|
||||
---------------------------------------------
|
||||
|
||||
The test case above first removes the throttling restrictions for
|
||||
real-time tasks. It then sets watchdog_thresh to 60 and executes a
|
||||
real-time task ,a simple while(1) loop, on cpu3. Consequently, the final
|
||||
command gets blocked because the presence of this real-time thread
|
||||
prevents kworker:3 from being selected by the scheduler. This eventually
|
||||
triggers a softlockup detection on cpu3 due to watchdog_timer_fn operating
|
||||
with inconsistent variable - using both the old interval and the updated
|
||||
watchdog_thresh simultaneously.
|
||||
|
||||
[nysal@linux.ibm.com: fix the SOFTLOCKUP_DETECTOR=n case]
|
||||
Link: https://lkml.kernel.org/r/20250502111120.282690-1-nysal@linux.ibm.com
|
||||
Link: https://lkml.kernel.org/r/20250421035021.3507649-1-luogengkun@huaweicloud.com
|
||||
Signed-off-by: Luo Gengkun <luogengkun@huaweicloud.com>
|
||||
Signed-off-by: Nysal Jan K.A. <nysal@linux.ibm.com>
|
||||
Cc: Doug Anderson <dianders@chromium.org>
|
||||
Cc: Joel Granados <joel.granados@kernel.org>
|
||||
Cc: Song Liu <song@kernel.org>
|
||||
Cc: Thomas Gleinxer <tglx@linutronix.de>
|
||||
Cc: "Nysal Jan K.A." <nysal@linux.ibm.com>
|
||||
Cc: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
kernel/watchdog.c | 41 +++++++++++++++++++++++++++--------------
|
||||
1 file changed, 27 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/kernel/watchdog.c
|
||||
+++ b/kernel/watchdog.c
|
||||
@@ -47,6 +47,7 @@ int __read_mostly watchdog_user_enabled
|
||||
static int __read_mostly watchdog_hardlockup_user_enabled = WATCHDOG_HARDLOCKUP_DEFAULT;
|
||||
static int __read_mostly watchdog_softlockup_user_enabled = 1;
|
||||
int __read_mostly watchdog_thresh = 10;
|
||||
+static int __read_mostly watchdog_thresh_next;
|
||||
static int __read_mostly watchdog_hardlockup_available;
|
||||
|
||||
struct cpumask watchdog_cpumask __read_mostly;
|
||||
@@ -870,12 +871,20 @@ int lockup_detector_offline_cpu(unsigned
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void __lockup_detector_reconfigure(void)
|
||||
+static void __lockup_detector_reconfigure(bool thresh_changed)
|
||||
{
|
||||
cpus_read_lock();
|
||||
watchdog_hardlockup_stop();
|
||||
|
||||
softlockup_stop_all();
|
||||
+ /*
|
||||
+ * To prevent watchdog_timer_fn from using the old interval and
|
||||
+ * the new watchdog_thresh at the same time, which could lead to
|
||||
+ * false softlockup reports, it is necessary to update the
|
||||
+ * watchdog_thresh after the softlockup is completed.
|
||||
+ */
|
||||
+ if (thresh_changed)
|
||||
+ watchdog_thresh = READ_ONCE(watchdog_thresh_next);
|
||||
set_sample_period();
|
||||
lockup_detector_update_enable();
|
||||
if (watchdog_enabled && watchdog_thresh)
|
||||
@@ -888,7 +897,7 @@ static void __lockup_detector_reconfigur
|
||||
void lockup_detector_reconfigure(void)
|
||||
{
|
||||
mutex_lock(&watchdog_mutex);
|
||||
- __lockup_detector_reconfigure();
|
||||
+ __lockup_detector_reconfigure(false);
|
||||
mutex_unlock(&watchdog_mutex);
|
||||
}
|
||||
|
||||
@@ -908,27 +917,29 @@ static __init void lockup_detector_setup
|
||||
return;
|
||||
|
||||
mutex_lock(&watchdog_mutex);
|
||||
- __lockup_detector_reconfigure();
|
||||
+ __lockup_detector_reconfigure(false);
|
||||
softlockup_initialized = true;
|
||||
mutex_unlock(&watchdog_mutex);
|
||||
}
|
||||
|
||||
#else /* CONFIG_SOFTLOCKUP_DETECTOR */
|
||||
-static void __lockup_detector_reconfigure(void)
|
||||
+static void __lockup_detector_reconfigure(bool thresh_changed)
|
||||
{
|
||||
cpus_read_lock();
|
||||
watchdog_hardlockup_stop();
|
||||
+ if (thresh_changed)
|
||||
+ watchdog_thresh = READ_ONCE(watchdog_thresh_next);
|
||||
lockup_detector_update_enable();
|
||||
watchdog_hardlockup_start();
|
||||
cpus_read_unlock();
|
||||
}
|
||||
void lockup_detector_reconfigure(void)
|
||||
{
|
||||
- __lockup_detector_reconfigure();
|
||||
+ __lockup_detector_reconfigure(false);
|
||||
}
|
||||
static inline void lockup_detector_setup(void)
|
||||
{
|
||||
- __lockup_detector_reconfigure();
|
||||
+ __lockup_detector_reconfigure(false);
|
||||
}
|
||||
#endif /* !CONFIG_SOFTLOCKUP_DETECTOR */
|
||||
|
||||
@@ -946,11 +957,11 @@ void lockup_detector_soft_poweroff(void)
|
||||
#ifdef CONFIG_SYSCTL
|
||||
|
||||
/* Propagate any changes to the watchdog infrastructure */
|
||||
-static void proc_watchdog_update(void)
|
||||
+static void proc_watchdog_update(bool thresh_changed)
|
||||
{
|
||||
/* Remove impossible cpus to keep sysctl output clean. */
|
||||
cpumask_and(&watchdog_cpumask, &watchdog_cpumask, cpu_possible_mask);
|
||||
- __lockup_detector_reconfigure();
|
||||
+ __lockup_detector_reconfigure(thresh_changed);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -984,7 +995,7 @@ static int proc_watchdog_common(int whic
|
||||
} else {
|
||||
err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
if (!err && old != READ_ONCE(*param))
|
||||
- proc_watchdog_update();
|
||||
+ proc_watchdog_update(false);
|
||||
}
|
||||
mutex_unlock(&watchdog_mutex);
|
||||
return err;
|
||||
@@ -1035,11 +1046,13 @@ static int proc_watchdog_thresh(const st
|
||||
|
||||
mutex_lock(&watchdog_mutex);
|
||||
|
||||
- old = READ_ONCE(watchdog_thresh);
|
||||
+ watchdog_thresh_next = READ_ONCE(watchdog_thresh);
|
||||
+
|
||||
+ old = watchdog_thresh_next;
|
||||
err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
|
||||
- if (!err && write && old != READ_ONCE(watchdog_thresh))
|
||||
- proc_watchdog_update();
|
||||
+ if (!err && write && old != READ_ONCE(watchdog_thresh_next))
|
||||
+ proc_watchdog_update(true);
|
||||
|
||||
mutex_unlock(&watchdog_mutex);
|
||||
return err;
|
||||
@@ -1060,7 +1073,7 @@ static int proc_watchdog_cpumask(const s
|
||||
|
||||
err = proc_do_large_bitmap(table, write, buffer, lenp, ppos);
|
||||
if (!err && write)
|
||||
- proc_watchdog_update();
|
||||
+ proc_watchdog_update(false);
|
||||
|
||||
mutex_unlock(&watchdog_mutex);
|
||||
return err;
|
||||
@@ -1080,7 +1093,7 @@ static const struct ctl_table watchdog_s
|
||||
},
|
||||
{
|
||||
.procname = "watchdog_thresh",
|
||||
- .data = &watchdog_thresh,
|
||||
+ .data = &watchdog_thresh_next,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_watchdog_thresh,
|
@@ -1,288 +0,0 @@
|
||||
From ff8503c4997332bb5708c3b77f8a19f334e947a9 Mon Sep 17 00:00:00 2001
|
||||
From: Harshit Agarwal <harshit@nutanix.com>
|
||||
Date: Tue, 25 Feb 2025 18:05:53 +0000
|
||||
Subject: sched/rt: Fix race in push_rt_task
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Overview
|
||||
========
|
||||
When a CPU chooses to call push_rt_task and picks a task to push to
|
||||
another CPU's runqueue then it will call find_lock_lowest_rq method
|
||||
which would take a double lock on both CPUs' runqueues. If one of the
|
||||
locks aren't readily available, it may lead to dropping the current
|
||||
runqueue lock and reacquiring both the locks at once. During this window
|
||||
it is possible that the task is already migrated and is running on some
|
||||
other CPU. These cases are already handled. However, if the task is
|
||||
migrated and has already been executed and another CPU is now trying to
|
||||
wake it up (ttwu) such that it is queued again on the runqeue
|
||||
(on_rq is 1) and also if the task was run by the same CPU, then the
|
||||
current checks will pass even though the task was migrated out and is no
|
||||
longer in the pushable tasks list.
|
||||
|
||||
Crashes
|
||||
=======
|
||||
This bug resulted in quite a few flavors of crashes triggering kernel
|
||||
panics with various crash signatures such as assert failures, page
|
||||
faults, null pointer dereferences, and queue corruption errors all
|
||||
coming from scheduler itself.
|
||||
|
||||
Some of the crashes:
|
||||
-> kernel BUG at kernel/sched/rt.c:1616! BUG_ON(idx >= MAX_RT_PRIO)
|
||||
Call Trace:
|
||||
? __die_body+0x1a/0x60
|
||||
? die+0x2a/0x50
|
||||
? do_trap+0x85/0x100
|
||||
? pick_next_task_rt+0x6e/0x1d0
|
||||
? do_error_trap+0x64/0xa0
|
||||
? pick_next_task_rt+0x6e/0x1d0
|
||||
? exc_invalid_op+0x4c/0x60
|
||||
? pick_next_task_rt+0x6e/0x1d0
|
||||
? asm_exc_invalid_op+0x12/0x20
|
||||
? pick_next_task_rt+0x6e/0x1d0
|
||||
__schedule+0x5cb/0x790
|
||||
? update_ts_time_stats+0x55/0x70
|
||||
schedule_idle+0x1e/0x40
|
||||
do_idle+0x15e/0x200
|
||||
cpu_startup_entry+0x19/0x20
|
||||
start_secondary+0x117/0x160
|
||||
secondary_startup_64_no_verify+0xb0/0xbb
|
||||
|
||||
-> BUG: kernel NULL pointer dereference, address: 00000000000000c0
|
||||
Call Trace:
|
||||
? __die_body+0x1a/0x60
|
||||
? no_context+0x183/0x350
|
||||
? __warn+0x8a/0xe0
|
||||
? exc_page_fault+0x3d6/0x520
|
||||
? asm_exc_page_fault+0x1e/0x30
|
||||
? pick_next_task_rt+0xb5/0x1d0
|
||||
? pick_next_task_rt+0x8c/0x1d0
|
||||
__schedule+0x583/0x7e0
|
||||
? update_ts_time_stats+0x55/0x70
|
||||
schedule_idle+0x1e/0x40
|
||||
do_idle+0x15e/0x200
|
||||
cpu_startup_entry+0x19/0x20
|
||||
start_secondary+0x117/0x160
|
||||
secondary_startup_64_no_verify+0xb0/0xbb
|
||||
|
||||
-> BUG: unable to handle page fault for address: ffff9464daea5900
|
||||
kernel BUG at kernel/sched/rt.c:1861! BUG_ON(rq->cpu != task_cpu(p))
|
||||
|
||||
-> kernel BUG at kernel/sched/rt.c:1055! BUG_ON(!rq->nr_running)
|
||||
Call Trace:
|
||||
? __die_body+0x1a/0x60
|
||||
? die+0x2a/0x50
|
||||
? do_trap+0x85/0x100
|
||||
? dequeue_top_rt_rq+0xa2/0xb0
|
||||
? do_error_trap+0x64/0xa0
|
||||
? dequeue_top_rt_rq+0xa2/0xb0
|
||||
? exc_invalid_op+0x4c/0x60
|
||||
? dequeue_top_rt_rq+0xa2/0xb0
|
||||
? asm_exc_invalid_op+0x12/0x20
|
||||
? dequeue_top_rt_rq+0xa2/0xb0
|
||||
dequeue_rt_entity+0x1f/0x70
|
||||
dequeue_task_rt+0x2d/0x70
|
||||
__schedule+0x1a8/0x7e0
|
||||
? blk_finish_plug+0x25/0x40
|
||||
schedule+0x3c/0xb0
|
||||
futex_wait_queue_me+0xb6/0x120
|
||||
futex_wait+0xd9/0x240
|
||||
do_futex+0x344/0xa90
|
||||
? get_mm_exe_file+0x30/0x60
|
||||
? audit_exe_compare+0x58/0x70
|
||||
? audit_filter_rules.constprop.26+0x65e/0x1220
|
||||
__x64_sys_futex+0x148/0x1f0
|
||||
do_syscall_64+0x30/0x80
|
||||
entry_SYSCALL_64_after_hwframe+0x62/0xc7
|
||||
|
||||
-> BUG: unable to handle page fault for address: ffff8cf3608bc2c0
|
||||
Call Trace:
|
||||
? __die_body+0x1a/0x60
|
||||
? no_context+0x183/0x350
|
||||
? spurious_kernel_fault+0x171/0x1c0
|
||||
? exc_page_fault+0x3b6/0x520
|
||||
? plist_check_list+0x15/0x40
|
||||
? plist_check_list+0x2e/0x40
|
||||
? asm_exc_page_fault+0x1e/0x30
|
||||
? _cond_resched+0x15/0x30
|
||||
? futex_wait_queue_me+0xc8/0x120
|
||||
? futex_wait+0xd9/0x240
|
||||
? try_to_wake_up+0x1b8/0x490
|
||||
? futex_wake+0x78/0x160
|
||||
? do_futex+0xcd/0xa90
|
||||
? plist_check_list+0x15/0x40
|
||||
? plist_check_list+0x2e/0x40
|
||||
? plist_del+0x6a/0xd0
|
||||
? plist_check_list+0x15/0x40
|
||||
? plist_check_list+0x2e/0x40
|
||||
? dequeue_pushable_task+0x20/0x70
|
||||
? __schedule+0x382/0x7e0
|
||||
? asm_sysvec_reschedule_ipi+0xa/0x20
|
||||
? schedule+0x3c/0xb0
|
||||
? exit_to_user_mode_prepare+0x9e/0x150
|
||||
? irqentry_exit_to_user_mode+0x5/0x30
|
||||
? asm_sysvec_reschedule_ipi+0x12/0x20
|
||||
|
||||
Above are some of the common examples of the crashes that were observed
|
||||
due to this issue.
|
||||
|
||||
Details
|
||||
=======
|
||||
Let's look at the following scenario to understand this race.
|
||||
|
||||
1) CPU A enters push_rt_task
|
||||
a) CPU A has chosen next_task = task p.
|
||||
b) CPU A calls find_lock_lowest_rq(Task p, CPU Z’s rq).
|
||||
c) CPU A identifies CPU X as a destination CPU (X < Z).
|
||||
d) CPU A enters double_lock_balance(CPU Z’s rq, CPU X’s rq).
|
||||
e) Since X is lower than Z, CPU A unlocks CPU Z’s rq. Someone else has
|
||||
locked CPU X’s rq, and thus, CPU A must wait.
|
||||
|
||||
2) At CPU Z
|
||||
a) Previous task has completed execution and thus, CPU Z enters
|
||||
schedule, locks its own rq after CPU A releases it.
|
||||
b) CPU Z dequeues previous task and begins executing task p.
|
||||
c) CPU Z unlocks its rq.
|
||||
d) Task p yields the CPU (ex. by doing IO or waiting to acquire a
|
||||
lock) which triggers the schedule function on CPU Z.
|
||||
e) CPU Z enters schedule again, locks its own rq, and dequeues task p.
|
||||
f) As part of dequeue, it sets p.on_rq = 0 and unlocks its rq.
|
||||
|
||||
3) At CPU B
|
||||
a) CPU B enters try_to_wake_up with input task p.
|
||||
b) Since CPU Z dequeued task p, p.on_rq = 0, and CPU B updates
|
||||
B.state = WAKING.
|
||||
c) CPU B via select_task_rq determines CPU Y as the target CPU.
|
||||
|
||||
4) The race
|
||||
a) CPU A acquires CPU X’s lock and relocks CPU Z.
|
||||
b) CPU A reads task p.cpu = Z and incorrectly concludes task p is
|
||||
still on CPU Z.
|
||||
c) CPU A failed to notice task p had been dequeued from CPU Z while
|
||||
CPU A was waiting for locks in double_lock_balance. If CPU A knew
|
||||
that task p had been dequeued, it would return NULL forcing
|
||||
push_rt_task to give up the task p's migration.
|
||||
d) CPU B updates task p.cpu = Y and calls ttwu_queue.
|
||||
e) CPU B locks Ys rq. CPU B enqueues task p onto Y and sets task
|
||||
p.on_rq = 1.
|
||||
f) CPU B unlocks CPU Y, triggering memory synchronization.
|
||||
g) CPU A reads task p.on_rq = 1, cementing its assumption that task p
|
||||
has not migrated.
|
||||
h) CPU A decides to migrate p to CPU X.
|
||||
|
||||
This leads to A dequeuing p from Y's queue and various crashes down the
|
||||
line.
|
||||
|
||||
Solution
|
||||
========
|
||||
The solution here is fairly simple. After obtaining the lock (at 4a),
|
||||
the check is enhanced to make sure that the task is still at the head of
|
||||
the pushable tasks list. If not, then it is anyway not suitable for
|
||||
being pushed out.
|
||||
|
||||
Testing
|
||||
=======
|
||||
The fix is tested on a cluster of 3 nodes, where the panics due to this
|
||||
are hit every couple of days. A fix similar to this was deployed on such
|
||||
cluster and was stable for more than 30 days.
|
||||
|
||||
Co-developed-by: Jon Kohler <jon@nutanix.com>
|
||||
Signed-off-by: Jon Kohler <jon@nutanix.com>
|
||||
Co-developed-by: Gauri Patwardhan <gauri.patwardhan@nutanix.com>
|
||||
Signed-off-by: Gauri Patwardhan <gauri.patwardhan@nutanix.com>
|
||||
Co-developed-by: Rahul Chunduru <rahul.chunduru@nutanix.com>
|
||||
Signed-off-by: Rahul Chunduru <rahul.chunduru@nutanix.com>
|
||||
Signed-off-by: Harshit Agarwal <harshit@nutanix.com>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: "Steven Rostedt (Google)" <rostedt@goodmis.org>
|
||||
Reviewed-by: Phil Auld <pauld@redhat.com>
|
||||
Tested-by: Will Ton <william.ton@nutanix.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lore.kernel.org/r/20250225180553.167995-1-harshit@nutanix.com
|
||||
---
|
||||
kernel/sched/rt.c | 54 +++++++++++++++++++++++------------------------
|
||||
1 file changed, 26 insertions(+), 28 deletions(-)
|
||||
|
||||
--- a/kernel/sched/rt.c
|
||||
+++ b/kernel/sched/rt.c
|
||||
@@ -1883,6 +1883,27 @@ static int find_lowest_rq(struct task_st
|
||||
return -1;
|
||||
}
|
||||
|
||||
+static struct task_struct *pick_next_pushable_task(struct rq *rq)
|
||||
+{
|
||||
+ struct task_struct *p;
|
||||
+
|
||||
+ if (!has_pushable_tasks(rq))
|
||||
+ return NULL;
|
||||
+
|
||||
+ p = plist_first_entry(&rq->rt.pushable_tasks,
|
||||
+ struct task_struct, pushable_tasks);
|
||||
+
|
||||
+ BUG_ON(rq->cpu != task_cpu(p));
|
||||
+ BUG_ON(task_current(rq, p));
|
||||
+ BUG_ON(task_current_donor(rq, p));
|
||||
+ BUG_ON(p->nr_cpus_allowed <= 1);
|
||||
+
|
||||
+ BUG_ON(!task_on_rq_queued(p));
|
||||
+ BUG_ON(!rt_task(p));
|
||||
+
|
||||
+ return p;
|
||||
+}
|
||||
+
|
||||
/* Will lock the rq it finds */
|
||||
static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq)
|
||||
{
|
||||
@@ -1913,18 +1934,16 @@ static struct rq *find_lock_lowest_rq(st
|
||||
/*
|
||||
* We had to unlock the run queue. In
|
||||
* the mean time, task could have
|
||||
- * migrated already or had its affinity changed.
|
||||
- * Also make sure that it wasn't scheduled on its rq.
|
||||
+ * migrated already or had its affinity changed,
|
||||
+ * therefore check if the task is still at the
|
||||
+ * head of the pushable tasks list.
|
||||
* It is possible the task was scheduled, set
|
||||
* "migrate_disabled" and then got preempted, so we must
|
||||
* check the task migration disable flag here too.
|
||||
*/
|
||||
- if (unlikely(task_rq(task) != rq ||
|
||||
+ if (unlikely(is_migration_disabled(task) ||
|
||||
!cpumask_test_cpu(lowest_rq->cpu, &task->cpus_mask) ||
|
||||
- task_on_cpu(rq, task) ||
|
||||
- !rt_task(task) ||
|
||||
- is_migration_disabled(task) ||
|
||||
- !task_on_rq_queued(task))) {
|
||||
+ task != pick_next_pushable_task(rq))) {
|
||||
|
||||
double_unlock_balance(rq, lowest_rq);
|
||||
lowest_rq = NULL;
|
||||
@@ -1944,27 +1963,6 @@ static struct rq *find_lock_lowest_rq(st
|
||||
return lowest_rq;
|
||||
}
|
||||
|
||||
-static struct task_struct *pick_next_pushable_task(struct rq *rq)
|
||||
-{
|
||||
- struct task_struct *p;
|
||||
-
|
||||
- if (!has_pushable_tasks(rq))
|
||||
- return NULL;
|
||||
-
|
||||
- p = plist_first_entry(&rq->rt.pushable_tasks,
|
||||
- struct task_struct, pushable_tasks);
|
||||
-
|
||||
- BUG_ON(rq->cpu != task_cpu(p));
|
||||
- BUG_ON(task_current(rq, p));
|
||||
- BUG_ON(task_current_donor(rq, p));
|
||||
- BUG_ON(p->nr_cpus_allowed <= 1);
|
||||
-
|
||||
- BUG_ON(!task_on_rq_queued(p));
|
||||
- BUG_ON(!rt_task(p));
|
||||
-
|
||||
- return p;
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* If the current CPU has more than one RT task, see if the non
|
||||
* running task can migrate over to a CPU that is running a task
|
@@ -1,62 +0,0 @@
|
||||
From e02cbdc12bf63da363d7e3391376819241d67fbe Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Tue, 28 Jan 2025 15:39:49 +0100
|
||||
Subject: sched/fair: Adhere to place_entity() constraints
|
||||
|
||||
Mike reports that commit 6d71a9c61604 ("sched/fair: Fix EEVDF entity
|
||||
placement bug causing scheduling lag") relies on commit 4423af84b297
|
||||
("sched/fair: optimize the PLACE_LAG when se->vlag is zero") to not
|
||||
trip a WARN in place_entity().
|
||||
|
||||
What happens is that the lag of the very last entity is 0 per
|
||||
definition -- the average of one element matches the value of that
|
||||
element. Therefore place_entity() will match the condition skipping
|
||||
the lag adjustment:
|
||||
|
||||
if (sched_feat(PLACE_LAG) && cfs_rq->nr_queued && se->vlag) {
|
||||
|
||||
Without the 'se->vlag' condition -- it will attempt to adjust the zero
|
||||
lag even though we're inserting into an empty tree.
|
||||
|
||||
Notably, we should have failed the 'cfs_rq->nr_queued' condition, but
|
||||
don't because they didn't get updated.
|
||||
|
||||
Additionally, move update_load_add() after placement() as is
|
||||
consistent with other place_entity() users -- this change is
|
||||
non-functional, place_entity() does not use cfs_rq->load.
|
||||
|
||||
Fixes: 6d71a9c61604 ("sched/fair: Fix EEVDF entity placement bug causing scheduling lag")
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reported-by: Mike Galbraith <efault@gmx.de>
|
||||
Signed-off-by: "Peter Zijlstra (Intel)" <peterz@infradead.org>
|
||||
Signed-off-by: Mike Galbraith <efault@gmx.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lore.kernel.org/r/c216eb4ef0e0e0029c600aefc69d56681cee5581.camel@gmx.de
|
||||
---
|
||||
kernel/sched/fair.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/kernel/sched/fair.c
|
||||
+++ b/kernel/sched/fair.c
|
||||
@@ -3808,6 +3808,7 @@ static void reweight_entity(struct cfs_r
|
||||
update_entity_lag(cfs_rq, se);
|
||||
se->deadline -= se->vruntime;
|
||||
se->rel_deadline = 1;
|
||||
+ cfs_rq->nr_queued--;
|
||||
if (!curr)
|
||||
__dequeue_entity(cfs_rq, se);
|
||||
update_load_sub(&cfs_rq->load, se->load.weight);
|
||||
@@ -3834,10 +3835,11 @@ static void reweight_entity(struct cfs_r
|
||||
|
||||
enqueue_load_avg(cfs_rq, se);
|
||||
if (se->on_rq) {
|
||||
- update_load_add(&cfs_rq->load, se->load.weight);
|
||||
place_entity(cfs_rq, se, 0);
|
||||
+ update_load_add(&cfs_rq->load, se->load.weight);
|
||||
if (!curr)
|
||||
__enqueue_entity(cfs_rq, se);
|
||||
+ cfs_rq->nr_queued++;
|
||||
|
||||
/*
|
||||
* The entity's vruntime has been adjusted, so let's check
|
@@ -1,184 +0,0 @@
|
||||
From 7257e4f8df6b5783978ab06063fc8529ee2631d5 Mon Sep 17 00:00:00 2001
|
||||
From: Suren Baghdasaryan <surenb@google.com>
|
||||
Date: Wed, 21 May 2025 09:06:02 -0700
|
||||
Subject: alloc_tag: handle module codetag load errors as module load failures
|
||||
|
||||
Failures inside codetag_load_module() are currently ignored. As a result
|
||||
an error there would not cause a module load failure and freeing of the
|
||||
associated resources. Correct this behavior by propagating the error code
|
||||
to the caller and handling possible errors. With this change, error to
|
||||
allocate percpu counters, which happens at this stage, will not be ignored
|
||||
and will cause a module load failure and freeing of resources. With this
|
||||
change we also do not need to disable memory allocation profiling when
|
||||
this error happens, instead we fail to load the module.
|
||||
|
||||
Link: https://lkml.kernel.org/r/20250521160602.1940771-1-surenb@google.com
|
||||
Fixes: 10075262888b ("alloc_tag: allocate percpu counters for module tags dynamically")
|
||||
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
|
||||
Reported-by: Casey Chen <cachen@purestorage.com>
|
||||
Closes: https://lore.kernel.org/all/20250520231620.15259-1-cachen@purestorage.com/
|
||||
Cc: Daniel Gomez <da.gomez@samsung.com>
|
||||
Cc: David Wang <00107082@163.com>
|
||||
Cc: Kent Overstreet <kent.overstreet@linux.dev>
|
||||
Cc: Luis Chamberalin <mcgrof@kernel.org>
|
||||
Cc: Petr Pavlu <petr.pavlu@suse.com>
|
||||
Cc: Sami Tolvanen <samitolvanen@google.com>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
include/linux/codetag.h | 8 ++++----
|
||||
kernel/module/main.c | 5 +++--
|
||||
lib/alloc_tag.c | 12 +++++++-----
|
||||
lib/codetag.c | 34 +++++++++++++++++++++++++---------
|
||||
4 files changed, 39 insertions(+), 20 deletions(-)
|
||||
|
||||
--- a/include/linux/codetag.h
|
||||
+++ b/include/linux/codetag.h
|
||||
@@ -36,8 +36,8 @@ union codetag_ref {
|
||||
struct codetag_type_desc {
|
||||
const char *section;
|
||||
size_t tag_size;
|
||||
- void (*module_load)(struct module *mod,
|
||||
- struct codetag *start, struct codetag *end);
|
||||
+ int (*module_load)(struct module *mod,
|
||||
+ struct codetag *start, struct codetag *end);
|
||||
void (*module_unload)(struct module *mod,
|
||||
struct codetag *start, struct codetag *end);
|
||||
#ifdef CONFIG_MODULES
|
||||
@@ -89,7 +89,7 @@ void *codetag_alloc_module_section(struc
|
||||
unsigned long align);
|
||||
void codetag_free_module_sections(struct module *mod);
|
||||
void codetag_module_replaced(struct module *mod, struct module *new_mod);
|
||||
-void codetag_load_module(struct module *mod);
|
||||
+int codetag_load_module(struct module *mod);
|
||||
void codetag_unload_module(struct module *mod);
|
||||
|
||||
#else /* defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES) */
|
||||
@@ -103,7 +103,7 @@ codetag_alloc_module_section(struct modu
|
||||
unsigned long align) { return NULL; }
|
||||
static inline void codetag_free_module_sections(struct module *mod) {}
|
||||
static inline void codetag_module_replaced(struct module *mod, struct module *new_mod) {}
|
||||
-static inline void codetag_load_module(struct module *mod) {}
|
||||
+static inline int codetag_load_module(struct module *mod) { return 0; }
|
||||
static inline void codetag_unload_module(struct module *mod) {}
|
||||
|
||||
#endif /* defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES) */
|
||||
--- a/kernel/module/main.c
|
||||
+++ b/kernel/module/main.c
|
||||
@@ -3399,11 +3399,12 @@ static int load_module(struct load_info
|
||||
goto sysfs_cleanup;
|
||||
}
|
||||
|
||||
+ if (codetag_load_module(mod))
|
||||
+ goto sysfs_cleanup;
|
||||
+
|
||||
/* Get rid of temporary copy. */
|
||||
free_copy(info, flags);
|
||||
|
||||
- codetag_load_module(mod);
|
||||
-
|
||||
/* Done! */
|
||||
trace_module_load(mod);
|
||||
|
||||
--- a/lib/alloc_tag.c
|
||||
+++ b/lib/alloc_tag.c
|
||||
@@ -618,15 +618,16 @@ out:
|
||||
mas_unlock(&mas);
|
||||
}
|
||||
|
||||
-static void load_module(struct module *mod, struct codetag *start, struct codetag *stop)
|
||||
+static int load_module(struct module *mod, struct codetag *start, struct codetag *stop)
|
||||
{
|
||||
/* Allocate module alloc_tag percpu counters */
|
||||
struct alloc_tag *start_tag;
|
||||
struct alloc_tag *stop_tag;
|
||||
struct alloc_tag *tag;
|
||||
|
||||
+ /* percpu counters for core allocations are already statically allocated */
|
||||
if (!mod)
|
||||
- return;
|
||||
+ return 0;
|
||||
|
||||
start_tag = ct_to_alloc_tag(start);
|
||||
stop_tag = ct_to_alloc_tag(stop);
|
||||
@@ -638,12 +639,13 @@ static void load_module(struct module *m
|
||||
free_percpu(tag->counters);
|
||||
tag->counters = NULL;
|
||||
}
|
||||
- shutdown_mem_profiling(true);
|
||||
- pr_err("Failed to allocate memory for allocation tag percpu counters in the module %s. Memory allocation profiling is disabled!\n",
|
||||
+ pr_err("Failed to allocate memory for allocation tag percpu counters in the module %s\n",
|
||||
mod->name);
|
||||
- break;
|
||||
+ return -ENOMEM;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void replace_module(struct module *mod, struct module *new_mod)
|
||||
--- a/lib/codetag.c
|
||||
+++ b/lib/codetag.c
|
||||
@@ -167,6 +167,7 @@ static int codetag_module_init(struct co
|
||||
{
|
||||
struct codetag_range range;
|
||||
struct codetag_module *cmod;
|
||||
+ int mod_id;
|
||||
int err;
|
||||
|
||||
range = get_section_range(mod, cttype->desc.section);
|
||||
@@ -190,11 +191,20 @@ static int codetag_module_init(struct co
|
||||
cmod->range = range;
|
||||
|
||||
down_write(&cttype->mod_lock);
|
||||
- err = idr_alloc(&cttype->mod_idr, cmod, 0, 0, GFP_KERNEL);
|
||||
- if (err >= 0) {
|
||||
- cttype->count += range_size(cttype, &range);
|
||||
- if (cttype->desc.module_load)
|
||||
- cttype->desc.module_load(mod, range.start, range.stop);
|
||||
+ mod_id = idr_alloc(&cttype->mod_idr, cmod, 0, 0, GFP_KERNEL);
|
||||
+ if (mod_id >= 0) {
|
||||
+ if (cttype->desc.module_load) {
|
||||
+ err = cttype->desc.module_load(mod, range.start, range.stop);
|
||||
+ if (!err)
|
||||
+ cttype->count += range_size(cttype, &range);
|
||||
+ else
|
||||
+ idr_remove(&cttype->mod_idr, mod_id);
|
||||
+ } else {
|
||||
+ cttype->count += range_size(cttype, &range);
|
||||
+ err = 0;
|
||||
+ }
|
||||
+ } else {
|
||||
+ err = mod_id;
|
||||
}
|
||||
up_write(&cttype->mod_lock);
|
||||
|
||||
@@ -295,17 +305,23 @@ void codetag_module_replaced(struct modu
|
||||
mutex_unlock(&codetag_lock);
|
||||
}
|
||||
|
||||
-void codetag_load_module(struct module *mod)
|
||||
+int codetag_load_module(struct module *mod)
|
||||
{
|
||||
struct codetag_type *cttype;
|
||||
+ int ret = 0;
|
||||
|
||||
if (!mod)
|
||||
- return;
|
||||
+ return 0;
|
||||
|
||||
mutex_lock(&codetag_lock);
|
||||
- list_for_each_entry(cttype, &codetag_types, link)
|
||||
- codetag_module_init(cttype, mod);
|
||||
+ list_for_each_entry(cttype, &codetag_types, link) {
|
||||
+ ret = codetag_module_init(cttype, mod);
|
||||
+ if (ret)
|
||||
+ break;
|
||||
+ }
|
||||
mutex_unlock(&codetag_lock);
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
void codetag_unload_module(struct module *mod)
|
@@ -1,29 +0,0 @@
|
||||
From 57fdc30dcdad60e3b868682cc1e77083c091aef5 Mon Sep 17 00:00:00 2001
|
||||
From: Chuck Lever <chuck.lever@oracle.com>
|
||||
Date: Sun, 27 Apr 2025 12:39:59 -0400
|
||||
Subject: svcrdma: Unregister the device if svc_rdma_accept() fails
|
||||
|
||||
To handle device removal, svc_rdma_accept() requests removal
|
||||
notification for the underlying device when accepting a connection.
|
||||
However svc_rdma_free() is not invoked if svc_rdma_accept() fails.
|
||||
There needs to be a matching "unregister" in that case; otherwise
|
||||
the device cannot be removed.
|
||||
|
||||
Fixes: c4de97f7c454 ("svcrdma: Handle device removal outside of the CM event handler")
|
||||
Cc: stable@vger.kernel.org
|
||||
Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev>
|
||||
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
|
||||
---
|
||||
net/sunrpc/xprtrdma/svc_rdma_transport.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
|
||||
+++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
|
||||
@@ -577,6 +577,7 @@ static struct svc_xprt *svc_rdma_accept(
|
||||
if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp))
|
||||
ib_destroy_qp(newxprt->sc_qp);
|
||||
rdma_destroy_id(newxprt->sc_cm_id);
|
||||
+ rpcrdma_rn_unregister(dev, &newxprt->sc_rn);
|
||||
/* This call to put will destroy the transport */
|
||||
svc_xprt_put(&newxprt->sc_xprt);
|
||||
return NULL;
|
@@ -1,53 +0,0 @@
|
||||
From 92e99ba55ff0ce68ea7567331beda21861da2028 Mon Sep 17 00:00:00 2001
|
||||
From: Chuck Lever <chuck.lever@oracle.com>
|
||||
Date: Wed, 21 May 2025 16:34:13 -0400
|
||||
Subject: SUNRPC: Prevent hang on NFS mount with xprtsec=[m]tls
|
||||
|
||||
Engineers at Hammerspace noticed that sometimes mounting with
|
||||
"xprtsec=tls" hangs for a minute or so, and then times out, even
|
||||
when the NFS server is reachable and responsive.
|
||||
|
||||
kTLS shuts off data_ready callbacks if strp->msg_ready is set to
|
||||
mitigate data_ready callbacks when a full TLS record is not yet
|
||||
ready to be read from the socket.
|
||||
|
||||
Normally msg_ready is clear when the first TLS record arrives on
|
||||
a socket. However, I observed that sometimes tls_setsockopt() sets
|
||||
strp->msg_ready, and that prevents forward progress because
|
||||
tls_data_ready() becomes a no-op.
|
||||
|
||||
Moreover, Jakub says: "If there's a full record queued at the time
|
||||
when [tlshd] passes the socket back to the kernel, it's up to the
|
||||
reader to read the already queued data out." So SunRPC cannot
|
||||
expect a data_ready call when ingress data is already waiting.
|
||||
|
||||
Add an explicit poll after SunRPC's upper transport is set up to
|
||||
pick up any data that arrived after the TLS handshake but before
|
||||
transport set-up is complete.
|
||||
|
||||
Reported-by: Steve Sears <sjs@hammerspace.com>
|
||||
Suggested-by: Jakub Kacinski <kuba@kernel.org>
|
||||
Fixes: 75eb6af7acdf ("SUNRPC: Add a TCP-with-TLS RPC transport class")
|
||||
Tested-by: Mike Snitzer <snitzer@kernel.org>
|
||||
Reviewed-by: Mike Snitzer <snitzer@kernel.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
|
||||
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
|
||||
---
|
||||
net/sunrpc/xprtsock.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/net/sunrpc/xprtsock.c
|
||||
+++ b/net/sunrpc/xprtsock.c
|
||||
@@ -2740,6 +2740,11 @@ static void xs_tcp_tls_setup_socket(stru
|
||||
}
|
||||
rpc_shutdown_client(lower_clnt);
|
||||
|
||||
+ /* Check for ingress data that arrived before the socket's
|
||||
+ * ->data_ready callback was set up.
|
||||
+ */
|
||||
+ xs_poll_check_readable(upper_transport);
|
||||
+
|
||||
out_unlock:
|
||||
current_restore_flags(pflags, PF_MEMALLOC);
|
||||
upper_transport->clnt = NULL;
|
@@ -1,89 +0,0 @@
|
||||
From ac0c5ac5efecec7f731a1d80ec40ef3d34adc5ee Mon Sep 17 00:00:00 2001
|
||||
From: Saurabh Sengar <ssengar@linux.microsoft.com>
|
||||
Date: Thu, 29 May 2025 03:18:30 -0700
|
||||
Subject: hv_netvsc: fix potential deadlock in netvsc_vf_setxdp()
|
||||
|
||||
The MANA driver's probe registers netdevice via the following call chain:
|
||||
|
||||
mana_probe()
|
||||
register_netdev()
|
||||
register_netdevice()
|
||||
|
||||
register_netdevice() calls notifier callback for netvsc driver,
|
||||
holding the netdev mutex via netdev_lock_ops().
|
||||
|
||||
Further this netvsc notifier callback end up attempting to acquire the
|
||||
same lock again in dev_xdp_propagate() leading to deadlock.
|
||||
|
||||
netvsc_netdev_event()
|
||||
netvsc_vf_setxdp()
|
||||
dev_xdp_propagate()
|
||||
|
||||
This deadlock was not observed so far because net_shaper_ops was never set,
|
||||
and thus the lock was effectively a no-op in this case. Fix this by using
|
||||
netif_xdp_propagate() instead of dev_xdp_propagate() to avoid recursive
|
||||
locking in this path.
|
||||
|
||||
And, since no deadlock is observed on the other path which is via
|
||||
netvsc_probe, add the lock exclusivly for that path.
|
||||
|
||||
Also, clean up the unregistration path by removing the unnecessary call to
|
||||
netvsc_vf_setxdp(), since unregister_netdevice_many_notify() already
|
||||
performs this cleanup via dev_xdp_uninstall().
|
||||
|
||||
Fixes: 97246d6d21c2 ("net: hold netdev instance lock during ndo_bpf")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Saurabh Sengar <ssengar@linux.microsoft.com>
|
||||
Tested-by: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
|
||||
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
|
||||
Reviewed-by: Subbaraya Sundeep <sbhatta@marvell.com>
|
||||
Link: https://patch.msgid.link/1748513910-23963-1-git-send-email-ssengar@linux.microsoft.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/hyperv/netvsc_bpf.c | 2 +-
|
||||
drivers/net/hyperv/netvsc_drv.c | 4 ++--
|
||||
net/core/dev.c | 1 +
|
||||
3 files changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/hyperv/netvsc_bpf.c
|
||||
+++ b/drivers/net/hyperv/netvsc_bpf.c
|
||||
@@ -183,7 +183,7 @@ int netvsc_vf_setxdp(struct net_device *
|
||||
xdp.command = XDP_SETUP_PROG;
|
||||
xdp.prog = prog;
|
||||
|
||||
- ret = dev_xdp_propagate(vf_netdev, &xdp);
|
||||
+ ret = netif_xdp_propagate(vf_netdev, &xdp);
|
||||
|
||||
if (ret && prog)
|
||||
bpf_prog_put(prog);
|
||||
--- a/drivers/net/hyperv/netvsc_drv.c
|
||||
+++ b/drivers/net/hyperv/netvsc_drv.c
|
||||
@@ -2462,8 +2462,6 @@ static int netvsc_unregister_vf(struct n
|
||||
|
||||
netdev_info(ndev, "VF unregistering: %s\n", vf_netdev->name);
|
||||
|
||||
- netvsc_vf_setxdp(vf_netdev, NULL);
|
||||
-
|
||||
reinit_completion(&net_device_ctx->vf_add);
|
||||
netdev_rx_handler_unregister(vf_netdev);
|
||||
netdev_upper_dev_unlink(vf_netdev, ndev);
|
||||
@@ -2631,7 +2629,9 @@ static int netvsc_probe(struct hv_device
|
||||
continue;
|
||||
|
||||
netvsc_prepare_bonding(vf_netdev);
|
||||
+ netdev_lock_ops(vf_netdev);
|
||||
netvsc_register_vf(vf_netdev, VF_REG_IN_PROBE);
|
||||
+ netdev_unlock_ops(vf_netdev);
|
||||
__netvsc_vf_setup(net, vf_netdev);
|
||||
break;
|
||||
}
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -9863,6 +9863,7 @@ int netif_xdp_propagate(struct net_devic
|
||||
|
||||
return dev->netdev_ops->ndo_bpf(dev, bpf);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(netif_xdp_propagate);
|
||||
|
||||
u32 dev_xdp_prog_id(struct net_device *dev, enum bpf_xdp_mode mode)
|
||||
{
|
@@ -1,113 +0,0 @@
|
||||
From 485c82a86fb97fb86cac303348c85b6cf71fd787 Mon Sep 17 00:00:00 2001
|
||||
From: Jakub Kicinski <kuba@kernel.org>
|
||||
Date: Mon, 9 Jun 2025 17:12:44 -0700
|
||||
Subject: net: clear the dst when changing skb protocol
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
A not-so-careful NAT46 BPF program can crash the kernel
|
||||
if it indiscriminately flips ingress packets from v4 to v6:
|
||||
|
||||
BUG: kernel NULL pointer dereference, address: 0000000000000000
|
||||
ip6_rcv_core (net/ipv6/ip6_input.c:190:20)
|
||||
ipv6_rcv (net/ipv6/ip6_input.c:306:8)
|
||||
process_backlog (net/core/dev.c:6186:4)
|
||||
napi_poll (net/core/dev.c:6906:9)
|
||||
net_rx_action (net/core/dev.c:7028:13)
|
||||
do_softirq (kernel/softirq.c:462:3)
|
||||
netif_rx (net/core/dev.c:5326:3)
|
||||
dev_loopback_xmit (net/core/dev.c:4015:2)
|
||||
ip_mc_finish_output (net/ipv4/ip_output.c:363:8)
|
||||
NF_HOOK (./include/linux/netfilter.h:314:9)
|
||||
ip_mc_output (net/ipv4/ip_output.c:400:5)
|
||||
dst_output (./include/net/dst.h:459:9)
|
||||
ip_local_out (net/ipv4/ip_output.c:130:9)
|
||||
ip_send_skb (net/ipv4/ip_output.c:1496:8)
|
||||
udp_send_skb (net/ipv4/udp.c:1040:8)
|
||||
udp_sendmsg (net/ipv4/udp.c:1328:10)
|
||||
|
||||
The output interface has a 4->6 program attached at ingress.
|
||||
We try to loop the multicast skb back to the sending socket.
|
||||
Ingress BPF runs as part of netif_rx(), pushes a valid v6 hdr
|
||||
and changes skb->protocol to v6. We enter ip6_rcv_core which
|
||||
tries to use skb_dst(). But the dst is still an IPv4 one left
|
||||
after IPv4 mcast output.
|
||||
|
||||
Clear the dst in all BPF helpers which change the protocol.
|
||||
Try to preserve metadata dsts, those may carry non-routing
|
||||
metadata.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Reviewed-by: Maciej Żenczykowski <maze@google.com>
|
||||
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
|
||||
Fixes: d219df60a70e ("bpf: Add ipip6 and ip6ip decap support for bpf_skb_adjust_room()")
|
||||
Fixes: 1b00e0dfe7d0 ("bpf: update skb->protocol in bpf_skb_net_grow")
|
||||
Fixes: 6578171a7ff0 ("bpf: add bpf_skb_change_proto helper")
|
||||
Reviewed-by: Willem de Bruijn <willemb@google.com>
|
||||
Link: https://patch.msgid.link/20250610001245.1981782-1-kuba@kernel.org
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
net/core/filter.c | 19 +++++++++++++------
|
||||
1 file changed, 13 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/net/core/filter.c
|
||||
+++ b/net/core/filter.c
|
||||
@@ -3233,6 +3233,13 @@ static const struct bpf_func_proto bpf_s
|
||||
.arg1_type = ARG_PTR_TO_CTX,
|
||||
};
|
||||
|
||||
+static void bpf_skb_change_protocol(struct sk_buff *skb, u16 proto)
|
||||
+{
|
||||
+ skb->protocol = htons(proto);
|
||||
+ if (skb_valid_dst(skb))
|
||||
+ skb_dst_drop(skb);
|
||||
+}
|
||||
+
|
||||
static int bpf_skb_generic_push(struct sk_buff *skb, u32 off, u32 len)
|
||||
{
|
||||
/* Caller already did skb_cow() with len as headroom,
|
||||
@@ -3329,7 +3336,7 @@ static int bpf_skb_proto_4_to_6(struct s
|
||||
}
|
||||
}
|
||||
|
||||
- skb->protocol = htons(ETH_P_IPV6);
|
||||
+ bpf_skb_change_protocol(skb, ETH_P_IPV6);
|
||||
skb_clear_hash(skb);
|
||||
|
||||
return 0;
|
||||
@@ -3359,7 +3366,7 @@ static int bpf_skb_proto_6_to_4(struct s
|
||||
}
|
||||
}
|
||||
|
||||
- skb->protocol = htons(ETH_P_IP);
|
||||
+ bpf_skb_change_protocol(skb, ETH_P_IP);
|
||||
skb_clear_hash(skb);
|
||||
|
||||
return 0;
|
||||
@@ -3550,10 +3557,10 @@ static int bpf_skb_net_grow(struct sk_bu
|
||||
/* Match skb->protocol to new outer l3 protocol */
|
||||
if (skb->protocol == htons(ETH_P_IP) &&
|
||||
flags & BPF_F_ADJ_ROOM_ENCAP_L3_IPV6)
|
||||
- skb->protocol = htons(ETH_P_IPV6);
|
||||
+ bpf_skb_change_protocol(skb, ETH_P_IPV6);
|
||||
else if (skb->protocol == htons(ETH_P_IPV6) &&
|
||||
flags & BPF_F_ADJ_ROOM_ENCAP_L3_IPV4)
|
||||
- skb->protocol = htons(ETH_P_IP);
|
||||
+ bpf_skb_change_protocol(skb, ETH_P_IP);
|
||||
}
|
||||
|
||||
if (skb_is_gso(skb)) {
|
||||
@@ -3606,10 +3613,10 @@ static int bpf_skb_net_shrink(struct sk_
|
||||
/* Match skb->protocol to new outer l3 protocol */
|
||||
if (skb->protocol == htons(ETH_P_IP) &&
|
||||
flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV6)
|
||||
- skb->protocol = htons(ETH_P_IPV6);
|
||||
+ bpf_skb_change_protocol(skb, ETH_P_IPV6);
|
||||
else if (skb->protocol == htons(ETH_P_IPV6) &&
|
||||
flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV4)
|
||||
- skb->protocol = htons(ETH_P_IP);
|
||||
+ bpf_skb_change_protocol(skb, ETH_P_IP);
|
||||
|
||||
if (skb_is_gso(skb)) {
|
||||
struct skb_shared_info *shinfo = skb_shinfo(skb);
|
@@ -1,67 +0,0 @@
|
||||
From 2bf1f4a3adcecc53c1012e460d1412cece3747ce Mon Sep 17 00:00:00 2001
|
||||
From: Eric Dumazet <edumazet@google.com>
|
||||
Date: Wed, 11 Jun 2025 08:35:01 +0000
|
||||
Subject: net_sched: sch_sfq: reject invalid perturb period
|
||||
|
||||
Gerrard Tai reported that SFQ perturb_period has no range check yet,
|
||||
and this can be used to trigger a race condition fixed in a separate patch.
|
||||
|
||||
We want to make sure ctl->perturb_period * HZ will not overflow
|
||||
and is positive.
|
||||
|
||||
Tested:
|
||||
|
||||
tc qd add dev lo root sfq perturb -10 # negative value : error
|
||||
Error: sch_sfq: invalid perturb period.
|
||||
|
||||
tc qd add dev lo root sfq perturb 1000000000 # too big : error
|
||||
Error: sch_sfq: invalid perturb period.
|
||||
|
||||
tc qd add dev lo root sfq perturb 2000000 # acceptable value
|
||||
tc -s -d qd sh dev lo
|
||||
qdisc sfq 8005: root refcnt 2 limit 127p quantum 64Kb depth 127 flows 128 divisor 1024 perturb 2000000sec
|
||||
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
|
||||
backlog 0b 0p requeues 0
|
||||
|
||||
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
|
||||
Reported-by: Gerrard Tai <gerrard.tai@starlabs.sg>
|
||||
Signed-off-by: Eric Dumazet <edumazet@google.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://patch.msgid.link/20250611083501.1810459-1-edumazet@google.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
net/sched/sch_sfq.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/net/sched/sch_sfq.c
|
||||
+++ b/net/sched/sch_sfq.c
|
||||
@@ -656,6 +656,14 @@ static int sfq_change(struct Qdisc *sch,
|
||||
NL_SET_ERR_MSG_MOD(extack, "invalid quantum");
|
||||
return -EINVAL;
|
||||
}
|
||||
+
|
||||
+ if (ctl->perturb_period < 0 ||
|
||||
+ ctl->perturb_period > INT_MAX / HZ) {
|
||||
+ NL_SET_ERR_MSG_MOD(extack, "invalid perturb period");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ perturb_period = ctl->perturb_period * HZ;
|
||||
+
|
||||
if (ctl_v1 && !red_check_params(ctl_v1->qth_min, ctl_v1->qth_max,
|
||||
ctl_v1->Wlog, ctl_v1->Scell_log, NULL))
|
||||
return -EINVAL;
|
||||
@@ -672,14 +680,12 @@ static int sfq_change(struct Qdisc *sch,
|
||||
headdrop = q->headdrop;
|
||||
maxdepth = q->maxdepth;
|
||||
maxflows = q->maxflows;
|
||||
- perturb_period = q->perturb_period;
|
||||
quantum = q->quantum;
|
||||
flags = q->flags;
|
||||
|
||||
/* update and validate configuration */
|
||||
if (ctl->quantum)
|
||||
quantum = ctl->quantum;
|
||||
- perturb_period = ctl->perturb_period * HZ;
|
||||
if (ctl->flows)
|
||||
maxflows = min_t(u32, ctl->flows, SFQ_MAX_FLOWS);
|
||||
if (ctl->divisor) {
|
@@ -1,93 +0,0 @@
|
||||
From 90a5248443f925040b46e32fcf6715615c73e396 Mon Sep 17 00:00:00 2001
|
||||
From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Date: Fri, 6 Jun 2025 13:50:32 +0100
|
||||
Subject: mm/vma: reset VMA iterator on commit_merge() OOM failure
|
||||
|
||||
While an OOM failure in commit_merge() isn't really feasible due to the
|
||||
allocation which might fail (a maple tree pre-allocation) being 'too small
|
||||
to fail', we do need to handle this case correctly regardless.
|
||||
|
||||
In vma_merge_existing_range(), we can theoretically encounter failures
|
||||
which result in an OOM error in two ways - firstly dup_anon_vma() might
|
||||
fail with an OOM error, and secondly commit_merge() failing, ultimately,
|
||||
to pre-allocate a maple tree node.
|
||||
|
||||
The abort logic for dup_anon_vma() resets the VMA iterator to the initial
|
||||
range, ensuring that any logic looping on this iterator will correctly
|
||||
proceed to the next VMA.
|
||||
|
||||
However the commit_merge() abort logic does not do the same thing. This
|
||||
resulted in a syzbot report occurring because mlockall() iterates through
|
||||
VMAs, is tolerant of errors, but ended up with an incorrect previous VMA
|
||||
being specified due to incorrect iterator state.
|
||||
|
||||
While making this change, it became apparent we are duplicating logic -
|
||||
the logic introduced in commit 41e6ddcaa0f1 ("mm/vma: add give_up_on_oom
|
||||
option on modify/merge, use in uffd release") duplicates the
|
||||
vmg->give_up_on_oom check in both abort branches.
|
||||
|
||||
Additionally, we observe that we can perform the anon_dup check safely on
|
||||
dup_anon_vma() failure, as this will not be modified should this call
|
||||
fail.
|
||||
|
||||
Finally, we need to reset the iterator in both cases, so now we can simply
|
||||
use the exact same code to abort for both.
|
||||
|
||||
We remove the VM_WARN_ON(err != -ENOMEM) as it would be silly for this to
|
||||
be otherwise and it allows us to implement the abort check more neatly.
|
||||
|
||||
Link: https://lkml.kernel.org/r/20250606125032.164249-1-lorenzo.stoakes@oracle.com
|
||||
Fixes: 47b16d0462a4 ("mm: abort vma_modify() on merge out of memory failure")
|
||||
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Reported-by: syzbot+d16409ea9ecc16ed261a@syzkaller.appspotmail.com
|
||||
Closes: https://lore.kernel.org/linux-mm/6842cc67.a00a0220.29ac89.003b.GAE@google.com/
|
||||
Reviewed-by: Pedro Falcato <pfalcato@suse.de>
|
||||
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
|
||||
Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
|
||||
Cc: Jann Horn <jannh@google.com>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
mm/vma.c | 22 ++++------------------
|
||||
1 file changed, 4 insertions(+), 18 deletions(-)
|
||||
|
||||
--- a/mm/vma.c
|
||||
+++ b/mm/vma.c
|
||||
@@ -927,26 +927,9 @@ static __must_check struct vm_area_struc
|
||||
err = dup_anon_vma(next, middle, &anon_dup);
|
||||
}
|
||||
|
||||
- if (err)
|
||||
+ if (err || commit_merge(vmg))
|
||||
goto abort;
|
||||
|
||||
- err = commit_merge(vmg);
|
||||
- if (err) {
|
||||
- VM_WARN_ON(err != -ENOMEM);
|
||||
-
|
||||
- if (anon_dup)
|
||||
- unlink_anon_vmas(anon_dup);
|
||||
-
|
||||
- /*
|
||||
- * We've cleaned up any cloned anon_vma's, no VMAs have been
|
||||
- * modified, no harm no foul if the user requests that we not
|
||||
- * report this and just give up, leaving the VMAs unmerged.
|
||||
- */
|
||||
- if (!vmg->give_up_on_oom)
|
||||
- vmg->state = VMA_MERGE_ERROR_NOMEM;
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
khugepaged_enter_vma(vmg->target, vmg->flags);
|
||||
vmg->state = VMA_MERGE_SUCCESS;
|
||||
return vmg->target;
|
||||
@@ -955,6 +938,9 @@ abort:
|
||||
vma_iter_set(vmg->vmi, start);
|
||||
vma_iter_load(vmg->vmi);
|
||||
|
||||
+ if (anon_dup)
|
||||
+ unlink_anon_vmas(anon_dup);
|
||||
+
|
||||
/*
|
||||
* This means we have failed to clone anon_vma's correctly, but no
|
||||
* actual changes to VMAs have occurred, so no harm no foul - if the
|
@@ -1,90 +0,0 @@
|
||||
From 7c9d5350d8acfe1b876a8acabdf247b44a803d58 Mon Sep 17 00:00:00 2001
|
||||
From: Ryan Roberts <ryan.roberts@arm.com>
|
||||
Date: Fri, 6 Jun 2025 10:28:07 +0100
|
||||
Subject: mm: close theoretical race where stale TLB entries could linger
|
||||
|
||||
Commit 3ea277194daa ("mm, mprotect: flush TLB if potentially racing with a
|
||||
parallel reclaim leaving stale TLB entries") described a theoretical race
|
||||
as such:
|
||||
|
||||
|
||||
"""
|
||||
Nadav Amit identified a theoretical race between page reclaim and mprotect
|
||||
due to TLB flushes being batched outside of the PTL being held.
|
||||
|
||||
He described the race as follows:
|
||||
|
||||
CPU0 CPU1
|
||||
---- ----
|
||||
user accesses memory using RW PTE
|
||||
[PTE now cached in TLB]
|
||||
try_to_unmap_one()
|
||||
==> ptep_get_and_clear()
|
||||
==> set_tlb_ubc_flush_pending()
|
||||
mprotect(addr, PROT_READ)
|
||||
==> change_pte_range()
|
||||
==> [ PTE non-present - no flush ]
|
||||
|
||||
user writes using cached RW PTE
|
||||
...
|
||||
|
||||
try_to_unmap_flush()
|
||||
|
||||
The same type of race exists for reads when protecting for PROT_NONE and
|
||||
also exists for operations that can leave an old TLB entry behind such as
|
||||
munmap, mremap and madvise.
|
||||
"""
|
||||
|
||||
The solution was to introduce flush_tlb_batched_pending() and call it
|
||||
under the PTL from mprotect/madvise/munmap/mremap to complete any pending
|
||||
tlb flushes.
|
||||
|
||||
However, while madvise_free_pte_range() and
|
||||
madvise_cold_or_pageout_pte_range() were both retro-fitted to call
|
||||
flush_tlb_batched_pending() immediately after initially acquiring the PTL,
|
||||
they both temporarily release the PTL to split a large folio if they
|
||||
stumble upon one. In this case, where re-acquiring the PTL
|
||||
flush_tlb_batched_pending() must be called again, but it previously was
|
||||
not. Let's fix that.
|
||||
|
||||
There are 2 Fixes: tags here: the first is the commit that fixed
|
||||
madvise_free_pte_range(). The second is the commit that added
|
||||
madvise_cold_or_pageout_pte_range(), which looks like it copy/pasted the
|
||||
faulty pattern from madvise_free_pte_range().
|
||||
|
||||
This is a theoretical bug discovered during code review.
|
||||
|
||||
Link: https://lkml.kernel.org/r/20250606092809.4194056-1-ryan.roberts@arm.com
|
||||
Fixes: 3ea277194daa ("mm, mprotect: flush TLB if potentially racing with a parallel reclaim leaving stale TLB entries")
|
||||
Fixes: 9c276cc65a58 ("mm: introduce MADV_COLD")
|
||||
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
|
||||
Reviewed-by: Jann Horn <jannh@google.com>
|
||||
Acked-by: David Hildenbrand <david@redhat.com>
|
||||
Cc: Liam Howlett <liam.howlett@oracle.com>
|
||||
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
|
||||
Cc: Mel Gorman <mgorman <mgorman@suse.de>
|
||||
Cc: Vlastimil Babka <vbabka@suse.cz>
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
mm/madvise.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/mm/madvise.c
|
||||
+++ b/mm/madvise.c
|
||||
@@ -503,6 +503,7 @@ restart:
|
||||
pte_offset_map_lock(mm, pmd, addr, &ptl);
|
||||
if (!start_pte)
|
||||
break;
|
||||
+ flush_tlb_batched_pending(mm);
|
||||
arch_enter_lazy_mmu_mode();
|
||||
if (!err)
|
||||
nr = 0;
|
||||
@@ -736,6 +737,7 @@ static int madvise_free_pte_range(pmd_t
|
||||
start_pte = pte;
|
||||
if (!start_pte)
|
||||
break;
|
||||
+ flush_tlb_batched_pending(mm);
|
||||
arch_enter_lazy_mmu_mode();
|
||||
if (!err)
|
||||
nr = 0;
|
@@ -1,33 +0,0 @@
|
||||
From 862a81c79f0bea8ede0352b637b44716f02f71b9 Mon Sep 17 00:00:00 2001
|
||||
From: Jens Axboe <axboe@kernel.dk>
|
||||
Date: Fri, 13 Jun 2025 11:01:49 -0600
|
||||
Subject: io_uring/kbuf: don't truncate end buffer for multiple buffer peeks
|
||||
|
||||
If peeking a bunch of buffers, normally io_ring_buffers_peek() will
|
||||
truncate the end buffer. This isn't optimal as presumably more data will
|
||||
be arriving later, and hence it's better to stop with the last full
|
||||
buffer rather than truncate the end buffer.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 35c8711c8fc4 ("io_uring/kbuf: add helpers for getting/peeking multiple buffers")
|
||||
Reported-by: Christian Mazakas <christian.mazakas@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
io_uring/kbuf.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/io_uring/kbuf.c
|
||||
+++ b/io_uring/kbuf.c
|
||||
@@ -270,8 +270,11 @@ static int io_ring_buffers_peek(struct i
|
||||
/* truncate end piece, if needed, for non partial buffers */
|
||||
if (len > arg->max_len) {
|
||||
len = arg->max_len;
|
||||
- if (!(bl->flags & IOBL_INC))
|
||||
+ if (!(bl->flags & IOBL_INC)) {
|
||||
+ if (iov != arg->iovs)
|
||||
+ break;
|
||||
buf->len = len;
|
||||
+ }
|
||||
}
|
||||
|
||||
iov->iov_base = u64_to_user_ptr(buf->addr);
|
@@ -1,54 +0,0 @@
|
||||
From bb3d761325a1707c8064a3d7dd556ed6a501a2e7 Mon Sep 17 00:00:00 2001
|
||||
From: Jens Axboe <axboe@kernel.dk>
|
||||
Date: Fri, 13 Jun 2025 13:37:41 -0600
|
||||
Subject: nvme: always punt polled uring_cmd end_io work to task_work
|
||||
|
||||
Currently NVMe uring_cmd completions will complete locally, if they are
|
||||
polled. This is done because those completions are always invoked from
|
||||
task context. And while that is true, there's no guarantee that it's
|
||||
invoked under the right ring context, or even task. If someone does
|
||||
NVMe passthrough via multiple threads and with a limited number of
|
||||
poll queues, then ringA may find completions from ringB. For that case,
|
||||
completing the request may not be sound.
|
||||
|
||||
Always just punt the passthrough completions via task_work, which will
|
||||
redirect the completion, if needed.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 585079b6e425 ("nvme: wire up async polling for io passthrough commands")
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
drivers/nvme/host/ioctl.c | 21 +++++++--------------
|
||||
1 file changed, 7 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/drivers/nvme/host/ioctl.c
|
||||
+++ b/drivers/nvme/host/ioctl.c
|
||||
@@ -429,21 +429,14 @@ static enum rq_end_io_ret nvme_uring_cmd
|
||||
pdu->result = le64_to_cpu(nvme_req(req)->result.u64);
|
||||
|
||||
/*
|
||||
- * For iopoll, complete it directly. Note that using the uring_cmd
|
||||
- * helper for this is safe only because we check blk_rq_is_poll().
|
||||
- * As that returns false if we're NOT on a polled queue, then it's
|
||||
- * safe to use the polled completion helper.
|
||||
- *
|
||||
- * Otherwise, move the completion to task work.
|
||||
+ * IOPOLL could potentially complete this request directly, but
|
||||
+ * if multiple rings are polling on the same queue, then it's possible
|
||||
+ * for one ring to find completions for another ring. Punting the
|
||||
+ * completion via task_work will always direct it to the right
|
||||
+ * location, rather than potentially complete requests for ringA
|
||||
+ * under iopoll invocations from ringB.
|
||||
*/
|
||||
- if (blk_rq_is_poll(req)) {
|
||||
- if (pdu->bio)
|
||||
- blk_rq_unmap_user(pdu->bio);
|
||||
- io_uring_cmd_iopoll_done(ioucmd, pdu->result, pdu->status);
|
||||
- } else {
|
||||
- io_uring_cmd_do_in_task_lazy(ioucmd, nvme_uring_task_cb);
|
||||
- }
|
||||
-
|
||||
+ io_uring_cmd_do_in_task_lazy(ioucmd, nvme_uring_task_cb);
|
||||
return RQ_END_IO_FREE;
|
||||
}
|
||||
|
@@ -1,33 +0,0 @@
|
||||
From a57621608b2cbcbd0c7da184e9012b9b111a8577 Mon Sep 17 00:00:00 2001
|
||||
From: Damien Le Moal <dlemoal@kernel.org>
|
||||
Date: Wed, 11 Jun 2025 09:59:15 +0900
|
||||
Subject: block: Clear BIO_EMULATES_ZONE_APPEND flag on BIO completion
|
||||
|
||||
When blk_zone_write_plug_bio_endio() is called for a regular write BIO
|
||||
used to emulate a zone append operation, that is, a BIO flagged with
|
||||
BIO_EMULATES_ZONE_APPEND, the BIO operation code is restored to the
|
||||
original REQ_OP_ZONE_APPEND but the BIO_EMULATES_ZONE_APPEND flag is not
|
||||
cleared. Clear it to fully return the BIO to its orginal definition.
|
||||
|
||||
Fixes: 9b1ce7f0c6f8 ("block: Implement zone append emulation")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
|
||||
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
|
||||
Reviewed-by: Hannes Reinecke <hare@suse.de>
|
||||
Reviewed-by: Christoph Hellwig <hch@lst.de>
|
||||
Link: https://lore.kernel.org/r/20250611005915.89843-1-dlemoal@kernel.org
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/blk-zoned.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/block/blk-zoned.c
|
||||
+++ b/block/blk-zoned.c
|
||||
@@ -1225,6 +1225,7 @@ void blk_zone_write_plug_bio_endio(struc
|
||||
if (bio_flagged(bio, BIO_EMULATES_ZONE_APPEND)) {
|
||||
bio->bi_opf &= ~REQ_OP_MASK;
|
||||
bio->bi_opf |= REQ_OP_ZONE_APPEND;
|
||||
+ bio_clear_flag(bio, BIO_EMULATES_ZONE_APPEND);
|
||||
}
|
||||
|
||||
/*
|
@@ -1,65 +0,0 @@
|
||||
From 7fc5a2cbcc8459cab6ae8c5dd1220768027ccb70 Mon Sep 17 00:00:00 2001
|
||||
From: Jens Axboe <axboe@kernel.dk>
|
||||
Date: Wed, 11 Jun 2025 08:48:46 -0600
|
||||
Subject: block: use plug request list tail for one-shot backmerge attempt
|
||||
|
||||
Previously, the block layer stored the requests in the plug list in
|
||||
LIFO order. For this reason, blk_attempt_plug_merge() would check
|
||||
just the head entry for a back merge attempt, and abort after that
|
||||
unless requests for multiple queues existed in the plug list. If more
|
||||
than one request is present in the plug list, this makes the one-shot
|
||||
back merging less useful than before, as it'll always fail to find a
|
||||
quick merge candidate.
|
||||
|
||||
Use the tail entry for the one-shot merge attempt, which is the last
|
||||
added request in the list. If that fails, abort immediately unless
|
||||
there are multiple queues available. If multiple queues are available,
|
||||
then scan the list. Ideally the latter scan would be a backwards scan
|
||||
of the list, but as it currently stands, the plug list is singly linked
|
||||
and hence this isn't easily feasible.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lore.kernel.org/linux-block/20250611121626.7252-1-abuehaze@amazon.com/
|
||||
Reported-by: Hazem Mohamed Abuelfotoh <abuehaze@amazon.com>
|
||||
Fixes: e70c301faece ("block: don't reorder requests in blk_add_rq_to_plug")
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/blk-merge.c | 26 +++++++++++++-------------
|
||||
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/block/blk-merge.c
|
||||
+++ b/block/blk-merge.c
|
||||
@@ -1127,20 +1127,20 @@ bool blk_attempt_plug_merge(struct reque
|
||||
if (!plug || rq_list_empty(&plug->mq_list))
|
||||
return false;
|
||||
|
||||
- rq_list_for_each(&plug->mq_list, rq) {
|
||||
- if (rq->q == q) {
|
||||
- if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) ==
|
||||
- BIO_MERGE_OK)
|
||||
- return true;
|
||||
- break;
|
||||
- }
|
||||
+ rq = plug->mq_list.tail;
|
||||
+ if (rq->q == q)
|
||||
+ return blk_attempt_bio_merge(q, rq, bio, nr_segs, false) ==
|
||||
+ BIO_MERGE_OK;
|
||||
+ else if (!plug->multiple_queues)
|
||||
+ return false;
|
||||
|
||||
- /*
|
||||
- * Only keep iterating plug list for merges if we have multiple
|
||||
- * queues
|
||||
- */
|
||||
- if (!plug->multiple_queues)
|
||||
- break;
|
||||
+ rq_list_for_each(&plug->mq_list, rq) {
|
||||
+ if (rq->q != q)
|
||||
+ continue;
|
||||
+ if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) ==
|
||||
+ BIO_MERGE_OK)
|
||||
+ return true;
|
||||
+ break;
|
||||
}
|
||||
return false;
|
||||
}
|
@@ -1,149 +0,0 @@
|
||||
From 8ad4520fc849262ab23adbabebd366d4755035bc Mon Sep 17 00:00:00 2001
|
||||
From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
|
||||
Date: Tue, 3 Jun 2025 14:14:45 +0300
|
||||
Subject: Revert "mm/execmem: Unify early execmem_cache behaviour"
|
||||
|
||||
The commit d6d1e3e6580c ("mm/execmem: Unify early execmem_cache
|
||||
behaviour") changed early behaviour of execemem ROX cache to allow its
|
||||
usage in early x86 code that allocates text pages when
|
||||
CONFIG_MITGATION_ITS is enabled.
|
||||
|
||||
The permission management of the pages allocated from execmem for ITS
|
||||
mitigation is now completely contained in arch/x86/kernel/alternatives.c
|
||||
and therefore there is no need to special case early allocations in
|
||||
execmem.
|
||||
|
||||
This reverts commit d6d1e3e6580ca35071ad474381f053cbf1fb6414.
|
||||
|
||||
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lkml.kernel.org/r/20250603111446.2609381-6-rppt@kernel.org
|
||||
---
|
||||
arch/x86/mm/init_32.c | 3 ---
|
||||
arch/x86/mm/init_64.c | 3 ---
|
||||
include/linux/execmem.h | 8 +-------
|
||||
mm/execmem.c | 40 +++-------------------------------------
|
||||
4 files changed, 4 insertions(+), 50 deletions(-)
|
||||
|
||||
--- a/arch/x86/mm/init_32.c
|
||||
+++ b/arch/x86/mm/init_32.c
|
||||
@@ -30,7 +30,6 @@
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/gfp.h>
|
||||
-#include <linux/execmem.h>
|
||||
|
||||
#include <asm/asm.h>
|
||||
#include <asm/bios_ebda.h>
|
||||
@@ -756,8 +755,6 @@ void mark_rodata_ro(void)
|
||||
pr_info("Write protecting kernel text and read-only data: %luk\n",
|
||||
size >> 10);
|
||||
|
||||
- execmem_cache_make_ro();
|
||||
-
|
||||
kernel_set_to_readonly = 1;
|
||||
|
||||
#ifdef CONFIG_CPA_DEBUG
|
||||
--- a/arch/x86/mm/init_64.c
|
||||
+++ b/arch/x86/mm/init_64.c
|
||||
@@ -34,7 +34,6 @@
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/kcore.h>
|
||||
#include <linux/bootmem_info.h>
|
||||
-#include <linux/execmem.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/bios_ebda.h>
|
||||
@@ -1392,8 +1391,6 @@ void mark_rodata_ro(void)
|
||||
(end - start) >> 10);
|
||||
set_memory_ro(start, (end - start) >> PAGE_SHIFT);
|
||||
|
||||
- execmem_cache_make_ro();
|
||||
-
|
||||
kernel_set_to_readonly = 1;
|
||||
|
||||
/*
|
||||
--- a/include/linux/execmem.h
|
||||
+++ b/include/linux/execmem.h
|
||||
@@ -54,7 +54,7 @@ enum execmem_range_flags {
|
||||
EXECMEM_ROX_CACHE = (1 << 1),
|
||||
};
|
||||
|
||||
-#if defined(CONFIG_ARCH_HAS_EXECMEM_ROX) && defined(CONFIG_EXECMEM)
|
||||
+#ifdef CONFIG_ARCH_HAS_EXECMEM_ROX
|
||||
/**
|
||||
* execmem_fill_trapping_insns - set memory to contain instructions that
|
||||
* will trap
|
||||
@@ -94,15 +94,9 @@ int execmem_make_temp_rw(void *ptr, size
|
||||
* Return: 0 on success or negative error code on failure.
|
||||
*/
|
||||
int execmem_restore_rox(void *ptr, size_t size);
|
||||
-
|
||||
-/*
|
||||
- * Called from mark_readonly(), where the system transitions to ROX.
|
||||
- */
|
||||
-void execmem_cache_make_ro(void);
|
||||
#else
|
||||
static inline int execmem_make_temp_rw(void *ptr, size_t size) { return 0; }
|
||||
static inline int execmem_restore_rox(void *ptr, size_t size) { return 0; }
|
||||
-static inline void execmem_cache_make_ro(void) { }
|
||||
#endif
|
||||
|
||||
/**
|
||||
--- a/mm/execmem.c
|
||||
+++ b/mm/execmem.c
|
||||
@@ -254,34 +254,6 @@ out_unlock:
|
||||
return ptr;
|
||||
}
|
||||
|
||||
-static bool execmem_cache_rox = false;
|
||||
-
|
||||
-void execmem_cache_make_ro(void)
|
||||
-{
|
||||
- struct maple_tree *free_areas = &execmem_cache.free_areas;
|
||||
- struct maple_tree *busy_areas = &execmem_cache.busy_areas;
|
||||
- MA_STATE(mas_free, free_areas, 0, ULONG_MAX);
|
||||
- MA_STATE(mas_busy, busy_areas, 0, ULONG_MAX);
|
||||
- struct mutex *mutex = &execmem_cache.mutex;
|
||||
- void *area;
|
||||
-
|
||||
- execmem_cache_rox = true;
|
||||
-
|
||||
- mutex_lock(mutex);
|
||||
-
|
||||
- mas_for_each(&mas_free, area, ULONG_MAX) {
|
||||
- unsigned long pages = mas_range_len(&mas_free) >> PAGE_SHIFT;
|
||||
- set_memory_ro(mas_free.index, pages);
|
||||
- }
|
||||
-
|
||||
- mas_for_each(&mas_busy, area, ULONG_MAX) {
|
||||
- unsigned long pages = mas_range_len(&mas_busy) >> PAGE_SHIFT;
|
||||
- set_memory_ro(mas_busy.index, pages);
|
||||
- }
|
||||
-
|
||||
- mutex_unlock(mutex);
|
||||
-}
|
||||
-
|
||||
static int execmem_cache_populate(struct execmem_range *range, size_t size)
|
||||
{
|
||||
unsigned long vm_flags = VM_ALLOW_HUGE_VMAP;
|
||||
@@ -302,15 +274,9 @@ static int execmem_cache_populate(struct
|
||||
/* fill memory with instructions that will trap */
|
||||
execmem_fill_trapping_insns(p, alloc_size, /* writable = */ true);
|
||||
|
||||
- if (execmem_cache_rox) {
|
||||
- err = set_memory_rox((unsigned long)p, vm->nr_pages);
|
||||
- if (err)
|
||||
- goto err_free_mem;
|
||||
- } else {
|
||||
- err = set_memory_x((unsigned long)p, vm->nr_pages);
|
||||
- if (err)
|
||||
- goto err_free_mem;
|
||||
- }
|
||||
+ err = set_memory_rox((unsigned long)p, vm->nr_pages);
|
||||
+ if (err)
|
||||
+ goto err_free_mem;
|
||||
|
||||
err = execmem_cache_add(p, alloc_size);
|
||||
if (err)
|
@@ -1,63 +0,0 @@
|
||||
From 85bfdd784bd61df94fd42daca141ed173f647e8c Mon Sep 17 00:00:00 2001
|
||||
From: Kai Huang <kai.huang@intel.com>
|
||||
Date: Sat, 7 Jun 2025 01:07:37 +1200
|
||||
Subject: x86/virt/tdx: Avoid indirect calls to TDX assembly functions
|
||||
|
||||
Two 'static inline' TDX helper functions (sc_retry() and
|
||||
sc_retry_prerr()) take function pointer arguments which refer to
|
||||
assembly functions. Normally, the compiler inlines the TDX helper,
|
||||
realizes that the function pointer targets are completely static --
|
||||
thus can be resolved at compile time -- and generates direct call
|
||||
instructions.
|
||||
|
||||
But, other times (like when CONFIG_CC_OPTIMIZE_FOR_SIZE=y), the
|
||||
compiler declines to inline the helpers and will instead generate
|
||||
indirect call instructions.
|
||||
|
||||
Indirect calls to assembly functions require special annotation (for
|
||||
various Control Flow Integrity mechanisms). But TDX assembly
|
||||
functions lack the special annotations and can only be called
|
||||
directly.
|
||||
|
||||
Annotate both the helpers as '__always_inline' to prod the compiler
|
||||
into maintaining the direct calls. There is no guarantee here, but
|
||||
Peter has volunteered to report the compiler bug if this assumption
|
||||
ever breaks[1].
|
||||
|
||||
Fixes: 1e66a7e27539 ("x86/virt/tdx: Handle SEAMCALL no entropy error in common code")
|
||||
Fixes: df01f5ae07dd ("x86/virt/tdx: Add SEAMCALL error printing for module initialization")
|
||||
Signed-off-by: Kai Huang <kai.huang@intel.com>
|
||||
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lore.kernel.org/lkml/20250605145914.GW39944@noisy.programming.kicks-ass.net/ [1]
|
||||
Link: https://lore.kernel.org/all/20250606130737.30713-1-kai.huang%40intel.com
|
||||
---
|
||||
arch/x86/include/asm/tdx.h | 2 +-
|
||||
arch/x86/virt/vmx/tdx/tdx.c | 5 +++--
|
||||
2 files changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/x86/include/asm/tdx.h
|
||||
+++ b/arch/x86/include/asm/tdx.h
|
||||
@@ -100,7 +100,7 @@ void tdx_init(void);
|
||||
|
||||
typedef u64 (*sc_func_t)(u64 fn, struct tdx_module_args *args);
|
||||
|
||||
-static inline u64 sc_retry(sc_func_t func, u64 fn,
|
||||
+static __always_inline u64 sc_retry(sc_func_t func, u64 fn,
|
||||
struct tdx_module_args *args)
|
||||
{
|
||||
int retry = RDRAND_RETRY_LOOPS;
|
||||
--- a/arch/x86/virt/vmx/tdx/tdx.c
|
||||
+++ b/arch/x86/virt/vmx/tdx/tdx.c
|
||||
@@ -69,8 +69,9 @@ static inline void seamcall_err_ret(u64
|
||||
args->r9, args->r10, args->r11);
|
||||
}
|
||||
|
||||
-static inline int sc_retry_prerr(sc_func_t func, sc_err_func_t err_func,
|
||||
- u64 fn, struct tdx_module_args *args)
|
||||
+static __always_inline int sc_retry_prerr(sc_func_t func,
|
||||
+ sc_err_func_t err_func,
|
||||
+ u64 fn, struct tdx_module_args *args)
|
||||
{
|
||||
u64 sret = sc_retry(func, fn, args);
|
||||
|
@@ -1,31 +0,0 @@
|
||||
From a94cf5c6e7e31be9d4788916ce847adb15735d81 Mon Sep 17 00:00:00 2001
|
||||
From: Juergen Gross <jgross@suse.com>
|
||||
Date: Tue, 3 Jun 2025 14:14:41 +0300
|
||||
Subject: x86/mm/pat: don't collapse pages without PSE set
|
||||
|
||||
Collapsing pages to a leaf PMD or PUD should be done only if
|
||||
X86_FEATURE_PSE is available, which is not the case when running e.g.
|
||||
as a Xen PV guest.
|
||||
|
||||
Fixes: 41d88484c71c ("x86/mm/pat: restore large ROX pages after fragmentation")
|
||||
Signed-off-by: Juergen Gross <jgross@suse.com>
|
||||
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lore.kernel.org/r/20250528123557.12847-3-jgross@suse.com
|
||||
---
|
||||
arch/x86/mm/pat/set_memory.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/arch/x86/mm/pat/set_memory.c
|
||||
+++ b/arch/x86/mm/pat/set_memory.c
|
||||
@@ -1257,6 +1257,9 @@ static int collapse_pmd_page(pmd_t *pmd,
|
||||
pgprot_t pgprot;
|
||||
int i = 0;
|
||||
|
||||
+ if (!cpu_feature_enabled(X86_FEATURE_PSE))
|
||||
+ return 0;
|
||||
+
|
||||
addr &= PMD_MASK;
|
||||
pte = pte_offset_kernel(pmd, addr);
|
||||
first = *pte;
|
@@ -1,34 +0,0 @@
|
||||
From 8f28d595d167316469bb33b701e27b4b79c1aab1 Mon Sep 17 00:00:00 2001
|
||||
From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
|
||||
Date: Tue, 3 Jun 2025 14:14:42 +0300
|
||||
Subject: x86/Kconfig: only enable ROX cache in execmem when STRICT_MODULE_RWX
|
||||
is set
|
||||
|
||||
Currently ROX cache in execmem is enabled regardless of
|
||||
STRICT_MODULE_RWX setting. This breaks an assumption that module memory
|
||||
is writable when STRICT_MODULE_RWX is disabled, for instance for kernel
|
||||
debuggin.
|
||||
|
||||
Only enable ROX cache in execmem when STRICT_MODULE_RWX is set to
|
||||
restore the original behaviour of module text permissions.
|
||||
|
||||
Fixes: 64f6a4e10c05 ("x86: re-enable EXECMEM_ROX support")
|
||||
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lkml.kernel.org/r/20250603111446.2609381-3-rppt@kernel.org
|
||||
---
|
||||
arch/x86/Kconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/x86/Kconfig
|
||||
+++ b/arch/x86/Kconfig
|
||||
@@ -88,7 +88,7 @@ config X86
|
||||
select ARCH_HAS_DMA_OPS if GART_IOMMU || XEN
|
||||
select ARCH_HAS_EARLY_DEBUG if KGDB
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
- select ARCH_HAS_EXECMEM_ROX if X86_64
|
||||
+ select ARCH_HAS_EXECMEM_ROX if X86_64 && STRICT_MODULE_RWX
|
||||
select ARCH_HAS_FAST_MULTIPLIER
|
||||
select ARCH_HAS_FORTIFY_SOURCE
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
@@ -1,110 +0,0 @@
|
||||
From 24fd2e3cef1b98f4417b8015ba24a8a4dcaae0c1 Mon Sep 17 00:00:00 2001
|
||||
From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
|
||||
Date: Tue, 3 Jun 2025 14:14:43 +0300
|
||||
Subject: x86/its: move its_pages array to struct mod_arch_specific
|
||||
|
||||
The of pages with ITS thunks allocated for modules are tracked by an
|
||||
array in 'struct module'.
|
||||
|
||||
Since this is very architecture specific data structure, move it to
|
||||
'struct mod_arch_specific'.
|
||||
|
||||
No functional changes.
|
||||
|
||||
Fixes: 872df34d7c51 ("x86/its: Use dynamic thunks for indirect branches")
|
||||
Suggested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lkml.kernel.org/r/20250603111446.2609381-4-rppt@kernel.org
|
||||
---
|
||||
arch/x86/include/asm/module.h | 8 ++++++++
|
||||
arch/x86/kernel/alternative.c | 19 ++++++++++---------
|
||||
include/linux/module.h | 5 -----
|
||||
3 files changed, 18 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/arch/x86/include/asm/module.h
|
||||
+++ b/arch/x86/include/asm/module.h
|
||||
@@ -5,12 +5,20 @@
|
||||
#include <asm-generic/module.h>
|
||||
#include <asm/orc_types.h>
|
||||
|
||||
+struct its_array {
|
||||
+#ifdef CONFIG_MITIGATION_ITS
|
||||
+ void **pages;
|
||||
+ int num;
|
||||
+#endif
|
||||
+};
|
||||
+
|
||||
struct mod_arch_specific {
|
||||
#ifdef CONFIG_UNWINDER_ORC
|
||||
unsigned int num_orcs;
|
||||
int *orc_unwind_ip;
|
||||
struct orc_entry *orc_unwind;
|
||||
#endif
|
||||
+ struct its_array its_pages;
|
||||
};
|
||||
|
||||
#endif /* _ASM_X86_MODULE_H */
|
||||
--- a/arch/x86/kernel/alternative.c
|
||||
+++ b/arch/x86/kernel/alternative.c
|
||||
@@ -195,8 +195,8 @@ void its_fini_mod(struct module *mod)
|
||||
its_page = NULL;
|
||||
mutex_unlock(&text_mutex);
|
||||
|
||||
- for (int i = 0; i < mod->its_num_pages; i++) {
|
||||
- void *page = mod->its_page_array[i];
|
||||
+ for (int i = 0; i < mod->arch.its_pages.num; i++) {
|
||||
+ void *page = mod->arch.its_pages.pages[i];
|
||||
execmem_restore_rox(page, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
@@ -206,11 +206,11 @@ void its_free_mod(struct module *mod)
|
||||
if (!cpu_feature_enabled(X86_FEATURE_INDIRECT_THUNK_ITS))
|
||||
return;
|
||||
|
||||
- for (int i = 0; i < mod->its_num_pages; i++) {
|
||||
- void *page = mod->its_page_array[i];
|
||||
+ for (int i = 0; i < mod->arch.its_pages.num; i++) {
|
||||
+ void *page = mod->arch.its_pages.pages[i];
|
||||
execmem_free(page);
|
||||
}
|
||||
- kfree(mod->its_page_array);
|
||||
+ kfree(mod->arch.its_pages.pages);
|
||||
}
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
@@ -223,14 +223,15 @@ static void *its_alloc(void)
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
if (its_mod) {
|
||||
- void *tmp = krealloc(its_mod->its_page_array,
|
||||
- (its_mod->its_num_pages+1) * sizeof(void *),
|
||||
+ struct its_array *pages = &its_mod->arch.its_pages;
|
||||
+ void *tmp = krealloc(pages->pages,
|
||||
+ (pages->num+1) * sizeof(void *),
|
||||
GFP_KERNEL);
|
||||
if (!tmp)
|
||||
return NULL;
|
||||
|
||||
- its_mod->its_page_array = tmp;
|
||||
- its_mod->its_page_array[its_mod->its_num_pages++] = page;
|
||||
+ pages->pages = tmp;
|
||||
+ pages->pages[pages->num++] = page;
|
||||
|
||||
execmem_make_temp_rw(page, PAGE_SIZE);
|
||||
}
|
||||
--- a/include/linux/module.h
|
||||
+++ b/include/linux/module.h
|
||||
@@ -586,11 +586,6 @@ struct module {
|
||||
atomic_t refcnt;
|
||||
#endif
|
||||
|
||||
-#ifdef CONFIG_MITIGATION_ITS
|
||||
- int its_num_pages;
|
||||
- void **its_page_array;
|
||||
-#endif
|
||||
-
|
||||
#ifdef CONFIG_CONSTRUCTORS
|
||||
/* Constructor functions. */
|
||||
ctor_fn_t *ctors;
|
@@ -1,148 +0,0 @@
|
||||
From 48d82c4dd03de376a6f673bda0f4f2b97138d855 Mon Sep 17 00:00:00 2001
|
||||
From: "Peter Zijlstra (Intel)" <peterz@infradead.org>
|
||||
Date: Tue, 3 Jun 2025 14:14:44 +0300
|
||||
Subject: x86/its: explicitly manage permissions for ITS pages
|
||||
|
||||
execmem_alloc() sets permissions differently depending on the kernel
|
||||
configuration, CPU support for PSE and whether a page is allocated
|
||||
before or after mark_rodata_ro().
|
||||
|
||||
Add tracking for pages allocated for ITS when patching the core kernel
|
||||
and make sure the permissions for ITS pages are explicitly managed for
|
||||
both kernel and module allocations.
|
||||
|
||||
Fixes: 872df34d7c51 ("x86/its: Use dynamic thunks for indirect branches")
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Co-developed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
|
||||
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lkml.kernel.org/r/20250603111446.2609381-5-rppt@kernel.org
|
||||
---
|
||||
arch/x86/kernel/alternative.c | 74 ++++++++++++++++++++++++-----------
|
||||
1 file changed, 52 insertions(+), 22 deletions(-)
|
||||
|
||||
--- a/arch/x86/kernel/alternative.c
|
||||
+++ b/arch/x86/kernel/alternative.c
|
||||
@@ -138,6 +138,24 @@ static struct module *its_mod;
|
||||
#endif
|
||||
static void *its_page;
|
||||
static unsigned int its_offset;
|
||||
+struct its_array its_pages;
|
||||
+
|
||||
+static void *__its_alloc(struct its_array *pages)
|
||||
+{
|
||||
+ void *page __free(execmem) = execmem_alloc(EXECMEM_MODULE_TEXT, PAGE_SIZE);
|
||||
+ if (!page)
|
||||
+ return NULL;
|
||||
+
|
||||
+ void *tmp = krealloc(pages->pages, (pages->num+1) * sizeof(void *),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!tmp)
|
||||
+ return NULL;
|
||||
+
|
||||
+ pages->pages = tmp;
|
||||
+ pages->pages[pages->num++] = page;
|
||||
+
|
||||
+ return no_free_ptr(page);
|
||||
+}
|
||||
|
||||
/* Initialize a thunk with the "jmp *reg; int3" instructions. */
|
||||
static void *its_init_thunk(void *thunk, int reg)
|
||||
@@ -173,6 +191,21 @@ static void *its_init_thunk(void *thunk,
|
||||
return thunk + offset;
|
||||
}
|
||||
|
||||
+static void its_pages_protect(struct its_array *pages)
|
||||
+{
|
||||
+ for (int i = 0; i < pages->num; i++) {
|
||||
+ void *page = pages->pages[i];
|
||||
+ execmem_restore_rox(page, PAGE_SIZE);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void its_fini_core(void)
|
||||
+{
|
||||
+ if (IS_ENABLED(CONFIG_STRICT_KERNEL_RWX))
|
||||
+ its_pages_protect(&its_pages);
|
||||
+ kfree(its_pages.pages);
|
||||
+}
|
||||
+
|
||||
#ifdef CONFIG_MODULES
|
||||
void its_init_mod(struct module *mod)
|
||||
{
|
||||
@@ -195,10 +228,8 @@ void its_fini_mod(struct module *mod)
|
||||
its_page = NULL;
|
||||
mutex_unlock(&text_mutex);
|
||||
|
||||
- for (int i = 0; i < mod->arch.its_pages.num; i++) {
|
||||
- void *page = mod->arch.its_pages.pages[i];
|
||||
- execmem_restore_rox(page, PAGE_SIZE);
|
||||
- }
|
||||
+ if (IS_ENABLED(CONFIG_STRICT_MODULE_RWX))
|
||||
+ its_pages_protect(&mod->arch.its_pages);
|
||||
}
|
||||
|
||||
void its_free_mod(struct module *mod)
|
||||
@@ -216,28 +247,23 @@ void its_free_mod(struct module *mod)
|
||||
|
||||
static void *its_alloc(void)
|
||||
{
|
||||
- void *page __free(execmem) = execmem_alloc(EXECMEM_MODULE_TEXT, PAGE_SIZE);
|
||||
+ struct its_array *pages = &its_pages;
|
||||
+ void *page;
|
||||
|
||||
+#ifdef CONFIG_MODULE
|
||||
+ if (its_mod)
|
||||
+ pages = &its_mod->arch.its_pages;
|
||||
+#endif
|
||||
+
|
||||
+ page = __its_alloc(pages);
|
||||
if (!page)
|
||||
return NULL;
|
||||
|
||||
-#ifdef CONFIG_MODULES
|
||||
- if (its_mod) {
|
||||
- struct its_array *pages = &its_mod->arch.its_pages;
|
||||
- void *tmp = krealloc(pages->pages,
|
||||
- (pages->num+1) * sizeof(void *),
|
||||
- GFP_KERNEL);
|
||||
- if (!tmp)
|
||||
- return NULL;
|
||||
-
|
||||
- pages->pages = tmp;
|
||||
- pages->pages[pages->num++] = page;
|
||||
+ execmem_make_temp_rw(page, PAGE_SIZE);
|
||||
+ if (pages == &its_pages)
|
||||
+ set_memory_x((unsigned long)page, 1);
|
||||
|
||||
- execmem_make_temp_rw(page, PAGE_SIZE);
|
||||
- }
|
||||
-#endif /* CONFIG_MODULES */
|
||||
-
|
||||
- return no_free_ptr(page);
|
||||
+ return page;
|
||||
}
|
||||
|
||||
static void *its_allocate_thunk(int reg)
|
||||
@@ -291,7 +317,9 @@ u8 *its_static_thunk(int reg)
|
||||
return thunk;
|
||||
}
|
||||
|
||||
-#endif
|
||||
+#else
|
||||
+static inline void its_fini_core(void) {}
|
||||
+#endif /* CONFIG_MITIGATION_ITS */
|
||||
|
||||
/*
|
||||
* Nomenclature for variable names to simplify and clarify this code and ease
|
||||
@@ -2368,6 +2396,8 @@ void __init alternative_instructions(voi
|
||||
apply_retpolines(__retpoline_sites, __retpoline_sites_end);
|
||||
apply_returns(__return_sites, __return_sites_end);
|
||||
|
||||
+ its_fini_core();
|
||||
+
|
||||
/*
|
||||
* Adjust all CALL instructions to point to func()-10, including
|
||||
* those in .altinstr_replacement.
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user