diff --git a/examples/cadvisor.yml b/examples/cadvisor.yml index 40818a6f4e..feae53e674 100644 --- a/examples/cadvisor.yml +++ b/examples/cadvisor.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0 console=ttysclp0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/dm-crypt-loop.yml b/examples/dm-crypt-loop.yml index ed1032a6bd..45bfa34123 100644 --- a/examples/dm-crypt-loop.yml +++ b/examples/dm-crypt-loop.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/dm-crypt.yml b/examples/dm-crypt.yml index 3d8b01e4bb..30956aa2a3 100644 --- a/examples/dm-crypt.yml +++ b/examples/dm-crypt.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/docker-for-mac.yml b/examples/docker-for-mac.yml index 6f87a8a5aa..567e5c0809 100644 --- a/examples/docker-for-mac.yml +++ b/examples/docker-for-mac.yml @@ -1,6 +1,6 @@ # This is an example for building the open source components of Docker for Mac kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 page_poison=1" init: - linuxkit/vpnkit-expose-port:c61565ee34e58823aaf7c05fd6359a8fd889137f # install vpnkit-expose-port and vpnkit-iptables-wrapper on host diff --git a/examples/docker.yml b/examples/docker.yml index 4e88464f12..0c99fbbb10 100644 --- a/examples/docker.yml +++ b/examples/docker.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0 console=ttysclp0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/getty.yml b/examples/getty.yml index f3f101258f..c80c7caeb2 100644 --- a/examples/getty.yml +++ b/examples/getty.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0 console=ttysclp0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/hostmount-writeable-overlay.yml b/examples/hostmount-writeable-overlay.yml index 2774da4c06..3d40febbcb 100644 --- a/examples/hostmount-writeable-overlay.yml +++ b/examples/hostmount-writeable-overlay.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0 console=ttysclp0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/influxdb-os.yml b/examples/influxdb-os.yml index 8694acf12b..4a65b18785 100644 --- a/examples/influxdb-os.yml +++ b/examples/influxdb-os.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/logging.yml b/examples/logging.yml index 39f930ca9a..bfb1b4e5b4 100644 --- a/examples/logging.yml +++ b/examples/logging.yml @@ -1,6 +1,6 @@ # Simple example of using an external logging service kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/minimal.yml b/examples/minimal.yml index a0143e8162..a727eed2d7 100644 --- a/examples/minimal.yml +++ b/examples/minimal.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/node_exporter.yml b/examples/node_exporter.yml index 217c4d9771..d2588d1f24 100644 --- a/examples/node_exporter.yml +++ b/examples/node_exporter.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/openstack.yml b/examples/openstack.yml index aabd06d43c..eb3f628c60 100644 --- a/examples/openstack.yml +++ b/examples/openstack.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/platform-aws.yml b/examples/platform-aws.yml index 691fa2d3fc..0e68d7efd8 100644 --- a/examples/platform-aws.yml +++ b/examples/platform-aws.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/platform-azure.yml b/examples/platform-azure.yml index aa90491003..705e4c4013 100644 --- a/examples/platform-azure.yml +++ b/examples/platform-azure.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/platform-gcp.yml b/examples/platform-gcp.yml index 1ef1d4f1e0..1c73d4508a 100644 --- a/examples/platform-gcp.yml +++ b/examples/platform-gcp.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/platform-hetzner.yml b/examples/platform-hetzner.yml index 4caedf5a48..ef1138d46f 100644 --- a/examples/platform-hetzner.yml +++ b/examples/platform-hetzner.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: console=ttyS1 ucode: intel-ucode.cpio init: diff --git a/examples/platform-packet.arm64.yml b/examples/platform-packet.arm64.yml index f52a22c1cb..ad2ce5d248 100644 --- a/examples/platform-packet.arm64.yml +++ b/examples/platform-packet.arm64.yml @@ -5,7 +5,7 @@ # for arm64 then the 'ucode' line in the kernel section can be left # out. kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyAMA0" ucode: "" onboot: diff --git a/examples/platform-packet.yml b/examples/platform-packet.yml index 444af29720..7627b1b189 100644 --- a/examples/platform-packet.yml +++ b/examples/platform-packet.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: console=ttyS1 ucode: intel-ucode.cpio init: diff --git a/examples/platform-scaleway.yml b/examples/platform-scaleway.yml index 93a87b7351..33eafc9b21 100644 --- a/examples/platform-scaleway.yml +++ b/examples/platform-scaleway.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0 console=ttysclp0 root=/dev/vda" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/platform-vmware.yml b/examples/platform-vmware.yml index 258fd73bbb..e78a7330f1 100644 --- a/examples/platform-vmware.yml +++ b/examples/platform-vmware.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/platform-vultr.yml b/examples/platform-vultr.yml index 7843193a08..05e1e7a8bf 100644 --- a/examples/platform-vultr.yml +++ b/examples/platform-vultr.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/redis-os.yml b/examples/redis-os.yml index 0cbddd3d6b..a64a3bfa92 100644 --- a/examples/redis-os.yml +++ b/examples/redis-os.yml @@ -1,7 +1,7 @@ # Minimal YAML to run a redis server (used at DockerCon'17) # connect: nc localhost 6379 kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0 console=ttysclp0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/sshd.yml b/examples/sshd.yml index 379cb70ffb..d89422ace1 100644 --- a/examples/sshd.yml +++ b/examples/sshd.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0 console=ttysclp0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/static-ip.yml b/examples/static-ip.yml index 53b939a721..d6bd82ab1c 100644 --- a/examples/static-ip.yml +++ b/examples/static-ip.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/swap.yml b/examples/swap.yml index 91e75b5bda..0f05b144a9 100644 --- a/examples/swap.yml +++ b/examples/swap.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0 console=ttysclp0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/tpm.yml b/examples/tpm.yml index b36c3135a7..bacbaaf80a 100644 --- a/examples/tpm.yml +++ b/examples/tpm.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/vpnkit-forwarder.yml b/examples/vpnkit-forwarder.yml index 44f0ce59f4..9df8143c1b 100644 --- a/examples/vpnkit-forwarder.yml +++ b/examples/vpnkit-forwarder.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/vsudd-containerd.yml b/examples/vsudd-containerd.yml index e5a284100e..da77e16f70 100644 --- a/examples/vsudd-containerd.yml +++ b/examples/vsudd-containerd.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/examples/wireguard.yml b/examples/wireguard.yml index d72ea7da18..7f9d0f84e2 100644 --- a/examples/wireguard.yml +++ b/examples/wireguard.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=tty0 console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/kernel/Makefile b/kernel/Makefile index 0bfbf02e31..4b52c550aa 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -269,16 +269,14 @@ endef # Debug targets only for latest stable and LTS stable # ifeq ($(ARCH),x86_64) -$(eval $(call kernel,5.15.27,5.15.x,$(EXTRA),$(DEBUG))) -$(eval $(call kernel,5.15.27,5.15.x,,-dbg)) -$(eval $(call kernel,5.10.104,5.10.x,$(EXTRA),$(DEBUG))) -$(eval $(call kernel,5.4.172,5.4.x,$(EXTRA),$(DEBUG))) -$(eval $(call kernel,5.11.4,5.11.x,-rt,)) +$(eval $(call kernel,5.15.110,5.15.x,$(EXTRA),$(DEBUG))) +$(eval $(call kernel,5.15.110,5.15.x,,-dbg)) +$(eval $(call kernel,5.10.179,5.10.x,$(EXTRA),$(DEBUG))) +$(eval $(call kernel,5.4.242,5.4.x,$(EXTRA),$(DEBUG))) else ifeq ($(ARCH),$(filter $(ARCH),aarch64 arm64)) -$(eval $(call kernel,5.15.27,5.15.x,$(EXTRA),$(DEBUG))) -$(eval $(call kernel,5.10.104,5.10.x,$(EXTRA),$(DEBUG))) -$(eval $(call kernel,5.11.4,5.11.x,-rt,)) +$(eval $(call kernel,5.15.110,5.15.x,$(EXTRA),$(DEBUG))) +$(eval $(call kernel,5.10.179,5.10.x,$(EXTRA),$(DEBUG))) endif diff --git a/kernel/config-5.10.x-aarch64 b/kernel/config-5.10.x-aarch64 index 47ccf6f67a..429596cab6 100644 --- a/kernel/config-5.10.x-aarch64 +++ b/kernel/config-5.10.x-aarch64 @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.10.104 Kernel Configuration +# Linux/arm64 5.10.179 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (Alpine 10.2.1_pre1) 10.2.1 20201203" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=100201 CONFIG_LD_VERSION=235020000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23502 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -342,6 +344,7 @@ CONFIG_ARM64_ERRATUM_1286807=y CONFIG_ARM64_ERRATUM_1463225=y CONFIG_ARM64_ERRATUM_1542419=y CONFIG_ARM64_ERRATUM_1508412=y +CONFIG_ARM64_ERRATUM_2457168=y CONFIG_CAVIUM_ERRATUM_22375=y CONFIG_CAVIUM_ERRATUM_23154=y CONFIG_CAVIUM_ERRATUM_27456=y @@ -397,6 +400,7 @@ CONFIG_XEN_DOM0=y CONFIG_XEN=y CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y @@ -444,7 +448,6 @@ CONFIG_ARM64_TLB_RANGE=y # ARMv8.5 architectural features # CONFIG_ARM64_BTI=y -CONFIG_ARM64_BTI_KERNEL=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y CONFIG_ARM64_E0PD=y CONFIG_ARCH_RANDOM=y @@ -955,6 +958,7 @@ CONFIG_INET_ESP=m # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set CONFIG_INET_IPCOMP=m +CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_XFRM_TUNNEL=m CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y @@ -1418,7 +1422,6 @@ CONFIG_NET_SCH_INGRESS=m # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y -CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y @@ -2389,7 +2392,6 @@ CONFIG_XEN_NETDEV_FRONTEND=y # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support @@ -2524,7 +2526,6 @@ CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set -# CONFIG_SERIAL_8250_ASPEED_VUART is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set @@ -2613,10 +2614,9 @@ CONFIG_TCG_VTPM_PROXY=m CONFIG_TCG_TIS_ST33ZP24=m CONFIG_TCG_TIS_ST33ZP24_I2C=m # CONFIG_XILLYBUS is not set -# end of Character devices - # CONFIG_RANDOM_TRUST_CPU is not set # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -4482,7 +4482,6 @@ CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y CONFIG_INTEGRITY_AUDIT=y CONFIG_IMA=y CONFIG_IMA_MEASURE_PCR_IDX=10 -# CONFIG_IMA_TEMPLATE is not set CONFIG_IMA_NG_TEMPLATE=y # CONFIG_IMA_SIG_TEMPLATE is not set CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng" @@ -4689,26 +4688,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m -CONFIG_CRYPTO_LIB_BLAKE2S=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y -CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m -CONFIG_CRYPTO_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m -CONFIG_CRYPTO_LIB_SHA256=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_FSL_CAAM is not set # CONFIG_CRYPTO_DEV_EXYNOS_RNG is not set @@ -4771,6 +4750,28 @@ CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y diff --git a/kernel/config-5.10.x-x86_64 b/kernel/config-5.10.x-x86_64 index 59c0bb01e8..1b186642ad 100644 --- a/kernel/config-5.10.x-x86_64 +++ b/kernel/config-5.10.x-x86_64 @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.104 Kernel Configuration +# Linux/x86 5.10.179 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (Alpine 10.2.1_pre1) 10.2.1 20201203" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=100201 CONFIG_LD_VERSION=235020000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23502 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -308,7 +310,6 @@ CONFIG_X86_FEATURE_NAMES=y CONFIG_X86_X2APIC=y CONFIG_X86_MPPARSE=y # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -390,7 +391,7 @@ CONFIG_X86_IOPL_IOPERM=y CONFIG_MICROCODE=y CONFIG_MICROCODE_INTEL=y CONFIG_MICROCODE_AMD=y -CONFIG_MICROCODE_OLD_INTERFACE=y +# CONFIG_MICROCODE_LATE_LOADING is not set CONFIG_X86_MSR=y CONFIG_X86_CPUID=y # CONFIG_X86_5LEVEL is not set @@ -452,6 +453,14 @@ CONFIG_LEGACY_VSYSCALL_NONE=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_UNRET_ENTRY=y +CONFIG_CPU_IBPB_ENTRY=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y @@ -1007,6 +1016,7 @@ CONFIG_INET_ESP=m # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set CONFIG_INET_IPCOMP=m +CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_XFRM_TUNNEL=m CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y @@ -1470,7 +1480,6 @@ CONFIG_NET_SCH_INGRESS=m # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y -CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y @@ -2346,7 +2355,6 @@ CONFIG_HYPERV_NET=y # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support @@ -2543,10 +2551,9 @@ CONFIG_TCG_TIS_ST33ZP24=m CONFIG_TCG_TIS_ST33ZP24_I2C=m # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - # CONFIG_RANDOM_TRUST_CPU is not set # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -3527,6 +3534,7 @@ CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_SYSTEM76_ACPI is not set # CONFIG_TOPSTAR_LAPTOP is not set # CONFIG_I2C_MULTI_INSTANTIATE is not set +# CONFIG_MLX_PLATFORM is not set CONFIG_INTEL_IPS=y # CONFIG_INTEL_RST is not set # CONFIG_INTEL_SMARTCONNECT is not set @@ -4033,7 +4041,6 @@ CONFIG_SECURITY_DMESG_RESTRICT=y CONFIG_SECURITY=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y -CONFIG_PAGE_TABLE_ISOLATION=y CONFIG_SECURITY_NETWORK_XFRM=y CONFIG_SECURITY_PATH=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y @@ -4057,7 +4064,6 @@ CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y CONFIG_INTEGRITY_AUDIT=y CONFIG_IMA=y CONFIG_IMA_MEASURE_PCR_IDX=10 -# CONFIG_IMA_TEMPLATE is not set CONFIG_IMA_NG_TEMPLATE=y # CONFIG_IMA_SIG_TEMPLATE is not set CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng" @@ -4294,28 +4300,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=m -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m -CONFIG_CRYPTO_LIB_BLAKE2S=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y -CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m -CONFIG_CRYPTO_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m -CONFIG_CRYPTO_LIB_SHA256=y CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_DEV_PADLOCK=y CONFIG_CRYPTO_DEV_PADLOCK_AES=y @@ -4368,6 +4352,30 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y diff --git a/kernel/config-5.11.x-aarch64 b/kernel/config-5.11.x-aarch64 deleted file mode 100644 index a27b6a05e4..0000000000 --- a/kernel/config-5.11.x-aarch64 +++ /dev/null @@ -1,5188 +0,0 @@ -# -# Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.11.4 Kernel Configuration -# -CONFIG_CC_VERSION_TEXT="gcc (Alpine 10.2.1_pre1) 10.2.1 20201203" -CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=100201 -CONFIG_LD_VERSION=235020000 -CONFIG_CLANG_VERSION=0 -CONFIG_LLD_VERSION=0 -CONFIG_CC_CAN_LINK=y -CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y -CONFIG_CC_HAS_ASM_INLINE=y -CONFIG_IRQ_WORK=y -CONFIG_BUILDTIME_TABLE_SORT=y -CONFIG_THREAD_INFO_IN_TASK=y - -# -# General setup -# -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_COMPILE_TEST is not set -CONFIG_LOCALVERSION="-linuxkit" -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_BUILD_SALT="" -CONFIG_DEFAULT_INIT="" -CONFIG_DEFAULT_HOSTNAME="(none)" -CONFIG_SWAP=y -CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -CONFIG_POSIX_MQUEUE=y -CONFIG_POSIX_MQUEUE_SYSCTL=y -# CONFIG_WATCH_QUEUE is not set -CONFIG_CROSS_MEMORY_ATTACH=y -# CONFIG_USELIB is not set -CONFIG_AUDIT=y -CONFIG_HAVE_ARCH_AUDITSYSCALL=y -CONFIG_AUDITSYSCALL=y - -# -# IRQ subsystem -# -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y -CONFIG_GENERIC_IRQ_IPI=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_HANDLE_DOMAIN_IRQ=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_SPARSE_IRQ=y -# CONFIG_GENERIC_IRQ_DEBUGFS is not set -# end of IRQ subsystem - -CONFIG_GENERIC_IRQ_MULTI_HANDLER=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_ARCH_HAS_TICK_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y - -# -# Timers subsystem -# -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ_COMMON=y -# CONFIG_HZ_PERIODIC is not set -CONFIG_NO_HZ_IDLE=y -# CONFIG_NO_HZ_FULL is not set -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y -# end of Timers subsystem - -# CONFIG_PREEMPT_NONE is not set -# CONFIG_PREEMPT_VOLUNTARY is not set -CONFIG_PREEMPT=y -CONFIG_PREEMPT_COUNT=y -CONFIG_PREEMPTION=y - -# -# CPU/Task time and stats accounting -# -CONFIG_TICK_CPU_ACCOUNTING=y -# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set -# CONFIG_IRQ_TIME_ACCOUNTING is not set -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_TASK_XACCT=y -CONFIG_TASK_IO_ACCOUNTING=y -# CONFIG_PSI is not set -# end of CPU/Task time and stats accounting - -CONFIG_CPU_ISOLATION=y - -# -# RCU Subsystem -# -CONFIG_TREE_RCU=y -CONFIG_PREEMPT_RCU=y -# CONFIG_RCU_EXPERT is not set -CONFIG_SRCU=y -CONFIG_TREE_SRCU=y -CONFIG_TASKS_RCU_GENERIC=y -CONFIG_TASKS_RCU=y -CONFIG_TASKS_RUDE_RCU=y -CONFIG_TASKS_TRACE_RCU=y -CONFIG_RCU_STALL_COMMON=y -CONFIG_RCU_NEED_SEGCBLIST=y -# end of RCU Subsystem - -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -# CONFIG_IKHEADERS is not set -CONFIG_LOG_BUF_SHIFT=17 -CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 -CONFIG_GENERIC_SCHED_CLOCK=y - -# -# Scheduler features -# -# end of Scheduler features - -CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y -CONFIG_CC_HAS_INT128=y -CONFIG_ARCH_SUPPORTS_INT128=y -CONFIG_CGROUPS=y -CONFIG_PAGE_COUNTER=y -CONFIG_MEMCG=y -CONFIG_MEMCG_SWAP=y -CONFIG_MEMCG_KMEM=y -CONFIG_BLK_CGROUP=y -CONFIG_CGROUP_WRITEBACK=y -CONFIG_CGROUP_SCHED=y -CONFIG_FAIR_GROUP_SCHED=y -CONFIG_CFS_BANDWIDTH=y -CONFIG_RT_GROUP_SCHED=y -CONFIG_CGROUP_PIDS=y -CONFIG_CGROUP_RDMA=y -CONFIG_CGROUP_FREEZER=y -CONFIG_CGROUP_HUGETLB=y -CONFIG_CPUSETS=y -CONFIG_PROC_PID_CPUSET=y -CONFIG_CGROUP_DEVICE=y -CONFIG_CGROUP_CPUACCT=y -CONFIG_CGROUP_PERF=y -CONFIG_CGROUP_BPF=y -# CONFIG_CGROUP_DEBUG is not set -CONFIG_SOCK_CGROUP_DATA=y -CONFIG_NAMESPACES=y -CONFIG_UTS_NS=y -CONFIG_TIME_NS=y -CONFIG_IPC_NS=y -CONFIG_USER_NS=y -CONFIG_PID_NS=y -CONFIG_NET_NS=y -CONFIG_CHECKPOINT_RESTORE=y -CONFIG_SCHED_AUTOGROUP=y -# CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_RD_GZIP=y -# CONFIG_RD_BZIP2 is not set -# CONFIG_RD_LZMA is not set -# CONFIG_RD_XZ is not set -# CONFIG_RD_LZO is not set -# CONFIG_RD_LZ4 is not set -CONFIG_RD_ZSTD=y -# CONFIG_BOOT_CONFIG is not set -# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set -CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_LD_ORPHAN_WARN=y -CONFIG_SYSCTL=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_BPF=y -CONFIG_EXPERT=y -CONFIG_MULTIUSER=y -# CONFIG_SGETMASK_SYSCALL is not set -CONFIG_SYSFS_SYSCALL=y -CONFIG_FHANDLE=y -CONFIG_POSIX_TIMERS=y -CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y -CONFIG_BUG=y -CONFIG_ELF_CORE=y -CONFIG_BASE_FULL=y -CONFIG_FUTEX=y -CONFIG_FUTEX_PI=y -CONFIG_HAVE_FUTEX_CMPXCHG=y -CONFIG_EPOLL=y -CONFIG_SIGNALFD=y -CONFIG_TIMERFD=y -CONFIG_EVENTFD=y -CONFIG_SHMEM=y -CONFIG_AIO=y -CONFIG_IO_URING=y -CONFIG_ADVISE_SYSCALLS=y -CONFIG_MEMBARRIER=y -CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_ALL is not set -CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_LSM is not set -CONFIG_BPF_SYSCALL=y -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -CONFIG_BPF_JIT_ALWAYS_ON=y -CONFIG_BPF_JIT_DEFAULT_ON=y -# CONFIG_BPF_PRELOAD is not set -# CONFIG_USERFAULTFD is not set -CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -CONFIG_KCMP=y -CONFIG_RSEQ=y -# CONFIG_DEBUG_RSEQ is not set -# CONFIG_EMBEDDED is not set -CONFIG_HAVE_PERF_EVENTS=y -# CONFIG_PC104 is not set - -# -# Kernel Performance Events And Counters -# -CONFIG_PERF_EVENTS=y -# CONFIG_DEBUG_PERF_USE_VMALLOC is not set -# end of Kernel Performance Events And Counters - -CONFIG_VM_EVENT_COUNTERS=y -# CONFIG_COMPAT_BRK is not set -CONFIG_SLAB=y -# CONFIG_SLUB is not set -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -CONFIG_SLAB_FREELIST_RANDOM=y -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_PROFILING=y -CONFIG_TRACEPOINTS=y -# end of General setup - -CONFIG_ARM64=y -CONFIG_64BIT=y -CONFIG_MMU=y -CONFIG_ARM64_PAGE_SHIFT=12 -CONFIG_ARM64_CONT_PTE_SHIFT=4 -CONFIG_ARM64_CONT_PMD_SHIFT=4 -CONFIG_ARCH_MMAP_RND_BITS_MIN=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=33 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_HWEIGHT=y -CONFIG_GENERIC_CSUM=y -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_ZONE_DMA=y -CONFIG_ZONE_DMA32=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y -CONFIG_SMP=y -CONFIG_KERNEL_MODE_NEON=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_PGTABLE_LEVELS=4 -CONFIG_ARCH_SUPPORTS_UPROBES=y -CONFIG_ARCH_PROC_KCORE_TEXT=y - -# -# Platform selection -# -# CONFIG_ARCH_ACTIONS is not set -# CONFIG_ARCH_AGILEX is not set -# CONFIG_ARCH_SUNXI is not set -# CONFIG_ARCH_ALPINE is not set -CONFIG_ARCH_BCM2835=y -# CONFIG_ARCH_BCM4908 is not set -# CONFIG_ARCH_BCM_IPROC is not set -# CONFIG_ARCH_BERLIN is not set -# CONFIG_ARCH_BITMAIN is not set -# CONFIG_ARCH_BRCMSTB is not set -CONFIG_ARCH_EXYNOS=y -# CONFIG_ARCH_SPARX5 is not set -# CONFIG_ARCH_K3 is not set -CONFIG_ARCH_LAYERSCAPE=y -# CONFIG_ARCH_LG1K is not set -CONFIG_ARCH_HISI=y -# CONFIG_ARCH_KEEMBAY is not set -# CONFIG_ARCH_MEDIATEK is not set -# CONFIG_ARCH_MESON is not set -# CONFIG_ARCH_MVEBU is not set -# CONFIG_ARCH_MXC is not set -CONFIG_ARCH_QCOM=y -# CONFIG_ARCH_REALTEK is not set -# CONFIG_ARCH_RENESAS is not set -# CONFIG_ARCH_ROCKCHIP is not set -# CONFIG_ARCH_S32 is not set -CONFIG_ARCH_SEATTLE=y -# CONFIG_ARCH_STRATIX10 is not set -CONFIG_ARCH_SYNQUACER=y -# CONFIG_ARCH_TEGRA is not set -# CONFIG_ARCH_SPRD is not set -CONFIG_ARCH_THUNDER=y -CONFIG_ARCH_THUNDER2=y -# CONFIG_ARCH_UNIPHIER is not set -CONFIG_ARCH_VEXPRESS=y -# CONFIG_ARCH_VISCONTI is not set -# CONFIG_ARCH_XGENE is not set -# CONFIG_ARCH_ZX is not set -# CONFIG_ARCH_ZYNQMP is not set -# end of Platform selection - -# -# Kernel Features -# - -# -# ARM errata workarounds via the alternatives framework -# -CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y -CONFIG_ARM64_ERRATUM_826319=y -CONFIG_ARM64_ERRATUM_827319=y -CONFIG_ARM64_ERRATUM_824069=y -CONFIG_ARM64_ERRATUM_819472=y -CONFIG_ARM64_ERRATUM_832075=y -CONFIG_ARM64_ERRATUM_834220=y -CONFIG_ARM64_ERRATUM_843419=y -CONFIG_ARM64_ERRATUM_1024718=y -CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y -CONFIG_ARM64_ERRATUM_1165522=y -CONFIG_ARM64_ERRATUM_1319367=y -CONFIG_ARM64_ERRATUM_1530923=y -CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y -CONFIG_ARM64_ERRATUM_1286807=y -CONFIG_ARM64_ERRATUM_1463225=y -CONFIG_ARM64_ERRATUM_1542419=y -CONFIG_ARM64_ERRATUM_1508412=y -CONFIG_CAVIUM_ERRATUM_22375=y -CONFIG_CAVIUM_ERRATUM_23154=y -CONFIG_CAVIUM_ERRATUM_27456=y -CONFIG_CAVIUM_ERRATUM_30115=y -CONFIG_CAVIUM_TX2_ERRATUM_219=y -CONFIG_FUJITSU_ERRATUM_010001=y -CONFIG_HISILICON_ERRATUM_161600802=y -CONFIG_QCOM_FALKOR_ERRATUM_1003=y -CONFIG_QCOM_FALKOR_ERRATUM_1009=y -CONFIG_QCOM_QDF2400_ERRATUM_0065=y -CONFIG_QCOM_FALKOR_ERRATUM_E1041=y -CONFIG_SOCIONEXT_SYNQUACER_PREITS=y -# end of ARM errata workarounds via the alternatives framework - -CONFIG_ARM64_4K_PAGES=y -# CONFIG_ARM64_16K_PAGES is not set -# CONFIG_ARM64_64K_PAGES is not set -# CONFIG_ARM64_VA_BITS_39 is not set -CONFIG_ARM64_VA_BITS_48=y -CONFIG_ARM64_VA_BITS=48 -CONFIG_ARM64_PA_BITS_48=y -CONFIG_ARM64_PA_BITS=48 -# CONFIG_CPU_BIG_ENDIAN is not set -CONFIG_CPU_LITTLE_ENDIAN=y -CONFIG_SCHED_MC=y -# CONFIG_SCHED_SMT is not set -CONFIG_NR_CPUS=64 -CONFIG_HOTPLUG_CPU=y -# CONFIG_NUMA is not set -CONFIG_HOLES_IN_ZONE=y -# CONFIG_HZ_100 is not set -# CONFIG_HZ_250 is not set -# CONFIG_HZ_300 is not set -CONFIG_HZ_1000=y -CONFIG_HZ=1000 -CONFIG_SCHED_HRTICK=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_FLATMEM_ENABLE=y -CONFIG_HW_PERF_EVENTS=y -CONFIG_SYS_SUPPORTS_HUGETLBFS=y -CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y -CONFIG_PARAVIRT=y -# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set -# CONFIG_KEXEC_FILE is not set -# CONFIG_CRASH_DUMP is not set -CONFIG_XEN_DOM0=y -CONFIG_XEN=y -CONFIG_FORCE_MAX_ZONEORDER=11 -CONFIG_UNMAP_KERNEL_AT_EL0=y -CONFIG_RODATA_FULL_DEFAULT_ENABLED=y -# CONFIG_ARM64_SW_TTBR0_PAN is not set -CONFIG_ARM64_TAGGED_ADDR_ABI=y -# CONFIG_COMPAT is not set - -# -# ARMv8.1 architectural features -# -CONFIG_ARM64_HW_AFDBM=y -CONFIG_ARM64_PAN=y -CONFIG_AS_HAS_LDAPR=y -CONFIG_ARM64_LSE_ATOMICS=y -CONFIG_ARM64_USE_LSE_ATOMICS=y -CONFIG_ARM64_VHE=y -# end of ARMv8.1 architectural features - -# -# ARMv8.2 architectural features -# -# CONFIG_ARM64_PMEM is not set -CONFIG_ARM64_RAS_EXTN=y -CONFIG_ARM64_CNP=y -# end of ARMv8.2 architectural features - -# -# ARMv8.3 architectural features -# -CONFIG_ARM64_PTR_AUTH=y -CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y -CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y -CONFIG_AS_HAS_PAC=y -CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y -# end of ARMv8.3 architectural features - -# -# ARMv8.4 architectural features -# -CONFIG_ARM64_AMU_EXTN=y -CONFIG_AS_HAS_ARMV8_4=y -CONFIG_ARM64_TLB_RANGE=y -# end of ARMv8.4 architectural features - -# -# ARMv8.5 architectural features -# -CONFIG_AS_HAS_ARMV8_5=y -CONFIG_ARM64_BTI=y -CONFIG_ARM64_BTI_KERNEL=y -CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y -CONFIG_ARM64_E0PD=y -CONFIG_ARCH_RANDOM=y -CONFIG_ARM64_AS_HAS_MTE=y -CONFIG_ARM64_MTE=y -# end of ARMv8.5 architectural features - -CONFIG_ARM64_SVE=y -CONFIG_ARM64_MODULE_PLTS=y -# CONFIG_ARM64_PSEUDO_NMI is not set -CONFIG_RELOCATABLE=y -CONFIG_RANDOMIZE_BASE=y -CONFIG_RANDOMIZE_MODULE_REGION_FULL=y -CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y -CONFIG_STACKPROTECTOR_PER_TASK=y -# end of Kernel Features - -# -# Boot options -# -# CONFIG_ARM64_ACPI_PARKING_PROTOCOL is not set -CONFIG_CMDLINE="" -CONFIG_EFI_STUB=y -CONFIG_EFI=y -CONFIG_DMI=y -# end of Boot options - -CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y -CONFIG_ARCH_ENABLE_THP_MIGRATION=y - -# -# Power management options -# -# CONFIG_SUSPEND is not set -# CONFIG_HIBERNATION is not set -CONFIG_PM=y -# CONFIG_PM_DEBUG is not set -CONFIG_PM_CLK=y -CONFIG_PM_GENERIC_DOMAINS=y -# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set -CONFIG_PM_GENERIC_DOMAINS_OF=y -CONFIG_CPU_PM=y -# CONFIG_ENERGY_MODEL is not set -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -# end of Power management options - -# -# CPU Power Management -# - -# -# CPU Idle -# -CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y -# CONFIG_CPU_IDLE_GOV_LADDER is not set -CONFIG_CPU_IDLE_GOV_MENU=y -# CONFIG_CPU_IDLE_GOV_TEO is not set -CONFIG_DT_IDLE_STATES=y - -# -# ARM CPU Idle Drivers -# -CONFIG_ARM_CPUIDLE=y -# CONFIG_ARM_PSCI_CPUIDLE is not set -# end of ARM CPU Idle Drivers -# end of CPU Idle - -# -# CPU Frequency scaling -# -CONFIG_CPU_FREQ=y -# CONFIG_CPU_FREQ_STAT is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_GOV_USERSPACE is not set -# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set -# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set -# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set - -# -# CPU frequency scaling drivers -# -CONFIG_CPUFREQ_DT=y -CONFIG_CPUFREQ_DT_PLATDEV=y -# CONFIG_ACPI_CPPC_CPUFREQ is not set -# CONFIG_ARM_QCOM_CPUFREQ_HW is not set -# CONFIG_QORIQ_CPUFREQ is not set -# end of CPU Frequency scaling -# end of CPU Power Management - -# -# Firmware Drivers -# -# CONFIG_ARM_SCMI_PROTOCOL is not set -# CONFIG_ARM_SCPI_PROTOCOL is not set -# CONFIG_ARM_SDE_INTERFACE is not set -CONFIG_FIRMWARE_MEMMAP=y -CONFIG_DMIID=y -CONFIG_DMI_SYSFS=y -# CONFIG_ISCSI_IBFT is not set -CONFIG_RASPBERRYPI_FIRMWARE=y -# CONFIG_FW_CFG_SYSFS is not set -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# EFI (Extensible Firmware Interface) Support -# -CONFIG_EFI_ESRT=y -CONFIG_EFI_VARS_PSTORE=y -# CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set -CONFIG_EFI_PARAMS_FROM_FDT=y -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_GENERIC_STUB=y -CONFIG_EFI_ARMSTUB_DTB_LOADER=y -CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -CONFIG_RESET_ATTACK_MITIGATION=y -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_EARLYCON=y -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y -CONFIG_ARM_PSCI_FW=y -# CONFIG_ARM_PSCI_CHECKER is not set -CONFIG_HAVE_ARM_SMCCC=y -CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y -CONFIG_ARM_SMCCC_SOC_ID=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - -CONFIG_ARCH_SUPPORTS_ACPI=y -CONFIG_ACPI=y -CONFIG_ACPI_GENERIC_GSI=y -CONFIG_ACPI_CCA_REQUIRED=y -CONFIG_ACPI_DEBUGGER=y -# CONFIG_ACPI_DEBUGGER_USER is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_EC_DEBUGFS=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_FAN=y -CONFIG_ACPI_DOCK=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_MCFG=y -CONFIG_ACPI_PROCESSOR=y -CONFIG_ACPI_HOTPLUG_CPU=y -CONFIG_ACPI_THERMAL=y -CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y -CONFIG_ACPI_TABLE_UPGRADE=y -CONFIG_ACPI_DEBUG=y -CONFIG_ACPI_PCI_SLOT=y -CONFIG_ACPI_CONTAINER=y -CONFIG_ACPI_HED=y -CONFIG_ACPI_CUSTOM_METHOD=y -# CONFIG_ACPI_BGRT is not set -CONFIG_ACPI_REDUCED_HARDWARE_ONLY=y -CONFIG_HAVE_ACPI_APEI=y -# CONFIG_ACPI_APEI is not set -CONFIG_ACPI_CONFIGFS=y -CONFIG_ACPI_IORT=y -CONFIG_ACPI_GTDT=y -CONFIG_ACPI_PPTT=y -CONFIG_PMIC_OPREGION=y -CONFIG_IRQ_BYPASS_MANAGER=y -CONFIG_VIRTUALIZATION=y -CONFIG_KVM=y -CONFIG_HAVE_KVM_IRQCHIP=y -CONFIG_HAVE_KVM_IRQFD=y -CONFIG_HAVE_KVM_IRQ_ROUTING=y -CONFIG_HAVE_KVM_EVENTFD=y -CONFIG_KVM_MMIO=y -CONFIG_HAVE_KVM_MSI=y -CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y -CONFIG_KVM_VFIO=y -CONFIG_HAVE_KVM_ARCH_TLB_FLUSH_ALL=y -CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y -CONFIG_HAVE_KVM_IRQ_BYPASS=y -CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE=y -CONFIG_ARM64_CRYPTO=y -CONFIG_CRYPTO_SHA256_ARM64=y -CONFIG_CRYPTO_SHA512_ARM64=y -CONFIG_CRYPTO_SHA1_ARM64_CE=y -CONFIG_CRYPTO_SHA2_ARM64_CE=y -# CONFIG_CRYPTO_SHA512_ARM64_CE is not set -# CONFIG_CRYPTO_SHA3_ARM64 is not set -# CONFIG_CRYPTO_SM3_ARM64_CE is not set -# CONFIG_CRYPTO_SM4_ARM64_CE is not set -CONFIG_CRYPTO_GHASH_ARM64_CE=y -CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64=y -CONFIG_CRYPTO_AES_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64_CE_CCM=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y -CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y -CONFIG_CRYPTO_CHACHA20_NEON=y -CONFIG_CRYPTO_POLY1305_NEON=m -# CONFIG_CRYPTO_NHPOLY1305_NEON is not set -CONFIG_CRYPTO_AES_ARM64_BS=y - -# -# General architecture-dependent options -# -CONFIG_CRASH_CORE=y -CONFIG_KPROBES=y -CONFIG_JUMP_LABEL=y -# CONFIG_STATIC_KEYS_SELFTEST is not set -CONFIG_UPROBES=y -CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y -CONFIG_KRETPROBES=y -CONFIG_HAVE_KPROBES=y -CONFIG_HAVE_KRETPROBES=y -CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y -CONFIG_HAVE_NMI=y -CONFIG_HAVE_ARCH_TRACEHOOK=y -CONFIG_HAVE_DMA_CONTIGUOUS=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_ARCH_HAS_FORTIFY_SOURCE=y -CONFIG_ARCH_HAS_KEEPINITRD=y -CONFIG_ARCH_HAS_SET_MEMORY=y -CONFIG_ARCH_HAS_SET_DIRECT_MAP=y -CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y -CONFIG_HAVE_ASM_MODVERSIONS=y -CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y -CONFIG_HAVE_RSEQ=y -CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y -CONFIG_HAVE_HW_BREAKPOINT=y -CONFIG_HAVE_PERF_REGS=y -CONFIG_HAVE_PERF_USER_STACK_DUMP=y -CONFIG_HAVE_ARCH_JUMP_LABEL=y -CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y -CONFIG_MMU_GATHER_TABLE_FREE=y -CONFIG_MMU_GATHER_RCU_TABLE_FREE=y -CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y -CONFIG_HAVE_CMPXCHG_LOCAL=y -CONFIG_HAVE_CMPXCHG_DOUBLE=y -CONFIG_HAVE_ARCH_SECCOMP=y -CONFIG_HAVE_ARCH_SECCOMP_FILTER=y -CONFIG_SECCOMP=y -CONFIG_SECCOMP_FILTER=y -# CONFIG_SECCOMP_CACHE_DEBUG is not set -CONFIG_HAVE_ARCH_STACKLEAK=y -CONFIG_HAVE_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR_STRONG=y -CONFIG_HAVE_CONTEXT_TRACKING=y -CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y -CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y -CONFIG_HAVE_MOVE_PUD=y -CONFIG_HAVE_MOVE_PMD=y -CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y -CONFIG_HAVE_ARCH_HUGE_VMAP=y -CONFIG_HAVE_MOD_ARCH_SPECIFIC=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_ARCH_HAS_ELF_RANDOMIZE=y -CONFIG_HAVE_ARCH_MMAP_RND_BITS=y -CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y -CONFIG_CLONE_BACKWARDS=y -# CONFIG_COMPAT_32BIT_TIME is not set -CONFIG_HAVE_ARCH_VMAP_STACK=y -CONFIG_VMAP_STACK=y -CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y -CONFIG_STRICT_KERNEL_RWX=y -CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y -CONFIG_STRICT_MODULE_RWX=y -CONFIG_HAVE_ARCH_COMPILER_H=y -CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y -CONFIG_ARCH_USE_MEMREMAP_PROT=y -# CONFIG_LOCK_EVENT_COUNTS is not set -CONFIG_ARCH_HAS_RELR=y -CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y -CONFIG_HAVE_ARCH_PFN_VALID=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y - -# -# GCOV-based kernel profiling -# -# CONFIG_GCOV_KERNEL is not set -CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y -# end of GCOV-based kernel profiling - -CONFIG_HAVE_GCC_PLUGINS=y -CONFIG_GCC_PLUGINS=y -# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set -# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set -CONFIG_GCC_PLUGIN_RANDSTRUCT=y -CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE=y -# end of General architecture-dependent options - -CONFIG_RT_MUTEXES=y -CONFIG_BASE_SMALL=0 -CONFIG_MODULES=y -# CONFIG_MODULE_FORCE_LOAD is not set -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODULE_FORCE_UNLOAD is not set -CONFIG_MODVERSIONS=y -CONFIG_ASM_MODVERSIONS=y -# CONFIG_MODULE_SRCVERSION_ALL is not set -# CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set -# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_TRIM_UNUSED_KSYMS is not set -CONFIG_MODULES_TREE_LOOKUP=y -CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_CGROUP_RWSTAT=y -CONFIG_BLK_DEV_BSG=y -CONFIG_BLK_DEV_BSGLIB=y -CONFIG_BLK_DEV_INTEGRITY=y -CONFIG_BLK_DEV_INTEGRITY_T10=y -# CONFIG_BLK_DEV_ZONED is not set -CONFIG_BLK_DEV_THROTTLING=y -# CONFIG_BLK_DEV_THROTTLING_LOW is not set -# CONFIG_BLK_CMDLINE_PARSER is not set -# CONFIG_BLK_WBT is not set -# CONFIG_BLK_CGROUP_IOLATENCY is not set -# CONFIG_BLK_CGROUP_IOCOST is not set -CONFIG_BLK_DEBUG_FS=y -# CONFIG_BLK_SED_OPAL is not set -# CONFIG_BLK_INLINE_ENCRYPTION is not set - -# -# Partition Types -# -CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -# CONFIG_AIX_PARTITION is not set -# CONFIG_OSF_PARTITION is not set -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_ATARI_PARTITION is not set -# CONFIG_MAC_PARTITION is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_MINIX_SUBPARTITION is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_UNIXWARE_DISKLABEL is not set -# CONFIG_LDM_PARTITION is not set -# CONFIG_SGI_PARTITION is not set -# CONFIG_ULTRIX_PARTITION is not set -# CONFIG_SUN_PARTITION is not set -# CONFIG_KARMA_PARTITION is not set -CONFIG_EFI_PARTITION=y -# CONFIG_SYSV68_PARTITION is not set -# CONFIG_CMDLINE_PARTITION is not set -# end of Partition Types - -CONFIG_BLK_MQ_PCI=y -CONFIG_BLK_MQ_VIRTIO=y -CONFIG_BLK_PM=y - -# -# IO Schedulers -# -CONFIG_MQ_IOSCHED_DEADLINE=y -CONFIG_MQ_IOSCHED_KYBER=y -CONFIG_IOSCHED_BFQ=y -CONFIG_BFQ_GROUP_IOSCHED=y -# CONFIG_BFQ_CGROUP_DEBUG is not set -# end of IO Schedulers - -CONFIG_PREEMPT_NOTIFIERS=y -CONFIG_ASN1=y -CONFIG_UNINLINE_SPIN_UNLOCK=y -CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_ARCH_USE_QUEUED_RWLOCKS=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y -CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y -CONFIG_FREEZER=y - -# -# Executable file formats -# -CONFIG_BINFMT_ELF=y -CONFIG_ARCH_BINFMT_ELF_STATE=y -CONFIG_ARCH_HAVE_ELF_PROT=y -CONFIG_ARCH_USE_GNU_PROPERTY=y -CONFIG_ELFCORE=y -# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set -CONFIG_BINFMT_SCRIPT=y -CONFIG_BINFMT_MISC=y -CONFIG_COREDUMP=y -# end of Executable file formats - -# -# Memory Management options -# -CONFIG_SELECT_MEMORY_MODEL=y -# CONFIG_FLATMEM_MANUAL is not set -CONFIG_SPARSEMEM_MANUAL=y -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_HAVE_FAST_GUP=y -CONFIG_ARCH_KEEP_MEMBLOCK=y -# CONFIG_MEMORY_HOTPLUG is not set -CONFIG_SPLIT_PTLOCK_CPUS=4 -CONFIG_MEMORY_BALLOON=y -CONFIG_BALLOON_COMPACTION=y -CONFIG_COMPACTION=y -CONFIG_PAGE_REPORTING=y -CONFIG_MIGRATION=y -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_BOUNCE=y -CONFIG_MMU_NOTIFIER=y -CONFIG_KSM=y -CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 -CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y -# CONFIG_MEMORY_FAILURE is not set -CONFIG_TRANSPARENT_HUGEPAGE=y -CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y -# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set -# CONFIG_CLEANCACHE is not set -# CONFIG_FRONTSWAP is not set -# CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set -CONFIG_GENERIC_EARLY_IOREMAP=y -# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set -# CONFIG_IDLE_PAGE_TRACKING is not set -CONFIG_ARCH_HAS_PTE_DEVMAP=y -CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y -# CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_TEST is not set -# CONFIG_READ_ONLY_THP_FOR_FS is not set -CONFIG_ARCH_HAS_PTE_SPECIAL=y -# end of Memory Management options - -CONFIG_NET=y -CONFIG_NET_INGRESS=y -CONFIG_NET_EGRESS=y -CONFIG_SKB_EXTENSIONS=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_DIAG=y -CONFIG_UNIX=y -CONFIG_UNIX_SCM=y -CONFIG_UNIX_DIAG=y -# CONFIG_TLS is not set -CONFIG_XFRM=y -CONFIG_XFRM_ALGO=m -CONFIG_XFRM_USER=m -# CONFIG_XFRM_INTERFACE is not set -CONFIG_XFRM_SUB_POLICY=y -CONFIG_XFRM_MIGRATE=y -CONFIG_XFRM_STATISTICS=y -CONFIG_XFRM_AH=m -CONFIG_XFRM_ESP=m -CONFIG_XFRM_IPCOMP=m -CONFIG_NET_KEY=m -CONFIG_NET_KEY_MIGRATE=y -CONFIG_XDP_SOCKETS=y -# CONFIG_XDP_SOCKETS_DIAG is not set -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_FIB_TRIE_STATS=y -CONFIG_IP_MULTIPLE_TABLES=y -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_VERBOSE=y -CONFIG_IP_ROUTE_CLASSID=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_DHCP=y -# CONFIG_IP_PNP_BOOTP is not set -# CONFIG_IP_PNP_RARP is not set -CONFIG_NET_IPIP=y -CONFIG_NET_IPGRE_DEMUX=y -CONFIG_NET_IP_TUNNEL=y -CONFIG_NET_IPGRE=m -CONFIG_NET_IPGRE_BROADCAST=y -CONFIG_IP_MROUTE_COMMON=y -CONFIG_IP_MROUTE=y -CONFIG_IP_MROUTE_MULTIPLE_TABLES=y -CONFIG_IP_PIMSM_V1=y -CONFIG_IP_PIMSM_V2=y -CONFIG_SYN_COOKIES=y -CONFIG_NET_IPVTI=m -CONFIG_NET_UDP_TUNNEL=y -CONFIG_NET_FOU=y -CONFIG_NET_FOU_IP_TUNNELS=y -CONFIG_INET_AH=m -CONFIG_INET_ESP=m -# CONFIG_INET_ESP_OFFLOAD is not set -# CONFIG_INET_ESPINTCP is not set -CONFIG_INET_IPCOMP=m -CONFIG_INET_XFRM_TUNNEL=m -CONFIG_INET_TUNNEL=y -CONFIG_INET_DIAG=y -CONFIG_INET_TCP_DIAG=y -CONFIG_INET_UDP_DIAG=y -# CONFIG_INET_RAW_DIAG is not set -# CONFIG_INET_DIAG_DESTROY is not set -# CONFIG_TCP_CONG_ADVANCED is not set -CONFIG_TCP_CONG_CUBIC=y -CONFIG_DEFAULT_TCP_CONG="cubic" -CONFIG_TCP_MD5SIG=y -CONFIG_IPV6=y -CONFIG_IPV6_ROUTER_PREF=y -# CONFIG_IPV6_ROUTE_INFO is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -CONFIG_INET6_AH=m -CONFIG_INET6_ESP=m -# CONFIG_INET6_ESP_OFFLOAD is not set -# CONFIG_INET6_ESPINTCP is not set -CONFIG_INET6_IPCOMP=m -CONFIG_IPV6_MIP6=m -CONFIG_IPV6_ILA=m -CONFIG_INET6_XFRM_TUNNEL=m -CONFIG_INET6_TUNNEL=y -CONFIG_IPV6_VTI=m -CONFIG_IPV6_SIT=m -CONFIG_IPV6_SIT_6RD=y -CONFIG_IPV6_NDISC_NODETYPE=y -CONFIG_IPV6_TUNNEL=y -CONFIG_IPV6_GRE=m -CONFIG_IPV6_FOU=y -CONFIG_IPV6_FOU_TUNNEL=y -CONFIG_IPV6_MULTIPLE_TABLES=y -CONFIG_IPV6_SUBTREES=y -# CONFIG_IPV6_MROUTE is not set -# CONFIG_IPV6_SEG6_LWTUNNEL is not set -# CONFIG_IPV6_SEG6_HMAC is not set -# CONFIG_IPV6_RPL_LWTUNNEL is not set -CONFIG_NETLABEL=y -# CONFIG_MPTCP is not set -CONFIG_NETWORK_SECMARK=y -CONFIG_NET_PTP_CLASSIFY=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set -CONFIG_NETFILTER=y -CONFIG_NETFILTER_ADVANCED=y -CONFIG_BRIDGE_NETFILTER=y - -# -# Core Netfilter Configuration -# -CONFIG_NETFILTER_INGRESS=y -CONFIG_NETFILTER_NETLINK=y -CONFIG_NETFILTER_FAMILY_BRIDGE=y -CONFIG_NETFILTER_FAMILY_ARP=y -CONFIG_NETFILTER_NETLINK_ACCT=y -CONFIG_NETFILTER_NETLINK_QUEUE=y -CONFIG_NETFILTER_NETLINK_LOG=y -CONFIG_NETFILTER_NETLINK_OSF=y -CONFIG_NF_CONNTRACK=y -CONFIG_NF_LOG_COMMON=y -# CONFIG_NF_LOG_NETDEV is not set -CONFIG_NETFILTER_CONNCOUNT=y -CONFIG_NF_CONNTRACK_MARK=y -# CONFIG_NF_CONNTRACK_SECMARK is not set -CONFIG_NF_CONNTRACK_ZONES=y -CONFIG_NF_CONNTRACK_PROCFS=y -CONFIG_NF_CONNTRACK_EVENTS=y -CONFIG_NF_CONNTRACK_TIMEOUT=y -CONFIG_NF_CONNTRACK_TIMESTAMP=y -CONFIG_NF_CONNTRACK_LABELS=y -CONFIG_NF_CT_PROTO_DCCP=y -CONFIG_NF_CT_PROTO_GRE=y -CONFIG_NF_CT_PROTO_SCTP=y -CONFIG_NF_CT_PROTO_UDPLITE=y -CONFIG_NF_CONNTRACK_AMANDA=y -CONFIG_NF_CONNTRACK_FTP=y -CONFIG_NF_CONNTRACK_H323=y -CONFIG_NF_CONNTRACK_IRC=y -CONFIG_NF_CONNTRACK_BROADCAST=y -CONFIG_NF_CONNTRACK_NETBIOS_NS=y -CONFIG_NF_CONNTRACK_SNMP=y -CONFIG_NF_CONNTRACK_PPTP=y -CONFIG_NF_CONNTRACK_SANE=y -CONFIG_NF_CONNTRACK_SIP=y -CONFIG_NF_CONNTRACK_TFTP=y -CONFIG_NF_CT_NETLINK=y -CONFIG_NF_CT_NETLINK_TIMEOUT=y -CONFIG_NF_CT_NETLINK_HELPER=y -CONFIG_NETFILTER_NETLINK_GLUE_CT=y -CONFIG_NF_NAT=y -CONFIG_NF_NAT_AMANDA=y -CONFIG_NF_NAT_FTP=y -CONFIG_NF_NAT_IRC=y -CONFIG_NF_NAT_SIP=y -CONFIG_NF_NAT_TFTP=y -CONFIG_NF_NAT_REDIRECT=y -CONFIG_NF_NAT_MASQUERADE=y -CONFIG_NETFILTER_SYNPROXY=y -CONFIG_NF_TABLES=y -CONFIG_NF_TABLES_INET=y -CONFIG_NF_TABLES_NETDEV=y -# CONFIG_NFT_NUMGEN is not set -CONFIG_NFT_CT=y -CONFIG_NFT_COUNTER=y -CONFIG_NFT_CONNLIMIT=y -CONFIG_NFT_LOG=y -CONFIG_NFT_LIMIT=y -CONFIG_NFT_MASQ=y -CONFIG_NFT_REDIR=y -CONFIG_NFT_NAT=y -CONFIG_NFT_TUNNEL=y -# CONFIG_NFT_OBJREF is not set -CONFIG_NFT_QUEUE=y -# CONFIG_NFT_QUOTA is not set -CONFIG_NFT_REJECT=y -CONFIG_NFT_REJECT_INET=y -CONFIG_NFT_COMPAT=y -CONFIG_NFT_HASH=y -# CONFIG_NFT_XFRM is not set -# CONFIG_NFT_SOCKET is not set -CONFIG_NFT_OSF=y -CONFIG_NFT_TPROXY=y -# CONFIG_NFT_SYNPROXY is not set -CONFIG_NF_DUP_NETDEV=y -CONFIG_NFT_DUP_NETDEV=y -CONFIG_NFT_FWD_NETDEV=y -# CONFIG_NFT_REJECT_NETDEV is not set -# CONFIG_NF_FLOW_TABLE is not set -CONFIG_NETFILTER_XTABLES=y - -# -# Xtables combined modules -# -CONFIG_NETFILTER_XT_MARK=y -CONFIG_NETFILTER_XT_CONNMARK=y -CONFIG_NETFILTER_XT_SET=y - -# -# Xtables targets -# -# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set -CONFIG_NETFILTER_XT_TARGET_CHECKSUM=y -CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y -CONFIG_NETFILTER_XT_TARGET_CONNMARK=y -CONFIG_NETFILTER_XT_TARGET_CT=y -CONFIG_NETFILTER_XT_TARGET_DSCP=y -CONFIG_NETFILTER_XT_TARGET_HL=y -CONFIG_NETFILTER_XT_TARGET_HMARK=y -CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y -CONFIG_NETFILTER_XT_TARGET_LOG=y -CONFIG_NETFILTER_XT_TARGET_MARK=y -CONFIG_NETFILTER_XT_NAT=y -CONFIG_NETFILTER_XT_TARGET_NETMAP=y -CONFIG_NETFILTER_XT_TARGET_NFLOG=y -CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y -CONFIG_NETFILTER_XT_TARGET_NOTRACK=y -CONFIG_NETFILTER_XT_TARGET_RATEEST=y -CONFIG_NETFILTER_XT_TARGET_REDIRECT=y -CONFIG_NETFILTER_XT_TARGET_MASQUERADE=y -CONFIG_NETFILTER_XT_TARGET_TEE=y -CONFIG_NETFILTER_XT_TARGET_TPROXY=y -CONFIG_NETFILTER_XT_TARGET_TRACE=y -# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set -CONFIG_NETFILTER_XT_TARGET_TCPMSS=y -CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y - -# -# Xtables matches -# -CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y -CONFIG_NETFILTER_XT_MATCH_BPF=y -CONFIG_NETFILTER_XT_MATCH_CGROUP=y -CONFIG_NETFILTER_XT_MATCH_CLUSTER=y -CONFIG_NETFILTER_XT_MATCH_COMMENT=y -CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y -CONFIG_NETFILTER_XT_MATCH_CONNLABEL=y -CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y -CONFIG_NETFILTER_XT_MATCH_CONNMARK=y -CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y -CONFIG_NETFILTER_XT_MATCH_CPU=y -CONFIG_NETFILTER_XT_MATCH_DCCP=y -CONFIG_NETFILTER_XT_MATCH_DEVGROUP=y -CONFIG_NETFILTER_XT_MATCH_DSCP=y -CONFIG_NETFILTER_XT_MATCH_ECN=y -CONFIG_NETFILTER_XT_MATCH_ESP=y -CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y -CONFIG_NETFILTER_XT_MATCH_HELPER=y -CONFIG_NETFILTER_XT_MATCH_HL=y -CONFIG_NETFILTER_XT_MATCH_IPCOMP=y -CONFIG_NETFILTER_XT_MATCH_IPRANGE=y -CONFIG_NETFILTER_XT_MATCH_IPVS=y -CONFIG_NETFILTER_XT_MATCH_L2TP=y -CONFIG_NETFILTER_XT_MATCH_LENGTH=y -CONFIG_NETFILTER_XT_MATCH_LIMIT=y -CONFIG_NETFILTER_XT_MATCH_MAC=y -CONFIG_NETFILTER_XT_MATCH_MARK=y -CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y -CONFIG_NETFILTER_XT_MATCH_NFACCT=y -CONFIG_NETFILTER_XT_MATCH_OSF=y -CONFIG_NETFILTER_XT_MATCH_OWNER=y -CONFIG_NETFILTER_XT_MATCH_POLICY=y -CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y -CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QUOTA=y -CONFIG_NETFILTER_XT_MATCH_RATEEST=y -CONFIG_NETFILTER_XT_MATCH_REALM=y -CONFIG_NETFILTER_XT_MATCH_RECENT=y -CONFIG_NETFILTER_XT_MATCH_SCTP=y -CONFIG_NETFILTER_XT_MATCH_SOCKET=y -CONFIG_NETFILTER_XT_MATCH_STATE=y -CONFIG_NETFILTER_XT_MATCH_STATISTIC=y -CONFIG_NETFILTER_XT_MATCH_STRING=y -CONFIG_NETFILTER_XT_MATCH_TCPMSS=y -CONFIG_NETFILTER_XT_MATCH_TIME=y -CONFIG_NETFILTER_XT_MATCH_U32=y -# end of Core Netfilter Configuration - -CONFIG_IP_SET=y -CONFIG_IP_SET_MAX=256 -CONFIG_IP_SET_BITMAP_IP=y -CONFIG_IP_SET_BITMAP_IPMAC=y -CONFIG_IP_SET_BITMAP_PORT=y -CONFIG_IP_SET_HASH_IP=y -# CONFIG_IP_SET_HASH_IPMARK is not set -CONFIG_IP_SET_HASH_IPPORT=y -CONFIG_IP_SET_HASH_IPPORTIP=y -CONFIG_IP_SET_HASH_IPPORTNET=y -# CONFIG_IP_SET_HASH_IPMAC is not set -# CONFIG_IP_SET_HASH_MAC is not set -# CONFIG_IP_SET_HASH_NETPORTNET is not set -CONFIG_IP_SET_HASH_NET=y -# CONFIG_IP_SET_HASH_NETNET is not set -CONFIG_IP_SET_HASH_NETPORT=y -CONFIG_IP_SET_HASH_NETIFACE=y -CONFIG_IP_SET_LIST_SET=y -CONFIG_IP_VS=y -CONFIG_IP_VS_IPV6=y -CONFIG_IP_VS_DEBUG=y -CONFIG_IP_VS_TAB_BITS=12 - -# -# IPVS transport protocol load balancing support -# -CONFIG_IP_VS_PROTO_TCP=y -CONFIG_IP_VS_PROTO_UDP=y -CONFIG_IP_VS_PROTO_AH_ESP=y -CONFIG_IP_VS_PROTO_ESP=y -CONFIG_IP_VS_PROTO_AH=y -CONFIG_IP_VS_PROTO_SCTP=y - -# -# IPVS scheduler -# -CONFIG_IP_VS_RR=y -CONFIG_IP_VS_WRR=y -CONFIG_IP_VS_LC=y -CONFIG_IP_VS_WLC=y -CONFIG_IP_VS_FO=y -CONFIG_IP_VS_OVF=y -CONFIG_IP_VS_LBLC=y -CONFIG_IP_VS_LBLCR=y -CONFIG_IP_VS_DH=y -CONFIG_IP_VS_SH=y -CONFIG_IP_VS_MH=y -CONFIG_IP_VS_SED=y -CONFIG_IP_VS_NQ=y - -# -# IPVS SH scheduler -# -CONFIG_IP_VS_SH_TAB_BITS=8 - -# -# IPVS MH scheduler -# -CONFIG_IP_VS_MH_TAB_INDEX=12 - -# -# IPVS application helper -# -CONFIG_IP_VS_FTP=y -CONFIG_IP_VS_NFCT=y -CONFIG_IP_VS_PE_SIP=y - -# -# IP: Netfilter Configuration -# -CONFIG_NF_DEFRAG_IPV4=y -CONFIG_NF_SOCKET_IPV4=y -CONFIG_NF_TPROXY_IPV4=y -CONFIG_NF_TABLES_IPV4=y -CONFIG_NFT_REJECT_IPV4=y -CONFIG_NFT_DUP_IPV4=y -# CONFIG_NFT_FIB_IPV4 is not set -CONFIG_NF_TABLES_ARP=y -CONFIG_NF_DUP_IPV4=y -CONFIG_NF_LOG_ARP=y -CONFIG_NF_LOG_IPV4=y -CONFIG_NF_REJECT_IPV4=y -CONFIG_NF_NAT_SNMP_BASIC=y -CONFIG_NF_NAT_PPTP=y -CONFIG_NF_NAT_H323=y -CONFIG_IP_NF_IPTABLES=y -CONFIG_IP_NF_MATCH_AH=y -CONFIG_IP_NF_MATCH_ECN=y -CONFIG_IP_NF_MATCH_RPFILTER=y -CONFIG_IP_NF_MATCH_TTL=y -CONFIG_IP_NF_FILTER=y -CONFIG_IP_NF_TARGET_REJECT=y -CONFIG_IP_NF_TARGET_SYNPROXY=y -CONFIG_IP_NF_NAT=y -CONFIG_IP_NF_TARGET_MASQUERADE=y -CONFIG_IP_NF_TARGET_NETMAP=y -CONFIG_IP_NF_TARGET_REDIRECT=y -CONFIG_IP_NF_MANGLE=y -CONFIG_IP_NF_TARGET_CLUSTERIP=y -CONFIG_IP_NF_TARGET_ECN=y -CONFIG_IP_NF_TARGET_TTL=y -CONFIG_IP_NF_RAW=y -CONFIG_IP_NF_SECURITY=y -CONFIG_IP_NF_ARPTABLES=y -CONFIG_IP_NF_ARPFILTER=y -CONFIG_IP_NF_ARP_MANGLE=y -# end of IP: Netfilter Configuration - -# -# IPv6: Netfilter Configuration -# -CONFIG_NF_SOCKET_IPV6=y -CONFIG_NF_TPROXY_IPV6=y -CONFIG_NF_TABLES_IPV6=y -CONFIG_NFT_REJECT_IPV6=y -CONFIG_NFT_DUP_IPV6=y -# CONFIG_NFT_FIB_IPV6 is not set -CONFIG_NF_DUP_IPV6=y -CONFIG_NF_REJECT_IPV6=y -CONFIG_NF_LOG_IPV6=y -CONFIG_IP6_NF_IPTABLES=y -CONFIG_IP6_NF_MATCH_AH=y -CONFIG_IP6_NF_MATCH_EUI64=y -CONFIG_IP6_NF_MATCH_FRAG=y -CONFIG_IP6_NF_MATCH_OPTS=y -CONFIG_IP6_NF_MATCH_HL=y -CONFIG_IP6_NF_MATCH_IPV6HEADER=y -CONFIG_IP6_NF_MATCH_MH=y -CONFIG_IP6_NF_MATCH_RPFILTER=y -CONFIG_IP6_NF_MATCH_RT=y -# CONFIG_IP6_NF_MATCH_SRH is not set -CONFIG_IP6_NF_TARGET_HL=y -CONFIG_IP6_NF_FILTER=y -CONFIG_IP6_NF_TARGET_REJECT=y -CONFIG_IP6_NF_TARGET_SYNPROXY=y -CONFIG_IP6_NF_MANGLE=y -CONFIG_IP6_NF_RAW=y -CONFIG_IP6_NF_SECURITY=y -CONFIG_IP6_NF_NAT=y -CONFIG_IP6_NF_TARGET_MASQUERADE=y -CONFIG_IP6_NF_TARGET_NPT=y -# end of IPv6: Netfilter Configuration - -CONFIG_NF_DEFRAG_IPV6=y -CONFIG_NF_TABLES_BRIDGE=y -# CONFIG_NFT_BRIDGE_META is not set -CONFIG_NFT_BRIDGE_REJECT=y -CONFIG_NF_LOG_BRIDGE=y -# CONFIG_NF_CONNTRACK_BRIDGE is not set -CONFIG_BRIDGE_NF_EBTABLES=y -CONFIG_BRIDGE_EBT_BROUTE=y -CONFIG_BRIDGE_EBT_T_FILTER=y -CONFIG_BRIDGE_EBT_T_NAT=y -CONFIG_BRIDGE_EBT_802_3=y -CONFIG_BRIDGE_EBT_AMONG=y -CONFIG_BRIDGE_EBT_ARP=y -CONFIG_BRIDGE_EBT_IP=y -CONFIG_BRIDGE_EBT_IP6=y -CONFIG_BRIDGE_EBT_LIMIT=y -CONFIG_BRIDGE_EBT_MARK=y -CONFIG_BRIDGE_EBT_PKTTYPE=y -CONFIG_BRIDGE_EBT_STP=y -CONFIG_BRIDGE_EBT_VLAN=y -CONFIG_BRIDGE_EBT_ARPREPLY=y -CONFIG_BRIDGE_EBT_DNAT=y -CONFIG_BRIDGE_EBT_MARK_T=y -CONFIG_BRIDGE_EBT_REDIRECT=y -CONFIG_BRIDGE_EBT_SNAT=y -CONFIG_BRIDGE_EBT_LOG=y -CONFIG_BRIDGE_EBT_NFLOG=y -# CONFIG_BPFILTER is not set -# CONFIG_IP_DCCP is not set -CONFIG_IP_SCTP=m -# CONFIG_SCTP_DBG_OBJCNT is not set -CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y -# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set -# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set -CONFIG_SCTP_COOKIE_HMAC_MD5=y -# CONFIG_SCTP_COOKIE_HMAC_SHA1 is not set -CONFIG_INET_SCTP_DIAG=m -# CONFIG_RDS is not set -# CONFIG_TIPC is not set -# CONFIG_ATM is not set -CONFIG_L2TP=m -# CONFIG_L2TP_DEBUGFS is not set -# CONFIG_L2TP_V3 is not set -CONFIG_STP=y -CONFIG_BRIDGE=y -CONFIG_BRIDGE_IGMP_SNOOPING=y -CONFIG_BRIDGE_VLAN_FILTERING=y -# CONFIG_BRIDGE_MRP is not set -# CONFIG_BRIDGE_CFM is not set -CONFIG_HAVE_NET_DSA=y -# CONFIG_NET_DSA is not set -CONFIG_VLAN_8021Q=y -# CONFIG_VLAN_8021Q_GVRP is not set -# CONFIG_VLAN_8021Q_MVRP is not set -# CONFIG_DECNET is not set -CONFIG_LLC=y -# CONFIG_LLC2 is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_PHONET is not set -# CONFIG_6LOWPAN is not set -# CONFIG_IEEE802154 is not set -CONFIG_NET_SCHED=y - -# -# Queueing/Scheduling -# -CONFIG_NET_SCH_CBQ=m -CONFIG_NET_SCH_HTB=m -CONFIG_NET_SCH_HFSC=m -CONFIG_NET_SCH_PRIO=m -CONFIG_NET_SCH_MULTIQ=m -CONFIG_NET_SCH_RED=m -CONFIG_NET_SCH_SFB=m -CONFIG_NET_SCH_SFQ=m -CONFIG_NET_SCH_TEQL=m -CONFIG_NET_SCH_TBF=m -# CONFIG_NET_SCH_CBS is not set -# CONFIG_NET_SCH_ETF is not set -# CONFIG_NET_SCH_TAPRIO is not set -CONFIG_NET_SCH_GRED=m -CONFIG_NET_SCH_DSMARK=m -CONFIG_NET_SCH_NETEM=m -CONFIG_NET_SCH_DRR=m -CONFIG_NET_SCH_MQPRIO=m -# CONFIG_NET_SCH_SKBPRIO is not set -CONFIG_NET_SCH_CHOKE=m -CONFIG_NET_SCH_QFQ=m -# CONFIG_NET_SCH_CODEL is not set -# CONFIG_NET_SCH_FQ_CODEL is not set -# CONFIG_NET_SCH_CAKE is not set -# CONFIG_NET_SCH_FQ is not set -# CONFIG_NET_SCH_HHF is not set -# CONFIG_NET_SCH_PIE is not set -CONFIG_NET_SCH_INGRESS=m -# CONFIG_NET_SCH_PLUG is not set -# CONFIG_NET_SCH_ETS is not set -# CONFIG_NET_SCH_DEFAULT is not set - -# -# Classification -# -CONFIG_NET_CLS=y -CONFIG_NET_CLS_BASIC=y -CONFIG_NET_CLS_TCINDEX=y -CONFIG_NET_CLS_ROUTE4=y -CONFIG_NET_CLS_FW=y -CONFIG_NET_CLS_U32=y -CONFIG_CLS_U32_PERF=y -CONFIG_CLS_U32_MARK=y -CONFIG_NET_CLS_RSVP=y -CONFIG_NET_CLS_RSVP6=y -CONFIG_NET_CLS_FLOW=y -CONFIG_NET_CLS_CGROUP=y -CONFIG_NET_CLS_BPF=y -# CONFIG_NET_CLS_FLOWER is not set -CONFIG_NET_CLS_MATCHALL=y -CONFIG_NET_EMATCH=y -CONFIG_NET_EMATCH_STACK=32 -CONFIG_NET_EMATCH_CMP=y -CONFIG_NET_EMATCH_NBYTE=y -CONFIG_NET_EMATCH_U32=y -CONFIG_NET_EMATCH_META=y -CONFIG_NET_EMATCH_TEXT=y -CONFIG_NET_EMATCH_IPSET=y -# CONFIG_NET_EMATCH_IPT is not set -CONFIG_NET_CLS_ACT=y -CONFIG_NET_ACT_POLICE=y -CONFIG_NET_ACT_GACT=y -CONFIG_GACT_PROB=y -CONFIG_NET_ACT_MIRRED=y -# CONFIG_NET_ACT_SAMPLE is not set -CONFIG_NET_ACT_IPT=y -CONFIG_NET_ACT_NAT=y -CONFIG_NET_ACT_PEDIT=y -CONFIG_NET_ACT_SIMP=y -CONFIG_NET_ACT_SKBEDIT=y -CONFIG_NET_ACT_CSUM=y -# CONFIG_NET_ACT_MPLS is not set -# CONFIG_NET_ACT_VLAN is not set -CONFIG_NET_ACT_BPF=y -# CONFIG_NET_ACT_CONNMARK is not set -# CONFIG_NET_ACT_CTINFO is not set -# CONFIG_NET_ACT_SKBMOD is not set -# CONFIG_NET_ACT_IFE is not set -# CONFIG_NET_ACT_TUNNEL_KEY is not set -# CONFIG_NET_ACT_GATE is not set -# CONFIG_NET_TC_SKB_EXT is not set -CONFIG_NET_SCH_FIFO=y -# CONFIG_DCB is not set -CONFIG_DNS_RESOLVER=y -# CONFIG_BATMAN_ADV is not set -CONFIG_OPENVSWITCH=m -CONFIG_OPENVSWITCH_GRE=m -CONFIG_OPENVSWITCH_VXLAN=m -CONFIG_OPENVSWITCH_GENEVE=m -CONFIG_VSOCKETS=m -CONFIG_VSOCKETS_DIAG=m -CONFIG_VSOCKETS_LOOPBACK=m -CONFIG_VIRTIO_VSOCKETS=m -CONFIG_VIRTIO_VSOCKETS_COMMON=m -CONFIG_NETLINK_DIAG=y -CONFIG_MPLS=y -CONFIG_NET_MPLS_GSO=m -CONFIG_MPLS_ROUTING=m -CONFIG_MPLS_IPTUNNEL=m -CONFIG_NET_NSH=m -# CONFIG_HSR is not set -CONFIG_NET_SWITCHDEV=y -CONFIG_NET_L3_MASTER_DEV=y -# CONFIG_QRTR is not set -# CONFIG_NET_NCSI is not set -CONFIG_RPS=y -CONFIG_RFS_ACCEL=y -CONFIG_XPS=y -CONFIG_CGROUP_NET_PRIO=y -CONFIG_CGROUP_NET_CLASSID=y -CONFIG_NET_RX_BUSY_POLL=y -CONFIG_BQL=y -CONFIG_BPF_JIT=y -# CONFIG_BPF_STREAM_PARSER is not set -CONFIG_NET_FLOW_LIMIT=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_DROP_MONITOR is not set -# end of Network testing -# end of Networking options - -# CONFIG_HAMRADIO is not set -# CONFIG_CAN is not set -# CONFIG_BT is not set -# CONFIG_AF_RXRPC is not set -# CONFIG_AF_KCM is not set -CONFIG_FIB_RULES=y -CONFIG_WIRELESS=y -# CONFIG_CFG80211 is not set - -# -# CFG80211 needs to be enabled for MAC80211 -# -CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 -# CONFIG_RFKILL is not set -CONFIG_NET_9P=y -CONFIG_NET_9P_VIRTIO=y -# CONFIG_NET_9P_XEN is not set -# CONFIG_NET_9P_DEBUG is not set -# CONFIG_CAIF is not set -CONFIG_CEPH_LIB=m -# CONFIG_CEPH_LIB_PRETTYDEBUG is not set -# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set -# CONFIG_NFC is not set -# CONFIG_PSAMPLE is not set -# CONFIG_NET_IFE is not set -CONFIG_LWTUNNEL=y -CONFIG_LWTUNNEL_BPF=y -CONFIG_DST_CACHE=y -CONFIG_GRO_CELLS=y -CONFIG_NET_DEVLINK=y -CONFIG_PAGE_POOL=y -CONFIG_FAILOVER=y -CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y - -# -# Device Drivers -# -CONFIG_ARM_AMBA=y -CONFIG_HAVE_PCI=y -CONFIG_PCI=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_DOMAINS_GENERIC=y -CONFIG_PCI_SYSCALL=y -CONFIG_PCIEPORTBUS=y -CONFIG_HOTPLUG_PCI_PCIE=y -# CONFIG_PCIEAER is not set -CONFIG_PCIEASPM=y -CONFIG_PCIEASPM_DEFAULT=y -# CONFIG_PCIEASPM_POWERSAVE is not set -# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set -# CONFIG_PCIEASPM_PERFORMANCE is not set -CONFIG_PCIE_PME=y -# CONFIG_PCIE_PTM is not set -# CONFIG_PCIE_BW is not set -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCI_QUIRKS=y -# CONFIG_PCI_DEBUG is not set -CONFIG_PCI_REALLOC_ENABLE_AUTO=y -CONFIG_PCI_STUB=y -# CONFIG_PCI_PF_STUB is not set -CONFIG_PCI_ATS=y -CONFIG_PCI_ECAM=y -CONFIG_PCI_IOV=y -CONFIG_PCI_PRI=y -CONFIG_PCI_PASID=y -CONFIG_PCI_LABEL=y -# CONFIG_PCIE_BUS_TUNE_OFF is not set -CONFIG_PCIE_BUS_DEFAULT=y -# CONFIG_PCIE_BUS_SAFE is not set -# CONFIG_PCIE_BUS_PERFORMANCE is not set -# CONFIG_PCIE_BUS_PEER2PEER is not set -CONFIG_HOTPLUG_PCI=y -CONFIG_HOTPLUG_PCI_ACPI=y -# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set -# CONFIG_HOTPLUG_PCI_CPCI is not set -# CONFIG_HOTPLUG_PCI_SHPC is not set - -# -# PCI controller drivers -# -# CONFIG_PCI_FTPCI100 is not set -CONFIG_PCI_HOST_COMMON=y -CONFIG_PCI_HOST_GENERIC=y -# CONFIG_PCIE_XILINX is not set -# CONFIG_PCI_XGENE is not set -# CONFIG_PCIE_ALTERA is not set -CONFIG_PCI_HOST_THUNDER_PEM=y -CONFIG_PCI_HOST_THUNDER_ECAM=y -# CONFIG_PCIE_BRCMSTB is not set - -# -# DesignWare PCI Core Support -# -CONFIG_PCIE_DW=y -CONFIG_PCIE_DW_HOST=y -# CONFIG_PCIE_DW_PLAT_HOST is not set -# CONFIG_PCI_EXYNOS is not set -# CONFIG_PCI_LAYERSCAPE is not set -CONFIG_PCI_HISI=y -CONFIG_PCIE_QCOM=y -# CONFIG_PCIE_KIRIN is not set -CONFIG_PCIE_HISI_STB=y -# CONFIG_PCI_MESON is not set -# CONFIG_PCIE_AL is not set -# end of DesignWare PCI Core Support - -# -# Mobiveil PCIe Core Support -# -# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set -# end of Mobiveil PCIe Core Support - -# -# Cadence PCIe controllers support -# -# CONFIG_PCIE_CADENCE_PLAT_HOST is not set -# CONFIG_PCI_J721E_HOST is not set -# end of Cadence PCIe controllers support -# end of PCI controller drivers - -# -# PCI Endpoint -# -# CONFIG_PCI_ENDPOINT is not set -# end of PCI Endpoint - -# -# PCI switch controller drivers -# -# CONFIG_PCI_SW_SWITCHTEC is not set -# end of PCI switch controller drivers - -# CONFIG_PCCARD is not set -# CONFIG_RAPIDIO is not set - -# -# Generic Driver Options -# -CONFIG_AUXILIARY_BUS=y -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="" -CONFIG_DEVTMPFS=y -# CONFIG_DEVTMPFS_MOUNT is not set -CONFIG_STANDALONE=y -CONFIG_PREVENT_FIRMWARE_BUILD=y - -# -# Firmware loader -# -CONFIG_FW_LOADER=y -CONFIG_EXTRA_FIRMWARE="" -# CONFIG_FW_LOADER_USER_HELPER is not set -# CONFIG_FW_LOADER_COMPRESS is not set -# end of Firmware loader - -CONFIG_ALLOW_DEV_COREDUMP=y -# CONFIG_DEBUG_DRIVER is not set -# CONFIG_DEBUG_DEVRES is not set -# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set -# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set -CONFIG_SYS_HYPERVISOR=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_SOC_BUS=y -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y -CONFIG_REGMAP_MMIO=y -CONFIG_GENERIC_ARCH_TOPOLOGY=y -# end of Generic Driver Options - -# -# Bus devices -# -CONFIG_ARM_CCI=y -CONFIG_ARM_CCI400_COMMON=y -# CONFIG_BRCMSTB_GISB_ARB is not set -# CONFIG_HISILICON_LPC is not set -CONFIG_QCOM_EBI2=y -# CONFIG_SIMPLE_PM_BUS is not set -CONFIG_VEXPRESS_CONFIG=y -# CONFIG_FSL_MC_BUS is not set -# CONFIG_MHI_BUS is not set -# end of Bus devices - -# CONFIG_CONNECTOR is not set -# CONFIG_GNSS is not set -# CONFIG_MTD is not set -CONFIG_DTC=y -CONFIG_OF=y -# CONFIG_OF_UNITTEST is not set -CONFIG_OF_FLATTREE=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_KOBJ=y -CONFIG_OF_DYNAMIC=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_IRQ=y -CONFIG_OF_NET=y -CONFIG_OF_RESERVED_MEM=y -CONFIG_OF_RESOLVE=y -CONFIG_OF_OVERLAY=y -# CONFIG_PARPORT is not set -CONFIG_PNP=y -CONFIG_PNP_DEBUG_MESSAGES=y - -# -# Protocols -# -CONFIG_PNPACPI=y -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_NULL_BLK is not set -CONFIG_CDROM=y -# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -CONFIG_BLK_DEV_CRYPTOLOOP=y -CONFIG_BLK_DEV_DRBD=m -# CONFIG_DRBD_FAULT_INJECTION is not set -CONFIG_BLK_DEV_NBD=y -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set -CONFIG_BLK_DEV_RAM=m -CONFIG_BLK_DEV_RAM_COUNT=16 -CONFIG_BLK_DEV_RAM_SIZE=4096 -# CONFIG_CDROM_PKTCDVD is not set -CONFIG_ATA_OVER_ETH=m -CONFIG_XEN_BLKDEV_FRONTEND=y -CONFIG_VIRTIO_BLK=y -CONFIG_BLK_DEV_RBD=m -# CONFIG_BLK_DEV_RSXX is not set - -# -# NVME Support -# -CONFIG_NVME_CORE=y -CONFIG_BLK_DEV_NVME=y -# CONFIG_NVME_MULTIPATH is not set -# CONFIG_NVME_HWMON is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TCP is not set -# CONFIG_NVME_TARGET is not set -# end of NVME Support - -# -# Misc devices -# -# CONFIG_AD525X_DPOT is not set -# CONFIG_DUMMY_IRQ is not set -# CONFIG_PHANTOM is not set -# CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set -# CONFIG_SRAM is not set -# CONFIG_PCI_ENDPOINT_TEST is not set -# CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set -# CONFIG_HISI_HIKEY_USB is not set -# CONFIG_C2PORT is not set - -# -# EEPROM support -# -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -# CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set -# end of EEPROM support - -# CONFIG_CB710_CORE is not set - -# -# Texas Instruments shared transport line discipline -# -# CONFIG_TI_ST is not set -# end of Texas Instruments shared transport line discipline - -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set -# CONFIG_GENWQE is not set -# CONFIG_ECHO is not set -# CONFIG_MISC_ALCOR_PCI is not set -# CONFIG_MISC_RTSX_PCI is not set -# CONFIG_MISC_RTSX_USB is not set -# CONFIG_HABANA_AI is not set -# end of Misc devices - -# -# SCSI device support -# -CONFIG_SCSI_MOD=y -CONFIG_RAID_ATTRS=m -CONFIG_SCSI=y -CONFIG_SCSI_DMA=y -# CONFIG_SCSI_PROC_FS is not set - -# -# SCSI support type (disk, tape, CD-ROM) -# -CONFIG_BLK_DEV_SD=y -# CONFIG_CHR_DEV_ST is not set -CONFIG_BLK_DEV_SR=y -CONFIG_CHR_DEV_SG=y -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_LOGGING is not set -# CONFIG_SCSI_SCAN_ASYNC is not set - -# -# SCSI Transports -# -CONFIG_SCSI_SPI_ATTRS=y -# CONFIG_SCSI_FC_ATTRS is not set -CONFIG_SCSI_ISCSI_ATTRS=m -CONFIG_SCSI_SAS_ATTRS=y -CONFIG_SCSI_SAS_LIBSAS=y -# CONFIG_SCSI_SAS_ATA is not set -CONFIG_SCSI_SAS_HOST_SMP=y -# CONFIG_SCSI_SRP_ATTRS is not set -# end of SCSI Transports - -CONFIG_SCSI_LOWLEVEL=y -CONFIG_ISCSI_TCP=m -# CONFIG_ISCSI_BOOT_SYSFS is not set -# CONFIG_SCSI_CXGB3_ISCSI is not set -# CONFIG_SCSI_CXGB4_ISCSI is not set -# CONFIG_SCSI_BNX2_ISCSI is not set -# CONFIG_BE2ISCSI is not set -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -CONFIG_SCSI_HPSA=m -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_3W_SAS is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_AIC94XX is not set -CONFIG_SCSI_HISI_SAS=y -# CONFIG_SCSI_HISI_SAS_PCI is not set -# CONFIG_SCSI_MVSAS is not set -# CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_ADVANSYS is not set -# CONFIG_SCSI_ARCMSR is not set -# CONFIG_SCSI_ESAS2R is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_LEGACY is not set -CONFIG_MEGARAID_SAS=y -# CONFIG_SCSI_MPT3SAS is not set -# CONFIG_SCSI_MPT2SAS is not set -CONFIG_SCSI_SMARTPQI=m -# CONFIG_SCSI_UFSHCD is not set -# CONFIG_SCSI_HPTIOP is not set -# CONFIG_SCSI_MYRB is not set -# CONFIG_SCSI_MYRS is not set -CONFIG_XEN_SCSI_FRONTEND=y -# CONFIG_SCSI_SNIC is not set -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_STEX is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -# CONFIG_SCSI_QLA_ISCSI is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_AM53C974 is not set -# CONFIG_SCSI_WD719X is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_PMCRAID is not set -# CONFIG_SCSI_PM8001 is not set -CONFIG_SCSI_VIRTIO=y -# CONFIG_SCSI_DH is not set -# end of SCSI device support - -CONFIG_HAVE_PATA_PLATFORM=y -CONFIG_ATA=y -CONFIG_SATA_HOST=y -CONFIG_PATA_TIMINGS=y -# CONFIG_ATA_VERBOSE_ERROR is not set -CONFIG_ATA_FORCE=y -CONFIG_ATA_ACPI=y -# CONFIG_SATA_ZPODD is not set -# CONFIG_SATA_PMP is not set - -# -# Controllers with non-SFF native interface -# -CONFIG_SATA_AHCI=y -CONFIG_SATA_MOBILE_LPM_POLICY=0 -CONFIG_SATA_AHCI_PLATFORM=y -# CONFIG_AHCI_CEVA is not set -# CONFIG_AHCI_QORIQ is not set -CONFIG_SATA_AHCI_SEATTLE=y -# CONFIG_SATA_INIC162X is not set -# CONFIG_SATA_ACARD_AHCI is not set -# CONFIG_SATA_SIL24 is not set -CONFIG_ATA_SFF=y - -# -# SFF controllers with custom DMA interface -# -# CONFIG_PDC_ADMA is not set -# CONFIG_SATA_QSTOR is not set -# CONFIG_SATA_SX4 is not set -CONFIG_ATA_BMDMA=y - -# -# SATA SFF controllers with BMDMA -# -# CONFIG_ATA_PIIX is not set -# CONFIG_SATA_DWC is not set -# CONFIG_SATA_MV is not set -# CONFIG_SATA_NV is not set -# CONFIG_SATA_PROMISE is not set -# CONFIG_SATA_SIL is not set -# CONFIG_SATA_SIS is not set -# CONFIG_SATA_SVW is not set -# CONFIG_SATA_ULI is not set -# CONFIG_SATA_VIA is not set -# CONFIG_SATA_VITESSE is not set - -# -# PATA SFF controllers with BMDMA -# -# CONFIG_PATA_ALI is not set -# CONFIG_PATA_AMD is not set -# CONFIG_PATA_ARTOP is not set -# CONFIG_PATA_ATIIXP is not set -# CONFIG_PATA_ATP867X is not set -# CONFIG_PATA_CMD64X is not set -# CONFIG_PATA_CYPRESS is not set -# CONFIG_PATA_EFAR is not set -# CONFIG_PATA_HPT366 is not set -# CONFIG_PATA_HPT37X is not set -# CONFIG_PATA_HPT3X2N is not set -# CONFIG_PATA_HPT3X3 is not set -# CONFIG_PATA_IT8213 is not set -# CONFIG_PATA_IT821X is not set -# CONFIG_PATA_JMICRON is not set -# CONFIG_PATA_MARVELL is not set -# CONFIG_PATA_NETCELL is not set -# CONFIG_PATA_NINJA32 is not set -# CONFIG_PATA_NS87415 is not set -# CONFIG_PATA_OLDPIIX is not set -# CONFIG_PATA_OPTIDMA is not set -# CONFIG_PATA_PDC2027X is not set -# CONFIG_PATA_PDC_OLD is not set -# CONFIG_PATA_RADISYS is not set -# CONFIG_PATA_RDC is not set -# CONFIG_PATA_SCH is not set -# CONFIG_PATA_SERVERWORKS is not set -# CONFIG_PATA_SIL680 is not set -CONFIG_PATA_SIS=y -# CONFIG_PATA_TOSHIBA is not set -# CONFIG_PATA_TRIFLEX is not set -# CONFIG_PATA_VIA is not set -# CONFIG_PATA_WINBOND is not set - -# -# PIO-only SFF controllers -# -# CONFIG_PATA_CMD640_PCI is not set -# CONFIG_PATA_MPIIX is not set -# CONFIG_PATA_NS87410 is not set -# CONFIG_PATA_OPTI is not set -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_OF_PLATFORM=y -# CONFIG_PATA_RZ1000 is not set - -# -# Generic fallback / legacy drivers -# -CONFIG_PATA_ACPI=y -CONFIG_ATA_GENERIC=y -# CONFIG_PATA_LEGACY is not set -CONFIG_MD=y -# CONFIG_BLK_DEV_MD is not set -# CONFIG_BCACHE is not set -CONFIG_BLK_DEV_DM_BUILTIN=y -CONFIG_BLK_DEV_DM=y -# CONFIG_DM_DEBUG is not set -CONFIG_DM_BUFIO=y -# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set -CONFIG_DM_BIO_PRISON=y -CONFIG_DM_PERSISTENT_DATA=y -# CONFIG_DM_UNSTRIPED is not set -CONFIG_DM_CRYPT=y -CONFIG_DM_SNAPSHOT=y -CONFIG_DM_THIN_PROVISIONING=y -# CONFIG_DM_CACHE is not set -# CONFIG_DM_WRITECACHE is not set -# CONFIG_DM_EBS is not set -# CONFIG_DM_ERA is not set -# CONFIG_DM_CLONE is not set -# CONFIG_DM_MIRROR is not set -# CONFIG_DM_RAID is not set -# CONFIG_DM_ZERO is not set -CONFIG_DM_MULTIPATH=m -CONFIG_DM_MULTIPATH_QL=m -CONFIG_DM_MULTIPATH_ST=m -# CONFIG_DM_MULTIPATH_HST is not set -# CONFIG_DM_MULTIPATH_IOA is not set -# CONFIG_DM_DELAY is not set -# CONFIG_DM_DUST is not set -# CONFIG_DM_INIT is not set -# CONFIG_DM_UEVENT is not set -# CONFIG_DM_FLAKEY is not set -# CONFIG_DM_VERITY is not set -# CONFIG_DM_SWITCH is not set -# CONFIG_DM_LOG_WRITES is not set -# CONFIG_DM_INTEGRITY is not set -# CONFIG_TARGET_CORE is not set -CONFIG_FUSION=y -CONFIG_FUSION_SPI=y -# CONFIG_FUSION_SAS is not set -CONFIG_FUSION_MAX_SGE=128 -# CONFIG_FUSION_CTL is not set -# CONFIG_FUSION_LOGGING is not set - -# -# IEEE 1394 (FireWire) support -# -# CONFIG_FIREWIRE is not set -# CONFIG_FIREWIRE_NOSY is not set -# end of IEEE 1394 (FireWire) support - -CONFIG_NETDEVICES=y -CONFIG_MII=y -CONFIG_NET_CORE=y -CONFIG_BONDING=m -CONFIG_DUMMY=m -CONFIG_WIREGUARD=m -# CONFIG_WIREGUARD_DEBUG is not set -# CONFIG_EQUALIZER is not set -# CONFIG_NET_FC is not set -# CONFIG_IFB is not set -CONFIG_NET_TEAM=m -CONFIG_NET_TEAM_MODE_BROADCAST=m -CONFIG_NET_TEAM_MODE_ROUNDROBIN=m -CONFIG_NET_TEAM_MODE_RANDOM=m -CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m -CONFIG_NET_TEAM_MODE_LOADBALANCE=m -CONFIG_MACVLAN=y -CONFIG_MACVTAP=y -CONFIG_IPVLAN_L3S=y -CONFIG_IPVLAN=y -# CONFIG_IPVTAP is not set -CONFIG_VXLAN=y -CONFIG_GENEVE=m -# CONFIG_BAREUDP is not set -# CONFIG_GTP is not set -# CONFIG_MACSEC is not set -# CONFIG_NETCONSOLE is not set -CONFIG_TUN=y -CONFIG_TAP=y -# CONFIG_TUN_VNET_CROSS_LE is not set -CONFIG_VETH=y -CONFIG_VIRTIO_NET=y -CONFIG_NLMON=y -# CONFIG_NET_VRF is not set -# CONFIG_VSOCKMON is not set -# CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - -CONFIG_ETHERNET=y -CONFIG_MDIO=m -# CONFIG_NET_VENDOR_3COM is not set -# CONFIG_NET_VENDOR_ADAPTEC is not set -# CONFIG_NET_VENDOR_AGERE is not set -# CONFIG_NET_VENDOR_ALACRITECH is not set -# CONFIG_NET_VENDOR_ALTEON is not set -# CONFIG_ALTERA_TSE is not set -CONFIG_NET_VENDOR_AMAZON=y -CONFIG_ENA_ETHERNET=m -# CONFIG_NET_VENDOR_AMD is not set -# CONFIG_NET_VENDOR_AQUANTIA is not set -# CONFIG_NET_VENDOR_ARC is not set -# CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set -CONFIG_NET_VENDOR_BROADCOM=y -# CONFIG_B44 is not set -# CONFIG_BCMGENET is not set -CONFIG_BNX2=m -CONFIG_CNIC=m -CONFIG_TIGON3=m -CONFIG_TIGON3_HWMON=y -CONFIG_BNX2X=m -CONFIG_BNX2X_SRIOV=y -# CONFIG_SYSTEMPORT is not set -CONFIG_BNXT=m -CONFIG_BNXT_SRIOV=y -CONFIG_BNXT_FLOWER_OFFLOAD=y -CONFIG_BNXT_HWMON=y -# CONFIG_NET_VENDOR_BROCADE is not set -# CONFIG_NET_VENDOR_CADENCE is not set -CONFIG_NET_VENDOR_CAVIUM=y -CONFIG_THUNDER_NIC_PF=m -CONFIG_THUNDER_NIC_VF=m -CONFIG_THUNDER_NIC_BGX=m -CONFIG_THUNDER_NIC_RGX=m -CONFIG_CAVIUM_PTP=y -# CONFIG_LIQUIDIO is not set -# CONFIG_LIQUIDIO_VF is not set -# CONFIG_NET_VENDOR_CHELSIO is not set -# CONFIG_NET_VENDOR_CISCO is not set -CONFIG_NET_VENDOR_CORTINA=y -# CONFIG_GEMINI_ETHERNET is not set -# CONFIG_DNET is not set -# CONFIG_NET_VENDOR_DEC is not set -# CONFIG_NET_VENDOR_DLINK is not set -# CONFIG_NET_VENDOR_EMULEX is not set -# CONFIG_NET_VENDOR_EZCHIP is not set -# CONFIG_NET_VENDOR_FREESCALE is not set -CONFIG_NET_VENDOR_GOOGLE=y -# CONFIG_GVE is not set -CONFIG_NET_VENDOR_HISILICON=y -# CONFIG_HIX5HD2_GMAC is not set -# CONFIG_HISI_FEMAC is not set -# CONFIG_HIP04_ETH is not set -CONFIG_HNS_MDIO=m -CONFIG_HNS=m -CONFIG_HNS_DSAF=m -CONFIG_HNS_ENET=m -# CONFIG_HNS3 is not set -CONFIG_NET_VENDOR_HUAWEI=y -# CONFIG_HINIC is not set -# CONFIG_NET_VENDOR_I825XX is not set -CONFIG_NET_VENDOR_INTEL=y -# CONFIG_E100 is not set -CONFIG_E1000=m -CONFIG_E1000E=m -CONFIG_IGB=m -CONFIG_IGB_HWMON=y -CONFIG_IGBVF=m -CONFIG_IXGB=m -CONFIG_IXGBE=m -CONFIG_IXGBE_HWMON=y -CONFIG_IXGBEVF=m -CONFIG_I40E=m -CONFIG_IAVF=m -CONFIG_I40EVF=m -CONFIG_ICE=m -# CONFIG_FM10K is not set -# CONFIG_IGC is not set -# CONFIG_JME is not set -# CONFIG_NET_VENDOR_MARVELL is not set -CONFIG_NET_VENDOR_MELLANOX=y -CONFIG_MLX4_EN=m -CONFIG_MLX4_CORE=m -CONFIG_MLX4_DEBUG=y -CONFIG_MLX4_CORE_GEN2=y -CONFIG_MLX5_CORE=m -# CONFIG_MLX5_FPGA is not set -CONFIG_MLX5_CORE_EN=y -CONFIG_MLX5_EN_ARFS=y -CONFIG_MLX5_EN_RXNFC=y -CONFIG_MLX5_MPFS=y -CONFIG_MLX5_ESWITCH=y -CONFIG_MLX5_CLS_ACT=y -# CONFIG_MLX5_CORE_IPOIB is not set -CONFIG_MLX5_SW_STEERING=y -# CONFIG_MLXSW_CORE is not set -# CONFIG_MLXFW is not set -# CONFIG_NET_VENDOR_MICREL is not set -# CONFIG_NET_VENDOR_MICROCHIP is not set -CONFIG_NET_VENDOR_MICROSEMI=y -# CONFIG_MSCC_OCELOT_SWITCH is not set -# CONFIG_NET_VENDOR_MYRI is not set -# CONFIG_FEALNX is not set -# CONFIG_NET_VENDOR_NATSEMI is not set -# CONFIG_NET_VENDOR_NETERION is not set -CONFIG_NET_VENDOR_NETRONOME=y -CONFIG_NFP=m -CONFIG_NFP_APP_FLOWER=y -CONFIG_NFP_APP_ABM_NIC=y -# CONFIG_NFP_DEBUG is not set -# CONFIG_NET_VENDOR_NI is not set -# CONFIG_NET_VENDOR_NVIDIA is not set -# CONFIG_NET_VENDOR_OKI is not set -# CONFIG_ETHOC is not set -# CONFIG_NET_VENDOR_PACKET_ENGINES is not set -CONFIG_NET_VENDOR_PENSANDO=y -# CONFIG_IONIC is not set -# CONFIG_NET_VENDOR_QLOGIC is not set -# CONFIG_NET_VENDOR_QUALCOMM is not set -# CONFIG_NET_VENDOR_RDC is not set -CONFIG_NET_VENDOR_REALTEK=y -CONFIG_8139CP=m -# CONFIG_8139TOO is not set -# CONFIG_R8169 is not set -# CONFIG_NET_VENDOR_RENESAS is not set -# CONFIG_NET_VENDOR_ROCKER is not set -# CONFIG_NET_VENDOR_SAMSUNG is not set -# CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set -# CONFIG_NET_VENDOR_SILAN is not set -# CONFIG_NET_VENDOR_SIS is not set -# CONFIG_NET_VENDOR_SMSC is not set -CONFIG_NET_VENDOR_SOCIONEXT=y -# CONFIG_SNI_NETSEC is not set -# CONFIG_NET_VENDOR_STMICRO is not set -# CONFIG_NET_VENDOR_SUN is not set -# CONFIG_NET_VENDOR_SYNOPSYS is not set -# CONFIG_NET_VENDOR_TEHUTI is not set -# CONFIG_NET_VENDOR_TI is not set -# CONFIG_NET_VENDOR_VIA is not set -# CONFIG_NET_VENDOR_WIZNET is not set -CONFIG_NET_VENDOR_XILINX=y -# CONFIG_XILINX_AXI_EMAC is not set -# CONFIG_XILINX_LL_TEMAC is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -# CONFIG_NET_SB1000 is not set -CONFIG_PHYLIB=m -CONFIG_SWPHY=y -CONFIG_FIXED_PHY=m - -# -# MII PHY device drivers -# -# CONFIG_AMD_PHY is not set -# CONFIG_ADIN_PHY is not set -# CONFIG_AQUANTIA_PHY is not set -# CONFIG_AX88796B_PHY is not set -# CONFIG_BROADCOM_PHY is not set -# CONFIG_BCM54140_PHY is not set -# CONFIG_BCM7XXX_PHY is not set -# CONFIG_BCM84881_PHY is not set -# CONFIG_BCM87XX_PHY is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CORTINA_PHY is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_ICPLUS_PHY is not set -# CONFIG_LXT_PHY is not set -# CONFIG_INTEL_XWAY_PHY is not set -# CONFIG_LSI_ET1011C_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MARVELL_10G_PHY is not set -# CONFIG_MICREL_PHY is not set -CONFIG_MICROCHIP_PHY=m -# CONFIG_MICROCHIP_T1_PHY is not set -# CONFIG_MICROSEMI_PHY is not set -# CONFIG_NATIONAL_PHY is not set -# CONFIG_NXP_TJA11XX_PHY is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_REALTEK_PHY is not set -# CONFIG_RENESAS_PHY is not set -# CONFIG_ROCKCHIP_PHY is not set -CONFIG_SMSC_PHY=m -# CONFIG_STE10XP is not set -# CONFIG_TERANETICS_PHY is not set -# CONFIG_DP83822_PHY is not set -# CONFIG_DP83TC811_PHY is not set -# CONFIG_DP83848_PHY is not set -# CONFIG_DP83867_PHY is not set -# CONFIG_DP83869_PHY is not set -# CONFIG_VITESSE_PHY is not set -# CONFIG_XILINX_GMII2RGMII is not set -CONFIG_MDIO_DEVICE=m -CONFIG_MDIO_BUS=m -CONFIG_OF_MDIO=m -CONFIG_MDIO_DEVRES=m -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MDIO_BCM_UNIMAC is not set -CONFIG_MDIO_CAVIUM=m -# CONFIG_MDIO_HISI_FEMAC is not set -# CONFIG_MDIO_MVUSB is not set -# CONFIG_MDIO_MSCC_MIIM is not set -# CONFIG_MDIO_OCTEON is not set -# CONFIG_MDIO_IPQ4019 is not set -# CONFIG_MDIO_IPQ8064 is not set -CONFIG_MDIO_THUNDER=m - -# -# MDIO Multiplexers -# -# CONFIG_MDIO_BUS_MUX_GPIO is not set -# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set -# CONFIG_MDIO_BUS_MUX_MMIOREG is not set - -# -# PCS device drivers -# -# CONFIG_PCS_XPCS is not set -# end of PCS device drivers - -CONFIG_PPP=m -CONFIG_PPP_BSDCOMP=m -CONFIG_PPP_DEFLATE=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_MPPE=m -CONFIG_PPP_MULTILINK=y -CONFIG_PPPOE=m -CONFIG_PPTP=m -CONFIG_PPPOL2TP=m -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -# CONFIG_SLIP is not set -CONFIG_SLHC=m -CONFIG_USB_NET_DRIVERS=y -# CONFIG_USB_CATC is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_RTL8152 is not set -CONFIG_USB_LAN78XX=m -CONFIG_USB_USBNET=y -# CONFIG_USB_NET_AX8817X is not set -# CONFIG_USB_NET_AX88179_178A is not set -# CONFIG_USB_NET_CDCETHER is not set -# CONFIG_USB_NET_CDC_EEM is not set -# CONFIG_USB_NET_CDC_NCM is not set -# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set -# CONFIG_USB_NET_CDC_MBIM is not set -# CONFIG_USB_NET_DM9601 is not set -# CONFIG_USB_NET_SR9700 is not set -# CONFIG_USB_NET_SR9800 is not set -# CONFIG_USB_NET_SMSC75XX is not set -CONFIG_USB_NET_SMSC95XX=m -# CONFIG_USB_NET_GL620A is not set -# CONFIG_USB_NET_NET1080 is not set -# CONFIG_USB_NET_PLUSB is not set -# CONFIG_USB_NET_MCS7830 is not set -# CONFIG_USB_NET_RNDIS_HOST is not set -# CONFIG_USB_NET_CDC_SUBSET is not set -# CONFIG_USB_NET_ZAURUS is not set -# CONFIG_USB_NET_CX82310_ETH is not set -# CONFIG_USB_NET_KALMIA is not set -# CONFIG_USB_NET_QMI_WWAN is not set -# CONFIG_USB_NET_INT51X1 is not set -# CONFIG_USB_IPHETH is not set -# CONFIG_USB_SIERRA_NET is not set -# CONFIG_USB_NET_CH9200 is not set -# CONFIG_USB_NET_AQC111 is not set -CONFIG_WLAN=y -CONFIG_WLAN_VENDOR_ADMTEK=y -CONFIG_WLAN_VENDOR_ATH=y -# CONFIG_ATH_DEBUG is not set -# CONFIG_ATH5K_PCI is not set -CONFIG_WLAN_VENDOR_ATMEL=y -CONFIG_WLAN_VENDOR_BROADCOM=y -CONFIG_WLAN_VENDOR_CISCO=y -CONFIG_WLAN_VENDOR_INTEL=y -CONFIG_WLAN_VENDOR_INTERSIL=y -# CONFIG_HOSTAP is not set -# CONFIG_PRISM54 is not set -CONFIG_WLAN_VENDOR_MARVELL=y -CONFIG_WLAN_VENDOR_MEDIATEK=y -CONFIG_WLAN_VENDOR_MICROCHIP=y -CONFIG_WLAN_VENDOR_RALINK=y -CONFIG_WLAN_VENDOR_REALTEK=y -CONFIG_WLAN_VENDOR_RSI=y -CONFIG_WLAN_VENDOR_ST=y -CONFIG_WLAN_VENDOR_TI=y -CONFIG_WLAN_VENDOR_ZYDAS=y -CONFIG_WLAN_VENDOR_QUANTENNA=y -# CONFIG_WAN is not set -CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_VMXNET3 is not set -# CONFIG_FUJITSU_ES is not set -# CONFIG_NETDEVSIM is not set -CONFIG_NET_FAILOVER=y -# CONFIG_ISDN is not set -# CONFIG_NVM is not set - -# -# Input device support -# -CONFIG_INPUT=y -CONFIG_INPUT_FF_MEMLESS=y -CONFIG_INPUT_SPARSEKMAP=y -# CONFIG_INPUT_MATRIXKMAP is not set - -# -# Userland interfaces -# -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_JOYDEV=y -CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_EVBUG is not set - -# -# Input Device Drivers -# -CONFIG_INPUT_KEYBOARD=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set -CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set -# CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_GPIO is not set -# CONFIG_KEYBOARD_GPIO_POLLED is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_MATRIX is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_OPENCORES is not set -# CONFIG_KEYBOARD_SAMSUNG is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_OMAP4 is not set -# CONFIG_KEYBOARD_XTKBD is not set -# CONFIG_KEYBOARD_CAP11XX is not set -# CONFIG_KEYBOARD_BCM is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_TABLET is not set -# CONFIG_INPUT_TOUCHSCREEN is not set -CONFIG_INPUT_MISC=y -# CONFIG_INPUT_AD714X is not set -# CONFIG_INPUT_ATMEL_CAPTOUCH is not set -# CONFIG_INPUT_BMA150 is not set -# CONFIG_INPUT_E3X0_BUTTON is not set -# CONFIG_INPUT_MMA8450 is not set -# CONFIG_INPUT_GPIO_BEEPER is not set -# CONFIG_INPUT_GPIO_DECODER is not set -# CONFIG_INPUT_GPIO_VIBRA is not set -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -# CONFIG_INPUT_KXTJ9 is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_YEALINK is not set -# CONFIG_INPUT_CM109 is not set -CONFIG_INPUT_UINPUT=y -# CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_PWM_BEEPER is not set -# CONFIG_INPUT_PWM_VIBRA is not set -# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -# CONFIG_INPUT_DA7280_HAPTICS is not set -# CONFIG_INPUT_ADXL34X is not set -# CONFIG_INPUT_IQS269A is not set -# CONFIG_INPUT_CMA3000 is not set -CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y -# CONFIG_INPUT_DRV260X_HAPTICS is not set -# CONFIG_INPUT_DRV2665_HAPTICS is not set -# CONFIG_INPUT_DRV2667_HAPTICS is not set -# CONFIG_INPUT_HISI_POWERKEY is not set -# CONFIG_RMI4_CORE is not set - -# -# Hardware I/O ports -# -CONFIG_SERIO=y -CONFIG_SERIO_SERPORT=y -CONFIG_SERIO_AMBAKMI=y -# CONFIG_SERIO_PCIPS2 is not set -CONFIG_SERIO_LIBPS2=y -# CONFIG_SERIO_RAW is not set -# CONFIG_SERIO_ALTERA_PS2 is not set -# CONFIG_SERIO_PS2MULT is not set -# CONFIG_SERIO_ARC_PS2 is not set -# CONFIG_SERIO_APBPS2 is not set -# CONFIG_SERIO_GPIO_PS2 is not set -# CONFIG_USERIO is not set -# CONFIG_GAMEPORT is not set -# end of Hardware I/O ports -# end of Input device support - -# -# Character devices -# -CONFIG_TTY=y -CONFIG_VT=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_VT_CONSOLE=y -CONFIG_HW_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_UNIX98_PTYS=y -# CONFIG_LEGACY_PTYS is not set -CONFIG_LDISC_AUTOLOAD=y - -# -# Serial drivers -# -CONFIG_SERIAL_EARLYCON=y -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y -CONFIG_SERIAL_8250_PNP=y -# CONFIG_SERIAL_8250_16550A_VARIANTS is not set -# CONFIG_SERIAL_8250_FINTEK is not set -CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_DMA=y -CONFIG_SERIAL_8250_PCI=y -CONFIG_SERIAL_8250_EXAR=y -CONFIG_SERIAL_8250_NR_UARTS=4 -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -CONFIG_SERIAL_8250_EXTENDED=y -# CONFIG_SERIAL_8250_MANY_PORTS is not set -# CONFIG_SERIAL_8250_ASPEED_VUART is not set -CONFIG_SERIAL_8250_SHARE_IRQ=y -# CONFIG_SERIAL_8250_DETECT_IRQ is not set -# CONFIG_SERIAL_8250_RSA is not set -CONFIG_SERIAL_8250_DWLIB=y -CONFIG_SERIAL_8250_BCM2835AUX=y -CONFIG_SERIAL_8250_FSL=y -CONFIG_SERIAL_8250_DW=y -# CONFIG_SERIAL_8250_RT288X is not set -CONFIG_SERIAL_OF_PLATFORM=y - -# -# Non-8250 serial port support -# -# CONFIG_SERIAL_AMBA_PL010 is not set -CONFIG_SERIAL_AMBA_PL011=y -CONFIG_SERIAL_AMBA_PL011_CONSOLE=y -# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set -CONFIG_SERIAL_SAMSUNG=y -CONFIG_SERIAL_SAMSUNG_UARTS_4=y -CONFIG_SERIAL_SAMSUNG_UARTS=4 -CONFIG_SERIAL_SAMSUNG_CONSOLE=y -# CONFIG_SERIAL_UARTLITE is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_MSM is not set -# CONFIG_SERIAL_SIFIVE is not set -# CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set -# CONFIG_SERIAL_BCM63XX is not set -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_XILINX_PS_UART is not set -# CONFIG_SERIAL_ARC is not set -# CONFIG_SERIAL_RP2 is not set -# CONFIG_SERIAL_FSL_LPUART is not set -# CONFIG_SERIAL_FSL_LINFLEXUART is not set -# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set -# CONFIG_SERIAL_SPRD is not set -# end of Serial drivers - -CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_N_GSM is not set -# CONFIG_NOZOMI is not set -# CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set -CONFIG_HVC_DRIVER=y -CONFIG_HVC_IRQ=y -CONFIG_HVC_XEN=y -CONFIG_HVC_XEN_FRONTEND=y -# CONFIG_HVC_DCC is not set -CONFIG_SERIAL_DEV_BUS=y -CONFIG_SERIAL_DEV_CTRL_TTYPORT=y -# CONFIG_TTY_PRINTK is not set -CONFIG_VIRTIO_CONSOLE=y -# CONFIG_IPMI_HANDLER is not set -CONFIG_HW_RANDOM=y -# CONFIG_HW_RANDOM_TIMERIOMEM is not set -# CONFIG_HW_RANDOM_BA431 is not set -CONFIG_HW_RANDOM_BCM2835=y -CONFIG_HW_RANDOM_IPROC_RNG200=y -CONFIG_HW_RANDOM_VIRTIO=y -CONFIG_HW_RANDOM_HISI=y -CONFIG_HW_RANDOM_CAVIUM=y -CONFIG_HW_RANDOM_EXYNOS=y -# CONFIG_HW_RANDOM_CCTRNG is not set -# CONFIG_HW_RANDOM_XIPHERA is not set -# CONFIG_APPLICOM is not set -CONFIG_DEVMEM=y -# CONFIG_RAW_DRIVER is not set -CONFIG_DEVPORT=y -CONFIG_TCG_TPM=y -CONFIG_HW_RANDOM_TPM=y -CONFIG_TCG_TIS_CORE=m -CONFIG_TCG_TIS=m -# CONFIG_TCG_TIS_SYNQUACER is not set -CONFIG_TCG_TIS_I2C_ATMEL=m -CONFIG_TCG_TIS_I2C_INFINEON=m -CONFIG_TCG_TIS_I2C_NUVOTON=m -CONFIG_TCG_ATMEL=m -CONFIG_TCG_INFINEON=m -CONFIG_TCG_XEN=m -CONFIG_TCG_CRB=y -CONFIG_TCG_VTPM_PROXY=m -CONFIG_TCG_TIS_ST33ZP24=m -CONFIG_TCG_TIS_ST33ZP24_I2C=m -# CONFIG_XILLYBUS is not set -# end of Character devices - -# CONFIG_RANDOM_TRUST_CPU is not set -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set - -# -# I2C support -# -CONFIG_I2C=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_COMPAT=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_MUX=y - -# -# Multiplexer I2C Chip support -# -# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set -# CONFIG_I2C_MUX_GPIO is not set -# CONFIG_I2C_MUX_GPMUX is not set -# CONFIG_I2C_MUX_LTC4306 is not set -# CONFIG_I2C_MUX_PCA9541 is not set -# CONFIG_I2C_MUX_PCA954x is not set -# CONFIG_I2C_MUX_PINCTRL is not set -# CONFIG_I2C_MUX_REG is not set -# CONFIG_I2C_DEMUX_PINCTRL is not set -# CONFIG_I2C_MUX_MLXCPLD is not set -# end of Multiplexer I2C Chip support - -CONFIG_I2C_HELPER_AUTO=y -CONFIG_I2C_SMBUS=m -CONFIG_I2C_ALGOBIT=m - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_AMD_MP2 is not set -# CONFIG_I2C_HIX5HD2 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# ACPI drivers -# -# CONFIG_I2C_SCMI is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -CONFIG_I2C_BCM2835=m -CONFIG_I2C_BRCMSTB=y -# CONFIG_I2C_CADENCE is not set -# CONFIG_I2C_CBUS_GPIO is not set -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_EXYNOS5 is not set -# CONFIG_I2C_GPIO is not set -# CONFIG_I2C_IMX is not set -# CONFIG_I2C_NOMADIK is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_QCOM_CCI is not set -# CONFIG_I2C_QUP is not set -# CONFIG_I2C_RK3X is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_SYNQUACER is not set -# CONFIG_I2C_VERSATILE is not set -CONFIG_I2C_THUNDERX=m -# CONFIG_I2C_XILINX is not set -# CONFIG_I2C_XLP9XX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_SLAVE is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# end of I2C support - -# CONFIG_I3C is not set -# CONFIG_SPI is not set -# CONFIG_SPMI is not set -# CONFIG_HSI is not set -CONFIG_PPS=y -# CONFIG_PPS_DEBUG is not set - -# -# PPS clients support -# -# CONFIG_PPS_CLIENT_KTIMER is not set -# CONFIG_PPS_CLIENT_LDISC is not set -# CONFIG_PPS_CLIENT_GPIO is not set - -# -# PPS generators support -# - -# -# PTP clock support -# -CONFIG_PTP_1588_CLOCK=y - -# -# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. -# -# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set -# CONFIG_PTP_1588_CLOCK_IDTCM is not set -# CONFIG_PTP_1588_CLOCK_OCP is not set -# end of PTP clock support - -CONFIG_PINCTRL=y -CONFIG_PINMUX=y -CONFIG_PINCONF=y -CONFIG_GENERIC_PINCONF=y -# CONFIG_DEBUG_PINCTRL is not set -# CONFIG_PINCTRL_AMD is not set -# CONFIG_PINCTRL_MCP23S08 is not set -# CONFIG_PINCTRL_SINGLE is not set -# CONFIG_PINCTRL_SX150X is not set -# CONFIG_PINCTRL_STMFX is not set -# CONFIG_PINCTRL_OCELOT is not set -# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set -CONFIG_PINCTRL_BCM2835=y -# CONFIG_PINCTRL_MSM is not set -# CONFIG_PINCTRL_QCOM_SSBI_PMIC is not set -# CONFIG_PINCTRL_LPASS_LPI is not set - -# -# Renesas pinctrl drivers -# -# end of Renesas pinctrl drivers - -CONFIG_PINCTRL_SAMSUNG=y -CONFIG_PINCTRL_EXYNOS=y -CONFIG_PINCTRL_EXYNOS_ARM64=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_FASTPATH_LIMIT=512 -CONFIG_OF_GPIO=y -CONFIG_GPIO_ACPI=y -CONFIG_GPIOLIB_IRQCHIP=y -# CONFIG_DEBUG_GPIO is not set -# CONFIG_GPIO_SYSFS is not set -CONFIG_GPIO_CDEV=y -CONFIG_GPIO_CDEV_V1=y -CONFIG_GPIO_GENERIC=y - -# -# Memory mapped GPIO drivers -# -# CONFIG_GPIO_74XX_MMIO is not set -# CONFIG_GPIO_ALTERA is not set -# CONFIG_GPIO_AMDPT is not set -CONFIG_GPIO_RASPBERRYPI_EXP=y -# CONFIG_GPIO_CADENCE is not set -# CONFIG_GPIO_DWAPB is not set -# CONFIG_GPIO_EXAR is not set -# CONFIG_GPIO_FTGPIO010 is not set -CONFIG_GPIO_GENERIC_PLATFORM=y -# CONFIG_GPIO_GRGPIO is not set -# CONFIG_GPIO_HISI is not set -# CONFIG_GPIO_HLWD is not set -# CONFIG_GPIO_LOGICVC is not set -# CONFIG_GPIO_MB86S7X is not set -# CONFIG_GPIO_MPC8XXX is not set -# CONFIG_GPIO_PL061 is not set -# CONFIG_GPIO_SAMA5D2_PIOBU is not set -# CONFIG_GPIO_SIFIVE is not set -# CONFIG_GPIO_SYSCON is not set -CONFIG_GPIO_THUNDERX=m -# CONFIG_GPIO_XGENE is not set -# CONFIG_GPIO_XILINX is not set -# CONFIG_GPIO_XLP is not set -# CONFIG_GPIO_AMD_FCH is not set -# end of Memory mapped GPIO drivers - -# -# I2C GPIO expanders -# -# CONFIG_GPIO_ADP5588 is not set -# CONFIG_GPIO_ADNP is not set -# CONFIG_GPIO_GW_PLD is not set -# CONFIG_GPIO_MAX7300 is not set -# CONFIG_GPIO_MAX732X is not set -# CONFIG_GPIO_PCA953X is not set -# CONFIG_GPIO_PCA9570 is not set -# CONFIG_GPIO_PCF857X is not set -# CONFIG_GPIO_TPIC2810 is not set -# end of I2C GPIO expanders - -# -# MFD GPIO expanders -# -# end of MFD GPIO expanders - -# -# PCI GPIO expanders -# -# CONFIG_GPIO_BT8XX is not set -# CONFIG_GPIO_PCI_IDIO_16 is not set -# CONFIG_GPIO_PCIE_IDIO_24 is not set -# CONFIG_GPIO_RDC321X is not set -# end of PCI GPIO expanders - -# -# USB GPIO expanders -# -# end of USB GPIO expanders - -# -# Virtual GPIO drivers -# -# CONFIG_GPIO_AGGREGATOR is not set -# CONFIG_GPIO_MOCKUP is not set -# end of Virtual GPIO drivers - -# CONFIG_W1 is not set -CONFIG_POWER_RESET=y -# CONFIG_POWER_RESET_BRCMSTB is not set -# CONFIG_POWER_RESET_GPIO is not set -# CONFIG_POWER_RESET_GPIO_RESTART is not set -# CONFIG_POWER_RESET_HISI is not set -# CONFIG_POWER_RESET_MSM is not set -# CONFIG_POWER_RESET_LTC2952 is not set -# CONFIG_POWER_RESET_RESTART is not set -CONFIG_POWER_RESET_VEXPRESS=y -# CONFIG_POWER_RESET_XGENE is not set -# CONFIG_POWER_RESET_SYSCON is not set -# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set -# CONFIG_SYSCON_REBOOT_MODE is not set -# CONFIG_NVMEM_REBOOT_MODE is not set -CONFIG_POWER_SUPPLY=y -# CONFIG_POWER_SUPPLY_DEBUG is not set -CONFIG_POWER_SUPPLY_HWMON=y -# CONFIG_PDA_POWER is not set -# CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set -# CONFIG_MANAGER_SBS is not set -# CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_CHARGER_ISP1704 is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_GPIO is not set -# CONFIG_CHARGER_LT3651 is not set -# CONFIG_CHARGER_DETECTOR_MAX14656 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_BQ24190 is not set -# CONFIG_CHARGER_BQ24257 is not set -# CONFIG_CHARGER_BQ24735 is not set -# CONFIG_CHARGER_BQ2515X is not set -# CONFIG_CHARGER_BQ25890 is not set -# CONFIG_CHARGER_BQ25980 is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_RT9455 is not set -# CONFIG_CHARGER_BD99954 is not set -CONFIG_HWMON=y -# CONFIG_HWMON_DEBUG_CHIP is not set - -# -# Native drivers -# -# CONFIG_SENSORS_AD7414 is not set -# CONFIG_SENSORS_AD7418 is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM1177 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ADT7410 is not set -# CONFIG_SENSORS_ADT7411 is not set -# CONFIG_SENSORS_ADT7462 is not set -# CONFIG_SENSORS_ADT7470 is not set -# CONFIG_SENSORS_ADT7475 is not set -# CONFIG_SENSORS_AS370 is not set -# CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_AXI_FAN_CONTROL is not set -# CONFIG_SENSORS_ASPEED is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_CORSAIR_CPRO is not set -# CONFIG_SENSORS_CORSAIR_PSU is not set -# CONFIG_SENSORS_DRIVETEMP is not set -# CONFIG_SENSORS_DS620 is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_I5K_AMB is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_F71882FG is not set -# CONFIG_SENSORS_F75375S is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_G760A is not set -# CONFIG_SENSORS_G762 is not set -# CONFIG_SENSORS_GPIO_FAN is not set -# CONFIG_SENSORS_HIH6130 is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_JC42 is not set -# CONFIG_SENSORS_POWR1220 is not set -# CONFIG_SENSORS_LINEAGE is not set -# CONFIG_SENSORS_LTC2945 is not set -# CONFIG_SENSORS_LTC2947_I2C is not set -# CONFIG_SENSORS_LTC2990 is not set -# CONFIG_SENSORS_LTC2992 is not set -# CONFIG_SENSORS_LTC4151 is not set -# CONFIG_SENSORS_LTC4215 is not set -# CONFIG_SENSORS_LTC4222 is not set -# CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LTC4260 is not set -# CONFIG_SENSORS_LTC4261 is not set -# CONFIG_SENSORS_MAX127 is not set -# CONFIG_SENSORS_MAX16065 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX1668 is not set -# CONFIG_SENSORS_MAX197 is not set -# CONFIG_SENSORS_MAX31730 is not set -# CONFIG_SENSORS_MAX6621 is not set -# CONFIG_SENSORS_MAX6639 is not set -# CONFIG_SENSORS_MAX6642 is not set -# CONFIG_SENSORS_MAX6650 is not set -# CONFIG_SENSORS_MAX6697 is not set -# CONFIG_SENSORS_MAX31790 is not set -# CONFIG_SENSORS_MCP3021 is not set -# CONFIG_SENSORS_TC654 is not set -# CONFIG_SENSORS_MR75203 is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM73 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_LM93 is not set -# CONFIG_SENSORS_LM95234 is not set -# CONFIG_SENSORS_LM95241 is not set -# CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set -# CONFIG_SENSORS_NCT6683 is not set -# CONFIG_SENSORS_NCT6775 is not set -# CONFIG_SENSORS_NCT7802 is not set -# CONFIG_SENSORS_NPCM7XX is not set -# CONFIG_SENSORS_OCC_P8_I2C is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_PMBUS is not set -# CONFIG_SENSORS_PWM_FAN is not set -CONFIG_SENSORS_RASPBERRYPI_HWMON=y -# CONFIG_SENSORS_SBTSI is not set -# CONFIG_SENSORS_SHT15 is not set -# CONFIG_SENSORS_SHT21 is not set -# CONFIG_SENSORS_SHT3x is not set -# CONFIG_SENSORS_SHTC1 is not set -# CONFIG_SENSORS_SIS5595 is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_EMC1403 is not set -# CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_EMC6W201 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_STTS751 is not set -# CONFIG_SENSORS_SMM665 is not set -# CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADS7828 is not set -# CONFIG_SENSORS_AMC6821 is not set -# CONFIG_SENSORS_INA209 is not set -# CONFIG_SENSORS_INA2XX is not set -# CONFIG_SENSORS_INA3221 is not set -# CONFIG_SENSORS_TC74 is not set -# CONFIG_SENSORS_THMC50 is not set -# CONFIG_SENSORS_TMP102 is not set -# CONFIG_SENSORS_TMP103 is not set -# CONFIG_SENSORS_TMP108 is not set -# CONFIG_SENSORS_TMP401 is not set -# CONFIG_SENSORS_TMP421 is not set -# CONFIG_SENSORS_TMP513 is not set -# CONFIG_SENSORS_VEXPRESS is not set -# CONFIG_SENSORS_VIA686A is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_VT8231 is not set -# CONFIG_SENSORS_W83773G is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83795 is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83627EHF is not set - -# -# ACPI drivers -# -# CONFIG_SENSORS_ACPI_POWER is not set -CONFIG_THERMAL=y -# CONFIG_THERMAL_NETLINK is not set -# CONFIG_THERMAL_STATISTICS is not set -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_OF=y -# CONFIG_THERMAL_WRITABLE_TRIPS is not set -CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y -# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set -# CONFIG_THERMAL_GOV_FAIR_SHARE is not set -CONFIG_THERMAL_GOV_STEP_WISE=y -# CONFIG_THERMAL_GOV_BANG_BANG is not set -# CONFIG_THERMAL_GOV_USER_SPACE is not set -# CONFIG_CPU_THERMAL is not set -# CONFIG_DEVFREQ_THERMAL is not set -CONFIG_THERMAL_EMULATION=y -# CONFIG_THERMAL_MMIO is not set -CONFIG_HISI_THERMAL=y -# CONFIG_QORIQ_THERMAL is not set - -# -# Broadcom thermal drivers -# -# CONFIG_BCM2711_THERMAL is not set -# CONFIG_BCM2835_THERMAL is not set -# end of Broadcom thermal drivers - -# -# Samsung thermal drivers -# -CONFIG_EXYNOS_THERMAL=y -# end of Samsung thermal drivers - -# -# Qualcomm thermal drivers -# -# end of Qualcomm thermal drivers - -# CONFIG_WATCHDOG is not set -CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB is not set -CONFIG_BCMA_POSSIBLE=y -# CONFIG_BCMA is not set - -# -# Multifunction device drivers -# -CONFIG_MFD_CORE=y -# CONFIG_MFD_ACT8945A is not set -# CONFIG_MFD_AS3711 is not set -# CONFIG_MFD_AS3722 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_AAT2870_CORE is not set -# CONFIG_MFD_ATMEL_FLEXCOM is not set -# CONFIG_MFD_ATMEL_HLCDC is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set -# CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set -# CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_EXYNOS_LPASS is not set -# CONFIG_MFD_GATEWORKS_GSC is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set -# CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_MFD_HI655X_PMIC is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_HTC_I2CPLD is not set -# CONFIG_LPC_ICH is not set -# CONFIG_LPC_SCH is not set -# CONFIG_MFD_INTEL_PMT is not set -# CONFIG_MFD_IQS62X is not set -# CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77620 is not set -# CONFIG_MFD_MAX77650 is not set -# CONFIG_MFD_MAX77686 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6360 is not set -# CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set -# CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_QCOM_RPM is not set -# CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_RK808 is not set -# CONFIG_MFD_RN5T618 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set -# CONFIG_MFD_SL28CPLD is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set -# CONFIG_MFD_STMPE is not set -CONFIG_MFD_SYSCON=y -# CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS65010 is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TPS65217 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TI_LP87565 is not set -# CONFIG_MFD_TPS65218 is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65910 is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set -# CONFIG_MFD_TC3589X is not set -# CONFIG_MFD_TQMX86 is not set -# CONFIG_MFD_VX855 is not set -# CONFIG_MFD_LOCHNAGAR is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set -# CONFIG_MFD_ROHM_BD718XX is not set -# CONFIG_MFD_ROHM_BD70528 is not set -# CONFIG_MFD_ROHM_BD71828 is not set -# CONFIG_MFD_STPMIC1 is not set -# CONFIG_MFD_STMFX is not set -CONFIG_MFD_VEXPRESS_SYSREG=y -# CONFIG_RAVE_SP_CORE is not set -# end of Multifunction device drivers - -# CONFIG_REGULATOR is not set -# CONFIG_RC_CORE is not set -# CONFIG_MEDIA_CEC_SUPPORT is not set -# CONFIG_MEDIA_SUPPORT is not set - -# -# Graphics support -# -# CONFIG_VGA_ARB is not set -# CONFIG_DRM is not set - -# -# ARM devices -# -# end of ARM devices - -# CONFIG_DRM_XEN is not set -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y - -# -# Frame buffer Devices -# -CONFIG_FB_CMDLINE=y -CONFIG_FB_NOTIFY=y -CONFIG_FB=y -# CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_FOREIGN_ENDIAN is not set -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_DEFERRED_IO=y -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_TILEBLITTING is not set - -# -# Frame buffer hardware drivers -# -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set -# CONFIG_FB_ARMCLCD is not set -# CONFIG_FB_CYBER2000 is not set -# CONFIG_FB_ASILIANT is not set -# CONFIG_FB_IMSTT is not set -CONFIG_FB_EFI=y -# CONFIG_FB_OPENCORES is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_NVIDIA is not set -# CONFIG_FB_RIVA is not set -# CONFIG_FB_I740 is not set -# CONFIG_FB_MATROX is not set -# CONFIG_FB_RADEON is not set -# CONFIG_FB_ATY128 is not set -# CONFIG_FB_ATY is not set -# CONFIG_FB_S3 is not set -# CONFIG_FB_SAVAGE is not set -# CONFIG_FB_SIS is not set -# CONFIG_FB_NEOMAGIC is not set -# CONFIG_FB_KYRO is not set -# CONFIG_FB_3DFX is not set -# CONFIG_FB_VOODOO1 is not set -# CONFIG_FB_VT8623 is not set -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_ARK is not set -# CONFIG_FB_PM3 is not set -# CONFIG_FB_CARMINE is not set -# CONFIG_FB_SMSCUFX is not set -# CONFIG_FB_UDL is not set -# CONFIG_FB_IBM_GXT4500 is not set -# CONFIG_FB_VIRTUAL is not set -CONFIG_XEN_FBDEV_FRONTEND=y -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_MB862XX is not set -CONFIG_FB_SIMPLE=y -# CONFIG_FB_SSD1307 is not set -# CONFIG_FB_SM712 is not set -# end of Frame buffer Devices - -# -# Backlight & LCD device support -# -# CONFIG_LCD_CLASS_DEVICE is not set -# CONFIG_BACKLIGHT_CLASS_DEVICE is not set -# end of Backlight & LCD device support - -# -# Console display driver support -# -CONFIG_DUMMY_CONSOLE=y -CONFIG_DUMMY_CONSOLE_COLUMNS=80 -CONFIG_DUMMY_CONSOLE_ROWS=25 -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set -# end of Console display driver support - -# CONFIG_LOGO is not set -# end of Graphics support - -# CONFIG_SOUND is not set - -# -# HID support -# -CONFIG_HID=y -# CONFIG_HID_BATTERY_STRENGTH is not set -# CONFIG_HIDRAW is not set -# CONFIG_UHID is not set -CONFIG_HID_GENERIC=y - -# -# Special HID drivers -# -# CONFIG_HID_A4TECH is not set -# CONFIG_HID_ACCUTOUCH is not set -# CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set -# CONFIG_HID_APPLEIR is not set -# CONFIG_HID_AUREAL is not set -# CONFIG_HID_BELKIN is not set -# CONFIG_HID_BETOP_FF is not set -# CONFIG_HID_CHERRY is not set -# CONFIG_HID_CHICONY is not set -# CONFIG_HID_COUGAR is not set -# CONFIG_HID_MACALLY is not set -# CONFIG_HID_CMEDIA is not set -# CONFIG_HID_CREATIVE_SB0540 is not set -# CONFIG_HID_CYPRESS is not set -# CONFIG_HID_DRAGONRISE is not set -# CONFIG_HID_EMS_FF is not set -# CONFIG_HID_ELECOM is not set -# CONFIG_HID_ELO is not set -# CONFIG_HID_EZKEY is not set -# CONFIG_HID_GEMBIRD is not set -# CONFIG_HID_GFRM is not set -# CONFIG_HID_GLORIOUS is not set -# CONFIG_HID_HOLTEK is not set -# CONFIG_HID_VIVALDI is not set -# CONFIG_HID_KEYTOUCH is not set -# CONFIG_HID_KYE is not set -# CONFIG_HID_UCLOGIC is not set -# CONFIG_HID_WALTOP is not set -# CONFIG_HID_VIEWSONIC is not set -# CONFIG_HID_GYRATION is not set -# CONFIG_HID_ICADE is not set -# CONFIG_HID_ITE is not set -# CONFIG_HID_JABRA is not set -# CONFIG_HID_TWINHAN is not set -# CONFIG_HID_KENSINGTON is not set -# CONFIG_HID_LCPOWER is not set -# CONFIG_HID_LENOVO is not set -# CONFIG_HID_MAGICMOUSE is not set -# CONFIG_HID_MALTRON is not set -# CONFIG_HID_MAYFLASH is not set -# CONFIG_HID_REDRAGON is not set -# CONFIG_HID_MICROSOFT is not set -# CONFIG_HID_MONTEREY is not set -# CONFIG_HID_MULTITOUCH is not set -# CONFIG_HID_NTI is not set -# CONFIG_HID_NTRIG is not set -# CONFIG_HID_ORTEK is not set -# CONFIG_HID_PANTHERLORD is not set -# CONFIG_HID_PENMOUNT is not set -# CONFIG_HID_PETALYNX is not set -# CONFIG_HID_PICOLCD is not set -# CONFIG_HID_PLANTRONICS is not set -# CONFIG_HID_PRIMAX is not set -# CONFIG_HID_RETRODE is not set -# CONFIG_HID_ROCCAT is not set -# CONFIG_HID_SAITEK is not set -# CONFIG_HID_SAMSUNG is not set -# CONFIG_HID_SPEEDLINK is not set -# CONFIG_HID_STEAM is not set -# CONFIG_HID_STEELSERIES is not set -# CONFIG_HID_SUNPLUS is not set -# CONFIG_HID_RMI is not set -# CONFIG_HID_GREENASIA is not set -# CONFIG_HID_SMARTJOYPLUS is not set -# CONFIG_HID_TIVO is not set -# CONFIG_HID_TOPSEED is not set -# CONFIG_HID_THRUSTMASTER is not set -# CONFIG_HID_UDRAW_PS3 is not set -# CONFIG_HID_WACOM is not set -# CONFIG_HID_XINMO is not set -# CONFIG_HID_ZEROPLUS is not set -# CONFIG_HID_ZYDACRON is not set -# CONFIG_HID_SENSOR_HUB is not set -# CONFIG_HID_ALPS is not set -# CONFIG_HID_MCP2221 is not set -# end of Special HID drivers - -# -# USB HID support -# -CONFIG_USB_HID=y -# CONFIG_HID_PID is not set -# CONFIG_USB_HIDDEV is not set -# end of USB HID support - -# -# I2C HID support -# -# CONFIG_I2C_HID is not set -# end of I2C HID support -# end of HID support - -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_COMMON=y -# CONFIG_USB_ULPI_BUS is not set -# CONFIG_USB_CONN_GPIO is not set -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB=y -CONFIG_USB_PCI=y -CONFIG_USB_ANNOUNCE_NEW_DEVICES=y - -# -# Miscellaneous USB options -# -CONFIG_USB_DEFAULT_PERSIST=y -# CONFIG_USB_FEW_INIT_RETRIES is not set -# CONFIG_USB_DYNAMIC_MINORS is not set -CONFIG_USB_OTG=y -# CONFIG_USB_OTG_PRODUCTLIST is not set -# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set -# CONFIG_USB_OTG_FSM is not set -CONFIG_USB_AUTOSUSPEND_DELAY=2 -# CONFIG_USB_MON is not set - -# -# USB Host Controller Drivers -# -# CONFIG_USB_C67X00_HCD is not set -CONFIG_USB_XHCI_HCD=m -# CONFIG_USB_XHCI_DBGCAP is not set -CONFIG_USB_XHCI_PCI=m -# CONFIG_USB_XHCI_PCI_RENESAS is not set -# CONFIG_USB_XHCI_PLATFORM is not set -CONFIG_USB_EHCI_HCD=m -# CONFIG_USB_EHCI_ROOT_HUB_TT is not set -CONFIG_USB_EHCI_TT_NEWSCHED=y -CONFIG_USB_EHCI_PCI=m -# CONFIG_USB_EHCI_FSL is not set -# CONFIG_USB_EHCI_EXYNOS is not set -# CONFIG_USB_EHCI_HCD_PLATFORM is not set -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_FOTG210_HCD is not set -CONFIG_USB_OHCI_HCD=m -CONFIG_USB_OHCI_HCD_PCI=m -# CONFIG_USB_OHCI_EXYNOS is not set -# CONFIG_USB_OHCI_HCD_PLATFORM is not set -CONFIG_USB_UHCI_HCD=m -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_HCD_TEST_MODE is not set - -# -# USB Device Class drivers -# -# CONFIG_USB_ACM is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_WDM is not set -# CONFIG_USB_TMC is not set - -# -# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -# - -# -# also be needed; see USB_STORAGE Help for more info -# -CONFIG_USB_STORAGE=m -# CONFIG_USB_STORAGE_DEBUG is not set -# CONFIG_USB_STORAGE_REALTEK is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_ONETOUCH is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -# CONFIG_USB_STORAGE_ENE_UB6250 is not set -# CONFIG_USB_UAS is not set - -# -# USB Imaging devices -# -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set -# CONFIG_USB_MUSB_HDRC is not set -# CONFIG_USB_DWC3 is not set -CONFIG_USB_DWC2=m -CONFIG_USB_DWC2_HOST=y - -# -# Gadget/Dual-role mode requires USB Gadget support to be enabled -# -# CONFIG_USB_DWC2_PCI is not set -# CONFIG_USB_DWC2_DEBUG is not set -# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set -# CONFIG_USB_CHIPIDEA is not set -# CONFIG_USB_ISP1760 is not set - -# -# USB port drivers -# -# CONFIG_USB_SERIAL is not set - -# -# USB Miscellaneous drivers -# -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_SEVSEG is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_APPLEDISPLAY is not set -# CONFIG_APPLE_MFI_FASTCHARGE is not set -# CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_EHSET_TEST_FIXTURE is not set -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_YUREX is not set -# CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set -# CONFIG_USB_LINK_LAYER_TEST is not set -# CONFIG_USB_CHAOSKEY is not set - -# -# USB Physical Layer drivers -# -CONFIG_USB_PHY=y -CONFIG_NOP_USB_XCEIV=m -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_USB_ISP1301 is not set -# CONFIG_USB_ULPI is not set -# end of USB Physical Layer drivers - -# CONFIG_USB_GADGET is not set -# CONFIG_TYPEC is not set -CONFIG_USB_ROLE_SWITCH=m -CONFIG_MMC=m -CONFIG_PWRSEQ_EMMC=m -CONFIG_PWRSEQ_SIMPLE=m -CONFIG_MMC_BLOCK=m -CONFIG_MMC_BLOCK_MINORS=8 -# CONFIG_SDIO_UART is not set -# CONFIG_MMC_TEST is not set - -# -# MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MMC_DEBUG is not set -# CONFIG_MMC_ARMMMCI is not set -CONFIG_MMC_SDHCI=m -CONFIG_MMC_SDHCI_IO_ACCESSORS=y -# CONFIG_MMC_SDHCI_PCI is not set -# CONFIG_MMC_SDHCI_ACPI is not set -CONFIG_MMC_SDHCI_PLTFM=m -# CONFIG_MMC_SDHCI_OF_ARASAN is not set -# CONFIG_MMC_SDHCI_OF_ASPEED is not set -# CONFIG_MMC_SDHCI_OF_AT91 is not set -# CONFIG_MMC_SDHCI_OF_ESDHC is not set -# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set -# CONFIG_MMC_SDHCI_CADENCE is not set -# CONFIG_MMC_SDHCI_S3C is not set -# CONFIG_MMC_SDHCI_F_SDH30 is not set -# CONFIG_MMC_SDHCI_MILBEAUT is not set -CONFIG_MMC_SDHCI_IPROC=m -# CONFIG_MMC_SDHCI_MSM is not set -# CONFIG_MMC_TIFM_SD is not set -# CONFIG_MMC_CB710 is not set -# CONFIG_MMC_VIA_SDMMC is not set -# CONFIG_MMC_CAVIUM_THUNDERX is not set -# CONFIG_MMC_DW is not set -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMC_USHC is not set -# CONFIG_MMC_USDHI6ROL0 is not set -# CONFIG_MMC_CQHCI is not set -# CONFIG_MMC_HSQ is not set -# CONFIG_MMC_TOSHIBA_PCI is not set -CONFIG_MMC_BCM2835=m -# CONFIG_MMC_MTK is not set -# CONFIG_MMC_SDHCI_XENON is not set -# CONFIG_MMC_SDHCI_OMAP is not set -# CONFIG_MMC_SDHCI_AM654 is not set -# CONFIG_MEMSTICK is not set -# CONFIG_NEW_LEDS is not set -# CONFIG_ACCESSIBILITY is not set -# CONFIG_INFINIBAND is not set -CONFIG_EDAC_SUPPORT=y -CONFIG_RTC_LIB=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -CONFIG_RTC_SYSTOHC=y -CONFIG_RTC_SYSTOHC_DEVICE="rtc0" -# CONFIG_RTC_DEBUG is not set -CONFIG_RTC_NVMEM=y - -# -# RTC interfaces -# -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -# CONFIG_RTC_DRV_TEST is not set - -# -# I2C RTC drivers -# -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_HYM8563 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_ISL12026 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD3078 is not set - -# -# SPI RTC drivers -# -CONFIG_RTC_I2C_AND_SPI=y - -# -# SPI and I2C RTC drivers -# -CONFIG_RTC_DRV_DS3232=y -CONFIG_RTC_DRV_DS3232_HWMON=y -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set -# CONFIG_RTC_DRV_RX6110 is not set - -# -# Platform RTC drivers -# -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1685_FAMILY is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_DS2404 is not set -CONFIG_RTC_DRV_EFI=y -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_V3020 is not set -# CONFIG_RTC_DRV_ZYNQMP is not set - -# -# on-CPU RTC drivers -# -CONFIG_RTC_DRV_FSL_FTM_ALARM=y -CONFIG_HAVE_S3C_RTC=y -CONFIG_RTC_DRV_S3C=y -# CONFIG_RTC_DRV_PL030 is not set -CONFIG_RTC_DRV_PL031=y -# CONFIG_RTC_DRV_CADENCE is not set -# CONFIG_RTC_DRV_FTRTC010 is not set -# CONFIG_RTC_DRV_R7301 is not set - -# -# HID Sensor RTC drivers -# -# CONFIG_RTC_DRV_GOLDFISH is not set -CONFIG_DMADEVICES=y -# CONFIG_DMADEVICES_DEBUG is not set - -# -# DMA Devices -# -CONFIG_DMA_ENGINE=y -CONFIG_DMA_VIRTUAL_CHANNELS=m -CONFIG_DMA_ACPI=y -CONFIG_DMA_OF=y -# CONFIG_ALTERA_MSGDMA is not set -# CONFIG_AMBA_PL08X is not set -# CONFIG_BCM_SBA_RAID is not set -CONFIG_DMA_BCM2835=m -# CONFIG_DW_AXI_DMAC is not set -# CONFIG_FSL_EDMA is not set -# CONFIG_FSL_QDMA is not set -# CONFIG_HISI_DMA is not set -# CONFIG_INTEL_IDMA64 is not set -# CONFIG_K3_DMA is not set -# CONFIG_MV_XOR_V2 is not set -# CONFIG_PL330_DMA is not set -# CONFIG_PLX_DMA is not set -# CONFIG_XILINX_DMA is not set -# CONFIG_XILINX_ZYNQMP_DMA is not set -# CONFIG_XILINX_ZYNQMP_DPDMA is not set -# CONFIG_QCOM_BAM_DMA is not set -# CONFIG_QCOM_GPI_DMA is not set -# CONFIG_QCOM_HIDMA_MGMT is not set -# CONFIG_QCOM_HIDMA is not set -# CONFIG_DW_DMAC is not set -# CONFIG_DW_DMAC_PCI is not set -# CONFIG_DW_EDMA is not set -# CONFIG_DW_EDMA_PCIE is not set -# CONFIG_SF_PDMA is not set - -# -# DMA Clients -# -# CONFIG_ASYNC_TX_DMA is not set -# CONFIG_DMATEST is not set - -# -# DMABUF options -# -# CONFIG_SYNC_FILE is not set -# CONFIG_DMABUF_MOVE_NOTIFY is not set -# CONFIG_DMABUF_HEAPS is not set -# end of DMABUF options - -# CONFIG_AUXDISPLAY is not set -CONFIG_UIO=m -# CONFIG_UIO_CIF is not set -# CONFIG_UIO_PDRV_GENIRQ is not set -# CONFIG_UIO_DMEM_GENIRQ is not set -# CONFIG_UIO_AEC is not set -# CONFIG_UIO_SERCOS3 is not set -# CONFIG_UIO_PCI_GENERIC is not set -# CONFIG_UIO_NETX is not set -# CONFIG_UIO_PRUSS is not set -# CONFIG_UIO_MF624 is not set -# CONFIG_VIRT_DRIVERS is not set -CONFIG_VIRTIO=y -CONFIG_VIRTIO_MENU=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_PCI_LEGACY=y -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_INPUT=y -CONFIG_VIRTIO_MMIO=y -CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y -# CONFIG_VDPA is not set -CONFIG_VHOST_IOTLB=m -CONFIG_VHOST=m -CONFIG_VHOST_MENU=y -CONFIG_VHOST_NET=m -CONFIG_VHOST_VSOCK=m -# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set - -# -# Microsoft Hyper-V guest support -# -# end of Microsoft Hyper-V guest support - -# -# Xen driver support -# -CONFIG_XEN_BALLOON=y -CONFIG_XEN_SCRUB_PAGES_DEFAULT=y -CONFIG_XEN_DEV_EVTCHN=y -# CONFIG_XEN_BACKEND is not set -CONFIG_XENFS=y -CONFIG_XEN_COMPAT_XENFS=y -CONFIG_XEN_SYS_HYPERVISOR=y -CONFIG_XEN_XENBUS_FRONTEND=y -CONFIG_XEN_GNTDEV=y -CONFIG_XEN_GRANT_DEV_ALLOC=y -# CONFIG_XEN_GRANT_DMA_ALLOC is not set -CONFIG_SWIOTLB_XEN=y -CONFIG_XEN_PVCALLS_FRONTEND=y -CONFIG_XEN_PRIVCMD=y -CONFIG_XEN_EFI=y -CONFIG_XEN_AUTO_XLATE=y -# end of Xen driver support - -# CONFIG_GREYBUS is not set -# CONFIG_STAGING is not set -# CONFIG_GOLDFISH is not set -# CONFIG_CHROME_PLATFORMS is not set -# CONFIG_MELLANOX_PLATFORM is not set -# CONFIG_SURFACE_PLATFORMS is not set -CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_HAVE_CLK_PREPARE=y -CONFIG_COMMON_CLK=y - -# -# Clock driver for ARM Reference designs -# -# CONFIG_ICST is not set -CONFIG_CLK_SP810=y -CONFIG_CLK_VEXPRESS_OSC=y -# end of Clock driver for ARM Reference designs - -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI514 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_SI570 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CDCE925 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set -# CONFIG_COMMON_CLK_FSL_FLEXSPI is not set -# CONFIG_COMMON_CLK_FSL_SAI is not set -# CONFIG_CLK_QORIQ is not set -CONFIG_CLK_LS1028A_PLLDIG=y -# CONFIG_COMMON_CLK_XGENE is not set -# CONFIG_COMMON_CLK_PWM is not set -# CONFIG_COMMON_CLK_VC5 is not set -# CONFIG_COMMON_CLK_FIXED_MMIO is not set -CONFIG_CLK_BCM2711_DVP=y -CONFIG_CLK_BCM2835=y -# CONFIG_CLK_RASPBERRYPI is not set -CONFIG_COMMON_CLK_HI3516CV300=y -# CONFIG_COMMON_CLK_HI3519 is not set -CONFIG_COMMON_CLK_HI3660=y -CONFIG_COMMON_CLK_HI3670=y -CONFIG_COMMON_CLK_HI3798CV200=y -# CONFIG_COMMON_CLK_HI6220 is not set -CONFIG_RESET_HISI=y -# CONFIG_STUB_CLK_HI3660 is not set -# CONFIG_COMMON_CLK_QCOM is not set -CONFIG_COMMON_CLK_SAMSUNG=y -CONFIG_EXYNOS_ARM64_COMMON_CLK=y -# CONFIG_EXYNOS_AUDSS_CLK_CON is not set -CONFIG_EXYNOS_CLKOUT=y -# CONFIG_HWSPINLOCK is not set - -# -# Clock Source drivers -# -CONFIG_TIMER_OF=y -CONFIG_TIMER_ACPI=y -CONFIG_TIMER_PROBE=y -CONFIG_CLKSRC_MMIO=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y -CONFIG_FSL_ERRATUM_A008585=y -CONFIG_HISILICON_ERRATUM_161010101=y -CONFIG_ARM64_ERRATUM_858921=y -CONFIG_ARM_TIMER_SP804=y -# CONFIG_MICROCHIP_PIT64B is not set -# end of Clock Source drivers - -CONFIG_MAILBOX=y -# CONFIG_ARM_MHU is not set -# CONFIG_ARM_MHU_V2 is not set -# CONFIG_PLATFORM_MHU is not set -# CONFIG_PL320_MBOX is not set -# CONFIG_PCC is not set -# CONFIG_ALTERA_MBOX is not set -CONFIG_BCM2835_MBOX=y -# CONFIG_HI3660_MBOX is not set -# CONFIG_HI6220_MBOX is not set -# CONFIG_MAILBOX_TEST is not set -# CONFIG_QCOM_APCS_IPC is not set -# CONFIG_QCOM_IPCC is not set -# CONFIG_IOMMU_SUPPORT is not set - -# -# Remoteproc drivers -# -# CONFIG_REMOTEPROC is not set -# end of Remoteproc drivers - -# -# Rpmsg drivers -# -# CONFIG_RPMSG_QCOM_GLINK_RPM is not set -# CONFIG_RPMSG_VIRTIO is not set -# end of Rpmsg drivers - -# CONFIG_SOUNDWIRE is not set - -# -# SOC (System On Chip) specific Drivers -# - -# -# Amlogic SoC drivers -# -# end of Amlogic SoC drivers - -# -# Broadcom SoC drivers -# -CONFIG_BCM2835_POWER=y -CONFIG_RASPBERRYPI_POWER=y -# CONFIG_SOC_BRCMSTB is not set -# end of Broadcom SoC drivers - -# -# NXP/Freescale QorIQ SoC drivers -# -# CONFIG_FSL_DPAA is not set -# CONFIG_QUICC_ENGINE is not set -CONFIG_DPAA2_CONSOLE=y -# end of NXP/Freescale QorIQ SoC drivers - -# -# i.MX SoC drivers -# -# end of i.MX SoC drivers - -# -# Enable LiteX SoC Builder specific drivers -# -# CONFIG_LITEX_SOC_CONTROLLER is not set -# end of Enable LiteX SoC Builder specific drivers - -# -# Qualcomm SoC drivers -# -# CONFIG_QCOM_AOSS_QMP is not set -# CONFIG_QCOM_COMMAND_DB is not set -# CONFIG_QCOM_CPR is not set -# CONFIG_QCOM_GENI_SE is not set -# CONFIG_QCOM_GSBI is not set -# CONFIG_QCOM_LLCC is not set -# CONFIG_QCOM_OCMEM is not set -# CONFIG_QCOM_RMTFS_MEM is not set -# CONFIG_QCOM_RPMH is not set -# end of Qualcomm SoC drivers - -CONFIG_SOC_SAMSUNG=y -CONFIG_EXYNOS_CHIPID=y -CONFIG_EXYNOS_PMU=y -CONFIG_EXYNOS_PM_DOMAINS=y -# CONFIG_SOC_TI is not set - -# -# Xilinx SoC drivers -# -# CONFIG_XILINX_VCU is not set -# end of Xilinx SoC drivers -# end of SOC (System On Chip) specific Drivers - -CONFIG_PM_DEVFREQ=y - -# -# DEVFREQ Governors -# -CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y -# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set -# CONFIG_DEVFREQ_GOV_POWERSAVE is not set -# CONFIG_DEVFREQ_GOV_USERSPACE is not set -# CONFIG_DEVFREQ_GOV_PASSIVE is not set - -# -# DEVFREQ Drivers -# -# CONFIG_ARM_EXYNOS_BUS_DEVFREQ is not set -# CONFIG_PM_DEVFREQ_EVENT is not set -CONFIG_EXTCON=y - -# -# Extcon Device Drivers -# -# CONFIG_EXTCON_FSA9480 is not set -# CONFIG_EXTCON_GPIO is not set -# CONFIG_EXTCON_MAX3355 is not set -# CONFIG_EXTCON_PTN5150 is not set -# CONFIG_EXTCON_QCOM_SPMI_MISC is not set -# CONFIG_EXTCON_RT8973A is not set -# CONFIG_EXTCON_SM5502 is not set -# CONFIG_EXTCON_USB_GPIO is not set -# CONFIG_EXTCON_USBC_TUSB320 is not set -# CONFIG_MEMORY is not set -# CONFIG_IIO is not set -# CONFIG_NTB is not set -# CONFIG_VME_BUS is not set -CONFIG_PWM=y -CONFIG_PWM_SYSFS=y -# CONFIG_PWM_DEBUG is not set -# CONFIG_PWM_ATMEL_TCB is not set -CONFIG_PWM_BCM2835=m -# CONFIG_PWM_DWC is not set -# CONFIG_PWM_FSL_FTM is not set -# CONFIG_PWM_HIBVT is not set -# CONFIG_PWM_PCA9685 is not set -# CONFIG_PWM_SAMSUNG is not set - -# -# IRQ chip support -# -CONFIG_IRQCHIP=y -CONFIG_ARM_GIC=y -CONFIG_ARM_GIC_MAX_NR=1 -CONFIG_ARM_GIC_V2M=y -CONFIG_ARM_GIC_V3=y -CONFIG_ARM_GIC_V3_ITS=y -CONFIG_ARM_GIC_V3_ITS_PCI=y -# CONFIG_AL_FIC is not set -CONFIG_HISILICON_IRQ_MBIGEN=y -CONFIG_LS_EXTIRQ=y -CONFIG_LS_SCFG_MSI=y -CONFIG_PARTITION_PERCPU=y -# CONFIG_QCOM_IRQ_COMBINER is not set -# CONFIG_QCOM_PDC is not set -# end of IRQ chip support - -# CONFIG_IPACK_BUS is not set -CONFIG_RESET_CONTROLLER=y -# CONFIG_RESET_BRCMSTB_RESCAL is not set -# CONFIG_RESET_INTEL_GW is not set -# CONFIG_RESET_QCOM_AOSS is not set -# CONFIG_RESET_QCOM_PDC is not set -CONFIG_RESET_RASPBERRYPI=m -CONFIG_RESET_SIMPLE=y -# CONFIG_RESET_TI_SYSCON is not set -CONFIG_COMMON_RESET_HI3660=y -# CONFIG_COMMON_RESET_HI6220 is not set - -# -# PHY Subsystem -# -CONFIG_GENERIC_PHY=y -# CONFIG_PHY_XGENE is not set -# CONFIG_BCM_KONA_USB2_PHY is not set -# CONFIG_PHY_CADENCE_TORRENT is not set -# CONFIG_PHY_CADENCE_DPHY is not set -# CONFIG_PHY_CADENCE_SIERRA is not set -# CONFIG_PHY_CADENCE_SALVO is not set -# CONFIG_PHY_FSL_IMX8MQ_USB is not set -# CONFIG_PHY_MIXEL_MIPI_DPHY is not set -# CONFIG_PHY_HI6220_USB is not set -# CONFIG_PHY_HI3660_USB is not set -# CONFIG_PHY_HISTB_COMBPHY is not set -# CONFIG_PHY_HISI_INNO_USB2 is not set -# CONFIG_PHY_PXA_28NM_HSIC is not set -# CONFIG_PHY_PXA_28NM_USB2 is not set -# CONFIG_PHY_MAPPHONE_MDM6600 is not set -# CONFIG_PHY_OCELOT_SERDES is not set -# CONFIG_PHY_QCOM_APQ8064_SATA is not set -# CONFIG_PHY_QCOM_IPQ4019_USB is not set -# CONFIG_PHY_QCOM_IPQ806X_SATA is not set -# CONFIG_PHY_QCOM_PCIE2 is not set -# CONFIG_PHY_QCOM_QMP is not set -# CONFIG_PHY_QCOM_QUSB2 is not set -# CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2 is not set -# CONFIG_PHY_QCOM_USB_HS_28NM is not set -# CONFIG_PHY_QCOM_USB_SS is not set -# CONFIG_PHY_QCOM_IPQ806X_USB is not set -# CONFIG_PHY_EXYNOS_DP_VIDEO is not set -# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set -# CONFIG_PHY_EXYNOS_PCIE is not set -# CONFIG_PHY_SAMSUNG_UFS is not set -# CONFIG_PHY_SAMSUNG_USB2 is not set -# end of PHY Subsystem - -# CONFIG_POWERCAP is not set -# CONFIG_MCB is not set - -# -# Performance monitor support -# -CONFIG_ARM_CCI_PMU=y -CONFIG_ARM_CCI400_PMU=y -CONFIG_ARM_CCI5xx_PMU=y -CONFIG_ARM_CCN=y -# CONFIG_ARM_CMN is not set -CONFIG_ARM_PMU=y -CONFIG_ARM_PMU_ACPI=y -# CONFIG_ARM_DSU_PMU is not set -# CONFIG_QCOM_L2_PMU is not set -# CONFIG_QCOM_L3_PMU is not set -# CONFIG_ARM_SPE_PMU is not set -# CONFIG_ARM_DMC620_PMU is not set -# CONFIG_HISI_PMU is not set -# end of Performance monitor support - -# CONFIG_RAS is not set -# CONFIG_USB4 is not set - -# -# Android -# -# CONFIG_ANDROID is not set -# end of Android - -# CONFIG_LIBNVDIMM is not set -CONFIG_DAX=y -# CONFIG_DEV_DAX is not set -CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y -# CONFIG_QCOM_QFPROM is not set - -# -# HW tracing support -# -# CONFIG_STM is not set -# CONFIG_INTEL_TH is not set -# end of HW tracing support - -# CONFIG_FPGA is not set -# CONFIG_FSI is not set -# CONFIG_TEE is not set -CONFIG_PM_OPP=y -# CONFIG_SIOX is not set -# CONFIG_SLIMBUS is not set -# CONFIG_INTERCONNECT is not set -# CONFIG_COUNTER is not set -# CONFIG_MOST is not set -# end of Device Drivers - -# -# File systems -# -CONFIG_DCACHE_WORD_ACCESS=y -CONFIG_VALIDATE_FS_PARSER=y -CONFIG_FS_IOMAP=y -# CONFIG_EXT2_FS is not set -# CONFIG_EXT3_FS is not set -CONFIG_EXT4_FS=y -CONFIG_EXT4_USE_FOR_EXT2=y -CONFIG_EXT4_FS_POSIX_ACL=y -CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_DEBUG is not set -CONFIG_JBD2=y -# CONFIG_JBD2_DEBUG is not set -CONFIG_FS_MBCACHE=y -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set -CONFIG_XFS_FS=y -CONFIG_XFS_SUPPORT_V4=y -CONFIG_XFS_QUOTA=y -CONFIG_XFS_POSIX_ACL=y -# CONFIG_XFS_RT is not set -# CONFIG_XFS_ONLINE_SCRUB is not set -# CONFIG_XFS_WARN is not set -# CONFIG_XFS_DEBUG is not set -# CONFIG_GFS2_FS is not set -# CONFIG_OCFS2_FS is not set -CONFIG_BTRFS_FS=m -CONFIG_BTRFS_FS_POSIX_ACL=y -# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set -# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set -# CONFIG_BTRFS_DEBUG is not set -# CONFIG_BTRFS_ASSERT is not set -# CONFIG_BTRFS_FS_REF_VERIFY is not set -# CONFIG_NILFS2_FS is not set -# CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set -CONFIG_FS_POSIX_ACL=y -CONFIG_EXPORTFS=y -# CONFIG_EXPORTFS_BLOCK_OPS is not set -CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y -CONFIG_FS_ENCRYPTION=y -CONFIG_FS_ENCRYPTION_ALGS=y -# CONFIG_FS_VERITY is not set -CONFIG_FSNOTIFY=y -CONFIG_DNOTIFY=y -CONFIG_INOTIFY_USER=y -CONFIG_FANOTIFY=y -# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set -CONFIG_QUOTA=y -CONFIG_QUOTA_NETLINK_INTERFACE=y -CONFIG_PRINT_QUOTA_WARNING=y -# CONFIG_QUOTA_DEBUG is not set -# CONFIG_QFMT_V1 is not set -# CONFIG_QFMT_V2 is not set -CONFIG_QUOTACTL=y -# CONFIG_AUTOFS4_FS is not set -# CONFIG_AUTOFS_FS is not set -CONFIG_FUSE_FS=y -CONFIG_CUSE=y -CONFIG_VIRTIO_FS=y -CONFIG_OVERLAY_FS=y -# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set -CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y -# CONFIG_OVERLAY_FS_INDEX is not set -# CONFIG_OVERLAY_FS_XINO_AUTO is not set -# CONFIG_OVERLAY_FS_METACOPY is not set - -# -# Caches -# -CONFIG_FSCACHE=y -CONFIG_FSCACHE_STATS=y -# CONFIG_FSCACHE_HISTOGRAM is not set -# CONFIG_FSCACHE_DEBUG is not set -# CONFIG_FSCACHE_OBJECT_LIST is not set -CONFIG_CACHEFILES=y -# CONFIG_CACHEFILES_DEBUG is not set -# CONFIG_CACHEFILES_HISTOGRAM is not set -# end of Caches - -# -# CD-ROM/DVD Filesystems -# -CONFIG_ISO9660_FS=y -CONFIG_JOLIET=y -CONFIG_ZISOFS=y -CONFIG_UDF_FS=y -# end of CD-ROM/DVD Filesystems - -# -# DOS/FAT/EXFAT/NT Filesystems -# -CONFIG_FAT_FS=y -CONFIG_MSDOS_FS=y -CONFIG_VFAT_FS=y -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="utf8" -# CONFIG_FAT_DEFAULT_UTF8 is not set -# CONFIG_EXFAT_FS is not set -CONFIG_NTFS_FS=m -# CONFIG_NTFS_DEBUG is not set -# CONFIG_NTFS_RW is not set -# end of DOS/FAT/EXFAT/NT Filesystems - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -CONFIG_PROC_KCORE=y -CONFIG_PROC_SYSCTL=y -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_PROC_CHILDREN=y -CONFIG_KERNFS=y -CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -CONFIG_TMPFS_XATTR=y -# CONFIG_TMPFS_INODE64 is not set -CONFIG_HUGETLBFS=y -CONFIG_HUGETLB_PAGE=y -CONFIG_MEMFD_CREATE=y -CONFIG_ARCH_HAS_GIGANTIC_PAGE=y -CONFIG_CONFIGFS_FS=y -CONFIG_EFIVAR_FS=y -# end of Pseudo filesystems - -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_ORANGEFS_FS is not set -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_ECRYPT_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_EFS_FS is not set -# CONFIG_CRAMFS is not set -CONFIG_SQUASHFS=y -CONFIG_SQUASHFS_FILE_CACHE=y -# CONFIG_SQUASHFS_FILE_DIRECT is not set -CONFIG_SQUASHFS_DECOMP_SINGLE=y -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set -CONFIG_SQUASHFS_XATTR=y -CONFIG_SQUASHFS_ZLIB=y -CONFIG_SQUASHFS_LZ4=y -CONFIG_SQUASHFS_LZO=y -CONFIG_SQUASHFS_XZ=y -CONFIG_SQUASHFS_ZSTD=y -# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_VXFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_OMFS_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX6FS_FS is not set -# CONFIG_ROMFS_FS is not set -CONFIG_PSTORE=y -CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 -CONFIG_PSTORE_DEFLATE_COMPRESS=y -# CONFIG_PSTORE_LZO_COMPRESS is not set -# CONFIG_PSTORE_LZ4_COMPRESS is not set -# CONFIG_PSTORE_LZ4HC_COMPRESS is not set -# CONFIG_PSTORE_842_COMPRESS is not set -# CONFIG_PSTORE_ZSTD_COMPRESS is not set -CONFIG_PSTORE_COMPRESS=y -CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y -CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" -# CONFIG_PSTORE_CONSOLE is not set -# CONFIG_PSTORE_PMSG is not set -# CONFIG_PSTORE_FTRACE is not set -# CONFIG_PSTORE_RAM is not set -# CONFIG_PSTORE_BLK is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set -# CONFIG_EROFS_FS is not set -CONFIG_NETWORK_FILESYSTEMS=y -CONFIG_NFS_FS=m -# CONFIG_NFS_V2 is not set -CONFIG_NFS_V3=m -# CONFIG_NFS_V3_ACL is not set -CONFIG_NFS_V4=m -# CONFIG_NFS_SWAP is not set -CONFIG_NFS_V4_1=y -CONFIG_NFS_V4_2=y -CONFIG_PNFS_FILE_LAYOUT=m -CONFIG_PNFS_BLOCK=m -CONFIG_PNFS_FLEXFILE_LAYOUT=m -CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" -# CONFIG_NFS_V4_1_MIGRATION is not set -CONFIG_NFS_V4_SECURITY_LABEL=y -CONFIG_NFS_FSCACHE=y -# CONFIG_NFS_USE_LEGACY_DNS is not set -CONFIG_NFS_USE_KERNEL_DNS=y -CONFIG_NFS_DISABLE_UDP_SUPPORT=y -# CONFIG_NFS_V4_2_READ_PLUS is not set -CONFIG_NFSD=m -CONFIG_NFSD_V3=y -# CONFIG_NFSD_V3_ACL is not set -CONFIG_NFSD_V4=y -# CONFIG_NFSD_BLOCKLAYOUT is not set -# CONFIG_NFSD_SCSILAYOUT is not set -# CONFIG_NFSD_FLEXFILELAYOUT is not set -# CONFIG_NFSD_V4_2_INTER_SSC is not set -# CONFIG_NFSD_V4_SECURITY_LABEL is not set -CONFIG_GRACE_PERIOD=m -CONFIG_LOCKD=m -CONFIG_LOCKD_V4=y -CONFIG_NFS_COMMON=y -CONFIG_SUNRPC=m -CONFIG_SUNRPC_GSS=m -CONFIG_SUNRPC_BACKCHANNEL=y -CONFIG_RPCSEC_GSS_KRB5=m -# CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set -# CONFIG_SUNRPC_DEBUG is not set -CONFIG_CEPH_FS=m -CONFIG_CEPH_FSCACHE=y -CONFIG_CEPH_FS_POSIX_ACL=y -# CONFIG_CEPH_FS_SECURITY_LABEL is not set -CONFIG_CIFS=y -# CONFIG_CIFS_STATS2 is not set -# CONFIG_CIFS_ALLOW_INSECURE_LEGACY is not set -# CONFIG_CIFS_UPCALL is not set -CONFIG_CIFS_XATTR=y -CONFIG_CIFS_DEBUG=y -# CONFIG_CIFS_DEBUG2 is not set -# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set -CONFIG_CIFS_DFS_UPCALL=y -# CONFIG_CIFS_SWN_UPCALL is not set -CONFIG_CIFS_FSCACHE=y -# CONFIG_CIFS_ROOT is not set -# CONFIG_CODA_FS is not set -# CONFIG_AFS_FS is not set -CONFIG_9P_FS=y -CONFIG_9P_FSCACHE=y -CONFIG_9P_FS_POSIX_ACL=y -CONFIG_9P_FS_SECURITY=y -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="iso8859-1" -CONFIG_NLS_CODEPAGE_437=y -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -CONFIG_NLS_ASCII=y -CONFIG_NLS_ISO8859_1=y -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_MAC_ROMAN is not set -# CONFIG_NLS_MAC_CELTIC is not set -# CONFIG_NLS_MAC_CENTEURO is not set -# CONFIG_NLS_MAC_CROATIAN is not set -# CONFIG_NLS_MAC_CYRILLIC is not set -# CONFIG_NLS_MAC_GAELIC is not set -# CONFIG_NLS_MAC_GREEK is not set -# CONFIG_NLS_MAC_ICELAND is not set -# CONFIG_NLS_MAC_INUIT is not set -# CONFIG_NLS_MAC_ROMANIAN is not set -# CONFIG_NLS_MAC_TURKISH is not set -CONFIG_NLS_UTF8=y -# CONFIG_DLM is not set -# CONFIG_UNICODE is not set -CONFIG_IO_WQ=y -# end of File systems - -# -# Security options -# -CONFIG_KEYS=y -# CONFIG_KEYS_REQUEST_CACHE is not set -CONFIG_PERSISTENT_KEYRINGS=y -CONFIG_TRUSTED_KEYS=y -CONFIG_ENCRYPTED_KEYS=y -CONFIG_KEY_DH_OPERATIONS=y -CONFIG_SECURITY_DMESG_RESTRICT=y -CONFIG_SECURITY=y -CONFIG_SECURITYFS=y -CONFIG_SECURITY_NETWORK=y -CONFIG_SECURITY_NETWORK_XFRM=y -CONFIG_SECURITY_PATH=y -CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y -CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set -CONFIG_FORTIFY_SOURCE=y -CONFIG_STATIC_USERMODEHELPER=y -CONFIG_STATIC_USERMODEHELPER_PATH="/sbin/usermode-helper" -# CONFIG_SECURITY_SELINUX is not set -# CONFIG_SECURITY_SMACK is not set -# CONFIG_SECURITY_TOMOYO is not set -# CONFIG_SECURITY_APPARMOR is not set -# CONFIG_SECURITY_LOADPIN is not set -CONFIG_SECURITY_YAMA=y -# CONFIG_SECURITY_SAFESETID is not set -# CONFIG_SECURITY_LOCKDOWN_LSM is not set -CONFIG_INTEGRITY=y -CONFIG_INTEGRITY_SIGNATURE=y -CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y -CONFIG_INTEGRITY_AUDIT=y -CONFIG_IMA=y -CONFIG_IMA_MEASURE_PCR_IDX=10 -# CONFIG_IMA_TEMPLATE is not set -CONFIG_IMA_NG_TEMPLATE=y -# CONFIG_IMA_SIG_TEMPLATE is not set -CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng" -# CONFIG_IMA_DEFAULT_HASH_SHA1 is not set -CONFIG_IMA_DEFAULT_HASH_SHA256=y -# CONFIG_IMA_DEFAULT_HASH_SHA512 is not set -# CONFIG_IMA_DEFAULT_HASH_WP512 is not set -CONFIG_IMA_DEFAULT_HASH="sha256" -# CONFIG_IMA_WRITE_POLICY is not set -CONFIG_IMA_READ_POLICY=y -CONFIG_IMA_APPRAISE=y -# CONFIG_IMA_ARCH_POLICY is not set -# CONFIG_IMA_APPRAISE_BUILD_POLICY is not set -CONFIG_IMA_APPRAISE_BOOTPARAM=y -# CONFIG_IMA_APPRAISE_MODSIG is not set -CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS=y -# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set -CONFIG_EVM=y -CONFIG_EVM_ATTR_FSUUID=y -# CONFIG_EVM_ADD_XATTRS is not set -CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_LSM="yama,loadpin,safesetid,integrity" - -# -# Kernel hardening options -# -CONFIG_GCC_PLUGIN_STRUCTLEAK=y - -# -# Memory initialization -# -# CONFIG_INIT_STACK_NONE is not set -# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set -# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set -CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL=y -# CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y -CONFIG_STACKLEAK_TRACK_MIN_SIZE=100 -# CONFIG_STACKLEAK_METRICS is not set -# CONFIG_STACKLEAK_RUNTIME_DISABLE is not set -# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set -# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set -# end of Memory initialization -# end of Kernel hardening options -# end of Security options - -CONFIG_XOR_BLOCKS=m -CONFIG_CRYPTO=y - -# -# Crypto core or helper -# -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_SKCIPHER=y -CONFIG_CRYPTO_SKCIPHER2=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_RNG_DEFAULT=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_AKCIPHER=y -CONFIG_CRYPTO_KPP2=y -CONFIG_CRYPTO_KPP=y -CONFIG_CRYPTO_ACOMP2=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -CONFIG_CRYPTO_USER=y -CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_GF128MUL=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_NULL2=y -# CONFIG_CRYPTO_PCRYPT is not set -CONFIG_CRYPTO_CRYPTD=y -CONFIG_CRYPTO_AUTHENC=y -# CONFIG_CRYPTO_TEST is not set -CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_ENGINE=m - -# -# Public-key cryptography -# -CONFIG_CRYPTO_RSA=y -CONFIG_CRYPTO_DH=y -# CONFIG_CRYPTO_ECDH is not set -# CONFIG_CRYPTO_ECRDSA is not set -# CONFIG_CRYPTO_SM2 is not set -# CONFIG_CRYPTO_CURVE25519 is not set - -# -# Authenticated Encryption with Associated Data -# -CONFIG_CRYPTO_CCM=y -CONFIG_CRYPTO_GCM=y -CONFIG_CRYPTO_CHACHA20POLY1305=y -# CONFIG_CRYPTO_AEGIS128 is not set -CONFIG_CRYPTO_SEQIV=y -CONFIG_CRYPTO_ECHAINIV=y - -# -# Block modes -# -CONFIG_CRYPTO_CBC=y -# CONFIG_CRYPTO_CFB is not set -CONFIG_CRYPTO_CTR=y -CONFIG_CRYPTO_CTS=y -CONFIG_CRYPTO_ECB=y -CONFIG_CRYPTO_LRW=y -# CONFIG_CRYPTO_OFB is not set -CONFIG_CRYPTO_PCBC=y -CONFIG_CRYPTO_XTS=y -CONFIG_CRYPTO_KEYWRAP=y -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y - -# -# Hash modes -# -CONFIG_CRYPTO_CMAC=y -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_XCBC=y -CONFIG_CRYPTO_VMAC=y - -# -# Digest -# -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_XXHASH=m -CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set -CONFIG_CRYPTO_CRCT10DIF=y -CONFIG_CRYPTO_GHASH=y -CONFIG_CRYPTO_POLY1305=y -CONFIG_CRYPTO_MD4=y -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_MICHAEL_MIC=y -CONFIG_CRYPTO_RMD128=y -CONFIG_CRYPTO_RMD160=y -CONFIG_CRYPTO_RMD256=y -CONFIG_CRYPTO_RMD320=y -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=y -# CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set -# CONFIG_CRYPTO_STREEBOG is not set -CONFIG_CRYPTO_TGR192=y -CONFIG_CRYPTO_WP512=y - -# -# Ciphers -# -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_ANUBIS=y -CONFIG_CRYPTO_ARC4=y -CONFIG_CRYPTO_BLOWFISH=y -CONFIG_CRYPTO_BLOWFISH_COMMON=y -CONFIG_CRYPTO_CAMELLIA=y -CONFIG_CRYPTO_CAST_COMMON=y -CONFIG_CRYPTO_CAST5=y -CONFIG_CRYPTO_CAST6=y -CONFIG_CRYPTO_DES=y -CONFIG_CRYPTO_FCRYPT=y -CONFIG_CRYPTO_KHAZAD=y -CONFIG_CRYPTO_SALSA20=y -CONFIG_CRYPTO_CHACHA20=y -CONFIG_CRYPTO_SEED=y -CONFIG_CRYPTO_SERPENT=y -# CONFIG_CRYPTO_SM4 is not set -CONFIG_CRYPTO_TEA=y -CONFIG_CRYPTO_TWOFISH=y -CONFIG_CRYPTO_TWOFISH_COMMON=y - -# -# Compression -# -CONFIG_CRYPTO_DEFLATE=y -CONFIG_CRYPTO_LZO=y -CONFIG_CRYPTO_842=y -CONFIG_CRYPTO_LZ4=y -CONFIG_CRYPTO_LZ4HC=y -# CONFIG_CRYPTO_ZSTD is not set - -# -# Random Number Generation -# -CONFIG_CRYPTO_ANSI_CPRNG=y -CONFIG_CRYPTO_DRBG_MENU=y -CONFIG_CRYPTO_DRBG_HMAC=y -# CONFIG_CRYPTO_DRBG_HASH is not set -# CONFIG_CRYPTO_DRBG_CTR is not set -CONFIG_CRYPTO_DRBG=y -CONFIG_CRYPTO_JITTERENTROPY=y -CONFIG_CRYPTO_USER_API=y -CONFIG_CRYPTO_USER_API_HASH=y -CONFIG_CRYPTO_USER_API_SKCIPHER=y -CONFIG_CRYPTO_USER_API_RNG=y -# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set -CONFIG_CRYPTO_USER_API_AEAD=y -CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y -# CONFIG_CRYPTO_STATS is not set -CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m -CONFIG_CRYPTO_LIB_BLAKE2S=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y -CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m -CONFIG_CRYPTO_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m -CONFIG_CRYPTO_LIB_SHA256=y -CONFIG_CRYPTO_HW=y -# CONFIG_CRYPTO_DEV_FSL_CAAM is not set -# CONFIG_CRYPTO_DEV_EXYNOS_RNG is not set -# CONFIG_CRYPTO_DEV_S5P is not set -# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set -# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set -# CONFIG_CRYPTO_DEV_CCP is not set -# CONFIG_CAVIUM_CPT is not set -# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set -# CONFIG_CRYPTO_DEV_OCTEONTX_CPT is not set -CONFIG_CRYPTO_DEV_CAVIUM_ZIP=m -CONFIG_CRYPTO_DEV_QCE=m -CONFIG_CRYPTO_DEV_QCE_SKCIPHER=y -CONFIG_CRYPTO_DEV_QCE_SHA=y -CONFIG_CRYPTO_DEV_QCE_ENABLE_ALL=y -# CONFIG_CRYPTO_DEV_QCE_ENABLE_SKCIPHER is not set -# CONFIG_CRYPTO_DEV_QCE_ENABLE_SHA is not set -CONFIG_CRYPTO_DEV_QCE_SW_MAX_LEN=512 -CONFIG_CRYPTO_DEV_QCOM_RNG=m -CONFIG_CRYPTO_DEV_VIRTIO=m -# CONFIG_CRYPTO_DEV_SAFEXCEL is not set -# CONFIG_CRYPTO_DEV_CCREE is not set -CONFIG_CRYPTO_DEV_HISI_SEC=m -# CONFIG_CRYPTO_DEV_HISI_SEC2 is not set -# CONFIG_CRYPTO_DEV_HISI_ZIP is not set -# CONFIG_CRYPTO_DEV_HISI_HPRE is not set -# CONFIG_CRYPTO_DEV_HISI_TRNG is not set -# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set -CONFIG_ASYMMETRIC_KEY_TYPE=y -CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y -# CONFIG_ASYMMETRIC_TPM_KEY_SUBTYPE is not set -CONFIG_X509_CERTIFICATE_PARSER=y -# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set -CONFIG_PKCS7_MESSAGE_PARSER=y - -# -# Certificates for signature checking -# -# CONFIG_SYSTEM_TRUSTED_KEYRING is not set -# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -# end of Certificates for signature checking - -CONFIG_BINARY_PRINTF=y - -# -# Library routines -# -CONFIG_RAID6_PQ=m -CONFIG_RAID6_PQ_BENCHMARK=y -# CONFIG_PACKING is not set -CONFIG_BITREVERSE=y -CONFIG_HAVE_ARCH_BITREVERSE=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_NET_UTILS=y -# CONFIG_CORDIC is not set -# CONFIG_PRIME_NUMBERS is not set -CONFIG_RATIONAL=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y -CONFIG_ARCH_HAS_FAST_MULTIPLIER=y -CONFIG_ARCH_USE_SYM_ANNOTATIONS=y -# CONFIG_INDIRECT_PIO is not set -CONFIG_CRC_CCITT=y -CONFIG_CRC16=y -CONFIG_CRC_T10DIF=y -CONFIG_CRC_ITU_T=y -CONFIG_CRC32=y -# CONFIG_CRC32_SELFTEST is not set -CONFIG_CRC32_SLICEBY8=y -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SARWATE is not set -# CONFIG_CRC32_BIT is not set -# CONFIG_CRC64 is not set -# CONFIG_CRC4 is not set -# CONFIG_CRC7 is not set -CONFIG_LIBCRC32C=y -CONFIG_CRC8=y -CONFIG_XXHASH=y -CONFIG_AUDIT_GENERIC=y -CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y -# CONFIG_RANDOM32_SELFTEST is not set -CONFIG_842_COMPRESS=y -CONFIG_842_DECOMPRESS=y -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_LZO_COMPRESS=y -CONFIG_LZO_DECOMPRESS=y -CONFIG_LZ4_COMPRESS=y -CONFIG_LZ4HC_COMPRESS=y -CONFIG_LZ4_DECOMPRESS=y -CONFIG_ZSTD_COMPRESS=m -CONFIG_ZSTD_DECOMPRESS=y -CONFIG_XZ_DEC=y -CONFIG_XZ_DEC_X86=y -CONFIG_XZ_DEC_POWERPC=y -CONFIG_XZ_DEC_IA64=y -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y -CONFIG_XZ_DEC_SPARC=y -CONFIG_XZ_DEC_BCJ=y -# CONFIG_XZ_DEC_TEST is not set -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DECOMPRESS_ZSTD=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_TEXTSEARCH=y -CONFIG_TEXTSEARCH_KMP=y -CONFIG_TEXTSEARCH_BM=y -CONFIG_TEXTSEARCH_FSM=y -CONFIG_INTERVAL_TREE=y -CONFIG_XARRAY_MULTI=y -CONFIG_ASSOCIATIVE_ARRAY=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HAS_DMA=y -CONFIG_DMA_OPS=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_DMA_DECLARE_COHERENT=y -CONFIG_ARCH_HAS_SETUP_DMA_OPS=y -CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y -CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y -CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y -CONFIG_SWIOTLB=y -CONFIG_DMA_NONCOHERENT_MMAP=y -CONFIG_DMA_COHERENT_POOL=y -CONFIG_DMA_REMAP=y -CONFIG_DMA_DIRECT_REMAP=y -# CONFIG_DMA_API_DEBUG is not set -# CONFIG_DMA_MAP_BENCHMARK is not set -CONFIG_SGL_ALLOC=y -CONFIG_CHECK_SIGNATURE=y -CONFIG_CPU_RMAP=y -CONFIG_DQL=y -CONFIG_GLOB=y -# CONFIG_GLOB_SELFTEST is not set -CONFIG_NLATTR=y -CONFIG_LRU_CACHE=m -CONFIG_CLZ_TAB=y -CONFIG_IRQ_POLL=y -CONFIG_MPILIB=y -CONFIG_SIGNATURE=y -CONFIG_DIMLIB=y -CONFIG_LIBFDT=y -CONFIG_OID_REGISTRY=y -CONFIG_UCS2_STRING=y -CONFIG_HAVE_GENERIC_VDSO=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_VDSO_TIME_NS=y -CONFIG_FONT_SUPPORT=y -# CONFIG_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y -CONFIG_SG_SPLIT=y -CONFIG_SG_POOL=y -CONFIG_ARCH_STACKWALK=y -CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set -# end of Library routines - -CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y -CONFIG_PLDMFW=y - -# -# Kernel hacking -# - -# -# printk and dmesg options -# -CONFIG_PRINTK_TIME=y -# CONFIG_PRINTK_CALLER is not set -CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 -CONFIG_CONSOLE_LOGLEVEL_QUIET=4 -CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 -# CONFIG_BOOT_PRINTK_DELAY is not set -# CONFIG_DYNAMIC_DEBUG is not set -# CONFIG_DYNAMIC_DEBUG_CORE is not set -CONFIG_SYMBOLIC_ERRNAME=y -CONFIG_DEBUG_BUGVERBOSE=y -# end of printk and dmesg options - -# -# Compile-time checks and compiler options -# -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_INFO_REDUCED is not set -# CONFIG_DEBUG_INFO_COMPRESSED is not set -CONFIG_DEBUG_INFO_SPLIT=y -# CONFIG_DEBUG_INFO_DWARF4 is not set -# CONFIG_GDB_SCRIPTS is not set -CONFIG_FRAME_WARN=1024 -# CONFIG_STRIP_ASM_SYMS is not set -# CONFIG_READABLE_ASM is not set -# CONFIG_HEADERS_INSTALL is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_ARCH_WANT_FRAME_POINTERS=y -CONFIG_FRAME_POINTER=y -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -# end of Compile-time checks and compiler options - -# -# Generic Kernel Debugging Instruments -# -CONFIG_MAGIC_SYSRQ=y -CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 -CONFIG_MAGIC_SYSRQ_SERIAL=y -CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_FS_ALLOW_ALL=y -# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set -# CONFIG_DEBUG_FS_ALLOW_NONE is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y -CONFIG_UBSAN=y -# CONFIG_UBSAN_TRAP is not set -CONFIG_CC_HAS_UBSAN_BOUNDS=y -CONFIG_UBSAN_BOUNDS=y -CONFIG_UBSAN_ONLY_BOUNDS=y -CONFIG_UBSAN_SHIFT=y -# CONFIG_UBSAN_DIV_ZERO is not set -# CONFIG_UBSAN_UNREACHABLE is not set -CONFIG_UBSAN_SIGNED_OVERFLOW=y -CONFIG_UBSAN_BOOL=y -CONFIG_UBSAN_ENUM=y -# CONFIG_UBSAN_ALIGNMENT is not set -# CONFIG_UBSAN_SANITIZE_ALL is not set -# CONFIG_TEST_UBSAN is not set -# end of Generic Kernel Debugging Instruments - -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_MISC=y - -# -# Memory Debugging -# -CONFIG_PAGE_EXTENSION=y -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_PAGE_OWNER is not set -CONFIG_PAGE_POISONING=y -# CONFIG_DEBUG_PAGE_REF is not set -# CONFIG_DEBUG_RODATA_TEST is not set -CONFIG_ARCH_HAS_DEBUG_WX=y -# CONFIG_DEBUG_WX is not set -CONFIG_GENERIC_PTDUMP=y -# CONFIG_PTDUMP_DEBUGFS is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_DEBUG_SLAB is not set -CONFIG_HAVE_DEBUG_KMEMLEAK=y -# CONFIG_DEBUG_KMEMLEAK is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_SCHED_STACK_END_CHECK is not set -CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y -# CONFIG_DEBUG_VM is not set -# CONFIG_DEBUG_VM_PGTABLE is not set -CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y -# CONFIG_DEBUG_VIRTUAL is not set -CONFIG_DEBUG_MEMORY_INIT=y -# CONFIG_DEBUG_PER_CPU_MAPS is not set -CONFIG_HAVE_ARCH_KASAN=y -CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y -CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y -CONFIG_CC_HAS_KASAN_GENERIC=y -CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y -# CONFIG_KASAN is not set -# end of Memory Debugging - -# CONFIG_DEBUG_SHIRQ is not set - -# -# Debug Oops, Lockups and Hangs -# -CONFIG_PANIC_ON_OOPS=y -CONFIG_PANIC_ON_OOPS_VALUE=1 -CONFIG_PANIC_TIMEOUT=0 -# CONFIG_SOFTLOCKUP_DETECTOR is not set -CONFIG_DETECT_HUNG_TASK=y -CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 -# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 -CONFIG_WQ_WATCHDOG=y -# CONFIG_TEST_LOCKUP is not set -# end of Debug Oops, Lockups and Hangs - -# -# Scheduler Debugging -# -CONFIG_SCHED_DEBUG=y -CONFIG_SCHED_INFO=y -# CONFIG_SCHEDSTATS is not set -# end of Scheduler Debugging - -# CONFIG_DEBUG_TIMEKEEPING is not set -CONFIG_DEBUG_PREEMPT=y - -# -# Lock Debugging (spinlocks, mutexes, etc...) -# -CONFIG_LOCK_DEBUGGING_SUPPORT=y -# CONFIG_PROVE_LOCKING is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_RWSEMS is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_WW_MUTEX_SELFTEST is not set -# CONFIG_SCF_TORTURE_TEST is not set -# CONFIG_CSD_LOCK_WAIT_DEBUG is not set -# end of Lock Debugging (spinlocks, mutexes, etc...) - -CONFIG_STACKTRACE=y -# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set -# CONFIG_DEBUG_KOBJECT is not set -CONFIG_HAVE_DEBUG_BUGVERBOSE=y - -# -# Debug kernel data structures -# -CONFIG_DEBUG_LIST=y -# CONFIG_DEBUG_PLIST is not set -# CONFIG_DEBUG_SG is not set -CONFIG_DEBUG_NOTIFIERS=y -CONFIG_BUG_ON_DATA_CORRUPTION=y -# end of Debug kernel data structures - -CONFIG_DEBUG_CREDENTIALS=y - -# -# RCU Debugging -# -# CONFIG_RCU_SCALE_TEST is not set -# CONFIG_RCU_TORTURE_TEST is not set -# CONFIG_RCU_REF_SCALE_TEST is not set -CONFIG_RCU_CPU_STALL_TIMEOUT=60 -# CONFIG_RCU_TRACE is not set -# CONFIG_RCU_EQS_DEBUG is not set -# end of RCU Debugging - -# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set -# CONFIG_LATENCYTOP is not set -CONFIG_NOP_TRACER=y -CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y -CONFIG_HAVE_DYNAMIC_FTRACE=y -CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y -CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y -CONFIG_HAVE_SYSCALL_TRACEPOINTS=y -CONFIG_HAVE_C_RECORDMCOUNT=y -CONFIG_TRACE_CLOCK=y -CONFIG_RING_BUFFER=y -CONFIG_EVENT_TRACING=y -CONFIG_CONTEXT_SWITCH_TRACER=y -CONFIG_TRACING=y -CONFIG_GENERIC_TRACER=y -CONFIG_TRACING_SUPPORT=y -CONFIG_FTRACE=y -# CONFIG_BOOTTIME_TRACING is not set -CONFIG_FUNCTION_TRACER=y -CONFIG_FUNCTION_GRAPH_TRACER=y -CONFIG_DYNAMIC_FTRACE=y -CONFIG_DYNAMIC_FTRACE_WITH_REGS=y -CONFIG_FUNCTION_PROFILER=y -CONFIG_STACK_TRACER=y -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_PREEMPT_TRACER is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_HWLAT_TRACER is not set -CONFIG_FTRACE_SYSCALLS=y -# CONFIG_TRACER_SNAPSHOT is not set -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -CONFIG_BLK_DEV_IO_TRACE=y -CONFIG_KPROBE_EVENTS=y -# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set -CONFIG_UPROBE_EVENTS=y -CONFIG_BPF_EVENTS=y -CONFIG_DYNAMIC_EVENTS=y -CONFIG_PROBE_EVENTS=y -# CONFIG_BPF_KPROBE_OVERRIDE is not set -CONFIG_FTRACE_MCOUNT_RECORD=y -# CONFIG_SYNTH_EVENTS is not set -# CONFIG_HIST_TRIGGERS is not set -# CONFIG_TRACE_EVENT_INJECT is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -# CONFIG_FTRACE_RECORD_RECURSION is not set -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_KPROBE_EVENT_GEN_TEST is not set -# CONFIG_SAMPLES is not set -CONFIG_STRICT_DEVMEM=y -# CONFIG_IO_STRICT_DEVMEM is not set - -# -# arm64 Debugging -# -# CONFIG_PID_IN_CONTEXTIDR is not set -# CONFIG_DEBUG_EFI is not set -# CONFIG_ARM64_RELOC_TEST is not set -# CONFIG_CORESIGHT is not set -# end of arm64 Debugging - -# -# Kernel Testing and Coverage -# -# CONFIG_KUNIT is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -CONFIG_FUNCTION_ERROR_INJECTION=y -# CONFIG_FAULT_INJECTION is not set -CONFIG_ARCH_HAS_KCOV=y -CONFIG_CC_HAS_SANCOV_TRACE_PC=y -# CONFIG_KCOV is not set -CONFIG_RUNTIME_TESTING_MENU=y -# CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set -# CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_SORT is not set -# CONFIG_KPROBES_SANITY_TEST is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_RBTREE_TEST is not set -# CONFIG_REED_SOLOMON_TEST is not set -# CONFIG_INTERVAL_TREE_TEST is not set -# CONFIG_PERCPU_TEST is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_TEST_HEXDUMP is not set -# CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_STRSCPY is not set -# CONFIG_TEST_KSTRTOX is not set -# CONFIG_TEST_PRINTF is not set -# CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_UUID is not set -# CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_OVERFLOW is not set -# CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set -# CONFIG_TEST_IDA is not set -# CONFIG_TEST_LKM is not set -# CONFIG_TEST_BITOPS is not set -# CONFIG_TEST_VMALLOC is not set -# CONFIG_TEST_USER_COPY is not set -# CONFIG_TEST_BPF is not set -# CONFIG_TEST_BLACKHOLE_DEV is not set -# CONFIG_FIND_BIT_BENCHMARK is not set -# CONFIG_TEST_FIRMWARE is not set -# CONFIG_TEST_SYSCTL is not set -# CONFIG_TEST_UDELAY is not set -# CONFIG_TEST_STATIC_KEYS is not set -# CONFIG_TEST_KMOD is not set -# CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_STACKINIT is not set -# CONFIG_TEST_MEMINIT is not set -# CONFIG_TEST_FREE_PAGES is not set -# CONFIG_MEMTEST is not set -# end of Kernel Testing and Coverage -# end of Kernel hacking diff --git a/kernel/config-5.11.x-aarch64-rt b/kernel/config-5.11.x-aarch64-rt deleted file mode 100644 index 59ef068ac7..0000000000 --- a/kernel/config-5.11.x-aarch64-rt +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_SLUB_DEBUG=y -# CONFIG_SLUB_MEMCG_SYSFS_ON is not set -CONFIG_SLUB=y -# CONFIG_SLAB_FREELIST_HARDENED is not set -CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y -CONFIG_PREEMPT=y -CONFIG_PREEMPT_RT_BASE=y -CONFIG_HAVE_PREEMPT_LAZY=y -CONFIG_PREEMPT_LAZY=y -# CONFIG_PREEMPT_VOLUNTARY is not set -# CONFIG_PREEMPT__LL is not set -# CONFIG_PREEMPT_RTB is not set -CONFIG_PREEMPT_RT_FULL=y -CONFIG_PREEMPT_COUNT=y -# CONFIG_SLUB_DEBUG_ON is not set -# CONFIG_SLUB_STATS is not set -CONFIG_DEBUG_PREEMPT=y -# CONFIG_PREEMPT_TRACER is not set -CONFIG_HZ_1000=y -CONFIG_HZ=1000 diff --git a/kernel/config-5.11.x-x86_64 b/kernel/config-5.11.x-x86_64 deleted file mode 100644 index d5e7552856..0000000000 --- a/kernel/config-5.11.x-x86_64 +++ /dev/null @@ -1,4821 +0,0 @@ -# -# Automatically generated file; DO NOT EDIT. -# Linux/x86 5.11.4 Kernel Configuration -# -CONFIG_CC_VERSION_TEXT="gcc (Alpine 10.2.1_pre1) 10.2.1 20201203" -CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=100201 -CONFIG_LD_VERSION=235020000 -CONFIG_CLANG_VERSION=0 -CONFIG_LLD_VERSION=0 -CONFIG_CC_CAN_LINK=y -CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y -CONFIG_CC_HAS_ASM_INLINE=y -CONFIG_IRQ_WORK=y -CONFIG_BUILDTIME_TABLE_SORT=y -CONFIG_THREAD_INFO_IN_TASK=y - -# -# General setup -# -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_COMPILE_TEST is not set -CONFIG_LOCALVERSION="-linuxkit" -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_BUILD_SALT="" -CONFIG_HAVE_KERNEL_GZIP=y -CONFIG_HAVE_KERNEL_BZIP2=y -CONFIG_HAVE_KERNEL_LZMA=y -CONFIG_HAVE_KERNEL_XZ=y -CONFIG_HAVE_KERNEL_LZO=y -CONFIG_HAVE_KERNEL_LZ4=y -CONFIG_HAVE_KERNEL_ZSTD=y -CONFIG_KERNEL_GZIP=y -# CONFIG_KERNEL_BZIP2 is not set -# CONFIG_KERNEL_LZMA is not set -# CONFIG_KERNEL_XZ is not set -# CONFIG_KERNEL_LZO is not set -# CONFIG_KERNEL_LZ4 is not set -# CONFIG_KERNEL_ZSTD is not set -CONFIG_DEFAULT_INIT="" -CONFIG_DEFAULT_HOSTNAME="(none)" -CONFIG_SWAP=y -CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -CONFIG_POSIX_MQUEUE=y -CONFIG_POSIX_MQUEUE_SYSCTL=y -# CONFIG_WATCH_QUEUE is not set -CONFIG_CROSS_MEMORY_ATTACH=y -# CONFIG_USELIB is not set -CONFIG_AUDIT=y -CONFIG_HAVE_ARCH_AUDITSYSCALL=y -CONFIG_AUDITSYSCALL=y - -# -# IRQ subsystem -# -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_PENDING_IRQ=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y -CONFIG_GENERIC_IRQ_RESERVATION_MODE=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_SPARSE_IRQ=y -# CONFIG_GENERIC_IRQ_DEBUGFS is not set -# end of IRQ subsystem - -CONFIG_CLOCKSOURCE_WATCHDOG=y -CONFIG_ARCH_CLOCKSOURCE_INIT=y -CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y -CONFIG_GENERIC_CMOS_UPDATE=y -CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y -CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y - -# -# Timers subsystem -# -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ_COMMON=y -# CONFIG_HZ_PERIODIC is not set -CONFIG_NO_HZ_IDLE=y -# CONFIG_NO_HZ_FULL is not set -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y -# end of Timers subsystem - -# CONFIG_PREEMPT_NONE is not set -CONFIG_PREEMPT_VOLUNTARY=y -# CONFIG_PREEMPT is not set - -# -# CPU/Task time and stats accounting -# -CONFIG_TICK_CPU_ACCOUNTING=y -# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set -# CONFIG_IRQ_TIME_ACCOUNTING is not set -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_TASK_XACCT=y -CONFIG_TASK_IO_ACCOUNTING=y -# CONFIG_PSI is not set -# end of CPU/Task time and stats accounting - -CONFIG_CPU_ISOLATION=y - -# -# RCU Subsystem -# -CONFIG_TREE_RCU=y -# CONFIG_RCU_EXPERT is not set -CONFIG_SRCU=y -CONFIG_TREE_SRCU=y -CONFIG_TASKS_RCU_GENERIC=y -CONFIG_TASKS_RUDE_RCU=y -CONFIG_TASKS_TRACE_RCU=y -CONFIG_RCU_STALL_COMMON=y -CONFIG_RCU_NEED_SEGCBLIST=y -# end of RCU Subsystem - -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -# CONFIG_IKHEADERS is not set -CONFIG_LOG_BUF_SHIFT=17 -CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 -CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y - -# -# Scheduler features -# -# CONFIG_UCLAMP_TASK is not set -# end of Scheduler features - -CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y -CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y -CONFIG_CC_HAS_INT128=y -CONFIG_ARCH_SUPPORTS_INT128=y -CONFIG_CGROUPS=y -CONFIG_PAGE_COUNTER=y -CONFIG_MEMCG=y -CONFIG_MEMCG_SWAP=y -CONFIG_MEMCG_KMEM=y -CONFIG_BLK_CGROUP=y -CONFIG_CGROUP_WRITEBACK=y -CONFIG_CGROUP_SCHED=y -CONFIG_FAIR_GROUP_SCHED=y -CONFIG_CFS_BANDWIDTH=y -CONFIG_RT_GROUP_SCHED=y -CONFIG_CGROUP_PIDS=y -CONFIG_CGROUP_RDMA=y -CONFIG_CGROUP_FREEZER=y -CONFIG_CGROUP_HUGETLB=y -CONFIG_CPUSETS=y -CONFIG_PROC_PID_CPUSET=y -CONFIG_CGROUP_DEVICE=y -CONFIG_CGROUP_CPUACCT=y -CONFIG_CGROUP_PERF=y -CONFIG_CGROUP_BPF=y -# CONFIG_CGROUP_DEBUG is not set -CONFIG_SOCK_CGROUP_DATA=y -CONFIG_NAMESPACES=y -CONFIG_UTS_NS=y -CONFIG_TIME_NS=y -CONFIG_IPC_NS=y -CONFIG_USER_NS=y -CONFIG_PID_NS=y -CONFIG_NET_NS=y -CONFIG_CHECKPOINT_RESTORE=y -CONFIG_SCHED_AUTOGROUP=y -# CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_RD_GZIP=y -# CONFIG_RD_BZIP2 is not set -# CONFIG_RD_LZMA is not set -# CONFIG_RD_XZ is not set -# CONFIG_RD_LZO is not set -# CONFIG_RD_LZ4 is not set -CONFIG_RD_ZSTD=y -# CONFIG_BOOT_CONFIG is not set -# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set -CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_LD_ORPHAN_WARN=y -CONFIG_SYSCTL=y -CONFIG_HAVE_UID16=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y -CONFIG_EXPERT=y -CONFIG_UID16=y -CONFIG_MULTIUSER=y -CONFIG_SGETMASK_SYSCALL=y -CONFIG_SYSFS_SYSCALL=y -CONFIG_FHANDLE=y -CONFIG_POSIX_TIMERS=y -CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y -CONFIG_BUG=y -CONFIG_ELF_CORE=y -CONFIG_PCSPKR_PLATFORM=y -CONFIG_BASE_FULL=y -CONFIG_FUTEX=y -CONFIG_FUTEX_PI=y -CONFIG_EPOLL=y -CONFIG_SIGNALFD=y -CONFIG_TIMERFD=y -CONFIG_EVENTFD=y -CONFIG_SHMEM=y -CONFIG_AIO=y -CONFIG_IO_URING=y -CONFIG_ADVISE_SYSCALLS=y -CONFIG_MEMBARRIER=y -CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_ALL is not set -CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y -CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_LSM is not set -CONFIG_BPF_SYSCALL=y -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -CONFIG_BPF_JIT_ALWAYS_ON=y -CONFIG_BPF_JIT_DEFAULT_ON=y -# CONFIG_BPF_PRELOAD is not set -# CONFIG_USERFAULTFD is not set -CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -CONFIG_KCMP=y -CONFIG_RSEQ=y -# CONFIG_DEBUG_RSEQ is not set -# CONFIG_EMBEDDED is not set -CONFIG_HAVE_PERF_EVENTS=y -# CONFIG_PC104 is not set - -# -# Kernel Performance Events And Counters -# -CONFIG_PERF_EVENTS=y -# CONFIG_DEBUG_PERF_USE_VMALLOC is not set -# end of Kernel Performance Events And Counters - -CONFIG_VM_EVENT_COUNTERS=y -# CONFIG_COMPAT_BRK is not set -CONFIG_SLAB=y -# CONFIG_SLUB is not set -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -CONFIG_SLAB_FREELIST_RANDOM=y -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_PROFILING=y -CONFIG_TRACEPOINTS=y -# end of General setup - -CONFIG_64BIT=y -CONFIG_X86_64=y -CONFIG_X86=y -CONFIG_INSTRUCTION_DECODER=y -CONFIG_OUTPUT_FORMAT="elf64-x86-64" -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_MMU=y -CONFIG_ARCH_MMAP_RND_BITS_MIN=28 -CONFIG_ARCH_MMAP_RND_BITS_MAX=32 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 -CONFIG_GENERIC_ISA_DMA=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_ARCH_MAY_HAVE_PC_FDC=y -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y -CONFIG_AUDIT_ARCH=y -CONFIG_X86_64_SMP=y -CONFIG_ARCH_SUPPORTS_UPROBES=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_PGTABLE_LEVELS=4 -CONFIG_CC_HAS_SANE_STACKPROTECTOR=y - -# -# Processor type and features -# -CONFIG_ZONE_DMA=y -CONFIG_SMP=y -CONFIG_X86_FEATURE_NAMES=y -CONFIG_X86_X2APIC=y -CONFIG_X86_MPPARSE=y -# CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y -# CONFIG_X86_CPU_RESCTRL is not set -# CONFIG_X86_EXTENDED_PLATFORM is not set -# CONFIG_X86_INTEL_LPSS is not set -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -# CONFIG_IOSF_MBI is not set -CONFIG_SCHED_OMIT_FRAME_POINTER=y -CONFIG_HYPERVISOR_GUEST=y -CONFIG_PARAVIRT=y -CONFIG_PARAVIRT_XXL=y -# CONFIG_PARAVIRT_DEBUG is not set -CONFIG_PARAVIRT_SPINLOCKS=y -CONFIG_X86_HV_CALLBACK_VECTOR=y -CONFIG_XEN=y -CONFIG_XEN_PV=y -CONFIG_XEN_512GB=y -CONFIG_XEN_PV_SMP=y -CONFIG_XEN_DOM0=y -CONFIG_XEN_PVHVM=y -CONFIG_XEN_PVHVM_SMP=y -CONFIG_XEN_PVHVM_GUEST=y -CONFIG_XEN_SAVE_RESTORE=y -# CONFIG_XEN_DEBUG_FS is not set -CONFIG_XEN_PVH=y -CONFIG_KVM_GUEST=y -CONFIG_ARCH_CPUIDLE_HALTPOLL=y -CONFIG_PVH=y -# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set -CONFIG_PARAVIRT_CLOCK=y -# CONFIG_JAILHOUSE_GUEST is not set -# CONFIG_ACRN_GUEST is not set -# CONFIG_MK8 is not set -# CONFIG_MPSC is not set -# CONFIG_MCORE2 is not set -# CONFIG_MATOM is not set -CONFIG_GENERIC_CPU=y -CONFIG_X86_INTERNODE_CACHE_SHIFT=6 -CONFIG_X86_L1_CACHE_SHIFT=6 -CONFIG_X86_TSC=y -CONFIG_X86_CMPXCHG64=y -CONFIG_X86_CMOV=y -CONFIG_X86_MINIMUM_CPU_FAMILY=64 -CONFIG_X86_DEBUGCTLMSR=y -CONFIG_IA32_FEAT_CTL=y -CONFIG_X86_VMX_FEATURE_NAMES=y -# CONFIG_PROCESSOR_SELECT is not set -CONFIG_CPU_SUP_INTEL=y -CONFIG_CPU_SUP_AMD=y -CONFIG_CPU_SUP_HYGON=y -CONFIG_CPU_SUP_CENTAUR=y -CONFIG_CPU_SUP_ZHAOXIN=y -CONFIG_HPET_TIMER=y -CONFIG_HPET_EMULATE_RTC=y -CONFIG_DMI=y -# CONFIG_GART_IOMMU is not set -# CONFIG_MAXSMP is not set -CONFIG_NR_CPUS_RANGE_BEGIN=2 -CONFIG_NR_CPUS_RANGE_END=512 -CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS=128 -CONFIG_SCHED_SMT=y -CONFIG_SCHED_MC=y -CONFIG_SCHED_MC_PRIO=y -CONFIG_X86_LOCAL_APIC=y -CONFIG_X86_IO_APIC=y -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y -# CONFIG_X86_MCE is not set - -# -# Performance monitoring -# -CONFIG_PERF_EVENTS_INTEL_UNCORE=y -CONFIG_PERF_EVENTS_INTEL_RAPL=y -CONFIG_PERF_EVENTS_INTEL_CSTATE=y -# CONFIG_PERF_EVENTS_AMD_POWER is not set -# end of Performance monitoring - -CONFIG_X86_VSYSCALL_EMULATION=y -CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set -CONFIG_MICROCODE=y -CONFIG_MICROCODE_INTEL=y -CONFIG_MICROCODE_AMD=y -CONFIG_MICROCODE_OLD_INTERFACE=y -CONFIG_X86_MSR=y -CONFIG_X86_CPUID=y -# CONFIG_X86_5LEVEL is not set -CONFIG_X86_DIRECT_GBPAGES=y -# CONFIG_X86_CPA_STATISTICS is not set -# CONFIG_AMD_MEM_ENCRYPT is not set -# CONFIG_NUMA is not set -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -# CONFIG_ARCH_MEMORY_PROBE is not set -CONFIG_ARCH_PROC_KCORE_TEXT=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -# CONFIG_X86_PMEM_LEGACY is not set -# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 -CONFIG_MTRR=y -CONFIG_MTRR_SANITIZER=y -CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 -CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 -CONFIG_X86_PAT=y -CONFIG_ARCH_USES_PG_UNCACHED=y -CONFIG_ARCH_RANDOM=y -CONFIG_X86_SMAP=y -CONFIG_X86_UMIP=y -CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y -CONFIG_X86_INTEL_TSX_MODE_OFF=y -# CONFIG_X86_INTEL_TSX_MODE_ON is not set -# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set -# CONFIG_X86_SGX is not set -CONFIG_EFI=y -CONFIG_EFI_STUB=y -CONFIG_EFI_MIXED=y -# CONFIG_HZ_100 is not set -# CONFIG_HZ_250 is not set -# CONFIG_HZ_300 is not set -CONFIG_HZ_1000=y -CONFIG_HZ=1000 -CONFIG_SCHED_HRTICK=y -# CONFIG_KEXEC is not set -# CONFIG_KEXEC_FILE is not set -# CONFIG_CRASH_DUMP is not set -CONFIG_PHYSICAL_START=0x1000000 -CONFIG_RELOCATABLE=y -CONFIG_RANDOMIZE_BASE=y -CONFIG_X86_NEED_RELOCS=y -CONFIG_PHYSICAL_ALIGN=0x1000000 -CONFIG_DYNAMIC_MEMORY_LAYOUT=y -CONFIG_RANDOMIZE_MEMORY=y -CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0xa -CONFIG_HOTPLUG_CPU=y -# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set -# CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_COMPAT_VDSO is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set -# CONFIG_LEGACY_VSYSCALL_XONLY is not set -CONFIG_LEGACY_VSYSCALL_NONE=y -# CONFIG_CMDLINE_BOOL is not set -# CONFIG_MODIFY_LDT_SYSCALL is not set -CONFIG_HAVE_LIVEPATCH=y -# end of Processor type and features - -CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y -CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y -CONFIG_ARCH_ENABLE_THP_MIGRATION=y - -# -# Power management and ACPI options -# -# CONFIG_SUSPEND is not set -CONFIG_HIBERNATE_CALLBACKS=y -# CONFIG_HIBERNATION is not set -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -# CONFIG_PM_AUTOSLEEP is not set -# CONFIG_PM_WAKELOCKS is not set -CONFIG_PM=y -# CONFIG_PM_DEBUG is not set -CONFIG_PM_CLK=y -# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set -# CONFIG_ENERGY_MODEL is not set -CONFIG_ARCH_SUPPORTS_ACPI=y -CONFIG_ACPI=y -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -# CONFIG_ACPI_DEBUGGER is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_LPIT=y -# CONFIG_ACPI_REV_OVERRIDE_POSSIBLE is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_FAN=y -# CONFIG_ACPI_TAD is not set -CONFIG_ACPI_DOCK=y -CONFIG_ACPI_CPU_FREQ_PSS=y -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_CPPC_LIB=y -CONFIG_ACPI_PROCESSOR=y -CONFIG_ACPI_HOTPLUG_CPU=y -CONFIG_ACPI_PROCESSOR_AGGREGATOR=y -CONFIG_ACPI_THERMAL=y -CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y -CONFIG_ACPI_TABLE_UPGRADE=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_CONTAINER=y -# CONFIG_ACPI_HOTPLUG_MEMORY is not set -CONFIG_ACPI_HOTPLUG_IOAPIC=y -CONFIG_ACPI_SBS=y -CONFIG_ACPI_HED=y -# CONFIG_ACPI_CUSTOM_METHOD is not set -# CONFIG_ACPI_BGRT is not set -# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set -CONFIG_ACPI_NFIT=y -# CONFIG_NFIT_SECURITY_DEBUG is not set -CONFIG_HAVE_ACPI_APEI=y -CONFIG_HAVE_ACPI_APEI_NMI=y -CONFIG_ACPI_APEI=y -CONFIG_ACPI_APEI_GHES=y -# CONFIG_ACPI_APEI_EINJ is not set -# CONFIG_ACPI_APEI_ERST_DEBUG is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_CONFIGFS is not set -# CONFIG_PMIC_OPREGION is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set - -# -# CPU Frequency scaling -# -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -CONFIG_CPU_FREQ_GOV_COMMON=y -CONFIG_CPU_FREQ_STAT=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -CONFIG_CPU_FREQ_GOV_POWERSAVE=y -CONFIG_CPU_FREQ_GOV_USERSPACE=y -CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y - -# -# CPU frequency scaling drivers -# -CONFIG_X86_INTEL_PSTATE=y -CONFIG_X86_PCC_CPUFREQ=y -CONFIG_X86_ACPI_CPUFREQ=y -CONFIG_X86_ACPI_CPUFREQ_CPB=y -CONFIG_X86_POWERNOW_K8=y -# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set -# CONFIG_X86_SPEEDSTEP_CENTRINO is not set -CONFIG_X86_P4_CLOCKMOD=y - -# -# shared options -# -CONFIG_X86_SPEEDSTEP_LIB=y -# end of CPU Frequency scaling - -# -# CPU Idle -# -CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_GOV_LADDER=y -CONFIG_CPU_IDLE_GOV_MENU=y -# CONFIG_CPU_IDLE_GOV_TEO is not set -# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set -CONFIG_HALTPOLL_CPUIDLE=y -# end of CPU Idle - -CONFIG_INTEL_IDLE=y -# end of Power management and ACPI options - -# -# Bus options (PCI etc.) -# -CONFIG_PCI_DIRECT=y -CONFIG_PCI_MMCONFIG=y -CONFIG_PCI_XEN=y -CONFIG_MMCONF_FAM10H=y -# CONFIG_PCI_CNB20LE_QUIRK is not set -# CONFIG_ISA_BUS is not set -CONFIG_ISA_DMA_API=y -CONFIG_AMD_NB=y -# CONFIG_X86_SYSFB is not set -# end of Bus options (PCI etc.) - -# -# Binary Emulations -# -CONFIG_IA32_EMULATION=y -# CONFIG_X86_X32 is not set -CONFIG_COMPAT_32=y -CONFIG_COMPAT=y -CONFIG_COMPAT_FOR_U64_ALIGNMENT=y -CONFIG_SYSVIPC_COMPAT=y -# end of Binary Emulations - -# -# Firmware Drivers -# -# CONFIG_EDD is not set -CONFIG_FIRMWARE_MEMMAP=y -CONFIG_DMIID=y -CONFIG_DMI_SYSFS=y -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_FW_CFG_SYSFS is not set -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# EFI (Extensible Firmware Interface) Support -# -CONFIG_EFI_VARS=y -CONFIG_EFI_ESRT=y -CONFIG_EFI_VARS_PSTORE=y -# CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_APPLE_PROPERTIES is not set -CONFIG_RESET_ATTACK_MITIGATION=y -# CONFIG_EFI_RCI2_TABLE is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_UEFI_CPER=y -CONFIG_UEFI_CPER_X86=y -CONFIG_EFI_EARLYCON=y -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - -CONFIG_HAVE_KVM=y -CONFIG_HAVE_KVM_IRQCHIP=y -CONFIG_HAVE_KVM_IRQFD=y -CONFIG_HAVE_KVM_IRQ_ROUTING=y -CONFIG_HAVE_KVM_EVENTFD=y -CONFIG_KVM_MMIO=y -CONFIG_KVM_ASYNC_PF=y -CONFIG_HAVE_KVM_MSI=y -CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y -CONFIG_KVM_VFIO=y -CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y -CONFIG_KVM_COMPAT=y -CONFIG_HAVE_KVM_IRQ_BYPASS=y -CONFIG_HAVE_KVM_NO_POLL=y -CONFIG_KVM_XFER_TO_GUEST_WORK=y -CONFIG_VIRTUALIZATION=y -CONFIG_KVM=m -CONFIG_KVM_WERROR=y -CONFIG_KVM_INTEL=m -CONFIG_KVM_AMD=m -# CONFIG_KVM_MMU_AUDIT is not set -CONFIG_AS_AVX512=y -CONFIG_AS_SHA1_NI=y -CONFIG_AS_SHA256_NI=y -CONFIG_AS_TPAUSE=y - -# -# General architecture-dependent options -# -CONFIG_CRASH_CORE=y -CONFIG_HOTPLUG_SMT=y -CONFIG_GENERIC_ENTRY=y -CONFIG_OPROFILE=y -# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y -CONFIG_KPROBES=y -CONFIG_JUMP_LABEL=y -# CONFIG_STATIC_KEYS_SELFTEST is not set -# CONFIG_STATIC_CALL_SELFTEST is not set -CONFIG_OPTPROBES=y -CONFIG_KPROBES_ON_FTRACE=y -CONFIG_UPROBES=y -CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y -CONFIG_ARCH_USE_BUILTIN_BSWAP=y -CONFIG_KRETPROBES=y -CONFIG_USER_RETURN_NOTIFIER=y -CONFIG_HAVE_IOREMAP_PROT=y -CONFIG_HAVE_KPROBES=y -CONFIG_HAVE_KRETPROBES=y -CONFIG_HAVE_OPTPROBES=y -CONFIG_HAVE_KPROBES_ON_FTRACE=y -CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y -CONFIG_HAVE_NMI=y -CONFIG_HAVE_ARCH_TRACEHOOK=y -CONFIG_HAVE_DMA_CONTIGUOUS=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_ARCH_HAS_FORTIFY_SOURCE=y -CONFIG_ARCH_HAS_SET_MEMORY=y -CONFIG_ARCH_HAS_SET_DIRECT_MAP=y -CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y -CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y -CONFIG_HAVE_ASM_MODVERSIONS=y -CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y -CONFIG_HAVE_RSEQ=y -CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y -CONFIG_HAVE_HW_BREAKPOINT=y -CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y -CONFIG_HAVE_USER_RETURN_NOTIFIER=y -CONFIG_HAVE_PERF_EVENTS_NMI=y -CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y -CONFIG_HAVE_PERF_REGS=y -CONFIG_HAVE_PERF_USER_STACK_DUMP=y -CONFIG_HAVE_ARCH_JUMP_LABEL=y -CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y -CONFIG_MMU_GATHER_TABLE_FREE=y -CONFIG_MMU_GATHER_RCU_TABLE_FREE=y -CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y -CONFIG_HAVE_CMPXCHG_LOCAL=y -CONFIG_HAVE_CMPXCHG_DOUBLE=y -CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y -CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y -CONFIG_HAVE_ARCH_SECCOMP=y -CONFIG_HAVE_ARCH_SECCOMP_FILTER=y -CONFIG_SECCOMP=y -CONFIG_SECCOMP_FILTER=y -# CONFIG_SECCOMP_CACHE_DEBUG is not set -CONFIG_HAVE_ARCH_STACKLEAK=y -CONFIG_HAVE_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR_STRONG=y -CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y -CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK=y -CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y -CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y -CONFIG_HAVE_MOVE_PUD=y -CONFIG_HAVE_MOVE_PMD=y -CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y -CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y -CONFIG_HAVE_ARCH_HUGE_VMAP=y -CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y -CONFIG_HAVE_ARCH_SOFT_DIRTY=y -CONFIG_HAVE_MOD_ARCH_SPECIFIC=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_ARCH_HAS_ELF_RANDOMIZE=y -CONFIG_HAVE_ARCH_MMAP_RND_BITS=y -CONFIG_HAVE_EXIT_THREAD=y -CONFIG_ARCH_MMAP_RND_BITS=28 -CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y -CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8 -CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES=y -CONFIG_HAVE_STACK_VALIDATION=y -CONFIG_HAVE_RELIABLE_STACKTRACE=y -CONFIG_OLD_SIGSUSPEND3=y -CONFIG_COMPAT_OLD_SIGACTION=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_HAVE_ARCH_VMAP_STACK=y -CONFIG_VMAP_STACK=y -CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y -CONFIG_STRICT_KERNEL_RWX=y -CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y -CONFIG_STRICT_MODULE_RWX=y -CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y -CONFIG_ARCH_USE_MEMREMAP_PROT=y -# CONFIG_LOCK_EVENT_COUNTS is not set -CONFIG_ARCH_HAS_MEM_ENCRYPT=y -CONFIG_HAVE_STATIC_CALL=y -CONFIG_HAVE_STATIC_CALL_INLINE=y -CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y - -# -# GCOV-based kernel profiling -# -# CONFIG_GCOV_KERNEL is not set -CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y -# end of GCOV-based kernel profiling - -CONFIG_HAVE_GCC_PLUGINS=y -CONFIG_GCC_PLUGINS=y -# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set -# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set -CONFIG_GCC_PLUGIN_RANDSTRUCT=y -CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE=y -# end of General architecture-dependent options - -CONFIG_RT_MUTEXES=y -CONFIG_BASE_SMALL=0 -CONFIG_MODULES=y -# CONFIG_MODULE_FORCE_LOAD is not set -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODULE_FORCE_UNLOAD is not set -CONFIG_MODVERSIONS=y -CONFIG_ASM_MODVERSIONS=y -# CONFIG_MODULE_SRCVERSION_ALL is not set -# CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set -# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_TRIM_UNUSED_KSYMS is not set -CONFIG_MODULES_TREE_LOOKUP=y -CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_CGROUP_RWSTAT=y -CONFIG_BLK_DEV_BSG=y -CONFIG_BLK_DEV_BSGLIB=y -CONFIG_BLK_DEV_INTEGRITY=y -CONFIG_BLK_DEV_INTEGRITY_T10=y -# CONFIG_BLK_DEV_ZONED is not set -CONFIG_BLK_DEV_THROTTLING=y -# CONFIG_BLK_DEV_THROTTLING_LOW is not set -CONFIG_BLK_CMDLINE_PARSER=y -# CONFIG_BLK_WBT is not set -CONFIG_BLK_CGROUP_IOLATENCY=y -# CONFIG_BLK_CGROUP_IOCOST is not set -CONFIG_BLK_DEBUG_FS=y -# CONFIG_BLK_SED_OPAL is not set -# CONFIG_BLK_INLINE_ENCRYPTION is not set - -# -# Partition Types -# -CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -# CONFIG_AIX_PARTITION is not set -# CONFIG_OSF_PARTITION is not set -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_ATARI_PARTITION is not set -# CONFIG_MAC_PARTITION is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_MINIX_SUBPARTITION is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_UNIXWARE_DISKLABEL is not set -CONFIG_LDM_PARTITION=y -# CONFIG_LDM_DEBUG is not set -# CONFIG_SGI_PARTITION is not set -# CONFIG_ULTRIX_PARTITION is not set -# CONFIG_SUN_PARTITION is not set -# CONFIG_KARMA_PARTITION is not set -CONFIG_EFI_PARTITION=y -# CONFIG_SYSV68_PARTITION is not set -CONFIG_CMDLINE_PARTITION=y -# end of Partition Types - -CONFIG_BLOCK_COMPAT=y -CONFIG_BLK_MQ_PCI=y -CONFIG_BLK_MQ_VIRTIO=y -CONFIG_BLK_PM=y - -# -# IO Schedulers -# -CONFIG_MQ_IOSCHED_DEADLINE=y -CONFIG_MQ_IOSCHED_KYBER=y -CONFIG_IOSCHED_BFQ=y -CONFIG_BFQ_GROUP_IOSCHED=y -# CONFIG_BFQ_CGROUP_DEBUG is not set -# end of IO Schedulers - -CONFIG_PREEMPT_NOTIFIERS=y -CONFIG_ASN1=y -CONFIG_INLINE_SPIN_UNLOCK_IRQ=y -CONFIG_INLINE_READ_UNLOCK=y -CONFIG_INLINE_READ_UNLOCK_IRQ=y -CONFIG_INLINE_WRITE_UNLOCK=y -CONFIG_INLINE_WRITE_UNLOCK_IRQ=y -CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_ARCH_USE_QUEUED_RWLOCKS=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y -CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y -CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y -CONFIG_FREEZER=y - -# -# Executable file formats -# -CONFIG_BINFMT_ELF=y -CONFIG_COMPAT_BINFMT_ELF=y -CONFIG_ELFCORE=y -# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set -CONFIG_BINFMT_SCRIPT=y -CONFIG_BINFMT_MISC=y -CONFIG_COREDUMP=y -# end of Executable file formats - -# -# Memory Management options -# -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_HAVE_FAST_GUP=y -CONFIG_MEMORY_ISOLATION=y -CONFIG_HAVE_BOOTMEM_INFO_NODE=y -CONFIG_MEMORY_HOTPLUG=y -CONFIG_MEMORY_HOTPLUG_SPARSE=y -# CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE is not set -CONFIG_MEMORY_HOTREMOVE=y -CONFIG_SPLIT_PTLOCK_CPUS=4 -CONFIG_MEMORY_BALLOON=y -CONFIG_BALLOON_COMPACTION=y -CONFIG_COMPACTION=y -CONFIG_PAGE_REPORTING=y -CONFIG_MIGRATION=y -CONFIG_CONTIG_ALLOC=y -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_BOUNCE=y -CONFIG_VIRT_TO_BUS=y -CONFIG_MMU_NOTIFIER=y -CONFIG_KSM=y -CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 -CONFIG_TRANSPARENT_HUGEPAGE=y -CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y -# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set -CONFIG_ARCH_WANTS_THP_SWAP=y -CONFIG_THP_SWAP=y -# CONFIG_CLEANCACHE is not set -# CONFIG_FRONTSWAP is not set -# CONFIG_CMA is not set -# CONFIG_MEM_SOFT_DIRTY is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set -CONFIG_GENERIC_EARLY_IOREMAP=y -# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set -# CONFIG_IDLE_PAGE_TRACKING is not set -CONFIG_ARCH_HAS_PTE_DEVMAP=y -CONFIG_ZONE_DEVICE=y -CONFIG_DEV_PAGEMAP_OPS=y -# CONFIG_DEVICE_PRIVATE is not set -CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y -CONFIG_ARCH_HAS_PKEYS=y -# CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_TEST is not set -# CONFIG_READ_ONLY_THP_FOR_FS is not set -CONFIG_ARCH_HAS_PTE_SPECIAL=y -# end of Memory Management options - -CONFIG_NET=y -CONFIG_NET_INGRESS=y -CONFIG_NET_EGRESS=y -CONFIG_SKB_EXTENSIONS=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_DIAG=y -CONFIG_UNIX=y -CONFIG_UNIX_SCM=y -CONFIG_UNIX_DIAG=y -# CONFIG_TLS is not set -CONFIG_XFRM=y -CONFIG_XFRM_ALGO=m -CONFIG_XFRM_USER=m -# CONFIG_XFRM_USER_COMPAT is not set -# CONFIG_XFRM_INTERFACE is not set -CONFIG_XFRM_SUB_POLICY=y -CONFIG_XFRM_MIGRATE=y -CONFIG_XFRM_STATISTICS=y -CONFIG_XFRM_AH=m -CONFIG_XFRM_ESP=m -CONFIG_XFRM_IPCOMP=m -CONFIG_NET_KEY=m -CONFIG_NET_KEY_MIGRATE=y -CONFIG_XDP_SOCKETS=y -# CONFIG_XDP_SOCKETS_DIAG is not set -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_FIB_TRIE_STATS=y -CONFIG_IP_MULTIPLE_TABLES=y -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_VERBOSE=y -CONFIG_IP_ROUTE_CLASSID=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_DHCP=y -# CONFIG_IP_PNP_BOOTP is not set -# CONFIG_IP_PNP_RARP is not set -CONFIG_NET_IPIP=y -CONFIG_NET_IPGRE_DEMUX=y -CONFIG_NET_IP_TUNNEL=y -CONFIG_NET_IPGRE=m -CONFIG_NET_IPGRE_BROADCAST=y -CONFIG_IP_MROUTE_COMMON=y -CONFIG_IP_MROUTE=y -CONFIG_IP_MROUTE_MULTIPLE_TABLES=y -CONFIG_IP_PIMSM_V1=y -CONFIG_IP_PIMSM_V2=y -CONFIG_SYN_COOKIES=y -CONFIG_NET_IPVTI=m -CONFIG_NET_UDP_TUNNEL=y -CONFIG_NET_FOU=y -CONFIG_NET_FOU_IP_TUNNELS=y -CONFIG_INET_AH=m -CONFIG_INET_ESP=m -# CONFIG_INET_ESP_OFFLOAD is not set -# CONFIG_INET_ESPINTCP is not set -CONFIG_INET_IPCOMP=m -CONFIG_INET_XFRM_TUNNEL=m -CONFIG_INET_TUNNEL=y -CONFIG_INET_DIAG=y -CONFIG_INET_TCP_DIAG=y -CONFIG_INET_UDP_DIAG=y -# CONFIG_INET_RAW_DIAG is not set -# CONFIG_INET_DIAG_DESTROY is not set -# CONFIG_TCP_CONG_ADVANCED is not set -CONFIG_TCP_CONG_CUBIC=y -CONFIG_DEFAULT_TCP_CONG="cubic" -CONFIG_TCP_MD5SIG=y -CONFIG_IPV6=y -CONFIG_IPV6_ROUTER_PREF=y -# CONFIG_IPV6_ROUTE_INFO is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -CONFIG_INET6_AH=m -CONFIG_INET6_ESP=m -# CONFIG_INET6_ESP_OFFLOAD is not set -# CONFIG_INET6_ESPINTCP is not set -CONFIG_INET6_IPCOMP=m -CONFIG_IPV6_MIP6=m -CONFIG_IPV6_ILA=m -CONFIG_INET6_XFRM_TUNNEL=m -CONFIG_INET6_TUNNEL=y -CONFIG_IPV6_VTI=m -CONFIG_IPV6_SIT=m -CONFIG_IPV6_SIT_6RD=y -CONFIG_IPV6_NDISC_NODETYPE=y -CONFIG_IPV6_TUNNEL=y -CONFIG_IPV6_GRE=m -CONFIG_IPV6_FOU=y -CONFIG_IPV6_FOU_TUNNEL=y -CONFIG_IPV6_MULTIPLE_TABLES=y -CONFIG_IPV6_SUBTREES=y -# CONFIG_IPV6_MROUTE is not set -# CONFIG_IPV6_SEG6_LWTUNNEL is not set -# CONFIG_IPV6_SEG6_HMAC is not set -# CONFIG_IPV6_RPL_LWTUNNEL is not set -CONFIG_NETLABEL=y -# CONFIG_MPTCP is not set -CONFIG_NETWORK_SECMARK=y -CONFIG_NET_PTP_CLASSIFY=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set -CONFIG_NETFILTER=y -CONFIG_NETFILTER_ADVANCED=y -CONFIG_BRIDGE_NETFILTER=y - -# -# Core Netfilter Configuration -# -CONFIG_NETFILTER_INGRESS=y -CONFIG_NETFILTER_NETLINK=y -CONFIG_NETFILTER_FAMILY_BRIDGE=y -CONFIG_NETFILTER_FAMILY_ARP=y -CONFIG_NETFILTER_NETLINK_ACCT=y -CONFIG_NETFILTER_NETLINK_QUEUE=y -CONFIG_NETFILTER_NETLINK_LOG=y -CONFIG_NETFILTER_NETLINK_OSF=y -CONFIG_NF_CONNTRACK=y -CONFIG_NF_LOG_COMMON=y -# CONFIG_NF_LOG_NETDEV is not set -CONFIG_NETFILTER_CONNCOUNT=y -CONFIG_NF_CONNTRACK_MARK=y -# CONFIG_NF_CONNTRACK_SECMARK is not set -CONFIG_NF_CONNTRACK_ZONES=y -CONFIG_NF_CONNTRACK_PROCFS=y -CONFIG_NF_CONNTRACK_EVENTS=y -CONFIG_NF_CONNTRACK_TIMEOUT=y -CONFIG_NF_CONNTRACK_TIMESTAMP=y -CONFIG_NF_CONNTRACK_LABELS=y -CONFIG_NF_CT_PROTO_DCCP=y -CONFIG_NF_CT_PROTO_GRE=y -CONFIG_NF_CT_PROTO_SCTP=y -CONFIG_NF_CT_PROTO_UDPLITE=y -CONFIG_NF_CONNTRACK_AMANDA=y -CONFIG_NF_CONNTRACK_FTP=y -CONFIG_NF_CONNTRACK_H323=y -CONFIG_NF_CONNTRACK_IRC=y -CONFIG_NF_CONNTRACK_BROADCAST=y -CONFIG_NF_CONNTRACK_NETBIOS_NS=y -CONFIG_NF_CONNTRACK_SNMP=y -CONFIG_NF_CONNTRACK_PPTP=y -CONFIG_NF_CONNTRACK_SANE=y -CONFIG_NF_CONNTRACK_SIP=y -CONFIG_NF_CONNTRACK_TFTP=y -CONFIG_NF_CT_NETLINK=y -CONFIG_NF_CT_NETLINK_TIMEOUT=y -CONFIG_NF_CT_NETLINK_HELPER=y -CONFIG_NETFILTER_NETLINK_GLUE_CT=y -CONFIG_NF_NAT=y -CONFIG_NF_NAT_AMANDA=y -CONFIG_NF_NAT_FTP=y -CONFIG_NF_NAT_IRC=y -CONFIG_NF_NAT_SIP=y -CONFIG_NF_NAT_TFTP=y -CONFIG_NF_NAT_REDIRECT=y -CONFIG_NF_NAT_MASQUERADE=y -CONFIG_NETFILTER_SYNPROXY=y -CONFIG_NF_TABLES=y -CONFIG_NF_TABLES_INET=y -CONFIG_NF_TABLES_NETDEV=y -# CONFIG_NFT_NUMGEN is not set -CONFIG_NFT_CT=y -CONFIG_NFT_COUNTER=y -CONFIG_NFT_CONNLIMIT=y -CONFIG_NFT_LOG=y -CONFIG_NFT_LIMIT=y -CONFIG_NFT_MASQ=y -CONFIG_NFT_REDIR=y -CONFIG_NFT_NAT=y -CONFIG_NFT_TUNNEL=y -# CONFIG_NFT_OBJREF is not set -CONFIG_NFT_QUEUE=y -# CONFIG_NFT_QUOTA is not set -CONFIG_NFT_REJECT=y -CONFIG_NFT_REJECT_INET=y -CONFIG_NFT_COMPAT=y -CONFIG_NFT_HASH=y -# CONFIG_NFT_XFRM is not set -# CONFIG_NFT_SOCKET is not set -CONFIG_NFT_OSF=y -CONFIG_NFT_TPROXY=y -# CONFIG_NFT_SYNPROXY is not set -CONFIG_NF_DUP_NETDEV=y -CONFIG_NFT_DUP_NETDEV=y -CONFIG_NFT_FWD_NETDEV=y -# CONFIG_NFT_REJECT_NETDEV is not set -# CONFIG_NF_FLOW_TABLE is not set -CONFIG_NETFILTER_XTABLES=y - -# -# Xtables combined modules -# -CONFIG_NETFILTER_XT_MARK=y -CONFIG_NETFILTER_XT_CONNMARK=y -CONFIG_NETFILTER_XT_SET=y - -# -# Xtables targets -# -# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set -CONFIG_NETFILTER_XT_TARGET_CHECKSUM=y -CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y -CONFIG_NETFILTER_XT_TARGET_CONNMARK=y -CONFIG_NETFILTER_XT_TARGET_CT=y -CONFIG_NETFILTER_XT_TARGET_DSCP=y -CONFIG_NETFILTER_XT_TARGET_HL=y -CONFIG_NETFILTER_XT_TARGET_HMARK=y -CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y -CONFIG_NETFILTER_XT_TARGET_LOG=y -CONFIG_NETFILTER_XT_TARGET_MARK=y -CONFIG_NETFILTER_XT_NAT=y -CONFIG_NETFILTER_XT_TARGET_NETMAP=y -CONFIG_NETFILTER_XT_TARGET_NFLOG=y -CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y -CONFIG_NETFILTER_XT_TARGET_NOTRACK=y -CONFIG_NETFILTER_XT_TARGET_RATEEST=y -CONFIG_NETFILTER_XT_TARGET_REDIRECT=y -CONFIG_NETFILTER_XT_TARGET_MASQUERADE=y -CONFIG_NETFILTER_XT_TARGET_TEE=y -CONFIG_NETFILTER_XT_TARGET_TPROXY=y -CONFIG_NETFILTER_XT_TARGET_TRACE=y -# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set -CONFIG_NETFILTER_XT_TARGET_TCPMSS=y -CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y - -# -# Xtables matches -# -CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y -CONFIG_NETFILTER_XT_MATCH_BPF=y -CONFIG_NETFILTER_XT_MATCH_CGROUP=y -CONFIG_NETFILTER_XT_MATCH_CLUSTER=y -CONFIG_NETFILTER_XT_MATCH_COMMENT=y -CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y -CONFIG_NETFILTER_XT_MATCH_CONNLABEL=y -CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y -CONFIG_NETFILTER_XT_MATCH_CONNMARK=y -CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y -CONFIG_NETFILTER_XT_MATCH_CPU=y -CONFIG_NETFILTER_XT_MATCH_DCCP=y -CONFIG_NETFILTER_XT_MATCH_DEVGROUP=y -CONFIG_NETFILTER_XT_MATCH_DSCP=y -CONFIG_NETFILTER_XT_MATCH_ECN=y -CONFIG_NETFILTER_XT_MATCH_ESP=y -CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y -CONFIG_NETFILTER_XT_MATCH_HELPER=y -CONFIG_NETFILTER_XT_MATCH_HL=y -CONFIG_NETFILTER_XT_MATCH_IPCOMP=y -CONFIG_NETFILTER_XT_MATCH_IPRANGE=y -CONFIG_NETFILTER_XT_MATCH_IPVS=y -CONFIG_NETFILTER_XT_MATCH_L2TP=y -CONFIG_NETFILTER_XT_MATCH_LENGTH=y -CONFIG_NETFILTER_XT_MATCH_LIMIT=y -CONFIG_NETFILTER_XT_MATCH_MAC=y -CONFIG_NETFILTER_XT_MATCH_MARK=y -CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y -CONFIG_NETFILTER_XT_MATCH_NFACCT=y -CONFIG_NETFILTER_XT_MATCH_OSF=y -CONFIG_NETFILTER_XT_MATCH_OWNER=y -CONFIG_NETFILTER_XT_MATCH_POLICY=y -CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y -CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QUOTA=y -CONFIG_NETFILTER_XT_MATCH_RATEEST=y -CONFIG_NETFILTER_XT_MATCH_REALM=y -CONFIG_NETFILTER_XT_MATCH_RECENT=y -CONFIG_NETFILTER_XT_MATCH_SCTP=y -CONFIG_NETFILTER_XT_MATCH_SOCKET=y -CONFIG_NETFILTER_XT_MATCH_STATE=y -CONFIG_NETFILTER_XT_MATCH_STATISTIC=y -CONFIG_NETFILTER_XT_MATCH_STRING=y -CONFIG_NETFILTER_XT_MATCH_TCPMSS=y -CONFIG_NETFILTER_XT_MATCH_TIME=y -CONFIG_NETFILTER_XT_MATCH_U32=y -# end of Core Netfilter Configuration - -CONFIG_IP_SET=y -CONFIG_IP_SET_MAX=256 -CONFIG_IP_SET_BITMAP_IP=y -CONFIG_IP_SET_BITMAP_IPMAC=y -CONFIG_IP_SET_BITMAP_PORT=y -CONFIG_IP_SET_HASH_IP=y -# CONFIG_IP_SET_HASH_IPMARK is not set -CONFIG_IP_SET_HASH_IPPORT=y -CONFIG_IP_SET_HASH_IPPORTIP=y -CONFIG_IP_SET_HASH_IPPORTNET=y -# CONFIG_IP_SET_HASH_IPMAC is not set -# CONFIG_IP_SET_HASH_MAC is not set -# CONFIG_IP_SET_HASH_NETPORTNET is not set -CONFIG_IP_SET_HASH_NET=y -# CONFIG_IP_SET_HASH_NETNET is not set -CONFIG_IP_SET_HASH_NETPORT=y -CONFIG_IP_SET_HASH_NETIFACE=y -CONFIG_IP_SET_LIST_SET=y -CONFIG_IP_VS=y -CONFIG_IP_VS_IPV6=y -CONFIG_IP_VS_DEBUG=y -CONFIG_IP_VS_TAB_BITS=12 - -# -# IPVS transport protocol load balancing support -# -CONFIG_IP_VS_PROTO_TCP=y -CONFIG_IP_VS_PROTO_UDP=y -CONFIG_IP_VS_PROTO_AH_ESP=y -CONFIG_IP_VS_PROTO_ESP=y -CONFIG_IP_VS_PROTO_AH=y -CONFIG_IP_VS_PROTO_SCTP=y - -# -# IPVS scheduler -# -CONFIG_IP_VS_RR=y -CONFIG_IP_VS_WRR=y -CONFIG_IP_VS_LC=y -CONFIG_IP_VS_WLC=y -CONFIG_IP_VS_FO=y -CONFIG_IP_VS_OVF=y -CONFIG_IP_VS_LBLC=y -CONFIG_IP_VS_LBLCR=y -CONFIG_IP_VS_DH=y -CONFIG_IP_VS_SH=y -CONFIG_IP_VS_MH=y -CONFIG_IP_VS_SED=y -CONFIG_IP_VS_NQ=y - -# -# IPVS SH scheduler -# -CONFIG_IP_VS_SH_TAB_BITS=8 - -# -# IPVS MH scheduler -# -CONFIG_IP_VS_MH_TAB_INDEX=12 - -# -# IPVS application helper -# -CONFIG_IP_VS_FTP=y -CONFIG_IP_VS_NFCT=y -# CONFIG_IP_VS_PE_SIP is not set - -# -# IP: Netfilter Configuration -# -CONFIG_NF_DEFRAG_IPV4=y -CONFIG_NF_SOCKET_IPV4=y -CONFIG_NF_TPROXY_IPV4=y -CONFIG_NF_TABLES_IPV4=y -CONFIG_NFT_REJECT_IPV4=y -CONFIG_NFT_DUP_IPV4=y -# CONFIG_NFT_FIB_IPV4 is not set -CONFIG_NF_TABLES_ARP=y -CONFIG_NF_DUP_IPV4=y -CONFIG_NF_LOG_ARP=y -CONFIG_NF_LOG_IPV4=y -CONFIG_NF_REJECT_IPV4=y -CONFIG_NF_NAT_SNMP_BASIC=y -CONFIG_NF_NAT_PPTP=y -CONFIG_NF_NAT_H323=y -CONFIG_IP_NF_IPTABLES=y -CONFIG_IP_NF_MATCH_AH=y -CONFIG_IP_NF_MATCH_ECN=y -CONFIG_IP_NF_MATCH_RPFILTER=y -CONFIG_IP_NF_MATCH_TTL=y -CONFIG_IP_NF_FILTER=y -CONFIG_IP_NF_TARGET_REJECT=y -CONFIG_IP_NF_TARGET_SYNPROXY=y -CONFIG_IP_NF_NAT=y -CONFIG_IP_NF_TARGET_MASQUERADE=y -CONFIG_IP_NF_TARGET_NETMAP=y -CONFIG_IP_NF_TARGET_REDIRECT=y -CONFIG_IP_NF_MANGLE=y -CONFIG_IP_NF_TARGET_CLUSTERIP=y -CONFIG_IP_NF_TARGET_ECN=y -CONFIG_IP_NF_TARGET_TTL=y -CONFIG_IP_NF_RAW=y -CONFIG_IP_NF_SECURITY=y -CONFIG_IP_NF_ARPTABLES=y -CONFIG_IP_NF_ARPFILTER=y -CONFIG_IP_NF_ARP_MANGLE=y -# end of IP: Netfilter Configuration - -# -# IPv6: Netfilter Configuration -# -CONFIG_NF_SOCKET_IPV6=y -CONFIG_NF_TPROXY_IPV6=y -CONFIG_NF_TABLES_IPV6=y -CONFIG_NFT_REJECT_IPV6=y -CONFIG_NFT_DUP_IPV6=y -# CONFIG_NFT_FIB_IPV6 is not set -CONFIG_NF_DUP_IPV6=y -CONFIG_NF_REJECT_IPV6=y -CONFIG_NF_LOG_IPV6=y -CONFIG_IP6_NF_IPTABLES=y -CONFIG_IP6_NF_MATCH_AH=y -CONFIG_IP6_NF_MATCH_EUI64=y -CONFIG_IP6_NF_MATCH_FRAG=y -CONFIG_IP6_NF_MATCH_OPTS=y -CONFIG_IP6_NF_MATCH_HL=y -CONFIG_IP6_NF_MATCH_IPV6HEADER=y -CONFIG_IP6_NF_MATCH_MH=y -CONFIG_IP6_NF_MATCH_RPFILTER=y -CONFIG_IP6_NF_MATCH_RT=y -# CONFIG_IP6_NF_MATCH_SRH is not set -CONFIG_IP6_NF_TARGET_HL=y -CONFIG_IP6_NF_FILTER=y -CONFIG_IP6_NF_TARGET_REJECT=y -CONFIG_IP6_NF_TARGET_SYNPROXY=y -CONFIG_IP6_NF_MANGLE=y -CONFIG_IP6_NF_RAW=y -CONFIG_IP6_NF_SECURITY=y -CONFIG_IP6_NF_NAT=y -CONFIG_IP6_NF_TARGET_MASQUERADE=y -CONFIG_IP6_NF_TARGET_NPT=y -# end of IPv6: Netfilter Configuration - -CONFIG_NF_DEFRAG_IPV6=y -CONFIG_NF_TABLES_BRIDGE=y -# CONFIG_NFT_BRIDGE_META is not set -CONFIG_NFT_BRIDGE_REJECT=y -CONFIG_NF_LOG_BRIDGE=y -# CONFIG_NF_CONNTRACK_BRIDGE is not set -CONFIG_BRIDGE_NF_EBTABLES=y -CONFIG_BRIDGE_EBT_BROUTE=y -CONFIG_BRIDGE_EBT_T_FILTER=y -CONFIG_BRIDGE_EBT_T_NAT=y -CONFIG_BRIDGE_EBT_802_3=y -CONFIG_BRIDGE_EBT_AMONG=y -CONFIG_BRIDGE_EBT_ARP=y -CONFIG_BRIDGE_EBT_IP=y -CONFIG_BRIDGE_EBT_IP6=y -CONFIG_BRIDGE_EBT_LIMIT=y -CONFIG_BRIDGE_EBT_MARK=y -CONFIG_BRIDGE_EBT_PKTTYPE=y -CONFIG_BRIDGE_EBT_STP=y -CONFIG_BRIDGE_EBT_VLAN=y -CONFIG_BRIDGE_EBT_ARPREPLY=y -CONFIG_BRIDGE_EBT_DNAT=y -CONFIG_BRIDGE_EBT_MARK_T=y -CONFIG_BRIDGE_EBT_REDIRECT=y -CONFIG_BRIDGE_EBT_SNAT=y -CONFIG_BRIDGE_EBT_LOG=y -CONFIG_BRIDGE_EBT_NFLOG=y -# CONFIG_BPFILTER is not set -# CONFIG_IP_DCCP is not set -CONFIG_IP_SCTP=m -# CONFIG_SCTP_DBG_OBJCNT is not set -CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y -# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set -# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set -CONFIG_SCTP_COOKIE_HMAC_MD5=y -# CONFIG_SCTP_COOKIE_HMAC_SHA1 is not set -CONFIG_INET_SCTP_DIAG=m -# CONFIG_RDS is not set -# CONFIG_TIPC is not set -# CONFIG_ATM is not set -CONFIG_L2TP=m -# CONFIG_L2TP_DEBUGFS is not set -# CONFIG_L2TP_V3 is not set -CONFIG_STP=y -CONFIG_BRIDGE=y -CONFIG_BRIDGE_IGMP_SNOOPING=y -CONFIG_BRIDGE_VLAN_FILTERING=y -# CONFIG_BRIDGE_MRP is not set -# CONFIG_BRIDGE_CFM is not set -CONFIG_HAVE_NET_DSA=y -# CONFIG_NET_DSA is not set -CONFIG_VLAN_8021Q=y -# CONFIG_VLAN_8021Q_GVRP is not set -# CONFIG_VLAN_8021Q_MVRP is not set -# CONFIG_DECNET is not set -CONFIG_LLC=y -# CONFIG_LLC2 is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_PHONET is not set -# CONFIG_6LOWPAN is not set -# CONFIG_IEEE802154 is not set -CONFIG_NET_SCHED=y - -# -# Queueing/Scheduling -# -CONFIG_NET_SCH_CBQ=m -CONFIG_NET_SCH_HTB=m -CONFIG_NET_SCH_HFSC=m -CONFIG_NET_SCH_PRIO=m -CONFIG_NET_SCH_MULTIQ=m -CONFIG_NET_SCH_RED=m -CONFIG_NET_SCH_SFB=m -CONFIG_NET_SCH_SFQ=m -CONFIG_NET_SCH_TEQL=m -CONFIG_NET_SCH_TBF=m -# CONFIG_NET_SCH_CBS is not set -# CONFIG_NET_SCH_ETF is not set -# CONFIG_NET_SCH_TAPRIO is not set -CONFIG_NET_SCH_GRED=m -CONFIG_NET_SCH_DSMARK=m -CONFIG_NET_SCH_NETEM=m -CONFIG_NET_SCH_DRR=m -CONFIG_NET_SCH_MQPRIO=m -# CONFIG_NET_SCH_SKBPRIO is not set -CONFIG_NET_SCH_CHOKE=m -CONFIG_NET_SCH_QFQ=m -# CONFIG_NET_SCH_CODEL is not set -# CONFIG_NET_SCH_FQ_CODEL is not set -# CONFIG_NET_SCH_CAKE is not set -# CONFIG_NET_SCH_FQ is not set -# CONFIG_NET_SCH_HHF is not set -# CONFIG_NET_SCH_PIE is not set -CONFIG_NET_SCH_INGRESS=m -# CONFIG_NET_SCH_PLUG is not set -# CONFIG_NET_SCH_ETS is not set -# CONFIG_NET_SCH_DEFAULT is not set - -# -# Classification -# -CONFIG_NET_CLS=y -CONFIG_NET_CLS_BASIC=y -CONFIG_NET_CLS_TCINDEX=y -CONFIG_NET_CLS_ROUTE4=y -CONFIG_NET_CLS_FW=y -CONFIG_NET_CLS_U32=y -CONFIG_CLS_U32_PERF=y -CONFIG_CLS_U32_MARK=y -CONFIG_NET_CLS_RSVP=y -CONFIG_NET_CLS_RSVP6=y -CONFIG_NET_CLS_FLOW=y -CONFIG_NET_CLS_CGROUP=y -CONFIG_NET_CLS_BPF=y -# CONFIG_NET_CLS_FLOWER is not set -CONFIG_NET_CLS_MATCHALL=y -CONFIG_NET_EMATCH=y -CONFIG_NET_EMATCH_STACK=32 -CONFIG_NET_EMATCH_CMP=y -CONFIG_NET_EMATCH_NBYTE=y -CONFIG_NET_EMATCH_U32=y -CONFIG_NET_EMATCH_META=y -CONFIG_NET_EMATCH_TEXT=y -CONFIG_NET_EMATCH_IPSET=y -# CONFIG_NET_EMATCH_IPT is not set -CONFIG_NET_CLS_ACT=y -CONFIG_NET_ACT_POLICE=y -CONFIG_NET_ACT_GACT=y -CONFIG_GACT_PROB=y -CONFIG_NET_ACT_MIRRED=y -# CONFIG_NET_ACT_SAMPLE is not set -CONFIG_NET_ACT_IPT=y -CONFIG_NET_ACT_NAT=y -CONFIG_NET_ACT_PEDIT=y -CONFIG_NET_ACT_SIMP=y -CONFIG_NET_ACT_SKBEDIT=y -CONFIG_NET_ACT_CSUM=y -# CONFIG_NET_ACT_MPLS is not set -# CONFIG_NET_ACT_VLAN is not set -CONFIG_NET_ACT_BPF=y -# CONFIG_NET_ACT_CONNMARK is not set -# CONFIG_NET_ACT_CTINFO is not set -# CONFIG_NET_ACT_SKBMOD is not set -# CONFIG_NET_ACT_IFE is not set -# CONFIG_NET_ACT_TUNNEL_KEY is not set -# CONFIG_NET_ACT_GATE is not set -# CONFIG_NET_TC_SKB_EXT is not set -CONFIG_NET_SCH_FIFO=y -# CONFIG_DCB is not set -CONFIG_DNS_RESOLVER=y -# CONFIG_BATMAN_ADV is not set -CONFIG_OPENVSWITCH=m -CONFIG_OPENVSWITCH_GRE=m -CONFIG_OPENVSWITCH_VXLAN=m -CONFIG_OPENVSWITCH_GENEVE=m -CONFIG_VSOCKETS=m -CONFIG_VSOCKETS_DIAG=m -CONFIG_VSOCKETS_LOOPBACK=m -CONFIG_VIRTIO_VSOCKETS=m -CONFIG_VIRTIO_VSOCKETS_COMMON=m -CONFIG_HYPERV_VSOCKETS=m -CONFIG_NETLINK_DIAG=y -CONFIG_MPLS=y -CONFIG_NET_MPLS_GSO=m -CONFIG_MPLS_ROUTING=m -CONFIG_MPLS_IPTUNNEL=m -CONFIG_NET_NSH=m -# CONFIG_HSR is not set -CONFIG_NET_SWITCHDEV=y -CONFIG_NET_L3_MASTER_DEV=y -# CONFIG_QRTR is not set -# CONFIG_NET_NCSI is not set -CONFIG_RPS=y -CONFIG_RFS_ACCEL=y -CONFIG_XPS=y -CONFIG_CGROUP_NET_PRIO=y -CONFIG_CGROUP_NET_CLASSID=y -CONFIG_NET_RX_BUSY_POLL=y -CONFIG_BQL=y -CONFIG_BPF_JIT=y -# CONFIG_BPF_STREAM_PARSER is not set -CONFIG_NET_FLOW_LIMIT=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_DROP_MONITOR is not set -# end of Network testing -# end of Networking options - -# CONFIG_HAMRADIO is not set -# CONFIG_CAN is not set -# CONFIG_BT is not set -# CONFIG_AF_RXRPC is not set -# CONFIG_AF_KCM is not set -CONFIG_FIB_RULES=y -CONFIG_WIRELESS=y -# CONFIG_CFG80211 is not set - -# -# CFG80211 needs to be enabled for MAC80211 -# -CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 -# CONFIG_RFKILL is not set -CONFIG_NET_9P=y -CONFIG_NET_9P_VIRTIO=y -# CONFIG_NET_9P_XEN is not set -# CONFIG_NET_9P_DEBUG is not set -# CONFIG_CAIF is not set -CONFIG_CEPH_LIB=m -# CONFIG_CEPH_LIB_PRETTYDEBUG is not set -# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set -# CONFIG_NFC is not set -# CONFIG_PSAMPLE is not set -# CONFIG_NET_IFE is not set -CONFIG_LWTUNNEL=y -CONFIG_LWTUNNEL_BPF=y -CONFIG_DST_CACHE=y -CONFIG_GRO_CELLS=y -CONFIG_NET_DEVLINK=y -CONFIG_PAGE_POOL=y -CONFIG_FAILOVER=y -CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y - -# -# Device Drivers -# -CONFIG_HAVE_EISA=y -# CONFIG_EISA is not set -CONFIG_HAVE_PCI=y -CONFIG_PCI=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCIEPORTBUS=y -CONFIG_HOTPLUG_PCI_PCIE=y -# CONFIG_PCIEAER is not set -CONFIG_PCIEASPM=y -CONFIG_PCIEASPM_DEFAULT=y -# CONFIG_PCIEASPM_POWERSAVE is not set -# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set -# CONFIG_PCIEASPM_PERFORMANCE is not set -CONFIG_PCIE_PME=y -# CONFIG_PCIE_PTM is not set -# CONFIG_PCIE_BW is not set -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCI_QUIRKS=y -# CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set -CONFIG_PCI_STUB=y -# CONFIG_PCI_PF_STUB is not set -CONFIG_XEN_PCIDEV_FRONTEND=y -CONFIG_PCI_ATS=y -CONFIG_PCI_LOCKLESS_CONFIG=y -CONFIG_PCI_IOV=y -CONFIG_PCI_PRI=y -CONFIG_PCI_PASID=y -# CONFIG_PCI_P2PDMA is not set -CONFIG_PCI_LABEL=y -# CONFIG_PCI_HYPERV is not set -# CONFIG_PCIE_BUS_TUNE_OFF is not set -CONFIG_PCIE_BUS_DEFAULT=y -# CONFIG_PCIE_BUS_SAFE is not set -# CONFIG_PCIE_BUS_PERFORMANCE is not set -# CONFIG_PCIE_BUS_PEER2PEER is not set -CONFIG_HOTPLUG_PCI=y -CONFIG_HOTPLUG_PCI_ACPI=y -# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set -# CONFIG_HOTPLUG_PCI_CPCI is not set -CONFIG_HOTPLUG_PCI_SHPC=y - -# -# PCI controller drivers -# -# CONFIG_VMD is not set -CONFIG_PCI_HYPERV_INTERFACE=m - -# -# DesignWare PCI Core Support -# -# CONFIG_PCIE_DW_PLAT_HOST is not set -# CONFIG_PCI_MESON is not set -# end of DesignWare PCI Core Support - -# -# Mobiveil PCIe Core Support -# -# end of Mobiveil PCIe Core Support - -# -# Cadence PCIe controllers support -# -# end of Cadence PCIe controllers support -# end of PCI controller drivers - -# -# PCI Endpoint -# -# CONFIG_PCI_ENDPOINT is not set -# end of PCI Endpoint - -# -# PCI switch controller drivers -# -# CONFIG_PCI_SW_SWITCHTEC is not set -# end of PCI switch controller drivers - -# CONFIG_PCCARD is not set -# CONFIG_RAPIDIO is not set - -# -# Generic Driver Options -# -CONFIG_AUXILIARY_BUS=y -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="" -CONFIG_DEVTMPFS=y -# CONFIG_DEVTMPFS_MOUNT is not set -CONFIG_STANDALONE=y -CONFIG_PREVENT_FIRMWARE_BUILD=y - -# -# Firmware loader -# -CONFIG_FW_LOADER=y -CONFIG_EXTRA_FIRMWARE="" -# CONFIG_FW_LOADER_USER_HELPER is not set -# CONFIG_FW_LOADER_COMPRESS is not set -CONFIG_FW_CACHE=y -# end of Firmware loader - -CONFIG_ALLOW_DEV_COREDUMP=y -# CONFIG_DEBUG_DRIVER is not set -# CONFIG_DEBUG_DEVRES is not set -# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set -# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set -CONFIG_SYS_HYPERVISOR=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -# end of Generic Driver Options - -# -# Bus devices -# -# CONFIG_MHI_BUS is not set -# end of Bus devices - -CONFIG_CONNECTOR=y -CONFIG_PROC_EVENTS=y -# CONFIG_GNSS is not set -# CONFIG_MTD is not set -# CONFIG_OF is not set -CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y -# CONFIG_PARPORT is not set -CONFIG_PNP=y -# CONFIG_PNP_DEBUG_MESSAGES is not set - -# -# Protocols -# -CONFIG_PNPACPI=y -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_NULL_BLK is not set -# CONFIG_BLK_DEV_FD is not set -CONFIG_CDROM=y -# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -CONFIG_BLK_DEV_CRYPTOLOOP=y -CONFIG_BLK_DEV_DRBD=m -# CONFIG_DRBD_FAULT_INJECTION is not set -CONFIG_BLK_DEV_NBD=y -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_COUNT=16 -CONFIG_BLK_DEV_RAM_SIZE=65536 -# CONFIG_CDROM_PKTCDVD is not set -CONFIG_ATA_OVER_ETH=m -CONFIG_XEN_BLKDEV_FRONTEND=y -CONFIG_VIRTIO_BLK=y -CONFIG_BLK_DEV_RBD=m -# CONFIG_BLK_DEV_RSXX is not set - -# -# NVME Support -# -CONFIG_NVME_CORE=y -CONFIG_BLK_DEV_NVME=y -# CONFIG_NVME_MULTIPATH is not set -# CONFIG_NVME_HWMON is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TCP is not set -# end of NVME Support - -# -# Misc devices -# -# CONFIG_AD525X_DPOT is not set -# CONFIG_DUMMY_IRQ is not set -# CONFIG_IBM_ASM is not set -# CONFIG_PHANTOM is not set -# CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set -# CONFIG_SRAM is not set -# CONFIG_PCI_ENDPOINT_TEST is not set -# CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set -# CONFIG_C2PORT is not set - -# -# EEPROM support -# -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -# CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set -# end of EEPROM support - -# CONFIG_CB710_CORE is not set - -# -# Texas Instruments shared transport line discipline -# -# end of Texas Instruments shared transport line discipline - -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set -# CONFIG_INTEL_MEI is not set -# CONFIG_INTEL_MEI_ME is not set -# CONFIG_INTEL_MEI_TXE is not set -# CONFIG_VMWARE_VMCI is not set -# CONFIG_GENWQE is not set -# CONFIG_ECHO is not set -# CONFIG_MISC_ALCOR_PCI is not set -# CONFIG_MISC_RTSX_PCI is not set -# CONFIG_MISC_RTSX_USB is not set -# CONFIG_HABANA_AI is not set -# end of Misc devices - -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - -# -# SCSI device support -# -CONFIG_SCSI_MOD=y -CONFIG_RAID_ATTRS=m -CONFIG_SCSI=y -CONFIG_SCSI_DMA=y -# CONFIG_SCSI_PROC_FS is not set - -# -# SCSI support type (disk, tape, CD-ROM) -# -CONFIG_BLK_DEV_SD=y -# CONFIG_CHR_DEV_ST is not set -CONFIG_BLK_DEV_SR=y -CONFIG_CHR_DEV_SG=y -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_LOGGING is not set -# CONFIG_SCSI_SCAN_ASYNC is not set - -# -# SCSI Transports -# -CONFIG_SCSI_SPI_ATTRS=y -# CONFIG_SCSI_FC_ATTRS is not set -CONFIG_SCSI_ISCSI_ATTRS=m -CONFIG_SCSI_SAS_ATTRS=m -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -# end of SCSI Transports - -CONFIG_SCSI_LOWLEVEL=y -CONFIG_ISCSI_TCP=m -# CONFIG_ISCSI_BOOT_SYSFS is not set -# CONFIG_SCSI_CXGB3_ISCSI is not set -# CONFIG_SCSI_CXGB4_ISCSI is not set -# CONFIG_SCSI_BNX2_ISCSI is not set -# CONFIG_BE2ISCSI is not set -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -CONFIG_SCSI_HPSA=m -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_3W_SAS is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_AIC94XX is not set -# CONFIG_SCSI_MVSAS is not set -# CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_DPT_I2O is not set -# CONFIG_SCSI_ADVANSYS is not set -# CONFIG_SCSI_ARCMSR is not set -# CONFIG_SCSI_ESAS2R is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_LEGACY is not set -CONFIG_MEGARAID_SAS=m -# CONFIG_SCSI_MPT3SAS is not set -# CONFIG_SCSI_MPT2SAS is not set -CONFIG_SCSI_SMARTPQI=m -# CONFIG_SCSI_UFSHCD is not set -# CONFIG_SCSI_HPTIOP is not set -# CONFIG_SCSI_BUSLOGIC is not set -# CONFIG_SCSI_MYRB is not set -# CONFIG_SCSI_MYRS is not set -CONFIG_VMWARE_PVSCSI=y -CONFIG_XEN_SCSI_FRONTEND=y -CONFIG_HYPERV_STORAGE=y -# CONFIG_SCSI_SNIC is not set -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_ISCI is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_STEX is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -# CONFIG_SCSI_QLA_ISCSI is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_AM53C974 is not set -# CONFIG_SCSI_WD719X is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_PMCRAID is not set -# CONFIG_SCSI_PM8001 is not set -CONFIG_SCSI_VIRTIO=y -# CONFIG_SCSI_DH is not set -# end of SCSI device support - -CONFIG_ATA=y -CONFIG_SATA_HOST=y -CONFIG_PATA_TIMINGS=y -# CONFIG_ATA_VERBOSE_ERROR is not set -CONFIG_ATA_FORCE=y -CONFIG_ATA_ACPI=y -# CONFIG_SATA_ZPODD is not set -# CONFIG_SATA_PMP is not set - -# -# Controllers with non-SFF native interface -# -CONFIG_SATA_AHCI=y -CONFIG_SATA_MOBILE_LPM_POLICY=0 -# CONFIG_SATA_AHCI_PLATFORM is not set -# CONFIG_SATA_INIC162X is not set -# CONFIG_SATA_ACARD_AHCI is not set -# CONFIG_SATA_SIL24 is not set -CONFIG_ATA_SFF=y - -# -# SFF controllers with custom DMA interface -# -# CONFIG_PDC_ADMA is not set -# CONFIG_SATA_QSTOR is not set -# CONFIG_SATA_SX4 is not set -CONFIG_ATA_BMDMA=y - -# -# SATA SFF controllers with BMDMA -# -CONFIG_ATA_PIIX=y -CONFIG_SATA_MV=y -CONFIG_SATA_NV=y -CONFIG_SATA_PROMISE=y -CONFIG_SATA_SIL=y -CONFIG_SATA_SIS=y -CONFIG_SATA_SVW=y -CONFIG_SATA_ULI=y -CONFIG_SATA_VIA=y -CONFIG_SATA_VITESSE=y - -# -# PATA SFF controllers with BMDMA -# -# CONFIG_PATA_ALI is not set -# CONFIG_PATA_AMD is not set -# CONFIG_PATA_ARTOP is not set -# CONFIG_PATA_ATIIXP is not set -# CONFIG_PATA_ATP867X is not set -# CONFIG_PATA_CMD64X is not set -# CONFIG_PATA_CYPRESS is not set -# CONFIG_PATA_EFAR is not set -# CONFIG_PATA_HPT366 is not set -# CONFIG_PATA_HPT37X is not set -# CONFIG_PATA_HPT3X2N is not set -# CONFIG_PATA_HPT3X3 is not set -# CONFIG_PATA_IT8213 is not set -# CONFIG_PATA_IT821X is not set -# CONFIG_PATA_JMICRON is not set -# CONFIG_PATA_MARVELL is not set -# CONFIG_PATA_NETCELL is not set -# CONFIG_PATA_NINJA32 is not set -# CONFIG_PATA_NS87415 is not set -# CONFIG_PATA_OLDPIIX is not set -# CONFIG_PATA_OPTIDMA is not set -# CONFIG_PATA_PDC2027X is not set -# CONFIG_PATA_PDC_OLD is not set -# CONFIG_PATA_RADISYS is not set -# CONFIG_PATA_RDC is not set -# CONFIG_PATA_SCH is not set -# CONFIG_PATA_SERVERWORKS is not set -# CONFIG_PATA_SIL680 is not set -CONFIG_PATA_SIS=y -# CONFIG_PATA_TOSHIBA is not set -# CONFIG_PATA_TRIFLEX is not set -# CONFIG_PATA_VIA is not set -# CONFIG_PATA_WINBOND is not set - -# -# PIO-only SFF controllers -# -# CONFIG_PATA_CMD640_PCI is not set -# CONFIG_PATA_MPIIX is not set -# CONFIG_PATA_NS87410 is not set -# CONFIG_PATA_OPTI is not set -# CONFIG_PATA_PLATFORM is not set -# CONFIG_PATA_RZ1000 is not set - -# -# Generic fallback / legacy drivers -# -# CONFIG_PATA_ACPI is not set -CONFIG_ATA_GENERIC=y -# CONFIG_PATA_LEGACY is not set -CONFIG_MD=y -# CONFIG_BLK_DEV_MD is not set -# CONFIG_BCACHE is not set -CONFIG_BLK_DEV_DM_BUILTIN=y -CONFIG_BLK_DEV_DM=y -# CONFIG_DM_DEBUG is not set -CONFIG_DM_BUFIO=y -# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set -CONFIG_DM_BIO_PRISON=y -CONFIG_DM_PERSISTENT_DATA=y -# CONFIG_DM_UNSTRIPED is not set -CONFIG_DM_CRYPT=y -CONFIG_DM_SNAPSHOT=y -CONFIG_DM_THIN_PROVISIONING=y -# CONFIG_DM_CACHE is not set -# CONFIG_DM_WRITECACHE is not set -# CONFIG_DM_EBS is not set -# CONFIG_DM_ERA is not set -# CONFIG_DM_CLONE is not set -# CONFIG_DM_MIRROR is not set -# CONFIG_DM_RAID is not set -# CONFIG_DM_ZERO is not set -CONFIG_DM_MULTIPATH=m -CONFIG_DM_MULTIPATH_QL=m -CONFIG_DM_MULTIPATH_ST=m -# CONFIG_DM_MULTIPATH_HST is not set -# CONFIG_DM_MULTIPATH_IOA is not set -# CONFIG_DM_DELAY is not set -# CONFIG_DM_DUST is not set -# CONFIG_DM_INIT is not set -# CONFIG_DM_UEVENT is not set -# CONFIG_DM_FLAKEY is not set -# CONFIG_DM_VERITY is not set -# CONFIG_DM_SWITCH is not set -# CONFIG_DM_LOG_WRITES is not set -# CONFIG_DM_INTEGRITY is not set -# CONFIG_TARGET_CORE is not set -CONFIG_FUSION=y -CONFIG_FUSION_SPI=y -# CONFIG_FUSION_SAS is not set -CONFIG_FUSION_MAX_SGE=128 -# CONFIG_FUSION_CTL is not set -# CONFIG_FUSION_LOGGING is not set - -# -# IEEE 1394 (FireWire) support -# -# CONFIG_FIREWIRE is not set -# CONFIG_FIREWIRE_NOSY is not set -# end of IEEE 1394 (FireWire) support - -# CONFIG_MACINTOSH_DRIVERS is not set -CONFIG_NETDEVICES=y -CONFIG_MII=m -CONFIG_NET_CORE=y -CONFIG_BONDING=m -CONFIG_DUMMY=m -CONFIG_WIREGUARD=m -# CONFIG_WIREGUARD_DEBUG is not set -# CONFIG_EQUALIZER is not set -# CONFIG_NET_FC is not set -# CONFIG_IFB is not set -CONFIG_NET_TEAM=m -CONFIG_NET_TEAM_MODE_BROADCAST=m -CONFIG_NET_TEAM_MODE_ROUNDROBIN=m -CONFIG_NET_TEAM_MODE_RANDOM=m -CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m -CONFIG_NET_TEAM_MODE_LOADBALANCE=m -CONFIG_MACVLAN=y -CONFIG_MACVTAP=y -CONFIG_IPVLAN_L3S=y -CONFIG_IPVLAN=y -# CONFIG_IPVTAP is not set -CONFIG_VXLAN=y -CONFIG_GENEVE=m -# CONFIG_BAREUDP is not set -# CONFIG_GTP is not set -# CONFIG_MACSEC is not set -# CONFIG_NETCONSOLE is not set -CONFIG_TUN=y -CONFIG_TAP=y -# CONFIG_TUN_VNET_CROSS_LE is not set -CONFIG_VETH=y -CONFIG_VIRTIO_NET=y -CONFIG_NLMON=y -# CONFIG_NET_VRF is not set -# CONFIG_VSOCKMON is not set -# CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - -CONFIG_ETHERNET=y -CONFIG_MDIO=m -# CONFIG_NET_VENDOR_3COM is not set -# CONFIG_NET_VENDOR_ADAPTEC is not set -# CONFIG_NET_VENDOR_AGERE is not set -# CONFIG_NET_VENDOR_ALACRITECH is not set -# CONFIG_NET_VENDOR_ALTEON is not set -# CONFIG_ALTERA_TSE is not set -CONFIG_NET_VENDOR_AMAZON=y -CONFIG_ENA_ETHERNET=m -# CONFIG_NET_VENDOR_AMD is not set -# CONFIG_NET_VENDOR_AQUANTIA is not set -# CONFIG_NET_VENDOR_ARC is not set -# CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set -CONFIG_NET_VENDOR_BROADCOM=y -# CONFIG_B44 is not set -# CONFIG_BCMGENET is not set -CONFIG_BNX2=m -CONFIG_CNIC=m -CONFIG_TIGON3=m -CONFIG_TIGON3_HWMON=y -CONFIG_BNX2X=m -CONFIG_BNX2X_SRIOV=y -# CONFIG_SYSTEMPORT is not set -CONFIG_BNXT=m -CONFIG_BNXT_SRIOV=y -CONFIG_BNXT_FLOWER_OFFLOAD=y -CONFIG_BNXT_HWMON=y -# CONFIG_NET_VENDOR_BROCADE is not set -# CONFIG_NET_VENDOR_CADENCE is not set -# CONFIG_NET_VENDOR_CAVIUM is not set -# CONFIG_NET_VENDOR_CHELSIO is not set -# CONFIG_NET_VENDOR_CISCO is not set -# CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set -# CONFIG_DNET is not set -# CONFIG_NET_VENDOR_DEC is not set -# CONFIG_NET_VENDOR_DLINK is not set -# CONFIG_NET_VENDOR_EMULEX is not set -# CONFIG_NET_VENDOR_EZCHIP is not set -CONFIG_NET_VENDOR_GOOGLE=y -CONFIG_GVE=m -# CONFIG_NET_VENDOR_HUAWEI is not set -# CONFIG_NET_VENDOR_I825XX is not set -CONFIG_NET_VENDOR_INTEL=y -# CONFIG_E100 is not set -CONFIG_E1000=m -CONFIG_E1000E=m -CONFIG_E1000E_HWTS=y -CONFIG_IGB=m -CONFIG_IGB_HWMON=y -CONFIG_IGBVF=m -CONFIG_IXGB=m -CONFIG_IXGBE=m -CONFIG_IXGBE_HWMON=y -CONFIG_IXGBEVF=m -CONFIG_I40E=m -CONFIG_IAVF=m -CONFIG_I40EVF=m -CONFIG_ICE=m -# CONFIG_FM10K is not set -# CONFIG_IGC is not set -# CONFIG_JME is not set -# CONFIG_NET_VENDOR_MARVELL is not set -CONFIG_NET_VENDOR_MELLANOX=y -CONFIG_MLX4_EN=m -CONFIG_MLX4_CORE=m -CONFIG_MLX4_DEBUG=y -CONFIG_MLX4_CORE_GEN2=y -CONFIG_MLX5_CORE=m -# CONFIG_MLX5_FPGA is not set -CONFIG_MLX5_CORE_EN=y -CONFIG_MLX5_EN_ARFS=y -CONFIG_MLX5_EN_RXNFC=y -CONFIG_MLX5_MPFS=y -CONFIG_MLX5_ESWITCH=y -CONFIG_MLX5_CLS_ACT=y -# CONFIG_MLX5_CORE_IPOIB is not set -CONFIG_MLX5_SW_STEERING=y -# CONFIG_MLXSW_CORE is not set -# CONFIG_MLXFW is not set -# CONFIG_NET_VENDOR_MICREL is not set -# CONFIG_NET_VENDOR_MICROCHIP is not set -CONFIG_NET_VENDOR_MICROSEMI=y -# CONFIG_NET_VENDOR_MYRI is not set -# CONFIG_FEALNX is not set -# CONFIG_NET_VENDOR_NATSEMI is not set -# CONFIG_NET_VENDOR_NETERION is not set -CONFIG_NET_VENDOR_NETRONOME=y -CONFIG_NFP=m -CONFIG_NFP_APP_FLOWER=y -CONFIG_NFP_APP_ABM_NIC=y -# CONFIG_NFP_DEBUG is not set -# CONFIG_NET_VENDOR_NI is not set -# CONFIG_NET_VENDOR_NVIDIA is not set -# CONFIG_NET_VENDOR_OKI is not set -# CONFIG_ETHOC is not set -# CONFIG_NET_VENDOR_PACKET_ENGINES is not set -CONFIG_NET_VENDOR_PENSANDO=y -# CONFIG_IONIC is not set -# CONFIG_NET_VENDOR_QLOGIC is not set -# CONFIG_NET_VENDOR_QUALCOMM is not set -# CONFIG_NET_VENDOR_RDC is not set -CONFIG_NET_VENDOR_REALTEK=y -CONFIG_8139CP=m -# CONFIG_8139TOO is not set -# CONFIG_R8169 is not set -# CONFIG_NET_VENDOR_RENESAS is not set -# CONFIG_NET_VENDOR_ROCKER is not set -# CONFIG_NET_VENDOR_SAMSUNG is not set -# CONFIG_NET_VENDOR_SEEQ is not set -CONFIG_NET_VENDOR_SOLARFLARE=y -# CONFIG_SFC is not set -# CONFIG_SFC_FALCON is not set -# CONFIG_NET_VENDOR_SILAN is not set -# CONFIG_NET_VENDOR_SIS is not set -# CONFIG_NET_VENDOR_SMSC is not set -# CONFIG_NET_VENDOR_SOCIONEXT is not set -# CONFIG_NET_VENDOR_STMICRO is not set -# CONFIG_NET_VENDOR_SUN is not set -# CONFIG_NET_VENDOR_SYNOPSYS is not set -# CONFIG_NET_VENDOR_TEHUTI is not set -# CONFIG_NET_VENDOR_TI is not set -# CONFIG_NET_VENDOR_VIA is not set -# CONFIG_NET_VENDOR_WIZNET is not set -CONFIG_NET_VENDOR_XILINX=y -# CONFIG_XILINX_AXI_EMAC is not set -# CONFIG_XILINX_LL_TEMAC is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -# CONFIG_NET_SB1000 is not set -CONFIG_PHYLIB=y -# CONFIG_FIXED_PHY is not set - -# -# MII PHY device drivers -# -# CONFIG_AMD_PHY is not set -# CONFIG_ADIN_PHY is not set -# CONFIG_AQUANTIA_PHY is not set -# CONFIG_AX88796B_PHY is not set -# CONFIG_BROADCOM_PHY is not set -# CONFIG_BCM54140_PHY is not set -# CONFIG_BCM7XXX_PHY is not set -# CONFIG_BCM84881_PHY is not set -# CONFIG_BCM87XX_PHY is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CORTINA_PHY is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_ICPLUS_PHY is not set -# CONFIG_LXT_PHY is not set -# CONFIG_INTEL_XWAY_PHY is not set -# CONFIG_LSI_ET1011C_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MARVELL_10G_PHY is not set -# CONFIG_MICREL_PHY is not set -# CONFIG_MICROCHIP_PHY is not set -# CONFIG_MICROCHIP_T1_PHY is not set -# CONFIG_MICROSEMI_PHY is not set -# CONFIG_NATIONAL_PHY is not set -# CONFIG_NXP_TJA11XX_PHY is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_REALTEK_PHY is not set -# CONFIG_RENESAS_PHY is not set -# CONFIG_ROCKCHIP_PHY is not set -# CONFIG_SMSC_PHY is not set -# CONFIG_STE10XP is not set -# CONFIG_TERANETICS_PHY is not set -# CONFIG_DP83822_PHY is not set -# CONFIG_DP83TC811_PHY is not set -# CONFIG_DP83848_PHY is not set -# CONFIG_DP83867_PHY is not set -# CONFIG_DP83869_PHY is not set -# CONFIG_VITESSE_PHY is not set -# CONFIG_XILINX_GMII2RGMII is not set -CONFIG_MDIO_DEVICE=y -CONFIG_MDIO_BUS=y -CONFIG_MDIO_DEVRES=y -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MDIO_BCM_UNIMAC is not set -# CONFIG_MDIO_MVUSB is not set -# CONFIG_MDIO_MSCC_MIIM is not set -# CONFIG_MDIO_THUNDER is not set - -# -# MDIO Multiplexers -# - -# -# PCS device drivers -# -# CONFIG_PCS_XPCS is not set -# end of PCS device drivers - -CONFIG_PPP=m -CONFIG_PPP_BSDCOMP=m -CONFIG_PPP_DEFLATE=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_MPPE=m -CONFIG_PPP_MULTILINK=y -CONFIG_PPPOE=m -CONFIG_PPTP=m -CONFIG_PPPOL2TP=m -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -# CONFIG_SLIP is not set -CONFIG_SLHC=m -# CONFIG_USB_NET_DRIVERS is not set -CONFIG_WLAN=y -CONFIG_WLAN_VENDOR_ADMTEK=y -CONFIG_WLAN_VENDOR_ATH=y -# CONFIG_ATH_DEBUG is not set -# CONFIG_ATH5K_PCI is not set -CONFIG_WLAN_VENDOR_ATMEL=y -CONFIG_WLAN_VENDOR_BROADCOM=y -CONFIG_WLAN_VENDOR_CISCO=y -CONFIG_WLAN_VENDOR_INTEL=y -CONFIG_WLAN_VENDOR_INTERSIL=y -# CONFIG_HOSTAP is not set -# CONFIG_PRISM54 is not set -CONFIG_WLAN_VENDOR_MARVELL=y -CONFIG_WLAN_VENDOR_MEDIATEK=y -CONFIG_WLAN_VENDOR_MICROCHIP=y -CONFIG_WLAN_VENDOR_RALINK=y -CONFIG_WLAN_VENDOR_REALTEK=y -CONFIG_WLAN_VENDOR_RSI=y -CONFIG_WLAN_VENDOR_ST=y -CONFIG_WLAN_VENDOR_TI=y -CONFIG_WLAN_VENDOR_ZYDAS=y -CONFIG_WLAN_VENDOR_QUANTENNA=y -# CONFIG_WAN is not set -CONFIG_XEN_NETDEV_FRONTEND=y -CONFIG_VMXNET3=y -# CONFIG_FUJITSU_ES is not set -CONFIG_HYPERV_NET=y -# CONFIG_NETDEVSIM is not set -CONFIG_NET_FAILOVER=y -# CONFIG_ISDN is not set -# CONFIG_NVM is not set - -# -# Input device support -# -CONFIG_INPUT=y -CONFIG_INPUT_FF_MEMLESS=y -CONFIG_INPUT_SPARSEKMAP=y -# CONFIG_INPUT_MATRIXKMAP is not set - -# -# Userland interfaces -# -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_JOYDEV=y -CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_EVBUG is not set - -# -# Input Device Drivers -# -CONFIG_INPUT_KEYBOARD=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set -CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set -# CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_OPENCORES is not set -# CONFIG_KEYBOARD_SAMSUNG is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_XTKBD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_TABLET is not set -# CONFIG_INPUT_TOUCHSCREEN is not set -CONFIG_INPUT_MISC=y -# CONFIG_INPUT_AD714X is not set -# CONFIG_INPUT_BMA150 is not set -# CONFIG_INPUT_E3X0_BUTTON is not set -CONFIG_INPUT_PCSPKR=y -# CONFIG_INPUT_MMA8450 is not set -CONFIG_INPUT_ATLAS_BTNS=y -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -# CONFIG_INPUT_KXTJ9 is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_YEALINK is not set -# CONFIG_INPUT_CM109 is not set -CONFIG_INPUT_UINPUT=y -# CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_DA7280_HAPTICS is not set -# CONFIG_INPUT_ADXL34X is not set -# CONFIG_INPUT_IQS269A is not set -# CONFIG_INPUT_CMA3000 is not set -CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y -# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set -# CONFIG_INPUT_DRV2665_HAPTICS is not set -# CONFIG_INPUT_DRV2667_HAPTICS is not set -# CONFIG_RMI4_CORE is not set - -# -# Hardware I/O ports -# -CONFIG_SERIO=y -CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y -CONFIG_SERIO_I8042=y -CONFIG_SERIO_SERPORT=y -# CONFIG_SERIO_CT82C710 is not set -CONFIG_SERIO_PCIPS2=y -CONFIG_SERIO_LIBPS2=y -CONFIG_SERIO_RAW=y -# CONFIG_SERIO_ALTERA_PS2 is not set -# CONFIG_SERIO_PS2MULT is not set -# CONFIG_SERIO_ARC_PS2 is not set -CONFIG_HYPERV_KEYBOARD=y -# CONFIG_USERIO is not set -# CONFIG_GAMEPORT is not set -# end of Hardware I/O ports -# end of Input device support - -# -# Character devices -# -CONFIG_TTY=y -CONFIG_VT=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_HW_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_UNIX98_PTYS=y -# CONFIG_LEGACY_PTYS is not set -CONFIG_LDISC_AUTOLOAD=y - -# -# Serial drivers -# -CONFIG_SERIAL_EARLYCON=y -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y -CONFIG_SERIAL_8250_PNP=y -# CONFIG_SERIAL_8250_16550A_VARIANTS is not set -# CONFIG_SERIAL_8250_FINTEK is not set -CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_PCI=y -CONFIG_SERIAL_8250_EXAR=y -CONFIG_SERIAL_8250_NR_UARTS=32 -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -# CONFIG_SERIAL_8250_EXTENDED is not set -CONFIG_SERIAL_8250_DWLIB=y -# CONFIG_SERIAL_8250_DW is not set -# CONFIG_SERIAL_8250_RT288X is not set -CONFIG_SERIAL_8250_LPSS=y -# CONFIG_SERIAL_8250_MID is not set - -# -# Non-8250 serial port support -# -# CONFIG_SERIAL_UARTLITE is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_LANTIQ is not set -# CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set -# CONFIG_SERIAL_BCM63XX is not set -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_ARC is not set -# CONFIG_SERIAL_RP2 is not set -# CONFIG_SERIAL_FSL_LPUART is not set -# CONFIG_SERIAL_FSL_LINFLEXUART is not set -# CONFIG_SERIAL_SPRD is not set -# end of Serial drivers - -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_N_GSM is not set -# CONFIG_NOZOMI is not set -# CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set -CONFIG_HVC_DRIVER=y -CONFIG_HVC_IRQ=y -CONFIG_HVC_XEN=y -CONFIG_HVC_XEN_FRONTEND=y -# CONFIG_SERIAL_DEV_BUS is not set -# CONFIG_TTY_PRINTK is not set -CONFIG_VIRTIO_CONSOLE=y -# CONFIG_IPMI_HANDLER is not set -CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_TIMERIOMEM=y -CONFIG_HW_RANDOM_INTEL=y -CONFIG_HW_RANDOM_AMD=y -# CONFIG_HW_RANDOM_BA431 is not set -CONFIG_HW_RANDOM_VIA=y -CONFIG_HW_RANDOM_VIRTIO=y -# CONFIG_HW_RANDOM_XIPHERA is not set -# CONFIG_APPLICOM is not set -# CONFIG_MWAVE is not set -CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set -CONFIG_NVRAM=y -# CONFIG_RAW_DRIVER is not set -CONFIG_DEVPORT=y -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -CONFIG_HPET_MMAP_DEFAULT=y -CONFIG_HANGCHECK_TIMER=y -CONFIG_TCG_TPM=y -CONFIG_HW_RANDOM_TPM=y -CONFIG_TCG_TIS_CORE=y -CONFIG_TCG_TIS=y -CONFIG_TCG_TIS_I2C_ATMEL=m -CONFIG_TCG_TIS_I2C_INFINEON=m -CONFIG_TCG_TIS_I2C_NUVOTON=m -CONFIG_TCG_NSC=m -CONFIG_TCG_ATMEL=m -CONFIG_TCG_INFINEON=m -CONFIG_TCG_XEN=m -CONFIG_TCG_CRB=y -CONFIG_TCG_VTPM_PROXY=m -CONFIG_TCG_TIS_ST33ZP24=m -CONFIG_TCG_TIS_ST33ZP24_I2C=m -# CONFIG_TELCLOCK is not set -# CONFIG_XILLYBUS is not set -# end of Character devices - -# CONFIG_RANDOM_TRUST_CPU is not set -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set - -# -# I2C support -# -CONFIG_I2C=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_COMPAT=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_MUX=y - -# -# Multiplexer I2C Chip support -# -# CONFIG_I2C_MUX_LTC4306 is not set -# CONFIG_I2C_MUX_PCA9541 is not set -# CONFIG_I2C_MUX_REG is not set -# CONFIG_I2C_MUX_MLXCPLD is not set -# end of Multiplexer I2C Chip support - -CONFIG_I2C_HELPER_AUTO=y -CONFIG_I2C_ALGOBIT=m - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_AMD_MP2 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_ISMT is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# ACPI drivers -# -# CONFIG_I2C_SCMI is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_MLXCPLD is not set -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_SLAVE is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# end of I2C support - -# CONFIG_I3C is not set -# CONFIG_SPI is not set -# CONFIG_SPMI is not set -# CONFIG_HSI is not set -CONFIG_PPS=y -# CONFIG_PPS_DEBUG is not set - -# -# PPS clients support -# -# CONFIG_PPS_CLIENT_KTIMER is not set -# CONFIG_PPS_CLIENT_LDISC is not set -# CONFIG_PPS_CLIENT_GPIO is not set - -# -# PPS generators support -# - -# -# PTP clock support -# -CONFIG_PTP_1588_CLOCK=y - -# -# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. -# -CONFIG_PTP_1588_CLOCK_KVM=y -# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set -# CONFIG_PTP_1588_CLOCK_IDTCM is not set -# CONFIG_PTP_1588_CLOCK_VMW is not set -# CONFIG_PTP_1588_CLOCK_OCP is not set -# end of PTP clock support - -# CONFIG_PINCTRL is not set -# CONFIG_GPIOLIB is not set -# CONFIG_W1 is not set -# CONFIG_POWER_RESET is not set -CONFIG_POWER_SUPPLY=y -# CONFIG_POWER_SUPPLY_DEBUG is not set -CONFIG_POWER_SUPPLY_HWMON=y -# CONFIG_PDA_POWER is not set -# CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set -# CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_BD99954 is not set -CONFIG_HWMON=y -# CONFIG_HWMON_DEBUG_CHIP is not set - -# -# Native drivers -# -# CONFIG_SENSORS_ABITUGURU is not set -# CONFIG_SENSORS_ABITUGURU3 is not set -# CONFIG_SENSORS_AD7414 is not set -# CONFIG_SENSORS_AD7418 is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM1177 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ADT7410 is not set -# CONFIG_SENSORS_ADT7411 is not set -# CONFIG_SENSORS_ADT7462 is not set -# CONFIG_SENSORS_ADT7470 is not set -# CONFIG_SENSORS_ADT7475 is not set -# CONFIG_SENSORS_AS370 is not set -# CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_AXI_FAN_CONTROL is not set -# CONFIG_SENSORS_K8TEMP is not set -# CONFIG_SENSORS_K10TEMP is not set -# CONFIG_SENSORS_FAM15H_POWER is not set -# CONFIG_SENSORS_AMD_ENERGY is not set -# CONFIG_SENSORS_APPLESMC is not set -# CONFIG_SENSORS_ASB100 is not set -# CONFIG_SENSORS_ASPEED is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_CORSAIR_CPRO is not set -# CONFIG_SENSORS_CORSAIR_PSU is not set -# CONFIG_SENSORS_DRIVETEMP is not set -# CONFIG_SENSORS_DS620 is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_DELL_SMM is not set -# CONFIG_SENSORS_I5K_AMB is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_F71882FG is not set -# CONFIG_SENSORS_F75375S is not set -# CONFIG_SENSORS_FSCHMD is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_G760A is not set -# CONFIG_SENSORS_G762 is not set -# CONFIG_SENSORS_HIH6130 is not set -# CONFIG_SENSORS_I5500 is not set -# CONFIG_SENSORS_CORETEMP is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_JC42 is not set -# CONFIG_SENSORS_POWR1220 is not set -# CONFIG_SENSORS_LINEAGE is not set -# CONFIG_SENSORS_LTC2945 is not set -# CONFIG_SENSORS_LTC2947_I2C is not set -# CONFIG_SENSORS_LTC2990 is not set -# CONFIG_SENSORS_LTC4151 is not set -# CONFIG_SENSORS_LTC4215 is not set -# CONFIG_SENSORS_LTC4222 is not set -# CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LTC4260 is not set -# CONFIG_SENSORS_LTC4261 is not set -# CONFIG_SENSORS_MAX127 is not set -# CONFIG_SENSORS_MAX16065 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX1668 is not set -# CONFIG_SENSORS_MAX197 is not set -# CONFIG_SENSORS_MAX31730 is not set -# CONFIG_SENSORS_MAX6621 is not set -# CONFIG_SENSORS_MAX6639 is not set -# CONFIG_SENSORS_MAX6642 is not set -# CONFIG_SENSORS_MAX6650 is not set -# CONFIG_SENSORS_MAX6697 is not set -# CONFIG_SENSORS_MAX31790 is not set -# CONFIG_SENSORS_MCP3021 is not set -# CONFIG_SENSORS_TC654 is not set -# CONFIG_SENSORS_MR75203 is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM73 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_LM93 is not set -# CONFIG_SENSORS_LM95234 is not set -# CONFIG_SENSORS_LM95241 is not set -# CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set -# CONFIG_SENSORS_NCT6683 is not set -# CONFIG_SENSORS_NCT6775 is not set -# CONFIG_SENSORS_NCT7802 is not set -# CONFIG_SENSORS_NPCM7XX is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_PMBUS is not set -# CONFIG_SENSORS_SBTSI is not set -# CONFIG_SENSORS_SHT21 is not set -# CONFIG_SENSORS_SHT3x is not set -# CONFIG_SENSORS_SHTC1 is not set -# CONFIG_SENSORS_SIS5595 is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_EMC1403 is not set -# CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_EMC6W201 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_STTS751 is not set -# CONFIG_SENSORS_SMM665 is not set -# CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADS7828 is not set -# CONFIG_SENSORS_AMC6821 is not set -# CONFIG_SENSORS_INA209 is not set -# CONFIG_SENSORS_INA2XX is not set -# CONFIG_SENSORS_INA3221 is not set -# CONFIG_SENSORS_TC74 is not set -# CONFIG_SENSORS_THMC50 is not set -# CONFIG_SENSORS_TMP102 is not set -# CONFIG_SENSORS_TMP103 is not set -# CONFIG_SENSORS_TMP108 is not set -# CONFIG_SENSORS_TMP401 is not set -# CONFIG_SENSORS_TMP421 is not set -# CONFIG_SENSORS_TMP513 is not set -# CONFIG_SENSORS_VIA_CPUTEMP is not set -# CONFIG_SENSORS_VIA686A is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_VT8231 is not set -# CONFIG_SENSORS_W83773G is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83795 is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83627EHF is not set -# CONFIG_SENSORS_XGENE is not set - -# -# ACPI drivers -# -# CONFIG_SENSORS_ACPI_POWER is not set -# CONFIG_SENSORS_ATK0110 is not set -CONFIG_THERMAL=y -# CONFIG_THERMAL_NETLINK is not set -# CONFIG_THERMAL_STATISTICS is not set -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -# CONFIG_THERMAL_HWMON is not set -# CONFIG_THERMAL_WRITABLE_TRIPS is not set -CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y -# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set -# CONFIG_THERMAL_GOV_FAIR_SHARE is not set -CONFIG_THERMAL_GOV_STEP_WISE=y -# CONFIG_THERMAL_GOV_BANG_BANG is not set -# CONFIG_THERMAL_GOV_USER_SPACE is not set -# CONFIG_DEVFREQ_THERMAL is not set -# CONFIG_THERMAL_EMULATION is not set - -# -# Intel thermal drivers -# -# CONFIG_INTEL_POWERCLAMP is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set - -# -# ACPI INT340X thermal drivers -# -# CONFIG_INT340X_THERMAL is not set -# end of ACPI INT340X thermal drivers - -# CONFIG_INTEL_PCH_THERMAL is not set -# end of Intel thermal drivers - -# CONFIG_WATCHDOG is not set -CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB is not set -CONFIG_BCMA_POSSIBLE=y -# CONFIG_BCMA is not set - -# -# Multifunction device drivers -# -CONFIG_MFD_CORE=y -# CONFIG_MFD_AS3711 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set -# CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set -# CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set -CONFIG_LPC_ICH=y -CONFIG_LPC_SCH=y -# CONFIG_MFD_INTEL_LPSS_ACPI is not set -# CONFIG_MFD_INTEL_LPSS_PCI is not set -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_INTEL_PMT is not set -# CONFIG_MFD_IQS62X is not set -# CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6360 is not set -# CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set -# CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set -CONFIG_MFD_SM501=y -# CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set -# CONFIG_MFD_SYSCON is not set -# CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -CONFIG_MFD_WL1273_CORE=y -# CONFIG_MFD_LM3533 is not set -# CONFIG_MFD_TQMX86 is not set -CONFIG_MFD_VX855=y -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set -# end of Multifunction device drivers - -# CONFIG_REGULATOR is not set -# CONFIG_RC_CORE is not set -# CONFIG_MEDIA_CEC_SUPPORT is not set -# CONFIG_MEDIA_SUPPORT is not set - -# -# Graphics support -# -# CONFIG_AGP is not set -# CONFIG_VGA_ARB is not set -# CONFIG_VGA_SWITCHEROO is not set -# CONFIG_DRM is not set - -# -# ARM devices -# -# end of ARM devices - -# CONFIG_DRM_XEN is not set -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y - -# -# Frame buffer Devices -# -CONFIG_FB_CMDLINE=y -CONFIG_FB_NOTIFY=y -CONFIG_FB=y -# CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_BOOT_VESA_SUPPORT=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_FOREIGN_ENDIAN is not set -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_DEFERRED_IO=y -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_TILEBLITTING is not set - -# -# Frame buffer hardware drivers -# -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set -# CONFIG_FB_CYBER2000 is not set -# CONFIG_FB_ARC is not set -# CONFIG_FB_ASILIANT is not set -# CONFIG_FB_IMSTT is not set -# CONFIG_FB_VGA16 is not set -# CONFIG_FB_UVESA is not set -CONFIG_FB_VESA=y -CONFIG_FB_EFI=y -# CONFIG_FB_N411 is not set -# CONFIG_FB_HGA is not set -# CONFIG_FB_OPENCORES is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_NVIDIA is not set -# CONFIG_FB_RIVA is not set -# CONFIG_FB_I740 is not set -# CONFIG_FB_LE80578 is not set -# CONFIG_FB_MATROX is not set -# CONFIG_FB_RADEON is not set -# CONFIG_FB_ATY128 is not set -# CONFIG_FB_ATY is not set -# CONFIG_FB_S3 is not set -# CONFIG_FB_SAVAGE is not set -# CONFIG_FB_SIS is not set -# CONFIG_FB_NEOMAGIC is not set -# CONFIG_FB_KYRO is not set -# CONFIG_FB_3DFX is not set -# CONFIG_FB_VOODOO1 is not set -# CONFIG_FB_VT8623 is not set -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_ARK is not set -# CONFIG_FB_PM3 is not set -# CONFIG_FB_CARMINE is not set -# CONFIG_FB_SM501 is not set -# CONFIG_FB_SMSCUFX is not set -# CONFIG_FB_UDL is not set -# CONFIG_FB_IBM_GXT4500 is not set -# CONFIG_FB_VIRTUAL is not set -CONFIG_XEN_FBDEV_FRONTEND=y -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_MB862XX is not set -CONFIG_FB_HYPERV=y -# CONFIG_FB_SIMPLE is not set -# CONFIG_FB_SM712 is not set -# end of Frame buffer Devices - -# -# Backlight & LCD device support -# -# CONFIG_LCD_CLASS_DEVICE is not set -# CONFIG_BACKLIGHT_CLASS_DEVICE is not set -# end of Backlight & LCD device support - -# -# Console display driver support -# -CONFIG_VGA_CONSOLE=y -CONFIG_DUMMY_CONSOLE=y -CONFIG_DUMMY_CONSOLE_COLUMNS=80 -CONFIG_DUMMY_CONSOLE_ROWS=25 -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set -# end of Console display driver support - -# CONFIG_LOGO is not set -# end of Graphics support - -# CONFIG_SOUND is not set - -# -# HID support -# -CONFIG_HID=y -# CONFIG_HID_BATTERY_STRENGTH is not set -# CONFIG_HIDRAW is not set -# CONFIG_UHID is not set -CONFIG_HID_GENERIC=y - -# -# Special HID drivers -# -# CONFIG_HID_A4TECH is not set -# CONFIG_HID_ACCUTOUCH is not set -# CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set -# CONFIG_HID_APPLEIR is not set -# CONFIG_HID_AUREAL is not set -# CONFIG_HID_BELKIN is not set -# CONFIG_HID_BETOP_FF is not set -# CONFIG_HID_CHERRY is not set -# CONFIG_HID_CHICONY is not set -# CONFIG_HID_COUGAR is not set -# CONFIG_HID_MACALLY is not set -# CONFIG_HID_CMEDIA is not set -# CONFIG_HID_CREATIVE_SB0540 is not set -# CONFIG_HID_CYPRESS is not set -# CONFIG_HID_DRAGONRISE is not set -# CONFIG_HID_EMS_FF is not set -# CONFIG_HID_ELECOM is not set -# CONFIG_HID_ELO is not set -# CONFIG_HID_EZKEY is not set -# CONFIG_HID_GEMBIRD is not set -# CONFIG_HID_GFRM is not set -# CONFIG_HID_GLORIOUS is not set -# CONFIG_HID_HOLTEK is not set -# CONFIG_HID_VIVALDI is not set -# CONFIG_HID_KEYTOUCH is not set -# CONFIG_HID_KYE is not set -# CONFIG_HID_UCLOGIC is not set -# CONFIG_HID_WALTOP is not set -# CONFIG_HID_VIEWSONIC is not set -# CONFIG_HID_GYRATION is not set -# CONFIG_HID_ICADE is not set -# CONFIG_HID_ITE is not set -# CONFIG_HID_JABRA is not set -# CONFIG_HID_TWINHAN is not set -# CONFIG_HID_KENSINGTON is not set -# CONFIG_HID_LCPOWER is not set -# CONFIG_HID_LENOVO is not set -# CONFIG_HID_MAGICMOUSE is not set -# CONFIG_HID_MALTRON is not set -# CONFIG_HID_MAYFLASH is not set -# CONFIG_HID_REDRAGON is not set -# CONFIG_HID_MICROSOFT is not set -# CONFIG_HID_MONTEREY is not set -# CONFIG_HID_MULTITOUCH is not set -# CONFIG_HID_NTI is not set -# CONFIG_HID_NTRIG is not set -# CONFIG_HID_ORTEK is not set -# CONFIG_HID_PANTHERLORD is not set -# CONFIG_HID_PENMOUNT is not set -# CONFIG_HID_PETALYNX is not set -# CONFIG_HID_PICOLCD is not set -# CONFIG_HID_PLANTRONICS is not set -# CONFIG_HID_PRIMAX is not set -# CONFIG_HID_RETRODE is not set -# CONFIG_HID_ROCCAT is not set -# CONFIG_HID_SAITEK is not set -# CONFIG_HID_SAMSUNG is not set -# CONFIG_HID_SPEEDLINK is not set -# CONFIG_HID_STEAM is not set -# CONFIG_HID_STEELSERIES is not set -# CONFIG_HID_SUNPLUS is not set -# CONFIG_HID_RMI is not set -# CONFIG_HID_GREENASIA is not set -# CONFIG_HID_HYPERV_MOUSE is not set -# CONFIG_HID_SMARTJOYPLUS is not set -# CONFIG_HID_TIVO is not set -# CONFIG_HID_TOPSEED is not set -# CONFIG_HID_THRUSTMASTER is not set -# CONFIG_HID_UDRAW_PS3 is not set -# CONFIG_HID_WACOM is not set -# CONFIG_HID_XINMO is not set -# CONFIG_HID_ZEROPLUS is not set -# CONFIG_HID_ZYDACRON is not set -# CONFIG_HID_SENSOR_HUB is not set -# CONFIG_HID_ALPS is not set -# end of Special HID drivers - -# -# USB HID support -# -CONFIG_USB_HID=y -# CONFIG_HID_PID is not set -# CONFIG_USB_HIDDEV is not set -# end of USB HID support - -# -# I2C HID support -# -# CONFIG_I2C_HID is not set -# end of I2C HID support - -# -# Intel ISH HID support -# -# CONFIG_INTEL_ISH_HID is not set -# end of Intel ISH HID support - -# -# AMD SFH HID Support -# -# CONFIG_AMD_SFH_HID is not set -# end of AMD SFH HID Support -# end of HID support - -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_COMMON=y -# CONFIG_USB_ULPI_BUS is not set -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB=y -CONFIG_USB_PCI=y -# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set - -# -# Miscellaneous USB options -# -CONFIG_USB_DEFAULT_PERSIST=y -# CONFIG_USB_FEW_INIT_RETRIES is not set -# CONFIG_USB_DYNAMIC_MINORS is not set -# CONFIG_USB_OTG is not set -# CONFIG_USB_OTG_PRODUCTLIST is not set -# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set -CONFIG_USB_AUTOSUSPEND_DELAY=2 -# CONFIG_USB_MON is not set - -# -# USB Host Controller Drivers -# -# CONFIG_USB_C67X00_HCD is not set -CONFIG_USB_XHCI_HCD=m -# CONFIG_USB_XHCI_DBGCAP is not set -CONFIG_USB_XHCI_PCI=m -# CONFIG_USB_XHCI_PCI_RENESAS is not set -# CONFIG_USB_XHCI_PLATFORM is not set -CONFIG_USB_EHCI_HCD=m -# CONFIG_USB_EHCI_ROOT_HUB_TT is not set -CONFIG_USB_EHCI_TT_NEWSCHED=y -CONFIG_USB_EHCI_PCI=m -# CONFIG_USB_EHCI_FSL is not set -# CONFIG_USB_EHCI_HCD_PLATFORM is not set -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_FOTG210_HCD is not set -CONFIG_USB_OHCI_HCD=m -CONFIG_USB_OHCI_HCD_PCI=m -# CONFIG_USB_OHCI_HCD_PLATFORM is not set -CONFIG_USB_UHCI_HCD=m -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_HCD_TEST_MODE is not set - -# -# USB Device Class drivers -# -# CONFIG_USB_ACM is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_WDM is not set -# CONFIG_USB_TMC is not set - -# -# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -# - -# -# also be needed; see USB_STORAGE Help for more info -# -CONFIG_USB_STORAGE=m -# CONFIG_USB_STORAGE_DEBUG is not set -# CONFIG_USB_STORAGE_REALTEK is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_ONETOUCH is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -# CONFIG_USB_STORAGE_ENE_UB6250 is not set -# CONFIG_USB_UAS is not set - -# -# USB Imaging devices -# -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set -# CONFIG_USB_MUSB_HDRC is not set -# CONFIG_USB_DWC3 is not set -# CONFIG_USB_DWC2 is not set -# CONFIG_USB_CHIPIDEA is not set -# CONFIG_USB_ISP1760 is not set - -# -# USB port drivers -# -# CONFIG_USB_SERIAL is not set - -# -# USB Miscellaneous drivers -# -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_SEVSEG is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_APPLEDISPLAY is not set -# CONFIG_APPLE_MFI_FASTCHARGE is not set -# CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_EHSET_TEST_FIXTURE is not set -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_YUREX is not set -# CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set -# CONFIG_USB_LINK_LAYER_TEST is not set -# CONFIG_USB_CHAOSKEY is not set - -# -# USB Physical Layer drivers -# -# CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_ISP1301 is not set -# end of USB Physical Layer drivers - -# CONFIG_USB_GADGET is not set -# CONFIG_TYPEC is not set -# CONFIG_USB_ROLE_SWITCH is not set -# CONFIG_MMC is not set -# CONFIG_MEMSTICK is not set -# CONFIG_NEW_LEDS is not set -# CONFIG_ACCESSIBILITY is not set -# CONFIG_INFINIBAND is not set -CONFIG_EDAC_ATOMIC_SCRUB=y -CONFIG_EDAC_SUPPORT=y -CONFIG_RTC_LIB=y -CONFIG_RTC_MC146818_LIB=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -CONFIG_RTC_SYSTOHC=y -CONFIG_RTC_SYSTOHC_DEVICE="rtc0" -# CONFIG_RTC_DEBUG is not set -CONFIG_RTC_NVMEM=y - -# -# RTC interfaces -# -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -# CONFIG_RTC_DRV_TEST is not set - -# -# I2C RTC drivers -# -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD3078 is not set - -# -# SPI RTC drivers -# -CONFIG_RTC_I2C_AND_SPI=y - -# -# SPI and I2C RTC drivers -# -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set -# CONFIG_RTC_DRV_RX6110 is not set - -# -# Platform RTC drivers -# -CONFIG_RTC_DRV_CMOS=y -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1685_FAMILY is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_DS2404 is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_V3020 is not set - -# -# on-CPU RTC drivers -# -# CONFIG_RTC_DRV_FTRTC010 is not set - -# -# HID Sensor RTC drivers -# -# CONFIG_DMADEVICES is not set - -# -# DMABUF options -# -# CONFIG_SYNC_FILE is not set -# CONFIG_DMABUF_MOVE_NOTIFY is not set -# CONFIG_DMABUF_HEAPS is not set -# end of DMABUF options - -# CONFIG_AUXDISPLAY is not set -CONFIG_UIO=m -# CONFIG_UIO_CIF is not set -# CONFIG_UIO_PDRV_GENIRQ is not set -# CONFIG_UIO_DMEM_GENIRQ is not set -# CONFIG_UIO_AEC is not set -# CONFIG_UIO_SERCOS3 is not set -# CONFIG_UIO_PCI_GENERIC is not set -# CONFIG_UIO_NETX is not set -# CONFIG_UIO_PRUSS is not set -# CONFIG_UIO_MF624 is not set -# CONFIG_UIO_HV_GENERIC is not set -CONFIG_IRQ_BYPASS_MANAGER=m -# CONFIG_VIRT_DRIVERS is not set -CONFIG_VIRTIO=y -CONFIG_VIRTIO_MENU=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_PCI_LEGACY=y -# CONFIG_VIRTIO_PMEM is not set -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_MEM=y -CONFIG_VIRTIO_INPUT=y -CONFIG_VIRTIO_MMIO=y -CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y -# CONFIG_VDPA is not set -CONFIG_VHOST_IOTLB=m -CONFIG_VHOST=m -CONFIG_VHOST_MENU=y -CONFIG_VHOST_NET=m -CONFIG_VHOST_VSOCK=m -# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set - -# -# Microsoft Hyper-V guest support -# -CONFIG_HYPERV=y -CONFIG_HYPERV_TIMER=y -CONFIG_HYPERV_UTILS=y -CONFIG_HYPERV_BALLOON=y -# end of Microsoft Hyper-V guest support - -# -# Xen driver support -# -CONFIG_XEN_BALLOON=y -CONFIG_XEN_BALLOON_MEMORY_HOTPLUG=y -CONFIG_XEN_BALLOON_MEMORY_HOTPLUG_LIMIT=512 -CONFIG_XEN_SCRUB_PAGES_DEFAULT=y -CONFIG_XEN_DEV_EVTCHN=y -# CONFIG_XEN_BACKEND is not set -CONFIG_XENFS=y -CONFIG_XEN_COMPAT_XENFS=y -CONFIG_XEN_SYS_HYPERVISOR=y -CONFIG_XEN_XENBUS_FRONTEND=y -CONFIG_XEN_GNTDEV=y -CONFIG_XEN_GRANT_DEV_ALLOC=y -# CONFIG_XEN_GRANT_DMA_ALLOC is not set -CONFIG_SWIOTLB_XEN=y -CONFIG_XEN_PVCALLS_FRONTEND=y -CONFIG_XEN_PRIVCMD=y -CONFIG_XEN_ACPI_PROCESSOR=y -CONFIG_XEN_HAVE_PVMMU=y -CONFIG_XEN_EFI=y -CONFIG_XEN_AUTO_XLATE=y -CONFIG_XEN_ACPI=y -# CONFIG_XEN_SYMS is not set -CONFIG_XEN_HAVE_VPMU=y -CONFIG_XEN_UNPOPULATED_ALLOC=y -# end of Xen driver support - -# CONFIG_GREYBUS is not set -# CONFIG_STAGING is not set -CONFIG_X86_PLATFORM_DEVICES=y -# CONFIG_ACPI_WMI is not set -# CONFIG_ACERHDF is not set -# CONFIG_ACER_WIRELESS is not set -# CONFIG_AMD_PMC is not set -# CONFIG_ASUS_WIRELESS is not set -# CONFIG_DCDBAS is not set -# CONFIG_DELL_SMBIOS is not set -# CONFIG_DELL_RBU is not set -# CONFIG_DELL_SMO8800 is not set -# CONFIG_FUJITSU_TABLET is not set -# CONFIG_GPD_POCKET_FAN is not set -# CONFIG_HP_ACCEL is not set -# CONFIG_HP_WIRELESS is not set -# CONFIG_IBM_RTL is not set -# CONFIG_SENSORS_HDAPS is not set -# CONFIG_INTEL_HID_EVENT is not set -# CONFIG_INTEL_MENLOW is not set -# CONFIG_INTEL_VBTN is not set -# CONFIG_SAMSUNG_Q10 is not set -# CONFIG_TOSHIBA_BT_RFKILL is not set -# CONFIG_TOSHIBA_HAPS is not set -# CONFIG_ACPI_CMPC is not set -# CONFIG_SYSTEM76_ACPI is not set -# CONFIG_TOPSTAR_LAPTOP is not set -# CONFIG_I2C_MULTI_INSTANTIATE is not set -CONFIG_INTEL_IPS=y -# CONFIG_INTEL_RST is not set -# CONFIG_INTEL_SMARTCONNECT is not set - -# -# Intel Speed Select Technology interface support -# -# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set -# end of Intel Speed Select Technology interface support - -# CONFIG_INTEL_TURBO_MAX_3 is not set -# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set -# CONFIG_INTEL_PMC_CORE is not set -# CONFIG_INTEL_PUNIT_IPC is not set -# CONFIG_INTEL_SCU_PCI is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -CONFIG_PMC_ATOM=y -# CONFIG_CHROME_PLATFORMS is not set -# CONFIG_MELLANOX_PLATFORM is not set -# CONFIG_SURFACE_PLATFORMS is not set -CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_HAVE_CLK_PREPARE=y -CONFIG_COMMON_CLK=y -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set -# CONFIG_HWSPINLOCK is not set - -# -# Clock Source drivers -# -CONFIG_CLKEVT_I8253=y -CONFIG_I8253_LOCK=y -CONFIG_CLKBLD_I8253=y -# end of Clock Source drivers - -CONFIG_MAILBOX=y -CONFIG_PCC=y -# CONFIG_ALTERA_MBOX is not set -# CONFIG_IOMMU_SUPPORT is not set - -# -# Remoteproc drivers -# -# CONFIG_REMOTEPROC is not set -# end of Remoteproc drivers - -# -# Rpmsg drivers -# -# CONFIG_RPMSG_QCOM_GLINK_RPM is not set -# CONFIG_RPMSG_VIRTIO is not set -# end of Rpmsg drivers - -# CONFIG_SOUNDWIRE is not set - -# -# SOC (System On Chip) specific Drivers -# - -# -# Amlogic SoC drivers -# -# end of Amlogic SoC drivers - -# -# Broadcom SoC drivers -# -# end of Broadcom SoC drivers - -# -# NXP/Freescale QorIQ SoC drivers -# -# end of NXP/Freescale QorIQ SoC drivers - -# -# i.MX SoC drivers -# -# end of i.MX SoC drivers - -# -# Enable LiteX SoC Builder specific drivers -# -# end of Enable LiteX SoC Builder specific drivers - -# -# Qualcomm SoC drivers -# -# end of Qualcomm SoC drivers - -# CONFIG_SOC_TI is not set - -# -# Xilinx SoC drivers -# -# CONFIG_XILINX_VCU is not set -# end of Xilinx SoC drivers -# end of SOC (System On Chip) specific Drivers - -CONFIG_PM_DEVFREQ=y - -# -# DEVFREQ Governors -# -CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y -# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set -# CONFIG_DEVFREQ_GOV_POWERSAVE is not set -# CONFIG_DEVFREQ_GOV_USERSPACE is not set -# CONFIG_DEVFREQ_GOV_PASSIVE is not set - -# -# DEVFREQ Drivers -# -# CONFIG_PM_DEVFREQ_EVENT is not set -# CONFIG_EXTCON is not set -# CONFIG_MEMORY is not set -# CONFIG_IIO is not set -# CONFIG_NTB is not set -# CONFIG_VME_BUS is not set -# CONFIG_PWM is not set - -# -# IRQ chip support -# -# end of IRQ chip support - -# CONFIG_IPACK_BUS is not set -CONFIG_RESET_CONTROLLER=y -# CONFIG_RESET_BRCMSTB_RESCAL is not set -# CONFIG_RESET_TI_SYSCON is not set - -# -# PHY Subsystem -# -CONFIG_GENERIC_PHY=y -# CONFIG_USB_LGM_PHY is not set -# CONFIG_BCM_KONA_USB2_PHY is not set -# CONFIG_PHY_PXA_28NM_HSIC is not set -# CONFIG_PHY_PXA_28NM_USB2 is not set -# CONFIG_PHY_INTEL_LGM_EMMC is not set -# end of PHY Subsystem - -# CONFIG_POWERCAP is not set -# CONFIG_MCB is not set - -# -# Performance monitor support -# -# end of Performance monitor support - -# CONFIG_RAS is not set -# CONFIG_USB4 is not set - -# -# Android -# -# CONFIG_ANDROID is not set -# end of Android - -CONFIG_LIBNVDIMM=y -CONFIG_BLK_DEV_PMEM=y -CONFIG_ND_BLK=y -CONFIG_ND_CLAIM=y -CONFIG_ND_BTT=y -CONFIG_BTT=y -CONFIG_ND_PFN=y -CONFIG_NVDIMM_PFN=y -CONFIG_NVDIMM_DAX=y -CONFIG_NVDIMM_KEYS=y -CONFIG_DAX_DRIVER=y -CONFIG_DAX=y -CONFIG_DEV_DAX=y -CONFIG_DEV_DAX_PMEM=m -CONFIG_DEV_DAX_KMEM=y -CONFIG_DEV_DAX_PMEM_COMPAT=m -CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y - -# -# HW tracing support -# -# CONFIG_STM is not set -# CONFIG_INTEL_TH is not set -# end of HW tracing support - -# CONFIG_FPGA is not set -# CONFIG_TEE is not set -CONFIG_PM_OPP=y -# CONFIG_UNISYS_VISORBUS is not set -# CONFIG_SIOX is not set -# CONFIG_SLIMBUS is not set -# CONFIG_INTERCONNECT is not set -# CONFIG_COUNTER is not set -# end of Device Drivers - -# -# File systems -# -CONFIG_DCACHE_WORD_ACCESS=y -CONFIG_VALIDATE_FS_PARSER=y -CONFIG_FS_IOMAP=y -# CONFIG_EXT2_FS is not set -# CONFIG_EXT3_FS is not set -CONFIG_EXT4_FS=y -CONFIG_EXT4_USE_FOR_EXT2=y -CONFIG_EXT4_FS_POSIX_ACL=y -CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_DEBUG is not set -CONFIG_JBD2=y -# CONFIG_JBD2_DEBUG is not set -CONFIG_FS_MBCACHE=y -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set -CONFIG_XFS_FS=y -CONFIG_XFS_SUPPORT_V4=y -CONFIG_XFS_QUOTA=y -CONFIG_XFS_POSIX_ACL=y -# CONFIG_XFS_RT is not set -# CONFIG_XFS_ONLINE_SCRUB is not set -# CONFIG_XFS_WARN is not set -# CONFIG_XFS_DEBUG is not set -# CONFIG_GFS2_FS is not set -CONFIG_BTRFS_FS=m -CONFIG_BTRFS_FS_POSIX_ACL=y -# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set -# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set -# CONFIG_BTRFS_DEBUG is not set -# CONFIG_BTRFS_ASSERT is not set -# CONFIG_BTRFS_FS_REF_VERIFY is not set -# CONFIG_NILFS2_FS is not set -# CONFIG_F2FS_FS is not set -CONFIG_FS_DAX=y -CONFIG_FS_DAX_PMD=y -CONFIG_FS_POSIX_ACL=y -CONFIG_EXPORTFS=y -# CONFIG_EXPORTFS_BLOCK_OPS is not set -CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y -CONFIG_FS_ENCRYPTION=y -CONFIG_FS_ENCRYPTION_ALGS=y -# CONFIG_FS_VERITY is not set -CONFIG_FSNOTIFY=y -CONFIG_DNOTIFY=y -CONFIG_INOTIFY_USER=y -CONFIG_FANOTIFY=y -# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set -CONFIG_QUOTA=y -CONFIG_QUOTA_NETLINK_INTERFACE=y -CONFIG_PRINT_QUOTA_WARNING=y -# CONFIG_QUOTA_DEBUG is not set -# CONFIG_QFMT_V1 is not set -# CONFIG_QFMT_V2 is not set -CONFIG_QUOTACTL=y -# CONFIG_AUTOFS4_FS is not set -# CONFIG_AUTOFS_FS is not set -CONFIG_FUSE_FS=y -CONFIG_CUSE=y -CONFIG_VIRTIO_FS=y -CONFIG_FUSE_DAX=y -CONFIG_OVERLAY_FS=y -# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set -CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y -# CONFIG_OVERLAY_FS_INDEX is not set -# CONFIG_OVERLAY_FS_XINO_AUTO is not set -# CONFIG_OVERLAY_FS_METACOPY is not set - -# -# Caches -# -CONFIG_FSCACHE=y -CONFIG_FSCACHE_STATS=y -# CONFIG_FSCACHE_HISTOGRAM is not set -# CONFIG_FSCACHE_DEBUG is not set -# CONFIG_FSCACHE_OBJECT_LIST is not set -CONFIG_CACHEFILES=y -# CONFIG_CACHEFILES_DEBUG is not set -# CONFIG_CACHEFILES_HISTOGRAM is not set -# end of Caches - -# -# CD-ROM/DVD Filesystems -# -CONFIG_ISO9660_FS=y -CONFIG_JOLIET=y -CONFIG_ZISOFS=y -CONFIG_UDF_FS=y -# end of CD-ROM/DVD Filesystems - -# -# DOS/FAT/EXFAT/NT Filesystems -# -CONFIG_FAT_FS=y -CONFIG_MSDOS_FS=y -CONFIG_VFAT_FS=y -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="utf8" -# CONFIG_FAT_DEFAULT_UTF8 is not set -# CONFIG_EXFAT_FS is not set -CONFIG_NTFS_FS=m -# CONFIG_NTFS_DEBUG is not set -# CONFIG_NTFS_RW is not set -# end of DOS/FAT/EXFAT/NT Filesystems - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -CONFIG_PROC_KCORE=y -CONFIG_PROC_SYSCTL=y -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_PROC_CHILDREN=y -CONFIG_PROC_PID_ARCH_STATUS=y -CONFIG_KERNFS=y -CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -CONFIG_TMPFS_XATTR=y -# CONFIG_TMPFS_INODE64 is not set -CONFIG_HUGETLBFS=y -CONFIG_HUGETLB_PAGE=y -CONFIG_MEMFD_CREATE=y -CONFIG_ARCH_HAS_GIGANTIC_PAGE=y -# CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=y -# end of Pseudo filesystems - -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_ORANGEFS_FS is not set -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_ECRYPT_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_EFS_FS is not set -# CONFIG_CRAMFS is not set -CONFIG_SQUASHFS=y -CONFIG_SQUASHFS_FILE_CACHE=y -# CONFIG_SQUASHFS_FILE_DIRECT is not set -CONFIG_SQUASHFS_DECOMP_SINGLE=y -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set -CONFIG_SQUASHFS_XATTR=y -CONFIG_SQUASHFS_ZLIB=y -CONFIG_SQUASHFS_LZ4=y -CONFIG_SQUASHFS_LZO=y -CONFIG_SQUASHFS_XZ=y -CONFIG_SQUASHFS_ZSTD=y -# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_VXFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_OMFS_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX6FS_FS is not set -# CONFIG_ROMFS_FS is not set -CONFIG_PSTORE=y -CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 -CONFIG_PSTORE_DEFLATE_COMPRESS=y -# CONFIG_PSTORE_LZO_COMPRESS is not set -# CONFIG_PSTORE_LZ4_COMPRESS is not set -# CONFIG_PSTORE_LZ4HC_COMPRESS is not set -# CONFIG_PSTORE_842_COMPRESS is not set -# CONFIG_PSTORE_ZSTD_COMPRESS is not set -CONFIG_PSTORE_COMPRESS=y -CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y -CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" -# CONFIG_PSTORE_CONSOLE is not set -# CONFIG_PSTORE_PMSG is not set -# CONFIG_PSTORE_FTRACE is not set -# CONFIG_PSTORE_RAM is not set -# CONFIG_PSTORE_BLK is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set -# CONFIG_EROFS_FS is not set -CONFIG_NETWORK_FILESYSTEMS=y -CONFIG_NFS_FS=m -# CONFIG_NFS_V2 is not set -CONFIG_NFS_V3=m -# CONFIG_NFS_V3_ACL is not set -CONFIG_NFS_V4=m -# CONFIG_NFS_SWAP is not set -CONFIG_NFS_V4_1=y -CONFIG_NFS_V4_2=y -CONFIG_PNFS_FILE_LAYOUT=m -CONFIG_PNFS_BLOCK=m -CONFIG_PNFS_FLEXFILE_LAYOUT=m -CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" -# CONFIG_NFS_V4_1_MIGRATION is not set -CONFIG_NFS_V4_SECURITY_LABEL=y -CONFIG_NFS_FSCACHE=y -# CONFIG_NFS_USE_LEGACY_DNS is not set -CONFIG_NFS_USE_KERNEL_DNS=y -CONFIG_NFS_DISABLE_UDP_SUPPORT=y -# CONFIG_NFS_V4_2_READ_PLUS is not set -CONFIG_NFSD=m -CONFIG_NFSD_V3=y -# CONFIG_NFSD_V3_ACL is not set -CONFIG_NFSD_V4=y -# CONFIG_NFSD_BLOCKLAYOUT is not set -# CONFIG_NFSD_SCSILAYOUT is not set -# CONFIG_NFSD_FLEXFILELAYOUT is not set -# CONFIG_NFSD_V4_2_INTER_SSC is not set -# CONFIG_NFSD_V4_SECURITY_LABEL is not set -CONFIG_GRACE_PERIOD=m -CONFIG_LOCKD=m -CONFIG_LOCKD_V4=y -CONFIG_NFS_COMMON=y -CONFIG_SUNRPC=m -CONFIG_SUNRPC_GSS=m -CONFIG_SUNRPC_BACKCHANNEL=y -CONFIG_RPCSEC_GSS_KRB5=m -# CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set -# CONFIG_SUNRPC_DEBUG is not set -CONFIG_CEPH_FS=m -CONFIG_CEPH_FSCACHE=y -CONFIG_CEPH_FS_POSIX_ACL=y -# CONFIG_CEPH_FS_SECURITY_LABEL is not set -CONFIG_CIFS=y -# CONFIG_CIFS_STATS2 is not set -# CONFIG_CIFS_ALLOW_INSECURE_LEGACY is not set -# CONFIG_CIFS_UPCALL is not set -CONFIG_CIFS_XATTR=y -CONFIG_CIFS_DEBUG=y -# CONFIG_CIFS_DEBUG2 is not set -# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set -CONFIG_CIFS_DFS_UPCALL=y -# CONFIG_CIFS_SWN_UPCALL is not set -CONFIG_CIFS_FSCACHE=y -# CONFIG_CIFS_ROOT is not set -# CONFIG_CODA_FS is not set -# CONFIG_AFS_FS is not set -CONFIG_9P_FS=y -CONFIG_9P_FSCACHE=y -CONFIG_9P_FS_POSIX_ACL=y -CONFIG_9P_FS_SECURITY=y -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="iso8859-1" -CONFIG_NLS_CODEPAGE_437=y -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -CONFIG_NLS_ASCII=y -CONFIG_NLS_ISO8859_1=y -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_MAC_ROMAN is not set -# CONFIG_NLS_MAC_CELTIC is not set -# CONFIG_NLS_MAC_CENTEURO is not set -# CONFIG_NLS_MAC_CROATIAN is not set -# CONFIG_NLS_MAC_CYRILLIC is not set -# CONFIG_NLS_MAC_GAELIC is not set -# CONFIG_NLS_MAC_GREEK is not set -# CONFIG_NLS_MAC_ICELAND is not set -# CONFIG_NLS_MAC_INUIT is not set -# CONFIG_NLS_MAC_ROMANIAN is not set -# CONFIG_NLS_MAC_TURKISH is not set -CONFIG_NLS_UTF8=y -# CONFIG_UNICODE is not set -CONFIG_IO_WQ=y -# end of File systems - -# -# Security options -# -CONFIG_KEYS=y -# CONFIG_KEYS_REQUEST_CACHE is not set -CONFIG_PERSISTENT_KEYRINGS=y -CONFIG_TRUSTED_KEYS=y -CONFIG_ENCRYPTED_KEYS=y -CONFIG_KEY_DH_OPERATIONS=y -CONFIG_SECURITY_DMESG_RESTRICT=y -CONFIG_SECURITY=y -CONFIG_SECURITYFS=y -CONFIG_SECURITY_NETWORK=y -CONFIG_PAGE_TABLE_ISOLATION=y -CONFIG_SECURITY_NETWORK_XFRM=y -CONFIG_SECURITY_PATH=y -CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y -CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set -CONFIG_FORTIFY_SOURCE=y -CONFIG_STATIC_USERMODEHELPER=y -CONFIG_STATIC_USERMODEHELPER_PATH="/sbin/usermode-helper" -# CONFIG_SECURITY_SELINUX is not set -# CONFIG_SECURITY_SMACK is not set -# CONFIG_SECURITY_TOMOYO is not set -# CONFIG_SECURITY_APPARMOR is not set -# CONFIG_SECURITY_LOADPIN is not set -CONFIG_SECURITY_YAMA=y -# CONFIG_SECURITY_SAFESETID is not set -# CONFIG_SECURITY_LOCKDOWN_LSM is not set -CONFIG_INTEGRITY=y -CONFIG_INTEGRITY_SIGNATURE=y -CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y -CONFIG_INTEGRITY_AUDIT=y -CONFIG_IMA=y -CONFIG_IMA_MEASURE_PCR_IDX=10 -# CONFIG_IMA_TEMPLATE is not set -CONFIG_IMA_NG_TEMPLATE=y -# CONFIG_IMA_SIG_TEMPLATE is not set -CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng" -# CONFIG_IMA_DEFAULT_HASH_SHA1 is not set -CONFIG_IMA_DEFAULT_HASH_SHA256=y -# CONFIG_IMA_DEFAULT_HASH_SHA512 is not set -# CONFIG_IMA_DEFAULT_HASH_WP512 is not set -CONFIG_IMA_DEFAULT_HASH="sha256" -# CONFIG_IMA_WRITE_POLICY is not set -CONFIG_IMA_READ_POLICY=y -CONFIG_IMA_APPRAISE=y -# CONFIG_IMA_ARCH_POLICY is not set -# CONFIG_IMA_APPRAISE_BUILD_POLICY is not set -CONFIG_IMA_APPRAISE_BOOTPARAM=y -# CONFIG_IMA_APPRAISE_MODSIG is not set -CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS=y -# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set -CONFIG_EVM=y -CONFIG_EVM_ATTR_FSUUID=y -# CONFIG_EVM_ADD_XATTRS is not set -CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_LSM="yama,loadpin,safesetid,integrity" - -# -# Kernel hardening options -# -CONFIG_GCC_PLUGIN_STRUCTLEAK=y - -# -# Memory initialization -# -# CONFIG_INIT_STACK_NONE is not set -# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set -# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set -CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL=y -# CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y -CONFIG_STACKLEAK_TRACK_MIN_SIZE=100 -# CONFIG_STACKLEAK_METRICS is not set -# CONFIG_STACKLEAK_RUNTIME_DISABLE is not set -# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set -# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set -# end of Memory initialization -# end of Kernel hardening options -# end of Security options - -CONFIG_XOR_BLOCKS=m -CONFIG_CRYPTO=y - -# -# Crypto core or helper -# -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_SKCIPHER=y -CONFIG_CRYPTO_SKCIPHER2=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_RNG_DEFAULT=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_AKCIPHER=y -CONFIG_CRYPTO_KPP2=y -CONFIG_CRYPTO_KPP=y -CONFIG_CRYPTO_ACOMP2=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -CONFIG_CRYPTO_USER=y -CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_GF128MUL=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_NULL2=y -# CONFIG_CRYPTO_PCRYPT is not set -CONFIG_CRYPTO_CRYPTD=y -CONFIG_CRYPTO_AUTHENC=y -# CONFIG_CRYPTO_TEST is not set -CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y -CONFIG_CRYPTO_ENGINE=m - -# -# Public-key cryptography -# -CONFIG_CRYPTO_RSA=y -CONFIG_CRYPTO_DH=y -# CONFIG_CRYPTO_ECDH is not set -# CONFIG_CRYPTO_ECRDSA is not set -# CONFIG_CRYPTO_SM2 is not set -# CONFIG_CRYPTO_CURVE25519 is not set -CONFIG_CRYPTO_CURVE25519_X86=m - -# -# Authenticated Encryption with Associated Data -# -CONFIG_CRYPTO_CCM=y -CONFIG_CRYPTO_GCM=y -CONFIG_CRYPTO_CHACHA20POLY1305=y -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -CONFIG_CRYPTO_SEQIV=y -CONFIG_CRYPTO_ECHAINIV=y - -# -# Block modes -# -CONFIG_CRYPTO_CBC=y -# CONFIG_CRYPTO_CFB is not set -CONFIG_CRYPTO_CTR=y -CONFIG_CRYPTO_CTS=y -CONFIG_CRYPTO_ECB=y -CONFIG_CRYPTO_LRW=y -# CONFIG_CRYPTO_OFB is not set -CONFIG_CRYPTO_PCBC=y -CONFIG_CRYPTO_XTS=y -CONFIG_CRYPTO_KEYWRAP=y -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y - -# -# Hash modes -# -CONFIG_CRYPTO_CMAC=y -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_XCBC=y -CONFIG_CRYPTO_VMAC=y - -# -# Digest -# -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_CRC32_PCLMUL=y -CONFIG_CRYPTO_XXHASH=m -CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set -CONFIG_CRYPTO_BLAKE2S_X86=m -CONFIG_CRYPTO_CRCT10DIF=y -# CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set -CONFIG_CRYPTO_GHASH=y -CONFIG_CRYPTO_POLY1305=y -CONFIG_CRYPTO_POLY1305_X86_64=y -CONFIG_CRYPTO_MD4=y -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_MICHAEL_MIC=y -CONFIG_CRYPTO_RMD128=y -CONFIG_CRYPTO_RMD160=y -CONFIG_CRYPTO_RMD256=y -CONFIG_CRYPTO_RMD320=y -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=y -# CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set -# CONFIG_CRYPTO_STREEBOG is not set -CONFIG_CRYPTO_TGR192=y -CONFIG_CRYPTO_WP512=y -CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=y - -# -# Ciphers -# -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AES_NI_INTEL=y -CONFIG_CRYPTO_ANUBIS=y -CONFIG_CRYPTO_ARC4=y -CONFIG_CRYPTO_BLOWFISH=y -CONFIG_CRYPTO_BLOWFISH_COMMON=y -CONFIG_CRYPTO_BLOWFISH_X86_64=y -CONFIG_CRYPTO_CAMELLIA=y -CONFIG_CRYPTO_CAMELLIA_X86_64=y -CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=y -CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=y -CONFIG_CRYPTO_CAST_COMMON=y -CONFIG_CRYPTO_CAST5=y -CONFIG_CRYPTO_CAST5_AVX_X86_64=y -CONFIG_CRYPTO_CAST6=y -CONFIG_CRYPTO_CAST6_AVX_X86_64=y -CONFIG_CRYPTO_DES=y -CONFIG_CRYPTO_DES3_EDE_X86_64=y -CONFIG_CRYPTO_FCRYPT=y -CONFIG_CRYPTO_KHAZAD=y -CONFIG_CRYPTO_SALSA20=y -CONFIG_CRYPTO_CHACHA20=y -CONFIG_CRYPTO_CHACHA20_X86_64=y -CONFIG_CRYPTO_SEED=y -CONFIG_CRYPTO_SERPENT=y -CONFIG_CRYPTO_SERPENT_SSE2_X86_64=y -CONFIG_CRYPTO_SERPENT_AVX_X86_64=y -CONFIG_CRYPTO_SERPENT_AVX2_X86_64=y -# CONFIG_CRYPTO_SM4 is not set -CONFIG_CRYPTO_TEA=y -CONFIG_CRYPTO_TWOFISH=y -CONFIG_CRYPTO_TWOFISH_COMMON=y -CONFIG_CRYPTO_TWOFISH_X86_64=y -CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=y -CONFIG_CRYPTO_TWOFISH_AVX_X86_64=y - -# -# Compression -# -CONFIG_CRYPTO_DEFLATE=y -CONFIG_CRYPTO_LZO=y -CONFIG_CRYPTO_842=y -CONFIG_CRYPTO_LZ4=y -CONFIG_CRYPTO_LZ4HC=y -# CONFIG_CRYPTO_ZSTD is not set - -# -# Random Number Generation -# -CONFIG_CRYPTO_ANSI_CPRNG=y -CONFIG_CRYPTO_DRBG_MENU=y -CONFIG_CRYPTO_DRBG_HMAC=y -# CONFIG_CRYPTO_DRBG_HASH is not set -# CONFIG_CRYPTO_DRBG_CTR is not set -CONFIG_CRYPTO_DRBG=y -CONFIG_CRYPTO_JITTERENTROPY=y -CONFIG_CRYPTO_USER_API=y -CONFIG_CRYPTO_USER_API_HASH=y -CONFIG_CRYPTO_USER_API_SKCIPHER=y -CONFIG_CRYPTO_USER_API_RNG=y -# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set -CONFIG_CRYPTO_USER_API_AEAD=y -CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y -# CONFIG_CRYPTO_STATS is not set -CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=m -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m -CONFIG_CRYPTO_LIB_BLAKE2S=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y -CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m -CONFIG_CRYPTO_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m -CONFIG_CRYPTO_LIB_SHA256=y -CONFIG_CRYPTO_HW=y -CONFIG_CRYPTO_DEV_PADLOCK=y -CONFIG_CRYPTO_DEV_PADLOCK_AES=y -CONFIG_CRYPTO_DEV_PADLOCK_SHA=y -# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set -# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set -# CONFIG_CRYPTO_DEV_CCP is not set -# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set -# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set -# CONFIG_CRYPTO_DEV_QAT_C62X is not set -# CONFIG_CRYPTO_DEV_QAT_4XXX 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 -# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set -CONFIG_CRYPTO_DEV_VIRTIO=m -# CONFIG_CRYPTO_DEV_SAFEXCEL is not set -# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set -CONFIG_ASYMMETRIC_KEY_TYPE=y -CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y -# CONFIG_ASYMMETRIC_TPM_KEY_SUBTYPE is not set -CONFIG_X509_CERTIFICATE_PARSER=y -# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set -CONFIG_PKCS7_MESSAGE_PARSER=y - -# -# Certificates for signature checking -# -# CONFIG_SYSTEM_TRUSTED_KEYRING is not set -# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -# end of Certificates for signature checking - -CONFIG_BINARY_PRINTF=y - -# -# Library routines -# -CONFIG_RAID6_PQ=m -CONFIG_RAID6_PQ_BENCHMARK=y -# CONFIG_PACKING is not set -CONFIG_BITREVERSE=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y -# CONFIG_CORDIC is not set -# CONFIG_PRIME_NUMBERS is not set -CONFIG_RATIONAL=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_IOMAP=y -CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y -CONFIG_ARCH_HAS_FAST_MULTIPLIER=y -CONFIG_ARCH_USE_SYM_ANNOTATIONS=y -CONFIG_CRC_CCITT=y -CONFIG_CRC16=y -CONFIG_CRC_T10DIF=y -CONFIG_CRC_ITU_T=y -CONFIG_CRC32=y -# CONFIG_CRC32_SELFTEST is not set -CONFIG_CRC32_SLICEBY8=y -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SARWATE is not set -# CONFIG_CRC32_BIT is not set -# CONFIG_CRC64 is not set -# CONFIG_CRC4 is not set -# CONFIG_CRC7 is not set -CONFIG_LIBCRC32C=y -# CONFIG_CRC8 is not set -CONFIG_XXHASH=y -# CONFIG_RANDOM32_SELFTEST is not set -CONFIG_842_COMPRESS=y -CONFIG_842_DECOMPRESS=y -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_LZO_COMPRESS=y -CONFIG_LZO_DECOMPRESS=y -CONFIG_LZ4_COMPRESS=y -CONFIG_LZ4HC_COMPRESS=y -CONFIG_LZ4_DECOMPRESS=y -CONFIG_ZSTD_COMPRESS=m -CONFIG_ZSTD_DECOMPRESS=y -CONFIG_XZ_DEC=y -CONFIG_XZ_DEC_X86=y -CONFIG_XZ_DEC_POWERPC=y -CONFIG_XZ_DEC_IA64=y -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y -CONFIG_XZ_DEC_SPARC=y -CONFIG_XZ_DEC_BCJ=y -# CONFIG_XZ_DEC_TEST is not set -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DECOMPRESS_ZSTD=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_TEXTSEARCH=y -CONFIG_TEXTSEARCH_KMP=y -CONFIG_TEXTSEARCH_BM=y -CONFIG_TEXTSEARCH_FSM=y -CONFIG_INTERVAL_TREE=y -CONFIG_XARRAY_MULTI=y -CONFIG_ASSOCIATIVE_ARRAY=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HAS_DMA=y -CONFIG_DMA_OPS=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_SWIOTLB=y -# CONFIG_DMA_API_DEBUG is not set -# CONFIG_DMA_MAP_BENCHMARK is not set -CONFIG_SGL_ALLOC=y -CONFIG_CHECK_SIGNATURE=y -CONFIG_CPU_RMAP=y -CONFIG_DQL=y -CONFIG_GLOB=y -# CONFIG_GLOB_SELFTEST is not set -CONFIG_NLATTR=y -CONFIG_LRU_CACHE=m -CONFIG_CLZ_TAB=y -CONFIG_IRQ_POLL=y -CONFIG_MPILIB=y -CONFIG_SIGNATURE=y -CONFIG_DIMLIB=y -CONFIG_OID_REGISTRY=y -CONFIG_UCS2_STRING=y -CONFIG_HAVE_GENERIC_VDSO=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_VDSO_TIME_NS=y -CONFIG_FONT_SUPPORT=y -# CONFIG_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y -CONFIG_SG_POOL=y -CONFIG_ARCH_HAS_PMEM_API=y -CONFIG_MEMREGION=y -CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y -CONFIG_ARCH_HAS_COPY_MC=y -CONFIG_ARCH_STACKWALK=y -CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set -# end of Library routines - -CONFIG_PLDMFW=y - -# -# Kernel hacking -# - -# -# printk and dmesg options -# -CONFIG_PRINTK_TIME=y -# CONFIG_PRINTK_CALLER is not set -CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 -CONFIG_CONSOLE_LOGLEVEL_QUIET=4 -CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 -# CONFIG_BOOT_PRINTK_DELAY is not set -# CONFIG_DYNAMIC_DEBUG is not set -# CONFIG_DYNAMIC_DEBUG_CORE is not set -CONFIG_SYMBOLIC_ERRNAME=y -CONFIG_DEBUG_BUGVERBOSE=y -# end of printk and dmesg options - -# -# Compile-time checks and compiler options -# -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_INFO_REDUCED is not set -# CONFIG_DEBUG_INFO_COMPRESSED is not set -CONFIG_DEBUG_INFO_SPLIT=y -# CONFIG_DEBUG_INFO_DWARF4 is not set -# CONFIG_GDB_SCRIPTS is not set -CONFIG_FRAME_WARN=1024 -# CONFIG_STRIP_ASM_SYMS is not set -# CONFIG_READABLE_ASM is not set -# CONFIG_HEADERS_INSTALL is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -# end of Compile-time checks and compiler options - -# -# Generic Kernel Debugging Instruments -# -CONFIG_MAGIC_SYSRQ=y -CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 -CONFIG_MAGIC_SYSRQ_SERIAL=y -CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_FS_ALLOW_ALL=y -# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set -# CONFIG_DEBUG_FS_ALLOW_NONE is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y -CONFIG_UBSAN=y -# CONFIG_UBSAN_TRAP is not set -CONFIG_CC_HAS_UBSAN_BOUNDS=y -CONFIG_UBSAN_BOUNDS=y -CONFIG_UBSAN_ONLY_BOUNDS=y -CONFIG_UBSAN_SHIFT=y -# CONFIG_UBSAN_DIV_ZERO is not set -CONFIG_UBSAN_SIGNED_OVERFLOW=y -CONFIG_UBSAN_BOOL=y -CONFIG_UBSAN_ENUM=y -# CONFIG_UBSAN_ALIGNMENT is not set -# CONFIG_UBSAN_SANITIZE_ALL is not set -# CONFIG_TEST_UBSAN is not set -CONFIG_HAVE_ARCH_KCSAN=y -# end of Generic Kernel Debugging Instruments - -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_MISC=y - -# -# Memory Debugging -# -CONFIG_PAGE_EXTENSION=y -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_PAGE_OWNER is not set -CONFIG_PAGE_POISONING=y -# CONFIG_DEBUG_PAGE_REF is not set -# CONFIG_DEBUG_RODATA_TEST is not set -CONFIG_ARCH_HAS_DEBUG_WX=y -# CONFIG_DEBUG_WX is not set -CONFIG_GENERIC_PTDUMP=y -# CONFIG_PTDUMP_DEBUGFS is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_DEBUG_SLAB is not set -CONFIG_HAVE_DEBUG_KMEMLEAK=y -# CONFIG_DEBUG_KMEMLEAK is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_SCHED_STACK_END_CHECK is not set -CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y -# CONFIG_DEBUG_VM is not set -# CONFIG_DEBUG_VM_PGTABLE is not set -CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y -# CONFIG_DEBUG_VIRTUAL is not set -CONFIG_DEBUG_MEMORY_INIT=y -# CONFIG_DEBUG_PER_CPU_MAPS is not set -CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y -# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set -CONFIG_HAVE_ARCH_KASAN=y -CONFIG_HAVE_ARCH_KASAN_VMALLOC=y -CONFIG_CC_HAS_KASAN_GENERIC=y -CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y -# CONFIG_KASAN is not set -# end of Memory Debugging - -# CONFIG_DEBUG_SHIRQ is not set - -# -# Debug Oops, Lockups and Hangs -# -CONFIG_PANIC_ON_OOPS=y -CONFIG_PANIC_ON_OOPS_VALUE=1 -CONFIG_PANIC_TIMEOUT=0 -CONFIG_LOCKUP_DETECTOR=y -CONFIG_SOFTLOCKUP_DETECTOR=y -# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 -CONFIG_HARDLOCKUP_DETECTOR_PERF=y -CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y -CONFIG_HARDLOCKUP_DETECTOR=y -# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 -CONFIG_DETECT_HUNG_TASK=y -CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 -# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 -CONFIG_WQ_WATCHDOG=y -# CONFIG_TEST_LOCKUP is not set -# end of Debug Oops, Lockups and Hangs - -# -# Scheduler Debugging -# -CONFIG_SCHED_DEBUG=y -CONFIG_SCHED_INFO=y -# CONFIG_SCHEDSTATS is not set -# end of Scheduler Debugging - -# CONFIG_DEBUG_TIMEKEEPING is not set - -# -# Lock Debugging (spinlocks, mutexes, etc...) -# -CONFIG_LOCK_DEBUGGING_SUPPORT=y -# CONFIG_PROVE_LOCKING is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_RWSEMS is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_WW_MUTEX_SELFTEST is not set -# CONFIG_SCF_TORTURE_TEST is not set -# CONFIG_CSD_LOCK_WAIT_DEBUG is not set -# end of Lock Debugging (spinlocks, mutexes, etc...) - -CONFIG_STACKTRACE=y -# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set -# CONFIG_DEBUG_KOBJECT is not set - -# -# Debug kernel data structures -# -CONFIG_DEBUG_LIST=y -# CONFIG_DEBUG_PLIST is not set -# CONFIG_DEBUG_SG is not set -CONFIG_DEBUG_NOTIFIERS=y -CONFIG_BUG_ON_DATA_CORRUPTION=y -# end of Debug kernel data structures - -CONFIG_DEBUG_CREDENTIALS=y - -# -# RCU Debugging -# -# CONFIG_RCU_SCALE_TEST is not set -# CONFIG_RCU_TORTURE_TEST is not set -# CONFIG_RCU_REF_SCALE_TEST is not set -CONFIG_RCU_CPU_STALL_TIMEOUT=60 -# CONFIG_RCU_TRACE is not set -# CONFIG_RCU_EQS_DEBUG is not set -# end of RCU Debugging - -# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set -# CONFIG_LATENCYTOP is not set -CONFIG_USER_STACKTRACE_SUPPORT=y -CONFIG_NOP_TRACER=y -CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y -CONFIG_HAVE_DYNAMIC_FTRACE=y -CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y -CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y -CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y -CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y -CONFIG_HAVE_SYSCALL_TRACEPOINTS=y -CONFIG_HAVE_FENTRY=y -CONFIG_HAVE_C_RECORDMCOUNT=y -CONFIG_TRACE_CLOCK=y -CONFIG_RING_BUFFER=y -CONFIG_EVENT_TRACING=y -CONFIG_CONTEXT_SWITCH_TRACER=y -CONFIG_RING_BUFFER_ALLOW_SWAP=y -CONFIG_TRACING=y -CONFIG_GENERIC_TRACER=y -CONFIG_TRACING_SUPPORT=y -CONFIG_FTRACE=y -# CONFIG_BOOTTIME_TRACING is not set -CONFIG_FUNCTION_TRACER=y -CONFIG_FUNCTION_GRAPH_TRACER=y -CONFIG_DYNAMIC_FTRACE=y -CONFIG_DYNAMIC_FTRACE_WITH_REGS=y -CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y -CONFIG_FUNCTION_PROFILER=y -CONFIG_STACK_TRACER=y -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_HWLAT_TRACER is not set -CONFIG_MMIOTRACE=y -CONFIG_FTRACE_SYSCALLS=y -# CONFIG_TRACER_SNAPSHOT is not set -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -CONFIG_BLK_DEV_IO_TRACE=y -CONFIG_KPROBE_EVENTS=y -# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set -CONFIG_UPROBE_EVENTS=y -CONFIG_BPF_EVENTS=y -CONFIG_DYNAMIC_EVENTS=y -CONFIG_PROBE_EVENTS=y -# CONFIG_BPF_KPROBE_OVERRIDE is not set -CONFIG_FTRACE_MCOUNT_RECORD=y -# CONFIG_SYNTH_EVENTS is not set -# CONFIG_HIST_TRIGGERS is not set -# CONFIG_TRACE_EVENT_INJECT is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -# CONFIG_FTRACE_RECORD_RECURSION is not set -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set -# CONFIG_MMIOTRACE_TEST is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_KPROBE_EVENT_GEN_TEST is not set -# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set -# CONFIG_SAMPLES is not set -CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y -CONFIG_STRICT_DEVMEM=y -CONFIG_IO_STRICT_DEVMEM=y - -# -# x86 Debugging -# -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y -CONFIG_X86_VERBOSE_BOOTUP=y -CONFIG_EARLY_PRINTK=y -# CONFIG_EARLY_PRINTK_DBGP is not set -# CONFIG_EARLY_PRINTK_USB_XDBC is not set -# CONFIG_EFI_PGT_DUMP is not set -# CONFIG_DEBUG_TLBFLUSH is not set -CONFIG_HAVE_MMIOTRACE_SUPPORT=y -# CONFIG_X86_DECODER_SELFTEST is not set -CONFIG_IO_DELAY_0X80=y -# CONFIG_IO_DELAY_0XED is not set -# CONFIG_IO_DELAY_UDELAY is not set -# CONFIG_IO_DELAY_NONE is not set -# CONFIG_DEBUG_BOOT_PARAMS is not set -# CONFIG_CPA_DEBUG is not set -# CONFIG_DEBUG_ENTRY is not set -# CONFIG_DEBUG_NMI_SELFTEST is not set -CONFIG_X86_DEBUG_FPU=y -# CONFIG_PUNIT_ATOM_DEBUG is not set -CONFIG_UNWINDER_ORC=y -# CONFIG_UNWINDER_FRAME_POINTER is not set -# CONFIG_UNWINDER_GUESS is not set -# end of x86 Debugging - -# -# Kernel Testing and Coverage -# -# CONFIG_KUNIT is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -CONFIG_FUNCTION_ERROR_INJECTION=y -# CONFIG_FAULT_INJECTION is not set -CONFIG_ARCH_HAS_KCOV=y -CONFIG_CC_HAS_SANCOV_TRACE_PC=y -# CONFIG_KCOV is not set -CONFIG_RUNTIME_TESTING_MENU=y -# CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set -# CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_SORT is not set -# CONFIG_KPROBES_SANITY_TEST is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_RBTREE_TEST is not set -# CONFIG_REED_SOLOMON_TEST is not set -# CONFIG_INTERVAL_TREE_TEST is not set -# CONFIG_PERCPU_TEST is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_TEST_HEXDUMP is not set -# CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_STRSCPY is not set -# CONFIG_TEST_KSTRTOX is not set -# CONFIG_TEST_PRINTF is not set -# CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_UUID is not set -# CONFIG_TEST_XARRAY is not set -# CONFIG_TEST_OVERFLOW is not set -# CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set -# CONFIG_TEST_IDA is not set -# CONFIG_TEST_LKM is not set -# CONFIG_TEST_BITOPS is not set -# CONFIG_TEST_VMALLOC is not set -# CONFIG_TEST_USER_COPY is not set -# CONFIG_TEST_BPF is not set -# CONFIG_TEST_BLACKHOLE_DEV is not set -# CONFIG_FIND_BIT_BENCHMARK is not set -# CONFIG_TEST_FIRMWARE is not set -# CONFIG_TEST_SYSCTL is not set -# CONFIG_TEST_UDELAY is not set -# CONFIG_TEST_STATIC_KEYS is not set -# CONFIG_TEST_KMOD is not set -# CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_STACKINIT is not set -# CONFIG_TEST_MEMINIT is not set -# CONFIG_TEST_FREE_PAGES is not set -# CONFIG_TEST_FPU is not set -# CONFIG_MEMTEST is not set -# CONFIG_HYPERV_TESTING is not set -# end of Kernel Testing and Coverage -# end of Kernel hacking diff --git a/kernel/config-5.11.x-x86_64-rt b/kernel/config-5.11.x-x86_64-rt deleted file mode 100644 index 3c833eb4b2..0000000000 --- a/kernel/config-5.11.x-x86_64-rt +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RWSEM_GENERIC_SPINLOCK=y -# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -CONFIG_PREEMPT_RCU=y -CONFIG_TASKS_RCU=y -CONFIG_SLUB_DEBUG=y -# CONFIG_SLUB_MEMCG_SYSFS_ON is not set -CONFIG_SLUB=y -# CONFIG_SLAB_FREELIST_HARDENED is not set -CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y -CONFIG_PREEMPT=y -CONFIG_PREEMPT_RT_BASE=y -CONFIG_HAVE_PREEMPT_LAZY=y -CONFIG_PREEMPT_LAZY=y -# CONFIG_PREEMPT_VOLUNTARY is not set -# CONFIG_PREEMPT__LL is not set -# CONFIG_PREEMPT_RTB is not set -CONFIG_PREEMPT_RT_FULL=y -CONFIG_PREEMPT_COUNT=y -# CONFIG_SLUB_DEBUG_ON is not set -# CONFIG_SLUB_STATS is not set -CONFIG_DEBUG_PREEMPT=y -# CONFIG_PREEMPT_TRACER is not set diff --git a/kernel/config-5.15.x-aarch64 b/kernel/config-5.15.x-aarch64 index 527045d99d..1d940a7832 100644 --- a/kernel/config-5.15.x-aarch64 +++ b/kernel/config-5.15.x-aarch64 @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.15.27 Kernel Configuration +# Linux/arm64 5.15.110 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (Alpine 10.2.1_pre1) 10.2.1 20201203" CONFIG_CC_IS_GCC=y @@ -16,6 +16,7 @@ CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -349,10 +350,13 @@ CONFIG_ARM64_ERRATUM_1165522=y CONFIG_ARM64_ERRATUM_1319367=y CONFIG_ARM64_ERRATUM_1530923=y CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y +CONFIG_ARM64_ERRATUM_2441007=y CONFIG_ARM64_ERRATUM_1286807=y CONFIG_ARM64_ERRATUM_1463225=y CONFIG_ARM64_ERRATUM_1542419=y CONFIG_ARM64_ERRATUM_1508412=y +CONFIG_ARM64_ERRATUM_2441009=y +CONFIG_ARM64_ERRATUM_2457168=y CONFIG_CAVIUM_ERRATUM_22375=y CONFIG_CAVIUM_ERRATUM_23154=y CONFIG_CAVIUM_ERRATUM_27456=y @@ -391,7 +395,6 @@ CONFIG_HZ=1000 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_HW_PERF_EVENTS=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y CONFIG_PARAVIRT=y # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_KEXEC_FILE is not set @@ -400,6 +403,7 @@ CONFIG_XEN_DOM0=y CONFIG_XEN=y CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set CONFIG_ARM64_TAGGED_ADDR_ABI=y @@ -448,7 +452,6 @@ CONFIG_ARM64_TLB_RANGE=y # CONFIG_AS_HAS_ARMV8_5=y CONFIG_ARM64_BTI=y -CONFIG_ARM64_BTI_KERNEL=y CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y CONFIG_ARM64_E0PD=y CONFIG_ARCH_RANDOM=y @@ -637,6 +640,7 @@ CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -704,7 +708,6 @@ CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_RELR=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y -CONFIG_HAVE_ARCH_PFN_VALID=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y # @@ -944,6 +947,7 @@ CONFIG_INET_ESP=m # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set CONFIG_INET_IPCOMP=m +CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_XFRM_TUNNEL=m CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y @@ -1409,7 +1413,6 @@ CONFIG_NET_SCH_INGRESS=m # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y -CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y @@ -1698,7 +1701,6 @@ CONFIG_VEXPRESS_CONFIG=y # end of ARM System Control and Management Interface Protocol # CONFIG_ARM_SCPI_PROTOCOL is not set -# CONFIG_ARM_SDE_INTERFACE is not set CONFIG_FIRMWARE_MEMMAP=y CONFIG_DMIID=y CONFIG_DMI_SYSFS=y @@ -2162,7 +2164,6 @@ CONFIG_BNXT=m CONFIG_BNXT_SRIOV=y CONFIG_BNXT_FLOWER_OFFLOAD=y CONFIG_BNXT_HWMON=y -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set CONFIG_NET_VENDOR_CAVIUM=y CONFIG_THUNDER_NIC_PF=m @@ -2213,7 +2214,6 @@ CONFIG_I40EVF=m CONFIG_ICE=m # CONFIG_FM10K is not set # CONFIG_IGC is not set -CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_JME is not set CONFIG_NET_VENDOR_LITEX=y # CONFIG_LITEX_LITEETH is not set @@ -2243,8 +2243,10 @@ CONFIG_MLX5_SW_STEERING=y # CONFIG_NET_VENDOR_MICROCHIP is not set CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_MSCC_OCELOT_SWITCH is not set +CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set CONFIG_NET_VENDOR_NETRONOME=y @@ -2252,7 +2254,6 @@ CONFIG_NFP=m CONFIG_NFP_APP_FLOWER=y CONFIG_NFP_APP_ABM_NIC=y # CONFIG_NFP_DEBUG is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set @@ -2260,6 +2261,7 @@ CONFIG_NFP_APP_ABM_NIC=y CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_IONIC is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set CONFIG_NET_VENDOR_REALTEK=y @@ -2270,9 +2272,9 @@ CONFIG_8139CP=m # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set CONFIG_NET_VENDOR_SOCIONEXT=y # CONFIG_SNI_NETSEC is not set @@ -2588,7 +2590,6 @@ CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set -# CONFIG_SERIAL_8250_ASPEED_VUART is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set @@ -4107,7 +4108,6 @@ CONFIG_EXTCON=y # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set # CONFIG_EXTCON_USB_GPIO is not set -# CONFIG_EXTCON_USBC_TUSB320 is not set # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set @@ -4588,7 +4588,6 @@ CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y CONFIG_INTEGRITY_AUDIT=y CONFIG_IMA=y CONFIG_IMA_MEASURE_PCR_IDX=10 -# CONFIG_IMA_TEMPLATE is not set CONFIG_IMA_NG_TEMPLATE=y # CONFIG_IMA_SIG_TEMPLATE is not set CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng" @@ -4724,7 +4723,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_POLY1305=y @@ -4793,26 +4791,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m -CONFIG_CRYPTO_LIB_BLAKE2S=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y -CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m -CONFIG_CRYPTO_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m -CONFIG_CRYPTO_LIB_SHA256=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_FSL_CAAM is not set # CONFIG_CRYPTO_DEV_EXYNOS_RNG is not set @@ -4879,6 +4857,28 @@ CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_INDIRECT_PIO is not set + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y @@ -5001,6 +5001,8 @@ CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options +CONFIG_AS_HAS_NON_CONST_LEB128=y + # # Compile-time checks and compiler options # diff --git a/kernel/config-5.15.x-x86_64 b/kernel/config-5.15.x-x86_64 index 43539b72bb..c63bb55d31 100644 --- a/kernel/config-5.15.x-x86_64 +++ b/kernel/config-5.15.x-x86_64 @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.15.27 Kernel Configuration +# Linux/x86 5.15.110 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (Alpine 10.2.1_pre1) 10.2.1 20201203" CONFIG_CC_IS_GCC=y @@ -16,6 +16,7 @@ CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -320,7 +321,6 @@ CONFIG_X86_FEATURE_NAMES=y CONFIG_X86_X2APIC=y CONFIG_X86_MPPARSE=y # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -405,7 +405,7 @@ CONFIG_X86_IOPL_IOPERM=y CONFIG_MICROCODE=y CONFIG_MICROCODE_INTEL=y CONFIG_MICROCODE_AMD=y -CONFIG_MICROCODE_OLD_INTERFACE=y +# CONFIG_MICROCODE_LATE_LOADING is not set CONFIG_X86_MSR=y CONFIG_X86_CPUID=y # CONFIG_X86_5LEVEL is not set @@ -467,6 +467,14 @@ CONFIG_LEGACY_VSYSCALL_NONE=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_UNRET_ENTRY=y +CONFIG_CPU_IBPB_ENTRY=y +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y @@ -663,6 +671,7 @@ CONFIG_HAVE_KPROBES_ON_FTRACE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -1009,6 +1018,7 @@ CONFIG_INET_ESP=m # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set CONFIG_INET_IPCOMP=m +CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_XFRM_TUNNEL=m CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y @@ -1475,7 +1485,6 @@ CONFIG_NET_SCH_INGRESS=m # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y -CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y @@ -2170,6 +2179,7 @@ CONFIG_ENA_ETHERNET=m # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_CX_ECAT is not set CONFIG_NET_VENDOR_BROADCOM=y # CONFIG_B44 is not set # CONFIG_BCMGENET is not set @@ -2184,13 +2194,11 @@ CONFIG_BNXT=m CONFIG_BNXT_SRIOV=y CONFIG_BNXT_FLOWER_OFFLOAD=y CONFIG_BNXT_HWMON=y -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set @@ -2218,7 +2226,6 @@ CONFIG_I40EVF=m CONFIG_ICE=m # CONFIG_FM10K is not set # CONFIG_IGC is not set -CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_JME is not set CONFIG_NET_VENDOR_LITEX=y # CONFIG_NET_VENDOR_MARVELL is not set @@ -2245,8 +2252,10 @@ CONFIG_MLX5_SW_STEERING=y # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set CONFIG_NET_VENDOR_NETRONOME=y @@ -2254,7 +2263,6 @@ CONFIG_NFP=m CONFIG_NFP_APP_FLOWER=y CONFIG_NFP_APP_ABM_NIC=y # CONFIG_NFP_DEBUG is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set @@ -2262,6 +2270,7 @@ CONFIG_NFP_APP_ABM_NIC=y CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_IONIC is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set CONFIG_NET_VENDOR_REALTEK=y @@ -2272,11 +2281,11 @@ CONFIG_8139CP=m # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set -# CONFIG_NET_VENDOR_SILAN is not set -# CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set @@ -3632,6 +3641,7 @@ CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_SYSTEM76_ACPI is not set # CONFIG_TOPSTAR_LAPTOP is not set # CONFIG_I2C_MULTI_INSTANTIATE is not set +# CONFIG_MLX_PLATFORM is not set CONFIG_INTEL_IPS=y # CONFIG_INTEL_SCU_PCI is not set # CONFIG_INTEL_SCU_PLATFORM is not set @@ -4141,7 +4151,6 @@ CONFIG_SECURITY_DMESG_RESTRICT=y CONFIG_SECURITY=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y -CONFIG_PAGE_TABLE_ISOLATION=y CONFIG_SECURITY_NETWORK_XFRM=y CONFIG_SECURITY_PATH=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y @@ -4166,7 +4175,6 @@ CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y CONFIG_INTEGRITY_AUDIT=y CONFIG_IMA=y CONFIG_IMA_MEASURE_PCR_IDX=10 -# CONFIG_IMA_TEMPLATE is not set CONFIG_IMA_NG_TEMPLATE=y # CONFIG_IMA_SIG_TEMPLATE is not set CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng" @@ -4308,8 +4316,7 @@ CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_CRC32_PCLMUL=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set -CONFIG_CRYPTO_BLAKE2S_X86=m +CONFIG_CRYPTO_BLAKE2S_X86=y CONFIG_CRYPTO_CRCT10DIF=y # CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set CONFIG_CRYPTO_GHASH=y @@ -4401,28 +4408,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=m -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m -CONFIG_CRYPTO_LIB_BLAKE2S=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y -CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m -CONFIG_CRYPTO_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m -CONFIG_CRYPTO_LIB_SHA256=y CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_DEV_PADLOCK=y CONFIG_CRYPTO_DEV_PADLOCK_AES=y @@ -4476,6 +4461,30 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y @@ -4587,6 +4596,8 @@ CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options +CONFIG_AS_HAS_NON_CONST_LEB128=y + # # Compile-time checks and compiler options # @@ -4837,7 +4848,6 @@ CONFIG_IO_STRICT_DEVMEM=y # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_X86_VERBOSE_BOOTUP=y CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set diff --git a/kernel/config-5.4.x-x86_64 b/kernel/config-5.4.x-x86_64 index 27abcf8fcb..84b2ca13db 100644 --- a/kernel/config-5.4.x-x86_64 +++ b/kernel/config-5.4.x-x86_64 @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.4.172 Kernel Configuration +# Linux/x86 5.4.242 Kernel Configuration # # @@ -217,6 +217,7 @@ CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT_ALWAYS_ON=y +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set # CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_RSEQ=y @@ -742,8 +743,6 @@ CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y -CONFIG_ARCH_HAS_REFCOUNT=y -CONFIG_REFCOUNT_FULL=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set @@ -982,6 +981,7 @@ CONFIG_INET_AH=m CONFIG_INET_ESP=m # CONFIG_INET_ESP_OFFLOAD is not set CONFIG_INET_IPCOMP=m +CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_XFRM_TUNNEL=m CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y @@ -1442,7 +1442,6 @@ CONFIG_NET_SCH_INGRESS=m # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y -CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y @@ -2328,7 +2327,6 @@ CONFIG_HYPERV_NET=y # CONFIG_NETDEVSIM is not set CONFIG_NET_FAILOVER=y # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support @@ -2520,10 +2518,9 @@ CONFIG_TCG_TIS_ST33ZP24_I2C=m # CONFIG_TELCLOCK is not set CONFIG_DEVPORT=y # CONFIG_XILLYBUS is not set -# end of Character devices - # CONFIG_RANDOM_TRUST_CPU is not set # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -4004,7 +4001,6 @@ CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y CONFIG_INTEGRITY_AUDIT=y CONFIG_IMA=y CONFIG_IMA_MEASURE_PCR_IDX=10 -# CONFIG_IMA_TEMPLATE is not set CONFIG_IMA_NG_TEMPLATE=y # CONFIG_IMA_SIG_TEMPLATE is not set CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng" diff --git a/kernel/patches-5.10.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch b/kernel/patches-5.10.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch deleted file mode 100644 index 9307744a8a..0000000000 --- a/kernel/patches-5.10.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 3635a8090f2271103511b68a5853b1d7e0a925b5 Mon Sep 17 00:00:00 2001 -From: Matt Redfearn -Date: Wed, 3 Jan 2018 09:57:30 +0000 -Subject: [PATCH] include/uapi/linux/swab: Fix potentially missing - __always_inline -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Commit bc27fb68aaad ("include/uapi/linux/byteorder, swab: force inlining -of some byteswap operations") added __always_inline to swab functions -and commit 283d75737837 ("uapi/linux/stddef.h: Provide __always_inline to -userspace headers") added a definition of __always_inline for use in -exported headers when the kernel's compiler.h is not available. - -However, since swab.h does not include stddef.h, if the header soup does -not indirectly include it, the definition of __always_inline is missing, -resulting in a compilation failure, which was observed compiling the -perf tool using exported headers containing this commit: - -In file included from /usr/include/linux/byteorder/little_endian.h:12:0, - from /usr/include/asm/byteorder.h:14, - from tools/include/uapi/linux/perf_event.h:20, - from perf.h:8, - from builtin-bench.c:18: -/usr/include/linux/swab.h:160:8: error: unknown type name ‘__always_inline’ - static __always_inline __u16 __swab16p(const __u16 *p) - -Fix this by replacing the inclusion of linux/compiler.h with -linux/stddef.h to ensure that we pick up that definition if required, -without relying on it's indirect inclusion. compiler.h is then included -indirectly, via stddef.h. - -Fixes: 283d75737837 ("uapi/linux/stddef.h: Provide __always_inline to userspace headers") -Signed-off-by: Matt Redfearn ---- - include/uapi/linux/swab.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/include/uapi/linux/swab.h b/include/uapi/linux/swab.h -index 7272f85d6d6a..3736f2fe1541 100644 ---- a/include/uapi/linux/swab.h -+++ b/include/uapi/linux/swab.h -@@ -3,7 +3,7 @@ - #define _UAPI_LINUX_SWAB_H - - #include --#include -+#include - #include - #include - --- -2.26.2 - diff --git a/kernel/patches-5.11.x-rt/0001-highmem-Don-t-disable-preemption-on-RT-in-kmap_atomi.patch b/kernel/patches-5.11.x-rt/0001-highmem-Don-t-disable-preemption-on-RT-in-kmap_atomi.patch deleted file mode 100644 index ae076a2989..0000000000 --- a/kernel/patches-5.11.x-rt/0001-highmem-Don-t-disable-preemption-on-RT-in-kmap_atomi.patch +++ /dev/null @@ -1,77 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 30 Oct 2020 13:59:06 +0100 -Subject: [PATCH] highmem: Don't disable preemption on RT in kmap_atomic() - -Disabling preemption makes it impossible to acquire sleeping locks within -kmap_atomic() section. -For PREEMPT_RT it is sufficient to disable migration. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/highmem-internal.h | 27 ++++++++++++++++++++++----- - 1 file changed, 22 insertions(+), 5 deletions(-) - ---- a/include/linux/highmem-internal.h -+++ b/include/linux/highmem-internal.h -@@ -90,7 +90,11 @@ static inline void __kunmap_local(void * - - static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) - { -- preempt_disable(); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ migrate_disable(); -+ else -+ preempt_disable(); -+ - pagefault_disable(); - return __kmap_local_page_prot(page, prot); - } -@@ -102,7 +106,11 @@ static inline void *kmap_atomic(struct p - - static inline void *kmap_atomic_pfn(unsigned long pfn) - { -- preempt_disable(); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ migrate_disable(); -+ else -+ preempt_disable(); -+ - pagefault_disable(); - return __kmap_local_pfn_prot(pfn, kmap_prot); - } -@@ -111,7 +119,10 @@ static inline void __kunmap_atomic(void - { - kunmap_local_indexed(addr); - pagefault_enable(); -- preempt_enable(); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ migrate_enable(); -+ else -+ preempt_enable(); - } - - unsigned int __nr_free_highpages(void); -@@ -184,7 +195,10 @@ static inline void __kunmap_local(void * - - static inline void *kmap_atomic(struct page *page) - { -- preempt_disable(); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ migrate_disable(); -+ else -+ preempt_disable(); - pagefault_disable(); - return page_address(page); - } -@@ -205,7 +219,10 @@ static inline void __kunmap_atomic(void - kunmap_flush_on_unmap(addr); - #endif - pagefault_enable(); -- preempt_enable(); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ migrate_enable(); -+ else -+ preempt_enable(); - } - - static inline unsigned int nr_free_highpages(void) { return 0; } diff --git a/kernel/patches-5.11.x-rt/0002-timers-Move-clearing-of-base-timer_running-under-bas.patch b/kernel/patches-5.11.x-rt/0002-timers-Move-clearing-of-base-timer_running-under-bas.patch deleted file mode 100644 index 9faa964b55..0000000000 --- a/kernel/patches-5.11.x-rt/0002-timers-Move-clearing-of-base-timer_running-under-bas.patch +++ /dev/null @@ -1,55 +0,0 @@ -From: Thomas Gleixner -Date: Sun, 6 Dec 2020 22:40:07 +0100 -Subject: [PATCH] timers: Move clearing of base::timer_running under base::lock - -syzbot reported KCSAN data races vs. timer_base::timer_running being set to -NULL without holding base::lock in expire_timers(). - -This looks innocent and most reads are clearly not problematic but for a -non-RT kernel it's completely irrelevant whether the store happens before -or after taking the lock. For an RT kernel moving the store under the lock -requires an extra unlock/lock pair in the case that there is a waiter for -the timer. But that's not the end of the world and definitely not worth the -trouble of adding boatloads of comments and annotations to the code. Famous -last words... - -Reported-by: syzbot+aa7c2385d46c5eba0b89@syzkaller.appspotmail.com -Reported-by: syzbot+abea4558531bae1ba9fe@syzkaller.appspotmail.com -Link: https://lkml.kernel.org/r/87lfea7gw8.fsf@nanos.tec.linutronix.de -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior -Cc: stable-rt@vger.kernel.org ---- - kernel/time/timer.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - ---- a/kernel/time/timer.c -+++ b/kernel/time/timer.c -@@ -1263,8 +1263,10 @@ static inline void timer_base_unlock_exp - static void timer_sync_wait_running(struct timer_base *base) - { - if (atomic_read(&base->timer_waiters)) { -+ raw_spin_unlock_irq(&base->lock); - spin_unlock(&base->expiry_lock); - spin_lock(&base->expiry_lock); -+ raw_spin_lock_irq(&base->lock); - } - } - -@@ -1455,14 +1457,14 @@ static void expire_timers(struct timer_b - if (timer->flags & TIMER_IRQSAFE) { - raw_spin_unlock(&base->lock); - call_timer_fn(timer, fn, baseclk); -- base->running_timer = NULL; - raw_spin_lock(&base->lock); -+ base->running_timer = NULL; - } else { - raw_spin_unlock_irq(&base->lock); - call_timer_fn(timer, fn, baseclk); -+ raw_spin_lock_irq(&base->lock); - base->running_timer = NULL; - timer_sync_wait_running(base); -- raw_spin_lock_irq(&base->lock); - } - } - } diff --git a/kernel/patches-5.11.x-rt/0003-0001-mm-zswap-add-a-flag-to-indicate-if-zpool-can-do-slee.patch b/kernel/patches-5.11.x-rt/0003-0001-mm-zswap-add-a-flag-to-indicate-if-zpool-can-do-slee.patch deleted file mode 100644 index 649f059e7f..0000000000 --- a/kernel/patches-5.11.x-rt/0003-0001-mm-zswap-add-a-flag-to-indicate-if-zpool-can-do-slee.patch +++ /dev/null @@ -1,245 +0,0 @@ -From: Tian Tao -Date: Sat, 13 Feb 2021 20:58:30 +1300 -Subject: [PATCH 1/2] mm/zswap: add a flag to indicate if zpool can do sleep - map - -Patch series "Fix the compatibility of zsmalloc and zswap". - -The compatibility of zsmalloc and zswap was broken by commit 1ec3b5fe6eec -("mm/zswap: move to use crypto_acomp API for hardware acceleration"). - -Patch #1 adds a flag to zpool, then zswap used it to determine if zpool -drivers such as zbud/z3fold/zsmalloc will enter an atomic context after -mapping. - -The difference between zbud/z3fold and zsmalloc is that zsmalloc requires -an atomic context that since its map function holds a preempt-disabled -lock, but zbud/z3fold don't require an atomic context. So patch #2 sets -flag sleep_mapped to true indicating that zbud/z3fold can sleep after -mapping. zsmalloc didn't support sleep after mapping, so don't set that -flag to true. - -This patch (of 2): - -Add a flag to zpool, named as "sleep_mapped", and have it set true for -zbud/z3fold, not set this flag for zsmalloc, so its default value is -false. Then zswap could go the current path if the flag is true; and if -it's false, copy data from src to a temporary buffer, then unmap the -handle, take the mutex, process the buffer instead of src to avoid -sleeping function called from atomic context. - -[natechancellor@gmail.com: add return value in zswap_frontswap_load] - Link: https://lkml.kernel.org/r/20210121214804.926843-1-natechancellor@gmail.com -[tiantao6@hisilicon.com: fix potential memory leak] - Link: https://lkml.kernel.org/r/1611538365-51811-1-git-send-email-tiantao6@hisilicon.com -[colin.king@canonical.com: fix potential uninitialized pointer read on tmp] - Link: https://lkml.kernel.org/r/20210128141728.639030-1-colin.king@canonical.com -[tiantao6@hisilicon.com: fix variable 'entry' is uninitialized when used] - Link: https://lkml.kernel.org/r/1611223030-58346-1-git-send-email-tiantao6@hisilicon.com - Link: https://lkml.kernel.org/r/1611035683-12732-1-git-send-email-tiantao6@hisilicon.com - Link: https://lkml.kernel.org/r/1611035683-12732-2-git-send-email-tiantao6@hisilicon.com -[song.bao.hua@hisilicon.com: Rewrote changelog] -Fixes: 1ec3b5fe6e ("mm/zswap: move to use crypto_acomp API for hardware acceleration") -Signed-off-by: Tian Tao -Signed-off-by: Nathan Chancellor -Signed-off-by: Colin Ian King -Reviewed-by: Vitaly Wool -Acked-by: Sebastian Andrzej Siewior -Reported-by: Mike Galbraith -Cc: Dan Streetman -Cc: Seth Jennings -Cc: Dan Carpenter -Signed-off-by: Andrew Morton -Signed-off-by: Barry Song -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/zpool.h | 3 ++ - mm/zpool.c | 13 ++++++++++++ - mm/zswap.c | 51 +++++++++++++++++++++++++++++++++++++++++++++----- - 3 files changed, 62 insertions(+), 5 deletions(-) - ---- a/include/linux/zpool.h -+++ b/include/linux/zpool.h -@@ -73,6 +73,7 @@ u64 zpool_get_total_size(struct zpool *p - * @malloc: allocate mem from a pool. - * @free: free mem from a pool. - * @shrink: shrink the pool. -+ * @sleep_mapped: whether zpool driver can sleep during map. - * @map: map a handle. - * @unmap: unmap a handle. - * @total_size: get total size of a pool. -@@ -100,6 +101,7 @@ struct zpool_driver { - int (*shrink)(void *pool, unsigned int pages, - unsigned int *reclaimed); - -+ bool sleep_mapped; - void *(*map)(void *pool, unsigned long handle, - enum zpool_mapmode mm); - void (*unmap)(void *pool, unsigned long handle); -@@ -112,5 +114,6 @@ void zpool_register_driver(struct zpool_ - int zpool_unregister_driver(struct zpool_driver *driver); - - bool zpool_evictable(struct zpool *pool); -+bool zpool_can_sleep_mapped(struct zpool *pool); - - #endif ---- a/mm/zpool.c -+++ b/mm/zpool.c -@@ -23,6 +23,7 @@ struct zpool { - void *pool; - const struct zpool_ops *ops; - bool evictable; -+ bool can_sleep_mapped; - - struct list_head list; - }; -@@ -183,6 +184,7 @@ struct zpool *zpool_create_pool(const ch - zpool->pool = driver->create(name, gfp, ops, zpool); - zpool->ops = ops; - zpool->evictable = driver->shrink && ops && ops->evict; -+ zpool->can_sleep_mapped = driver->sleep_mapped; - - if (!zpool->pool) { - pr_err("couldn't create %s pool\n", type); -@@ -393,6 +395,17 @@ bool zpool_evictable(struct zpool *zpool - return zpool->evictable; - } - -+/** -+ * zpool_can_sleep_mapped - Test if zpool can sleep when do mapped. -+ * @zpool: The zpool to test -+ * -+ * Returns: true if zpool can sleep; false otherwise. -+ */ -+bool zpool_can_sleep_mapped(struct zpool *zpool) -+{ -+ return zpool->can_sleep_mapped; -+} -+ - MODULE_LICENSE("GPL"); - MODULE_AUTHOR("Dan Streetman "); - MODULE_DESCRIPTION("Common API for compressed memory storage"); ---- a/mm/zswap.c -+++ b/mm/zswap.c -@@ -935,13 +935,19 @@ static int zswap_writeback_entry(struct - struct scatterlist input, output; - struct crypto_acomp_ctx *acomp_ctx; - -- u8 *src; -+ u8 *src, *tmp = NULL; - unsigned int dlen; - int ret; - struct writeback_control wbc = { - .sync_mode = WB_SYNC_NONE, - }; - -+ if (!zpool_can_sleep_mapped(pool)) { -+ tmp = kmalloc(PAGE_SIZE, GFP_ATOMIC); -+ if (!tmp) -+ return -ENOMEM; -+ } -+ - /* extract swpentry from data */ - zhdr = zpool_map_handle(pool, handle, ZPOOL_MM_RO); - swpentry = zhdr->swpentry; /* here */ -@@ -955,6 +961,7 @@ static int zswap_writeback_entry(struct - /* entry was invalidated */ - spin_unlock(&tree->lock); - zpool_unmap_handle(pool, handle); -+ kfree(tmp); - return 0; - } - spin_unlock(&tree->lock); -@@ -979,6 +986,14 @@ static int zswap_writeback_entry(struct - dlen = PAGE_SIZE; - src = (u8 *)zhdr + sizeof(struct zswap_header); - -+ if (!zpool_can_sleep_mapped(pool)) { -+ -+ memcpy(tmp, src, entry->length); -+ src = tmp; -+ -+ zpool_unmap_handle(pool, handle); -+ } -+ - mutex_lock(acomp_ctx->mutex); - sg_init_one(&input, src, entry->length); - sg_init_table(&output, 1); -@@ -1033,7 +1048,11 @@ static int zswap_writeback_entry(struct - spin_unlock(&tree->lock); - - end: -- zpool_unmap_handle(pool, handle); -+ if (zpool_can_sleep_mapped(pool)) -+ zpool_unmap_handle(pool, handle); -+ else -+ kfree(tmp); -+ - return ret; - } - -@@ -1235,7 +1254,7 @@ static int zswap_frontswap_load(unsigned - struct zswap_entry *entry; - struct scatterlist input, output; - struct crypto_acomp_ctx *acomp_ctx; -- u8 *src, *dst; -+ u8 *src, *dst, *tmp; - unsigned int dlen; - int ret; - -@@ -1253,15 +1272,33 @@ static int zswap_frontswap_load(unsigned - dst = kmap_atomic(page); - zswap_fill_page(dst, entry->value); - kunmap_atomic(dst); -+ ret = 0; - goto freeentry; - } - -+ if (!zpool_can_sleep_mapped(entry->pool->zpool)) { -+ -+ tmp = kmalloc(entry->length, GFP_ATOMIC); -+ if (!tmp) { -+ ret = -ENOMEM; -+ goto freeentry; -+ } -+ } -+ - /* decompress */ - dlen = PAGE_SIZE; - src = zpool_map_handle(entry->pool->zpool, entry->handle, ZPOOL_MM_RO); - if (zpool_evictable(entry->pool->zpool)) - src += sizeof(struct zswap_header); - -+ if (!zpool_can_sleep_mapped(entry->pool->zpool)) { -+ -+ memcpy(tmp, src, entry->length); -+ src = tmp; -+ -+ zpool_unmap_handle(entry->pool->zpool, entry->handle); -+ } -+ - acomp_ctx = raw_cpu_ptr(entry->pool->acomp_ctx); - mutex_lock(acomp_ctx->mutex); - sg_init_one(&input, src, entry->length); -@@ -1271,7 +1308,11 @@ static int zswap_frontswap_load(unsigned - ret = crypto_wait_req(crypto_acomp_decompress(acomp_ctx->req), &acomp_ctx->wait); - mutex_unlock(acomp_ctx->mutex); - -- zpool_unmap_handle(entry->pool->zpool, entry->handle); -+ if (zpool_can_sleep_mapped(entry->pool->zpool)) -+ zpool_unmap_handle(entry->pool->zpool, entry->handle); -+ else -+ kfree(tmp); -+ - BUG_ON(ret); - - freeentry: -@@ -1279,7 +1320,7 @@ static int zswap_frontswap_load(unsigned - zswap_entry_put(tree, entry); - spin_unlock(&tree->lock); - -- return 0; -+ return ret; - } - - /* frees an entry in zswap */ diff --git a/kernel/patches-5.11.x-rt/0004-0002-mm-set-the-sleep_mapped-to-true-for-zbud-and-z3fold.patch b/kernel/patches-5.11.x-rt/0004-0002-mm-set-the-sleep_mapped-to-true-for-zbud-and-z3fold.patch deleted file mode 100644 index 854759720c..0000000000 --- a/kernel/patches-5.11.x-rt/0004-0002-mm-set-the-sleep_mapped-to-true-for-zbud-and-z3fold.patch +++ /dev/null @@ -1,45 +0,0 @@ -From: Tian Tao -Date: Sat, 13 Feb 2021 20:58:31 +1300 -Subject: [PATCH 2/2] mm: set the sleep_mapped to true for zbud and z3fold - -zpool driver adds a flag to indicate whether the zpool driver can enter -an atomic context after mapping. This patch sets it true for z3fold and -zbud. - -Link: https://lkml.kernel.org/r/1611035683-12732-3-git-send-email-tiantao6@hisilicon.com -[song.bao.hua@hisilicon.com: Rewrote changelog] -Fixes: 1ec3b5fe6e ("mm/zswap: move to use crypto_acomp API for hardware acceleration") -Signed-off-by: Tian Tao -Reviewed-by: Vitaly Wool -Acked-by: Sebastian Andrzej Siewior -Reported-by: Mike Galbraith -Cc: Seth Jennings -Cc: Dan Streetman -Signed-off-by: Andrew Morton -Signed-off-by: Barry Song -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/z3fold.c | 1 + - mm/zbud.c | 1 + - 2 files changed, 2 insertions(+) - ---- a/mm/z3fold.c -+++ b/mm/z3fold.c -@@ -1778,6 +1778,7 @@ static u64 z3fold_zpool_total_size(void - - static struct zpool_driver z3fold_zpool_driver = { - .type = "z3fold", -+ .sleep_mapped = true, - .owner = THIS_MODULE, - .create = z3fold_zpool_create, - .destroy = z3fold_zpool_destroy, ---- a/mm/zbud.c -+++ b/mm/zbud.c -@@ -203,6 +203,7 @@ static u64 zbud_zpool_total_size(void *p - - static struct zpool_driver zbud_zpool_driver = { - .type = "zbud", -+ .sleep_mapped = true, - .owner = THIS_MODULE, - .create = zbud_zpool_create, - .destroy = zbud_zpool_destroy, diff --git a/kernel/patches-5.11.x-rt/0005-blk-mq-Always-complete-remote-completions-requests-i.patch b/kernel/patches-5.11.x-rt/0005-blk-mq-Always-complete-remote-completions-requests-i.patch deleted file mode 100644 index ded9e46209..0000000000 --- a/kernel/patches-5.11.x-rt/0005-blk-mq-Always-complete-remote-completions-requests-i.patch +++ /dev/null @@ -1,42 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Sat, 23 Jan 2021 21:10:26 +0100 -Subject: [PATCH] blk-mq: Always complete remote completions requests in - softirq - -Controllers with multiple queues have their IRQ-handelers pinned to a -CPU. The core shouldn't need to complete the request on a remote CPU. - -Remove this case and always raise the softirq to complete the request. - -Reviewed-by: Christoph Hellwig -Reviewed-by: Daniel Wagner -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Jens Axboe -Signed-off-by: Sebastian Andrzej Siewior ---- - block/blk-mq.c | 14 +------------- - 1 file changed, 1 insertion(+), 13 deletions(-) - ---- a/block/blk-mq.c -+++ b/block/blk-mq.c -@@ -628,19 +628,7 @@ static void __blk_mq_complete_request_re - { - struct request *rq = data; - -- /* -- * For most of single queue controllers, there is only one irq vector -- * for handling I/O completion, and the only irq's affinity is set -- * to all possible CPUs. On most of ARCHs, this affinity means the irq -- * is handled on one specific CPU. -- * -- * So complete I/O requests in softirq context in case of single queue -- * devices to avoid degrading I/O performance due to irqsoff latency. -- */ -- if (rq->q->nr_hw_queues == 1) -- blk_mq_trigger_softirq(rq); -- else -- rq->q->mq_ops->complete(rq); -+ blk_mq_trigger_softirq(rq); - } - - static inline bool blk_mq_complete_need_ipi(struct request *rq) diff --git a/kernel/patches-5.11.x-rt/0006-blk-mq-Use-llist_head-for-blk_cpu_done.patch b/kernel/patches-5.11.x-rt/0006-blk-mq-Use-llist_head-for-blk_cpu_done.patch deleted file mode 100644 index ab914c8516..0000000000 --- a/kernel/patches-5.11.x-rt/0006-blk-mq-Use-llist_head-for-blk_cpu_done.patch +++ /dev/null @@ -1,188 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Sat, 23 Jan 2021 21:10:27 +0100 -Subject: [PATCH] blk-mq: Use llist_head for blk_cpu_done - -With llist_head it is possible to avoid the locking (the irq-off region) -when items are added. This makes it possible to add items on a remote -CPU without additional locking. -llist_add() returns true if the list was previously empty. This can be -used to invoke the SMP function call / raise sofirq only if the first -item was added (otherwise it is already pending). -This simplifies the code a little and reduces the IRQ-off regions. - -blk_mq_raise_softirq() needs a preempt-disable section to ensure the -request is enqueued on the same CPU as the softirq is raised. -Some callers (USB-storage) invoke this path in preemptible context. - -Reviewed-by: Christoph Hellwig -Reviewed-by: Daniel Wagner -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Jens Axboe -Signed-off-by: Sebastian Andrzej Siewior ---- - block/blk-mq.c | 97 ++++++++++++++++++++----------------------------- - include/linux/blkdev.h | 2 - - 2 files changed, 42 insertions(+), 57 deletions(-) - ---- a/block/blk-mq.c -+++ b/block/blk-mq.c -@@ -41,7 +41,7 @@ - #include "blk-mq-sched.h" - #include "blk-rq-qos.h" - --static DEFINE_PER_CPU(struct list_head, blk_cpu_done); -+static DEFINE_PER_CPU(struct llist_head, blk_cpu_done); - - static void blk_mq_poll_stats_start(struct request_queue *q); - static void blk_mq_poll_stats_fn(struct blk_stat_callback *cb); -@@ -567,68 +567,29 @@ void blk_mq_end_request(struct request * - } - EXPORT_SYMBOL(blk_mq_end_request); - --/* -- * Softirq action handler - move entries to local list and loop over them -- * while passing them to the queue registered handler. -- */ --static __latent_entropy void blk_done_softirq(struct softirq_action *h) -+static void blk_complete_reqs(struct llist_head *list) - { -- struct list_head *cpu_list, local_list; -- -- local_irq_disable(); -- cpu_list = this_cpu_ptr(&blk_cpu_done); -- list_replace_init(cpu_list, &local_list); -- local_irq_enable(); -- -- while (!list_empty(&local_list)) { -- struct request *rq; -+ struct llist_node *entry = llist_reverse_order(llist_del_all(list)); -+ struct request *rq, *next; - -- rq = list_entry(local_list.next, struct request, ipi_list); -- list_del_init(&rq->ipi_list); -+ llist_for_each_entry_safe(rq, next, entry, ipi_list) - rq->q->mq_ops->complete(rq); -- } - } - --static void blk_mq_trigger_softirq(struct request *rq) -+static __latent_entropy void blk_done_softirq(struct softirq_action *h) - { -- struct list_head *list; -- unsigned long flags; -- -- local_irq_save(flags); -- list = this_cpu_ptr(&blk_cpu_done); -- list_add_tail(&rq->ipi_list, list); -- -- /* -- * If the list only contains our just added request, signal a raise of -- * the softirq. If there are already entries there, someone already -- * raised the irq but it hasn't run yet. -- */ -- if (list->next == &rq->ipi_list) -- raise_softirq_irqoff(BLOCK_SOFTIRQ); -- local_irq_restore(flags); -+ blk_complete_reqs(this_cpu_ptr(&blk_cpu_done)); - } - - static int blk_softirq_cpu_dead(unsigned int cpu) - { -- /* -- * If a CPU goes away, splice its entries to the current CPU -- * and trigger a run of the softirq -- */ -- local_irq_disable(); -- list_splice_init(&per_cpu(blk_cpu_done, cpu), -- this_cpu_ptr(&blk_cpu_done)); -- raise_softirq_irqoff(BLOCK_SOFTIRQ); -- local_irq_enable(); -- -+ blk_complete_reqs(&per_cpu(blk_cpu_done, cpu)); - return 0; - } - -- - static void __blk_mq_complete_request_remote(void *data) - { -- struct request *rq = data; -- -- blk_mq_trigger_softirq(rq); -+ __raise_softirq_irqoff(BLOCK_SOFTIRQ); - } - - static inline bool blk_mq_complete_need_ipi(struct request *rq) -@@ -657,6 +618,30 @@ static inline bool blk_mq_complete_need_ - return cpu_online(rq->mq_ctx->cpu); - } - -+static void blk_mq_complete_send_ipi(struct request *rq) -+{ -+ struct llist_head *list; -+ unsigned int cpu; -+ -+ cpu = rq->mq_ctx->cpu; -+ list = &per_cpu(blk_cpu_done, cpu); -+ if (llist_add(&rq->ipi_list, list)) { -+ INIT_CSD(&rq->csd, __blk_mq_complete_request_remote, rq); -+ smp_call_function_single_async(cpu, &rq->csd); -+ } -+} -+ -+static void blk_mq_raise_softirq(struct request *rq) -+{ -+ struct llist_head *list; -+ -+ preempt_disable(); -+ list = this_cpu_ptr(&blk_cpu_done); -+ if (llist_add(&rq->ipi_list, list)) -+ raise_softirq(BLOCK_SOFTIRQ); -+ preempt_enable(); -+} -+ - bool blk_mq_complete_request_remote(struct request *rq) - { - WRITE_ONCE(rq->state, MQ_RQ_COMPLETE); -@@ -669,15 +654,15 @@ bool blk_mq_complete_request_remote(stru - return false; - - if (blk_mq_complete_need_ipi(rq)) { -- INIT_CSD(&rq->csd, __blk_mq_complete_request_remote, rq); -- smp_call_function_single_async(rq->mq_ctx->cpu, &rq->csd); -- } else { -- if (rq->q->nr_hw_queues > 1) -- return false; -- blk_mq_trigger_softirq(rq); -+ blk_mq_complete_send_ipi(rq); -+ return true; - } - -- return true; -+ if (rq->q->nr_hw_queues == 1) { -+ blk_mq_raise_softirq(rq); -+ return true; -+ } -+ return false; - } - EXPORT_SYMBOL_GPL(blk_mq_complete_request_remote); - -@@ -3892,7 +3877,7 @@ static int __init blk_mq_init(void) - int i; - - for_each_possible_cpu(i) -- INIT_LIST_HEAD(&per_cpu(blk_cpu_done, i)); -+ init_llist_head(&per_cpu(blk_cpu_done, i)); - open_softirq(BLOCK_SOFTIRQ, blk_done_softirq); - - cpuhp_setup_state_nocalls(CPUHP_BLOCK_SOFTIRQ_DEAD, ---- a/include/linux/blkdev.h -+++ b/include/linux/blkdev.h -@@ -153,7 +153,7 @@ struct request { - */ - union { - struct hlist_node hash; /* merge hash */ -- struct list_head ipi_list; -+ struct llist_node ipi_list; - }; - - /* diff --git a/kernel/patches-5.11.x-rt/0007-0001-kthread-Move-prio-affinite-change-into-the-newly-cre.patch b/kernel/patches-5.11.x-rt/0007-0001-kthread-Move-prio-affinite-change-into-the-newly-cre.patch deleted file mode 100644 index 6d45e56772..0000000000 --- a/kernel/patches-5.11.x-rt/0007-0001-kthread-Move-prio-affinite-change-into-the-newly-cre.patch +++ /dev/null @@ -1,79 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 9 Nov 2020 21:30:41 +0100 -Subject: [PATCH 1/2] kthread: Move prio/affinite change into the newly created - thread - -With enabled threaded interrupts the nouveau driver reported the -following: -| Chain exists of: -| &mm->mmap_lock#2 --> &device->mutex --> &cpuset_rwsem -| -| Possible unsafe locking scenario: -| -| CPU0 CPU1 -| ---- ---- -| lock(&cpuset_rwsem); -| lock(&device->mutex); -| lock(&cpuset_rwsem); -| lock(&mm->mmap_lock#2); - -The device->mutex is nvkm_device::mutex. - -Unblocking the lockchain at `cpuset_rwsem' is probably the easiest thing -to do. -Move the priority reset to the start of the newly created thread. - -Fixes: 710da3c8ea7df ("sched/core: Prevent race condition between cpuset and __sched_setscheduler()") -Reported-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior -Link: https://lkml.kernel.org/r/a23a826af7c108ea5651e73b8fbae5e653f16e86.camel@gmx.de ---- - kernel/kthread.c | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - ---- a/kernel/kthread.c -+++ b/kernel/kthread.c -@@ -243,6 +243,7 @@ EXPORT_SYMBOL_GPL(kthread_parkme); - - static int kthread(void *_create) - { -+ static const struct sched_param param = { .sched_priority = 0 }; - /* Copy data: it's on kthread's stack */ - struct kthread_create_info *create = _create; - int (*threadfn)(void *data) = create->threadfn; -@@ -273,6 +274,13 @@ static int kthread(void *_create) - init_completion(&self->parked); - current->vfork_done = &self->exited; - -+ /* -+ * The new thread inherited kthreadd's priority and CPU mask. Reset -+ * back to default in case they have been changed. -+ */ -+ sched_setscheduler_nocheck(current, SCHED_NORMAL, ¶m); -+ set_cpus_allowed_ptr(current, housekeeping_cpumask(HK_FLAG_KTHREAD)); -+ - /* OK, tell user we're spawned, wait for stop or wakeup */ - __set_current_state(TASK_UNINTERRUPTIBLE); - create->result = current; -@@ -370,7 +378,6 @@ struct task_struct *__kthread_create_on_ - } - task = create->result; - if (!IS_ERR(task)) { -- static const struct sched_param param = { .sched_priority = 0 }; - char name[TASK_COMM_LEN]; - - /* -@@ -379,13 +386,6 @@ struct task_struct *__kthread_create_on_ - */ - vsnprintf(name, sizeof(name), namefmt, args); - set_task_comm(task, name); -- /* -- * root may have changed our (kthreadd's) priority or CPU mask. -- * The kernel thread should not inherit these properties. -- */ -- sched_setscheduler_nocheck(task, SCHED_NORMAL, ¶m); -- set_cpus_allowed_ptr(task, -- housekeeping_cpumask(HK_FLAG_KTHREAD)); - } - kfree(create); - return task; diff --git a/kernel/patches-5.11.x-rt/0008-0002-genirq-Move-prio-assignment-into-the-newly-created-t.patch b/kernel/patches-5.11.x-rt/0008-0002-genirq-Move-prio-assignment-into-the-newly-created-t.patch deleted file mode 100644 index 90d6e528aa..0000000000 --- a/kernel/patches-5.11.x-rt/0008-0002-genirq-Move-prio-assignment-into-the-newly-created-t.patch +++ /dev/null @@ -1,55 +0,0 @@ -From: Thomas Gleixner -Date: Mon, 9 Nov 2020 23:32:39 +0100 -Subject: [PATCH 2/2] genirq: Move prio assignment into the newly created - thread - -With enabled threaded interrupts the nouveau driver reported the -following: -| Chain exists of: -| &mm->mmap_lock#2 --> &device->mutex --> &cpuset_rwsem -| -| Possible unsafe locking scenario: -| -| CPU0 CPU1 -| ---- ---- -| lock(&cpuset_rwsem); -| lock(&device->mutex); -| lock(&cpuset_rwsem); -| lock(&mm->mmap_lock#2); - -The device->mutex is nvkm_device::mutex. - -Unblocking the lockchain at `cpuset_rwsem' is probably the easiest thing -to do. -Move the priority assignment to the start of the newly created thread. - -Fixes: 710da3c8ea7df ("sched/core: Prevent race condition between cpuset and __sched_setscheduler()") -Reported-by: Mike Galbraith -Signed-off-by: Thomas Gleixner -[bigeasy: Patch description] -Signed-off-by: Sebastian Andrzej Siewior -Link: https://lkml.kernel.org/r/a23a826af7c108ea5651e73b8fbae5e653f16e86.camel@gmx.de ---- - kernel/irq/manage.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -1225,6 +1225,8 @@ static int irq_thread(void *data) - irqreturn_t (*handler_fn)(struct irq_desc *desc, - struct irqaction *action); - -+ sched_set_fifo(current); -+ - if (force_irqthreads && test_bit(IRQTF_FORCED_THREAD, - &action->thread_flags)) - handler_fn = irq_forced_thread_fn; -@@ -1390,8 +1392,6 @@ setup_irq_thread(struct irqaction *new, - if (IS_ERR(t)) - return PTR_ERR(t); - -- sched_set_fifo(t); -- - /* - * We keep the reference to the task struct even if - * the thread dies to avoid that the interrupt code diff --git a/kernel/patches-5.11.x-rt/0009-notifier-Make-atomic_notifiers-use-raw_spinlock.patch b/kernel/patches-5.11.x-rt/0009-notifier-Make-atomic_notifiers-use-raw_spinlock.patch deleted file mode 100644 index 3ef97ac3f0..0000000000 --- a/kernel/patches-5.11.x-rt/0009-notifier-Make-atomic_notifiers-use-raw_spinlock.patch +++ /dev/null @@ -1,123 +0,0 @@ -From: Valentin Schneider -Date: Sun, 22 Nov 2020 20:19:04 +0000 -Subject: [PATCH] notifier: Make atomic_notifiers use raw_spinlock - -Booting a recent PREEMPT_RT kernel (v5.10-rc3-rt7-rebase) on my arm64 Juno -leads to the idle task blocking on an RT sleeping spinlock down some -notifier path: - - [ 1.809101] BUG: scheduling while atomic: swapper/5/0/0x00000002 - [ 1.809116] Modules linked in: - [ 1.809123] Preemption disabled at: - [ 1.809125] secondary_start_kernel (arch/arm64/kernel/smp.c:227) - [ 1.809146] CPU: 5 PID: 0 Comm: swapper/5 Tainted: G W 5.10.0-rc3-rt7 #168 - [ 1.809153] Hardware name: ARM Juno development board (r0) (DT) - [ 1.809158] Call trace: - [ 1.809160] dump_backtrace (arch/arm64/kernel/stacktrace.c:100 (discriminator 1)) - [ 1.809170] show_stack (arch/arm64/kernel/stacktrace.c:198) - [ 1.809178] dump_stack (lib/dump_stack.c:122) - [ 1.809188] __schedule_bug (kernel/sched/core.c:4886) - [ 1.809197] __schedule (./arch/arm64/include/asm/preempt.h:18 kernel/sched/core.c:4913 kernel/sched/core.c:5040) - [ 1.809204] preempt_schedule_lock (kernel/sched/core.c:5365 (discriminator 1)) - [ 1.809210] rt_spin_lock_slowlock_locked (kernel/locking/rtmutex.c:1072) - [ 1.809217] rt_spin_lock_slowlock (kernel/locking/rtmutex.c:1110) - [ 1.809224] rt_spin_lock (./include/linux/rcupdate.h:647 kernel/locking/rtmutex.c:1139) - [ 1.809231] atomic_notifier_call_chain_robust (kernel/notifier.c:71 kernel/notifier.c:118 kernel/notifier.c:186) - [ 1.809240] cpu_pm_enter (kernel/cpu_pm.c:39 kernel/cpu_pm.c:93) - [ 1.809249] psci_enter_idle_state (drivers/cpuidle/cpuidle-psci.c:52 drivers/cpuidle/cpuidle-psci.c:129) - [ 1.809258] cpuidle_enter_state (drivers/cpuidle/cpuidle.c:238) - [ 1.809267] cpuidle_enter (drivers/cpuidle/cpuidle.c:353) - [ 1.809275] do_idle (kernel/sched/idle.c:132 kernel/sched/idle.c:213 kernel/sched/idle.c:273) - [ 1.809282] cpu_startup_entry (kernel/sched/idle.c:368 (discriminator 1)) - [ 1.809288] secondary_start_kernel (arch/arm64/kernel/smp.c:273) - -Two points worth noting: - -1) That this is conceptually the same issue as pointed out in: - 313c8c16ee62 ("PM / CPU: replace raw_notifier with atomic_notifier") -2) Only the _robust() variant of atomic_notifier callchains suffer from - this - -AFAICT only the cpu_pm_notifier_chain really needs to be changed, but -singling it out would mean introducing a new (truly) non-blocking API. At -the same time, callers that are fine with any blocking within the call -chain should use blocking notifiers, so patching up all atomic_notifier's -doesn't seem *too* crazy to me. - -Fixes: 70d932985757 ("notifier: Fix broken error handling pattern") -Signed-off-by: Valentin Schneider -Reviewed-by: Daniel Bristot de Oliveira -Link: https://lkml.kernel.org/r/20201122201904.30940-1-valentin.schneider@arm.com -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/notifier.h | 6 +++--- - kernel/notifier.c | 12 ++++++------ - 2 files changed, 9 insertions(+), 9 deletions(-) - ---- a/include/linux/notifier.h -+++ b/include/linux/notifier.h -@@ -58,7 +58,7 @@ struct notifier_block { - }; - - struct atomic_notifier_head { -- spinlock_t lock; -+ raw_spinlock_t lock; - struct notifier_block __rcu *head; - }; - -@@ -78,7 +78,7 @@ struct srcu_notifier_head { - }; - - #define ATOMIC_INIT_NOTIFIER_HEAD(name) do { \ -- spin_lock_init(&(name)->lock); \ -+ raw_spin_lock_init(&(name)->lock); \ - (name)->head = NULL; \ - } while (0) - #define BLOCKING_INIT_NOTIFIER_HEAD(name) do { \ -@@ -95,7 +95,7 @@ extern void srcu_init_notifier_head(stru - cleanup_srcu_struct(&(name)->srcu); - - #define ATOMIC_NOTIFIER_INIT(name) { \ -- .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ -+ .lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \ - .head = NULL } - #define BLOCKING_NOTIFIER_INIT(name) { \ - .rwsem = __RWSEM_INITIALIZER((name).rwsem), \ ---- a/kernel/notifier.c -+++ b/kernel/notifier.c -@@ -142,9 +142,9 @@ int atomic_notifier_chain_register(struc - unsigned long flags; - int ret; - -- spin_lock_irqsave(&nh->lock, flags); -+ raw_spin_lock_irqsave(&nh->lock, flags); - ret = notifier_chain_register(&nh->head, n); -- spin_unlock_irqrestore(&nh->lock, flags); -+ raw_spin_unlock_irqrestore(&nh->lock, flags); - return ret; - } - EXPORT_SYMBOL_GPL(atomic_notifier_chain_register); -@@ -164,9 +164,9 @@ int atomic_notifier_chain_unregister(str - unsigned long flags; - int ret; - -- spin_lock_irqsave(&nh->lock, flags); -+ raw_spin_lock_irqsave(&nh->lock, flags); - ret = notifier_chain_unregister(&nh->head, n); -- spin_unlock_irqrestore(&nh->lock, flags); -+ raw_spin_unlock_irqrestore(&nh->lock, flags); - synchronize_rcu(); - return ret; - } -@@ -182,9 +182,9 @@ int atomic_notifier_call_chain_robust(st - * Musn't use RCU; because then the notifier list can - * change between the up and down traversal. - */ -- spin_lock_irqsave(&nh->lock, flags); -+ raw_spin_lock_irqsave(&nh->lock, flags); - ret = notifier_call_chain_robust(&nh->head, val_up, val_down, v); -- spin_unlock_irqrestore(&nh->lock, flags); -+ raw_spin_unlock_irqrestore(&nh->lock, flags); - - return ret; - } diff --git a/kernel/patches-5.11.x-rt/0010-0001-rcu-Make-RCU_BOOST-default-on-CONFIG_PREEMPT_RT.patch b/kernel/patches-5.11.x-rt/0010-0001-rcu-Make-RCU_BOOST-default-on-CONFIG_PREEMPT_RT.patch deleted file mode 100644 index c1bfcb03e2..0000000000 --- a/kernel/patches-5.11.x-rt/0010-0001-rcu-Make-RCU_BOOST-default-on-CONFIG_PREEMPT_RT.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 15 Dec 2020 15:16:45 +0100 -Subject: [PATCH 1/5] rcu: Make RCU_BOOST default on CONFIG_PREEMPT_RT - -On PREEMPT_RT kernels, RCU callbacks are deferred to the `rcuc' kthread. -This can stall RCU grace periods due to lengthy preemption not only of RCU -readers but also of 'rcuc' kthreads, either of which prevent grace periods -from completing, which can in turn result in OOM. Because PREEMPT_RT -kernels have more kthreads that can block grace periods, it is more -important for such kernels to enable RCU_BOOST. - -This commit therefore makes RCU_BOOST the default on PREEMPT_RT. -RCU_BOOST can still be manually disabled if need be. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Paul E. McKenney -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/rcu/Kconfig | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/kernel/rcu/Kconfig -+++ b/kernel/rcu/Kconfig -@@ -188,8 +188,8 @@ config RCU_FAST_NO_HZ - - config RCU_BOOST - bool "Enable RCU priority boosting" -- depends on RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT -- default n -+ depends on (RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT) || PREEMPT_RT -+ default y if PREEMPT_RT - help - This option boosts the priority of preempted RCU readers that - block the current preemptible RCU grace period for too long. diff --git a/kernel/patches-5.11.x-rt/0011-0002-rcu-Unconditionally-use-rcuc-threads-on-PREEMPT_RT.patch b/kernel/patches-5.11.x-rt/0011-0002-rcu-Unconditionally-use-rcuc-threads-on-PREEMPT_RT.patch deleted file mode 100644 index 39fc562b07..0000000000 --- a/kernel/patches-5.11.x-rt/0011-0002-rcu-Unconditionally-use-rcuc-threads-on-PREEMPT_RT.patch +++ /dev/null @@ -1,57 +0,0 @@ -From: Scott Wood -Date: Tue, 15 Dec 2020 15:16:46 +0100 -Subject: [PATCH 2/5] rcu: Unconditionally use rcuc threads on PREEMPT_RT - -PREEMPT_RT systems have long used the rcutree.use_softirq kernel -boot parameter to avoid use of RCU_SOFTIRQ handlers, which can disrupt -real-time applications by invoking callbacks during return from interrupts -that arrived while executing time-critical code. This kernel boot -parameter instead runs RCU core processing in an 'rcuc' kthread, thus -allowing the scheduler to do its job of avoiding disrupting time-critical -code. - -This commit therefore disables the rcutree.use_softirq kernel boot -parameter on PREEMPT_RT systems, thus forcing such systems to do RCU -core processing in 'rcuc' kthreads. This approach has long been in -use by users of the -rt patchset, and there have been no complaints. -There is therefore no way for the system administrator to override this -choice, at least without modifying and rebuilding the kernel. - -Signed-off-by: Scott Wood -[bigeasy: Reword commit message] -Signed-off-by: Sebastian Andrzej Siewior -[ paulmck: Update kernel-parameters.txt accordingly. ] -Signed-off-by: Paul E. McKenney -Signed-off-by: Sebastian Andrzej Siewior ---- - Documentation/admin-guide/kernel-parameters.txt | 4 ++++ - kernel/rcu/tree.c | 4 +++- - 2 files changed, 7 insertions(+), 1 deletion(-) - ---- a/Documentation/admin-guide/kernel-parameters.txt -+++ b/Documentation/admin-guide/kernel-parameters.txt -@@ -4092,6 +4092,10 @@ - value, meaning that RCU_SOFTIRQ is used by default. - Specify rcutree.use_softirq=0 to use rcuc kthreads. - -+ But note that CONFIG_PREEMPT_RT=y kernels disable -+ this kernel boot parameter, forcibly setting it -+ to zero. -+ - rcutree.rcu_fanout_exact= [KNL] - Disable autobalancing of the rcu_node combining - tree. This is used by rcutorture, and might ---- a/kernel/rcu/tree.c -+++ b/kernel/rcu/tree.c -@@ -100,8 +100,10 @@ static struct rcu_state rcu_state = { - static bool dump_tree; - module_param(dump_tree, bool, 0444); - /* By default, use RCU_SOFTIRQ instead of rcuc kthreads. */ --static bool use_softirq = true; -+static bool use_softirq = !IS_ENABLED(CONFIG_PREEMPT_RT); -+#ifndef CONFIG_PREEMPT_RT - module_param(use_softirq, bool, 0444); -+#endif - /* Control rcu_node-tree auto-balancing at boot time. */ - static bool rcu_fanout_exact; - module_param(rcu_fanout_exact, bool, 0444); diff --git a/kernel/patches-5.11.x-rt/0012-0003-rcu-Enable-rcu_normal_after_boot-unconditionally-for.patch b/kernel/patches-5.11.x-rt/0012-0003-rcu-Enable-rcu_normal_after_boot-unconditionally-for.patch deleted file mode 100644 index 9adfeab891..0000000000 --- a/kernel/patches-5.11.x-rt/0012-0003-rcu-Enable-rcu_normal_after_boot-unconditionally-for.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Julia Cartwright -Date: Tue, 15 Dec 2020 15:16:47 +0100 -Subject: [PATCH 3/5] rcu: Enable rcu_normal_after_boot unconditionally for RT - -Expedited RCU grace periods send IPIs to all non-idle CPUs, and thus can -disrupt time-critical code in real-time applications. However, there -is a portion of boot-time processing (presumably before any real-time -applications have started) where expedited RCU grace periods are the only -option. And so it is that experience with the -rt patchset indicates that -PREEMPT_RT systems should always set the rcupdate.rcu_normal_after_boot -kernel boot parameter. - -This commit therefore makes the post-boot application environment safe -for real-time applications by making PREEMPT_RT systems disable the -rcupdate.rcu_normal_after_boot kernel boot parameter and acting as -if this parameter had been set. This means that post-boot calls to -synchronize_rcu_expedited() will be treated as if they were instead -calls to synchronize_rcu(), thus preventing the IPIs, and thus avoiding -disrupting real-time applications. - -Suggested-by: Luiz Capitulino -Acked-by: Paul E. McKenney -Signed-off-by: Julia Cartwright -Signed-off-by: Sebastian Andrzej Siewior -[ paulmck: Update kernel-parameters.txt accordingly. ] -Signed-off-by: Paul E. McKenney -Signed-off-by: Sebastian Andrzej Siewior ---- - Documentation/admin-guide/kernel-parameters.txt | 7 +++++++ - kernel/rcu/update.c | 4 +++- - 2 files changed, 10 insertions(+), 1 deletion(-) - ---- a/Documentation/admin-guide/kernel-parameters.txt -+++ b/Documentation/admin-guide/kernel-parameters.txt -@@ -4474,6 +4474,13 @@ - only normal grace-period primitives. No effect - on CONFIG_TINY_RCU kernels. - -+ But note that CONFIG_PREEMPT_RT=y kernels enables -+ this kernel boot parameter, forcibly setting -+ it to the value one, that is, converting any -+ post-boot attempt at an expedited RCU grace -+ period to instead use normal non-expedited -+ grace-period processing. -+ - rcupdate.rcu_task_ipi_delay= [KNL] - Set time in jiffies during which RCU tasks will - avoid sending IPIs, starting with the beginning ---- a/kernel/rcu/update.c -+++ b/kernel/rcu/update.c -@@ -56,8 +56,10 @@ - #ifndef CONFIG_TINY_RCU - module_param(rcu_expedited, int, 0); - module_param(rcu_normal, int, 0); --static int rcu_normal_after_boot; -+static int rcu_normal_after_boot = IS_ENABLED(CONFIG_PREEMPT_RT); -+#ifndef CONFIG_PREEMPT_RT - module_param(rcu_normal_after_boot, int, 0); -+#endif - #endif /* #ifndef CONFIG_TINY_RCU */ - - #ifdef CONFIG_DEBUG_LOCK_ALLOC diff --git a/kernel/patches-5.11.x-rt/0013-0004-doc-Update-RCU-s-requirements-page-about-the-PREEMPT.patch b/kernel/patches-5.11.x-rt/0013-0004-doc-Update-RCU-s-requirements-page-about-the-PREEMPT.patch deleted file mode 100644 index 9e96cea342..0000000000 --- a/kernel/patches-5.11.x-rt/0013-0004-doc-Update-RCU-s-requirements-page-about-the-PREEMPT.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 15 Dec 2020 15:16:48 +0100 -Subject: [PATCH 4/5] doc: Update RCU's requirements page about the PREEMPT_RT - wiki. - -The PREEMPT_RT wiki moved from kernel.org to the Linux Foundation wiki. -The kernel.org wiki is read only. - -This commit therefore updates the URL of the active PREEMPT_RT wiki. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Paul E. McKenney -Signed-off-by: Sebastian Andrzej Siewior ---- - Documentation/RCU/Design/Requirements/Requirements.rst | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/Documentation/RCU/Design/Requirements/Requirements.rst -+++ b/Documentation/RCU/Design/Requirements/Requirements.rst -@@ -2319,7 +2319,7 @@ decides to throw at it. - - The Linux kernel is used for real-time workloads, especially in - conjunction with the `-rt --patchset `__. The -+patchset `__. The - real-time-latency response requirements are such that the traditional - approach of disabling preemption across RCU read-side critical sections - is inappropriate. Kernels built with ``CONFIG_PREEMPT=y`` therefore use diff --git a/kernel/patches-5.11.x-rt/0014-0005-doc-Use-CONFIG_PREEMPTION.patch b/kernel/patches-5.11.x-rt/0014-0005-doc-Use-CONFIG_PREEMPTION.patch deleted file mode 100644 index 34735954e0..0000000000 --- a/kernel/patches-5.11.x-rt/0014-0005-doc-Use-CONFIG_PREEMPTION.patch +++ /dev/null @@ -1,233 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 15 Dec 2020 15:16:49 +0100 -Subject: [PATCH 5/5] doc: Use CONFIG_PREEMPTION - -CONFIG_PREEMPTION is selected by CONFIG_PREEMPT and by CONFIG_PREEMPT_RT. -Both PREEMPT and PREEMPT_RT require the same functionality which today -depends on CONFIG_PREEMPT. - -Update the documents and mention CONFIG_PREEMPTION. Spell out -CONFIG_PREEMPT_RT (instead PREEMPT_RT) since it is an option now. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Paul E. McKenney -Signed-off-by: Sebastian Andrzej Siewior ---- - Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.rst | 4 - - Documentation/RCU/Design/Requirements/Requirements.rst | 24 +++++----- - Documentation/RCU/checklist.rst | 2 - Documentation/RCU/rcubarrier.rst | 6 +- - Documentation/RCU/stallwarn.rst | 4 - - Documentation/RCU/whatisRCU.rst | 10 ++-- - 6 files changed, 25 insertions(+), 25 deletions(-) - ---- a/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.rst -+++ b/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.rst -@@ -38,7 +38,7 @@ sections. - RCU-preempt Expedited Grace Periods - =================================== - --``CONFIG_PREEMPT=y`` kernels implement RCU-preempt. -+``CONFIG_PREEMPTION=y`` kernels implement RCU-preempt. - The overall flow of the handling of a given CPU by an RCU-preempt - expedited grace period is shown in the following diagram: - -@@ -112,7 +112,7 @@ things. - RCU-sched Expedited Grace Periods - --------------------------------- - --``CONFIG_PREEMPT=n`` kernels implement RCU-sched. The overall flow of -+``CONFIG_PREEMPTION=n`` kernels implement RCU-sched. The overall flow of - the handling of a given CPU by an RCU-sched expedited grace period is - shown in the following diagram: - ---- a/Documentation/RCU/Design/Requirements/Requirements.rst -+++ b/Documentation/RCU/Design/Requirements/Requirements.rst -@@ -78,7 +78,7 @@ RCU treats a nested set as one big RCU r - Production-quality implementations of ``rcu_read_lock()`` and - ``rcu_read_unlock()`` are extremely lightweight, and in fact have - exactly zero overhead in Linux kernels built for production use with --``CONFIG_PREEMPT=n``. -+``CONFIG_PREEMPTION=n``. - - This guarantee allows ordering to be enforced with extremely low - overhead to readers, for example: -@@ -1182,7 +1182,7 @@ and has become decreasingly so as memory - costs have plummeted. However, as I learned from Matt Mackall's - `bloatwatch `__ efforts, memory - footprint is critically important on single-CPU systems with --non-preemptible (``CONFIG_PREEMPT=n``) kernels, and thus `tiny -+non-preemptible (``CONFIG_PREEMPTION=n``) kernels, and thus `tiny - RCU `__ - was born. Josh Triplett has since taken over the small-memory banner - with his `Linux kernel tinification `__ -@@ -1498,7 +1498,7 @@ limitations. - - Implementations of RCU for which ``rcu_read_lock()`` and - ``rcu_read_unlock()`` generate no code, such as Linux-kernel RCU when --``CONFIG_PREEMPT=n``, can be nested arbitrarily deeply. After all, there -+``CONFIG_PREEMPTION=n``, can be nested arbitrarily deeply. After all, there - is no overhead. Except that if all these instances of - ``rcu_read_lock()`` and ``rcu_read_unlock()`` are visible to the - compiler, compilation will eventually fail due to exhausting memory, -@@ -1771,7 +1771,7 @@ implementation can be a no-op. - - However, once the scheduler has spawned its first kthread, this early - boot trick fails for ``synchronize_rcu()`` (as well as for --``synchronize_rcu_expedited()``) in ``CONFIG_PREEMPT=y`` kernels. The -+``synchronize_rcu_expedited()``) in ``CONFIG_PREEMPTION=y`` kernels. The - reason is that an RCU read-side critical section might be preempted, - which means that a subsequent ``synchronize_rcu()`` really does have to - wait for something, as opposed to simply returning immediately. -@@ -2040,7 +2040,7 @@ The compiler must not be permitted to tr - 5 rcu_read_unlock(); - 6 do_something_with(v, user_v); - --If the compiler did make this transformation in a ``CONFIG_PREEMPT=n`` kernel -+If the compiler did make this transformation in a ``CONFIG_PREEMPTION=n`` kernel - build, and if ``get_user()`` did page fault, the result would be a quiescent - state in the middle of an RCU read-side critical section. This misplaced - quiescent state could result in line 4 being a use-after-free access, -@@ -2322,7 +2322,7 @@ conjunction with the `-rt - patchset `__. The - real-time-latency response requirements are such that the traditional - approach of disabling preemption across RCU read-side critical sections --is inappropriate. Kernels built with ``CONFIG_PREEMPT=y`` therefore use -+is inappropriate. Kernels built with ``CONFIG_PREEMPTION=y`` therefore use - an RCU implementation that allows RCU read-side critical sections to be - preempted. This requirement made its presence known after users made it - clear that an earlier `real-time -@@ -2444,7 +2444,7 @@ includes ``rcu_read_lock_bh()``, ``rcu_r - ``call_rcu_bh()``, ``rcu_barrier_bh()``, and - ``rcu_read_lock_bh_held()``. However, the update-side APIs are now - simple wrappers for other RCU flavors, namely RCU-sched in --CONFIG_PREEMPT=n kernels and RCU-preempt otherwise. -+CONFIG_PREEMPTION=n kernels and RCU-preempt otherwise. - - Sched Flavor (Historical) - ~~~~~~~~~~~~~~~~~~~~~~~~~ -@@ -2462,11 +2462,11 @@ not have this property, given that any p - RCU read-side critical section can be a quiescent state. Therefore, - *RCU-sched* was created, which follows “classic” RCU in that an - RCU-sched grace period waits for pre-existing interrupt and NMI --handlers. In kernels built with ``CONFIG_PREEMPT=n``, the RCU and -+handlers. In kernels built with ``CONFIG_PREEMPTION=n``, the RCU and - RCU-sched APIs have identical implementations, while kernels built with --``CONFIG_PREEMPT=y`` provide a separate implementation for each. -+``CONFIG_PREEMPTION=y`` provide a separate implementation for each. - --Note well that in ``CONFIG_PREEMPT=y`` kernels, -+Note well that in ``CONFIG_PREEMPTION=y`` kernels, - ``rcu_read_lock_sched()`` and ``rcu_read_unlock_sched()`` disable and - re-enable preemption, respectively. This means that if there was a - preemption attempt during the RCU-sched read-side critical section, -@@ -2629,10 +2629,10 @@ userspace execution also delimit tasks-R - - The tasks-RCU API is quite compact, consisting only of - ``call_rcu_tasks()``, ``synchronize_rcu_tasks()``, and --``rcu_barrier_tasks()``. In ``CONFIG_PREEMPT=n`` kernels, trampolines -+``rcu_barrier_tasks()``. In ``CONFIG_PREEMPTION=n`` kernels, trampolines - cannot be preempted, so these APIs map to ``call_rcu()``, - ``synchronize_rcu()``, and ``rcu_barrier()``, respectively. In --``CONFIG_PREEMPT=y`` kernels, trampolines can be preempted, and these -+``CONFIG_PREEMPTION=y`` kernels, trampolines can be preempted, and these - three APIs are therefore implemented by separate functions that check - for voluntary context switches. - ---- a/Documentation/RCU/checklist.rst -+++ b/Documentation/RCU/checklist.rst -@@ -214,7 +214,7 @@ over a rather long period of time, but i - the rest of the system. - - 7. As of v4.20, a given kernel implements only one RCU flavor, -- which is RCU-sched for PREEMPT=n and RCU-preempt for PREEMPT=y. -+ which is RCU-sched for PREEMPTION=n and RCU-preempt for PREEMPTION=y. - If the updater uses call_rcu() or synchronize_rcu(), - then the corresponding readers my use rcu_read_lock() and - rcu_read_unlock(), rcu_read_lock_bh() and rcu_read_unlock_bh(), ---- a/Documentation/RCU/rcubarrier.rst -+++ b/Documentation/RCU/rcubarrier.rst -@@ -9,7 +9,7 @@ RCU (read-copy update) is a synchronizat - of as a replacement for read-writer locking (among other things), but with - very low-overhead readers that are immune to deadlock, priority inversion, - and unbounded latency. RCU read-side critical sections are delimited --by rcu_read_lock() and rcu_read_unlock(), which, in non-CONFIG_PREEMPT -+by rcu_read_lock() and rcu_read_unlock(), which, in non-CONFIG_PREEMPTION - kernels, generate no code whatsoever. - - This means that RCU writers are unaware of the presence of concurrent -@@ -329,10 +329,10 @@ Answer: This cannot happen. The reason i - to smp_call_function() and further to smp_call_function_on_cpu(), - causing this latter to spin until the cross-CPU invocation of - rcu_barrier_func() has completed. This by itself would prevent -- a grace period from completing on non-CONFIG_PREEMPT kernels, -+ a grace period from completing on non-CONFIG_PREEMPTION kernels, - since each CPU must undergo a context switch (or other quiescent - state) before the grace period can complete. However, this is -- of no use in CONFIG_PREEMPT kernels. -+ of no use in CONFIG_PREEMPTION kernels. - - Therefore, on_each_cpu() disables preemption across its call - to smp_call_function() and also across the local call to ---- a/Documentation/RCU/stallwarn.rst -+++ b/Documentation/RCU/stallwarn.rst -@@ -25,7 +25,7 @@ So your kernel printed an RCU CPU stall - - - A CPU looping with bottom halves disabled. - --- For !CONFIG_PREEMPT kernels, a CPU looping anywhere in the kernel -+- For !CONFIG_PREEMPTION kernels, a CPU looping anywhere in the kernel - without invoking schedule(). If the looping in the kernel is - really expected and desirable behavior, you might need to add - some calls to cond_resched(). -@@ -44,7 +44,7 @@ So your kernel printed an RCU CPU stall - result in the ``rcu_.*kthread starved for`` console-log message, - which will include additional debugging information. - --- A CPU-bound real-time task in a CONFIG_PREEMPT kernel, which might -+- A CPU-bound real-time task in a CONFIG_PREEMPTION kernel, which might - happen to preempt a low-priority task in the middle of an RCU - read-side critical section. This is especially damaging if - that low-priority task is not permitted to run on any other CPU, ---- a/Documentation/RCU/whatisRCU.rst -+++ b/Documentation/RCU/whatisRCU.rst -@@ -683,7 +683,7 @@ so there can be no deadlock cycle. - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - This section presents a "toy" RCU implementation that is based on - "classic RCU". It is also short on performance (but only for updates) and --on features such as hotplug CPU and the ability to run in CONFIG_PREEMPT -+on features such as hotplug CPU and the ability to run in CONFIG_PREEMPTION - kernels. The definitions of rcu_dereference() and rcu_assign_pointer() - are the same as those shown in the preceding section, so they are omitted. - :: -@@ -739,7 +739,7 @@ to that data item, so we can safely recl - Quick Quiz #3: - If it is illegal to block in an RCU read-side - critical section, what the heck do you do in -- PREEMPT_RT, where normal spinlocks can block??? -+ CONFIG_PREEMPT_RT, where normal spinlocks can block??? - - :ref:`Answers to Quick Quiz <8_whatisRCU>` - -@@ -1093,7 +1093,7 @@ the right tool for your job. - overhead is **negative**. - - Answer: -- Imagine a single-CPU system with a non-CONFIG_PREEMPT -+ Imagine a single-CPU system with a non-CONFIG_PREEMPTION - kernel where a routing table is used by process-context - code, but can be updated by irq-context code (for example, - by an "ICMP REDIRECT" packet). The usual way of handling -@@ -1120,10 +1120,10 @@ the right tool for your job. - Quick Quiz #3: - If it is illegal to block in an RCU read-side - critical section, what the heck do you do in -- PREEMPT_RT, where normal spinlocks can block??? -+ CONFIG_PREEMPT_RT, where normal spinlocks can block??? - - Answer: -- Just as PREEMPT_RT permits preemption of spinlock -+ Just as CONFIG_PREEMPT_RT permits preemption of spinlock - critical sections, it permits preemption of RCU - read-side critical sections. It also permits - spinlocks blocking while in RCU read-side critical diff --git a/kernel/patches-5.11.x-rt/0015-0001-tracing-Merge-irqflags-preempt-counter.patch b/kernel/patches-5.11.x-rt/0015-0001-tracing-Merge-irqflags-preempt-counter.patch deleted file mode 100644 index 394633e8b9..0000000000 --- a/kernel/patches-5.11.x-rt/0015-0001-tracing-Merge-irqflags-preempt-counter.patch +++ /dev/null @@ -1,1861 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 25 Jan 2021 20:45:08 +0100 -Subject: [PATCH 1/4] tracing: Merge irqflags + preempt counter. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The state of the interrupts (irqflags) and the preemption counter are -both passed down to tracing_generic_entry_update(). Only one bit of -irqflags is actually required: The on/off state. The complete 32bit -of the preemption counter isn't needed. Just whether of the upper bits -(softirq, hardirq and NMI) are set and the preemption depth is needed. - -The irqflags and the preemption counter could be evaluated early and the -information stored in an integer `trace_ctx'. -tracing_generic_entry_update() would use the upper bits as the -TRACE_FLAG_* and the lower 8bit as the disabled-preemption depth -(considering that one must be substracted from the counter in one -special cases). - -The actual preemption value is not used except for the tracing record. -The `irqflags' variable is mostly used only for the tracing record. An -exception here is for instance wakeup_tracer_call() or -probe_wakeup_sched_switch() which explicilty disable interrupts and use -that `irqflags' to save (and restore) the IRQ state and to record the -state. - -Struct trace_event_buffer has also the `pc' and flags' members which can -be replaced with `trace_ctx' since their actual value is not used -outside of trace recording. - -This will reduce tracing_generic_entry_update() to simply assign values -to struct trace_entry. The evaluation of the TRACE_FLAG_* bits is moved -to _tracing_gen_ctx_flags() which replaces preempt_count() and -local_save_flags() invocations. - -As an example, ftrace_syscall_enter() may invoke: -- trace_buffer_lock_reserve() -> … -> tracing_generic_entry_update() -- event_trigger_unlock_commit() - -> ftrace_trace_stack() -> … -> tracing_generic_entry_update() - -> ftrace_trace_userstack() -> … -> tracing_generic_entry_update() - -In this case the TRACE_FLAG_* bits were evaluated three times. By using -the `trace_ctx' they are evaluated once and assigned three times. - -A build with all tracers enabled on x86-64 with and without the patch: - - text data bss dec hex filename -21970669 17084168 7639260 46694097 2c87ed1 vmlinux.old -21970293 17084168 7639260 46693721 2c87d59 vmlinux.new - -text shrank by 379 bytes, data remained constant. - -Link: https://lkml.kernel.org/r/20210125194511.3924915-2-bigeasy@linutronix.de - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/trace_events.h | 25 +++- - kernel/trace/blktrace.c | 17 +- - kernel/trace/trace.c | 206 ++++++++++++++++++----------------- - kernel/trace/trace.h | 38 ++---- - kernel/trace/trace_branch.c | 6 - - kernel/trace/trace_event_perf.c | 5 - kernel/trace/trace_events.c | 18 +-- - kernel/trace/trace_events_inject.c | 6 - - kernel/trace/trace_functions.c | 28 ++-- - kernel/trace/trace_functions_graph.c | 32 ++--- - kernel/trace/trace_hwlat.c | 7 - - kernel/trace/trace_irqsoff.c | 86 ++++++-------- - kernel/trace/trace_kprobe.c | 10 - - kernel/trace/trace_mmiotrace.c | 14 +- - kernel/trace/trace_sched_wakeup.c | 71 +++++------- - kernel/trace/trace_syscalls.c | 20 +-- - kernel/trace/trace_uprobe.c | 4 - 17 files changed, 286 insertions(+), 307 deletions(-) - ---- a/include/linux/trace_events.h -+++ b/include/linux/trace_events.h -@@ -148,17 +148,29 @@ enum print_line_t { - - enum print_line_t trace_handle_return(struct trace_seq *s); - --void tracing_generic_entry_update(struct trace_entry *entry, -- unsigned short type, -- unsigned long flags, -- int pc); -+static inline void tracing_generic_entry_update(struct trace_entry *entry, -+ unsigned short type, -+ unsigned int trace_ctx) -+{ -+ struct task_struct *tsk = current; -+ -+ entry->preempt_count = trace_ctx & 0xff; -+ entry->pid = (tsk) ? tsk->pid : 0; -+ entry->type = type; -+ entry->flags = trace_ctx >> 16; -+} -+ -+unsigned int tracing_gen_ctx_flags(unsigned long irqflags); -+unsigned int tracing_gen_ctx(void); -+unsigned int tracing_gen_ctx_dec(void); -+ - struct trace_event_file; - - struct ring_buffer_event * - trace_event_buffer_lock_reserve(struct trace_buffer **current_buffer, - struct trace_event_file *trace_file, - int type, unsigned long len, -- unsigned long flags, int pc); -+ unsigned int trace_ctx); - - #define TRACE_RECORD_CMDLINE BIT(0) - #define TRACE_RECORD_TGID BIT(1) -@@ -232,8 +244,7 @@ struct trace_event_buffer { - struct ring_buffer_event *event; - struct trace_event_file *trace_file; - void *entry; -- unsigned long flags; -- int pc; -+ unsigned int trace_ctx; - struct pt_regs *regs; - }; - ---- a/kernel/trace/blktrace.c -+++ b/kernel/trace/blktrace.c -@@ -72,17 +72,17 @@ static void trace_note(struct blk_trace - struct blk_io_trace *t; - struct ring_buffer_event *event = NULL; - struct trace_buffer *buffer = NULL; -- int pc = 0; -+ unsigned int trace_ctx = 0; - int cpu = smp_processor_id(); - bool blk_tracer = blk_tracer_enabled; - ssize_t cgid_len = cgid ? sizeof(cgid) : 0; - - if (blk_tracer) { - buffer = blk_tr->array_buffer.buffer; -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx_flags(0); - event = trace_buffer_lock_reserve(buffer, TRACE_BLK, - sizeof(*t) + len + cgid_len, -- 0, pc); -+ trace_ctx); - if (!event) - return; - t = ring_buffer_event_data(event); -@@ -107,7 +107,7 @@ static void trace_note(struct blk_trace - memcpy((void *) t + sizeof(*t) + cgid_len, data, len); - - if (blk_tracer) -- trace_buffer_unlock_commit(blk_tr, buffer, event, 0, pc); -+ trace_buffer_unlock_commit(blk_tr, buffer, event, trace_ctx); - } - } - -@@ -222,8 +222,9 @@ static void __blk_add_trace(struct blk_t - struct blk_io_trace *t; - unsigned long flags = 0; - unsigned long *sequence; -+ unsigned int trace_ctx = 0; - pid_t pid; -- int cpu, pc = 0; -+ int cpu; - bool blk_tracer = blk_tracer_enabled; - ssize_t cgid_len = cgid ? sizeof(cgid) : 0; - -@@ -252,10 +253,10 @@ static void __blk_add_trace(struct blk_t - tracing_record_cmdline(current); - - buffer = blk_tr->array_buffer.buffer; -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx_flags(0); - event = trace_buffer_lock_reserve(buffer, TRACE_BLK, - sizeof(*t) + pdu_len + cgid_len, -- 0, pc); -+ trace_ctx); - if (!event) - return; - t = ring_buffer_event_data(event); -@@ -301,7 +302,7 @@ static void __blk_add_trace(struct blk_t - memcpy((void *)t + sizeof(*t) + cgid_len, pdu_data, pdu_len); - - if (blk_tracer) { -- trace_buffer_unlock_commit(blk_tr, buffer, event, 0, pc); -+ trace_buffer_unlock_commit(blk_tr, buffer, event, trace_ctx); - return; - } - } ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -176,7 +176,7 @@ static union trace_eval_map_item *trace_ - int tracing_set_tracer(struct trace_array *tr, const char *buf); - static void ftrace_trace_userstack(struct trace_array *tr, - struct trace_buffer *buffer, -- unsigned long flags, int pc); -+ unsigned int trace_ctx); - - #define MAX_TRACER_SIZE 100 - static char bootup_tracer_buf[MAX_TRACER_SIZE] __initdata; -@@ -905,23 +905,23 @@ static inline void trace_access_lock_ini - - #ifdef CONFIG_STACKTRACE - static void __ftrace_trace_stack(struct trace_buffer *buffer, -- unsigned long flags, -- int skip, int pc, struct pt_regs *regs); -+ unsigned int trace_ctx, -+ int skip, struct pt_regs *regs); - static inline void ftrace_trace_stack(struct trace_array *tr, - struct trace_buffer *buffer, -- unsigned long flags, -- int skip, int pc, struct pt_regs *regs); -+ unsigned int trace_ctx, -+ int skip, struct pt_regs *regs); - - #else - static inline void __ftrace_trace_stack(struct trace_buffer *buffer, -- unsigned long flags, -- int skip, int pc, struct pt_regs *regs) -+ unsigned int trace_ctx, -+ int skip, struct pt_regs *regs) - { - } - static inline void ftrace_trace_stack(struct trace_array *tr, - struct trace_buffer *buffer, -- unsigned long flags, -- int skip, int pc, struct pt_regs *regs) -+ unsigned long trace_ctx, -+ int skip, struct pt_regs *regs) - { - } - -@@ -929,24 +929,24 @@ static inline void ftrace_trace_stack(st - - static __always_inline void - trace_event_setup(struct ring_buffer_event *event, -- int type, unsigned long flags, int pc) -+ int type, unsigned int trace_ctx) - { - struct trace_entry *ent = ring_buffer_event_data(event); - -- tracing_generic_entry_update(ent, type, flags, pc); -+ tracing_generic_entry_update(ent, type, trace_ctx); - } - - static __always_inline struct ring_buffer_event * - __trace_buffer_lock_reserve(struct trace_buffer *buffer, - int type, - unsigned long len, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { - struct ring_buffer_event *event; - - event = ring_buffer_lock_reserve(buffer, len); - if (event != NULL) -- trace_event_setup(event, type, flags, pc); -+ trace_event_setup(event, type, trace_ctx); - - return event; - } -@@ -1007,25 +1007,22 @@ int __trace_puts(unsigned long ip, const - struct ring_buffer_event *event; - struct trace_buffer *buffer; - struct print_entry *entry; -- unsigned long irq_flags; -+ unsigned int trace_ctx; - int alloc; -- int pc; - - if (!(global_trace.trace_flags & TRACE_ITER_PRINTK)) - return 0; - -- pc = preempt_count(); -- - if (unlikely(tracing_selftest_running || tracing_disabled)) - return 0; - - alloc = sizeof(*entry) + size + 2; /* possible \n added */ - -- local_save_flags(irq_flags); -+ trace_ctx = tracing_gen_ctx(); - buffer = global_trace.array_buffer.buffer; - ring_buffer_nest_start(buffer); -- event = __trace_buffer_lock_reserve(buffer, TRACE_PRINT, alloc, -- irq_flags, pc); -+ event = __trace_buffer_lock_reserve(buffer, TRACE_PRINT, alloc, -+ trace_ctx); - if (!event) { - size = 0; - goto out; -@@ -1044,7 +1041,7 @@ int __trace_puts(unsigned long ip, const - entry->buf[size] = '\0'; - - __buffer_unlock_commit(buffer, event); -- ftrace_trace_stack(&global_trace, buffer, irq_flags, 4, pc, NULL); -+ ftrace_trace_stack(&global_trace, buffer, trace_ctx, 4, NULL); - out: - ring_buffer_nest_end(buffer); - return size; -@@ -1061,25 +1058,22 @@ int __trace_bputs(unsigned long ip, cons - struct ring_buffer_event *event; - struct trace_buffer *buffer; - struct bputs_entry *entry; -- unsigned long irq_flags; -+ unsigned int trace_ctx; - int size = sizeof(struct bputs_entry); - int ret = 0; -- int pc; - - if (!(global_trace.trace_flags & TRACE_ITER_PRINTK)) - return 0; - -- pc = preempt_count(); -- - if (unlikely(tracing_selftest_running || tracing_disabled)) - return 0; - -- local_save_flags(irq_flags); -+ trace_ctx = tracing_gen_ctx(); - buffer = global_trace.array_buffer.buffer; - - ring_buffer_nest_start(buffer); - event = __trace_buffer_lock_reserve(buffer, TRACE_BPUTS, size, -- irq_flags, pc); -+ trace_ctx); - if (!event) - goto out; - -@@ -1088,7 +1082,7 @@ int __trace_bputs(unsigned long ip, cons - entry->str = str; - - __buffer_unlock_commit(buffer, event); -- ftrace_trace_stack(&global_trace, buffer, irq_flags, 4, pc, NULL); -+ ftrace_trace_stack(&global_trace, buffer, trace_ctx, 4, NULL); - - ret = 1; - out: -@@ -2584,36 +2578,69 @@ enum print_line_t trace_handle_return(st - } - EXPORT_SYMBOL_GPL(trace_handle_return); - --void --tracing_generic_entry_update(struct trace_entry *entry, unsigned short type, -- unsigned long flags, int pc) -+unsigned int tracing_gen_ctx_flags(unsigned long irqflags) - { -- struct task_struct *tsk = current; -+ unsigned int trace_flags = 0; -+ unsigned int pc; -+ -+ pc = preempt_count(); - -- entry->preempt_count = pc & 0xff; -- entry->pid = (tsk) ? tsk->pid : 0; -- entry->type = type; -- entry->flags = - #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT -- (irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) | -+ if (irqs_disabled_flags(irqflags)) -+ trace_flags |= TRACE_FLAG_IRQS_OFF; - #else -- TRACE_FLAG_IRQS_NOSUPPORT | -+ trace_flags |= TRACE_FLAG_IRQS_NOSUPPORT; - #endif -- ((pc & NMI_MASK ) ? TRACE_FLAG_NMI : 0) | -- ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) | -- ((pc & SOFTIRQ_OFFSET) ? TRACE_FLAG_SOFTIRQ : 0) | -- (tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) | -- (test_preempt_need_resched() ? TRACE_FLAG_PREEMPT_RESCHED : 0); -+ -+ if (pc & NMI_MASK) -+ trace_flags |= TRACE_FLAG_NMI; -+ if (pc & HARDIRQ_MASK) -+ trace_flags |= TRACE_FLAG_HARDIRQ; -+ -+ if (pc & SOFTIRQ_OFFSET) -+ trace_flags |= TRACE_FLAG_SOFTIRQ; -+ -+ if (tif_need_resched()) -+ trace_flags |= TRACE_FLAG_NEED_RESCHED; -+ if (test_preempt_need_resched()) -+ trace_flags |= TRACE_FLAG_PREEMPT_RESCHED; -+ return (trace_flags << 16) | (pc & 0xff); -+} -+ -+unsigned int tracing_gen_ctx(void) -+{ -+ unsigned long irqflags; -+ -+#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT -+ local_save_flags(irqflags); -+#else -+ irqflags = 0; -+#endif -+ return tracing_gen_ctx_flags(irqflags); -+} -+ -+unsigned int tracing_gen_ctx_dec(void) -+{ -+ unsigned int trace_ctx; -+ -+ trace_ctx = tracing_gen_ctx(); -+ -+ /* -+ * Subtract one from the preeption counter if preemption is enabled, -+ * see trace_event_buffer_reserve()for details. -+ */ -+ if (IS_ENABLED(CONFIG_PREEMPTION)) -+ trace_ctx--; -+ return trace_ctx; - } --EXPORT_SYMBOL_GPL(tracing_generic_entry_update); - - struct ring_buffer_event * - trace_buffer_lock_reserve(struct trace_buffer *buffer, - int type, - unsigned long len, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { -- return __trace_buffer_lock_reserve(buffer, type, len, flags, pc); -+ return __trace_buffer_lock_reserve(buffer, type, len, trace_ctx); - } - - DEFINE_PER_CPU(struct ring_buffer_event *, trace_buffered_event); -@@ -2733,7 +2760,7 @@ struct ring_buffer_event * - trace_event_buffer_lock_reserve(struct trace_buffer **current_rb, - struct trace_event_file *trace_file, - int type, unsigned long len, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { - struct ring_buffer_event *entry; - int val; -@@ -2746,7 +2773,7 @@ trace_event_buffer_lock_reserve(struct t - /* Try to use the per cpu buffer first */ - val = this_cpu_inc_return(trace_buffered_event_cnt); - if ((len < (PAGE_SIZE - sizeof(*entry))) && val == 1) { -- trace_event_setup(entry, type, flags, pc); -+ trace_event_setup(entry, type, trace_ctx); - entry->array[0] = len; - return entry; - } -@@ -2754,7 +2781,7 @@ trace_event_buffer_lock_reserve(struct t - } - - entry = __trace_buffer_lock_reserve(*current_rb, -- type, len, flags, pc); -+ type, len, trace_ctx); - /* - * If tracing is off, but we have triggers enabled - * we still need to look at the event data. Use the temp_buffer -@@ -2763,8 +2790,8 @@ trace_event_buffer_lock_reserve(struct t - */ - if (!entry && trace_file->flags & EVENT_FILE_FL_TRIGGER_COND) { - *current_rb = temp_buffer; -- entry = __trace_buffer_lock_reserve(*current_rb, -- type, len, flags, pc); -+ entry = __trace_buffer_lock_reserve(*current_rb, type, len, -+ trace_ctx); - } - return entry; - } -@@ -2850,7 +2877,7 @@ void trace_event_buffer_commit(struct tr - ftrace_exports(fbuffer->event, TRACE_EXPORT_EVENT); - event_trigger_unlock_commit_regs(fbuffer->trace_file, fbuffer->buffer, - fbuffer->event, fbuffer->entry, -- fbuffer->flags, fbuffer->pc, fbuffer->regs); -+ fbuffer->trace_ctx, fbuffer->regs); - } - EXPORT_SYMBOL_GPL(trace_event_buffer_commit); - -@@ -2866,7 +2893,7 @@ EXPORT_SYMBOL_GPL(trace_event_buffer_com - void trace_buffer_unlock_commit_regs(struct trace_array *tr, - struct trace_buffer *buffer, - struct ring_buffer_event *event, -- unsigned long flags, int pc, -+ unsigned int trace_ctx, - struct pt_regs *regs) - { - __buffer_unlock_commit(buffer, event); -@@ -2877,8 +2904,8 @@ void trace_buffer_unlock_commit_regs(str - * and mmiotrace, but that's ok if they lose a function or - * two. They are not that meaningful. - */ -- ftrace_trace_stack(tr, buffer, flags, regs ? 0 : STACK_SKIP, pc, regs); -- ftrace_trace_userstack(tr, buffer, flags, pc); -+ ftrace_trace_stack(tr, buffer, trace_ctx, regs ? 0 : STACK_SKIP, regs); -+ ftrace_trace_userstack(tr, buffer, trace_ctx); - } - - /* -@@ -2892,9 +2919,8 @@ trace_buffer_unlock_commit_nostack(struc - } - - void --trace_function(struct trace_array *tr, -- unsigned long ip, unsigned long parent_ip, unsigned long flags, -- int pc) -+trace_function(struct trace_array *tr, unsigned long ip, unsigned long -+ parent_ip, unsigned int trace_ctx) - { - struct trace_event_call *call = &event_function; - struct trace_buffer *buffer = tr->array_buffer.buffer; -@@ -2902,7 +2928,7 @@ trace_function(struct trace_array *tr, - struct ftrace_entry *entry; - - event = __trace_buffer_lock_reserve(buffer, TRACE_FN, sizeof(*entry), -- flags, pc); -+ trace_ctx); - if (!event) - return; - entry = ring_buffer_event_data(event); -@@ -2936,8 +2962,8 @@ static DEFINE_PER_CPU(struct ftrace_stac - static DEFINE_PER_CPU(int, ftrace_stack_reserve); - - static void __ftrace_trace_stack(struct trace_buffer *buffer, -- unsigned long flags, -- int skip, int pc, struct pt_regs *regs) -+ unsigned int trace_ctx, -+ int skip, struct pt_regs *regs) - { - struct trace_event_call *call = &event_kernel_stack; - struct ring_buffer_event *event; -@@ -2984,7 +3010,7 @@ static void __ftrace_trace_stack(struct - - size = nr_entries * sizeof(unsigned long); - event = __trace_buffer_lock_reserve(buffer, TRACE_STACK, -- sizeof(*entry) + size, flags, pc); -+ sizeof(*entry) + size, trace_ctx); - if (!event) - goto out; - entry = ring_buffer_event_data(event); -@@ -3005,22 +3031,22 @@ static void __ftrace_trace_stack(struct - - static inline void ftrace_trace_stack(struct trace_array *tr, - struct trace_buffer *buffer, -- unsigned long flags, -- int skip, int pc, struct pt_regs *regs) -+ unsigned int trace_ctx, -+ int skip, struct pt_regs *regs) - { - if (!(tr->trace_flags & TRACE_ITER_STACKTRACE)) - return; - -- __ftrace_trace_stack(buffer, flags, skip, pc, regs); -+ __ftrace_trace_stack(buffer, trace_ctx, skip, regs); - } - --void __trace_stack(struct trace_array *tr, unsigned long flags, int skip, -- int pc) -+void __trace_stack(struct trace_array *tr, unsigned int trace_ctx, -+ int skip) - { - struct trace_buffer *buffer = tr->array_buffer.buffer; - - if (rcu_is_watching()) { -- __ftrace_trace_stack(buffer, flags, skip, pc, NULL); -+ __ftrace_trace_stack(buffer, trace_ctx, skip, NULL); - return; - } - -@@ -3034,7 +3060,7 @@ void __trace_stack(struct trace_array *t - return; - - rcu_irq_enter_irqson(); -- __ftrace_trace_stack(buffer, flags, skip, pc, NULL); -+ __ftrace_trace_stack(buffer, trace_ctx, skip, NULL); - rcu_irq_exit_irqson(); - } - -@@ -3044,19 +3070,15 @@ void __trace_stack(struct trace_array *t - */ - void trace_dump_stack(int skip) - { -- unsigned long flags; -- - if (tracing_disabled || tracing_selftest_running) - return; - -- local_save_flags(flags); -- - #ifndef CONFIG_UNWINDER_ORC - /* Skip 1 to skip this function. */ - skip++; - #endif - __ftrace_trace_stack(global_trace.array_buffer.buffer, -- flags, skip, preempt_count(), NULL); -+ tracing_gen_ctx(), skip, NULL); - } - EXPORT_SYMBOL_GPL(trace_dump_stack); - -@@ -3065,7 +3087,7 @@ static DEFINE_PER_CPU(int, user_stack_co - - static void - ftrace_trace_userstack(struct trace_array *tr, -- struct trace_buffer *buffer, unsigned long flags, int pc) -+ struct trace_buffer *buffer, unsigned int trace_ctx) - { - struct trace_event_call *call = &event_user_stack; - struct ring_buffer_event *event; -@@ -3092,7 +3114,7 @@ ftrace_trace_userstack(struct trace_arra - __this_cpu_inc(user_stack_count); - - event = __trace_buffer_lock_reserve(buffer, TRACE_USER_STACK, -- sizeof(*entry), flags, pc); -+ sizeof(*entry), trace_ctx); - if (!event) - goto out_drop_count; - entry = ring_buffer_event_data(event); -@@ -3112,7 +3134,7 @@ ftrace_trace_userstack(struct trace_arra - #else /* CONFIG_USER_STACKTRACE_SUPPORT */ - static void ftrace_trace_userstack(struct trace_array *tr, - struct trace_buffer *buffer, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { - } - #endif /* !CONFIG_USER_STACKTRACE_SUPPORT */ -@@ -3242,9 +3264,9 @@ int trace_vbprintk(unsigned long ip, con - struct trace_buffer *buffer; - struct trace_array *tr = &global_trace; - struct bprint_entry *entry; -- unsigned long flags; -+ unsigned int trace_ctx; - char *tbuffer; -- int len = 0, size, pc; -+ int len = 0, size; - - if (unlikely(tracing_selftest_running || tracing_disabled)) - return 0; -@@ -3252,7 +3274,7 @@ int trace_vbprintk(unsigned long ip, con - /* Don't pollute graph traces with trace_vprintk internals */ - pause_graph_tracing(); - -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx(); - preempt_disable_notrace(); - - tbuffer = get_trace_buf(); -@@ -3266,12 +3288,11 @@ int trace_vbprintk(unsigned long ip, con - if (len > TRACE_BUF_SIZE/sizeof(int) || len < 0) - goto out_put; - -- local_save_flags(flags); - size = sizeof(*entry) + sizeof(u32) * len; - buffer = tr->array_buffer.buffer; - ring_buffer_nest_start(buffer); - event = __trace_buffer_lock_reserve(buffer, TRACE_BPRINT, size, -- flags, pc); -+ trace_ctx); - if (!event) - goto out; - entry = ring_buffer_event_data(event); -@@ -3281,7 +3302,7 @@ int trace_vbprintk(unsigned long ip, con - memcpy(entry->buf, tbuffer, sizeof(u32) * len); - if (!call_filter_check_discard(call, entry, buffer, event)) { - __buffer_unlock_commit(buffer, event); -- ftrace_trace_stack(tr, buffer, flags, 6, pc, NULL); -+ ftrace_trace_stack(tr, buffer, trace_ctx, 6, NULL); - } - - out: -@@ -3304,9 +3325,9 @@ static int - { - struct trace_event_call *call = &event_print; - struct ring_buffer_event *event; -- int len = 0, size, pc; -+ int len = 0, size; - struct print_entry *entry; -- unsigned long flags; -+ unsigned int trace_ctx; - char *tbuffer; - - if (tracing_disabled || tracing_selftest_running) -@@ -3315,7 +3336,7 @@ static int - /* Don't pollute graph traces with trace_vprintk internals */ - pause_graph_tracing(); - -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx(); - preempt_disable_notrace(); - - -@@ -3327,11 +3348,10 @@ static int - - len = vscnprintf(tbuffer, TRACE_BUF_SIZE, fmt, args); - -- local_save_flags(flags); - size = sizeof(*entry) + len + 1; - ring_buffer_nest_start(buffer); - event = __trace_buffer_lock_reserve(buffer, TRACE_PRINT, size, -- flags, pc); -+ trace_ctx); - if (!event) - goto out; - entry = ring_buffer_event_data(event); -@@ -3340,7 +3360,7 @@ static int - memcpy(&entry->buf, tbuffer, len + 1); - if (!call_filter_check_discard(call, entry, buffer, event)) { - __buffer_unlock_commit(buffer, event); -- ftrace_trace_stack(&global_trace, buffer, flags, 6, pc, NULL); -+ ftrace_trace_stack(&global_trace, buffer, trace_ctx, 6, NULL); - } - - out: -@@ -6653,7 +6673,6 @@ tracing_mark_write(struct file *filp, co - enum event_trigger_type tt = ETT_NONE; - struct trace_buffer *buffer; - struct print_entry *entry; -- unsigned long irq_flags; - ssize_t written; - int size; - int len; -@@ -6673,7 +6692,6 @@ tracing_mark_write(struct file *filp, co - - BUILD_BUG_ON(TRACE_BUF_SIZE >= PAGE_SIZE); - -- local_save_flags(irq_flags); - size = sizeof(*entry) + cnt + 2; /* add '\0' and possible '\n' */ - - /* If less than "", then make sure we can still add that */ -@@ -6682,7 +6700,7 @@ tracing_mark_write(struct file *filp, co - - buffer = tr->array_buffer.buffer; - event = __trace_buffer_lock_reserve(buffer, TRACE_PRINT, size, -- irq_flags, preempt_count()); -+ tracing_gen_ctx()); - if (unlikely(!event)) - /* Ring buffer disabled, return as if not open for write */ - return -EBADF; -@@ -6734,7 +6752,6 @@ tracing_mark_raw_write(struct file *filp - struct ring_buffer_event *event; - struct trace_buffer *buffer; - struct raw_data_entry *entry; -- unsigned long irq_flags; - ssize_t written; - int size; - int len; -@@ -6756,14 +6773,13 @@ tracing_mark_raw_write(struct file *filp - - BUILD_BUG_ON(TRACE_BUF_SIZE >= PAGE_SIZE); - -- local_save_flags(irq_flags); - size = sizeof(*entry) + cnt; - if (cnt < FAULT_SIZE_ID) - size += FAULT_SIZE_ID - cnt; - - buffer = tr->array_buffer.buffer; - event = __trace_buffer_lock_reserve(buffer, TRACE_RAW_DATA, size, -- irq_flags, preempt_count()); -+ tracing_gen_ctx()); - if (!event) - /* Ring buffer disabled, return as if not open for write */ - return -EBADF; ---- a/kernel/trace/trace.h -+++ b/kernel/trace/trace.h -@@ -589,8 +589,7 @@ struct ring_buffer_event * - trace_buffer_lock_reserve(struct trace_buffer *buffer, - int type, - unsigned long len, -- unsigned long flags, -- int pc); -+ unsigned int trace_ctx); - - struct trace_entry *tracing_get_trace_entry(struct trace_array *tr, - struct trace_array_cpu *data); -@@ -615,11 +614,11 @@ unsigned long trace_total_entries(struct - void trace_function(struct trace_array *tr, - unsigned long ip, - unsigned long parent_ip, -- unsigned long flags, int pc); -+ unsigned int trace_ctx); - void trace_graph_function(struct trace_array *tr, - unsigned long ip, - unsigned long parent_ip, -- unsigned long flags, int pc); -+ unsigned int trace_ctx); - void trace_latency_header(struct seq_file *m); - void trace_default_header(struct seq_file *m); - void print_trace_header(struct seq_file *m, struct trace_iterator *iter); -@@ -687,11 +686,10 @@ static inline void latency_fsnotify(stru - #endif - - #ifdef CONFIG_STACKTRACE --void __trace_stack(struct trace_array *tr, unsigned long flags, int skip, -- int pc); -+void __trace_stack(struct trace_array *tr, unsigned int trace_ctx, int skip); - #else --static inline void __trace_stack(struct trace_array *tr, unsigned long flags, -- int skip, int pc) -+static inline void __trace_stack(struct trace_array *tr, unsigned int trace_ctx, -+ int skip) - { - } - #endif /* CONFIG_STACKTRACE */ -@@ -831,10 +829,10 @@ extern void graph_trace_open(struct trac - extern void graph_trace_close(struct trace_iterator *iter); - extern int __trace_graph_entry(struct trace_array *tr, - struct ftrace_graph_ent *trace, -- unsigned long flags, int pc); -+ unsigned int trace_ctx); - extern void __trace_graph_return(struct trace_array *tr, - struct ftrace_graph_ret *trace, -- unsigned long flags, int pc); -+ unsigned int trace_ctx); - - #ifdef CONFIG_DYNAMIC_FTRACE - extern struct ftrace_hash __rcu *ftrace_graph_hash; -@@ -1297,15 +1295,15 @@ extern int call_filter_check_discard(str - void trace_buffer_unlock_commit_regs(struct trace_array *tr, - struct trace_buffer *buffer, - struct ring_buffer_event *event, -- unsigned long flags, int pc, -+ unsigned int trcace_ctx, - struct pt_regs *regs); - - static inline void trace_buffer_unlock_commit(struct trace_array *tr, - struct trace_buffer *buffer, - struct ring_buffer_event *event, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { -- trace_buffer_unlock_commit_regs(tr, buffer, event, flags, pc, NULL); -+ trace_buffer_unlock_commit_regs(tr, buffer, event, trace_ctx, NULL); - } - - DECLARE_PER_CPU(struct ring_buffer_event *, trace_buffered_event); -@@ -1366,8 +1364,7 @@ static inline bool - * @buffer: The ring buffer that the event is being written to - * @event: The event meta data in the ring buffer - * @entry: The event itself -- * @irq_flags: The state of the interrupts at the start of the event -- * @pc: The state of the preempt count at the start of the event. -+ * @trace_ctx: The tracing context flags. - * - * This is a helper function to handle triggers that require data - * from the event itself. It also tests the event against filters and -@@ -1377,12 +1374,12 @@ static inline void - event_trigger_unlock_commit(struct trace_event_file *file, - struct trace_buffer *buffer, - struct ring_buffer_event *event, -- void *entry, unsigned long irq_flags, int pc) -+ void *entry, unsigned int trace_ctx) - { - enum event_trigger_type tt = ETT_NONE; - - if (!__event_trigger_test_discard(file, buffer, event, entry, &tt)) -- trace_buffer_unlock_commit(file->tr, buffer, event, irq_flags, pc); -+ trace_buffer_unlock_commit(file->tr, buffer, event, trace_ctx); - - if (tt) - event_triggers_post_call(file, tt); -@@ -1394,8 +1391,7 @@ event_trigger_unlock_commit(struct trace - * @buffer: The ring buffer that the event is being written to - * @event: The event meta data in the ring buffer - * @entry: The event itself -- * @irq_flags: The state of the interrupts at the start of the event -- * @pc: The state of the preempt count at the start of the event. -+ * @trace_ctx: The tracing context flags. - * - * This is a helper function to handle triggers that require data - * from the event itself. It also tests the event against filters and -@@ -1408,14 +1404,14 @@ static inline void - event_trigger_unlock_commit_regs(struct trace_event_file *file, - struct trace_buffer *buffer, - struct ring_buffer_event *event, -- void *entry, unsigned long irq_flags, int pc, -+ void *entry, unsigned int trace_ctx, - struct pt_regs *regs) - { - enum event_trigger_type tt = ETT_NONE; - - if (!__event_trigger_test_discard(file, buffer, event, entry, &tt)) - trace_buffer_unlock_commit_regs(file->tr, buffer, event, -- irq_flags, pc, regs); -+ trace_ctx, regs); - - if (tt) - event_triggers_post_call(file, tt); ---- a/kernel/trace/trace_branch.c -+++ b/kernel/trace/trace_branch.c -@@ -37,7 +37,7 @@ probe_likely_condition(struct ftrace_lik - struct ring_buffer_event *event; - struct trace_branch *entry; - unsigned long flags; -- int pc; -+ unsigned int trace_ctx; - const char *p; - - if (current->trace_recursion & TRACE_BRANCH_BIT) -@@ -59,10 +59,10 @@ probe_likely_condition(struct ftrace_lik - if (atomic_read(&data->disabled)) - goto out; - -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx_flags(flags); - buffer = tr->array_buffer.buffer; - event = trace_buffer_lock_reserve(buffer, TRACE_BRANCH, -- sizeof(*entry), flags, pc); -+ sizeof(*entry), trace_ctx); - if (!event) - goto out; - ---- a/kernel/trace/trace_event_perf.c -+++ b/kernel/trace/trace_event_perf.c -@@ -421,11 +421,8 @@ NOKPROBE_SYMBOL(perf_trace_buf_alloc); - void perf_trace_buf_update(void *record, u16 type) - { - struct trace_entry *entry = record; -- int pc = preempt_count(); -- unsigned long flags; - -- local_save_flags(flags); -- tracing_generic_entry_update(entry, type, flags, pc); -+ tracing_generic_entry_update(entry, type, tracing_gen_ctx()); - } - NOKPROBE_SYMBOL(perf_trace_buf_update); - ---- a/kernel/trace/trace_events.c -+++ b/kernel/trace/trace_events.c -@@ -258,22 +258,19 @@ void *trace_event_buffer_reserve(struct - trace_event_ignore_this_pid(trace_file)) - return NULL; - -- local_save_flags(fbuffer->flags); -- fbuffer->pc = preempt_count(); - /* - * If CONFIG_PREEMPTION is enabled, then the tracepoint itself disables - * preemption (adding one to the preempt_count). Since we are - * interested in the preempt_count at the time the tracepoint was - * hit, we need to subtract one to offset the increment. - */ -- if (IS_ENABLED(CONFIG_PREEMPTION)) -- fbuffer->pc--; -+ fbuffer->trace_ctx = tracing_gen_ctx_dec(); - fbuffer->trace_file = trace_file; - - fbuffer->event = - trace_event_buffer_lock_reserve(&fbuffer->buffer, trace_file, - event_call->event.type, len, -- fbuffer->flags, fbuffer->pc); -+ fbuffer->trace_ctx); - if (!fbuffer->event) - return NULL; - -@@ -3679,12 +3676,11 @@ function_test_events_call(unsigned long - struct trace_buffer *buffer; - struct ring_buffer_event *event; - struct ftrace_entry *entry; -- unsigned long flags; -+ unsigned int trace_ctx; - long disabled; - int cpu; -- int pc; - -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx(); - preempt_disable_notrace(); - cpu = raw_smp_processor_id(); - disabled = atomic_inc_return(&per_cpu(ftrace_test_event_disable, cpu)); -@@ -3692,11 +3688,9 @@ function_test_events_call(unsigned long - if (disabled != 1) - goto out; - -- local_save_flags(flags); -- - event = trace_event_buffer_lock_reserve(&buffer, &event_trace_file, - TRACE_FN, sizeof(*entry), -- flags, pc); -+ trace_ctx); - if (!event) - goto out; - entry = ring_buffer_event_data(event); -@@ -3704,7 +3698,7 @@ function_test_events_call(unsigned long - entry->parent_ip = parent_ip; - - event_trigger_unlock_commit(&event_trace_file, buffer, event, -- entry, flags, pc); -+ entry, trace_ctx); - out: - atomic_dec(&per_cpu(ftrace_test_event_disable, cpu)); - preempt_enable_notrace(); ---- a/kernel/trace/trace_events_inject.c -+++ b/kernel/trace/trace_events_inject.c -@@ -192,7 +192,6 @@ static void *trace_alloc_entry(struct tr - static int parse_entry(char *str, struct trace_event_call *call, void **pentry) - { - struct ftrace_event_field *field; -- unsigned long irq_flags; - void *entry = NULL; - int entry_size; - u64 val = 0; -@@ -203,9 +202,8 @@ static int parse_entry(char *str, struct - if (!entry) - return -ENOMEM; - -- local_save_flags(irq_flags); -- tracing_generic_entry_update(entry, call->event.type, irq_flags, -- preempt_count()); -+ tracing_generic_entry_update(entry, call->event.type, -+ tracing_gen_ctx()); - - while ((len = parse_field(str, call, &field, &val)) > 0) { - if (is_function_field(field)) ---- a/kernel/trace/trace_functions.c -+++ b/kernel/trace/trace_functions.c -@@ -132,10 +132,9 @@ function_trace_call(unsigned long ip, un - { - struct trace_array *tr = op->private; - struct trace_array_cpu *data; -- unsigned long flags; -+ unsigned int trace_ctx; - int bit; - int cpu; -- int pc; - - if (unlikely(!tr->function_enabled)) - return; -@@ -144,15 +143,14 @@ function_trace_call(unsigned long ip, un - if (bit < 0) - return; - -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx(); - preempt_disable_notrace(); - - cpu = smp_processor_id(); - data = per_cpu_ptr(tr->array_buffer.data, cpu); -- if (!atomic_read(&data->disabled)) { -- local_save_flags(flags); -- trace_function(tr, ip, parent_ip, flags, pc); -- } -+ if (!atomic_read(&data->disabled)) -+ trace_function(tr, ip, parent_ip, trace_ctx); -+ - ftrace_test_recursion_unlock(bit); - preempt_enable_notrace(); - } -@@ -184,7 +182,7 @@ function_stack_trace_call(unsigned long - unsigned long flags; - long disabled; - int cpu; -- int pc; -+ unsigned int trace_ctx; - - if (unlikely(!tr->function_enabled)) - return; -@@ -199,9 +197,9 @@ function_stack_trace_call(unsigned long - disabled = atomic_inc_return(&data->disabled); - - if (likely(disabled == 1)) { -- pc = preempt_count(); -- trace_function(tr, ip, parent_ip, flags, pc); -- __trace_stack(tr, flags, STACK_SKIP, pc); -+ trace_ctx = tracing_gen_ctx_flags(flags); -+ trace_function(tr, ip, parent_ip, trace_ctx); -+ __trace_stack(tr, trace_ctx, STACK_SKIP); - } - - atomic_dec(&data->disabled); -@@ -404,13 +402,11 @@ ftrace_traceoff(unsigned long ip, unsign - - static __always_inline void trace_stack(struct trace_array *tr) - { -- unsigned long flags; -- int pc; -+ unsigned int trace_ctx; - -- local_save_flags(flags); -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx(); - -- __trace_stack(tr, flags, FTRACE_STACK_SKIP, pc); -+ __trace_stack(tr, trace_ctx, FTRACE_STACK_SKIP); - } - - static void ---- a/kernel/trace/trace_functions_graph.c -+++ b/kernel/trace/trace_functions_graph.c -@@ -96,8 +96,7 @@ print_graph_duration(struct trace_array - - int __trace_graph_entry(struct trace_array *tr, - struct ftrace_graph_ent *trace, -- unsigned long flags, -- int pc) -+ unsigned int trace_ctx) - { - struct trace_event_call *call = &event_funcgraph_entry; - struct ring_buffer_event *event; -@@ -105,7 +104,7 @@ int __trace_graph_entry(struct trace_arr - struct ftrace_graph_ent_entry *entry; - - event = trace_buffer_lock_reserve(buffer, TRACE_GRAPH_ENT, -- sizeof(*entry), flags, pc); -+ sizeof(*entry), trace_ctx); - if (!event) - return 0; - entry = ring_buffer_event_data(event); -@@ -129,10 +128,10 @@ int trace_graph_entry(struct ftrace_grap - struct trace_array *tr = graph_array; - struct trace_array_cpu *data; - unsigned long flags; -+ unsigned int trace_ctx; - long disabled; - int ret; - int cpu; -- int pc; - - if (trace_recursion_test(TRACE_GRAPH_NOTRACE_BIT)) - return 0; -@@ -174,8 +173,8 @@ int trace_graph_entry(struct ftrace_grap - data = per_cpu_ptr(tr->array_buffer.data, cpu); - disabled = atomic_inc_return(&data->disabled); - if (likely(disabled == 1)) { -- pc = preempt_count(); -- ret = __trace_graph_entry(tr, trace, flags, pc); -+ trace_ctx = tracing_gen_ctx_flags(flags); -+ ret = __trace_graph_entry(tr, trace, trace_ctx); - } else { - ret = 0; - } -@@ -188,7 +187,7 @@ int trace_graph_entry(struct ftrace_grap - - static void - __trace_graph_function(struct trace_array *tr, -- unsigned long ip, unsigned long flags, int pc) -+ unsigned long ip, unsigned int trace_ctx) - { - u64 time = trace_clock_local(); - struct ftrace_graph_ent ent = { -@@ -202,22 +201,21 @@ static void - .rettime = time, - }; - -- __trace_graph_entry(tr, &ent, flags, pc); -- __trace_graph_return(tr, &ret, flags, pc); -+ __trace_graph_entry(tr, &ent, trace_ctx); -+ __trace_graph_return(tr, &ret, trace_ctx); - } - - void - trace_graph_function(struct trace_array *tr, - unsigned long ip, unsigned long parent_ip, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { -- __trace_graph_function(tr, ip, flags, pc); -+ __trace_graph_function(tr, ip, trace_ctx); - } - - void __trace_graph_return(struct trace_array *tr, - struct ftrace_graph_ret *trace, -- unsigned long flags, -- int pc) -+ unsigned int trace_ctx) - { - struct trace_event_call *call = &event_funcgraph_exit; - struct ring_buffer_event *event; -@@ -225,7 +223,7 @@ void __trace_graph_return(struct trace_a - struct ftrace_graph_ret_entry *entry; - - event = trace_buffer_lock_reserve(buffer, TRACE_GRAPH_RET, -- sizeof(*entry), flags, pc); -+ sizeof(*entry), trace_ctx); - if (!event) - return; - entry = ring_buffer_event_data(event); -@@ -239,9 +237,9 @@ void trace_graph_return(struct ftrace_gr - struct trace_array *tr = graph_array; - struct trace_array_cpu *data; - unsigned long flags; -+ unsigned int trace_ctx; - long disabled; - int cpu; -- int pc; - - ftrace_graph_addr_finish(trace); - -@@ -255,8 +253,8 @@ void trace_graph_return(struct ftrace_gr - data = per_cpu_ptr(tr->array_buffer.data, cpu); - disabled = atomic_inc_return(&data->disabled); - if (likely(disabled == 1)) { -- pc = preempt_count(); -- __trace_graph_return(tr, trace, flags, pc); -+ trace_ctx = tracing_gen_ctx_flags(flags); -+ __trace_graph_return(tr, trace, trace_ctx); - } - atomic_dec(&data->disabled); - local_irq_restore(flags); ---- a/kernel/trace/trace_hwlat.c -+++ b/kernel/trace/trace_hwlat.c -@@ -108,14 +108,9 @@ static void trace_hwlat_sample(struct hw - struct trace_buffer *buffer = tr->array_buffer.buffer; - struct ring_buffer_event *event; - struct hwlat_entry *entry; -- unsigned long flags; -- int pc; -- -- pc = preempt_count(); -- local_save_flags(flags); - - event = trace_buffer_lock_reserve(buffer, TRACE_HWLAT, sizeof(*entry), -- flags, pc); -+ tracing_gen_ctx()); - if (!event) - return; - entry = ring_buffer_event_data(event); ---- a/kernel/trace/trace_irqsoff.c -+++ b/kernel/trace/trace_irqsoff.c -@@ -143,11 +143,14 @@ irqsoff_tracer_call(unsigned long ip, un - struct trace_array *tr = irqsoff_trace; - struct trace_array_cpu *data; - unsigned long flags; -+ unsigned int trace_ctx; - - if (!func_prolog_dec(tr, &data, &flags)) - return; - -- trace_function(tr, ip, parent_ip, flags, preempt_count()); -+ trace_ctx = tracing_gen_ctx_flags(flags); -+ -+ trace_function(tr, ip, parent_ip, trace_ctx); - - atomic_dec(&data->disabled); - } -@@ -177,8 +180,8 @@ static int irqsoff_graph_entry(struct ft - struct trace_array *tr = irqsoff_trace; - struct trace_array_cpu *data; - unsigned long flags; -+ unsigned int trace_ctx; - int ret; -- int pc; - - if (ftrace_graph_ignore_func(trace)) - return 0; -@@ -195,8 +198,8 @@ static int irqsoff_graph_entry(struct ft - if (!func_prolog_dec(tr, &data, &flags)) - return 0; - -- pc = preempt_count(); -- ret = __trace_graph_entry(tr, trace, flags, pc); -+ trace_ctx = tracing_gen_ctx_flags(flags); -+ ret = __trace_graph_entry(tr, trace, trace_ctx); - atomic_dec(&data->disabled); - - return ret; -@@ -207,15 +210,15 @@ static void irqsoff_graph_return(struct - struct trace_array *tr = irqsoff_trace; - struct trace_array_cpu *data; - unsigned long flags; -- int pc; -+ unsigned int trace_ctx; - - ftrace_graph_addr_finish(trace); - - if (!func_prolog_dec(tr, &data, &flags)) - return; - -- pc = preempt_count(); -- __trace_graph_return(tr, trace, flags, pc); -+ trace_ctx = tracing_gen_ctx_flags(flags); -+ __trace_graph_return(tr, trace, trace_ctx); - atomic_dec(&data->disabled); - } - -@@ -267,12 +270,12 @@ static void irqsoff_print_header(struct - static void - __trace_function(struct trace_array *tr, - unsigned long ip, unsigned long parent_ip, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { - if (is_graph(tr)) -- trace_graph_function(tr, ip, parent_ip, flags, pc); -+ trace_graph_function(tr, ip, parent_ip, trace_ctx); - else -- trace_function(tr, ip, parent_ip, flags, pc); -+ trace_function(tr, ip, parent_ip, trace_ctx); - } - - #else -@@ -322,15 +325,13 @@ check_critical_timing(struct trace_array - { - u64 T0, T1, delta; - unsigned long flags; -- int pc; -+ unsigned int trace_ctx; - - T0 = data->preempt_timestamp; - T1 = ftrace_now(cpu); - delta = T1-T0; - -- local_save_flags(flags); -- -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx(); - - if (!report_latency(tr, delta)) - goto out; -@@ -341,9 +342,9 @@ check_critical_timing(struct trace_array - if (!report_latency(tr, delta)) - goto out_unlock; - -- __trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc); -+ __trace_function(tr, CALLER_ADDR0, parent_ip, trace_ctx); - /* Skip 5 functions to get to the irq/preempt enable function */ -- __trace_stack(tr, flags, 5, pc); -+ __trace_stack(tr, trace_ctx, 5); - - if (data->critical_sequence != max_sequence) - goto out_unlock; -@@ -363,16 +364,15 @@ check_critical_timing(struct trace_array - out: - data->critical_sequence = max_sequence; - data->preempt_timestamp = ftrace_now(cpu); -- __trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc); -+ __trace_function(tr, CALLER_ADDR0, parent_ip, trace_ctx); - } - - static nokprobe_inline void --start_critical_timing(unsigned long ip, unsigned long parent_ip, int pc) -+start_critical_timing(unsigned long ip, unsigned long parent_ip) - { - int cpu; - struct trace_array *tr = irqsoff_trace; - struct trace_array_cpu *data; -- unsigned long flags; - - if (!tracer_enabled || !tracing_is_enabled()) - return; -@@ -393,9 +393,7 @@ start_critical_timing(unsigned long ip, - data->preempt_timestamp = ftrace_now(cpu); - data->critical_start = parent_ip ? : ip; - -- local_save_flags(flags); -- -- __trace_function(tr, ip, parent_ip, flags, pc); -+ __trace_function(tr, ip, parent_ip, tracing_gen_ctx()); - - per_cpu(tracing_cpu, cpu) = 1; - -@@ -403,12 +401,12 @@ start_critical_timing(unsigned long ip, - } - - static nokprobe_inline void --stop_critical_timing(unsigned long ip, unsigned long parent_ip, int pc) -+stop_critical_timing(unsigned long ip, unsigned long parent_ip) - { - int cpu; - struct trace_array *tr = irqsoff_trace; - struct trace_array_cpu *data; -- unsigned long flags; -+ unsigned int trace_ctx; - - cpu = raw_smp_processor_id(); - /* Always clear the tracing cpu on stopping the trace */ -@@ -428,8 +426,8 @@ stop_critical_timing(unsigned long ip, u - - atomic_inc(&data->disabled); - -- local_save_flags(flags); -- __trace_function(tr, ip, parent_ip, flags, pc); -+ trace_ctx = tracing_gen_ctx(); -+ __trace_function(tr, ip, parent_ip, trace_ctx); - check_critical_timing(tr, data, parent_ip ? : ip, cpu); - data->critical_start = 0; - atomic_dec(&data->disabled); -@@ -438,20 +436,16 @@ stop_critical_timing(unsigned long ip, u - /* start and stop critical timings used to for stoppage (in idle) */ - void start_critical_timings(void) - { -- int pc = preempt_count(); -- -- if (preempt_trace(pc) || irq_trace()) -- start_critical_timing(CALLER_ADDR0, CALLER_ADDR1, pc); -+ if (preempt_trace(preempt_count()) || irq_trace()) -+ start_critical_timing(CALLER_ADDR0, CALLER_ADDR1); - } - EXPORT_SYMBOL_GPL(start_critical_timings); - NOKPROBE_SYMBOL(start_critical_timings); - - void stop_critical_timings(void) - { -- int pc = preempt_count(); -- -- if (preempt_trace(pc) || irq_trace()) -- stop_critical_timing(CALLER_ADDR0, CALLER_ADDR1, pc); -+ if (preempt_trace(preempt_count()) || irq_trace()) -+ stop_critical_timing(CALLER_ADDR0, CALLER_ADDR1); - } - EXPORT_SYMBOL_GPL(stop_critical_timings); - NOKPROBE_SYMBOL(stop_critical_timings); -@@ -613,19 +607,15 @@ static void irqsoff_tracer_stop(struct t - */ - void tracer_hardirqs_on(unsigned long a0, unsigned long a1) - { -- unsigned int pc = preempt_count(); -- -- if (!preempt_trace(pc) && irq_trace()) -- stop_critical_timing(a0, a1, pc); -+ if (!preempt_trace(preempt_count()) && irq_trace()) -+ stop_critical_timing(a0, a1); - } - NOKPROBE_SYMBOL(tracer_hardirqs_on); - - void tracer_hardirqs_off(unsigned long a0, unsigned long a1) - { -- unsigned int pc = preempt_count(); -- -- if (!preempt_trace(pc) && irq_trace()) -- start_critical_timing(a0, a1, pc); -+ if (!preempt_trace(preempt_count()) && irq_trace()) -+ start_critical_timing(a0, a1); - } - NOKPROBE_SYMBOL(tracer_hardirqs_off); - -@@ -665,18 +655,14 @@ static struct tracer irqsoff_tracer __re - #ifdef CONFIG_PREEMPT_TRACER - void tracer_preempt_on(unsigned long a0, unsigned long a1) - { -- int pc = preempt_count(); -- -- if (preempt_trace(pc) && !irq_trace()) -- stop_critical_timing(a0, a1, pc); -+ if (preempt_trace(preempt_count()) && !irq_trace()) -+ stop_critical_timing(a0, a1); - } - - void tracer_preempt_off(unsigned long a0, unsigned long a1) - { -- int pc = preempt_count(); -- -- if (preempt_trace(pc) && !irq_trace()) -- start_critical_timing(a0, a1, pc); -+ if (preempt_trace(preempt_count()) && !irq_trace()) -+ start_critical_timing(a0, a1); - } - - static int preemptoff_tracer_init(struct trace_array *tr) ---- a/kernel/trace/trace_kprobe.c -+++ b/kernel/trace/trace_kprobe.c -@@ -1386,8 +1386,7 @@ static nokprobe_inline void - if (trace_trigger_soft_disabled(trace_file)) - return; - -- local_save_flags(fbuffer.flags); -- fbuffer.pc = preempt_count(); -+ fbuffer.trace_ctx = tracing_gen_ctx(); - fbuffer.trace_file = trace_file; - - dsize = __get_data_size(&tk->tp, regs); -@@ -1396,7 +1395,7 @@ static nokprobe_inline void - trace_event_buffer_lock_reserve(&fbuffer.buffer, trace_file, - call->event.type, - sizeof(*entry) + tk->tp.size + dsize, -- fbuffer.flags, fbuffer.pc); -+ fbuffer.trace_ctx); - if (!fbuffer.event) - return; - -@@ -1434,8 +1433,7 @@ static nokprobe_inline void - if (trace_trigger_soft_disabled(trace_file)) - return; - -- local_save_flags(fbuffer.flags); -- fbuffer.pc = preempt_count(); -+ fbuffer.trace_ctx = tracing_gen_ctx(); - fbuffer.trace_file = trace_file; - - dsize = __get_data_size(&tk->tp, regs); -@@ -1443,7 +1441,7 @@ static nokprobe_inline void - trace_event_buffer_lock_reserve(&fbuffer.buffer, trace_file, - call->event.type, - sizeof(*entry) + tk->tp.size + dsize, -- fbuffer.flags, fbuffer.pc); -+ fbuffer.trace_ctx); - if (!fbuffer.event) - return; - ---- a/kernel/trace/trace_mmiotrace.c -+++ b/kernel/trace/trace_mmiotrace.c -@@ -300,10 +300,11 @@ static void __trace_mmiotrace_rw(struct - struct trace_buffer *buffer = tr->array_buffer.buffer; - struct ring_buffer_event *event; - struct trace_mmiotrace_rw *entry; -- int pc = preempt_count(); -+ unsigned int trace_ctx; - -+ trace_ctx = tracing_gen_ctx_flags(0); - event = trace_buffer_lock_reserve(buffer, TRACE_MMIO_RW, -- sizeof(*entry), 0, pc); -+ sizeof(*entry), trace_ctx); - if (!event) { - atomic_inc(&dropped_count); - return; -@@ -312,7 +313,7 @@ static void __trace_mmiotrace_rw(struct - entry->rw = *rw; - - if (!call_filter_check_discard(call, entry, buffer, event)) -- trace_buffer_unlock_commit(tr, buffer, event, 0, pc); -+ trace_buffer_unlock_commit(tr, buffer, event, trace_ctx); - } - - void mmio_trace_rw(struct mmiotrace_rw *rw) -@@ -330,10 +331,11 @@ static void __trace_mmiotrace_map(struct - struct trace_buffer *buffer = tr->array_buffer.buffer; - struct ring_buffer_event *event; - struct trace_mmiotrace_map *entry; -- int pc = preempt_count(); -+ unsigned int trace_ctx; - -+ trace_ctx = tracing_gen_ctx_flags(0); - event = trace_buffer_lock_reserve(buffer, TRACE_MMIO_MAP, -- sizeof(*entry), 0, pc); -+ sizeof(*entry), trace_ctx); - if (!event) { - atomic_inc(&dropped_count); - return; -@@ -342,7 +344,7 @@ static void __trace_mmiotrace_map(struct - entry->map = *map; - - if (!call_filter_check_discard(call, entry, buffer, event)) -- trace_buffer_unlock_commit(tr, buffer, event, 0, pc); -+ trace_buffer_unlock_commit(tr, buffer, event, trace_ctx); - } - - void mmio_trace_mapping(struct mmiotrace_map *map) ---- a/kernel/trace/trace_sched_wakeup.c -+++ b/kernel/trace/trace_sched_wakeup.c -@@ -67,7 +67,7 @@ static bool function_enabled; - static int - func_prolog_preempt_disable(struct trace_array *tr, - struct trace_array_cpu **data, -- int *pc) -+ unsigned int *trace_ctx) - { - long disabled; - int cpu; -@@ -75,7 +75,7 @@ func_prolog_preempt_disable(struct trace - if (likely(!wakeup_task)) - return 0; - -- *pc = preempt_count(); -+ *trace_ctx = tracing_gen_ctx(); - preempt_disable_notrace(); - - cpu = raw_smp_processor_id(); -@@ -116,8 +116,8 @@ static int wakeup_graph_entry(struct ftr - { - struct trace_array *tr = wakeup_trace; - struct trace_array_cpu *data; -- unsigned long flags; -- int pc, ret = 0; -+ unsigned int trace_ctx; -+ int ret = 0; - - if (ftrace_graph_ignore_func(trace)) - return 0; -@@ -131,11 +131,10 @@ static int wakeup_graph_entry(struct ftr - if (ftrace_graph_notrace_addr(trace->func)) - return 1; - -- if (!func_prolog_preempt_disable(tr, &data, &pc)) -+ if (!func_prolog_preempt_disable(tr, &data, &trace_ctx)) - return 0; - -- local_save_flags(flags); -- ret = __trace_graph_entry(tr, trace, flags, pc); -+ ret = __trace_graph_entry(tr, trace, trace_ctx); - atomic_dec(&data->disabled); - preempt_enable_notrace(); - -@@ -146,16 +145,14 @@ static void wakeup_graph_return(struct f - { - struct trace_array *tr = wakeup_trace; - struct trace_array_cpu *data; -- unsigned long flags; -- int pc; -+ unsigned int trace_ctx; - - ftrace_graph_addr_finish(trace); - -- if (!func_prolog_preempt_disable(tr, &data, &pc)) -+ if (!func_prolog_preempt_disable(tr, &data, &trace_ctx)) - return; - -- local_save_flags(flags); -- __trace_graph_return(tr, trace, flags, pc); -+ __trace_graph_return(tr, trace, trace_ctx); - atomic_dec(&data->disabled); - - preempt_enable_notrace(); -@@ -217,13 +214,13 @@ wakeup_tracer_call(unsigned long ip, uns - struct trace_array *tr = wakeup_trace; - struct trace_array_cpu *data; - unsigned long flags; -- int pc; -+ unsigned int trace_ctx; - -- if (!func_prolog_preempt_disable(tr, &data, &pc)) -+ if (!func_prolog_preempt_disable(tr, &data, &trace_ctx)) - return; - - local_irq_save(flags); -- trace_function(tr, ip, parent_ip, flags, pc); -+ trace_function(tr, ip, parent_ip, trace_ctx); - local_irq_restore(flags); - - atomic_dec(&data->disabled); -@@ -303,12 +300,12 @@ static void wakeup_print_header(struct s - static void - __trace_function(struct trace_array *tr, - unsigned long ip, unsigned long parent_ip, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { - if (is_graph(tr)) -- trace_graph_function(tr, ip, parent_ip, flags, pc); -+ trace_graph_function(tr, ip, parent_ip, trace_ctx); - else -- trace_function(tr, ip, parent_ip, flags, pc); -+ trace_function(tr, ip, parent_ip, trace_ctx); - } - - static int wakeup_flag_changed(struct trace_array *tr, u32 mask, int set) -@@ -375,7 +372,7 @@ static void - tracing_sched_switch_trace(struct trace_array *tr, - struct task_struct *prev, - struct task_struct *next, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { - struct trace_event_call *call = &event_context_switch; - struct trace_buffer *buffer = tr->array_buffer.buffer; -@@ -383,7 +380,7 @@ tracing_sched_switch_trace(struct trace_ - struct ctx_switch_entry *entry; - - event = trace_buffer_lock_reserve(buffer, TRACE_CTX, -- sizeof(*entry), flags, pc); -+ sizeof(*entry), trace_ctx); - if (!event) - return; - entry = ring_buffer_event_data(event); -@@ -396,14 +393,14 @@ tracing_sched_switch_trace(struct trace_ - entry->next_cpu = task_cpu(next); - - if (!call_filter_check_discard(call, entry, buffer, event)) -- trace_buffer_unlock_commit(tr, buffer, event, flags, pc); -+ trace_buffer_unlock_commit(tr, buffer, event, trace_ctx); - } - - static void - tracing_sched_wakeup_trace(struct trace_array *tr, - struct task_struct *wakee, - struct task_struct *curr, -- unsigned long flags, int pc) -+ unsigned int trace_ctx) - { - struct trace_event_call *call = &event_wakeup; - struct ring_buffer_event *event; -@@ -411,7 +408,7 @@ tracing_sched_wakeup_trace(struct trace_ - struct trace_buffer *buffer = tr->array_buffer.buffer; - - event = trace_buffer_lock_reserve(buffer, TRACE_WAKE, -- sizeof(*entry), flags, pc); -+ sizeof(*entry), trace_ctx); - if (!event) - return; - entry = ring_buffer_event_data(event); -@@ -424,7 +421,7 @@ tracing_sched_wakeup_trace(struct trace_ - entry->next_cpu = task_cpu(wakee); - - if (!call_filter_check_discard(call, entry, buffer, event)) -- trace_buffer_unlock_commit(tr, buffer, event, flags, pc); -+ trace_buffer_unlock_commit(tr, buffer, event, trace_ctx); - } - - static void notrace -@@ -436,7 +433,7 @@ probe_wakeup_sched_switch(void *ignore, - unsigned long flags; - long disabled; - int cpu; -- int pc; -+ unsigned int trace_ctx; - - tracing_record_cmdline(prev); - -@@ -455,8 +452,6 @@ probe_wakeup_sched_switch(void *ignore, - if (next != wakeup_task) - return; - -- pc = preempt_count(); -- - /* disable local data, not wakeup_cpu data */ - cpu = raw_smp_processor_id(); - disabled = atomic_inc_return(&per_cpu_ptr(wakeup_trace->array_buffer.data, cpu)->disabled); -@@ -464,6 +459,8 @@ probe_wakeup_sched_switch(void *ignore, - goto out; - - local_irq_save(flags); -+ trace_ctx = tracing_gen_ctx_flags(flags); -+ - arch_spin_lock(&wakeup_lock); - - /* We could race with grabbing wakeup_lock */ -@@ -473,9 +470,9 @@ probe_wakeup_sched_switch(void *ignore, - /* The task we are waiting for is waking up */ - data = per_cpu_ptr(wakeup_trace->array_buffer.data, wakeup_cpu); - -- __trace_function(wakeup_trace, CALLER_ADDR0, CALLER_ADDR1, flags, pc); -- tracing_sched_switch_trace(wakeup_trace, prev, next, flags, pc); -- __trace_stack(wakeup_trace, flags, 0, pc); -+ __trace_function(wakeup_trace, CALLER_ADDR0, CALLER_ADDR1, trace_ctx); -+ tracing_sched_switch_trace(wakeup_trace, prev, next, trace_ctx); -+ __trace_stack(wakeup_trace, trace_ctx, 0); - - T0 = data->preempt_timestamp; - T1 = ftrace_now(cpu); -@@ -527,9 +524,8 @@ probe_wakeup(void *ignore, struct task_s - { - struct trace_array_cpu *data; - int cpu = smp_processor_id(); -- unsigned long flags; - long disabled; -- int pc; -+ unsigned int trace_ctx; - - if (likely(!tracer_enabled)) - return; -@@ -550,11 +546,12 @@ probe_wakeup(void *ignore, struct task_s - (!dl_task(p) && (p->prio >= wakeup_prio || p->prio >= current->prio))) - return; - -- pc = preempt_count(); - disabled = atomic_inc_return(&per_cpu_ptr(wakeup_trace->array_buffer.data, cpu)->disabled); - if (unlikely(disabled != 1)) - goto out; - -+ trace_ctx = tracing_gen_ctx(); -+ - /* interrupts should be off from try_to_wake_up */ - arch_spin_lock(&wakeup_lock); - -@@ -581,19 +578,17 @@ probe_wakeup(void *ignore, struct task_s - - wakeup_task = get_task_struct(p); - -- local_save_flags(flags); -- - data = per_cpu_ptr(wakeup_trace->array_buffer.data, wakeup_cpu); - data->preempt_timestamp = ftrace_now(cpu); -- tracing_sched_wakeup_trace(wakeup_trace, p, current, flags, pc); -- __trace_stack(wakeup_trace, flags, 0, pc); -+ tracing_sched_wakeup_trace(wakeup_trace, p, current, trace_ctx); -+ __trace_stack(wakeup_trace, trace_ctx, 0); - - /* - * We must be careful in using CALLER_ADDR2. But since wake_up - * is not called by an assembly function (where as schedule is) - * it should be safe to use it here. - */ -- __trace_function(wakeup_trace, CALLER_ADDR1, CALLER_ADDR2, flags, pc); -+ __trace_function(wakeup_trace, CALLER_ADDR1, CALLER_ADDR2, trace_ctx); - - out_locked: - arch_spin_unlock(&wakeup_lock); ---- a/kernel/trace/trace_syscalls.c -+++ b/kernel/trace/trace_syscalls.c -@@ -298,9 +298,8 @@ static void ftrace_syscall_enter(void *d - struct syscall_metadata *sys_data; - struct ring_buffer_event *event; - struct trace_buffer *buffer; -- unsigned long irq_flags; -+ unsigned int trace_ctx; - unsigned long args[6]; -- int pc; - int syscall_nr; - int size; - -@@ -322,12 +321,11 @@ static void ftrace_syscall_enter(void *d - - size = sizeof(*entry) + sizeof(unsigned long) * sys_data->nb_args; - -- local_save_flags(irq_flags); -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx(); - - buffer = tr->array_buffer.buffer; - event = trace_buffer_lock_reserve(buffer, -- sys_data->enter_event->event.type, size, irq_flags, pc); -+ sys_data->enter_event->event.type, size, trace_ctx); - if (!event) - return; - -@@ -337,7 +335,7 @@ static void ftrace_syscall_enter(void *d - memcpy(entry->args, args, sizeof(unsigned long) * sys_data->nb_args); - - event_trigger_unlock_commit(trace_file, buffer, event, entry, -- irq_flags, pc); -+ trace_ctx); - } - - static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret) -@@ -348,8 +346,7 @@ static void ftrace_syscall_exit(void *da - struct syscall_metadata *sys_data; - struct ring_buffer_event *event; - struct trace_buffer *buffer; -- unsigned long irq_flags; -- int pc; -+ unsigned int trace_ctx; - int syscall_nr; - - syscall_nr = trace_get_syscall_nr(current, regs); -@@ -368,13 +365,12 @@ static void ftrace_syscall_exit(void *da - if (!sys_data) - return; - -- local_save_flags(irq_flags); -- pc = preempt_count(); -+ trace_ctx = tracing_gen_ctx(); - - buffer = tr->array_buffer.buffer; - event = trace_buffer_lock_reserve(buffer, - sys_data->exit_event->event.type, sizeof(*entry), -- irq_flags, pc); -+ trace_ctx); - if (!event) - return; - -@@ -383,7 +379,7 @@ static void ftrace_syscall_exit(void *da - entry->ret = syscall_get_return_value(current, regs); - - event_trigger_unlock_commit(trace_file, buffer, event, entry, -- irq_flags, pc); -+ trace_ctx); - } - - static int reg_event_syscall_enter(struct trace_event_file *file, ---- a/kernel/trace/trace_uprobe.c -+++ b/kernel/trace/trace_uprobe.c -@@ -961,7 +961,7 @@ static void __uprobe_trace_func(struct t - esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu)); - size = esize + tu->tp.size + dsize; - event = trace_event_buffer_lock_reserve(&buffer, trace_file, -- call->event.type, size, 0, 0); -+ call->event.type, size, 0); - if (!event) - return; - -@@ -977,7 +977,7 @@ static void __uprobe_trace_func(struct t - - memcpy(data, ucb->buf, tu->tp.size + dsize); - -- event_trigger_unlock_commit(trace_file, buffer, event, entry, 0, 0); -+ event_trigger_unlock_commit(trace_file, buffer, event, entry, 0); - } - - /* uprobe handler */ diff --git a/kernel/patches-5.11.x-rt/0016-0002-tracing-Inline-tracing_gen_ctx_flags.patch b/kernel/patches-5.11.x-rt/0016-0002-tracing-Inline-tracing_gen_ctx_flags.patch deleted file mode 100644 index a178c6cabb..0000000000 --- a/kernel/patches-5.11.x-rt/0016-0002-tracing-Inline-tracing_gen_ctx_flags.patch +++ /dev/null @@ -1,173 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 25 Jan 2021 20:45:09 +0100 -Subject: [PATCH 2/4] tracing: Inline tracing_gen_ctx_flags() - -Inline tracing_gen_ctx_flags(). This allows to have one ifdef -CONFIG_TRACE_IRQFLAGS_SUPPORT. - -This requires to move `trace_flag_type' so tracing_gen_ctx_flags() can -use it. - -Link: https://lkml.kernel.org/r/20210125194511.3924915-3-bigeasy@linutronix.de - -Suggested-by: Steven Rostedt -Link: https://lkml.kernel.org/r/20210125140323.6b1ff20c@gandalf.local.home -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/trace_events.h | 54 ++++++++++++++++++++++++++++++++++++++++--- - kernel/trace/trace.c | 38 +----------------------------- - kernel/trace/trace.h | 19 --------------- - 3 files changed, 53 insertions(+), 58 deletions(-) - ---- a/include/linux/trace_events.h -+++ b/include/linux/trace_events.h -@@ -160,9 +160,57 @@ static inline void tracing_generic_entry - entry->flags = trace_ctx >> 16; - } - --unsigned int tracing_gen_ctx_flags(unsigned long irqflags); --unsigned int tracing_gen_ctx(void); --unsigned int tracing_gen_ctx_dec(void); -+unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status); -+ -+enum trace_flag_type { -+ TRACE_FLAG_IRQS_OFF = 0x01, -+ TRACE_FLAG_IRQS_NOSUPPORT = 0x02, -+ TRACE_FLAG_NEED_RESCHED = 0x04, -+ TRACE_FLAG_HARDIRQ = 0x08, -+ TRACE_FLAG_SOFTIRQ = 0x10, -+ TRACE_FLAG_PREEMPT_RESCHED = 0x20, -+ TRACE_FLAG_NMI = 0x40, -+}; -+ -+#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT -+static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags) -+{ -+ unsigned int irq_status = irqs_disabled_flags(irqflags) ? -+ TRACE_FLAG_IRQS_OFF : 0; -+ return tracing_gen_ctx_irq_test(irq_status); -+} -+static inline unsigned int tracing_gen_ctx(void) -+{ -+ unsigned long irqflags; -+ -+ local_save_flags(irqflags); -+ return tracing_gen_ctx_flags(irqflags); -+} -+#else -+ -+static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags) -+{ -+ return tracing_gen_ctx_irq_test(TRACE_FLAG_IRQS_NOSUPPORT); -+} -+static inline unsigned int tracing_gen_ctx(void) -+{ -+ return tracing_gen_ctx_irq_test(TRACE_FLAG_IRQS_NOSUPPORT); -+} -+#endif -+ -+static inline unsigned int tracing_gen_ctx_dec(void) -+{ -+ unsigned int trace_ctx; -+ -+ trace_ctx = tracing_gen_ctx(); -+ /* -+ * Subtract one from the preeption counter if preemption is enabled, -+ * see trace_event_buffer_reserve()for details. -+ */ -+ if (IS_ENABLED(CONFIG_PREEMPTION)) -+ trace_ctx--; -+ return trace_ctx; -+} - - struct trace_event_file; - ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -2578,20 +2578,13 @@ enum print_line_t trace_handle_return(st - } - EXPORT_SYMBOL_GPL(trace_handle_return); - --unsigned int tracing_gen_ctx_flags(unsigned long irqflags) -+unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status) - { -- unsigned int trace_flags = 0; -+ unsigned int trace_flags = irqs_status; - unsigned int pc; - - pc = preempt_count(); - --#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT -- if (irqs_disabled_flags(irqflags)) -- trace_flags |= TRACE_FLAG_IRQS_OFF; --#else -- trace_flags |= TRACE_FLAG_IRQS_NOSUPPORT; --#endif -- - if (pc & NMI_MASK) - trace_flags |= TRACE_FLAG_NMI; - if (pc & HARDIRQ_MASK) -@@ -2607,33 +2600,6 @@ unsigned int tracing_gen_ctx_flags(unsig - return (trace_flags << 16) | (pc & 0xff); - } - --unsigned int tracing_gen_ctx(void) --{ -- unsigned long irqflags; -- --#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT -- local_save_flags(irqflags); --#else -- irqflags = 0; --#endif -- return tracing_gen_ctx_flags(irqflags); --} -- --unsigned int tracing_gen_ctx_dec(void) --{ -- unsigned int trace_ctx; -- -- trace_ctx = tracing_gen_ctx(); -- -- /* -- * Subtract one from the preeption counter if preemption is enabled, -- * see trace_event_buffer_reserve()for details. -- */ -- if (IS_ENABLED(CONFIG_PREEMPTION)) -- trace_ctx--; -- return trace_ctx; --} -- - struct ring_buffer_event * - trace_buffer_lock_reserve(struct trace_buffer *buffer, - int type, ---- a/kernel/trace/trace.h -+++ b/kernel/trace/trace.h -@@ -136,25 +136,6 @@ struct kretprobe_trace_entry_head { - unsigned long ret_ip; - }; - --/* -- * trace_flag_type is an enumeration that holds different -- * states when a trace occurs. These are: -- * IRQS_OFF - interrupts were disabled -- * IRQS_NOSUPPORT - arch does not support irqs_disabled_flags -- * NEED_RESCHED - reschedule is requested -- * HARDIRQ - inside an interrupt handler -- * SOFTIRQ - inside a softirq handler -- */ --enum trace_flag_type { -- TRACE_FLAG_IRQS_OFF = 0x01, -- TRACE_FLAG_IRQS_NOSUPPORT = 0x02, -- TRACE_FLAG_NEED_RESCHED = 0x04, -- TRACE_FLAG_HARDIRQ = 0x08, -- TRACE_FLAG_SOFTIRQ = 0x10, -- TRACE_FLAG_PREEMPT_RESCHED = 0x20, -- TRACE_FLAG_NMI = 0x40, --}; -- - #define TRACE_BUF_SIZE 1024 - - struct trace_array; diff --git a/kernel/patches-5.11.x-rt/0017-0003-tracing-Use-in_serving_softirq-to-deduct-softirq-sta.patch b/kernel/patches-5.11.x-rt/0017-0003-tracing-Use-in_serving_softirq-to-deduct-softirq-sta.patch deleted file mode 100644 index 8bdd068848..0000000000 --- a/kernel/patches-5.11.x-rt/0017-0003-tracing-Use-in_serving_softirq-to-deduct-softirq-sta.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 25 Jan 2021 20:45:10 +0100 -Subject: [PATCH 3/4] tracing: Use in_serving_softirq() to deduct softirq - status. - -PREEMPT_RT does not report "serving softirq" because the tracing core -looks at the preemption counter while PREEMPT_RT does not update it -while processing softirqs in order to remain preemptible. The -information is stored somewhere else. -The in_serving_softirq() macro and the SOFTIRQ_OFFSET define are still -working but not on the preempt-counter. - -Use in_serving_softirq() macro which works on PREEMPT_RT. On !PREEMPT_RT -the compiler (gcc-10 / clang-11) is smart enough to optimize the -in_serving_softirq() related read of the preemption counter away. -The only difference I noticed by using in_serving_softirq() on -!PREEMPT_RT is that gcc-10 implemented tracing_gen_ctx_flags() as -reading FLAG, jmp _tracing_gen_ctx_flags(). Without in_serving_softirq() -it inlined _tracing_gen_ctx_flags() into tracing_gen_ctx_flags(). - -Link: https://lkml.kernel.org/r/20210125194511.3924915-4-bigeasy@linutronix.de - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/trace/trace.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -2589,8 +2589,7 @@ unsigned int tracing_gen_ctx_irq_test(un - trace_flags |= TRACE_FLAG_NMI; - if (pc & HARDIRQ_MASK) - trace_flags |= TRACE_FLAG_HARDIRQ; -- -- if (pc & SOFTIRQ_OFFSET) -+ if (in_serving_softirq()) - trace_flags |= TRACE_FLAG_SOFTIRQ; - - if (tif_need_resched()) diff --git a/kernel/patches-5.11.x-rt/0018-0004-tracing-Remove-NULL-check-from-current-in-tracing_ge.patch b/kernel/patches-5.11.x-rt/0018-0004-tracing-Remove-NULL-check-from-current-in-tracing_ge.patch deleted file mode 100644 index 6ad166ebcd..0000000000 --- a/kernel/patches-5.11.x-rt/0018-0004-tracing-Remove-NULL-check-from-current-in-tracing_ge.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 25 Jan 2021 20:45:11 +0100 -Subject: [PATCH 4/4] tracing: Remove NULL check from current in - tracing_generic_entry_update(). - -I can't imagine when or why `current' would return a NULL pointer. This -check was added in commit - 72829bc3d63cd ("ftrace: move enums to ftrace.h and make helper function global") - -but it doesn't give me hint why it was needed. - -Assume `current' never returns a NULL pointer and remove the check. - -Link: https://lkml.kernel.org/r/20210125194511.3924915-5-bigeasy@linutronix.de - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/trace_events.h | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - ---- a/include/linux/trace_events.h -+++ b/include/linux/trace_events.h -@@ -152,10 +152,8 @@ static inline void tracing_generic_entry - unsigned short type, - unsigned int trace_ctx) - { -- struct task_struct *tsk = current; -- - entry->preempt_count = trace_ctx & 0xff; -- entry->pid = (tsk) ? tsk->pid : 0; -+ entry->pid = current->pid; - entry->type = type; - entry->flags = trace_ctx >> 16; - } diff --git a/kernel/patches-5.11.x-rt/0019-tpm-remove-tpm_dev_wq_lock.patch b/kernel/patches-5.11.x-rt/0019-tpm-remove-tpm_dev_wq_lock.patch deleted file mode 100644 index 9493edd68d..0000000000 --- a/kernel/patches-5.11.x-rt/0019-tpm-remove-tpm_dev_wq_lock.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 11 Feb 2019 11:33:11 +0100 -Subject: [PATCH] tpm: remove tpm_dev_wq_lock - -Added in commit - - 9e1b74a63f776 ("tpm: add support for nonblocking operation") - -but never actually used it. - -Cc: Philip Tricca -Cc: Tadeusz Struk -Cc: Jarkko Sakkinen -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/char/tpm/tpm-dev-common.c | 1 - - 1 file changed, 1 deletion(-) - ---- a/drivers/char/tpm/tpm-dev-common.c -+++ b/drivers/char/tpm/tpm-dev-common.c -@@ -20,7 +20,6 @@ - #include "tpm-dev.h" - - static struct workqueue_struct *tpm_dev_wq; --static DEFINE_MUTEX(tpm_dev_wq_lock); - - static ssize_t tpm_dev_transmit(struct tpm_chip *chip, struct tpm_space *space, - u8 *buf, size_t bufsiz) diff --git a/kernel/patches-5.11.x-rt/0020-powerpc-mm-Move-the-linear_mapping_mutex-to-the-ifde.patch b/kernel/patches-5.11.x-rt/0020-powerpc-mm-Move-the-linear_mapping_mutex-to-the-ifde.patch deleted file mode 100644 index 80f237522b..0000000000 --- a/kernel/patches-5.11.x-rt/0020-powerpc-mm-Move-the-linear_mapping_mutex-to-the-ifde.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 19 Feb 2021 17:51:07 +0100 -Subject: [PATCH] powerpc/mm: Move the linear_mapping_mutex to the ifdef where - it is used - -The mutex linear_mapping_mutex is defined at the of the file while its -only two user are within the CONFIG_MEMORY_HOTPLUG block. -A compile without CONFIG_MEMORY_HOTPLUG set fails on PREEMPT_RT because -its mutex implementation is smart enough to realize that it is unused. - -Move the definition of linear_mapping_mutex to ifdef block where it is -used. - -Fixes: 1f73ad3e8d755 ("powerpc/mm: print warning in arch_remove_linear_mapping()") -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/mm/mem.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/powerpc/mm/mem.c -+++ b/arch/powerpc/mm/mem.c -@@ -54,7 +54,6 @@ - - #include - --static DEFINE_MUTEX(linear_mapping_mutex); - unsigned long long memory_limit; - bool init_mem_is_free; - -@@ -72,6 +71,7 @@ pgprot_t phys_mem_access_prot(struct fil - EXPORT_SYMBOL(phys_mem_access_prot); - - #ifdef CONFIG_MEMORY_HOTPLUG -+static DEFINE_MUTEX(linear_mapping_mutex); - - #ifdef CONFIG_NUMA - int memory_add_physaddr_to_nid(u64 start) diff --git a/kernel/patches-5.11.x-rt/0021-0002-printk-limit-second-loop-of-syslog_print_all.patch b/kernel/patches-5.11.x-rt/0021-0002-printk-limit-second-loop-of-syslog_print_all.patch deleted file mode 100644 index af0b0190c6..0000000000 --- a/kernel/patches-5.11.x-rt/0021-0002-printk-limit-second-loop-of-syslog_print_all.patch +++ /dev/null @@ -1,49 +0,0 @@ -From: John Ogness -Date: Wed, 17 Feb 2021 16:15:31 +0100 -Subject: [PATCH 02/28] printk: limit second loop of syslog_print_all - -The second loop of syslog_print_all() subtracts lengths that were -added in the first loop. With commit b031a684bfd0 ("printk: remove -logbuf_lock writer-protection of ringbuffer") it is possible that -records are (over)written during syslog_print_all(). This allows the -possibility of the second loop subtracting lengths that were never -added in the first loop. - -This situation can result in syslog_print_all() filling the buffer -starting from a later record, even though there may have been room -to fit the earlier record(s) as well. - -Fixes: b031a684bfd0 ("printk: remove logbuf_lock writer-protection of ringbuffer") -Signed-off-by: John Ogness -Reviewed-by: Petr Mladek ---- - kernel/printk/printk.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1494,6 +1494,7 @@ static int syslog_print_all(char __user - struct printk_info info; - unsigned int line_count; - struct printk_record r; -+ u64 max_seq; - char *text; - int len = 0; - u64 seq; -@@ -1512,9 +1513,15 @@ static int syslog_print_all(char __user - prb_for_each_info(clear_seq, prb, seq, &info, &line_count) - len += get_record_print_text_size(&info, line_count, true, time); - -+ /* -+ * Set an upper bound for the next loop to avoid subtracting lengths -+ * that were never added. -+ */ -+ max_seq = seq; -+ - /* move first record forward until length fits into the buffer */ - prb_for_each_info(clear_seq, prb, seq, &info, &line_count) { -- if (len <= size) -+ if (len <= size || info.seq >= max_seq) - break; - len -= get_record_print_text_size(&info, line_count, true, time); - } diff --git a/kernel/patches-5.11.x-rt/0022-0003-printk-kmsg_dump-remove-unused-fields.patch b/kernel/patches-5.11.x-rt/0022-0003-printk-kmsg_dump-remove-unused-fields.patch deleted file mode 100644 index 1139b97b64..0000000000 --- a/kernel/patches-5.11.x-rt/0022-0003-printk-kmsg_dump-remove-unused-fields.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: John Ogness -Date: Mon, 21 Dec 2020 11:19:39 +0106 -Subject: [PATCH 03/28] printk: kmsg_dump: remove unused fields - -struct kmsg_dumper still contains some fields that were used to -iterate the old ringbuffer. They are no longer used. Remove them -and update the struct documentation. - -Signed-off-by: John Ogness -Reviewed-by: Petr Mladek -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/kmsg_dump.h | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - ---- a/include/linux/kmsg_dump.h -+++ b/include/linux/kmsg_dump.h -@@ -36,6 +36,9 @@ enum kmsg_dump_reason { - * through the record iterator - * @max_reason: filter for highest reason number that should be dumped - * @registered: Flag that specifies if this is already registered -+ * @active: Flag that specifies if this is currently dumping -+ * @cur_seq: Points to the oldest message to dump (private) -+ * @next_seq: Points after the newest message to dump (private) - */ - struct kmsg_dumper { - struct list_head list; -@@ -45,8 +48,6 @@ struct kmsg_dumper { - bool registered; - - /* private state of the kmsg iterator */ -- u32 cur_idx; -- u32 next_idx; - u64 cur_seq; - u64 next_seq; - }; diff --git a/kernel/patches-5.11.x-rt/0023-0004-printk-refactor-kmsg_dump_get_buffer.patch b/kernel/patches-5.11.x-rt/0023-0004-printk-refactor-kmsg_dump_get_buffer.patch deleted file mode 100644 index 6e99e81080..0000000000 --- a/kernel/patches-5.11.x-rt/0023-0004-printk-refactor-kmsg_dump_get_buffer.patch +++ /dev/null @@ -1,136 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:41:56 +0106 -Subject: [PATCH 04/28] printk: refactor kmsg_dump_get_buffer() - -kmsg_dump_get_buffer() requires nearly the same logic as -syslog_print_all(), but uses different variable names and -does not make use of the ringbuffer loop macros. Modify -kmsg_dump_get_buffer() so that the implementation is as similar -to syslog_print_all() as possible. - -A follow-up commit will move this common logic into a -separate helper function. - -Signed-off-by: John Ogness -Reviewed-by: Petr Mladek -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/kmsg_dump.h | 2 - - kernel/printk/printk.c | 60 ++++++++++++++++++++++++---------------------- - 2 files changed, 33 insertions(+), 29 deletions(-) - ---- a/include/linux/kmsg_dump.h -+++ b/include/linux/kmsg_dump.h -@@ -62,7 +62,7 @@ bool kmsg_dump_get_line(struct kmsg_dump - char *line, size_t size, size_t *len); - - bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, -- char *buf, size_t size, size_t *len); -+ char *buf, size_t size, size_t *len_out); - - void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper); - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -3424,7 +3424,7 @@ EXPORT_SYMBOL_GPL(kmsg_dump_get_line); - * read. - */ - bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, -- char *buf, size_t size, size_t *len) -+ char *buf, size_t size, size_t *len_out) - { - struct printk_info info; - unsigned int line_count; -@@ -3432,12 +3432,10 @@ bool kmsg_dump_get_buffer(struct kmsg_du - unsigned long flags; - u64 seq; - u64 next_seq; -- size_t l = 0; -+ size_t len = 0; - bool ret = false; - bool time = printk_time; - -- prb_rec_init_rd(&r, &info, buf, size); -- - if (!dumper->active || !buf || !size) - goto out; - -@@ -3455,48 +3453,54 @@ bool kmsg_dump_get_buffer(struct kmsg_du - goto out; - } - -- /* calculate length of entire buffer */ -- seq = dumper->cur_seq; -- while (prb_read_valid_info(prb, seq, &info, &line_count)) { -- if (r.info->seq >= dumper->next_seq) -+ /* -+ * Find first record that fits, including all following records, -+ * into the user-provided buffer for this dump. -+ */ -+ -+ prb_for_each_info(dumper->cur_seq, prb, seq, &info, &line_count) { -+ if (info.seq >= dumper->next_seq) - break; -- l += get_record_print_text_size(&info, line_count, syslog, time); -- seq = r.info->seq + 1; -+ len += get_record_print_text_size(&info, line_count, syslog, time); - } - -- /* move first record forward until length fits into the buffer */ -- seq = dumper->cur_seq; -- while (l >= size && prb_read_valid_info(prb, seq, -- &info, &line_count)) { -- if (r.info->seq >= dumper->next_seq) -+ /* -+ * Move first record forward until length fits into the buffer. Ignore -+ * newest messages that were not counted in the above cycle. Messages -+ * might appear and get lost in the meantime. This is the best effort -+ * that prevents an infinite loop. -+ */ -+ prb_for_each_info(dumper->cur_seq, prb, seq, &info, &line_count) { -+ if (len < size || info.seq >= dumper->next_seq) - break; -- l -= get_record_print_text_size(&info, line_count, syslog, time); -- seq = r.info->seq + 1; -+ len -= get_record_print_text_size(&info, line_count, syslog, time); - } - -- /* last message in next interation */ -+ /* -+ * Next kmsg_dump_get_buffer() invocation will dump block of -+ * older records stored right before this one. -+ */ - next_seq = seq; - -- /* actually read text into the buffer now */ -- l = 0; -- while (prb_read_valid(prb, seq, &r)) { -+ prb_rec_init_rd(&r, &info, buf, size); -+ -+ len = 0; -+ prb_for_each_record(seq, prb, seq, &r) { - if (r.info->seq >= dumper->next_seq) - break; - -- l += record_print_text(&r, syslog, time); -- -- /* adjust record to store to remaining buffer space */ -- prb_rec_init_rd(&r, &info, buf + l, size - l); -+ len += record_print_text(&r, syslog, time); - -- seq = r.info->seq + 1; -+ /* Adjust record to store to remaining buffer space. */ -+ prb_rec_init_rd(&r, &info, buf + len, size - len); - } - - dumper->next_seq = next_seq; - ret = true; - logbuf_unlock_irqrestore(flags); - out: -- if (len) -- *len = l; -+ if (len_out) -+ *len_out = len; - return ret; - } - EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer); diff --git a/kernel/patches-5.11.x-rt/0024-0005-printk-consolidate-kmsg_dump_get_buffer-syslog_print.patch b/kernel/patches-5.11.x-rt/0024-0005-printk-consolidate-kmsg_dump_get_buffer-syslog_print.patch deleted file mode 100644 index 4a64c2fe17..0000000000 --- a/kernel/patches-5.11.x-rt/0024-0005-printk-consolidate-kmsg_dump_get_buffer-syslog_print.patch +++ /dev/null @@ -1,140 +0,0 @@ -From: John Ogness -Date: Wed, 13 Jan 2021 11:29:53 +0106 -Subject: [PATCH 05/28] printk: consolidate - kmsg_dump_get_buffer/syslog_print_all code - -The logic for finding records to fit into a buffer is the same for -kmsg_dump_get_buffer() and syslog_print_all(). Introduce a helper -function find_first_fitting_seq() to handle this logic. - -Signed-off-by: John Ogness ---- - kernel/printk/printk.c | 87 ++++++++++++++++++++++++++++--------------------- - 1 file changed, 50 insertions(+), 37 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1421,6 +1421,50 @@ static size_t get_record_print_text_size - return ((prefix_len * line_count) + info->text_len + 1); - } - -+/* -+ * Beginning with @start_seq, find the first record where it and all following -+ * records up to (but not including) @max_seq fit into @size. -+ * -+ * @max_seq is simply an upper bound and does not need to exist. If the caller -+ * does not require an upper bound, -1 can be used for @max_seq. -+ */ -+static u64 find_first_fitting_seq(u64 start_seq, u64 max_seq, size_t size, -+ bool syslog, bool time) -+{ -+ struct printk_info info; -+ unsigned int line_count; -+ size_t len = 0; -+ u64 seq; -+ -+ /* Determine the size of the records up to @max_seq. */ -+ prb_for_each_info(start_seq, prb, seq, &info, &line_count) { -+ if (info.seq >= max_seq) -+ break; -+ len += get_record_print_text_size(&info, line_count, syslog, time); -+ } -+ -+ /* -+ * Adjust the upper bound for the next loop to avoid subtracting -+ * lengths that were never added. -+ */ -+ if (seq < max_seq) -+ max_seq = seq; -+ -+ /* -+ * Move first record forward until length fits into the buffer. Ignore -+ * newest messages that were not counted in the above cycle. Messages -+ * might appear and get lost in the meantime. This is a best effort -+ * that prevents an infinite loop that could occur with a retry. -+ */ -+ prb_for_each_info(start_seq, prb, seq, &info, &line_count) { -+ if (len <= size || info.seq >= max_seq) -+ break; -+ len -= get_record_print_text_size(&info, line_count, syslog, time); -+ } -+ -+ return seq; -+} -+ - static int syslog_print(char __user *buf, int size) - { - struct printk_info info; -@@ -1492,9 +1536,7 @@ static int syslog_print(char __user *buf - static int syslog_print_all(char __user *buf, int size, bool clear) - { - struct printk_info info; -- unsigned int line_count; - struct printk_record r; -- u64 max_seq; - char *text; - int len = 0; - u64 seq; -@@ -1510,21 +1552,7 @@ static int syslog_print_all(char __user - * Find first record that fits, including all following records, - * into the user-provided buffer for this dump. - */ -- prb_for_each_info(clear_seq, prb, seq, &info, &line_count) -- len += get_record_print_text_size(&info, line_count, true, time); -- -- /* -- * Set an upper bound for the next loop to avoid subtracting lengths -- * that were never added. -- */ -- max_seq = seq; -- -- /* move first record forward until length fits into the buffer */ -- prb_for_each_info(clear_seq, prb, seq, &info, &line_count) { -- if (len <= size || info.seq >= max_seq) -- break; -- len -= get_record_print_text_size(&info, line_count, true, time); -- } -+ seq = find_first_fitting_seq(clear_seq, -1, size, true, time); - - prb_rec_init_rd(&r, &info, text, LOG_LINE_MAX + PREFIX_MAX); - -@@ -3427,7 +3455,6 @@ bool kmsg_dump_get_buffer(struct kmsg_du - char *buf, size_t size, size_t *len_out) - { - struct printk_info info; -- unsigned int line_count; - struct printk_record r; - unsigned long flags; - u64 seq; -@@ -3455,26 +3482,12 @@ bool kmsg_dump_get_buffer(struct kmsg_du - - /* - * Find first record that fits, including all following records, -- * into the user-provided buffer for this dump. -+ * into the user-provided buffer for this dump. Pass in size-1 -+ * because this function (by way of record_print_text()) will -+ * not write more than size-1 bytes of text into @buf. - */ -- -- prb_for_each_info(dumper->cur_seq, prb, seq, &info, &line_count) { -- if (info.seq >= dumper->next_seq) -- break; -- len += get_record_print_text_size(&info, line_count, syslog, time); -- } -- -- /* -- * Move first record forward until length fits into the buffer. Ignore -- * newest messages that were not counted in the above cycle. Messages -- * might appear and get lost in the meantime. This is the best effort -- * that prevents an infinite loop. -- */ -- prb_for_each_info(dumper->cur_seq, prb, seq, &info, &line_count) { -- if (len < size || info.seq >= dumper->next_seq) -- break; -- len -= get_record_print_text_size(&info, line_count, syslog, time); -- } -+ seq = find_first_fitting_seq(dumper->cur_seq, dumper->next_seq, -+ size - 1, syslog, time); - - /* - * Next kmsg_dump_get_buffer() invocation will dump block of diff --git a/kernel/patches-5.11.x-rt/0025-0006-printk-introduce-CONSOLE_LOG_MAX-for-improved-multi-.patch b/kernel/patches-5.11.x-rt/0025-0006-printk-introduce-CONSOLE_LOG_MAX-for-improved-multi-.patch deleted file mode 100644 index 0e02114964..0000000000 --- a/kernel/patches-5.11.x-rt/0025-0006-printk-introduce-CONSOLE_LOG_MAX-for-improved-multi-.patch +++ /dev/null @@ -1,88 +0,0 @@ -From: John Ogness -Date: Thu, 10 Dec 2020 12:48:01 +0106 -Subject: [PATCH 06/28] printk: introduce CONSOLE_LOG_MAX for improved - multi-line support - -Instead of using "LOG_LINE_MAX + PREFIX_MAX" for temporary buffer -sizes, introduce CONSOLE_LOG_MAX. This represents the maximum size -that is allowed to be printed to the console for a single record. - -Rather than setting CONSOLE_LOG_MAX to "LOG_LINE_MAX + PREFIX_MAX" -(1024), increase it to 4096. With a larger buffer size, multi-line -records that are nearly LOG_LINE_MAX in length will have a better -chance of being fully printed. (When formatting a record for the -console, each line of a multi-line record is prepended with a copy -of the prefix.) - -Signed-off-by: John Ogness ---- - kernel/printk/printk.c | 18 +++++++++++------- - 1 file changed, 11 insertions(+), 7 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -410,8 +410,13 @@ static u64 clear_seq; - #else - #define PREFIX_MAX 32 - #endif -+ -+/* the maximum size allowed to be reserved for a record */ - #define LOG_LINE_MAX (1024 - PREFIX_MAX) - -+/* the maximum size of a formatted record (i.e. with prefix added per line) */ -+#define CONSOLE_LOG_MAX 4096 -+ - #define LOG_LEVEL(v) ((v) & 0x07) - #define LOG_FACILITY(v) ((v) >> 3 & 0xff) - -@@ -1472,11 +1477,11 @@ static int syslog_print(char __user *buf - char *text; - int len = 0; - -- text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); -+ text = kmalloc(CONSOLE_LOG_MAX, GFP_KERNEL); - if (!text) - return -ENOMEM; - -- prb_rec_init_rd(&r, &info, text, LOG_LINE_MAX + PREFIX_MAX); -+ prb_rec_init_rd(&r, &info, text, CONSOLE_LOG_MAX); - - while (size > 0) { - size_t n; -@@ -1542,7 +1547,7 @@ static int syslog_print_all(char __user - u64 seq; - bool time; - -- text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); -+ text = kmalloc(CONSOLE_LOG_MAX, GFP_KERNEL); - if (!text) - return -ENOMEM; - -@@ -1554,7 +1559,7 @@ static int syslog_print_all(char __user - */ - seq = find_first_fitting_seq(clear_seq, -1, size, true, time); - -- prb_rec_init_rd(&r, &info, text, LOG_LINE_MAX + PREFIX_MAX); -+ prb_rec_init_rd(&r, &info, text, CONSOLE_LOG_MAX); - - len = 0; - prb_for_each_record(seq, prb, seq, &r) { -@@ -2187,8 +2192,7 @@ EXPORT_SYMBOL(printk); - - #else /* CONFIG_PRINTK */ - --#define LOG_LINE_MAX 0 --#define PREFIX_MAX 0 -+#define CONSOLE_LOG_MAX 0 - #define printk_time false - - #define prb_read_valid(rb, seq, r) false -@@ -2506,7 +2510,7 @@ static inline int can_use_console(void) - void console_unlock(void) - { - static char ext_text[CONSOLE_EXT_LOG_MAX]; -- static char text[LOG_LINE_MAX + PREFIX_MAX]; -+ static char text[CONSOLE_LOG_MAX]; - unsigned long flags; - bool do_cond_resched, retry; - struct printk_info info; diff --git a/kernel/patches-5.11.x-rt/0026-0007-printk-use-seqcount_latch-for-clear_seq.patch b/kernel/patches-5.11.x-rt/0026-0007-printk-use-seqcount_latch-for-clear_seq.patch deleted file mode 100644 index 618e5b2fb1..0000000000 --- a/kernel/patches-5.11.x-rt/0026-0007-printk-use-seqcount_latch-for-clear_seq.patch +++ /dev/null @@ -1,140 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:41:58 +0106 -Subject: [PATCH 07/28] printk: use seqcount_latch for clear_seq - -kmsg_dump_rewind_nolock() locklessly reads @clear_seq. However, -this is not done atomically. Since @clear_seq is 64-bit, this -cannot be an atomic operation for all platforms. Therefore, use -a seqcount_latch to allow readers to always read a consistent -value. - -Signed-off-by: John Ogness -Reviewed-by: Petr Mladek -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 58 ++++++++++++++++++++++++++++++++++++++++++------- - 1 file changed, 50 insertions(+), 8 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -402,8 +402,21 @@ static u64 console_seq; - static u64 exclusive_console_stop_seq; - static unsigned long console_dropped; - --/* the next printk record to read after the last 'clear' command */ --static u64 clear_seq; -+struct latched_seq { -+ seqcount_latch_t latch; -+ u64 val[2]; -+}; -+ -+/* -+ * The next printk record to read after the last 'clear' command. There are -+ * two copies (updated with seqcount_latch) so that reads can locklessly -+ * access a valid value. Writers are synchronized by @logbuf_lock. -+ */ -+static struct latched_seq clear_seq = { -+ .latch = SEQCNT_LATCH_ZERO(clear_seq.latch), -+ .val[0] = 0, -+ .val[1] = 0, -+}; - - #ifdef CONFIG_PRINTK_CALLER - #define PREFIX_MAX 48 -@@ -457,6 +470,31 @@ bool printk_percpu_data_ready(void) - return __printk_percpu_data_ready; - } - -+/* Must be called under logbuf_lock. */ -+static void latched_seq_write(struct latched_seq *ls, u64 val) -+{ -+ raw_write_seqcount_latch(&ls->latch); -+ ls->val[0] = val; -+ raw_write_seqcount_latch(&ls->latch); -+ ls->val[1] = val; -+} -+ -+/* Can be called from any context. */ -+static u64 latched_seq_read_nolock(struct latched_seq *ls) -+{ -+ unsigned int seq; -+ unsigned int idx; -+ u64 val; -+ -+ do { -+ seq = raw_read_seqcount_latch(&ls->latch); -+ idx = seq & 0x1; -+ val = ls->val[idx]; -+ } while (read_seqcount_latch_retry(&ls->latch, seq)); -+ -+ return val; -+} -+ - /* Return log buffer address */ - char *log_buf_addr_get(void) - { -@@ -801,7 +839,7 @@ static loff_t devkmsg_llseek(struct file - * like issued by 'dmesg -c'. Reading /dev/kmsg itself - * changes no global state, and does not clear anything. - */ -- user->seq = clear_seq; -+ user->seq = latched_seq_read_nolock(&clear_seq); - break; - case SEEK_END: - /* after the last record */ -@@ -960,6 +998,9 @@ void log_buf_vmcoreinfo_setup(void) - - VMCOREINFO_SIZE(atomic_long_t); - VMCOREINFO_TYPE_OFFSET(atomic_long_t, counter); -+ -+ VMCOREINFO_STRUCT_SIZE(latched_seq); -+ VMCOREINFO_OFFSET(latched_seq, val); - } - #endif - -@@ -1557,7 +1598,8 @@ static int syslog_print_all(char __user - * Find first record that fits, including all following records, - * into the user-provided buffer for this dump. - */ -- seq = find_first_fitting_seq(clear_seq, -1, size, true, time); -+ seq = find_first_fitting_seq(latched_seq_read_nolock(&clear_seq), -1, -+ size, true, time); - - prb_rec_init_rd(&r, &info, text, CONSOLE_LOG_MAX); - -@@ -1584,7 +1626,7 @@ static int syslog_print_all(char __user - } - - if (clear) -- clear_seq = seq; -+ latched_seq_write(&clear_seq, seq); - logbuf_unlock_irq(); - - kfree(text); -@@ -1594,7 +1636,7 @@ static int syslog_print_all(char __user - static void syslog_clear(void) - { - logbuf_lock_irq(); -- clear_seq = prb_next_seq(prb); -+ latched_seq_write(&clear_seq, prb_next_seq(prb)); - logbuf_unlock_irq(); - } - -@@ -3336,7 +3378,7 @@ void kmsg_dump(enum kmsg_dump_reason rea - dumper->active = true; - - logbuf_lock_irqsave(flags); -- dumper->cur_seq = clear_seq; -+ dumper->cur_seq = latched_seq_read_nolock(&clear_seq); - dumper->next_seq = prb_next_seq(prb); - logbuf_unlock_irqrestore(flags); - -@@ -3534,7 +3576,7 @@ EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer); - */ - void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper) - { -- dumper->cur_seq = clear_seq; -+ dumper->cur_seq = latched_seq_read_nolock(&clear_seq); - dumper->next_seq = prb_next_seq(prb); - } - diff --git a/kernel/patches-5.11.x-rt/0027-0008-printk-use-atomic64_t-for-devkmsg_user.seq.patch b/kernel/patches-5.11.x-rt/0027-0008-printk-use-atomic64_t-for-devkmsg_user.seq.patch deleted file mode 100644 index 75cc7499eb..0000000000 --- a/kernel/patches-5.11.x-rt/0027-0008-printk-use-atomic64_t-for-devkmsg_user.seq.patch +++ /dev/null @@ -1,105 +0,0 @@ -From: John Ogness -Date: Thu, 10 Dec 2020 15:33:40 +0106 -Subject: [PATCH 08/28] printk: use atomic64_t for devkmsg_user.seq - -@user->seq is indirectly protected by @logbuf_lock. Once @logbuf_lock -is removed, @user->seq will be no longer safe from an atomicity point -of view. - -In preparation for the removal of @logbuf_lock, change it to -atomic64_t to provide this safety. - -Signed-off-by: John Ogness ---- - kernel/printk/printk.c | 22 +++++++++++----------- - 1 file changed, 11 insertions(+), 11 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -662,7 +662,7 @@ static ssize_t msg_print_ext_body(char * - - /* /dev/kmsg - userspace message inject/listen interface */ - struct devkmsg_user { -- u64 seq; -+ atomic64_t seq; - struct ratelimit_state rs; - struct mutex lock; - char buf[CONSOLE_EXT_LOG_MAX]; -@@ -763,7 +763,7 @@ static ssize_t devkmsg_read(struct file - return ret; - - logbuf_lock_irq(); -- if (!prb_read_valid(prb, user->seq, r)) { -+ if (!prb_read_valid(prb, atomic64_read(&user->seq), r)) { - if (file->f_flags & O_NONBLOCK) { - ret = -EAGAIN; - logbuf_unlock_irq(); -@@ -772,15 +772,15 @@ static ssize_t devkmsg_read(struct file - - logbuf_unlock_irq(); - ret = wait_event_interruptible(log_wait, -- prb_read_valid(prb, user->seq, r)); -+ prb_read_valid(prb, atomic64_read(&user->seq), r)); - if (ret) - goto out; - logbuf_lock_irq(); - } - -- if (r->info->seq != user->seq) { -+ if (r->info->seq != atomic64_read(&user->seq)) { - /* our last seen message is gone, return error and reset */ -- user->seq = r->info->seq; -+ atomic64_set(&user->seq, r->info->seq); - ret = -EPIPE; - logbuf_unlock_irq(); - goto out; -@@ -791,7 +791,7 @@ static ssize_t devkmsg_read(struct file - &r->text_buf[0], r->info->text_len, - &r->info->dev_info); - -- user->seq = r->info->seq + 1; -+ atomic64_set(&user->seq, r->info->seq + 1); - logbuf_unlock_irq(); - - if (len > count) { -@@ -831,7 +831,7 @@ static loff_t devkmsg_llseek(struct file - switch (whence) { - case SEEK_SET: - /* the first record */ -- user->seq = prb_first_valid_seq(prb); -+ atomic64_set(&user->seq, prb_first_valid_seq(prb)); - break; - case SEEK_DATA: - /* -@@ -839,11 +839,11 @@ static loff_t devkmsg_llseek(struct file - * like issued by 'dmesg -c'. Reading /dev/kmsg itself - * changes no global state, and does not clear anything. - */ -- user->seq = latched_seq_read_nolock(&clear_seq); -+ atomic64_set(&user->seq, latched_seq_read_nolock(&clear_seq)); - break; - case SEEK_END: - /* after the last record */ -- user->seq = prb_next_seq(prb); -+ atomic64_set(&user->seq, prb_next_seq(prb)); - break; - default: - ret = -EINVAL; -@@ -866,7 +866,7 @@ static __poll_t devkmsg_poll(struct file - logbuf_lock_irq(); - if (prb_read_valid_info(prb, user->seq, &info, NULL)) { - /* return error when data has vanished underneath us */ -- if (info.seq != user->seq) -+ if (info.seq != atomic64_read(&user->seq)) - ret = EPOLLIN|EPOLLRDNORM|EPOLLERR|EPOLLPRI; - else - ret = EPOLLIN|EPOLLRDNORM; -@@ -905,7 +905,7 @@ static int devkmsg_open(struct inode *in - &user->text_buf[0], sizeof(user->text_buf)); - - logbuf_lock_irq(); -- user->seq = prb_first_valid_seq(prb); -+ atomic64_set(&user->seq, prb_first_valid_seq(prb)); - logbuf_unlock_irq(); - - file->private_data = user; diff --git a/kernel/patches-5.11.x-rt/0028-0009-printk-add-syslog_lock.patch b/kernel/patches-5.11.x-rt/0028-0009-printk-add-syslog_lock.patch deleted file mode 100644 index 4952309802..0000000000 --- a/kernel/patches-5.11.x-rt/0028-0009-printk-add-syslog_lock.patch +++ /dev/null @@ -1,152 +0,0 @@ -From: John Ogness -Date: Thu, 10 Dec 2020 16:58:02 +0106 -Subject: [PATCH 09/28] printk: add syslog_lock - -The global variables @syslog_seq, @syslog_partial, @syslog_time -and write access to @clear_seq are protected by @logbuf_lock. -Once @logbuf_lock is removed, these variables will need their -own synchronization method. Introduce @syslog_lock for this -purpose. - -@syslog_lock is a raw_spin_lock for now. This simplifies the -transition to removing @logbuf_lock. Once @logbuf_lock and the -safe buffers are removed, @syslog_lock can change to spin_lock. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 41 +++++++++++++++++++++++++++++++++++++---- - 1 file changed, 37 insertions(+), 4 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -390,8 +390,12 @@ DEFINE_RAW_SPINLOCK(logbuf_lock); - printk_safe_exit_irqrestore(flags); \ - } while (0) - -+/* syslog_lock protects syslog_* variables and write access to clear_seq. */ -+static DEFINE_RAW_SPINLOCK(syslog_lock); -+ - #ifdef CONFIG_PRINTK - DECLARE_WAIT_QUEUE_HEAD(log_wait); -+/* All 3 protected by @syslog_lock. */ - /* the next printk record to read by syslog(READ) or /proc/kmsg */ - static u64 syslog_seq; - static size_t syslog_partial; -@@ -410,7 +414,7 @@ struct latched_seq { - /* - * The next printk record to read after the last 'clear' command. There are - * two copies (updated with seqcount_latch) so that reads can locklessly -- * access a valid value. Writers are synchronized by @logbuf_lock. -+ * access a valid value. Writers are synchronized by @syslog_lock. - */ - static struct latched_seq clear_seq = { - .latch = SEQCNT_LATCH_ZERO(clear_seq.latch), -@@ -470,7 +474,7 @@ bool printk_percpu_data_ready(void) - return __printk_percpu_data_ready; - } - --/* Must be called under logbuf_lock. */ -+/* Must be called under syslog_lock. */ - static void latched_seq_write(struct latched_seq *ls, u64 val) - { - raw_write_seqcount_latch(&ls->latch); -@@ -1529,7 +1533,9 @@ static int syslog_print(char __user *buf - size_t skip; - - logbuf_lock_irq(); -+ raw_spin_lock(&syslog_lock); - if (!prb_read_valid(prb, syslog_seq, &r)) { -+ raw_spin_unlock(&syslog_lock); - logbuf_unlock_irq(); - break; - } -@@ -1559,6 +1565,7 @@ static int syslog_print(char __user *buf - syslog_partial += n; - } else - n = 0; -+ raw_spin_unlock(&syslog_lock); - logbuf_unlock_irq(); - - if (!n) -@@ -1625,8 +1632,11 @@ static int syslog_print_all(char __user - break; - } - -- if (clear) -+ if (clear) { -+ raw_spin_lock(&syslog_lock); - latched_seq_write(&clear_seq, seq); -+ raw_spin_unlock(&syslog_lock); -+ } - logbuf_unlock_irq(); - - kfree(text); -@@ -1636,10 +1646,24 @@ static int syslog_print_all(char __user - static void syslog_clear(void) - { - logbuf_lock_irq(); -+ raw_spin_lock(&syslog_lock); - latched_seq_write(&clear_seq, prb_next_seq(prb)); -+ raw_spin_unlock(&syslog_lock); - logbuf_unlock_irq(); - } - -+/* Return a consistent copy of @syslog_seq. */ -+static u64 read_syslog_seq_irq(void) -+{ -+ u64 seq; -+ -+ raw_spin_lock_irq(&syslog_lock); -+ seq = syslog_seq; -+ raw_spin_unlock_irq(&syslog_lock); -+ -+ return seq; -+} -+ - int do_syslog(int type, char __user *buf, int len, int source) - { - struct printk_info info; -@@ -1663,8 +1687,9 @@ int do_syslog(int type, char __user *buf - return 0; - if (!access_ok(buf, len)) - return -EFAULT; -+ - error = wait_event_interruptible(log_wait, -- prb_read_valid(prb, syslog_seq, NULL)); -+ prb_read_valid(prb, read_syslog_seq_irq(), NULL)); - if (error) - return error; - error = syslog_print(buf, len); -@@ -1713,8 +1738,10 @@ int do_syslog(int type, char __user *buf - /* Number of chars in the log buffer */ - case SYSLOG_ACTION_SIZE_UNREAD: - logbuf_lock_irq(); -+ raw_spin_lock(&syslog_lock); - if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) { - /* No unread messages. */ -+ raw_spin_unlock(&syslog_lock); - logbuf_unlock_irq(); - return 0; - } -@@ -1743,6 +1770,7 @@ int do_syslog(int type, char __user *buf - } - error -= syslog_partial; - } -+ raw_spin_unlock(&syslog_lock); - logbuf_unlock_irq(); - break; - /* Size of the log buffer */ -@@ -2992,7 +3020,12 @@ void register_console(struct console *ne - */ - exclusive_console = newcon; - exclusive_console_stop_seq = console_seq; -+ -+ /* Get a consistent copy of @syslog_seq. */ -+ raw_spin_lock(&syslog_lock); - console_seq = syslog_seq; -+ raw_spin_unlock(&syslog_lock); -+ - logbuf_unlock_irqrestore(flags); - } - console_unlock(); diff --git a/kernel/patches-5.11.x-rt/0029-0010-printk-introduce-a-kmsg_dump-iterator.patch b/kernel/patches-5.11.x-rt/0029-0010-printk-introduce-a-kmsg_dump-iterator.patch deleted file mode 100644 index d2017fb554..0000000000 --- a/kernel/patches-5.11.x-rt/0029-0010-printk-introduce-a-kmsg_dump-iterator.patch +++ /dev/null @@ -1,535 +0,0 @@ -From: John Ogness -Date: Fri, 18 Dec 2020 11:40:08 +0000 -Subject: [PATCH 10/28] printk: introduce a kmsg_dump iterator - -Rather than store the iterator information into the registered -kmsg_dump structure, create a separate iterator structure. The -kmsg_dump_iter structure can reside on the stack of the caller, -thus allowing lockless use of the kmsg_dump functions. - -This is in preparation for removal of @logbuf_lock. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/kernel/nvram_64.c | 12 +++-- - arch/powerpc/platforms/powernv/opal-kmsg.c | 3 - - arch/powerpc/xmon/xmon.c | 6 +- - arch/um/kernel/kmsg_dump.c | 5 +- - drivers/hv/vmbus_drv.c | 5 +- - drivers/mtd/mtdoops.c | 5 +- - fs/pstore/platform.c | 5 +- - include/linux/kmsg_dump.h | 43 ++++++++++--------- - kernel/debug/kdb/kdb_main.c | 10 ++-- - kernel/printk/printk.c | 65 +++++++++++++---------------- - 10 files changed, 84 insertions(+), 75 deletions(-) - ---- a/arch/powerpc/kernel/nvram_64.c -+++ b/arch/powerpc/kernel/nvram_64.c -@@ -73,7 +73,8 @@ static const char *nvram_os_partitions[] - }; - - static void oops_to_nvram(struct kmsg_dumper *dumper, -- enum kmsg_dump_reason reason); -+ enum kmsg_dump_reason reason, -+ struct kmsg_dumper_iter *iter); - - static struct kmsg_dumper nvram_kmsg_dumper = { - .dump = oops_to_nvram -@@ -643,7 +644,8 @@ void __init nvram_init_oops_partition(in - * partition. If that's too much, go back and capture uncompressed text. - */ - static void oops_to_nvram(struct kmsg_dumper *dumper, -- enum kmsg_dump_reason reason) -+ enum kmsg_dump_reason reason, -+ struct kmsg_dumper_iter *iter) - { - struct oops_log_info *oops_hdr = (struct oops_log_info *)oops_buf; - static unsigned int oops_count = 0; -@@ -681,13 +683,13 @@ static void oops_to_nvram(struct kmsg_du - return; - - if (big_oops_buf) { -- kmsg_dump_get_buffer(dumper, false, -+ kmsg_dump_get_buffer(iter, false, - big_oops_buf, big_oops_buf_sz, &text_len); - rc = zip_oops(text_len); - } - if (rc != 0) { -- kmsg_dump_rewind(dumper); -- kmsg_dump_get_buffer(dumper, false, -+ kmsg_dump_rewind(iter); -+ kmsg_dump_get_buffer(iter, false, - oops_data, oops_data_sz, &text_len); - err_type = ERR_TYPE_KERNEL_PANIC; - oops_hdr->version = cpu_to_be16(OOPS_HDR_VERSION); ---- a/arch/powerpc/platforms/powernv/opal-kmsg.c -+++ b/arch/powerpc/platforms/powernv/opal-kmsg.c -@@ -20,7 +20,8 @@ - * message, it just ensures that OPAL completely flushes the console buffer. - */ - static void kmsg_dump_opal_console_flush(struct kmsg_dumper *dumper, -- enum kmsg_dump_reason reason) -+ enum kmsg_dump_reason reason, -+ struct kmsg_dumper_iter *iter) - { - /* - * Outside of a panic context the pollers will continue to run, ---- a/arch/powerpc/xmon/xmon.c -+++ b/arch/powerpc/xmon/xmon.c -@@ -3005,7 +3005,7 @@ print_address(unsigned long addr) - static void - dump_log_buf(void) - { -- struct kmsg_dumper dumper = { .active = 1 }; -+ struct kmsg_dumper_iter iter = { .active = 1 }; - unsigned char buf[128]; - size_t len; - -@@ -3017,9 +3017,9 @@ dump_log_buf(void) - catch_memory_errors = 1; - sync(); - -- kmsg_dump_rewind_nolock(&dumper); -+ kmsg_dump_rewind_nolock(&iter); - xmon_start_pagination(); -- while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) { -+ while (kmsg_dump_get_line_nolock(&iter, false, buf, sizeof(buf), &len)) { - buf[len] = '\0'; - printf("%s", buf); - } ---- a/arch/um/kernel/kmsg_dump.c -+++ b/arch/um/kernel/kmsg_dump.c -@@ -7,7 +7,8 @@ - #include - - static void kmsg_dumper_stdout(struct kmsg_dumper *dumper, -- enum kmsg_dump_reason reason) -+ enum kmsg_dump_reason reason, -+ struct kmsg_dumper_iter *iter) - { - static char line[1024]; - struct console *con; -@@ -30,7 +31,7 @@ static void kmsg_dumper_stdout(struct km - return; - - printf("kmsg_dump:\n"); -- while (kmsg_dump_get_line(dumper, true, line, sizeof(line), &len)) { -+ while (kmsg_dump_get_line(iter, true, line, sizeof(line), &len)) { - line[len] = '\0'; - printf("%s", line); - } ---- a/drivers/hv/vmbus_drv.c -+++ b/drivers/hv/vmbus_drv.c -@@ -1362,7 +1362,8 @@ static void vmbus_isr(void) - * buffer and call into Hyper-V to transfer the data. - */ - static void hv_kmsg_dump(struct kmsg_dumper *dumper, -- enum kmsg_dump_reason reason) -+ enum kmsg_dump_reason reason, -+ struct kmsg_dumper_iter *iter) - { - size_t bytes_written; - phys_addr_t panic_pa; -@@ -1377,7 +1378,7 @@ static void hv_kmsg_dump(struct kmsg_dum - * Write dump contents to the page. No need to synchronize; panic should - * be single-threaded. - */ -- kmsg_dump_get_buffer(dumper, false, hv_panic_page, HV_HYP_PAGE_SIZE, -+ kmsg_dump_get_buffer(iter, false, hv_panic_page, HV_HYP_PAGE_SIZE, - &bytes_written); - if (bytes_written) - hyperv_report_panic_msg(panic_pa, bytes_written); ---- a/drivers/mtd/mtdoops.c -+++ b/drivers/mtd/mtdoops.c -@@ -267,7 +267,8 @@ static void find_next_position(struct mt - } - - static void mtdoops_do_dump(struct kmsg_dumper *dumper, -- enum kmsg_dump_reason reason) -+ enum kmsg_dump_reason reason, -+ struct kmsg_dumper_iter *iter) - { - struct mtdoops_context *cxt = container_of(dumper, - struct mtdoops_context, dump); -@@ -276,7 +277,7 @@ static void mtdoops_do_dump(struct kmsg_ - if (reason == KMSG_DUMP_OOPS && !dump_oops) - return; - -- kmsg_dump_get_buffer(dumper, true, cxt->oops_buf + MTDOOPS_HEADER_SIZE, -+ kmsg_dump_get_buffer(iter, true, cxt->oops_buf + MTDOOPS_HEADER_SIZE, - record_size - MTDOOPS_HEADER_SIZE, NULL); - - if (reason != KMSG_DUMP_OOPS) { ---- a/fs/pstore/platform.c -+++ b/fs/pstore/platform.c -@@ -383,7 +383,8 @@ void pstore_record_init(struct pstore_re - * end of the buffer. - */ - static void pstore_dump(struct kmsg_dumper *dumper, -- enum kmsg_dump_reason reason) -+ enum kmsg_dump_reason reason, -+ struct kmsg_dumper_iter *iter) - { - unsigned long total = 0; - const char *why; -@@ -435,7 +436,7 @@ static void pstore_dump(struct kmsg_dump - dst_size -= header_size; - - /* Write dump contents. */ -- if (!kmsg_dump_get_buffer(dumper, true, dst + header_size, -+ if (!kmsg_dump_get_buffer(iter, true, dst + header_size, - dst_size, &dump_size)) - break; - ---- a/include/linux/kmsg_dump.h -+++ b/include/linux/kmsg_dump.h -@@ -30,43 +30,48 @@ enum kmsg_dump_reason { - }; - - /** -+ * struct kmsg_dumper_iter - iterator for kernel crash message dumper -+ * @active: Flag that specifies if this is currently dumping -+ * @cur_seq: Points to the oldest message to dump (private) -+ * @next_seq: Points after the newest message to dump (private) -+ */ -+struct kmsg_dumper_iter { -+ bool active; -+ u64 cur_seq; -+ u64 next_seq; -+}; -+ -+/** - * struct kmsg_dumper - kernel crash message dumper structure - * @list: Entry in the dumper list (private) - * @dump: Call into dumping code which will retrieve the data with - * through the record iterator - * @max_reason: filter for highest reason number that should be dumped - * @registered: Flag that specifies if this is already registered -- * @active: Flag that specifies if this is currently dumping -- * @cur_seq: Points to the oldest message to dump (private) -- * @next_seq: Points after the newest message to dump (private) - */ - struct kmsg_dumper { - struct list_head list; -- void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); -+ void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason, -+ struct kmsg_dumper_iter *iter); - enum kmsg_dump_reason max_reason; -- bool active; - bool registered; -- -- /* private state of the kmsg iterator */ -- u64 cur_seq; -- u64 next_seq; - }; - - #ifdef CONFIG_PRINTK - void kmsg_dump(enum kmsg_dump_reason reason); - --bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog, -+bool kmsg_dump_get_line_nolock(struct kmsg_dumper_iter *iter, bool syslog, - char *line, size_t size, size_t *len); - --bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, -+bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, - char *line, size_t size, size_t *len); - --bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, -+bool kmsg_dump_get_buffer(struct kmsg_dumper_iter *iter, bool syslog, - char *buf, size_t size, size_t *len_out); - --void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper); -+void kmsg_dump_rewind_nolock(struct kmsg_dumper_iter *iter); - --void kmsg_dump_rewind(struct kmsg_dumper *dumper); -+void kmsg_dump_rewind(struct kmsg_dumper_iter *dumper_iter); - - int kmsg_dump_register(struct kmsg_dumper *dumper); - -@@ -78,30 +83,30 @@ static inline void kmsg_dump(enum kmsg_d - { - } - --static inline bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, -+static inline bool kmsg_dump_get_line_nolock(struct kmsg_dumper_iter *iter, - bool syslog, const char *line, - size_t size, size_t *len) - { - return false; - } - --static inline bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, -+static inline bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, - const char *line, size_t size, size_t *len) - { - return false; - } - --static inline bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, -+static inline bool kmsg_dump_get_buffer(struct kmsg_dumper_iter *iter, bool syslog, - char *buf, size_t size, size_t *len) - { - return false; - } - --static inline void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper) -+static inline void kmsg_dump_rewind_nolock(struct kmsg_dumper_iter *iter) - { - } - --static inline void kmsg_dump_rewind(struct kmsg_dumper *dumper) -+static inline void kmsg_dump_rewind(struct kmsg_dumper_iter *iter) - { - } - ---- a/kernel/debug/kdb/kdb_main.c -+++ b/kernel/debug/kdb/kdb_main.c -@@ -2101,7 +2101,7 @@ static int kdb_dmesg(int argc, const cha - int adjust = 0; - int n = 0; - int skip = 0; -- struct kmsg_dumper dumper = { .active = 1 }; -+ struct kmsg_dumper_iter iter = { .active = 1 }; - size_t len; - char buf[201]; - -@@ -2126,8 +2126,8 @@ static int kdb_dmesg(int argc, const cha - kdb_set(2, setargs); - } - -- kmsg_dump_rewind_nolock(&dumper); -- while (kmsg_dump_get_line_nolock(&dumper, 1, NULL, 0, NULL)) -+ kmsg_dump_rewind_nolock(&iter); -+ while (kmsg_dump_get_line_nolock(&iter, 1, NULL, 0, NULL)) - n++; - - if (lines < 0) { -@@ -2159,8 +2159,8 @@ static int kdb_dmesg(int argc, const cha - if (skip >= n || skip < 0) - return 0; - -- kmsg_dump_rewind_nolock(&dumper); -- while (kmsg_dump_get_line_nolock(&dumper, 1, buf, sizeof(buf), &len)) { -+ kmsg_dump_rewind_nolock(&iter); -+ while (kmsg_dump_get_line_nolock(&iter, 1, buf, sizeof(buf), &len)) { - if (skip) { - skip--; - continue; ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -3389,6 +3389,7 @@ EXPORT_SYMBOL_GPL(kmsg_dump_reason_str); - */ - void kmsg_dump(enum kmsg_dump_reason reason) - { -+ struct kmsg_dumper_iter iter; - struct kmsg_dumper *dumper; - unsigned long flags; - -@@ -3408,25 +3409,21 @@ void kmsg_dump(enum kmsg_dump_reason rea - continue; - - /* initialize iterator with data about the stored records */ -- dumper->active = true; -- -+ iter.active = true; - logbuf_lock_irqsave(flags); -- dumper->cur_seq = latched_seq_read_nolock(&clear_seq); -- dumper->next_seq = prb_next_seq(prb); -+ iter.cur_seq = latched_seq_read_nolock(&clear_seq); -+ iter.next_seq = prb_next_seq(prb); - logbuf_unlock_irqrestore(flags); - - /* invoke dumper which will iterate over records */ -- dumper->dump(dumper, reason); -- -- /* reset iterator */ -- dumper->active = false; -+ dumper->dump(dumper, reason, &iter); - } - rcu_read_unlock(); - } - - /** - * kmsg_dump_get_line_nolock - retrieve one kmsg log line (unlocked version) -- * @dumper: registered kmsg dumper -+ * @iter: kmsg dumper iterator - * @syslog: include the "<4>" prefixes - * @line: buffer to copy the line to - * @size: maximum size of the buffer -@@ -3443,7 +3440,7 @@ void kmsg_dump(enum kmsg_dump_reason rea - * - * The function is similar to kmsg_dump_get_line(), but grabs no locks. - */ --bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog, -+bool kmsg_dump_get_line_nolock(struct kmsg_dumper_iter *iter, bool syslog, - char *line, size_t size, size_t *len) - { - struct printk_info info; -@@ -3454,16 +3451,16 @@ bool kmsg_dump_get_line_nolock(struct km - - prb_rec_init_rd(&r, &info, line, size); - -- if (!dumper->active) -+ if (!iter->active) - goto out; - - /* Read text or count text lines? */ - if (line) { -- if (!prb_read_valid(prb, dumper->cur_seq, &r)) -+ if (!prb_read_valid(prb, iter->cur_seq, &r)) - goto out; - l = record_print_text(&r, syslog, printk_time); - } else { -- if (!prb_read_valid_info(prb, dumper->cur_seq, -+ if (!prb_read_valid_info(prb, iter->cur_seq, - &info, &line_count)) { - goto out; - } -@@ -3472,7 +3469,7 @@ bool kmsg_dump_get_line_nolock(struct km - - } - -- dumper->cur_seq = r.info->seq + 1; -+ iter->cur_seq = r.info->seq + 1; - ret = true; - out: - if (len) -@@ -3482,7 +3479,7 @@ bool kmsg_dump_get_line_nolock(struct km - - /** - * kmsg_dump_get_line - retrieve one kmsg log line -- * @dumper: registered kmsg dumper -+ * @iter: kmsg dumper iterator - * @syslog: include the "<4>" prefixes - * @line: buffer to copy the line to - * @size: maximum size of the buffer -@@ -3497,14 +3494,14 @@ bool kmsg_dump_get_line_nolock(struct km - * A return value of FALSE indicates that there are no more records to - * read. - */ --bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, -+bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, - char *line, size_t size, size_t *len) - { - unsigned long flags; - bool ret; - - logbuf_lock_irqsave(flags); -- ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len); -+ ret = kmsg_dump_get_line_nolock(iter, syslog, line, size, len); - logbuf_unlock_irqrestore(flags); - - return ret; -@@ -3513,7 +3510,7 @@ EXPORT_SYMBOL_GPL(kmsg_dump_get_line); - - /** - * kmsg_dump_get_buffer - copy kmsg log lines -- * @dumper: registered kmsg dumper -+ * @iter: kmsg dumper iterator - * @syslog: include the "<4>" prefixes - * @buf: buffer to copy the line to - * @size: maximum size of the buffer -@@ -3530,7 +3527,7 @@ EXPORT_SYMBOL_GPL(kmsg_dump_get_line); - * A return value of FALSE indicates that there are no more records to - * read. - */ --bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, -+bool kmsg_dump_get_buffer(struct kmsg_dumper_iter *iter, bool syslog, - char *buf, size_t size, size_t *len_out) - { - struct printk_info info; -@@ -3542,19 +3539,19 @@ bool kmsg_dump_get_buffer(struct kmsg_du - bool ret = false; - bool time = printk_time; - -- if (!dumper->active || !buf || !size) -+ if (!iter->active || !buf || !size) - goto out; - - logbuf_lock_irqsave(flags); -- if (prb_read_valid_info(prb, dumper->cur_seq, &info, NULL)) { -- if (info.seq != dumper->cur_seq) { -+ if (prb_read_valid_info(prb, iter->cur_seq, &info, NULL)) { -+ if (info.seq != iter->cur_seq) { - /* messages are gone, move to first available one */ -- dumper->cur_seq = info.seq; -+ iter->cur_seq = info.seq; - } - } - - /* last entry */ -- if (dumper->cur_seq >= dumper->next_seq) { -+ if (iter->cur_seq >= iter->next_seq) { - logbuf_unlock_irqrestore(flags); - goto out; - } -@@ -3565,7 +3562,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du - * because this function (by way of record_print_text()) will - * not write more than size-1 bytes of text into @buf. - */ -- seq = find_first_fitting_seq(dumper->cur_seq, dumper->next_seq, -+ seq = find_first_fitting_seq(iter->cur_seq, iter->next_seq, - size - 1, syslog, time); - - /* -@@ -3578,7 +3575,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du - - len = 0; - prb_for_each_record(seq, prb, seq, &r) { -- if (r.info->seq >= dumper->next_seq) -+ if (r.info->seq >= iter->next_seq) - break; - - len += record_print_text(&r, syslog, time); -@@ -3587,7 +3584,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du - prb_rec_init_rd(&r, &info, buf + len, size - len); - } - -- dumper->next_seq = next_seq; -+ iter->next_seq = next_seq; - ret = true; - logbuf_unlock_irqrestore(flags); - out: -@@ -3599,7 +3596,7 @@ EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer); - - /** - * kmsg_dump_rewind_nolock - reset the iterator (unlocked version) -- * @dumper: registered kmsg dumper -+ * @iter: kmsg dumper iterator - * - * Reset the dumper's iterator so that kmsg_dump_get_line() and - * kmsg_dump_get_buffer() can be called again and used multiple -@@ -3607,26 +3604,26 @@ EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer); - * - * The function is similar to kmsg_dump_rewind(), but grabs no locks. - */ --void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper) -+void kmsg_dump_rewind_nolock(struct kmsg_dumper_iter *iter) - { -- dumper->cur_seq = latched_seq_read_nolock(&clear_seq); -- dumper->next_seq = prb_next_seq(prb); -+ iter->cur_seq = latched_seq_read_nolock(&clear_seq); -+ iter->next_seq = prb_next_seq(prb); - } - - /** - * kmsg_dump_rewind - reset the iterator -- * @dumper: registered kmsg dumper -+ * @iter: kmsg dumper iterator - * - * Reset the dumper's iterator so that kmsg_dump_get_line() and - * kmsg_dump_get_buffer() can be called again and used multiple - * times within the same dumper.dump() callback. - */ --void kmsg_dump_rewind(struct kmsg_dumper *dumper) -+void kmsg_dump_rewind(struct kmsg_dumper_iter *iter) - { - unsigned long flags; - - logbuf_lock_irqsave(flags); -- kmsg_dump_rewind_nolock(dumper); -+ kmsg_dump_rewind_nolock(iter); - logbuf_unlock_irqrestore(flags); - } - EXPORT_SYMBOL_GPL(kmsg_dump_rewind); diff --git a/kernel/patches-5.11.x-rt/0030-0011-um-synchronize-kmsg_dumper.patch b/kernel/patches-5.11.x-rt/0030-0011-um-synchronize-kmsg_dumper.patch deleted file mode 100644 index 08c8b97b2a..0000000000 --- a/kernel/patches-5.11.x-rt/0030-0011-um-synchronize-kmsg_dumper.patch +++ /dev/null @@ -1,54 +0,0 @@ -From: John Ogness -Date: Mon, 21 Dec 2020 11:10:03 +0106 -Subject: [PATCH 11/28] um: synchronize kmsg_dumper - -The kmsg_dumper can be called from any context and CPU, possibly -from multiple CPUs simultaneously. Since a static buffer is used -to retrieve the kernel logs, this buffer must be protected against -simultaneous dumping. - -Cc: Richard Weinberger -Signed-off-by: John Ogness -Reviewed-by: Petr Mladek -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/um/kernel/kmsg_dump.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - ---- a/arch/um/kernel/kmsg_dump.c -+++ b/arch/um/kernel/kmsg_dump.c -@@ -1,5 +1,6 @@ - // SPDX-License-Identifier: GPL-2.0 - #include -+#include - #include - #include - #include -@@ -10,8 +11,10 @@ static void kmsg_dumper_stdout(struct km - enum kmsg_dump_reason reason, - struct kmsg_dumper_iter *iter) - { -+ static DEFINE_SPINLOCK(lock); - static char line[1024]; - struct console *con; -+ unsigned long flags; - size_t len = 0; - - /* only dump kmsg when no console is available */ -@@ -30,11 +33,16 @@ static void kmsg_dumper_stdout(struct km - if (con) - return; - -+ if (!spin_trylock_irqsave(&lock, flags)) -+ return; -+ - printf("kmsg_dump:\n"); - while (kmsg_dump_get_line(iter, true, line, sizeof(line), &len)) { - line[len] = '\0'; - printf("%s", line); - } -+ -+ spin_unlock_irqrestore(&lock, flags); - } - - static struct kmsg_dumper kmsg_dumper = { diff --git a/kernel/patches-5.11.x-rt/0031-0012-printk-remove-logbuf_lock.patch b/kernel/patches-5.11.x-rt/0031-0012-printk-remove-logbuf_lock.patch deleted file mode 100644 index 2e5e2198b3..0000000000 --- a/kernel/patches-5.11.x-rt/0031-0012-printk-remove-logbuf_lock.patch +++ /dev/null @@ -1,475 +0,0 @@ -From: John Ogness -Date: Tue, 26 Jan 2021 17:43:19 +0106 -Subject: [PATCH 12/28] printk: remove logbuf_lock - -Since the ringbuffer is lockless, there is no need for it to be -protected by @logbuf_lock. Remove @logbuf_lock. - -This means that printk_nmi_direct and printk_safe_flush_on_panic() -no longer need to acquire any lock to run. - -@console_seq, @exclusive_console_stop_seq, @console_dropped are -protected by @console_lock. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/internal.h | 4 - - kernel/printk/printk.c | 118 ++++++++++++++------------------------------ - kernel/printk/printk_safe.c | 29 ++-------- - 3 files changed, 48 insertions(+), 103 deletions(-) - ---- a/kernel/printk/internal.h -+++ b/kernel/printk/internal.h -@@ -12,8 +12,6 @@ - - #define PRINTK_NMI_CONTEXT_OFFSET 0x010000000 - --extern raw_spinlock_t logbuf_lock; -- - __printf(4, 0) - int vprintk_store(int facility, int level, - const struct dev_printk_info *dev_info, -@@ -59,7 +57,7 @@ void defer_console_output(void); - __printf(1, 0) int vprintk_func(const char *fmt, va_list args) { return 0; } - - /* -- * In !PRINTK builds we still export logbuf_lock spin_lock, console_sem -+ * In !PRINTK builds we still export console_sem - * semaphore and some of console functions (console_unlock()/etc.), so - * printk-safe must preserve the existing local IRQ guarantees. - */ ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -355,41 +355,6 @@ enum log_flags { - LOG_CONT = 8, /* text is a fragment of a continuation line */ - }; - --/* -- * The logbuf_lock protects kmsg buffer, indices, counters. This can be taken -- * within the scheduler's rq lock. It must be released before calling -- * console_unlock() or anything else that might wake up a process. -- */ --DEFINE_RAW_SPINLOCK(logbuf_lock); -- --/* -- * Helper macros to lock/unlock logbuf_lock and switch between -- * printk-safe/unsafe modes. -- */ --#define logbuf_lock_irq() \ -- do { \ -- printk_safe_enter_irq(); \ -- raw_spin_lock(&logbuf_lock); \ -- } while (0) -- --#define logbuf_unlock_irq() \ -- do { \ -- raw_spin_unlock(&logbuf_lock); \ -- printk_safe_exit_irq(); \ -- } while (0) -- --#define logbuf_lock_irqsave(flags) \ -- do { \ -- printk_safe_enter_irqsave(flags); \ -- raw_spin_lock(&logbuf_lock); \ -- } while (0) -- --#define logbuf_unlock_irqrestore(flags) \ -- do { \ -- raw_spin_unlock(&logbuf_lock); \ -- printk_safe_exit_irqrestore(flags); \ -- } while (0) -- - /* syslog_lock protects syslog_* variables and write access to clear_seq. */ - static DEFINE_RAW_SPINLOCK(syslog_lock); - -@@ -401,6 +366,7 @@ static u64 syslog_seq; - static size_t syslog_partial; - static bool syslog_time; - -+/* All 3 protected by @console_sem. */ - /* the next printk record to write to the console */ - static u64 console_seq; - static u64 exclusive_console_stop_seq; -@@ -766,27 +732,27 @@ static ssize_t devkmsg_read(struct file - if (ret) - return ret; - -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - if (!prb_read_valid(prb, atomic64_read(&user->seq), r)) { - if (file->f_flags & O_NONBLOCK) { - ret = -EAGAIN; -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - goto out; - } - -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - ret = wait_event_interruptible(log_wait, - prb_read_valid(prb, atomic64_read(&user->seq), r)); - if (ret) - goto out; -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - } - - if (r->info->seq != atomic64_read(&user->seq)) { - /* our last seen message is gone, return error and reset */ - atomic64_set(&user->seq, r->info->seq); - ret = -EPIPE; -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - goto out; - } - -@@ -796,7 +762,7 @@ static ssize_t devkmsg_read(struct file - &r->info->dev_info); - - atomic64_set(&user->seq, r->info->seq + 1); -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - - if (len > count) { - ret = -EINVAL; -@@ -831,7 +797,7 @@ static loff_t devkmsg_llseek(struct file - if (offset) - return -ESPIPE; - -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - switch (whence) { - case SEEK_SET: - /* the first record */ -@@ -852,7 +818,7 @@ static loff_t devkmsg_llseek(struct file - default: - ret = -EINVAL; - } -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - return ret; - } - -@@ -867,15 +833,15 @@ static __poll_t devkmsg_poll(struct file - - poll_wait(file, &log_wait, wait); - -- logbuf_lock_irq(); -- if (prb_read_valid_info(prb, user->seq, &info, NULL)) { -+ printk_safe_enter_irq(); -+ if (prb_read_valid_info(prb, atomic64_read(&user->seq), &info, NULL)) { - /* return error when data has vanished underneath us */ - if (info.seq != atomic64_read(&user->seq)) - ret = EPOLLIN|EPOLLRDNORM|EPOLLERR|EPOLLPRI; - else - ret = EPOLLIN|EPOLLRDNORM; - } -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - - return ret; - } -@@ -908,9 +874,9 @@ static int devkmsg_open(struct inode *in - prb_rec_init_rd(&user->record, &user->info, - &user->text_buf[0], sizeof(user->text_buf)); - -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - atomic64_set(&user->seq, prb_first_valid_seq(prb)); -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - - file->private_data = user; - return 0; -@@ -1532,11 +1498,11 @@ static int syslog_print(char __user *buf - size_t n; - size_t skip; - -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - raw_spin_lock(&syslog_lock); - if (!prb_read_valid(prb, syslog_seq, &r)) { - raw_spin_unlock(&syslog_lock); -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - break; - } - if (r.info->seq != syslog_seq) { -@@ -1566,7 +1532,7 @@ static int syslog_print(char __user *buf - } else - n = 0; - raw_spin_unlock(&syslog_lock); -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - - if (!n) - break; -@@ -1600,7 +1566,7 @@ static int syslog_print_all(char __user - return -ENOMEM; - - time = printk_time; -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - /* - * Find first record that fits, including all following records, - * into the user-provided buffer for this dump. -@@ -1621,12 +1587,12 @@ static int syslog_print_all(char __user - break; - } - -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - if (copy_to_user(buf + len, text, textlen)) - len = -EFAULT; - else - len += textlen; -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - - if (len < 0) - break; -@@ -1637,7 +1603,7 @@ static int syslog_print_all(char __user - latched_seq_write(&clear_seq, seq); - raw_spin_unlock(&syslog_lock); - } -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - - kfree(text); - return len; -@@ -1645,11 +1611,11 @@ static int syslog_print_all(char __user - - static void syslog_clear(void) - { -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - raw_spin_lock(&syslog_lock); - latched_seq_write(&clear_seq, prb_next_seq(prb)); - raw_spin_unlock(&syslog_lock); -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - } - - /* Return a consistent copy of @syslog_seq. */ -@@ -1737,12 +1703,12 @@ int do_syslog(int type, char __user *buf - break; - /* Number of chars in the log buffer */ - case SYSLOG_ACTION_SIZE_UNREAD: -- logbuf_lock_irq(); -+ printk_safe_enter_irq(); - raw_spin_lock(&syslog_lock); - if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) { - /* No unread messages. */ - raw_spin_unlock(&syslog_lock); -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - return 0; - } - if (info.seq != syslog_seq) { -@@ -1771,7 +1737,7 @@ int do_syslog(int type, char __user *buf - error -= syslog_partial; - } - raw_spin_unlock(&syslog_lock); -- logbuf_unlock_irq(); -+ printk_safe_exit_irq(); - break; - /* Size of the log buffer */ - case SYSLOG_ACTION_SIZE_BUFFER: -@@ -2627,7 +2593,6 @@ void console_unlock(void) - size_t len; - - printk_safe_enter_irqsave(flags); -- raw_spin_lock(&logbuf_lock); - skip: - if (!prb_read_valid(prb, console_seq, &r)) - break; -@@ -2671,7 +2636,6 @@ void console_unlock(void) - console_msg_format & MSG_FORMAT_SYSLOG, - printk_time); - console_seq++; -- raw_spin_unlock(&logbuf_lock); - - /* - * While actively printing out messages, if another printk() -@@ -2698,8 +2662,6 @@ void console_unlock(void) - - console_locked = 0; - -- raw_spin_unlock(&logbuf_lock); -- - up_console_sem(); - - /* -@@ -2708,9 +2670,7 @@ void console_unlock(void) - * there's a new owner and the console_unlock() from them will do the - * flush, no worries. - */ -- raw_spin_lock(&logbuf_lock); - retry = prb_read_valid(prb, console_seq, NULL); -- raw_spin_unlock(&logbuf_lock); - printk_safe_exit_irqrestore(flags); - - if (retry && console_trylock()) -@@ -2777,9 +2737,9 @@ void console_flush_on_panic(enum con_flu - if (mode == CONSOLE_REPLAY_ALL) { - unsigned long flags; - -- logbuf_lock_irqsave(flags); -+ printk_safe_enter_irqsave(flags); - console_seq = prb_first_valid_seq(prb); -- logbuf_unlock_irqrestore(flags); -+ printk_safe_exit_irqrestore(flags); - } - console_unlock(); - } -@@ -3008,7 +2968,7 @@ void register_console(struct console *ne - * console_unlock(); will print out the buffered messages - * for us. - */ -- logbuf_lock_irqsave(flags); -+ printk_safe_enter_irqsave(flags); - /* - * We're about to replay the log buffer. Only do this to the - * just-registered console to avoid excessive message spam to -@@ -3026,7 +2986,7 @@ void register_console(struct console *ne - console_seq = syslog_seq; - raw_spin_unlock(&syslog_lock); - -- logbuf_unlock_irqrestore(flags); -+ printk_safe_exit_irqrestore(flags); - } - console_unlock(); - console_sysfs_notify(); -@@ -3410,10 +3370,10 @@ void kmsg_dump(enum kmsg_dump_reason rea - - /* initialize iterator with data about the stored records */ - iter.active = true; -- logbuf_lock_irqsave(flags); -+ printk_safe_enter_irqsave(flags); - iter.cur_seq = latched_seq_read_nolock(&clear_seq); - iter.next_seq = prb_next_seq(prb); -- logbuf_unlock_irqrestore(flags); -+ printk_safe_exit_irqrestore(flags); - - /* invoke dumper which will iterate over records */ - dumper->dump(dumper, reason, &iter); -@@ -3500,9 +3460,9 @@ bool kmsg_dump_get_line(struct kmsg_dump - unsigned long flags; - bool ret; - -- logbuf_lock_irqsave(flags); -+ printk_safe_enter_irqsave(flags); - ret = kmsg_dump_get_line_nolock(iter, syslog, line, size, len); -- logbuf_unlock_irqrestore(flags); -+ printk_safe_exit_irqrestore(flags); - - return ret; - } -@@ -3542,7 +3502,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du - if (!iter->active || !buf || !size) - goto out; - -- logbuf_lock_irqsave(flags); -+ printk_safe_enter_irqsave(flags); - if (prb_read_valid_info(prb, iter->cur_seq, &info, NULL)) { - if (info.seq != iter->cur_seq) { - /* messages are gone, move to first available one */ -@@ -3552,7 +3512,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du - - /* last entry */ - if (iter->cur_seq >= iter->next_seq) { -- logbuf_unlock_irqrestore(flags); -+ printk_safe_exit_irqrestore(flags); - goto out; - } - -@@ -3586,7 +3546,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du - - iter->next_seq = next_seq; - ret = true; -- logbuf_unlock_irqrestore(flags); -+ printk_safe_exit_irqrestore(flags); - out: - if (len_out) - *len_out = len; -@@ -3622,9 +3582,9 @@ void kmsg_dump_rewind(struct kmsg_dumper - { - unsigned long flags; - -- logbuf_lock_irqsave(flags); -+ printk_safe_enter_irqsave(flags); - kmsg_dump_rewind_nolock(iter); -- logbuf_unlock_irqrestore(flags); -+ printk_safe_exit_irqrestore(flags); - } - EXPORT_SYMBOL_GPL(kmsg_dump_rewind); - ---- a/kernel/printk/printk_safe.c -+++ b/kernel/printk/printk_safe.c -@@ -16,7 +16,7 @@ - #include "internal.h" - - /* -- * printk() could not take logbuf_lock in NMI context. Instead, -+ * In NMI and safe mode, printk() avoids taking locks. Instead, - * it uses an alternative implementation that temporary stores - * the strings into a per-CPU buffer. The content of the buffer - * is later flushed into the main ring buffer via IRQ work. -@@ -266,18 +266,6 @@ void printk_safe_flush(void) - */ - void printk_safe_flush_on_panic(void) - { -- /* -- * Make sure that we could access the main ring buffer. -- * Do not risk a double release when more CPUs are up. -- */ -- if (raw_spin_is_locked(&logbuf_lock)) { -- if (num_online_cpus() > 1) -- return; -- -- debug_locks_off(); -- raw_spin_lock_init(&logbuf_lock); -- } -- - if (raw_spin_is_locked(&safe_read_lock)) { - if (num_online_cpus() > 1) - return; -@@ -319,9 +307,7 @@ void noinstr printk_nmi_exit(void) - * reordering. - * - * It has effect only when called in NMI context. Then printk() -- * will try to store the messages into the main logbuf directly -- * and use the per-CPU buffers only as a fallback when the lock -- * is not available. -+ * will store the messages into the main logbuf directly. - */ - void printk_nmi_direct_enter(void) - { -@@ -376,20 +362,21 @@ void __printk_safe_exit(void) - #endif - - /* -- * Try to use the main logbuf even in NMI. But avoid calling console -+ * Use the main logbuf even in NMI. But avoid calling console - * drivers that might have their own locks. - */ -- if ((this_cpu_read(printk_context) & PRINTK_NMI_DIRECT_CONTEXT_MASK) && -- raw_spin_trylock(&logbuf_lock)) { -+ if ((this_cpu_read(printk_context) & PRINTK_NMI_DIRECT_CONTEXT_MASK)) { -+ unsigned long flags; - int len; - -+ printk_safe_enter_irqsave(flags); - len = vprintk_store(0, LOGLEVEL_DEFAULT, NULL, fmt, args); -- raw_spin_unlock(&logbuf_lock); -+ printk_safe_exit_irqrestore(flags); - defer_console_output(); - return len; - } - -- /* Use extra buffer in NMI when logbuf_lock is taken or in safe mode. */ -+ /* Use extra buffer in NMI. */ - if (this_cpu_read(printk_context) & PRINTK_NMI_CONTEXT_MASK) - return vprintk_nmi(fmt, args); - diff --git a/kernel/patches-5.11.x-rt/0032-0013-printk-kmsg_dump-remove-_nolock-variants.patch b/kernel/patches-5.11.x-rt/0032-0013-printk-kmsg_dump-remove-_nolock-variants.patch deleted file mode 100644 index 556dd17d4f..0000000000 --- a/kernel/patches-5.11.x-rt/0032-0013-printk-kmsg_dump-remove-_nolock-variants.patch +++ /dev/null @@ -1,213 +0,0 @@ -From: John Ogness -Date: Mon, 21 Dec 2020 10:27:58 +0106 -Subject: [PATCH 13/28] printk: kmsg_dump: remove _nolock() variants - -kmsg_dump_rewind() and kmsg_dump_get_line() are lockless, so there is -no need for _nolock() variants. Remove these functions and switch all -callers of the _nolock() variants. - -The functions without _nolock() were chosen because they are already -exported to kernel modules. - -Signed-off-by: John Ogness ---- - arch/powerpc/xmon/xmon.c | 4 +- - include/linux/kmsg_dump.h | 18 ------------- - kernel/debug/kdb/kdb_main.c | 8 ++--- - kernel/printk/printk.c | 60 +++++--------------------------------------- - 4 files changed, 15 insertions(+), 75 deletions(-) - ---- a/arch/powerpc/xmon/xmon.c -+++ b/arch/powerpc/xmon/xmon.c -@@ -3017,9 +3017,9 @@ dump_log_buf(void) - catch_memory_errors = 1; - sync(); - -- kmsg_dump_rewind_nolock(&iter); -+ kmsg_dump_rewind(&iter); - xmon_start_pagination(); -- while (kmsg_dump_get_line_nolock(&iter, false, buf, sizeof(buf), &len)) { -+ while (kmsg_dump_get_line(&iter, false, buf, sizeof(buf), &len)) { - buf[len] = '\0'; - printf("%s", buf); - } ---- a/include/linux/kmsg_dump.h -+++ b/include/linux/kmsg_dump.h -@@ -60,18 +60,13 @@ struct kmsg_dumper { - #ifdef CONFIG_PRINTK - void kmsg_dump(enum kmsg_dump_reason reason); - --bool kmsg_dump_get_line_nolock(struct kmsg_dumper_iter *iter, bool syslog, -- char *line, size_t size, size_t *len); -- - bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, - char *line, size_t size, size_t *len); - - bool kmsg_dump_get_buffer(struct kmsg_dumper_iter *iter, bool syslog, - char *buf, size_t size, size_t *len_out); - --void kmsg_dump_rewind_nolock(struct kmsg_dumper_iter *iter); -- --void kmsg_dump_rewind(struct kmsg_dumper_iter *dumper_iter); -+void kmsg_dump_rewind(struct kmsg_dumper_iter *iter); - - int kmsg_dump_register(struct kmsg_dumper *dumper); - -@@ -83,13 +78,6 @@ static inline void kmsg_dump(enum kmsg_d - { - } - --static inline bool kmsg_dump_get_line_nolock(struct kmsg_dumper_iter *iter, -- bool syslog, const char *line, -- size_t size, size_t *len) --{ -- return false; --} -- - static inline bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, - const char *line, size_t size, size_t *len) - { -@@ -102,10 +90,6 @@ static inline bool kmsg_dump_get_buffer( - return false; - } - --static inline void kmsg_dump_rewind_nolock(struct kmsg_dumper_iter *iter) --{ --} -- - static inline void kmsg_dump_rewind(struct kmsg_dumper_iter *iter) - { - } ---- a/kernel/debug/kdb/kdb_main.c -+++ b/kernel/debug/kdb/kdb_main.c -@@ -2126,8 +2126,8 @@ static int kdb_dmesg(int argc, const cha - kdb_set(2, setargs); - } - -- kmsg_dump_rewind_nolock(&iter); -- while (kmsg_dump_get_line_nolock(&iter, 1, NULL, 0, NULL)) -+ kmsg_dump_rewind(&iter); -+ while (kmsg_dump_get_line(&iter, 1, NULL, 0, NULL)) - n++; - - if (lines < 0) { -@@ -2159,8 +2159,8 @@ static int kdb_dmesg(int argc, const cha - if (skip >= n || skip < 0) - return 0; - -- kmsg_dump_rewind_nolock(&iter); -- while (kmsg_dump_get_line_nolock(&iter, 1, buf, sizeof(buf), &len)) { -+ kmsg_dump_rewind(&iter); -+ while (kmsg_dump_get_line(&iter, 1, buf, sizeof(buf), &len)) { - if (skip) { - skip--; - continue; ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -3382,7 +3382,7 @@ void kmsg_dump(enum kmsg_dump_reason rea - } - - /** -- * kmsg_dump_get_line_nolock - retrieve one kmsg log line (unlocked version) -+ * kmsg_dump_get_line - retrieve one kmsg log line - * @iter: kmsg dumper iterator - * @syslog: include the "<4>" prefixes - * @line: buffer to copy the line to -@@ -3397,18 +3397,18 @@ void kmsg_dump(enum kmsg_dump_reason rea - * - * A return value of FALSE indicates that there are no more records to - * read. -- * -- * The function is similar to kmsg_dump_get_line(), but grabs no locks. - */ --bool kmsg_dump_get_line_nolock(struct kmsg_dumper_iter *iter, bool syslog, -- char *line, size_t size, size_t *len) -+bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, -+ char *line, size_t size, size_t *len) - { - struct printk_info info; - unsigned int line_count; - struct printk_record r; -+ unsigned long flags; - size_t l = 0; - bool ret = false; - -+ printk_safe_enter_irqsave(flags); - prb_rec_init_rd(&r, &info, line, size); - - if (!iter->active) -@@ -3432,40 +3432,11 @@ bool kmsg_dump_get_line_nolock(struct km - iter->cur_seq = r.info->seq + 1; - ret = true; - out: -+ printk_safe_exit_irqrestore(flags); - if (len) - *len = l; - return ret; - } -- --/** -- * kmsg_dump_get_line - retrieve one kmsg log line -- * @iter: kmsg dumper iterator -- * @syslog: include the "<4>" prefixes -- * @line: buffer to copy the line to -- * @size: maximum size of the buffer -- * @len: length of line placed into buffer -- * -- * Start at the beginning of the kmsg buffer, with the oldest kmsg -- * record, and copy one record into the provided buffer. -- * -- * Consecutive calls will return the next available record moving -- * towards the end of the buffer with the youngest messages. -- * -- * A return value of FALSE indicates that there are no more records to -- * read. -- */ --bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, -- char *line, size_t size, size_t *len) --{ -- unsigned long flags; -- bool ret; -- -- printk_safe_enter_irqsave(flags); -- ret = kmsg_dump_get_line_nolock(iter, syslog, line, size, len); -- printk_safe_exit_irqrestore(flags); -- -- return ret; --} - EXPORT_SYMBOL_GPL(kmsg_dump_get_line); - - /** -@@ -3555,22 +3526,6 @@ bool kmsg_dump_get_buffer(struct kmsg_du - EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer); - - /** -- * kmsg_dump_rewind_nolock - reset the iterator (unlocked version) -- * @iter: kmsg dumper iterator -- * -- * Reset the dumper's iterator so that kmsg_dump_get_line() and -- * kmsg_dump_get_buffer() can be called again and used multiple -- * times within the same dumper.dump() callback. -- * -- * The function is similar to kmsg_dump_rewind(), but grabs no locks. -- */ --void kmsg_dump_rewind_nolock(struct kmsg_dumper_iter *iter) --{ -- iter->cur_seq = latched_seq_read_nolock(&clear_seq); -- iter->next_seq = prb_next_seq(prb); --} -- --/** - * kmsg_dump_rewind - reset the iterator - * @iter: kmsg dumper iterator - * -@@ -3583,7 +3538,8 @@ void kmsg_dump_rewind(struct kmsg_dumper - unsigned long flags; - - printk_safe_enter_irqsave(flags); -- kmsg_dump_rewind_nolock(iter); -+ iter->cur_seq = latched_seq_read_nolock(&clear_seq); -+ iter->next_seq = prb_next_seq(prb); - printk_safe_exit_irqrestore(flags); - } - EXPORT_SYMBOL_GPL(kmsg_dump_rewind); diff --git a/kernel/patches-5.11.x-rt/0033-0014-printk-kmsg_dump-use-kmsg_dump_rewind.patch b/kernel/patches-5.11.x-rt/0033-0014-printk-kmsg_dump-use-kmsg_dump_rewind.patch deleted file mode 100644 index 8d15e8698d..0000000000 --- a/kernel/patches-5.11.x-rt/0033-0014-printk-kmsg_dump-use-kmsg_dump_rewind.patch +++ /dev/null @@ -1,35 +0,0 @@ -From: John Ogness -Date: Wed, 17 Feb 2021 18:23:16 +0100 -Subject: [PATCH 14/28] printk: kmsg_dump: use kmsg_dump_rewind - -kmsg_dump() is open coding the kmsg_dump_rewind(). Call -kmsg_dump_rewind() instead. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -3351,7 +3351,6 @@ void kmsg_dump(enum kmsg_dump_reason rea - { - struct kmsg_dumper_iter iter; - struct kmsg_dumper *dumper; -- unsigned long flags; - - rcu_read_lock(); - list_for_each_entry_rcu(dumper, &dump_list, list) { -@@ -3370,10 +3369,7 @@ void kmsg_dump(enum kmsg_dump_reason rea - - /* initialize iterator with data about the stored records */ - iter.active = true; -- printk_safe_enter_irqsave(flags); -- iter.cur_seq = latched_seq_read_nolock(&clear_seq); -- iter.next_seq = prb_next_seq(prb); -- printk_safe_exit_irqrestore(flags); -+ kmsg_dump_rewind(&iter); - - /* invoke dumper which will iterate over records */ - dumper->dump(dumper, reason, &iter); diff --git a/kernel/patches-5.11.x-rt/0034-0015-printk-console-remove-unnecessary-safe-buffer-usage.patch b/kernel/patches-5.11.x-rt/0034-0015-printk-console-remove-unnecessary-safe-buffer-usage.patch deleted file mode 100644 index 6f88982069..0000000000 --- a/kernel/patches-5.11.x-rt/0034-0015-printk-console-remove-unnecessary-safe-buffer-usage.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: John Ogness -Date: Wed, 17 Feb 2021 18:28:05 +0100 -Subject: [PATCH 15/28] printk: console: remove unnecessary safe buffer usage - -Upon registering a console, safe buffers are activated when setting -up the sequence number to replay the log. However, these are already -protected by @console_sem and @syslog_lock. Remove the unnecessary -safe buffer usage. - -Signed-off-by: John Ogness ---- - kernel/printk/printk.c | 10 +++------- - 1 file changed, 3 insertions(+), 7 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -2967,9 +2967,7 @@ void register_console(struct console *ne - /* - * console_unlock(); will print out the buffered messages - * for us. -- */ -- printk_safe_enter_irqsave(flags); -- /* -+ * - * We're about to replay the log buffer. Only do this to the - * just-registered console to avoid excessive message spam to - * the already-registered consoles. -@@ -2982,11 +2980,9 @@ void register_console(struct console *ne - exclusive_console_stop_seq = console_seq; - - /* Get a consistent copy of @syslog_seq. */ -- raw_spin_lock(&syslog_lock); -+ raw_spin_lock_irqsave(&syslog_lock, flags); - console_seq = syslog_seq; -- raw_spin_unlock(&syslog_lock); -- -- printk_safe_exit_irqrestore(flags); -+ raw_spin_unlock_irqrestore(&syslog_lock, flags); - } - console_unlock(); - console_sysfs_notify(); diff --git a/kernel/patches-5.11.x-rt/0035-0016-printk-track-limit-recursion.patch b/kernel/patches-5.11.x-rt/0035-0016-printk-track-limit-recursion.patch deleted file mode 100644 index ab6c13a92b..0000000000 --- a/kernel/patches-5.11.x-rt/0035-0016-printk-track-limit-recursion.patch +++ /dev/null @@ -1,136 +0,0 @@ -From: John Ogness -Date: Fri, 11 Dec 2020 00:55:25 +0106 -Subject: [PATCH 16/28] printk: track/limit recursion - -Limit printk() recursion to 1 level. This is enough to print a -stacktrace for the printk call, should a WARN or BUG occur. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 71 insertions(+), 3 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1940,6 +1940,65 @@ static void call_console_drivers(const c - } - } - -+#ifdef CONFIG_PRINTK_NMI -+#define NUM_RECURSION_CTX 2 -+#else -+#define NUM_RECURSION_CTX 1 -+#endif -+ -+struct printk_recursion { -+ char count[NUM_RECURSION_CTX]; -+}; -+ -+static DEFINE_PER_CPU(struct printk_recursion, percpu_printk_recursion); -+static char printk_recursion_count[NUM_RECURSION_CTX]; -+ -+static char *printk_recursion_counter(void) -+{ -+ struct printk_recursion *rec; -+ char *count; -+ -+ if (!printk_percpu_data_ready()) { -+ count = &printk_recursion_count[0]; -+ } else { -+ rec = this_cpu_ptr(&percpu_printk_recursion); -+ -+ count = &rec->count[0]; -+ } -+ -+#ifdef CONFIG_PRINTK_NMI -+ if (in_nmi()) -+ count++; -+#endif -+ -+ return count; -+} -+ -+static bool printk_enter_irqsave(unsigned long *flags) -+{ -+ char *count; -+ -+ local_irq_save(*flags); -+ count = printk_recursion_counter(); -+ /* Only 1 level of recursion allowed. */ -+ if (*count > 1) { -+ local_irq_restore(*flags); -+ return false; -+ } -+ (*count)++; -+ -+ return true; -+} -+ -+static void printk_exit_irqrestore(unsigned long flags) -+{ -+ char *count; -+ -+ count = printk_recursion_counter(); -+ (*count)--; -+ local_irq_restore(flags); -+} -+ - int printk_delay_msec __read_mostly; - - static inline void printk_delay(void) -@@ -2040,11 +2099,13 @@ int vprintk_store(int facility, int leve - struct prb_reserved_entry e; - enum log_flags lflags = 0; - struct printk_record r; -+ unsigned long irqflags; - u16 trunc_msg_len = 0; - char prefix_buf[8]; - u16 reserve_size; - va_list args2; - u16 text_len; -+ int ret = 0; - u64 ts_nsec; - - /* -@@ -2055,6 +2116,9 @@ int vprintk_store(int facility, int leve - */ - ts_nsec = local_clock(); - -+ if (!printk_enter_irqsave(&irqflags)) -+ return 0; -+ - /* - * The sprintf needs to come first since the syslog prefix might be - * passed in as a parameter. An extra byte must be reserved so that -@@ -2092,7 +2156,8 @@ int vprintk_store(int facility, int leve - prb_commit(&e); - } - -- return text_len; -+ ret = text_len; -+ goto out; - } - } - -@@ -2108,7 +2173,7 @@ int vprintk_store(int facility, int leve - - prb_rec_init_wr(&r, reserve_size + trunc_msg_len); - if (!prb_reserve(&e, prb, &r)) -- return 0; -+ goto out; - } - - /* fill message */ -@@ -2130,7 +2195,10 @@ int vprintk_store(int facility, int leve - else - prb_final_commit(&e); - -- return (text_len + trunc_msg_len); -+ ret = text_len + trunc_msg_len; -+out: -+ printk_exit_irqrestore(irqflags); -+ return ret; - } - - asmlinkage int vprintk_emit(int facility, int level, diff --git a/kernel/patches-5.11.x-rt/0036-0017-printk-remove-safe-buffers.patch b/kernel/patches-5.11.x-rt/0036-0017-printk-remove-safe-buffers.patch deleted file mode 100644 index 3834fab493..0000000000 --- a/kernel/patches-5.11.x-rt/0036-0017-printk-remove-safe-buffers.patch +++ /dev/null @@ -1,854 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:00 +0106 -Subject: [PATCH 17/28] printk: remove safe buffers - -With @logbuf_lock removed, the high level printk functions for -storing messages are lockless. Messages can be stored from any -context, so there is no need for the NMI and safe buffers anymore. - -Remove the NMI and safe buffers. In NMI or safe contexts, store -the message immediately but still use irq_work to defer the console -printing. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/kernel/traps.c | 1 - arch/powerpc/kernel/watchdog.c | 5 - include/linux/printk.h | 10 - - kernel/kexec_core.c | 1 - kernel/panic.c | 3 - kernel/printk/internal.h | 2 - kernel/printk/printk.c | 85 +--------- - kernel/printk/printk_safe.c | 329 ----------------------------------------- - lib/nmi_backtrace.c | 6 - 9 files changed, 17 insertions(+), 425 deletions(-) - ---- a/arch/powerpc/kernel/traps.c -+++ b/arch/powerpc/kernel/traps.c -@@ -170,7 +170,6 @@ extern void panic_flush_kmsg_start(void) - - extern void panic_flush_kmsg_end(void) - { -- printk_safe_flush_on_panic(); - kmsg_dump(KMSG_DUMP_PANIC); - bust_spinlocks(0); - debug_locks_off(); ---- a/arch/powerpc/kernel/watchdog.c -+++ b/arch/powerpc/kernel/watchdog.c -@@ -181,11 +181,6 @@ static void watchdog_smp_panic(int cpu, - - wd_smp_unlock(&flags); - -- printk_safe_flush(); -- /* -- * printk_safe_flush() seems to require another print -- * before anything actually goes out to console. -- */ - if (sysctl_hardlockup_all_cpu_backtrace) - trigger_allbutself_cpu_backtrace(); - ---- a/include/linux/printk.h -+++ b/include/linux/printk.h -@@ -207,8 +207,6 @@ void __init setup_log_buf(int early); - void dump_stack_print_info(const char *log_lvl); - void show_regs_print_info(const char *log_lvl); - extern asmlinkage void dump_stack(void) __cold; --extern void printk_safe_flush(void); --extern void printk_safe_flush_on_panic(void); - #else - static inline __printf(1, 0) - int vprintk(const char *s, va_list args) -@@ -272,14 +270,6 @@ static inline void show_regs_print_info( - static inline void dump_stack(void) - { - } -- --static inline void printk_safe_flush(void) --{ --} -- --static inline void printk_safe_flush_on_panic(void) --{ --} - #endif - - extern int kptr_restrict; ---- a/kernel/kexec_core.c -+++ b/kernel/kexec_core.c -@@ -977,7 +977,6 @@ void crash_kexec(struct pt_regs *regs) - old_cpu = atomic_cmpxchg(&panic_cpu, PANIC_CPU_INVALID, this_cpu); - if (old_cpu == PANIC_CPU_INVALID) { - /* This is the 1st CPU which comes here, so go ahead. */ -- printk_safe_flush_on_panic(); - __crash_kexec(regs); - - /* ---- a/kernel/panic.c -+++ b/kernel/panic.c -@@ -247,7 +247,6 @@ void panic(const char *fmt, ...) - * Bypass the panic_cpu check and call __crash_kexec directly. - */ - if (!_crash_kexec_post_notifiers) { -- printk_safe_flush_on_panic(); - __crash_kexec(NULL); - - /* -@@ -271,8 +270,6 @@ void panic(const char *fmt, ...) - */ - atomic_notifier_call_chain(&panic_notifier_list, 0, buf); - -- /* Call flush even twice. It tries harder with a single online CPU */ -- printk_safe_flush_on_panic(); - kmsg_dump(KMSG_DUMP_PANIC); - - /* ---- a/kernel/printk/internal.h -+++ b/kernel/printk/internal.h -@@ -23,7 +23,6 @@ int vprintk_store(int facility, int leve - void __printk_safe_enter(void); - void __printk_safe_exit(void); - --void printk_safe_init(void); - bool printk_percpu_data_ready(void); - - #define printk_safe_enter_irqsave(flags) \ -@@ -67,6 +66,5 @@ void defer_console_output(void); - #define printk_safe_enter_irq() local_irq_disable() - #define printk_safe_exit_irq() local_irq_enable() - --static inline void printk_safe_init(void) { } - static inline bool printk_percpu_data_ready(void) { return false; } - #endif /* CONFIG_PRINTK */ ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -732,27 +732,22 @@ static ssize_t devkmsg_read(struct file - if (ret) - return ret; - -- printk_safe_enter_irq(); - if (!prb_read_valid(prb, atomic64_read(&user->seq), r)) { - if (file->f_flags & O_NONBLOCK) { - ret = -EAGAIN; -- printk_safe_exit_irq(); - goto out; - } - -- printk_safe_exit_irq(); - ret = wait_event_interruptible(log_wait, - prb_read_valid(prb, atomic64_read(&user->seq), r)); - if (ret) - goto out; -- printk_safe_enter_irq(); - } - - if (r->info->seq != atomic64_read(&user->seq)) { - /* our last seen message is gone, return error and reset */ - atomic64_set(&user->seq, r->info->seq); - ret = -EPIPE; -- printk_safe_exit_irq(); - goto out; - } - -@@ -762,7 +757,6 @@ static ssize_t devkmsg_read(struct file - &r->info->dev_info); - - atomic64_set(&user->seq, r->info->seq + 1); -- printk_safe_exit_irq(); - - if (len > count) { - ret = -EINVAL; -@@ -797,7 +791,6 @@ static loff_t devkmsg_llseek(struct file - if (offset) - return -ESPIPE; - -- printk_safe_enter_irq(); - switch (whence) { - case SEEK_SET: - /* the first record */ -@@ -818,7 +811,6 @@ static loff_t devkmsg_llseek(struct file - default: - ret = -EINVAL; - } -- printk_safe_exit_irq(); - return ret; - } - -@@ -833,7 +825,6 @@ static __poll_t devkmsg_poll(struct file - - poll_wait(file, &log_wait, wait); - -- printk_safe_enter_irq(); - if (prb_read_valid_info(prb, atomic64_read(&user->seq), &info, NULL)) { - /* return error when data has vanished underneath us */ - if (info.seq != atomic64_read(&user->seq)) -@@ -841,7 +832,6 @@ static __poll_t devkmsg_poll(struct file - else - ret = EPOLLIN|EPOLLRDNORM; - } -- printk_safe_exit_irq(); - - return ret; - } -@@ -874,9 +864,7 @@ static int devkmsg_open(struct inode *in - prb_rec_init_rd(&user->record, &user->info, - &user->text_buf[0], sizeof(user->text_buf)); - -- printk_safe_enter_irq(); - atomic64_set(&user->seq, prb_first_valid_seq(prb)); -- printk_safe_exit_irq(); - - file->private_data = user; - return 0; -@@ -1042,9 +1030,6 @@ static inline void log_buf_add_cpu(void) - - static void __init set_percpu_data_ready(void) - { -- printk_safe_init(); -- /* Make sure we set this flag only after printk_safe() init is done */ -- barrier(); - __printk_percpu_data_ready = true; - } - -@@ -1142,8 +1127,6 @@ void __init setup_log_buf(int early) - new_descs, ilog2(new_descs_count), - new_infos); - -- printk_safe_enter_irqsave(flags); -- - log_buf_len = new_log_buf_len; - log_buf = new_log_buf; - new_log_buf_len = 0; -@@ -1159,8 +1142,6 @@ void __init setup_log_buf(int early) - */ - prb = &printk_rb_dynamic; - -- printk_safe_exit_irqrestore(flags); -- - if (seq != prb_next_seq(&printk_rb_static)) { - pr_err("dropped %llu messages\n", - prb_next_seq(&printk_rb_static) - seq); -@@ -1498,11 +1479,9 @@ static int syslog_print(char __user *buf - size_t n; - size_t skip; - -- printk_safe_enter_irq(); -- raw_spin_lock(&syslog_lock); -+ raw_spin_lock_irq(&syslog_lock); - if (!prb_read_valid(prb, syslog_seq, &r)) { -- raw_spin_unlock(&syslog_lock); -- printk_safe_exit_irq(); -+ raw_spin_unlock_irq(&syslog_lock); - break; - } - if (r.info->seq != syslog_seq) { -@@ -1531,8 +1510,7 @@ static int syslog_print(char __user *buf - syslog_partial += n; - } else - n = 0; -- raw_spin_unlock(&syslog_lock); -- printk_safe_exit_irq(); -+ raw_spin_unlock_irq(&syslog_lock); - - if (!n) - break; -@@ -1566,7 +1544,6 @@ static int syslog_print_all(char __user - return -ENOMEM; - - time = printk_time; -- printk_safe_enter_irq(); - /* - * Find first record that fits, including all following records, - * into the user-provided buffer for this dump. -@@ -1587,23 +1564,20 @@ static int syslog_print_all(char __user - break; - } - -- printk_safe_exit_irq(); - if (copy_to_user(buf + len, text, textlen)) - len = -EFAULT; - else - len += textlen; -- printk_safe_enter_irq(); - - if (len < 0) - break; - } - - if (clear) { -- raw_spin_lock(&syslog_lock); -+ raw_spin_lock_irq(&syslog_lock); - latched_seq_write(&clear_seq, seq); -- raw_spin_unlock(&syslog_lock); -+ raw_spin_unlock_irq(&syslog_lock); - } -- printk_safe_exit_irq(); - - kfree(text); - return len; -@@ -1611,11 +1585,9 @@ static int syslog_print_all(char __user - - static void syslog_clear(void) - { -- printk_safe_enter_irq(); -- raw_spin_lock(&syslog_lock); -+ raw_spin_lock_irq(&syslog_lock); - latched_seq_write(&clear_seq, prb_next_seq(prb)); -- raw_spin_unlock(&syslog_lock); -- printk_safe_exit_irq(); -+ raw_spin_unlock_irq(&syslog_lock); - } - - /* Return a consistent copy of @syslog_seq. */ -@@ -1703,12 +1675,10 @@ int do_syslog(int type, char __user *buf - break; - /* Number of chars in the log buffer */ - case SYSLOG_ACTION_SIZE_UNREAD: -- printk_safe_enter_irq(); -- raw_spin_lock(&syslog_lock); -+ raw_spin_lock_irq(&syslog_lock); - if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) { - /* No unread messages. */ -- raw_spin_unlock(&syslog_lock); -- printk_safe_exit_irq(); -+ raw_spin_unlock_irq(&syslog_lock); - return 0; - } - if (info.seq != syslog_seq) { -@@ -1736,8 +1706,7 @@ int do_syslog(int type, char __user *buf - } - error -= syslog_partial; - } -- raw_spin_unlock(&syslog_lock); -- printk_safe_exit_irq(); -+ raw_spin_unlock_irq(&syslog_lock); - break; - /* Size of the log buffer */ - case SYSLOG_ACTION_SIZE_BUFFER: -@@ -2207,7 +2176,6 @@ asmlinkage int vprintk_emit(int facility - { - int printed_len; - bool in_sched = false; -- unsigned long flags; - - /* Suppress unimportant messages after panic happens */ - if (unlikely(suppress_printk)) -@@ -2221,9 +2189,7 @@ asmlinkage int vprintk_emit(int facility - boot_delay_msec(level); - printk_delay(); - -- printk_safe_enter_irqsave(flags); - printed_len = vprintk_store(facility, level, dev_info, fmt, args); -- printk_safe_exit_irqrestore(flags); - - /* If called from the scheduler, we can not call up(). */ - if (!in_sched) { -@@ -2615,7 +2581,6 @@ void console_unlock(void) - { - static char ext_text[CONSOLE_EXT_LOG_MAX]; - static char text[CONSOLE_LOG_MAX]; -- unsigned long flags; - bool do_cond_resched, retry; - struct printk_info info; - struct printk_record r; -@@ -2660,7 +2625,6 @@ void console_unlock(void) - size_t ext_len = 0; - size_t len; - -- printk_safe_enter_irqsave(flags); - skip: - if (!prb_read_valid(prb, console_seq, &r)) - break; -@@ -2717,12 +2681,8 @@ void console_unlock(void) - call_console_drivers(ext_text, ext_len, text, len); - start_critical_timings(); - -- if (console_lock_spinning_disable_and_check()) { -- printk_safe_exit_irqrestore(flags); -+ if (console_lock_spinning_disable_and_check()) - return; -- } -- -- printk_safe_exit_irqrestore(flags); - - if (do_cond_resched) - cond_resched(); -@@ -2739,8 +2699,6 @@ void console_unlock(void) - * flush, no worries. - */ - retry = prb_read_valid(prb, console_seq, NULL); -- printk_safe_exit_irqrestore(flags); -- - if (retry && console_trylock()) - goto again; - } -@@ -2802,13 +2760,8 @@ void console_flush_on_panic(enum con_flu - console_trylock(); - console_may_schedule = 0; - -- if (mode == CONSOLE_REPLAY_ALL) { -- unsigned long flags; -- -- printk_safe_enter_irqsave(flags); -+ if (mode == CONSOLE_REPLAY_ALL) - console_seq = prb_first_valid_seq(prb); -- printk_safe_exit_irqrestore(flags); -- } - console_unlock(); - } - -@@ -3464,11 +3417,9 @@ bool kmsg_dump_get_line(struct kmsg_dump - struct printk_info info; - unsigned int line_count; - struct printk_record r; -- unsigned long flags; - size_t l = 0; - bool ret = false; - -- printk_safe_enter_irqsave(flags); - prb_rec_init_rd(&r, &info, line, size); - - if (!iter->active) -@@ -3492,7 +3443,6 @@ bool kmsg_dump_get_line(struct kmsg_dump - iter->cur_seq = r.info->seq + 1; - ret = true; - out: -- printk_safe_exit_irqrestore(flags); - if (len) - *len = l; - return ret; -@@ -3523,7 +3473,6 @@ bool kmsg_dump_get_buffer(struct kmsg_du - { - struct printk_info info; - struct printk_record r; -- unsigned long flags; - u64 seq; - u64 next_seq; - size_t len = 0; -@@ -3533,7 +3482,6 @@ bool kmsg_dump_get_buffer(struct kmsg_du - if (!iter->active || !buf || !size) - goto out; - -- printk_safe_enter_irqsave(flags); - if (prb_read_valid_info(prb, iter->cur_seq, &info, NULL)) { - if (info.seq != iter->cur_seq) { - /* messages are gone, move to first available one */ -@@ -3542,10 +3490,8 @@ bool kmsg_dump_get_buffer(struct kmsg_du - } - - /* last entry */ -- if (iter->cur_seq >= iter->next_seq) { -- printk_safe_exit_irqrestore(flags); -+ if (iter->cur_seq >= iter->next_seq) - goto out; -- } - - /* - * Find first record that fits, including all following records, -@@ -3577,7 +3523,6 @@ bool kmsg_dump_get_buffer(struct kmsg_du - - iter->next_seq = next_seq; - ret = true; -- printk_safe_exit_irqrestore(flags); - out: - if (len_out) - *len_out = len; -@@ -3595,12 +3540,8 @@ EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer); - */ - void kmsg_dump_rewind(struct kmsg_dumper_iter *iter) - { -- unsigned long flags; -- -- printk_safe_enter_irqsave(flags); - iter->cur_seq = latched_seq_read_nolock(&clear_seq); - iter->next_seq = prb_next_seq(prb); -- printk_safe_exit_irqrestore(flags); - } - EXPORT_SYMBOL_GPL(kmsg_dump_rewind); - ---- a/kernel/printk/printk_safe.c -+++ b/kernel/printk/printk_safe.c -@@ -15,282 +15,9 @@ - - #include "internal.h" - --/* -- * In NMI and safe mode, printk() avoids taking locks. Instead, -- * it uses an alternative implementation that temporary stores -- * the strings into a per-CPU buffer. The content of the buffer -- * is later flushed into the main ring buffer via IRQ work. -- * -- * The alternative implementation is chosen transparently -- * by examining current printk() context mask stored in @printk_context -- * per-CPU variable. -- * -- * The implementation allows to flush the strings also from another CPU. -- * There are situations when we want to make sure that all buffers -- * were handled or when IRQs are blocked. -- */ -- --#define SAFE_LOG_BUF_LEN ((1 << CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT) - \ -- sizeof(atomic_t) - \ -- sizeof(atomic_t) - \ -- sizeof(struct irq_work)) -- --struct printk_safe_seq_buf { -- atomic_t len; /* length of written data */ -- atomic_t message_lost; -- struct irq_work work; /* IRQ work that flushes the buffer */ -- unsigned char buffer[SAFE_LOG_BUF_LEN]; --}; -- --static DEFINE_PER_CPU(struct printk_safe_seq_buf, safe_print_seq); - static DEFINE_PER_CPU(int, printk_context); - --static DEFINE_RAW_SPINLOCK(safe_read_lock); -- --#ifdef CONFIG_PRINTK_NMI --static DEFINE_PER_CPU(struct printk_safe_seq_buf, nmi_print_seq); --#endif -- --/* Get flushed in a more safe context. */ --static void queue_flush_work(struct printk_safe_seq_buf *s) --{ -- if (printk_percpu_data_ready()) -- irq_work_queue(&s->work); --} -- --/* -- * Add a message to per-CPU context-dependent buffer. NMI and printk-safe -- * have dedicated buffers, because otherwise printk-safe preempted by -- * NMI-printk would have overwritten the NMI messages. -- * -- * The messages are flushed from irq work (or from panic()), possibly, -- * from other CPU, concurrently with printk_safe_log_store(). Should this -- * happen, printk_safe_log_store() will notice the buffer->len mismatch -- * and repeat the write. -- */ --static __printf(2, 0) int printk_safe_log_store(struct printk_safe_seq_buf *s, -- const char *fmt, va_list args) --{ -- int add; -- size_t len; -- va_list ap; -- --again: -- len = atomic_read(&s->len); -- -- /* The trailing '\0' is not counted into len. */ -- if (len >= sizeof(s->buffer) - 1) { -- atomic_inc(&s->message_lost); -- queue_flush_work(s); -- return 0; -- } -- -- /* -- * Make sure that all old data have been read before the buffer -- * was reset. This is not needed when we just append data. -- */ -- if (!len) -- smp_rmb(); -- -- va_copy(ap, args); -- add = vscnprintf(s->buffer + len, sizeof(s->buffer) - len, fmt, ap); -- va_end(ap); -- if (!add) -- return 0; -- -- /* -- * Do it once again if the buffer has been flushed in the meantime. -- * Note that atomic_cmpxchg() is an implicit memory barrier that -- * makes sure that the data were written before updating s->len. -- */ -- if (atomic_cmpxchg(&s->len, len, len + add) != len) -- goto again; -- -- queue_flush_work(s); -- return add; --} -- --static inline void printk_safe_flush_line(const char *text, int len) --{ -- /* -- * Avoid any console drivers calls from here, because we may be -- * in NMI or printk_safe context (when in panic). The messages -- * must go only into the ring buffer at this stage. Consoles will -- * get explicitly called later when a crashdump is not generated. -- */ -- printk_deferred("%.*s", len, text); --} -- --/* printk part of the temporary buffer line by line */ --static int printk_safe_flush_buffer(const char *start, size_t len) --{ -- const char *c, *end; -- bool header; -- -- c = start; -- end = start + len; -- header = true; -- -- /* Print line by line. */ -- while (c < end) { -- if (*c == '\n') { -- printk_safe_flush_line(start, c - start + 1); -- start = ++c; -- header = true; -- continue; -- } -- -- /* Handle continuous lines or missing new line. */ -- if ((c + 1 < end) && printk_get_level(c)) { -- if (header) { -- c = printk_skip_level(c); -- continue; -- } -- -- printk_safe_flush_line(start, c - start); -- start = c++; -- header = true; -- continue; -- } -- -- header = false; -- c++; -- } -- -- /* Check if there was a partial line. Ignore pure header. */ -- if (start < end && !header) { -- static const char newline[] = KERN_CONT "\n"; -- -- printk_safe_flush_line(start, end - start); -- printk_safe_flush_line(newline, strlen(newline)); -- } -- -- return len; --} -- --static void report_message_lost(struct printk_safe_seq_buf *s) --{ -- int lost = atomic_xchg(&s->message_lost, 0); -- -- if (lost) -- printk_deferred("Lost %d message(s)!\n", lost); --} -- --/* -- * Flush data from the associated per-CPU buffer. The function -- * can be called either via IRQ work or independently. -- */ --static void __printk_safe_flush(struct irq_work *work) --{ -- struct printk_safe_seq_buf *s = -- container_of(work, struct printk_safe_seq_buf, work); -- unsigned long flags; -- size_t len; -- int i; -- -- /* -- * The lock has two functions. First, one reader has to flush all -- * available message to make the lockless synchronization with -- * writers easier. Second, we do not want to mix messages from -- * different CPUs. This is especially important when printing -- * a backtrace. -- */ -- raw_spin_lock_irqsave(&safe_read_lock, flags); -- -- i = 0; --more: -- len = atomic_read(&s->len); -- -- /* -- * This is just a paranoid check that nobody has manipulated -- * the buffer an unexpected way. If we printed something then -- * @len must only increase. Also it should never overflow the -- * buffer size. -- */ -- if ((i && i >= len) || len > sizeof(s->buffer)) { -- const char *msg = "printk_safe_flush: internal error\n"; -- -- printk_safe_flush_line(msg, strlen(msg)); -- len = 0; -- } -- -- if (!len) -- goto out; /* Someone else has already flushed the buffer. */ -- -- /* Make sure that data has been written up to the @len */ -- smp_rmb(); -- i += printk_safe_flush_buffer(s->buffer + i, len - i); -- -- /* -- * Check that nothing has got added in the meantime and truncate -- * the buffer. Note that atomic_cmpxchg() is an implicit memory -- * barrier that makes sure that the data were copied before -- * updating s->len. -- */ -- if (atomic_cmpxchg(&s->len, len, 0) != len) -- goto more; -- --out: -- report_message_lost(s); -- raw_spin_unlock_irqrestore(&safe_read_lock, flags); --} -- --/** -- * printk_safe_flush - flush all per-cpu nmi buffers. -- * -- * The buffers are flushed automatically via IRQ work. This function -- * is useful only when someone wants to be sure that all buffers have -- * been flushed at some point. -- */ --void printk_safe_flush(void) --{ -- int cpu; -- -- for_each_possible_cpu(cpu) { - #ifdef CONFIG_PRINTK_NMI -- __printk_safe_flush(&per_cpu(nmi_print_seq, cpu).work); --#endif -- __printk_safe_flush(&per_cpu(safe_print_seq, cpu).work); -- } --} -- --/** -- * printk_safe_flush_on_panic - flush all per-cpu nmi buffers when the system -- * goes down. -- * -- * Similar to printk_safe_flush() but it can be called even in NMI context when -- * the system goes down. It does the best effort to get NMI messages into -- * the main ring buffer. -- * -- * Note that it could try harder when there is only one CPU online. -- */ --void printk_safe_flush_on_panic(void) --{ -- if (raw_spin_is_locked(&safe_read_lock)) { -- if (num_online_cpus() > 1) -- return; -- -- debug_locks_off(); -- raw_spin_lock_init(&safe_read_lock); -- } -- -- printk_safe_flush(); --} -- --#ifdef CONFIG_PRINTK_NMI --/* -- * Safe printk() for NMI context. It uses a per-CPU buffer to -- * store the message. NMIs are not nested, so there is always only -- * one writer running. But the buffer might get flushed from another -- * CPU, so we need to be careful. -- */ --static __printf(1, 0) int vprintk_nmi(const char *fmt, va_list args) --{ -- struct printk_safe_seq_buf *s = this_cpu_ptr(&nmi_print_seq); -- -- return printk_safe_log_store(s, fmt, args); --} -- - void noinstr printk_nmi_enter(void) - { - this_cpu_add(printk_context, PRINTK_NMI_CONTEXT_OFFSET); -@@ -305,9 +32,6 @@ void noinstr printk_nmi_exit(void) - * Marks a code that might produce many messages in NMI context - * and the risk of losing them is more critical than eventual - * reordering. -- * -- * It has effect only when called in NMI context. Then printk() -- * will store the messages into the main logbuf directly. - */ - void printk_nmi_direct_enter(void) - { -@@ -320,27 +44,8 @@ void printk_nmi_direct_exit(void) - this_cpu_and(printk_context, ~PRINTK_NMI_DIRECT_CONTEXT_MASK); - } - --#else -- --static __printf(1, 0) int vprintk_nmi(const char *fmt, va_list args) --{ -- return 0; --} -- - #endif /* CONFIG_PRINTK_NMI */ - --/* -- * Lock-less printk(), to avoid deadlocks should the printk() recurse -- * into itself. It uses a per-CPU buffer to store the message, just like -- * NMI. -- */ --static __printf(1, 0) int vprintk_safe(const char *fmt, va_list args) --{ -- struct printk_safe_seq_buf *s = this_cpu_ptr(&safe_print_seq); -- -- return printk_safe_log_store(s, fmt, args); --} -- - /* Can be preempted by NMI. */ - void __printk_safe_enter(void) - { -@@ -365,8 +70,10 @@ void __printk_safe_exit(void) - * Use the main logbuf even in NMI. But avoid calling console - * drivers that might have their own locks. - */ -- if ((this_cpu_read(printk_context) & PRINTK_NMI_DIRECT_CONTEXT_MASK)) { -- unsigned long flags; -+ if (this_cpu_read(printk_context) & -+ (PRINTK_NMI_DIRECT_CONTEXT_MASK | -+ PRINTK_NMI_CONTEXT_MASK | -+ PRINTK_SAFE_CONTEXT_MASK)) { - int len; - - printk_safe_enter_irqsave(flags); -@@ -376,34 +83,6 @@ void __printk_safe_exit(void) - return len; - } - -- /* Use extra buffer in NMI. */ -- if (this_cpu_read(printk_context) & PRINTK_NMI_CONTEXT_MASK) -- return vprintk_nmi(fmt, args); -- -- /* Use extra buffer to prevent a recursion deadlock in safe mode. */ -- if (this_cpu_read(printk_context) & PRINTK_SAFE_CONTEXT_MASK) -- return vprintk_safe(fmt, args); -- - /* No obstacles. */ - return vprintk_default(fmt, args); - } -- --void __init printk_safe_init(void) --{ -- int cpu; -- -- for_each_possible_cpu(cpu) { -- struct printk_safe_seq_buf *s; -- -- s = &per_cpu(safe_print_seq, cpu); -- init_irq_work(&s->work, __printk_safe_flush); -- --#ifdef CONFIG_PRINTK_NMI -- s = &per_cpu(nmi_print_seq, cpu); -- init_irq_work(&s->work, __printk_safe_flush); --#endif -- } -- -- /* Flush pending messages that did not have scheduled IRQ works. */ -- printk_safe_flush(); --} ---- a/lib/nmi_backtrace.c -+++ b/lib/nmi_backtrace.c -@@ -75,12 +75,6 @@ void nmi_trigger_cpumask_backtrace(const - touch_softlockup_watchdog(); - } - -- /* -- * Force flush any remote buffers that might be stuck in IRQ context -- * and therefore could not run their irq_work. -- */ -- printk_safe_flush(); -- - clear_bit_unlock(0, &backtrace_flag); - put_cpu(); - } diff --git a/kernel/patches-5.11.x-rt/0037-0018-printk-convert-syslog_lock-to-spin_lock.patch b/kernel/patches-5.11.x-rt/0037-0018-printk-convert-syslog_lock-to-spin_lock.patch deleted file mode 100644 index 08bd6ea1f8..0000000000 --- a/kernel/patches-5.11.x-rt/0037-0018-printk-convert-syslog_lock-to-spin_lock.patch +++ /dev/null @@ -1,112 +0,0 @@ -From: John Ogness -Date: Thu, 18 Feb 2021 17:37:41 +0100 -Subject: [PATCH 18/28] printk: convert @syslog_lock to spin_lock - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 30 +++++++++++++++--------------- - 1 file changed, 15 insertions(+), 15 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -356,7 +356,7 @@ enum log_flags { - }; - - /* syslog_lock protects syslog_* variables and write access to clear_seq. */ --static DEFINE_RAW_SPINLOCK(syslog_lock); -+static DEFINE_SPINLOCK(syslog_lock); - - #ifdef CONFIG_PRINTK - DECLARE_WAIT_QUEUE_HEAD(log_wait); -@@ -1479,9 +1479,9 @@ static int syslog_print(char __user *buf - size_t n; - size_t skip; - -- raw_spin_lock_irq(&syslog_lock); -+ spin_lock_irq(&syslog_lock); - if (!prb_read_valid(prb, syslog_seq, &r)) { -- raw_spin_unlock_irq(&syslog_lock); -+ spin_unlock_irq(&syslog_lock); - break; - } - if (r.info->seq != syslog_seq) { -@@ -1510,7 +1510,7 @@ static int syslog_print(char __user *buf - syslog_partial += n; - } else - n = 0; -- raw_spin_unlock_irq(&syslog_lock); -+ spin_unlock_irq(&syslog_lock); - - if (!n) - break; -@@ -1574,9 +1574,9 @@ static int syslog_print_all(char __user - } - - if (clear) { -- raw_spin_lock_irq(&syslog_lock); -+ spin_lock_irq(&syslog_lock); - latched_seq_write(&clear_seq, seq); -- raw_spin_unlock_irq(&syslog_lock); -+ spin_unlock_irq(&syslog_lock); - } - - kfree(text); -@@ -1585,9 +1585,9 @@ static int syslog_print_all(char __user - - static void syslog_clear(void) - { -- raw_spin_lock_irq(&syslog_lock); -+ spin_lock_irq(&syslog_lock); - latched_seq_write(&clear_seq, prb_next_seq(prb)); -- raw_spin_unlock_irq(&syslog_lock); -+ spin_unlock_irq(&syslog_lock); - } - - /* Return a consistent copy of @syslog_seq. */ -@@ -1595,9 +1595,9 @@ static u64 read_syslog_seq_irq(void) - { - u64 seq; - -- raw_spin_lock_irq(&syslog_lock); -+ spin_lock_irq(&syslog_lock); - seq = syslog_seq; -- raw_spin_unlock_irq(&syslog_lock); -+ spin_unlock_irq(&syslog_lock); - - return seq; - } -@@ -1675,10 +1675,10 @@ int do_syslog(int type, char __user *buf - break; - /* Number of chars in the log buffer */ - case SYSLOG_ACTION_SIZE_UNREAD: -- raw_spin_lock_irq(&syslog_lock); -+ spin_lock_irq(&syslog_lock); - if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) { - /* No unread messages. */ -- raw_spin_unlock_irq(&syslog_lock); -+ spin_unlock_irq(&syslog_lock); - return 0; - } - if (info.seq != syslog_seq) { -@@ -1706,7 +1706,7 @@ int do_syslog(int type, char __user *buf - } - error -= syslog_partial; - } -- raw_spin_unlock_irq(&syslog_lock); -+ spin_unlock_irq(&syslog_lock); - break; - /* Size of the log buffer */ - case SYSLOG_ACTION_SIZE_BUFFER: -@@ -3001,9 +3001,9 @@ void register_console(struct console *ne - exclusive_console_stop_seq = console_seq; - - /* Get a consistent copy of @syslog_seq. */ -- raw_spin_lock_irqsave(&syslog_lock, flags); -+ spin_lock_irqsave(&syslog_lock, flags); - console_seq = syslog_seq; -- raw_spin_unlock_irqrestore(&syslog_lock, flags); -+ spin_unlock_irqrestore(&syslog_lock, flags); - } - console_unlock(); - console_sysfs_notify(); diff --git a/kernel/patches-5.11.x-rt/0038-0019-console-add-write_atomic-interface.patch b/kernel/patches-5.11.x-rt/0038-0019-console-add-write_atomic-interface.patch deleted file mode 100644 index 2c772981c4..0000000000 --- a/kernel/patches-5.11.x-rt/0038-0019-console-add-write_atomic-interface.patch +++ /dev/null @@ -1,154 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:01 +0106 -Subject: [PATCH 19/28] console: add write_atomic interface - -Add a write_atomic() callback to the console. This is an optional -function for console drivers. The function must be atomic (including -NMI safe) for writing to the console. - -Console drivers must still implement the write() callback. The -write_atomic() callback will only be used in special situations, -such as when the kernel panics. - -Creating an NMI safe write_atomic() that must synchronize with -write() requires a careful implementation of the console driver. To -aid with the implementation, a set of console_atomic_*() functions -are provided: - - void console_atomic_lock(unsigned int *flags); - void console_atomic_unlock(unsigned int flags); - -These functions synchronize using a processor-reentrant spinlock -(called a cpulock). - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/console.h | 4 + - kernel/printk/printk.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 104 insertions(+) - ---- a/include/linux/console.h -+++ b/include/linux/console.h -@@ -140,6 +140,7 @@ static inline int con_debug_leave(void) - struct console { - char name[16]; - void (*write)(struct console *, const char *, unsigned); -+ void (*write_atomic)(struct console *co, const char *s, unsigned int count); - int (*read)(struct console *, char *, unsigned); - struct tty_driver *(*device)(struct console *, int *); - void (*unblank)(void); -@@ -229,4 +230,7 @@ extern void console_init(void); - void dummycon_register_output_notifier(struct notifier_block *nb); - void dummycon_unregister_output_notifier(struct notifier_block *nb); - -+extern void console_atomic_lock(unsigned int *flags); -+extern void console_atomic_unlock(unsigned int flags); -+ - #endif /* _LINUX_CONSOLE_H */ ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -3546,3 +3546,103 @@ void kmsg_dump_rewind(struct kmsg_dumper - EXPORT_SYMBOL_GPL(kmsg_dump_rewind); - - #endif -+ -+struct prb_cpulock { -+ atomic_t owner; -+ unsigned long __percpu *irqflags; -+}; -+ -+#define DECLARE_STATIC_PRINTKRB_CPULOCK(name) \ -+static DEFINE_PER_CPU(unsigned long, _##name##_percpu_irqflags); \ -+static struct prb_cpulock name = { \ -+ .owner = ATOMIC_INIT(-1), \ -+ .irqflags = &_##name##_percpu_irqflags, \ -+} -+ -+static bool __prb_trylock(struct prb_cpulock *cpu_lock, -+ unsigned int *cpu_store) -+{ -+ unsigned long *flags; -+ unsigned int cpu; -+ -+ cpu = get_cpu(); -+ -+ *cpu_store = atomic_read(&cpu_lock->owner); -+ /* memory barrier to ensure the current lock owner is visible */ -+ smp_rmb(); -+ if (*cpu_store == -1) { -+ flags = per_cpu_ptr(cpu_lock->irqflags, cpu); -+ local_irq_save(*flags); -+ if (atomic_try_cmpxchg_acquire(&cpu_lock->owner, -+ cpu_store, cpu)) { -+ return true; -+ } -+ local_irq_restore(*flags); -+ } else if (*cpu_store == cpu) { -+ return true; -+ } -+ -+ put_cpu(); -+ return false; -+} -+ -+/* -+ * prb_lock: Perform a processor-reentrant spin lock. -+ * @cpu_lock: A pointer to the lock object. -+ * @cpu_store: A "flags" pointer to store lock status information. -+ * -+ * If no processor has the lock, the calling processor takes the lock and -+ * becomes the owner. If the calling processor is already the owner of the -+ * lock, this function succeeds immediately. If lock is locked by another -+ * processor, this function spins until the calling processor becomes the -+ * owner. -+ * -+ * It is safe to call this function from any context and state. -+ */ -+static void prb_lock(struct prb_cpulock *cpu_lock, unsigned int *cpu_store) -+{ -+ for (;;) { -+ if (__prb_trylock(cpu_lock, cpu_store)) -+ break; -+ cpu_relax(); -+ } -+} -+ -+/* -+ * prb_unlock: Perform a processor-reentrant spin unlock. -+ * @cpu_lock: A pointer to the lock object. -+ * @cpu_store: A "flags" object storing lock status information. -+ * -+ * Release the lock. The calling processor must be the owner of the lock. -+ * -+ * It is safe to call this function from any context and state. -+ */ -+static void prb_unlock(struct prb_cpulock *cpu_lock, unsigned int cpu_store) -+{ -+ unsigned long *flags; -+ unsigned int cpu; -+ -+ cpu = atomic_read(&cpu_lock->owner); -+ atomic_set_release(&cpu_lock->owner, cpu_store); -+ -+ if (cpu_store == -1) { -+ flags = per_cpu_ptr(cpu_lock->irqflags, cpu); -+ local_irq_restore(*flags); -+ } -+ -+ put_cpu(); -+} -+ -+DECLARE_STATIC_PRINTKRB_CPULOCK(printk_cpulock); -+ -+void console_atomic_lock(unsigned int *flags) -+{ -+ prb_lock(&printk_cpulock, flags); -+} -+EXPORT_SYMBOL(console_atomic_lock); -+ -+void console_atomic_unlock(unsigned int flags) -+{ -+ prb_unlock(&printk_cpulock, flags); -+} -+EXPORT_SYMBOL(console_atomic_unlock); diff --git a/kernel/patches-5.11.x-rt/0039-0020-serial-8250-implement-write_atomic.patch b/kernel/patches-5.11.x-rt/0039-0020-serial-8250-implement-write_atomic.patch deleted file mode 100644 index 91750fd28a..0000000000 --- a/kernel/patches-5.11.x-rt/0039-0020-serial-8250-implement-write_atomic.patch +++ /dev/null @@ -1,481 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:02 +0106 -Subject: [PATCH 20/28] serial: 8250: implement write_atomic - -Implement a non-sleeping NMI-safe write_atomic() console function in -order to support emergency console printing. - -Since interrupts need to be disabled during transmit, all usage of -the IER register is wrapped with access functions that use the -console_atomic_lock() function to synchronize register access while -tracking the state of the interrupts. This is necessary because -write_atomic() can be called from an NMI context that has preempted -write_atomic(). - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/tty/serial/8250/8250.h | 47 ++++++++++++++++ - drivers/tty/serial/8250/8250_core.c | 17 ++++-- - drivers/tty/serial/8250/8250_fsl.c | 9 +++ - drivers/tty/serial/8250/8250_ingenic.c | 7 ++ - drivers/tty/serial/8250/8250_mtk.c | 29 +++++++++- - drivers/tty/serial/8250/8250_port.c | 92 ++++++++++++++++++++------------- - include/linux/serial_8250.h | 5 + - 7 files changed, 162 insertions(+), 44 deletions(-) - ---- a/drivers/tty/serial/8250/8250.h -+++ b/drivers/tty/serial/8250/8250.h -@@ -130,12 +130,55 @@ static inline void serial_dl_write(struc - up->dl_write(up, value); - } - -+static inline void serial8250_set_IER(struct uart_8250_port *up, -+ unsigned char ier) -+{ -+ struct uart_port *port = &up->port; -+ unsigned int flags; -+ bool is_console; -+ -+ is_console = uart_console(port); -+ -+ if (is_console) -+ console_atomic_lock(&flags); -+ -+ serial_out(up, UART_IER, ier); -+ -+ if (is_console) -+ console_atomic_unlock(flags); -+} -+ -+static inline unsigned char serial8250_clear_IER(struct uart_8250_port *up) -+{ -+ struct uart_port *port = &up->port; -+ unsigned int clearval = 0; -+ unsigned int prior; -+ unsigned int flags; -+ bool is_console; -+ -+ is_console = uart_console(port); -+ -+ if (up->capabilities & UART_CAP_UUE) -+ clearval = UART_IER_UUE; -+ -+ if (is_console) -+ console_atomic_lock(&flags); -+ -+ prior = serial_port_in(port, UART_IER); -+ serial_port_out(port, UART_IER, clearval); -+ -+ if (is_console) -+ console_atomic_unlock(flags); -+ -+ return prior; -+} -+ - static inline bool serial8250_set_THRI(struct uart_8250_port *up) - { - if (up->ier & UART_IER_THRI) - return false; - up->ier |= UART_IER_THRI; -- serial_out(up, UART_IER, up->ier); -+ serial8250_set_IER(up, up->ier); - return true; - } - -@@ -144,7 +187,7 @@ static inline bool serial8250_clear_THRI - if (!(up->ier & UART_IER_THRI)) - return false; - up->ier &= ~UART_IER_THRI; -- serial_out(up, UART_IER, up->ier); -+ serial8250_set_IER(up, up->ier); - return true; - } - ---- a/drivers/tty/serial/8250/8250_core.c -+++ b/drivers/tty/serial/8250/8250_core.c -@@ -274,10 +274,8 @@ static void serial8250_backup_timeout(st - * Must disable interrupts or else we risk racing with the interrupt - * based handler. - */ -- if (up->port.irq) { -- ier = serial_in(up, UART_IER); -- serial_out(up, UART_IER, 0); -- } -+ if (up->port.irq) -+ ier = serial8250_clear_IER(up); - - iir = serial_in(up, UART_IIR); - -@@ -300,7 +298,7 @@ static void serial8250_backup_timeout(st - serial8250_tx_chars(up); - - if (up->port.irq) -- serial_out(up, UART_IER, ier); -+ serial8250_set_IER(up, ier); - - spin_unlock_irqrestore(&up->port.lock, flags); - -@@ -578,6 +576,14 @@ serial8250_register_ports(struct uart_dr - - #ifdef CONFIG_SERIAL_8250_CONSOLE - -+static void univ8250_console_write_atomic(struct console *co, const char *s, -+ unsigned int count) -+{ -+ struct uart_8250_port *up = &serial8250_ports[co->index]; -+ -+ serial8250_console_write_atomic(up, s, count); -+} -+ - static void univ8250_console_write(struct console *co, const char *s, - unsigned int count) - { -@@ -671,6 +677,7 @@ static int univ8250_console_match(struct - - static struct console univ8250_console = { - .name = "ttyS", -+ .write_atomic = univ8250_console_write_atomic, - .write = univ8250_console_write, - .device = uart_console_device, - .setup = univ8250_console_setup, ---- a/drivers/tty/serial/8250/8250_fsl.c -+++ b/drivers/tty/serial/8250/8250_fsl.c -@@ -60,9 +60,18 @@ int fsl8250_handle_irq(struct uart_port - - /* Stop processing interrupts on input overrun */ - if ((orig_lsr & UART_LSR_OE) && (up->overrun_backoff_time_ms > 0)) { -+ unsigned int ca_flags; - unsigned long delay; -+ bool is_console; - -+ is_console = uart_console(port); -+ -+ if (is_console) -+ console_atomic_lock(&ca_flags); - up->ier = port->serial_in(port, UART_IER); -+ if (is_console) -+ console_atomic_unlock(ca_flags); -+ - if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) { - port->ops->stop_rx(port); - } else { ---- a/drivers/tty/serial/8250/8250_ingenic.c -+++ b/drivers/tty/serial/8250/8250_ingenic.c -@@ -146,6 +146,8 @@ OF_EARLYCON_DECLARE(x1000_uart, "ingenic - - static void ingenic_uart_serial_out(struct uart_port *p, int offset, int value) - { -+ unsigned int flags; -+ bool is_console; - int ier; - - switch (offset) { -@@ -167,7 +169,12 @@ static void ingenic_uart_serial_out(stru - * If we have enabled modem status IRQs we should enable - * modem mode. - */ -+ is_console = uart_console(p); -+ if (is_console) -+ console_atomic_lock(&flags); - ier = p->serial_in(p, UART_IER); -+ if (is_console) -+ console_atomic_unlock(flags); - - if (ier & UART_IER_MSI) - value |= UART_MCR_MDCE | UART_MCR_FCM; ---- a/drivers/tty/serial/8250/8250_mtk.c -+++ b/drivers/tty/serial/8250/8250_mtk.c -@@ -213,12 +213,37 @@ static void mtk8250_shutdown(struct uart - - static void mtk8250_disable_intrs(struct uart_8250_port *up, int mask) - { -- serial_out(up, UART_IER, serial_in(up, UART_IER) & (~mask)); -+ struct uart_port *port = &up->port; -+ unsigned int flags; -+ unsigned int ier; -+ bool is_console; -+ -+ is_console = uart_console(port); -+ -+ if (is_console) -+ console_atomic_lock(&flags); -+ -+ ier = serial_in(up, UART_IER); -+ serial_out(up, UART_IER, ier & (~mask)); -+ -+ if (is_console) -+ console_atomic_unlock(flags); - } - - static void mtk8250_enable_intrs(struct uart_8250_port *up, int mask) - { -- serial_out(up, UART_IER, serial_in(up, UART_IER) | mask); -+ struct uart_port *port = &up->port; -+ unsigned int flags; -+ unsigned int ier; -+ -+ if (uart_console(port)) -+ console_atomic_lock(&flags); -+ -+ ier = serial_in(up, UART_IER); -+ serial_out(up, UART_IER, ier | mask); -+ -+ if (uart_console(port)) -+ console_atomic_unlock(flags); - } - - static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode) ---- a/drivers/tty/serial/8250/8250_port.c -+++ b/drivers/tty/serial/8250/8250_port.c -@@ -757,7 +757,7 @@ static void serial8250_set_sleep(struct - serial_out(p, UART_EFR, UART_EFR_ECB); - serial_out(p, UART_LCR, 0); - } -- serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); -+ serial8250_set_IER(p, sleep ? UART_IERX_SLEEP : 0); - if (p->capabilities & UART_CAP_EFR) { - serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); - serial_out(p, UART_EFR, efr); -@@ -1429,7 +1429,7 @@ static void serial8250_stop_rx(struct ua - - up->ier &= ~(UART_IER_RLSI | UART_IER_RDI); - up->port.read_status_mask &= ~UART_LSR_DR; -- serial_port_out(port, UART_IER, up->ier); -+ serial8250_set_IER(up, up->ier); - - serial8250_rpm_put(up); - } -@@ -1459,7 +1459,7 @@ void serial8250_em485_stop_tx(struct uar - serial8250_clear_and_reinit_fifos(p); - - p->ier |= UART_IER_RLSI | UART_IER_RDI; -- serial_port_out(&p->port, UART_IER, p->ier); -+ serial8250_set_IER(p, p->ier); - } - } - EXPORT_SYMBOL_GPL(serial8250_em485_stop_tx); -@@ -1687,7 +1687,7 @@ static void serial8250_disable_ms(struct - mctrl_gpio_disable_ms(up->gpios); - - up->ier &= ~UART_IER_MSI; -- serial_port_out(port, UART_IER, up->ier); -+ serial8250_set_IER(up, up->ier); - } - - static void serial8250_enable_ms(struct uart_port *port) -@@ -1703,7 +1703,7 @@ static void serial8250_enable_ms(struct - up->ier |= UART_IER_MSI; - - serial8250_rpm_get(up); -- serial_port_out(port, UART_IER, up->ier); -+ serial8250_set_IER(up, up->ier); - serial8250_rpm_put(up); - } - -@@ -2118,14 +2118,7 @@ static void serial8250_put_poll_char(str - struct uart_8250_port *up = up_to_u8250p(port); - - serial8250_rpm_get(up); -- /* -- * First save the IER then disable the interrupts -- */ -- ier = serial_port_in(port, UART_IER); -- if (up->capabilities & UART_CAP_UUE) -- serial_port_out(port, UART_IER, UART_IER_UUE); -- else -- serial_port_out(port, UART_IER, 0); -+ ier = serial8250_clear_IER(up); - - wait_for_xmitr(up, BOTH_EMPTY); - /* -@@ -2138,7 +2131,7 @@ static void serial8250_put_poll_char(str - * and restore the IER - */ - wait_for_xmitr(up, BOTH_EMPTY); -- serial_port_out(port, UART_IER, ier); -+ serial8250_set_IER(up, ier); - serial8250_rpm_put(up); - } - -@@ -2441,7 +2434,7 @@ void serial8250_do_shutdown(struct uart_ - */ - spin_lock_irqsave(&port->lock, flags); - up->ier = 0; -- serial_port_out(port, UART_IER, 0); -+ serial8250_set_IER(up, 0); - spin_unlock_irqrestore(&port->lock, flags); - - synchronize_irq(port->irq); -@@ -2771,7 +2764,7 @@ serial8250_do_set_termios(struct uart_po - if (up->capabilities & UART_CAP_RTOIE) - up->ier |= UART_IER_RTOIE; - -- serial_port_out(port, UART_IER, up->ier); -+ serial8250_set_IER(up, up->ier); - - if (up->capabilities & UART_CAP_EFR) { - unsigned char efr = 0; -@@ -3237,7 +3230,7 @@ EXPORT_SYMBOL_GPL(serial8250_set_default - - #ifdef CONFIG_SERIAL_8250_CONSOLE - --static void serial8250_console_putchar(struct uart_port *port, int ch) -+static void serial8250_console_putchar_locked(struct uart_port *port, int ch) - { - struct uart_8250_port *up = up_to_u8250p(port); - -@@ -3245,6 +3238,18 @@ static void serial8250_console_putchar(s - serial_port_out(port, UART_TX, ch); - } - -+static void serial8250_console_putchar(struct uart_port *port, int ch) -+{ -+ struct uart_8250_port *up = up_to_u8250p(port); -+ unsigned int flags; -+ -+ wait_for_xmitr(up, UART_LSR_THRE); -+ -+ console_atomic_lock(&flags); -+ serial8250_console_putchar_locked(port, ch); -+ console_atomic_unlock(flags); -+} -+ - /* - * Restore serial console when h/w power-off detected - */ -@@ -3266,6 +3271,32 @@ static void serial8250_console_restore(s - serial8250_out_MCR(up, UART_MCR_DTR | UART_MCR_RTS); - } - -+void serial8250_console_write_atomic(struct uart_8250_port *up, -+ const char *s, unsigned int count) -+{ -+ struct uart_port *port = &up->port; -+ unsigned int flags; -+ unsigned int ier; -+ -+ console_atomic_lock(&flags); -+ -+ touch_nmi_watchdog(); -+ -+ ier = serial8250_clear_IER(up); -+ -+ if (atomic_fetch_inc(&up->console_printing)) { -+ uart_console_write(port, "\n", 1, -+ serial8250_console_putchar_locked); -+ } -+ uart_console_write(port, s, count, serial8250_console_putchar_locked); -+ atomic_dec(&up->console_printing); -+ -+ wait_for_xmitr(up, BOTH_EMPTY); -+ serial8250_set_IER(up, ier); -+ -+ console_atomic_unlock(flags); -+} -+ - /* - * Print a string to the serial port trying not to disturb - * any possible real use of the port... -@@ -3282,24 +3313,12 @@ void serial8250_console_write(struct uar - struct uart_port *port = &up->port; - unsigned long flags; - unsigned int ier; -- int locked = 1; - - touch_nmi_watchdog(); - -- if (oops_in_progress) -- locked = spin_trylock_irqsave(&port->lock, flags); -- else -- spin_lock_irqsave(&port->lock, flags); -- -- /* -- * First save the IER then disable the interrupts -- */ -- ier = serial_port_in(port, UART_IER); -+ spin_lock_irqsave(&port->lock, flags); - -- if (up->capabilities & UART_CAP_UUE) -- serial_port_out(port, UART_IER, UART_IER_UUE); -- else -- serial_port_out(port, UART_IER, 0); -+ ier = serial8250_clear_IER(up); - - /* check scratch reg to see if port powered off during system sleep */ - if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) { -@@ -3313,7 +3332,9 @@ void serial8250_console_write(struct uar - mdelay(port->rs485.delay_rts_before_send); - } - -+ atomic_inc(&up->console_printing); - uart_console_write(port, s, count, serial8250_console_putchar); -+ atomic_dec(&up->console_printing); - - /* - * Finally, wait for transmitter to become empty -@@ -3326,8 +3347,7 @@ void serial8250_console_write(struct uar - if (em485->tx_stopped) - up->rs485_stop_tx(up); - } -- -- serial_port_out(port, UART_IER, ier); -+ serial8250_set_IER(up, ier); - - /* - * The receive handling will happen properly because the -@@ -3339,8 +3359,7 @@ void serial8250_console_write(struct uar - if (up->msr_saved_flags) - serial8250_modem_status(up); - -- if (locked) -- spin_unlock_irqrestore(&port->lock, flags); -+ spin_unlock_irqrestore(&port->lock, flags); - } - - static unsigned int probe_baud(struct uart_port *port) -@@ -3360,6 +3379,7 @@ static unsigned int probe_baud(struct ua - - int serial8250_console_setup(struct uart_port *port, char *options, bool probe) - { -+ struct uart_8250_port *up = up_to_u8250p(port); - int baud = 9600; - int bits = 8; - int parity = 'n'; -@@ -3369,6 +3389,8 @@ int serial8250_console_setup(struct uart - if (!port->iobase && !port->membase) - return -ENODEV; - -+ atomic_set(&up->console_printing, 0); -+ - if (options) - uart_parse_options(options, &baud, &parity, &bits, &flow); - else if (probe) ---- a/include/linux/serial_8250.h -+++ b/include/linux/serial_8250.h -@@ -7,6 +7,7 @@ - #ifndef _LINUX_SERIAL_8250_H - #define _LINUX_SERIAL_8250_H - -+#include - #include - #include - #include -@@ -125,6 +126,8 @@ struct uart_8250_port { - #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA - unsigned char msr_saved_flags; - -+ atomic_t console_printing; -+ - struct uart_8250_dma *dma; - const struct uart_8250_ops *ops; - -@@ -180,6 +183,8 @@ void serial8250_init_port(struct uart_82 - void serial8250_set_defaults(struct uart_8250_port *up); - void serial8250_console_write(struct uart_8250_port *up, const char *s, - unsigned int count); -+void serial8250_console_write_atomic(struct uart_8250_port *up, const char *s, -+ unsigned int count); - int serial8250_console_setup(struct uart_port *port, char *options, bool probe); - int serial8250_console_exit(struct uart_port *port); - diff --git a/kernel/patches-5.11.x-rt/0040-0021-printk-relocate-printk_delay-and-vprintk_default.patch b/kernel/patches-5.11.x-rt/0040-0021-printk-relocate-printk_delay-and-vprintk_default.patch deleted file mode 100644 index b7818b0f91..0000000000 --- a/kernel/patches-5.11.x-rt/0040-0021-printk-relocate-printk_delay-and-vprintk_default.patch +++ /dev/null @@ -1,82 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:03 +0106 -Subject: [PATCH 21/28] printk: relocate printk_delay() and vprintk_default() - -Move printk_delay() and vprintk_default() "as is" further up so that -they can be used by new functions in an upcoming commit. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 40 ++++++++++++++++++++-------------------- - 1 file changed, 20 insertions(+), 20 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1725,6 +1725,20 @@ SYSCALL_DEFINE3(syslog, int, type, char - return do_syslog(type, buf, len, SYSLOG_FROM_READER); - } - -+int printk_delay_msec __read_mostly; -+ -+static inline void printk_delay(void) -+{ -+ if (unlikely(printk_delay_msec)) { -+ int m = printk_delay_msec; -+ -+ while (m--) { -+ mdelay(1); -+ touch_nmi_watchdog(); -+ } -+ } -+} -+ - /* - * Special console_lock variants that help to reduce the risk of soft-lockups. - * They allow to pass console_lock to another printk() call using a busy wait. -@@ -1968,20 +1982,6 @@ static void printk_exit_irqrestore(unsig - local_irq_restore(flags); - } - --int printk_delay_msec __read_mostly; -- --static inline void printk_delay(void) --{ -- if (unlikely(printk_delay_msec)) { -- int m = printk_delay_msec; -- -- while (m--) { -- mdelay(1); -- touch_nmi_watchdog(); -- } -- } --} -- - static inline u32 printk_caller_id(void) - { - return in_task() ? task_pid_nr(current) : -@@ -2214,18 +2214,18 @@ asmlinkage int vprintk_emit(int facility - } - EXPORT_SYMBOL(vprintk_emit); - --asmlinkage int vprintk(const char *fmt, va_list args) --{ -- return vprintk_func(fmt, args); --} --EXPORT_SYMBOL(vprintk); -- - int vprintk_default(const char *fmt, va_list args) - { - return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, fmt, args); - } - EXPORT_SYMBOL_GPL(vprintk_default); - -+asmlinkage int vprintk(const char *fmt, va_list args) -+{ -+ return vprintk_func(fmt, args); -+} -+EXPORT_SYMBOL(vprintk); -+ - /** - * printk - print a kernel message - * @fmt: format string diff --git a/kernel/patches-5.11.x-rt/0041-0022-printk-combine-boot_delay_msec-into-printk_delay.patch b/kernel/patches-5.11.x-rt/0041-0022-printk-combine-boot_delay_msec-into-printk_delay.patch deleted file mode 100644 index ae89bd2288..0000000000 --- a/kernel/patches-5.11.x-rt/0041-0022-printk-combine-boot_delay_msec-into-printk_delay.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:04 +0106 -Subject: [PATCH 22/28] printk: combine boot_delay_msec() into printk_delay() - -boot_delay_msec() is always called immediately before printk_delay() -so just combine the two. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1727,8 +1727,10 @@ SYSCALL_DEFINE3(syslog, int, type, char - - int printk_delay_msec __read_mostly; - --static inline void printk_delay(void) -+static inline void printk_delay(int level) - { -+ boot_delay_msec(level); -+ - if (unlikely(printk_delay_msec)) { - int m = printk_delay_msec; - -@@ -2186,8 +2188,7 @@ asmlinkage int vprintk_emit(int facility - in_sched = true; - } - -- boot_delay_msec(level); -- printk_delay(); -+ printk_delay(level); - - printed_len = vprintk_store(facility, level, dev_info, fmt, args); - diff --git a/kernel/patches-5.11.x-rt/0042-0023-printk-change-console_seq-to-atomic64_t.patch b/kernel/patches-5.11.x-rt/0042-0023-printk-change-console_seq-to-atomic64_t.patch deleted file mode 100644 index 1e99c3a73d..0000000000 --- a/kernel/patches-5.11.x-rt/0042-0023-printk-change-console_seq-to-atomic64_t.patch +++ /dev/null @@ -1,125 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:05 +0106 -Subject: [PATCH 23/28] printk: change @console_seq to atomic64_t - -In preparation for atomic printing, change @console_seq to atomic -so that it can be accessed without requiring @console_sem. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 34 +++++++++++++++++++--------------- - 1 file changed, 19 insertions(+), 15 deletions(-) - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -366,12 +366,13 @@ static u64 syslog_seq; - static size_t syslog_partial; - static bool syslog_time; - --/* All 3 protected by @console_sem. */ --/* the next printk record to write to the console */ --static u64 console_seq; -+/* Both protected by @console_sem. */ - static u64 exclusive_console_stop_seq; - static unsigned long console_dropped; - -+/* the next printk record to write to the console */ -+static atomic64_t console_seq = ATOMIC64_INIT(0); -+ - struct latched_seq { - seqcount_latch_t latch; - u64 val[2]; -@@ -2270,7 +2271,7 @@ EXPORT_SYMBOL(printk); - #define prb_first_valid_seq(rb) 0 - - static u64 syslog_seq; --static u64 console_seq; -+static atomic64_t console_seq = ATOMIC64_INIT(0); - static u64 exclusive_console_stop_seq; - static unsigned long console_dropped; - -@@ -2585,6 +2586,7 @@ void console_unlock(void) - bool do_cond_resched, retry; - struct printk_info info; - struct printk_record r; -+ u64 seq; - - if (console_suspended) { - up_console_sem(); -@@ -2627,12 +2629,14 @@ void console_unlock(void) - size_t len; - - skip: -- if (!prb_read_valid(prb, console_seq, &r)) -+ seq = atomic64_read(&console_seq); -+ if (!prb_read_valid(prb, seq, &r)) - break; - -- if (console_seq != r.info->seq) { -- console_dropped += r.info->seq - console_seq; -- console_seq = r.info->seq; -+ if (seq != r.info->seq) { -+ console_dropped += r.info->seq - seq; -+ atomic64_set(&console_seq, r.info->seq); -+ seq = r.info->seq; - } - - if (suppress_message_printing(r.info->level)) { -@@ -2641,13 +2645,13 @@ void console_unlock(void) - * directly to the console when we received it, and - * record that has level above the console loglevel. - */ -- console_seq++; -+ atomic64_set(&console_seq, seq + 1); - goto skip; - } - - /* Output to all consoles once old messages replayed. */ - if (unlikely(exclusive_console && -- console_seq >= exclusive_console_stop_seq)) { -+ seq >= exclusive_console_stop_seq)) { - exclusive_console = NULL; - } - -@@ -2668,7 +2672,7 @@ void console_unlock(void) - len = record_print_text(&r, - console_msg_format & MSG_FORMAT_SYSLOG, - printk_time); -- console_seq++; -+ atomic64_set(&console_seq, seq + 1); - - /* - * While actively printing out messages, if another printk() -@@ -2699,7 +2703,7 @@ void console_unlock(void) - * there's a new owner and the console_unlock() from them will do the - * flush, no worries. - */ -- retry = prb_read_valid(prb, console_seq, NULL); -+ retry = prb_read_valid(prb, atomic64_read(&console_seq), NULL); - if (retry && console_trylock()) - goto again; - } -@@ -2762,7 +2766,7 @@ void console_flush_on_panic(enum con_flu - console_may_schedule = 0; - - if (mode == CONSOLE_REPLAY_ALL) -- console_seq = prb_first_valid_seq(prb); -+ atomic64_set(&console_seq, prb_first_valid_seq(prb)); - console_unlock(); - } - -@@ -2999,11 +3003,11 @@ void register_console(struct console *ne - * ignores console_lock. - */ - exclusive_console = newcon; -- exclusive_console_stop_seq = console_seq; -+ exclusive_console_stop_seq = atomic64_read(&console_seq); - - /* Get a consistent copy of @syslog_seq. */ - spin_lock_irqsave(&syslog_lock, flags); -- console_seq = syslog_seq; -+ atomic64_set(&console_seq, syslog_seq); - spin_unlock_irqrestore(&syslog_lock, flags); - } - console_unlock(); diff --git a/kernel/patches-5.11.x-rt/0043-0024-printk-introduce-kernel-sync-mode.patch b/kernel/patches-5.11.x-rt/0043-0024-printk-introduce-kernel-sync-mode.patch deleted file mode 100644 index 6adbd65db7..0000000000 --- a/kernel/patches-5.11.x-rt/0043-0024-printk-introduce-kernel-sync-mode.patch +++ /dev/null @@ -1,298 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:06 +0106 -Subject: [PATCH 24/28] printk: introduce kernel sync mode - -When the kernel performs an OOPS, enter into "sync mode": - -- only atomic consoles (write_atomic() callback) will print -- printing occurs within vprintk_store() instead of console_unlock() - -CONSOLE_LOG_MAX is moved to printk.h to support the per-console -buffer used in sync mode. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/console.h | 4 + - include/linux/printk.h | 6 ++ - kernel/printk/printk.c | 133 +++++++++++++++++++++++++++++++++++++++++++++--- - 3 files changed, 137 insertions(+), 6 deletions(-) - ---- a/include/linux/console.h -+++ b/include/linux/console.h -@@ -16,6 +16,7 @@ - - #include - #include -+#include - - struct vc_data; - struct console_font_op; -@@ -150,6 +151,9 @@ struct console { - short flags; - short index; - int cflag; -+#ifdef CONFIG_PRINTK -+ char sync_buf[CONSOLE_LOG_MAX]; -+#endif - void *data; - struct console *next; - }; ---- a/include/linux/printk.h -+++ b/include/linux/printk.h -@@ -46,6 +46,12 @@ static inline const char *printk_skip_he - - #define CONSOLE_EXT_LOG_MAX 8192 - -+/* -+ * The maximum size of a record formatted for console printing -+ * (i.e. with the prefix prepended to every line). -+ */ -+#define CONSOLE_LOG_MAX 4096 -+ - /* printk's without a loglevel use this.. */ - #define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT - ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -44,6 +44,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -359,6 +360,9 @@ enum log_flags { - static DEFINE_SPINLOCK(syslog_lock); - - #ifdef CONFIG_PRINTK -+/* Set to enable sync mode. Once set, it is never cleared. */ -+static bool sync_mode; -+ - DECLARE_WAIT_QUEUE_HEAD(log_wait); - /* All 3 protected by @syslog_lock. */ - /* the next printk record to read by syslog(READ) or /proc/kmsg */ -@@ -398,9 +402,6 @@ static struct latched_seq clear_seq = { - /* the maximum size allowed to be reserved for a record */ - #define LOG_LINE_MAX (1024 - PREFIX_MAX) - --/* the maximum size of a formatted record (i.e. with prefix added per line) */ --#define CONSOLE_LOG_MAX 4096 -- - #define LOG_LEVEL(v) ((v) & 0x07) - #define LOG_FACILITY(v) ((v) >> 3 & 0xff) - -@@ -1742,6 +1743,91 @@ static inline void printk_delay(int leve - } - } - -+static bool kernel_sync_mode(void) -+{ -+ return (oops_in_progress || sync_mode); -+} -+ -+static bool console_can_sync(struct console *con) -+{ -+ if (!(con->flags & CON_ENABLED)) -+ return false; -+ if (con->write_atomic && kernel_sync_mode()) -+ return true; -+ return false; -+} -+ -+static bool call_sync_console_driver(struct console *con, const char *text, size_t text_len) -+{ -+ if (!(con->flags & CON_ENABLED)) -+ return false; -+ if (con->write_atomic && kernel_sync_mode()) -+ con->write_atomic(con, text, text_len); -+ else -+ return false; -+ -+ return true; -+} -+ -+static bool have_atomic_console(void) -+{ -+ struct console *con; -+ -+ for_each_console(con) { -+ if (!(con->flags & CON_ENABLED)) -+ continue; -+ if (con->write_atomic) -+ return true; -+ } -+ return false; -+} -+ -+static bool print_sync(struct console *con, u64 *seq) -+{ -+ struct printk_info info; -+ struct printk_record r; -+ size_t text_len; -+ -+ prb_rec_init_rd(&r, &info, &con->sync_buf[0], sizeof(con->sync_buf)); -+ -+ if (!prb_read_valid(prb, *seq, &r)) -+ return false; -+ -+ text_len = record_print_text(&r, console_msg_format & MSG_FORMAT_SYSLOG, printk_time); -+ -+ if (!call_sync_console_driver(con, &con->sync_buf[0], text_len)) -+ return false; -+ -+ *seq = r.info->seq; -+ -+ touch_softlockup_watchdog_sync(); -+ clocksource_touch_watchdog(); -+ rcu_cpu_stall_reset(); -+ touch_nmi_watchdog(); -+ -+ if (text_len) -+ printk_delay(r.info->level); -+ -+ return true; -+} -+ -+static void print_sync_until(struct console *con, u64 seq) -+{ -+ unsigned int flags; -+ u64 printk_seq; -+ -+ console_atomic_lock(&flags); -+ for (;;) { -+ printk_seq = atomic64_read(&console_seq); -+ if (printk_seq >= seq) -+ break; -+ if (!print_sync(con, &printk_seq)) -+ break; -+ atomic64_set(&console_seq, printk_seq + 1); -+ } -+ console_atomic_unlock(flags); -+} -+ - /* - * Special console_lock variants that help to reduce the risk of soft-lockups. - * They allow to pass console_lock to another printk() call using a busy wait. -@@ -1916,6 +2002,8 @@ static void call_console_drivers(const c - if (!cpu_online(smp_processor_id()) && - !(con->flags & CON_ANYTIME)) - continue; -+ if (kernel_sync_mode()) -+ continue; - if (con->flags & CON_EXTENDED) - con->write(con, ext_text, ext_len); - else { -@@ -2070,6 +2158,7 @@ int vprintk_store(int facility, int leve - const u32 caller_id = printk_caller_id(); - struct prb_reserved_entry e; - enum log_flags lflags = 0; -+ bool final_commit = false; - struct printk_record r; - unsigned long irqflags; - u16 trunc_msg_len = 0; -@@ -2079,6 +2168,7 @@ int vprintk_store(int facility, int leve - u16 text_len; - int ret = 0; - u64 ts_nsec; -+ u64 seq; - - /* - * Since the duration of printk() can vary depending on the message -@@ -2117,6 +2207,7 @@ int vprintk_store(int facility, int leve - if (lflags & LOG_CONT) { - prb_rec_init_wr(&r, reserve_size); - if (prb_reserve_in_last(&e, prb, &r, caller_id, LOG_LINE_MAX)) { -+ seq = r.info->seq; - text_len = printk_sprint(&r.text_buf[r.info->text_len], reserve_size, - facility, &lflags, fmt, args); - r.info->text_len += text_len; -@@ -2124,6 +2215,7 @@ int vprintk_store(int facility, int leve - if (lflags & LOG_NEWLINE) { - r.info->flags |= LOG_NEWLINE; - prb_final_commit(&e); -+ final_commit = true; - } else { - prb_commit(&e); - } -@@ -2148,6 +2240,8 @@ int vprintk_store(int facility, int leve - goto out; - } - -+ seq = r.info->seq; -+ - /* fill message */ - text_len = printk_sprint(&r.text_buf[0], reserve_size, facility, &lflags, fmt, args); - if (trunc_msg_len) -@@ -2162,13 +2256,25 @@ int vprintk_store(int facility, int leve - memcpy(&r.info->dev_info, dev_info, sizeof(r.info->dev_info)); - - /* A message without a trailing newline can be continued. */ -- if (!(lflags & LOG_NEWLINE)) -+ if (!(lflags & LOG_NEWLINE)) { - prb_commit(&e); -- else -+ } else { - prb_final_commit(&e); -+ final_commit = true; -+ } - - ret = text_len + trunc_msg_len; - out: -+ /* only the kernel may perform synchronous printing */ -+ if (facility == 0 && final_commit) { -+ struct console *con; -+ -+ for_each_console(con) { -+ if (console_can_sync(con)) -+ print_sync_until(con, seq + 1); -+ } -+ } -+ - printk_exit_irqrestore(irqflags); - return ret; - } -@@ -2264,12 +2370,13 @@ EXPORT_SYMBOL(printk); - - #else /* CONFIG_PRINTK */ - --#define CONSOLE_LOG_MAX 0 - #define printk_time false - - #define prb_read_valid(rb, seq, r) false - #define prb_first_valid_seq(rb) 0 - -+#define kernel_sync_mode() false -+ - static u64 syslog_seq; - static atomic64_t console_seq = ATOMIC64_INIT(0); - static u64 exclusive_console_stop_seq; -@@ -2562,6 +2669,8 @@ static int have_callable_console(void) - */ - static inline int can_use_console(void) - { -+ if (kernel_sync_mode()) -+ return false; - return cpu_online(raw_smp_processor_id()) || have_callable_console(); - } - -@@ -3374,6 +3483,18 @@ void kmsg_dump(enum kmsg_dump_reason rea - struct kmsg_dumper_iter iter; - struct kmsg_dumper *dumper; - -+ if (!oops_in_progress) { -+ /* -+ * If atomic consoles are available, activate kernel sync mode -+ * to make sure any final messages are visible. The trailing -+ * printk message is important to flush any pending messages. -+ */ -+ if (have_atomic_console()) { -+ sync_mode = true; -+ pr_info("enabled sync mode\n"); -+ } -+ } -+ - rcu_read_lock(); - list_for_each_entry_rcu(dumper, &dump_list, list) { - enum kmsg_dump_reason max_reason = dumper->max_reason; diff --git a/kernel/patches-5.11.x-rt/0044-0025-printk-move-console-printing-to-kthreads.patch b/kernel/patches-5.11.x-rt/0044-0025-printk-move-console-printing-to-kthreads.patch deleted file mode 100644 index 29db3816e8..0000000000 --- a/kernel/patches-5.11.x-rt/0044-0025-printk-move-console-printing-to-kthreads.patch +++ /dev/null @@ -1,838 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:07 +0106 -Subject: [PATCH 25/28] printk: move console printing to kthreads - -Create a kthread for each console to perform console printing. Now -all console printing is fully asynchronous except for the boot -console and when the kernel enters sync mode (and there are atomic -consoles available). - -The console_lock() and console_unlock() functions now only do what -their name says... locking and unlocking of the console. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/console.h | 2 - kernel/printk/printk.c | 625 ++++++++++++++---------------------------------- - 2 files changed, 186 insertions(+), 441 deletions(-) - ---- a/include/linux/console.h -+++ b/include/linux/console.h -@@ -154,6 +154,8 @@ struct console { - #ifdef CONFIG_PRINTK - char sync_buf[CONSOLE_LOG_MAX]; - #endif -+ atomic64_t printk_seq; -+ struct task_struct *thread; - void *data; - struct console *next; - }; ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -44,6 +44,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -268,11 +269,6 @@ static void __up_console_sem(unsigned lo - static int console_locked, console_suspended; - - /* -- * If exclusive_console is non-NULL then only this console is to be printed to. -- */ --static struct console *exclusive_console; -- --/* - * Array of consoles built from command line options (console=) - */ - -@@ -356,10 +352,10 @@ enum log_flags { - LOG_CONT = 8, /* text is a fragment of a continuation line */ - }; - -+#ifdef CONFIG_PRINTK - /* syslog_lock protects syslog_* variables and write access to clear_seq. */ - static DEFINE_SPINLOCK(syslog_lock); - --#ifdef CONFIG_PRINTK - /* Set to enable sync mode. Once set, it is never cleared. */ - static bool sync_mode; - -@@ -370,13 +366,6 @@ static u64 syslog_seq; - static size_t syslog_partial; - static bool syslog_time; - --/* Both protected by @console_sem. */ --static u64 exclusive_console_stop_seq; --static unsigned long console_dropped; -- --/* the next printk record to write to the console */ --static atomic64_t console_seq = ATOMIC64_INIT(0); -- - struct latched_seq { - seqcount_latch_t latch; - u64 val[2]; -@@ -1754,6 +1743,8 @@ static bool console_can_sync(struct cons - return false; - if (con->write_atomic && kernel_sync_mode()) - return true; -+ if (con->write && (con->flags & CON_BOOT) && !con->thread) -+ return true; - return false; - } - -@@ -1763,6 +1754,8 @@ static bool call_sync_console_driver(str - return false; - if (con->write_atomic && kernel_sync_mode()) - con->write_atomic(con, text, text_len); -+ else if (con->write && (con->flags & CON_BOOT) && !con->thread) -+ con->write(con, text, text_len); - else - return false; - -@@ -1818,202 +1811,16 @@ static void print_sync_until(struct cons - - console_atomic_lock(&flags); - for (;;) { -- printk_seq = atomic64_read(&console_seq); -+ printk_seq = atomic64_read(&con->printk_seq); - if (printk_seq >= seq) - break; - if (!print_sync(con, &printk_seq)) - break; -- atomic64_set(&console_seq, printk_seq + 1); -+ atomic64_set(&con->printk_seq, printk_seq + 1); - } - console_atomic_unlock(flags); - } - --/* -- * Special console_lock variants that help to reduce the risk of soft-lockups. -- * They allow to pass console_lock to another printk() call using a busy wait. -- */ -- --#ifdef CONFIG_LOCKDEP --static struct lockdep_map console_owner_dep_map = { -- .name = "console_owner" --}; --#endif -- --static DEFINE_RAW_SPINLOCK(console_owner_lock); --static struct task_struct *console_owner; --static bool console_waiter; -- --/** -- * console_lock_spinning_enable - mark beginning of code where another -- * thread might safely busy wait -- * -- * This basically converts console_lock into a spinlock. This marks -- * the section where the console_lock owner can not sleep, because -- * there may be a waiter spinning (like a spinlock). Also it must be -- * ready to hand over the lock at the end of the section. -- */ --static void console_lock_spinning_enable(void) --{ -- raw_spin_lock(&console_owner_lock); -- console_owner = current; -- raw_spin_unlock(&console_owner_lock); -- -- /* The waiter may spin on us after setting console_owner */ -- spin_acquire(&console_owner_dep_map, 0, 0, _THIS_IP_); --} -- --/** -- * console_lock_spinning_disable_and_check - mark end of code where another -- * thread was able to busy wait and check if there is a waiter -- * -- * This is called at the end of the section where spinning is allowed. -- * It has two functions. First, it is a signal that it is no longer -- * safe to start busy waiting for the lock. Second, it checks if -- * there is a busy waiter and passes the lock rights to her. -- * -- * Important: Callers lose the lock if there was a busy waiter. -- * They must not touch items synchronized by console_lock -- * in this case. -- * -- * Return: 1 if the lock rights were passed, 0 otherwise. -- */ --static int console_lock_spinning_disable_and_check(void) --{ -- int waiter; -- -- raw_spin_lock(&console_owner_lock); -- waiter = READ_ONCE(console_waiter); -- console_owner = NULL; -- raw_spin_unlock(&console_owner_lock); -- -- if (!waiter) { -- spin_release(&console_owner_dep_map, _THIS_IP_); -- return 0; -- } -- -- /* The waiter is now free to continue */ -- WRITE_ONCE(console_waiter, false); -- -- spin_release(&console_owner_dep_map, _THIS_IP_); -- -- /* -- * Hand off console_lock to waiter. The waiter will perform -- * the up(). After this, the waiter is the console_lock owner. -- */ -- mutex_release(&console_lock_dep_map, _THIS_IP_); -- return 1; --} -- --/** -- * console_trylock_spinning - try to get console_lock by busy waiting -- * -- * This allows to busy wait for the console_lock when the current -- * owner is running in specially marked sections. It means that -- * the current owner is running and cannot reschedule until it -- * is ready to lose the lock. -- * -- * Return: 1 if we got the lock, 0 othrewise -- */ --static int console_trylock_spinning(void) --{ -- struct task_struct *owner = NULL; -- bool waiter; -- bool spin = false; -- unsigned long flags; -- -- if (console_trylock()) -- return 1; -- -- printk_safe_enter_irqsave(flags); -- -- raw_spin_lock(&console_owner_lock); -- owner = READ_ONCE(console_owner); -- waiter = READ_ONCE(console_waiter); -- if (!waiter && owner && owner != current) { -- WRITE_ONCE(console_waiter, true); -- spin = true; -- } -- raw_spin_unlock(&console_owner_lock); -- -- /* -- * If there is an active printk() writing to the -- * consoles, instead of having it write our data too, -- * see if we can offload that load from the active -- * printer, and do some printing ourselves. -- * Go into a spin only if there isn't already a waiter -- * spinning, and there is an active printer, and -- * that active printer isn't us (recursive printk?). -- */ -- if (!spin) { -- printk_safe_exit_irqrestore(flags); -- return 0; -- } -- -- /* We spin waiting for the owner to release us */ -- spin_acquire(&console_owner_dep_map, 0, 0, _THIS_IP_); -- /* Owner will clear console_waiter on hand off */ -- while (READ_ONCE(console_waiter)) -- cpu_relax(); -- spin_release(&console_owner_dep_map, _THIS_IP_); -- -- printk_safe_exit_irqrestore(flags); -- /* -- * The owner passed the console lock to us. -- * Since we did not spin on console lock, annotate -- * this as a trylock. Otherwise lockdep will -- * complain. -- */ -- mutex_acquire(&console_lock_dep_map, 0, 1, _THIS_IP_); -- -- return 1; --} -- --/* -- * Call the console drivers, asking them to write out -- * log_buf[start] to log_buf[end - 1]. -- * The console_lock must be held. -- */ --static void call_console_drivers(const char *ext_text, size_t ext_len, -- const char *text, size_t len) --{ -- static char dropped_text[64]; -- size_t dropped_len = 0; -- struct console *con; -- -- trace_console_rcuidle(text, len); -- -- if (!console_drivers) -- return; -- -- if (console_dropped) { -- dropped_len = snprintf(dropped_text, sizeof(dropped_text), -- "** %lu printk messages dropped **\n", -- console_dropped); -- console_dropped = 0; -- } -- -- for_each_console(con) { -- if (exclusive_console && con != exclusive_console) -- continue; -- if (!(con->flags & CON_ENABLED)) -- continue; -- if (!con->write) -- continue; -- if (!cpu_online(smp_processor_id()) && -- !(con->flags & CON_ANYTIME)) -- continue; -- if (kernel_sync_mode()) -- continue; -- if (con->flags & CON_EXTENDED) -- con->write(con, ext_text, ext_len); -- else { -- if (dropped_len) -- con->write(con, dropped_text, dropped_len); -- con->write(con, text, len); -- } -- } --} -- - #ifdef CONFIG_PRINTK_NMI - #define NUM_RECURSION_CTX 2 - #else -@@ -2284,39 +2091,16 @@ asmlinkage int vprintk_emit(int facility - const char *fmt, va_list args) - { - int printed_len; -- bool in_sched = false; - - /* Suppress unimportant messages after panic happens */ - if (unlikely(suppress_printk)) - return 0; - -- if (level == LOGLEVEL_SCHED) { -+ if (level == LOGLEVEL_SCHED) - level = LOGLEVEL_DEFAULT; -- in_sched = true; -- } -- -- printk_delay(level); - - printed_len = vprintk_store(facility, level, dev_info, fmt, args); - -- /* If called from the scheduler, we can not call up(). */ -- if (!in_sched) { -- /* -- * Disable preemption to avoid being preempted while holding -- * console_sem which would prevent anyone from printing to -- * console -- */ -- preempt_disable(); -- /* -- * Try to acquire and then immediately release the console -- * semaphore. The release will print out buffers and wake up -- * /dev/kmsg and syslog() users. -- */ -- if (console_trylock_spinning()) -- console_unlock(); -- preempt_enable(); -- } -- - wake_up_klogd(); - return printed_len; - } -@@ -2368,38 +2152,158 @@ asmlinkage __visible int printk(const ch - } - EXPORT_SYMBOL(printk); - --#else /* CONFIG_PRINTK */ -+static int printk_kthread_func(void *data) -+{ -+ struct console *con = data; -+ unsigned long dropped = 0; -+ char *dropped_text = NULL; -+ struct printk_info info; -+ struct printk_record r; -+ char *ext_text = NULL; -+ size_t dropped_len; -+ int ret = -ENOMEM; -+ char *text = NULL; -+ char *write_text; -+ u64 printk_seq; -+ size_t len; -+ int error; -+ u64 seq; - --#define printk_time false -+ if (con->flags & CON_EXTENDED) { -+ ext_text = kmalloc(CONSOLE_EXT_LOG_MAX, GFP_KERNEL); -+ if (!ext_text) -+ goto out; -+ } -+ text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); -+ dropped_text = kmalloc(64, GFP_KERNEL); -+ if (!text || !dropped_text) -+ goto out; - --#define prb_read_valid(rb, seq, r) false --#define prb_first_valid_seq(rb) 0 -+ if (con->flags & CON_EXTENDED) -+ write_text = ext_text; -+ else -+ write_text = text; - --#define kernel_sync_mode() false -+ seq = atomic64_read(&con->printk_seq); - --static u64 syslog_seq; --static atomic64_t console_seq = ATOMIC64_INIT(0); --static u64 exclusive_console_stop_seq; --static unsigned long console_dropped; -+ prb_rec_init_rd(&r, &info, text, LOG_LINE_MAX + PREFIX_MAX); -+ -+ for (;;) { -+ error = wait_event_interruptible(log_wait, -+ prb_read_valid(prb, seq, &r) || kthread_should_stop()); -+ -+ if (kthread_should_stop()) -+ break; -+ -+ if (error) -+ continue; -+ -+ if (seq != r.info->seq) { -+ dropped += r.info->seq - seq; -+ seq = r.info->seq; -+ } -+ -+ seq++; -+ -+ if (!(con->flags & CON_ENABLED)) -+ continue; -+ -+ if (suppress_message_printing(r.info->level)) -+ continue; -+ -+ if (con->flags & CON_EXTENDED) { -+ len = info_print_ext_header(ext_text, -+ CONSOLE_EXT_LOG_MAX, -+ r.info); -+ len += msg_print_ext_body(ext_text + len, -+ CONSOLE_EXT_LOG_MAX - len, -+ &r.text_buf[0], r.info->text_len, -+ &r.info->dev_info); -+ } else { -+ len = record_print_text(&r, -+ console_msg_format & MSG_FORMAT_SYSLOG, -+ printk_time); -+ } -+ -+ printk_seq = atomic64_read(&con->printk_seq); -+ -+ console_lock(); -+ console_may_schedule = 0; - --static size_t record_print_text(const struct printk_record *r, -- bool syslog, bool time) -+ if (kernel_sync_mode() && con->write_atomic) { -+ console_unlock(); -+ break; -+ } -+ -+ if (!(con->flags & CON_EXTENDED) && dropped) { -+ dropped_len = snprintf(dropped_text, 64, -+ "** %lu printk messages dropped **\n", -+ dropped); -+ dropped = 0; -+ -+ con->write(con, dropped_text, dropped_len); -+ printk_delay(r.info->level); -+ } -+ -+ con->write(con, write_text, len); -+ if (len) -+ printk_delay(r.info->level); -+ -+ atomic64_cmpxchg_relaxed(&con->printk_seq, printk_seq, seq); -+ -+ console_unlock(); -+ } -+out: -+ kfree(dropped_text); -+ kfree(text); -+ kfree(ext_text); -+ pr_info("%sconsole [%s%d]: printing thread stopped\n", -+ (con->flags & CON_BOOT) ? "boot" : "", -+ con->name, con->index); -+ return ret; -+} -+ -+/* Must be called within console_lock(). */ -+static void start_printk_kthread(struct console *con) - { -- return 0; -+ con->thread = kthread_run(printk_kthread_func, con, -+ "pr/%s%d", con->name, con->index); -+ if (IS_ERR(con->thread)) { -+ pr_err("%sconsole [%s%d]: unable to start printing thread\n", -+ (con->flags & CON_BOOT) ? "boot" : "", -+ con->name, con->index); -+ return; -+ } -+ pr_info("%sconsole [%s%d]: printing thread started\n", -+ (con->flags & CON_BOOT) ? "boot" : "", -+ con->name, con->index); - } --static ssize_t info_print_ext_header(char *buf, size_t size, -- struct printk_info *info) -+ -+/* protected by console_lock */ -+static bool kthreads_started; -+ -+/* Must be called within console_lock(). */ -+static void console_try_thread(struct console *con) - { -- return 0; -+ if (kthreads_started) { -+ start_printk_kthread(con); -+ return; -+ } -+ -+ /* -+ * The printing threads have not been started yet. If this console -+ * can print synchronously, print all unprinted messages. -+ */ -+ if (console_can_sync(con)) -+ print_sync_until(con, prb_next_seq(prb)); - } --static ssize_t msg_print_ext_body(char *buf, size_t size, -- char *text, size_t text_len, -- struct dev_printk_info *dev_info) { return 0; } --static void console_lock_spinning_enable(void) { } --static int console_lock_spinning_disable_and_check(void) { return 0; } --static void call_console_drivers(const char *ext_text, size_t ext_len, -- const char *text, size_t len) {} --static bool suppress_message_printing(int level) { return false; } -+ -+#else /* CONFIG_PRINTK */ -+ -+#define prb_first_valid_seq(rb) 0 -+#define prb_next_seq(rb) 0 -+ -+#define console_try_thread(con) - - #endif /* CONFIG_PRINTK */ - -@@ -2644,36 +2548,6 @@ int is_console_locked(void) - } - EXPORT_SYMBOL(is_console_locked); - --/* -- * Check if we have any console that is capable of printing while cpu is -- * booting or shutting down. Requires console_sem. -- */ --static int have_callable_console(void) --{ -- struct console *con; -- -- for_each_console(con) -- if ((con->flags & CON_ENABLED) && -- (con->flags & CON_ANYTIME)) -- return 1; -- -- return 0; --} -- --/* -- * Can we actually use the console at this time on this cpu? -- * -- * Console drivers may assume that per-cpu resources have been allocated. So -- * unless they're explicitly marked as being able to cope (CON_ANYTIME) don't -- * call them until this CPU is officially up. -- */ --static inline int can_use_console(void) --{ -- if (kernel_sync_mode()) -- return false; -- return cpu_online(raw_smp_processor_id()) || have_callable_console(); --} -- - /** - * console_unlock - unlock the console system - * -@@ -2690,131 +2564,14 @@ static inline int can_use_console(void) - */ - void console_unlock(void) - { -- static char ext_text[CONSOLE_EXT_LOG_MAX]; -- static char text[CONSOLE_LOG_MAX]; -- bool do_cond_resched, retry; -- struct printk_info info; -- struct printk_record r; -- u64 seq; -- - if (console_suspended) { - up_console_sem(); - return; - } - -- prb_rec_init_rd(&r, &info, text, sizeof(text)); -- -- /* -- * Console drivers are called with interrupts disabled, so -- * @console_may_schedule should be cleared before; however, we may -- * end up dumping a lot of lines, for example, if called from -- * console registration path, and should invoke cond_resched() -- * between lines if allowable. Not doing so can cause a very long -- * scheduling stall on a slow console leading to RCU stall and -- * softlockup warnings which exacerbate the issue with more -- * messages practically incapacitating the system. -- * -- * console_trylock() is not able to detect the preemptive -- * context reliably. Therefore the value must be stored before -- * and cleared after the "again" goto label. -- */ -- do_cond_resched = console_may_schedule; --again: -- console_may_schedule = 0; -- -- /* -- * We released the console_sem lock, so we need to recheck if -- * cpu is online and (if not) is there at least one CON_ANYTIME -- * console. -- */ -- if (!can_use_console()) { -- console_locked = 0; -- up_console_sem(); -- return; -- } -- -- for (;;) { -- size_t ext_len = 0; -- size_t len; -- --skip: -- seq = atomic64_read(&console_seq); -- if (!prb_read_valid(prb, seq, &r)) -- break; -- -- if (seq != r.info->seq) { -- console_dropped += r.info->seq - seq; -- atomic64_set(&console_seq, r.info->seq); -- seq = r.info->seq; -- } -- -- if (suppress_message_printing(r.info->level)) { -- /* -- * Skip record we have buffered and already printed -- * directly to the console when we received it, and -- * record that has level above the console loglevel. -- */ -- atomic64_set(&console_seq, seq + 1); -- goto skip; -- } -- -- /* Output to all consoles once old messages replayed. */ -- if (unlikely(exclusive_console && -- seq >= exclusive_console_stop_seq)) { -- exclusive_console = NULL; -- } -- -- /* -- * Handle extended console text first because later -- * record_print_text() will modify the record buffer in-place. -- */ -- if (nr_ext_console_drivers) { -- ext_len = info_print_ext_header(ext_text, -- sizeof(ext_text), -- r.info); -- ext_len += msg_print_ext_body(ext_text + ext_len, -- sizeof(ext_text) - ext_len, -- &r.text_buf[0], -- r.info->text_len, -- &r.info->dev_info); -- } -- len = record_print_text(&r, -- console_msg_format & MSG_FORMAT_SYSLOG, -- printk_time); -- atomic64_set(&console_seq, seq + 1); -- -- /* -- * While actively printing out messages, if another printk() -- * were to occur on another CPU, it may wait for this one to -- * finish. This task can not be preempted if there is a -- * waiter waiting to take over. -- */ -- console_lock_spinning_enable(); -- -- stop_critical_timings(); /* don't trace print latency */ -- call_console_drivers(ext_text, ext_len, text, len); -- start_critical_timings(); -- -- if (console_lock_spinning_disable_and_check()) -- return; -- -- if (do_cond_resched) -- cond_resched(); -- } -- - console_locked = 0; - - up_console_sem(); -- -- /* -- * Someone could have filled up the buffer again, so re-check if there's -- * something to flush. In case we cannot trylock the console_sem again, -- * there's a new owner and the console_unlock() from them will do the -- * flush, no worries. -- */ -- retry = prb_read_valid(prb, atomic64_read(&console_seq), NULL); -- if (retry && console_trylock()) -- goto again; - } - EXPORT_SYMBOL(console_unlock); - -@@ -2864,18 +2621,20 @@ void console_unblank(void) - */ - void console_flush_on_panic(enum con_flush_mode mode) - { -- /* -- * If someone else is holding the console lock, trylock will fail -- * and may_schedule may be set. Ignore and proceed to unlock so -- * that messages are flushed out. As this can be called from any -- * context and we don't want to get preempted while flushing, -- * ensure may_schedule is cleared. -- */ -- console_trylock(); -+ struct console *c; -+ u64 seq; -+ -+ if (!console_trylock()) -+ return; -+ - console_may_schedule = 0; - -- if (mode == CONSOLE_REPLAY_ALL) -- atomic64_set(&console_seq, prb_first_valid_seq(prb)); -+ if (mode == CONSOLE_REPLAY_ALL) { -+ seq = prb_first_valid_seq(prb); -+ for_each_console(c) -+ atomic64_set(&c->printk_seq, seq); -+ } -+ - console_unlock(); - } - -@@ -3010,7 +2769,6 @@ static int try_enable_new_console(struct - */ - void register_console(struct console *newcon) - { -- unsigned long flags; - struct console *bcon = NULL; - int err; - -@@ -3034,6 +2792,8 @@ void register_console(struct console *ne - } - } - -+ newcon->thread = NULL; -+ - if (console_drivers && console_drivers->flags & CON_BOOT) - bcon = console_drivers; - -@@ -3098,27 +2858,12 @@ void register_console(struct console *ne - if (newcon->flags & CON_EXTENDED) - nr_ext_console_drivers++; - -- if (newcon->flags & CON_PRINTBUFFER) { -- /* -- * console_unlock(); will print out the buffered messages -- * for us. -- * -- * We're about to replay the log buffer. Only do this to the -- * just-registered console to avoid excessive message spam to -- * the already-registered consoles. -- * -- * Set exclusive_console with disabled interrupts to reduce -- * race window with eventual console_flush_on_panic() that -- * ignores console_lock. -- */ -- exclusive_console = newcon; -- exclusive_console_stop_seq = atomic64_read(&console_seq); -+ if (newcon->flags & CON_PRINTBUFFER) -+ atomic64_set(&newcon->printk_seq, 0); -+ else -+ atomic64_set(&newcon->printk_seq, prb_next_seq(prb)); - -- /* Get a consistent copy of @syslog_seq. */ -- spin_lock_irqsave(&syslog_lock, flags); -- atomic64_set(&console_seq, syslog_seq); -- spin_unlock_irqrestore(&syslog_lock, flags); -- } -+ console_try_thread(newcon); - console_unlock(); - console_sysfs_notify(); - -@@ -3192,6 +2937,9 @@ int unregister_console(struct console *c - console_unlock(); - console_sysfs_notify(); - -+ if (console->thread && !IS_ERR(console->thread)) -+ kthread_stop(console->thread); -+ - if (console->exit) - res = console->exit(console); - -@@ -3274,6 +3022,15 @@ static int __init printk_late_init(void) - unregister_console(con); - } - } -+ -+#ifdef CONFIG_PRINTK -+ console_lock(); -+ for_each_console(con) -+ start_printk_kthread(con); -+ kthreads_started = true; -+ console_unlock(); -+#endif -+ - ret = cpuhp_setup_state_nocalls(CPUHP_PRINTK_DEAD, "printk:dead", NULL, - console_cpu_notify); - WARN_ON(ret < 0); -@@ -3289,7 +3046,6 @@ late_initcall(printk_late_init); - * Delayed printk version, for scheduler-internal messages: - */ - #define PRINTK_PENDING_WAKEUP 0x01 --#define PRINTK_PENDING_OUTPUT 0x02 - - static DEFINE_PER_CPU(int, printk_pending); - -@@ -3297,14 +3053,8 @@ static void wake_up_klogd_work_func(stru - { - int pending = __this_cpu_xchg(printk_pending, 0); - -- if (pending & PRINTK_PENDING_OUTPUT) { -- /* If trylock fails, someone else is doing the printing */ -- if (console_trylock()) -- console_unlock(); -- } -- - if (pending & PRINTK_PENDING_WAKEUP) -- wake_up_interruptible(&log_wait); -+ wake_up_interruptible_all(&log_wait); - } - - static DEFINE_PER_CPU(struct irq_work, wake_up_klogd_work) = -@@ -3325,13 +3075,6 @@ void wake_up_klogd(void) - - void defer_console_output(void) - { -- if (!printk_percpu_data_ready()) -- return; -- -- preempt_disable(); -- __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT); -- irq_work_queue(this_cpu_ptr(&wake_up_klogd_work)); -- preempt_enable(); - } - - int vprintk_deferred(const char *fmt, va_list args) diff --git a/kernel/patches-5.11.x-rt/0045-0026-printk-remove-deferred-printing.patch b/kernel/patches-5.11.x-rt/0045-0026-printk-remove-deferred-printing.patch deleted file mode 100644 index d9f0b86011..0000000000 --- a/kernel/patches-5.11.x-rt/0045-0026-printk-remove-deferred-printing.patch +++ /dev/null @@ -1,407 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:08 +0106 -Subject: [PATCH 26/28] printk: remove deferred printing - -Since printing occurs either atomically or from the printing -kthread, there is no need for any deferring or tracking possible -recursion paths. Remove all printk context tracking. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm/kernel/smp.c | 2 - - arch/powerpc/kexec/crash.c | 3 - - include/linux/hardirq.h | 2 - - include/linux/printk.h | 12 ------ - kernel/printk/Makefile | 1 - kernel/printk/internal.h | 70 ----------------------------------- - kernel/printk/printk.c | 58 +++++++++++------------------ - kernel/printk/printk_safe.c | 88 -------------------------------------------- - kernel/trace/trace.c | 2 - - 9 files changed, 22 insertions(+), 216 deletions(-) - delete mode 100644 kernel/printk/internal.h - delete mode 100644 kernel/printk/printk_safe.c - ---- a/arch/arm/kernel/smp.c -+++ b/arch/arm/kernel/smp.c -@@ -671,9 +671,7 @@ static void do_handle_IPI(int ipinr) - break; - - case IPI_CPU_BACKTRACE: -- printk_nmi_enter(); - nmi_cpu_backtrace(get_irq_regs()); -- printk_nmi_exit(); - break; - - default: ---- a/arch/powerpc/kexec/crash.c -+++ b/arch/powerpc/kexec/crash.c -@@ -311,9 +311,6 @@ void default_machine_crash_shutdown(stru - unsigned int i; - int (*old_handler)(struct pt_regs *regs); - -- /* Avoid hardlocking with irresponsive CPU holding logbuf_lock */ -- printk_nmi_enter(); -- - /* - * This function is only called after the system - * has panicked or is otherwise in a critical state. ---- a/include/linux/hardirq.h -+++ b/include/linux/hardirq.h -@@ -115,7 +115,6 @@ extern void rcu_nmi_exit(void); - do { \ - lockdep_off(); \ - arch_nmi_enter(); \ -- printk_nmi_enter(); \ - BUG_ON(in_nmi() == NMI_MASK); \ - __preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \ - } while (0) -@@ -134,7 +133,6 @@ extern void rcu_nmi_exit(void); - do { \ - BUG_ON(!in_nmi()); \ - __preempt_count_sub(NMI_OFFSET + HARDIRQ_OFFSET); \ -- printk_nmi_exit(); \ - arch_nmi_exit(); \ - lockdep_on(); \ - } while (0) ---- a/include/linux/printk.h -+++ b/include/linux/printk.h -@@ -155,18 +155,6 @@ static inline __printf(1, 2) __cold - void early_printk(const char *s, ...) { } - #endif - --#ifdef CONFIG_PRINTK_NMI --extern void printk_nmi_enter(void); --extern void printk_nmi_exit(void); --extern void printk_nmi_direct_enter(void); --extern void printk_nmi_direct_exit(void); --#else --static inline void printk_nmi_enter(void) { } --static inline void printk_nmi_exit(void) { } --static inline void printk_nmi_direct_enter(void) { } --static inline void printk_nmi_direct_exit(void) { } --#endif /* PRINTK_NMI */ -- - struct dev_printk_info; - - #ifdef CONFIG_PRINTK ---- a/kernel/printk/Makefile -+++ b/kernel/printk/Makefile -@@ -1,5 +1,4 @@ - # SPDX-License-Identifier: GPL-2.0-only - obj-y = printk.o --obj-$(CONFIG_PRINTK) += printk_safe.o - obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o - obj-$(CONFIG_PRINTK) += printk_ringbuffer.o ---- a/kernel/printk/internal.h -+++ /dev/null -@@ -1,70 +0,0 @@ --/* SPDX-License-Identifier: GPL-2.0-or-later */ --/* -- * internal.h - printk internal definitions -- */ --#include -- --#ifdef CONFIG_PRINTK -- --#define PRINTK_SAFE_CONTEXT_MASK 0x007ffffff --#define PRINTK_NMI_DIRECT_CONTEXT_MASK 0x008000000 --#define PRINTK_NMI_CONTEXT_MASK 0xff0000000 -- --#define PRINTK_NMI_CONTEXT_OFFSET 0x010000000 -- --__printf(4, 0) --int vprintk_store(int facility, int level, -- const struct dev_printk_info *dev_info, -- const char *fmt, va_list args); -- --__printf(1, 0) int vprintk_default(const char *fmt, va_list args); --__printf(1, 0) int vprintk_deferred(const char *fmt, va_list args); --__printf(1, 0) int vprintk_func(const char *fmt, va_list args); --void __printk_safe_enter(void); --void __printk_safe_exit(void); -- --bool printk_percpu_data_ready(void); -- --#define printk_safe_enter_irqsave(flags) \ -- do { \ -- local_irq_save(flags); \ -- __printk_safe_enter(); \ -- } while (0) -- --#define printk_safe_exit_irqrestore(flags) \ -- do { \ -- __printk_safe_exit(); \ -- local_irq_restore(flags); \ -- } while (0) -- --#define printk_safe_enter_irq() \ -- do { \ -- local_irq_disable(); \ -- __printk_safe_enter(); \ -- } while (0) -- --#define printk_safe_exit_irq() \ -- do { \ -- __printk_safe_exit(); \ -- local_irq_enable(); \ -- } while (0) -- --void defer_console_output(void); -- --#else -- --__printf(1, 0) int vprintk_func(const char *fmt, va_list args) { return 0; } -- --/* -- * In !PRINTK builds we still export console_sem -- * semaphore and some of console functions (console_unlock()/etc.), so -- * printk-safe must preserve the existing local IRQ guarantees. -- */ --#define printk_safe_enter_irqsave(flags) local_irq_save(flags) --#define printk_safe_exit_irqrestore(flags) local_irq_restore(flags) -- --#define printk_safe_enter_irq() local_irq_disable() --#define printk_safe_exit_irq() local_irq_enable() -- --static inline bool printk_percpu_data_ready(void) { return false; } --#endif /* CONFIG_PRINTK */ ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -45,6 +45,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -60,7 +61,6 @@ - #include "printk_ringbuffer.h" - #include "console_cmdline.h" - #include "braille.h" --#include "internal.h" - - int console_printk[4] = { - CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */ -@@ -227,19 +227,7 @@ static int nr_ext_console_drivers; - - static int __down_trylock_console_sem(unsigned long ip) - { -- int lock_failed; -- unsigned long flags; -- -- /* -- * Here and in __up_console_sem() we need to be in safe mode, -- * because spindump/WARN/etc from under console ->lock will -- * deadlock in printk()->down_trylock_console_sem() otherwise. -- */ -- printk_safe_enter_irqsave(flags); -- lock_failed = down_trylock(&console_sem); -- printk_safe_exit_irqrestore(flags); -- -- if (lock_failed) -+ if (down_trylock(&console_sem)) - return 1; - mutex_acquire(&console_lock_dep_map, 0, 1, ip); - return 0; -@@ -248,13 +236,9 @@ static int __down_trylock_console_sem(un - - static void __up_console_sem(unsigned long ip) - { -- unsigned long flags; -- - mutex_release(&console_lock_dep_map, ip); - -- printk_safe_enter_irqsave(flags); - up(&console_sem); -- printk_safe_exit_irqrestore(flags); - } - #define up_console_sem() __up_console_sem(_RET_IP_) - -@@ -426,7 +410,7 @@ static struct printk_ringbuffer *prb = & - */ - static bool __printk_percpu_data_ready __read_mostly; - --bool printk_percpu_data_ready(void) -+static bool printk_percpu_data_ready(void) - { - return __printk_percpu_data_ready; - } -@@ -1060,7 +1044,6 @@ void __init setup_log_buf(int early) - struct printk_record r; - size_t new_descs_size; - size_t new_infos_size; -- unsigned long flags; - char *new_log_buf; - unsigned int free; - u64 seq; -@@ -1958,9 +1941,9 @@ static u16 printk_sprint(char *text, u16 - } - - __printf(4, 0) --int vprintk_store(int facility, int level, -- const struct dev_printk_info *dev_info, -- const char *fmt, va_list args) -+static int vprintk_store(int facility, int level, -+ const struct dev_printk_info *dev_info, -+ const char *fmt, va_list args) - { - const u32 caller_id = printk_caller_id(); - struct prb_reserved_entry e; -@@ -2106,11 +2089,22 @@ asmlinkage int vprintk_emit(int facility - } - EXPORT_SYMBOL(vprintk_emit); - --int vprintk_default(const char *fmt, va_list args) -+__printf(1, 0) -+static int vprintk_default(const char *fmt, va_list args) - { - return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, fmt, args); - } --EXPORT_SYMBOL_GPL(vprintk_default); -+ -+__printf(1, 0) -+static int vprintk_func(const char *fmt, va_list args) -+{ -+#ifdef CONFIG_KGDB_KDB -+ /* Allow to pass printk() to kdb but avoid a recursion. */ -+ if (unlikely(kdb_trap_printk && kdb_printf_cpu < 0)) -+ return vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); -+#endif -+ return vprintk_default(fmt, args); -+} - - asmlinkage int vprintk(const char *fmt, va_list args) - { -@@ -3073,18 +3067,10 @@ void wake_up_klogd(void) - preempt_enable(); - } - --void defer_console_output(void) -+__printf(1, 0) -+static int vprintk_deferred(const char *fmt, va_list args) - { --} -- --int vprintk_deferred(const char *fmt, va_list args) --{ -- int r; -- -- r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, fmt, args); -- defer_console_output(); -- -- return r; -+ return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, fmt, args); - } - - int printk_deferred(const char *fmt, ...) ---- a/kernel/printk/printk_safe.c -+++ /dev/null -@@ -1,88 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-or-later --/* -- * printk_safe.c - Safe printk for printk-deadlock-prone contexts -- */ -- --#include --#include --#include --#include --#include --#include --#include --#include --#include -- --#include "internal.h" -- --static DEFINE_PER_CPU(int, printk_context); -- --#ifdef CONFIG_PRINTK_NMI --void noinstr printk_nmi_enter(void) --{ -- this_cpu_add(printk_context, PRINTK_NMI_CONTEXT_OFFSET); --} -- --void noinstr printk_nmi_exit(void) --{ -- this_cpu_sub(printk_context, PRINTK_NMI_CONTEXT_OFFSET); --} -- --/* -- * Marks a code that might produce many messages in NMI context -- * and the risk of losing them is more critical than eventual -- * reordering. -- */ --void printk_nmi_direct_enter(void) --{ -- if (this_cpu_read(printk_context) & PRINTK_NMI_CONTEXT_MASK) -- this_cpu_or(printk_context, PRINTK_NMI_DIRECT_CONTEXT_MASK); --} -- --void printk_nmi_direct_exit(void) --{ -- this_cpu_and(printk_context, ~PRINTK_NMI_DIRECT_CONTEXT_MASK); --} -- --#endif /* CONFIG_PRINTK_NMI */ -- --/* Can be preempted by NMI. */ --void __printk_safe_enter(void) --{ -- this_cpu_inc(printk_context); --} -- --/* Can be preempted by NMI. */ --void __printk_safe_exit(void) --{ -- this_cpu_dec(printk_context); --} -- --__printf(1, 0) int vprintk_func(const char *fmt, va_list args) --{ --#ifdef CONFIG_KGDB_KDB -- /* Allow to pass printk() to kdb but avoid a recursion. */ -- if (unlikely(kdb_trap_printk && kdb_printf_cpu < 0)) -- return vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); --#endif -- -- /* -- * Use the main logbuf even in NMI. But avoid calling console -- * drivers that might have their own locks. -- */ -- if (this_cpu_read(printk_context) & -- (PRINTK_NMI_DIRECT_CONTEXT_MASK | -- PRINTK_NMI_CONTEXT_MASK | -- PRINTK_SAFE_CONTEXT_MASK)) { -- int len; -- -- printk_safe_enter_irqsave(flags); -- len = vprintk_store(0, LOGLEVEL_DEFAULT, NULL, fmt, args); -- printk_safe_exit_irqrestore(flags); -- defer_console_output(); -- return len; -- } -- -- /* No obstacles. */ -- return vprintk_default(fmt, args); --} ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -9325,7 +9325,6 @@ void ftrace_dump(enum ftrace_dump_mode o - tracing_off(); - - local_irq_save(flags); -- printk_nmi_direct_enter(); - - /* Simulate the iterator */ - trace_init_global_iter(&iter); -@@ -9405,7 +9404,6 @@ void ftrace_dump(enum ftrace_dump_mode o - atomic_dec(&per_cpu_ptr(iter.array_buffer->data, cpu)->disabled); - } - atomic_dec(&dump_running); -- printk_nmi_direct_exit(); - local_irq_restore(flags); - } - EXPORT_SYMBOL_GPL(ftrace_dump); diff --git a/kernel/patches-5.11.x-rt/0046-0027-printk-add-console-handover.patch b/kernel/patches-5.11.x-rt/0046-0027-printk-add-console-handover.patch deleted file mode 100644 index b38cefd7e9..0000000000 --- a/kernel/patches-5.11.x-rt/0046-0027-printk-add-console-handover.patch +++ /dev/null @@ -1,67 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:09 +0106 -Subject: [PATCH 27/28] printk: add console handover - -If earlyprintk is used, a boot console will print directly to the -console immediately. The boot console will unregister itself as soon -as a non-boot console registers. However, the non-boot console does -not begin printing until its kthread has started. Since this happens -much later, there is a long pause in the console output. If the -ringbuffer is small, messages could even be dropped during the -pause. - -Add a new CON_HANDOVER console flag to be used internally by printk -in order to track which non-boot console took over from a boot -console. If handover consoles have implemented write_atomic(), they -are allowed to print directly to the console until their kthread can -take over. - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/console.h | 1 + - kernel/printk/printk.c | 8 +++++++- - 2 files changed, 8 insertions(+), 1 deletion(-) - ---- a/include/linux/console.h -+++ b/include/linux/console.h -@@ -137,6 +137,7 @@ static inline int con_debug_leave(void) - #define CON_ANYTIME (16) /* Safe to call when cpu is offline */ - #define CON_BRL (32) /* Used for a braille device */ - #define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */ -+#define CON_HANDOVER (128) /* Device was previously a boot console. */ - - struct console { - char name[16]; ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1726,6 +1726,8 @@ static bool console_can_sync(struct cons - return false; - if (con->write_atomic && kernel_sync_mode()) - return true; -+ if (con->write_atomic && (con->flags & CON_HANDOVER) && !con->thread) -+ return true; - if (con->write && (con->flags & CON_BOOT) && !con->thread) - return true; - return false; -@@ -1737,6 +1739,8 @@ static bool call_sync_console_driver(str - return false; - if (con->write_atomic && kernel_sync_mode()) - con->write_atomic(con, text, text_len); -+ else if (con->write_atomic && (con->flags & CON_HANDOVER) && !con->thread) -+ con->write_atomic(con, text, text_len); - else if (con->write && (con->flags & CON_BOOT) && !con->thread) - con->write(con, text, text_len); - else -@@ -2829,8 +2833,10 @@ void register_console(struct console *ne - * the real console are the same physical device, it's annoying to - * see the beginning boot messages twice - */ -- if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) -+ if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) { - newcon->flags &= ~CON_PRINTBUFFER; -+ newcon->flags |= CON_HANDOVER; -+ } - - /* - * Put this console in the list - keep the diff --git a/kernel/patches-5.11.x-rt/0047-0028-printk-add-pr_flush.patch b/kernel/patches-5.11.x-rt/0047-0028-printk-add-pr_flush.patch deleted file mode 100644 index 3b9b73aa4a..0000000000 --- a/kernel/patches-5.11.x-rt/0047-0028-printk-add-pr_flush.patch +++ /dev/null @@ -1,198 +0,0 @@ -From: John Ogness -Date: Mon, 30 Nov 2020 01:42:10 +0106 -Subject: [PATCH 28/28] printk: add pr_flush() - -Provide a function to allow waiting for console printers to catch -up to the latest logged message. - -Use pr_flush() to give console printers a chance to finish in -critical situations if no atomic console is available. For now -pr_flush() is only used in the most common error paths: -panic(), print_oops_end_marker(), report_bug(), kmsg_dump(). - -Signed-off-by: John Ogness -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/printk.h | 2 + - kernel/panic.c | 28 ++++++++++------- - kernel/printk/printk.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++ - lib/bug.c | 1 - 4 files changed, 99 insertions(+), 11 deletions(-) - ---- a/include/linux/printk.h -+++ b/include/linux/printk.h -@@ -481,6 +481,8 @@ extern int kptr_restrict; - no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) - #endif - -+bool pr_flush(int timeout_ms, bool reset_on_progress); -+ - /* - * ratelimited messages with local ratelimit_state, - * no local ratelimit_state used in the !PRINTK case ---- a/kernel/panic.c -+++ b/kernel/panic.c -@@ -177,12 +177,28 @@ static void panic_print_sys_info(void) - void panic(const char *fmt, ...) - { - static char buf[1024]; -+ va_list args2; - va_list args; - long i, i_next = 0, len; - int state = 0; - int old_cpu, this_cpu; - bool _crash_kexec_post_notifiers = crash_kexec_post_notifiers; - -+ console_verbose(); -+ pr_emerg("Kernel panic - not syncing:\n"); -+ va_start(args2, fmt); -+ va_copy(args, args2); -+ vprintk(fmt, args2); -+ va_end(args2); -+#ifdef CONFIG_DEBUG_BUGVERBOSE -+ /* -+ * Avoid nested stack-dumping if a panic occurs during oops processing -+ */ -+ if (!test_taint(TAINT_DIE) && oops_in_progress <= 1) -+ dump_stack(); -+#endif -+ pr_flush(1000, true); -+ - /* - * Disable local interrupts. This will prevent panic_smp_self_stop - * from deadlocking the first cpu that invokes the panic, since -@@ -213,24 +229,13 @@ void panic(const char *fmt, ...) - if (old_cpu != PANIC_CPU_INVALID && old_cpu != this_cpu) - panic_smp_self_stop(); - -- console_verbose(); - bust_spinlocks(1); -- va_start(args, fmt); - len = vscnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - - if (len && buf[len - 1] == '\n') - buf[len - 1] = '\0'; - -- pr_emerg("Kernel panic - not syncing: %s\n", buf); --#ifdef CONFIG_DEBUG_BUGVERBOSE -- /* -- * Avoid nested stack-dumping if a panic occurs during oops processing -- */ -- if (!test_taint(TAINT_DIE) && oops_in_progress <= 1) -- dump_stack(); --#endif -- - /* - * If kgdb is enabled, give it a chance to run before we stop all - * the other CPUs or else we won't be able to debug processes left -@@ -552,6 +557,7 @@ static void print_oops_end_marker(void) - { - init_oops_id(); - pr_warn("---[ end trace %016llx ]---\n", (unsigned long long)oops_id); -+ pr_flush(1000, true); - } - - /* ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -3228,6 +3228,12 @@ void kmsg_dump(enum kmsg_dump_reason rea - sync_mode = true; - pr_info("enabled sync mode\n"); - } -+ -+ /* -+ * Give the printing threads time to flush, allowing up to -+ * 1s of no printing forward progress before giving up. -+ */ -+ pr_flush(1000, true); - } - - rcu_read_lock(); -@@ -3507,3 +3513,76 @@ void console_atomic_unlock(unsigned int - prb_unlock(&printk_cpulock, flags); - } - EXPORT_SYMBOL(console_atomic_unlock); -+ -+static void pr_msleep(bool may_sleep, int ms) -+{ -+ if (may_sleep) { -+ msleep(ms); -+ } else { -+ while (ms--) -+ udelay(1000); -+ } -+} -+ -+/** -+ * pr_flush() - Wait for printing threads to catch up. -+ * -+ * @timeout_ms: The maximum time (in ms) to wait. -+ * @reset_on_progress: Reset the timeout if forward progress is seen. -+ * -+ * A value of 0 for @timeout_ms means no waiting will occur. A value of -1 -+ * represents infinite waiting. -+ * -+ * If @reset_on_progress is true, the timeout will be reset whenever any -+ * printer has been seen to make some forward progress. -+ * -+ * Context: Any context. -+ * Return: true if all enabled printers are caught up. -+ */ -+bool pr_flush(int timeout_ms, bool reset_on_progress) -+{ -+ int remaining = timeout_ms; -+ struct console *con; -+ u64 last_diff = 0; -+ bool may_sleep; -+ u64 printk_seq; -+ u64 diff; -+ u64 seq; -+ -+ may_sleep = (preemptible() && !in_softirq()); -+ -+ seq = prb_next_seq(prb); -+ -+ for (;;) { -+ diff = 0; -+ -+ for_each_console(con) { -+ if (!(con->flags & CON_ENABLED)) -+ continue; -+ printk_seq = atomic64_read(&con->printk_seq); -+ if (printk_seq < seq) -+ diff += seq - printk_seq; -+ } -+ -+ if (diff != last_diff && reset_on_progress) -+ remaining = timeout_ms; -+ -+ if (!diff || remaining == 0) -+ break; -+ -+ if (remaining < 0) { -+ pr_msleep(may_sleep, 100); -+ } else if (remaining < 100) { -+ pr_msleep(may_sleep, remaining); -+ remaining = 0; -+ } else { -+ pr_msleep(may_sleep, 100); -+ remaining -= 100; -+ } -+ -+ last_diff = diff; -+ } -+ -+ return (diff == 0); -+} -+EXPORT_SYMBOL(pr_flush); ---- a/lib/bug.c -+++ b/lib/bug.c -@@ -205,6 +205,7 @@ enum bug_trap_type report_bug(unsigned l - else - pr_crit("Kernel BUG at %pB [verbose debug info unavailable]\n", - (void *)bugaddr); -+ pr_flush(1000, true); - - return BUG_TRAP_TYPE_BUG; - } diff --git a/kernel/patches-5.11.x-rt/0048-kcov-Remove-kcov-include-from-sched.h-and-move-it-to.patch b/kernel/patches-5.11.x-rt/0048-kcov-Remove-kcov-include-from-sched.h-and-move-it-to.patch deleted file mode 100644 index bc3205d6ea..0000000000 --- a/kernel/patches-5.11.x-rt/0048-kcov-Remove-kcov-include-from-sched.h-and-move-it-to.patch +++ /dev/null @@ -1,76 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 18 Feb 2021 18:31:26 +0100 -Subject: [PATCH] kcov: Remove kcov include from sched.h and move it to its - users. - -The recent addition of in_serving_softirq() to kconv.h results in -compile failure on PREEMPT_RT because it requires -task_struct::softirq_disable_cnt. This is not available if kconv.h is -included from sched.h. - -It is not needed to include kconv.h from sched.h. All but the net/ user -already include the kconv header file. - -Move the include of the kconv.h header from sched.h it its users. -Additionally include sched.h from kconv.h to ensure that everything -task_struct related is available. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/kcov.h | 1 + - include/linux/sched.h | 1 - - net/core/skbuff.c | 1 + - net/mac80211/iface.c | 1 + - net/mac80211/rx.c | 1 + - 5 files changed, 4 insertions(+), 1 deletion(-) - ---- a/include/linux/kcov.h -+++ b/include/linux/kcov.h -@@ -2,6 +2,7 @@ - #ifndef _LINUX_KCOV_H - #define _LINUX_KCOV_H - -+#include - #include - - struct task_struct; ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -14,7 +14,6 @@ - #include - #include - #include --#include - #include - #include - #include ---- a/net/core/skbuff.c -+++ b/net/core/skbuff.c -@@ -60,6 +60,7 @@ - #include - #include - #include -+#include - - #include - #include ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include - #include - #include "ieee80211_i.h" ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/kernel/patches-5.11.x-rt/0049-cgroup-use-irqsave-in-cgroup_rstat_flush_locked.patch b/kernel/patches-5.11.x-rt/0049-cgroup-use-irqsave-in-cgroup_rstat_flush_locked.patch deleted file mode 100644 index adec360036..0000000000 --- a/kernel/patches-5.11.x-rt/0049-cgroup-use-irqsave-in-cgroup_rstat_flush_locked.patch +++ /dev/null @@ -1,43 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 3 Jul 2018 18:19:48 +0200 -Subject: [PATCH] cgroup: use irqsave in cgroup_rstat_flush_locked() - -All callers of cgroup_rstat_flush_locked() acquire cgroup_rstat_lock -either with spin_lock_irq() or spin_lock_irqsave(). -cgroup_rstat_flush_locked() itself acquires cgroup_rstat_cpu_lock which -is a raw_spin_lock. This lock is also acquired in cgroup_rstat_updated() -in IRQ context and therefore requires _irqsave() locking suffix in -cgroup_rstat_flush_locked(). -Since there is no difference between spin_lock_t and raw_spin_lock_t -on !RT lockdep does not complain here. On RT lockdep complains because -the interrupts were not disabled here and a deadlock is possible. - -Acquire the raw_spin_lock_t with disabled interrupts. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/cgroup/rstat.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - ---- a/kernel/cgroup/rstat.c -+++ b/kernel/cgroup/rstat.c -@@ -149,8 +149,9 @@ static void cgroup_rstat_flush_locked(st - raw_spinlock_t *cpu_lock = per_cpu_ptr(&cgroup_rstat_cpu_lock, - cpu); - struct cgroup *pos = NULL; -+ unsigned long flags; - -- raw_spin_lock(cpu_lock); -+ raw_spin_lock_irqsave(cpu_lock, flags); - while ((pos = cgroup_rstat_cpu_pop_updated(pos, cgrp, cpu))) { - struct cgroup_subsys_state *css; - -@@ -162,7 +163,7 @@ static void cgroup_rstat_flush_locked(st - css->ss->css_rstat_flush(css, cpu); - rcu_read_unlock(); - } -- raw_spin_unlock(cpu_lock); -+ raw_spin_unlock_irqrestore(cpu_lock, flags); - - /* if @may_sleep, play nice and yield if necessary */ - if (may_sleep && (need_resched() || diff --git a/kernel/patches-5.11.x-rt/0050-mm-workingset-replace-IRQ-off-check-with-a-lockdep-a.patch b/kernel/patches-5.11.x-rt/0050-mm-workingset-replace-IRQ-off-check-with-a-lockdep-a.patch deleted file mode 100644 index 1882cd91c2..0000000000 --- a/kernel/patches-5.11.x-rt/0050-mm-workingset-replace-IRQ-off-check-with-a-lockdep-a.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 11 Feb 2019 10:40:46 +0100 -Subject: [PATCH] mm: workingset: replace IRQ-off check with a lockdep assert. - -Commit - - 68d48e6a2df57 ("mm: workingset: add vmstat counter for shadow nodes") - -introduced an IRQ-off check to ensure that a lock is held which also -disabled interrupts. This does not work the same way on -RT because none -of the locks, that are held, disable interrupts. -Replace this check with a lockdep assert which ensures that the lock is -held. - -Cc: Peter Zijlstra -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/workingset.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - ---- a/mm/workingset.c -+++ b/mm/workingset.c -@@ -430,6 +430,8 @@ static struct list_lru shadow_nodes; - - void workingset_update_node(struct xa_node *node) - { -+ struct address_space *mapping; -+ - /* - * Track non-empty nodes that contain only shadow entries; - * unlink those that contain pages or are being freed. -@@ -438,7 +440,8 @@ void workingset_update_node(struct xa_no - * already where they should be. The list_empty() test is safe - * as node->private_list is protected by the i_pages lock. - */ -- VM_WARN_ON_ONCE(!irqs_disabled()); /* For __inc_lruvec_page_state */ -+ mapping = container_of(node->array, struct address_space, i_pages); -+ lockdep_assert_held(&mapping->i_pages.xa_lock); - - if (node->count && node->count == node->nr_values) { - if (list_empty(&node->private_list)) { diff --git a/kernel/patches-5.11.x-rt/0051-shmem-Use-raw_spinlock_t-for-stat_lock.patch b/kernel/patches-5.11.x-rt/0051-shmem-Use-raw_spinlock_t-for-stat_lock.patch deleted file mode 100644 index ff83d2337a..0000000000 --- a/kernel/patches-5.11.x-rt/0051-shmem-Use-raw_spinlock_t-for-stat_lock.patch +++ /dev/null @@ -1,138 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 14 Aug 2020 18:53:34 +0200 -Subject: [PATCH] shmem: Use raw_spinlock_t for ->stat_lock - -Each CPU has SHMEM_INO_BATCH inodes available in `->ino_batch' which is -per-CPU. Access here is serialized by disabling preemption. If the pool is -empty, it gets reloaded from `->next_ino'. Access here is serialized by -->stat_lock which is a spinlock_t and can not be acquired with disabled -preemption. -One way around it would make per-CPU ino_batch struct containing the inode -number a local_lock_t. -Another sollution is to promote ->stat_lock to a raw_spinlock_t. The critical -sections are short. The mpol_put() should be moved outside of the critical -section to avoid invoking the destrutor with disabled preemption. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/shmem_fs.h | 2 +- - mm/shmem.c | 31 +++++++++++++++++-------------- - 2 files changed, 18 insertions(+), 15 deletions(-) - ---- a/include/linux/shmem_fs.h -+++ b/include/linux/shmem_fs.h -@@ -31,7 +31,7 @@ struct shmem_sb_info { - struct percpu_counter used_blocks; /* How many are allocated */ - unsigned long max_inodes; /* How many inodes are allowed */ - unsigned long free_inodes; /* How many are left for allocation */ -- spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ -+ raw_spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ - umode_t mode; /* Mount mode for root directory */ - unsigned char huge; /* Whether to try for hugepages */ - kuid_t uid; /* Mount uid for root directory */ ---- a/mm/shmem.c -+++ b/mm/shmem.c -@@ -278,10 +278,10 @@ static int shmem_reserve_inode(struct su - ino_t ino; - - if (!(sb->s_flags & SB_KERNMOUNT)) { -- spin_lock(&sbinfo->stat_lock); -+ raw_spin_lock(&sbinfo->stat_lock); - if (sbinfo->max_inodes) { - if (!sbinfo->free_inodes) { -- spin_unlock(&sbinfo->stat_lock); -+ raw_spin_unlock(&sbinfo->stat_lock); - return -ENOSPC; - } - sbinfo->free_inodes--; -@@ -304,7 +304,7 @@ static int shmem_reserve_inode(struct su - } - *inop = ino; - } -- spin_unlock(&sbinfo->stat_lock); -+ raw_spin_unlock(&sbinfo->stat_lock); - } else if (inop) { - /* - * __shmem_file_setup, one of our callers, is lock-free: it -@@ -319,13 +319,14 @@ static int shmem_reserve_inode(struct su - * to worry about things like glibc compatibility. - */ - ino_t *next_ino; -+ - next_ino = per_cpu_ptr(sbinfo->ino_batch, get_cpu()); - ino = *next_ino; - if (unlikely(ino % SHMEM_INO_BATCH == 0)) { -- spin_lock(&sbinfo->stat_lock); -+ raw_spin_lock(&sbinfo->stat_lock); - ino = sbinfo->next_ino; - sbinfo->next_ino += SHMEM_INO_BATCH; -- spin_unlock(&sbinfo->stat_lock); -+ raw_spin_unlock(&sbinfo->stat_lock); - if (unlikely(is_zero_ino(ino))) - ino++; - } -@@ -341,9 +342,9 @@ static void shmem_free_inode(struct supe - { - struct shmem_sb_info *sbinfo = SHMEM_SB(sb); - if (sbinfo->max_inodes) { -- spin_lock(&sbinfo->stat_lock); -+ raw_spin_lock(&sbinfo->stat_lock); - sbinfo->free_inodes++; -- spin_unlock(&sbinfo->stat_lock); -+ raw_spin_unlock(&sbinfo->stat_lock); - } - } - -@@ -1479,10 +1480,10 @@ static struct mempolicy *shmem_get_sbmpo - { - struct mempolicy *mpol = NULL; - if (sbinfo->mpol) { -- spin_lock(&sbinfo->stat_lock); /* prevent replace/use races */ -+ raw_spin_lock(&sbinfo->stat_lock); /* prevent replace/use races */ - mpol = sbinfo->mpol; - mpol_get(mpol); -- spin_unlock(&sbinfo->stat_lock); -+ raw_spin_unlock(&sbinfo->stat_lock); - } - return mpol; - } -@@ -3587,9 +3588,10 @@ static int shmem_reconfigure(struct fs_c - struct shmem_options *ctx = fc->fs_private; - struct shmem_sb_info *sbinfo = SHMEM_SB(fc->root->d_sb); - unsigned long inodes; -+ struct mempolicy *mpol = NULL; - const char *err; - -- spin_lock(&sbinfo->stat_lock); -+ raw_spin_lock(&sbinfo->stat_lock); - inodes = sbinfo->max_inodes - sbinfo->free_inodes; - if ((ctx->seen & SHMEM_SEEN_BLOCKS) && ctx->blocks) { - if (!sbinfo->max_blocks) { -@@ -3634,14 +3636,15 @@ static int shmem_reconfigure(struct fs_c - * Preserve previous mempolicy unless mpol remount option was specified. - */ - if (ctx->mpol) { -- mpol_put(sbinfo->mpol); -+ mpol = sbinfo->mpol; - sbinfo->mpol = ctx->mpol; /* transfers initial ref */ - ctx->mpol = NULL; - } -- spin_unlock(&sbinfo->stat_lock); -+ raw_spin_unlock(&sbinfo->stat_lock); -+ mpol_put(mpol); - return 0; - out: -- spin_unlock(&sbinfo->stat_lock); -+ raw_spin_unlock(&sbinfo->stat_lock); - return invalfc(fc, "%s", err); - } - -@@ -3758,7 +3761,7 @@ static int shmem_fill_super(struct super - sbinfo->mpol = ctx->mpol; - ctx->mpol = NULL; - -- spin_lock_init(&sbinfo->stat_lock); -+ raw_spin_lock_init(&sbinfo->stat_lock); - if (percpu_counter_init(&sbinfo->used_blocks, 0, GFP_KERNEL)) - goto failed; - spin_lock_init(&sbinfo->shrinklist_lock); diff --git a/kernel/patches-5.11.x-rt/0052-net--Move-lockdep-where-it-belongs.patch b/kernel/patches-5.11.x-rt/0052-net--Move-lockdep-where-it-belongs.patch deleted file mode 100644 index 6b8ea38389..0000000000 --- a/kernel/patches-5.11.x-rt/0052-net--Move-lockdep-where-it-belongs.patch +++ /dev/null @@ -1,40 +0,0 @@ -Subject: net: Move lockdep where it belongs -From: Thomas Gleixner -Date: Tue, 08 Sep 2020 07:32:20 +0200 - -Signed-off-by: Thomas Gleixner ---- - net/core/sock.c | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - ---- a/net/core/sock.c -+++ b/net/core/sock.c -@@ -3050,12 +3050,11 @@ void lock_sock_nested(struct sock *sk, i - if (sk->sk_lock.owned) - __lock_sock(sk); - sk->sk_lock.owned = 1; -- spin_unlock(&sk->sk_lock.slock); -+ spin_unlock_bh(&sk->sk_lock.slock); - /* - * The sk_lock has mutex_lock() semantics here: - */ - mutex_acquire(&sk->sk_lock.dep_map, subclass, 0, _RET_IP_); -- local_bh_enable(); - } - EXPORT_SYMBOL(lock_sock_nested); - -@@ -3104,13 +3103,12 @@ bool lock_sock_fast(struct sock *sk) __a - - __lock_sock(sk); - sk->sk_lock.owned = 1; -- spin_unlock(&sk->sk_lock.slock); -+ spin_unlock_bh(&sk->sk_lock.slock); - /* - * The sk_lock has mutex_lock() semantics here: - */ - mutex_acquire(&sk->sk_lock.dep_map, 0, 0, _RET_IP_); - __acquire(&sk->sk_lock.slock); -- local_bh_enable(); - return true; - } - EXPORT_SYMBOL(lock_sock_fast); diff --git a/kernel/patches-5.11.x-rt/0053-tcp-Remove-superfluous-BH-disable-around-listening_h.patch b/kernel/patches-5.11.x-rt/0053-tcp-Remove-superfluous-BH-disable-around-listening_h.patch deleted file mode 100644 index 120202dfdc..0000000000 --- a/kernel/patches-5.11.x-rt/0053-tcp-Remove-superfluous-BH-disable-around-listening_h.patch +++ /dev/null @@ -1,99 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 12 Oct 2020 17:33:54 +0200 -Subject: [PATCH] tcp: Remove superfluous BH-disable around listening_hash - -Commit - 9652dc2eb9e40 ("tcp: relax listening_hash operations") - -removed the need to disable bottom half while acquiring -listening_hash.lock. There are still two callers left which disable -bottom half before the lock is acquired. - -Drop local_bh_disable() around __inet_hash() which acquires -listening_hash->lock, invoke inet_ehash_nolisten() with disabled BH. -inet_unhash() conditionally acquires listening_hash->lock. - -Reported-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior -Link: https://lore.kernel.org/linux-rt-users/12d6f9879a97cd56c09fb53dee343cbb14f7f1f7.camel@gmx.de/ -Link: https://lkml.kernel.org/r/X9CheYjuXWc75Spa@hirez.programming.kicks-ass.net ---- - net/ipv4/inet_hashtables.c | 19 ++++++++++++------- - net/ipv6/inet6_hashtables.c | 5 +---- - 2 files changed, 13 insertions(+), 11 deletions(-) - ---- a/net/ipv4/inet_hashtables.c -+++ b/net/ipv4/inet_hashtables.c -@@ -635,7 +635,9 @@ int __inet_hash(struct sock *sk, struct - int err = 0; - - if (sk->sk_state != TCP_LISTEN) { -+ local_bh_disable(); - inet_ehash_nolisten(sk, osk, NULL); -+ local_bh_enable(); - return 0; - } - WARN_ON(!sk_unhashed(sk)); -@@ -667,11 +669,8 @@ int inet_hash(struct sock *sk) - { - int err = 0; - -- if (sk->sk_state != TCP_CLOSE) { -- local_bh_disable(); -+ if (sk->sk_state != TCP_CLOSE) - err = __inet_hash(sk, NULL); -- local_bh_enable(); -- } - - return err; - } -@@ -682,17 +681,20 @@ void inet_unhash(struct sock *sk) - struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo; - struct inet_listen_hashbucket *ilb = NULL; - spinlock_t *lock; -+ bool state_listen; - - if (sk_unhashed(sk)) - return; - - if (sk->sk_state == TCP_LISTEN) { -+ state_listen = true; - ilb = &hashinfo->listening_hash[inet_sk_listen_hashfn(sk)]; -- lock = &ilb->lock; -+ spin_lock(&ilb->lock); - } else { -+ state_listen = false; - lock = inet_ehash_lockp(hashinfo, sk->sk_hash); -+ spin_lock_bh(lock); - } -- spin_lock_bh(lock); - if (sk_unhashed(sk)) - goto unlock; - -@@ -705,7 +707,10 @@ void inet_unhash(struct sock *sk) - __sk_nulls_del_node_init_rcu(sk); - sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); - unlock: -- spin_unlock_bh(lock); -+ if (state_listen) -+ spin_unlock(&ilb->lock); -+ else -+ spin_unlock_bh(lock); - } - EXPORT_SYMBOL_GPL(inet_unhash); - ---- a/net/ipv6/inet6_hashtables.c -+++ b/net/ipv6/inet6_hashtables.c -@@ -333,11 +333,8 @@ int inet6_hash(struct sock *sk) - { - int err = 0; - -- if (sk->sk_state != TCP_CLOSE) { -- local_bh_disable(); -+ if (sk->sk_state != TCP_CLOSE) - err = __inet_hash(sk, NULL); -- local_bh_enable(); -- } - - return err; - } diff --git a/kernel/patches-5.11.x-rt/0054-smp-Wake-ksoftirqd-on-PREEMPT_RT-instead-do_softirq.patch b/kernel/patches-5.11.x-rt/0054-smp-Wake-ksoftirqd-on-PREEMPT_RT-instead-do_softirq.patch deleted file mode 100644 index 93dae9aa75..0000000000 --- a/kernel/patches-5.11.x-rt/0054-smp-Wake-ksoftirqd-on-PREEMPT_RT-instead-do_softirq.patch +++ /dev/null @@ -1,40 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 15 Feb 2021 18:44:12 +0100 -Subject: [PATCH] smp: Wake ksoftirqd on PREEMPT_RT instead do_softirq(). - -The softirq implementation on PREEMPT_RT does not provide do_softirq(). -The other user of do_softirq() is replaced with a local_bh_disable() -+ enable() around the possible raise-softirq invocation. This can not be -done here because migration_cpu_stop() is invoked with disabled -preemption. - -Wake the softirq thread on PREEMPT_RT if there are any pending softirqs. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/smp.c | 14 ++++++++++++-- - 1 file changed, 12 insertions(+), 2 deletions(-) - ---- a/kernel/smp.c -+++ b/kernel/smp.c -@@ -450,8 +450,18 @@ void flush_smp_call_function_from_idle(v - - local_irq_save(flags); - flush_smp_call_function_queue(true); -- if (local_softirq_pending()) -- do_softirq(); -+ -+ if (local_softirq_pending()) { -+ -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) { -+ do_softirq(); -+ } else { -+ struct task_struct *ksoftirqd = this_cpu_ksoftirqd(); -+ -+ if (ksoftirqd && ksoftirqd->state != TASK_RUNNING) -+ wake_up_process(ksoftirqd); -+ } -+ } - - local_irq_restore(flags); - } diff --git a/kernel/patches-5.11.x-rt/0055-0001-tasklets-Replace-barrier-with-cpu_relax-in-tasklet_u.patch b/kernel/patches-5.11.x-rt/0055-0001-tasklets-Replace-barrier-with-cpu_relax-in-tasklet_u.patch deleted file mode 100644 index 49163ca146..0000000000 --- a/kernel/patches-5.11.x-rt/0055-0001-tasklets-Replace-barrier-with-cpu_relax-in-tasklet_u.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:42:04 +0100 -Subject: [PATCH 01/20] tasklets: Replace barrier() with cpu_relax() in - tasklet_unlock_wait() - -A barrier() in a tight loop which waits for something to happen on a remote -CPU is a pointless exercise. Replace it with cpu_relax() which allows HT -siblings to make progress. - -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -677,7 +677,8 @@ static inline void tasklet_unlock(struct - - static inline void tasklet_unlock_wait(struct tasklet_struct *t) - { -- while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); } -+ while (test_bit(TASKLET_STATE_RUN, &t->state)) -+ cpu_relax(); - } - #else - #define tasklet_trylock(t) 1 diff --git a/kernel/patches-5.11.x-rt/0056-0002-tasklets-Use-static-inlines-for-stub-implementations.patch b/kernel/patches-5.11.x-rt/0056-0002-tasklets-Use-static-inlines-for-stub-implementations.patch deleted file mode 100644 index cb5602e148..0000000000 --- a/kernel/patches-5.11.x-rt/0056-0002-tasklets-Use-static-inlines-for-stub-implementations.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:42:05 +0100 -Subject: [PATCH 02/20] tasklets: Use static inlines for stub implementations - -Inlines exist for a reason. - -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -681,9 +681,9 @@ static inline void tasklet_unlock_wait(s - cpu_relax(); - } - #else --#define tasklet_trylock(t) 1 --#define tasklet_unlock_wait(t) do { } while (0) --#define tasklet_unlock(t) do { } while (0) -+static inline int tasklet_trylock(struct tasklet_struct *t) { return 1; } -+static inline void tasklet_unlock(struct tasklet_struct *t) { } -+static inline void tasklet_unlock_wait(struct tasklet_struct *t) { } - #endif - - extern void __tasklet_schedule(struct tasklet_struct *t); diff --git a/kernel/patches-5.11.x-rt/0057-0003-tasklets-Provide-tasklet_disable_in_atomic.patch b/kernel/patches-5.11.x-rt/0057-0003-tasklets-Provide-tasklet_disable_in_atomic.patch deleted file mode 100644 index dea76c2aee..0000000000 --- a/kernel/patches-5.11.x-rt/0057-0003-tasklets-Provide-tasklet_disable_in_atomic.patch +++ /dev/null @@ -1,61 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:42:06 +0100 -Subject: [PATCH 03/20] tasklets: Provide tasklet_disable_in_atomic() - -Replacing the spin wait loops in tasklet_unlock_wait() with -wait_var_event() is not possible as a handful of tasklet_disable() -invocations are happening in atomic context. All other invocations are in -teardown paths which can sleep. - -Provide tasklet_disable_in_atomic() and tasklet_unlock_spin_wait() to -convert the few atomic use cases over, which allows to change -tasklet_disable() and tasklet_unlock_wait() in a later step. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 22 ++++++++++++++++++++++ - 1 file changed, 22 insertions(+) - ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -680,10 +680,21 @@ static inline void tasklet_unlock_wait(s - while (test_bit(TASKLET_STATE_RUN, &t->state)) - cpu_relax(); - } -+ -+/* -+ * Do not use in new code. Waiting for tasklets from atomic contexts is -+ * error prone and should be avoided. -+ */ -+static inline void tasklet_unlock_spin_wait(struct tasklet_struct *t) -+{ -+ while (test_bit(TASKLET_STATE_RUN, &t->state)) -+ cpu_relax(); -+} - #else - static inline int tasklet_trylock(struct tasklet_struct *t) { return 1; } - static inline void tasklet_unlock(struct tasklet_struct *t) { } - static inline void tasklet_unlock_wait(struct tasklet_struct *t) { } -+static inline void tasklet_unlock_spin_wait(struct tasklet_struct *t) { } - #endif - - extern void __tasklet_schedule(struct tasklet_struct *t); -@@ -708,6 +719,17 @@ static inline void tasklet_disable_nosyn - smp_mb__after_atomic(); - } - -+/* -+ * Do not use in new code. Disabling tasklets from atomic contexts is -+ * error prone and should be avoided. -+ */ -+static inline void tasklet_disable_in_atomic(struct tasklet_struct *t) -+{ -+ tasklet_disable_nosync(t); -+ tasklet_unlock_spin_wait(t); -+ smp_mb(); -+} -+ - static inline void tasklet_disable(struct tasklet_struct *t) - { - tasklet_disable_nosync(t); diff --git a/kernel/patches-5.11.x-rt/0058-0004-tasklets-Use-spin-wait-in-tasklet_disable-temporaril.patch b/kernel/patches-5.11.x-rt/0058-0004-tasklets-Use-spin-wait-in-tasklet_disable-temporaril.patch deleted file mode 100644 index 6f8ad778be..0000000000 --- a/kernel/patches-5.11.x-rt/0058-0004-tasklets-Use-spin-wait-in-tasklet_disable-temporaril.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:42:07 +0100 -Subject: [PATCH 04/20] tasklets: Use spin wait in tasklet_disable() - temporarily - -To ease the transition use spin waiting in tasklet_disable() until all -usage sites from atomic context have been cleaned up. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -733,7 +733,8 @@ static inline void tasklet_disable_in_at - static inline void tasklet_disable(struct tasklet_struct *t) - { - tasklet_disable_nosync(t); -- tasklet_unlock_wait(t); -+ /* Spin wait until all atomic users are converted */ -+ tasklet_unlock_spin_wait(t); - smp_mb(); - } - diff --git a/kernel/patches-5.11.x-rt/0059-0005-tasklets-Replace-spin-wait-in-tasklet_unlock_wait.patch b/kernel/patches-5.11.x-rt/0059-0005-tasklets-Replace-spin-wait-in-tasklet_unlock_wait.patch deleted file mode 100644 index 0fe21db311..0000000000 --- a/kernel/patches-5.11.x-rt/0059-0005-tasklets-Replace-spin-wait-in-tasklet_unlock_wait.patch +++ /dev/null @@ -1,81 +0,0 @@ -From: Peter Zijlstra -Date: Tue, 9 Mar 2021 09:42:08 +0100 -Subject: [PATCH 05/20] tasklets: Replace spin wait in tasklet_unlock_wait() - -tasklet_unlock_wait() spin waits for TASKLET_STATE_RUN to be cleared. This -is wasting CPU cycles in a tight loop which is especially painful in a -guest when the CPU running the tasklet is scheduled out. - -tasklet_unlock_wait() is invoked from tasklet_kill() which is used in -teardown paths and not performance critical at all. Replace the spin wait -with wait_var_event(). - -There are no users of tasklet_unlock_wait() which are invoked from atomic -contexts. The usage in tasklet_disable() has been replaced temporarily with -the spin waiting variant until the atomic users are fixed up and will be -converted to the sleep wait variant later. - -Signed-off-by: Peter Zijlstra -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 13 ++----------- - kernel/softirq.c | 18 ++++++++++++++++++ - 2 files changed, 20 insertions(+), 11 deletions(-) - ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -669,17 +669,8 @@ static inline int tasklet_trylock(struct - return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state); - } - --static inline void tasklet_unlock(struct tasklet_struct *t) --{ -- smp_mb__before_atomic(); -- clear_bit(TASKLET_STATE_RUN, &(t)->state); --} -- --static inline void tasklet_unlock_wait(struct tasklet_struct *t) --{ -- while (test_bit(TASKLET_STATE_RUN, &t->state)) -- cpu_relax(); --} -+void tasklet_unlock(struct tasklet_struct *t); -+void tasklet_unlock_wait(struct tasklet_struct *t); - - /* - * Do not use in new code. Waiting for tasklets from atomic contexts is ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -25,6 +25,7 @@ - #include - #include - #include -+#include - - #define CREATE_TRACE_POINTS - #include -@@ -619,6 +620,23 @@ void tasklet_kill(struct tasklet_struct - } - EXPORT_SYMBOL(tasklet_kill); - -+#ifdef CONFIG_SMP -+void tasklet_unlock(struct tasklet_struct *t) -+{ -+ smp_mb__before_atomic(); -+ clear_bit(TASKLET_STATE_RUN, &t->state); -+ smp_mb__after_atomic(); -+ wake_up_var(&t->state); -+} -+EXPORT_SYMBOL_GPL(tasklet_unlock); -+ -+void tasklet_unlock_wait(struct tasklet_struct *t) -+{ -+ wait_var_event(&t->state, !test_bit(TASKLET_STATE_RUN, &t->state)); -+} -+EXPORT_SYMBOL_GPL(tasklet_unlock_wait); -+#endif -+ - void __init softirq_init(void) - { - int cpu; diff --git a/kernel/patches-5.11.x-rt/0060-0006-tasklets-Replace-spin-wait-in-tasklet_kill.patch b/kernel/patches-5.11.x-rt/0060-0006-tasklets-Replace-spin-wait-in-tasklet_kill.patch deleted file mode 100644 index 16ebb04653..0000000000 --- a/kernel/patches-5.11.x-rt/0060-0006-tasklets-Replace-spin-wait-in-tasklet_kill.patch +++ /dev/null @@ -1,67 +0,0 @@ -From: Peter Zijlstra -Date: Tue, 9 Mar 2021 09:42:09 +0100 -Subject: [PATCH 06/20] tasklets: Replace spin wait in tasklet_kill() - -tasklet_kill() spin waits for TASKLET_STATE_SCHED to be cleared invoking -yield() from inside the loop. yield() is an ill defined mechanism and the -result might still be wasting CPU cycles in a tight loop which is -especially painful in a guest when the CPU running the tasklet is scheduled -out. - -tasklet_kill() is used in teardown paths and not performance critical at -all. Replace the spin wait with wait_var_event(). - -Signed-off-by: Peter Zijlstra -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/softirq.c | 23 +++++++++++++++-------- - 1 file changed, 15 insertions(+), 8 deletions(-) - ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -530,6 +530,16 @@ void __tasklet_hi_schedule(struct taskle - } - EXPORT_SYMBOL(__tasklet_hi_schedule); - -+static inline bool tasklet_clear_sched(struct tasklet_struct *t) -+{ -+ if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) { -+ wake_up_var(&t->state); -+ return true; -+ } -+ -+ return false; -+} -+ - static void tasklet_action_common(struct softirq_action *a, - struct tasklet_head *tl_head, - unsigned int softirq_nr) -@@ -549,8 +559,7 @@ static void tasklet_action_common(struct - - if (tasklet_trylock(t)) { - if (!atomic_read(&t->count)) { -- if (!test_and_clear_bit(TASKLET_STATE_SCHED, -- &t->state)) -+ if (!tasklet_clear_sched(t)) - BUG(); - if (t->use_callback) - t->callback(t); -@@ -610,13 +619,11 @@ void tasklet_kill(struct tasklet_struct - if (in_interrupt()) - pr_notice("Attempt to kill tasklet from interrupt\n"); - -- while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { -- do { -- yield(); -- } while (test_bit(TASKLET_STATE_SCHED, &t->state)); -- } -+ while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) -+ wait_var_event(&t->state, !test_bit(TASKLET_STATE_SCHED, &t->state)); -+ - tasklet_unlock_wait(t); -- clear_bit(TASKLET_STATE_SCHED, &t->state); -+ tasklet_clear_sched(t); - } - EXPORT_SYMBOL(tasklet_kill); - diff --git a/kernel/patches-5.11.x-rt/0061-0007-tasklets-Prevent-tasklet_unlock_spin_wait-deadlock-o.patch b/kernel/patches-5.11.x-rt/0061-0007-tasklets-Prevent-tasklet_unlock_spin_wait-deadlock-o.patch deleted file mode 100644 index 0670a9ff55..0000000000 --- a/kernel/patches-5.11.x-rt/0061-0007-tasklets-Prevent-tasklet_unlock_spin_wait-deadlock-o.patch +++ /dev/null @@ -1,100 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:42:10 +0100 -Subject: [PATCH 07/20] tasklets: Prevent tasklet_unlock_spin_wait() deadlock - on RT - -tasklet_unlock_spin_wait() spin waits for the TASKLET_STATE_SCHED bit in -the tasklet state to be cleared. This works on !RT nicely because the -corresponding execution can only happen on a different CPU. - -On RT softirq processing is preemptible, therefore a task preempting the -softirq processing thread can spin forever. - -Prevent this by invoking local_bh_disable()/enable() inside the loop. In -case that the softirq processing thread was preempted by the current task, -current will block on the local lock which yields the CPU to the preempted -softirq processing thread. If the tasklet is processed on a different CPU -then the local_bh_disable()/enable() pair is just a waste of processor -cycles. - -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 12 ++---------- - kernel/softirq.c | 28 +++++++++++++++++++++++++++- - 2 files changed, 29 insertions(+), 11 deletions(-) - ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -663,7 +663,7 @@ enum - TASKLET_STATE_RUN /* Tasklet is running (SMP only) */ - }; - --#ifdef CONFIG_SMP -+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT) - static inline int tasklet_trylock(struct tasklet_struct *t) - { - return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state); -@@ -671,16 +671,8 @@ static inline int tasklet_trylock(struct - - void tasklet_unlock(struct tasklet_struct *t); - void tasklet_unlock_wait(struct tasklet_struct *t); -+void tasklet_unlock_spin_wait(struct tasklet_struct *t); - --/* -- * Do not use in new code. Waiting for tasklets from atomic contexts is -- * error prone and should be avoided. -- */ --static inline void tasklet_unlock_spin_wait(struct tasklet_struct *t) --{ -- while (test_bit(TASKLET_STATE_RUN, &t->state)) -- cpu_relax(); --} - #else - static inline int tasklet_trylock(struct tasklet_struct *t) { return 1; } - static inline void tasklet_unlock(struct tasklet_struct *t) { } ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -614,6 +614,32 @@ void tasklet_init(struct tasklet_struct - } - EXPORT_SYMBOL(tasklet_init); - -+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT) -+/* -+ * Do not use in new code. Waiting for tasklets from atomic contexts is -+ * error prone and should be avoided. -+ */ -+void tasklet_unlock_spin_wait(struct tasklet_struct *t) -+{ -+ while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) { -+ /* -+ * Prevent a live lock when current preempted soft -+ * interrupt processing or prevents ksoftirqd from -+ * running. If the tasklet runs on a different CPU -+ * then this has no effect other than doing the BH -+ * disable/enable dance for nothing. -+ */ -+ local_bh_disable(); -+ local_bh_enable(); -+ } else { -+ cpu_relax(); -+ } -+ } -+} -+EXPORT_SYMBOL(tasklet_unlock_spin_wait); -+#endif -+ - void tasklet_kill(struct tasklet_struct *t) - { - if (in_interrupt()) -@@ -627,7 +653,7 @@ void tasklet_kill(struct tasklet_struct - } - EXPORT_SYMBOL(tasklet_kill); - --#ifdef CONFIG_SMP -+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT) - void tasklet_unlock(struct tasklet_struct *t) - { - smp_mb__before_atomic(); diff --git a/kernel/patches-5.11.x-rt/0062-0008-net-jme-Replace-link-change-tasklet-with-work.patch b/kernel/patches-5.11.x-rt/0062-0008-net-jme-Replace-link-change-tasklet-with-work.patch deleted file mode 100644 index d0c08d551f..0000000000 --- a/kernel/patches-5.11.x-rt/0062-0008-net-jme-Replace-link-change-tasklet-with-work.patch +++ /dev/null @@ -1,79 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 9 Mar 2021 09:42:11 +0100 -Subject: [PATCH 08/20] net: jme: Replace link-change tasklet with work - -The link change tasklet disables the tasklets for tx/rx processing while -upating hw parameters and then enables the tasklets again. - -This update can also be pushed into a workqueue where it can be performed -in preemptible context. This allows tasklet_disable() to become sleeping. - -Replace the linkch_task tasklet with a work. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/net/ethernet/jme.c | 10 +++++----- - drivers/net/ethernet/jme.h | 2 +- - 2 files changed, 6 insertions(+), 6 deletions(-) - ---- a/drivers/net/ethernet/jme.c -+++ b/drivers/net/ethernet/jme.c -@@ -1265,9 +1265,9 @@ jme_stop_shutdown_timer(struct jme_adapt - jwrite32f(jme, JME_APMC, apmc); - } - --static void jme_link_change_tasklet(struct tasklet_struct *t) -+static void jme_link_change_work(struct work_struct *work) - { -- struct jme_adapter *jme = from_tasklet(jme, t, linkch_task); -+ struct jme_adapter *jme = container_of(work, struct jme_adapter, linkch_task); - struct net_device *netdev = jme->dev; - int rc; - -@@ -1510,7 +1510,7 @@ jme_intr_msi(struct jme_adapter *jme, u3 - * all other events are ignored - */ - jwrite32(jme, JME_IEVE, intrstat); -- tasklet_schedule(&jme->linkch_task); -+ schedule_work(&jme->linkch_task); - goto out_reenable; - } - -@@ -1832,7 +1832,6 @@ jme_open(struct net_device *netdev) - jme_clear_pm_disable_wol(jme); - JME_NAPI_ENABLE(jme); - -- tasklet_setup(&jme->linkch_task, jme_link_change_tasklet); - tasklet_setup(&jme->txclean_task, jme_tx_clean_tasklet); - tasklet_setup(&jme->rxclean_task, jme_rx_clean_tasklet); - tasklet_setup(&jme->rxempty_task, jme_rx_empty_tasklet); -@@ -1920,7 +1919,7 @@ jme_close(struct net_device *netdev) - - JME_NAPI_DISABLE(jme); - -- tasklet_kill(&jme->linkch_task); -+ cancel_work_sync(&jme->linkch_task); - tasklet_kill(&jme->txclean_task); - tasklet_kill(&jme->rxclean_task); - tasklet_kill(&jme->rxempty_task); -@@ -3035,6 +3034,7 @@ jme_init_one(struct pci_dev *pdev, - atomic_set(&jme->rx_empty, 1); - - tasklet_setup(&jme->pcc_task, jme_pcc_tasklet); -+ INIT_WORK(&jme->linkch_task, jme_link_change_work); - jme->dpi.cur = PCC_P1; - - jme->reg_ghc = 0; ---- a/drivers/net/ethernet/jme.h -+++ b/drivers/net/ethernet/jme.h -@@ -411,7 +411,7 @@ struct jme_adapter { - struct tasklet_struct rxempty_task; - struct tasklet_struct rxclean_task; - struct tasklet_struct txclean_task; -- struct tasklet_struct linkch_task; -+ struct work_struct linkch_task; - struct tasklet_struct pcc_task; - unsigned long flags; - u32 reg_txcs; diff --git a/kernel/patches-5.11.x-rt/0063-0009-net-sundance-Use-tasklet_disable_in_atomic.patch b/kernel/patches-5.11.x-rt/0063-0009-net-sundance-Use-tasklet_disable_in_atomic.patch deleted file mode 100644 index 2dd71370a5..0000000000 --- a/kernel/patches-5.11.x-rt/0063-0009-net-sundance-Use-tasklet_disable_in_atomic.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 9 Mar 2021 09:42:12 +0100 -Subject: [PATCH 09/20] net: sundance: Use tasklet_disable_in_atomic(). - -tasklet_disable() is used in the timer callback. This might be distangled, -but without access to the hardware that's a bit risky. - -Replace it with tasklet_disable_in_atomic() so tasklet_disable() can be -changed to a sleep wait once all remaining atomic users are converted. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Thomas Gleixner -Cc: Denis Kirjanov -Cc: "David S. Miller" -Cc: Jakub Kicinski -Cc: netdev@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/net/ethernet/dlink/sundance.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/ethernet/dlink/sundance.c -+++ b/drivers/net/ethernet/dlink/sundance.c -@@ -963,7 +963,7 @@ static void tx_timeout(struct net_device - unsigned long flag; - - netif_stop_queue(dev); -- tasklet_disable(&np->tx_tasklet); -+ tasklet_disable_in_atomic(&np->tx_tasklet); - iowrite16(0, ioaddr + IntrEnable); - printk(KERN_WARNING "%s: Transmit timed out, TxStatus %2.2x " - "TxFrameId %2.2x," diff --git a/kernel/patches-5.11.x-rt/0064-0010-ath9k-Use-tasklet_disable_in_atomic.patch b/kernel/patches-5.11.x-rt/0064-0010-ath9k-Use-tasklet_disable_in_atomic.patch deleted file mode 100644 index 791c1a724e..0000000000 --- a/kernel/patches-5.11.x-rt/0064-0010-ath9k-Use-tasklet_disable_in_atomic.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 9 Mar 2021 09:42:13 +0100 -Subject: [PATCH 10/20] ath9k: Use tasklet_disable_in_atomic() - -All callers of ath9k_beacon_ensure_primary_slot() are preemptible / -acquire a mutex except for this callchain: - - spin_lock_bh(&sc->sc_pcu_lock); - ath_complete_reset() - -> ath9k_calculate_summary_state() - -> ath9k_beacon_ensure_primary_slot() - -It's unclear how that can be distangled, so use tasklet_disable_in_atomic() -for now. This allows tasklet_disable() to become sleepable once the -remaining atomic users are cleaned up. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Thomas Gleixner -Cc: ath9k-devel@qca.qualcomm.com -Cc: Kalle Valo -Cc: "David S. Miller" -Cc: Jakub Kicinski -Cc: linux-wireless@vger.kernel.org -Cc: netdev@vger.kernel.org -Acked-by: Kalle Valo -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/net/wireless/ath/ath9k/beacon.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath9k/beacon.c -+++ b/drivers/net/wireless/ath/ath9k/beacon.c -@@ -251,7 +251,7 @@ void ath9k_beacon_ensure_primary_slot(st - int first_slot = ATH_BCBUF; - int slot; - -- tasklet_disable(&sc->bcon_tasklet); -+ tasklet_disable_in_atomic(&sc->bcon_tasklet); - - /* Find first taken slot. */ - for (slot = 0; slot < ATH_BCBUF; slot++) { diff --git a/kernel/patches-5.11.x-rt/0065-0011-atm-eni-Use-tasklet_disable_in_atomic-in-the-send-ca.patch b/kernel/patches-5.11.x-rt/0065-0011-atm-eni-Use-tasklet_disable_in_atomic-in-the-send-ca.patch deleted file mode 100644 index ba0555f8d0..0000000000 --- a/kernel/patches-5.11.x-rt/0065-0011-atm-eni-Use-tasklet_disable_in_atomic-in-the-send-ca.patch +++ /dev/null @@ -1,35 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 9 Mar 2021 09:42:14 +0100 -Subject: [PATCH 11/20] atm: eni: Use tasklet_disable_in_atomic() in the send() - callback - -The atmdev_ops::send callback which calls tasklet_disable() is invoked with -bottom halfs disabled from net_device_ops::ndo_start_xmit(). All other -invocations of tasklet_disable() in this driver happen in preemptible -context. - -Change the send() call to use tasklet_disable_in_atomic() which allows -tasklet_disable() to be made sleepable once the remaining atomic context -usage sites are cleaned up. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Thomas Gleixner -Cc: Chas Williams <3chas3@gmail.com> -Cc: linux-atm-general@lists.sourceforge.net -Cc: netdev@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/atm/eni.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/atm/eni.c -+++ b/drivers/atm/eni.c -@@ -2054,7 +2054,7 @@ static int eni_send(struct atm_vcc *vcc, - } - submitted++; - ATM_SKB(skb)->vcc = vcc; -- tasklet_disable(&ENI_DEV(vcc->dev)->task); -+ tasklet_disable_in_atomic(&ENI_DEV(vcc->dev)->task); - res = do_tx(skb); - tasklet_enable(&ENI_DEV(vcc->dev)->task); - if (res == enq_ok) return 0; diff --git a/kernel/patches-5.11.x-rt/0066-0012-PCI-hv-Use-tasklet_disable_in_atomic.patch b/kernel/patches-5.11.x-rt/0066-0012-PCI-hv-Use-tasklet_disable_in_atomic.patch deleted file mode 100644 index 99365a2981..0000000000 --- a/kernel/patches-5.11.x-rt/0066-0012-PCI-hv-Use-tasklet_disable_in_atomic.patch +++ /dev/null @@ -1,39 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 9 Mar 2021 09:42:15 +0100 -Subject: [PATCH 12/20] PCI: hv: Use tasklet_disable_in_atomic() - -The hv_compose_msi_msg() callback in irq_chip::irq_compose_msi_msg is -invoked via irq_chip_compose_msi_msg(), which itself is always invoked from -atomic contexts from the guts of the interrupt core code. - -There is no way to change this w/o rewriting the whole driver, so use -tasklet_disable_in_atomic() which allows to make tasklet_disable() -sleepable once the remaining atomic users are addressed. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Thomas Gleixner -Cc: "K. Y. Srinivasan" -Cc: Haiyang Zhang -Cc: Stephen Hemminger -Cc: Wei Liu -Cc: Lorenzo Pieralisi -Cc: Rob Herring -Cc: Bjorn Helgaas -Cc: linux-hyperv@vger.kernel.org -Cc: linux-pci@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/pci/controller/pci-hyperv.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/pci/controller/pci-hyperv.c -+++ b/drivers/pci/controller/pci-hyperv.c -@@ -1458,7 +1458,7 @@ static void hv_compose_msi_msg(struct ir - * Prevents hv_pci_onchannelcallback() from running concurrently - * in the tasklet. - */ -- tasklet_disable(&channel->callback_event); -+ tasklet_disable_in_atomic(&channel->callback_event); - - /* - * Since this function is called with IRQ locks held, can't diff --git a/kernel/patches-5.11.x-rt/0067-0013-firewire-ohci-Use-tasklet_disable_in_atomic-where-re.patch b/kernel/patches-5.11.x-rt/0067-0013-firewire-ohci-Use-tasklet_disable_in_atomic-where-re.patch deleted file mode 100644 index 229bf67e7b..0000000000 --- a/kernel/patches-5.11.x-rt/0067-0013-firewire-ohci-Use-tasklet_disable_in_atomic-where-re.patch +++ /dev/null @@ -1,54 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 9 Mar 2021 09:42:16 +0100 -Subject: [PATCH 13/20] firewire: ohci: Use tasklet_disable_in_atomic() where - required - -tasklet_disable() is invoked in several places. Some of them are in atomic -context which prevents a conversion of tasklet_disable() to a sleepable -function. - -The atomic callchains are: - - ar_context_tasklet() - ohci_cancel_packet() - tasklet_disable() - - ... - ohci_flush_iso_completions() - tasklet_disable() - -The invocation of tasklet_disable() from at_context_flush() is always in -preemptible context. - -Use tasklet_disable_in_atomic() for the two invocations in -ohci_cancel_packet() and ohci_flush_iso_completions(). - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Thomas Gleixner -Cc: Stefan Richter -Cc: linux1394-devel@lists.sourceforge.net -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/firewire/ohci.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/firewire/ohci.c -+++ b/drivers/firewire/ohci.c -@@ -2545,7 +2545,7 @@ static int ohci_cancel_packet(struct fw_ - struct driver_data *driver_data = packet->driver_data; - int ret = -ENOENT; - -- tasklet_disable(&ctx->tasklet); -+ tasklet_disable_in_atomic(&ctx->tasklet); - - if (packet->ack != 0) - goto out; -@@ -3465,7 +3465,7 @@ static int ohci_flush_iso_completions(st - struct iso_context *ctx = container_of(base, struct iso_context, base); - int ret = 0; - -- tasklet_disable(&ctx->context.tasklet); -+ tasklet_disable_in_atomic(&ctx->context.tasklet); - - if (!test_and_set_bit_lock(0, &ctx->flushing_completions)) { - context_tasklet((unsigned long)&ctx->context); diff --git a/kernel/patches-5.11.x-rt/0068-0014-tasklets-Switch-tasklet_disable-to-the-sleep-wait-va.patch b/kernel/patches-5.11.x-rt/0068-0014-tasklets-Switch-tasklet_disable-to-the-sleep-wait-va.patch deleted file mode 100644 index f9dd1b23ec..0000000000 --- a/kernel/patches-5.11.x-rt/0068-0014-tasklets-Switch-tasklet_disable-to-the-sleep-wait-va.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:42:17 +0100 -Subject: [PATCH 14/20] tasklets: Switch tasklet_disable() to the sleep wait - variant - - -- NOT FOR IMMEDIATE MERGING -- - -Now that all users of tasklet_disable() are invoked from sleepable context, -convert it to use tasklet_unlock_wait() which might sleep. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -716,8 +716,7 @@ static inline void tasklet_disable_in_at - static inline void tasklet_disable(struct tasklet_struct *t) - { - tasklet_disable_nosync(t); -- /* Spin wait until all atomic users are converted */ -- tasklet_unlock_spin_wait(t); -+ tasklet_unlock_wait(t); - smp_mb(); - } - diff --git a/kernel/patches-5.11.x-rt/0069-0015-softirq-Add-RT-specific-softirq-accounting.patch b/kernel/patches-5.11.x-rt/0069-0015-softirq-Add-RT-specific-softirq-accounting.patch deleted file mode 100644 index d5ebf2bda3..0000000000 --- a/kernel/patches-5.11.x-rt/0069-0015-softirq-Add-RT-specific-softirq-accounting.patch +++ /dev/null @@ -1,64 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:55:53 +0100 -Subject: [PATCH 15/20] softirq: Add RT specific softirq accounting - -RT requires the softirq processing and local bottomhalf disabled regions to -be preemptible. Using the normal preempt count based serialization is -therefore not possible because this implicitely disables preemption. - -RT kernels use a per CPU local lock to serialize bottomhalfs. As -local_bh_disable() can nest the lock can only be acquired on the outermost -invocation of local_bh_disable() and released when the nest count becomes -zero. Tasks which hold the local lock can be preempted so its required to -keep track of the nest count per task. - -Add a RT only counter to task struct and adjust the relevant macros in -preempt.h. - -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Reviewed-by: Frederic Weisbecker -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/hardirq.h | 1 + - include/linux/preempt.h | 6 +++++- - include/linux/sched.h | 3 +++ - 3 files changed, 9 insertions(+), 1 deletion(-) - ---- a/include/linux/hardirq.h -+++ b/include/linux/hardirq.h -@@ -6,6 +6,7 @@ - #include - #include - #include -+#include - #include - #include - ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -79,7 +79,11 @@ - - #define nmi_count() (preempt_count() & NMI_MASK) - #define hardirq_count() (preempt_count() & HARDIRQ_MASK) --#define softirq_count() (preempt_count() & SOFTIRQ_MASK) -+#ifdef CONFIG_PREEMPT_RT -+# define softirq_count() (current->softirq_disable_cnt & SOFTIRQ_MASK) -+#else -+# define softirq_count() (preempt_count() & SOFTIRQ_MASK) -+#endif - #define irq_count() (nmi_count() | hardirq_count() | softirq_count()) - - /* ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1040,6 +1040,9 @@ struct task_struct { - int softirq_context; - int irq_config; - #endif -+#ifdef CONFIG_PREEMPT_RT -+ int softirq_disable_cnt; -+#endif - - #ifdef CONFIG_LOCKDEP - # define MAX_LOCK_DEPTH 48UL diff --git a/kernel/patches-5.11.x-rt/0070-0016-irqtime-Make-accounting-correct-on-RT.patch b/kernel/patches-5.11.x-rt/0070-0016-irqtime-Make-accounting-correct-on-RT.patch deleted file mode 100644 index 1611182a99..0000000000 --- a/kernel/patches-5.11.x-rt/0070-0016-irqtime-Make-accounting-correct-on-RT.patch +++ /dev/null @@ -1,47 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:55:54 +0100 -Subject: [PATCH 16/20] irqtime: Make accounting correct on RT - -vtime_account_irq and irqtime_account_irq() base checks on preempt_count() -which fails on RT because preempt_count() does not contain the softirq -accounting which is seperate on RT. - -These checks do not need the full preempt count as they only operate on the -hard and softirq sections. - -Use irq_count() instead which provides the correct value on both RT and non -RT kernels. The compiler is clever enough to fold the masking for !RT: - - 99b: 65 8b 05 00 00 00 00 mov %gs:0x0(%rip),%eax - - 9a2: 25 ff ff ff 7f and $0x7fffffff,%eax - + 9a2: 25 00 ff ff 00 and $0xffff00,%eax - -Reported-by: Sebastian Andrzej Siewior -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Reviewed-by: Frederic Weisbecker -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/sched/cputime.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/kernel/sched/cputime.c -+++ b/kernel/sched/cputime.c -@@ -60,7 +60,7 @@ void irqtime_account_irq(struct task_str - cpu = smp_processor_id(); - delta = sched_clock_cpu(cpu) - irqtime->irq_start_time; - irqtime->irq_start_time += delta; -- pc = preempt_count() - offset; -+ pc = irq_count() - offset; - - /* - * We do not account for softirq time from ksoftirqd here. -@@ -421,7 +421,7 @@ void vtime_task_switch(struct task_struc - - void vtime_account_irq(struct task_struct *tsk, unsigned int offset) - { -- unsigned int pc = preempt_count() - offset; -+ unsigned int pc = irq_count() - offset; - - if (pc & HARDIRQ_OFFSET) { - vtime_account_hardirq(tsk); diff --git a/kernel/patches-5.11.x-rt/0071-0017-softirq-Move-various-protections-into-inline-helpers.patch b/kernel/patches-5.11.x-rt/0071-0017-softirq-Move-various-protections-into-inline-helpers.patch deleted file mode 100644 index e883278566..0000000000 --- a/kernel/patches-5.11.x-rt/0071-0017-softirq-Move-various-protections-into-inline-helpers.patch +++ /dev/null @@ -1,101 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:55:55 +0100 -Subject: [PATCH 17/20] softirq: Move various protections into inline helpers - -To allow reuse of the bulk of softirq processing code for RT and to avoid -#ifdeffery all over the place, split protections for various code sections -out into inline helpers so the RT variant can just replace them in one go. - -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Reviewed-by: Frederic Weisbecker -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/softirq.c | 39 ++++++++++++++++++++++++++++++++------- - 1 file changed, 32 insertions(+), 7 deletions(-) - ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -205,6 +205,32 @@ void __local_bh_enable_ip(unsigned long - } - EXPORT_SYMBOL(__local_bh_enable_ip); - -+static inline void softirq_handle_begin(void) -+{ -+ __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); -+} -+ -+static inline void softirq_handle_end(void) -+{ -+ __local_bh_enable(SOFTIRQ_OFFSET); -+ WARN_ON_ONCE(in_interrupt()); -+} -+ -+static inline void ksoftirqd_run_begin(void) -+{ -+ local_irq_disable(); -+} -+ -+static inline void ksoftirqd_run_end(void) -+{ -+ local_irq_enable(); -+} -+ -+static inline bool should_wake_ksoftirqd(void) -+{ -+ return true; -+} -+ - static inline void invoke_softirq(void) - { - if (ksoftirqd_running(local_softirq_pending())) -@@ -317,7 +343,7 @@ asmlinkage __visible void __softirq_entr - - pending = local_softirq_pending(); - -- __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); -+ softirq_handle_begin(); - in_hardirq = lockdep_softirq_start(); - account_softirq_enter(current); - -@@ -368,8 +394,7 @@ asmlinkage __visible void __softirq_entr - - account_softirq_exit(current); - lockdep_softirq_end(in_hardirq); -- __local_bh_enable(SOFTIRQ_OFFSET); -- WARN_ON_ONCE(in_interrupt()); -+ softirq_handle_end(); - current_restore_flags(old_flags, PF_MEMALLOC); - } - -@@ -464,7 +489,7 @@ inline void raise_softirq_irqoff(unsigne - * Otherwise we wake up ksoftirqd to make sure we - * schedule the softirq soon. - */ -- if (!in_interrupt()) -+ if (!in_interrupt() && should_wake_ksoftirqd()) - wakeup_softirqd(); - } - -@@ -692,18 +717,18 @@ static int ksoftirqd_should_run(unsigned - - static void run_ksoftirqd(unsigned int cpu) - { -- local_irq_disable(); -+ ksoftirqd_run_begin(); - if (local_softirq_pending()) { - /* - * We can safely run softirq on inline stack, as we are not deep - * in the task stack here. - */ - __do_softirq(); -- local_irq_enable(); -+ ksoftirqd_run_end(); - cond_resched(); - return; - } -- local_irq_enable(); -+ ksoftirqd_run_end(); - } - - #ifdef CONFIG_HOTPLUG_CPU diff --git a/kernel/patches-5.11.x-rt/0072-0018-softirq-Make-softirq-control-and-processing-RT-aware.patch b/kernel/patches-5.11.x-rt/0072-0018-softirq-Make-softirq-control-and-processing-RT-aware.patch deleted file mode 100644 index d548842a9e..0000000000 --- a/kernel/patches-5.11.x-rt/0072-0018-softirq-Make-softirq-control-and-processing-RT-aware.patch +++ /dev/null @@ -1,258 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:55:56 +0100 -Subject: [PATCH 18/20] softirq: Make softirq control and processing RT aware - -Provide a local lock based serialization for soft interrupts on RT which -allows the local_bh_disabled() sections and servicing soft interrupts to be -preemptible. - -Provide the necessary inline helpers which allow to reuse the bulk of the -softirq processing code. - -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Reviewed-by: Frederic Weisbecker -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/bottom_half.h | 2 - kernel/softirq.c | 188 ++++++++++++++++++++++++++++++++++++++++++-- - 2 files changed, 182 insertions(+), 8 deletions(-) - ---- a/include/linux/bottom_half.h -+++ b/include/linux/bottom_half.h -@@ -4,7 +4,7 @@ - - #include - --#ifdef CONFIG_TRACE_IRQFLAGS -+#if defined(CONFIG_PREEMPT_RT) || defined(CONFIG_TRACE_IRQFLAGS) - extern void __local_bh_disable_ip(unsigned long ip, unsigned int cnt); - #else - static __always_inline void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -101,20 +102,189 @@ EXPORT_PER_CPU_SYMBOL_GPL(hardirq_contex - #endif - - /* -- * preempt_count and SOFTIRQ_OFFSET usage: -- * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving -- * softirq processing. -- * - preempt_count is changed by SOFTIRQ_DISABLE_OFFSET (= 2 * SOFTIRQ_OFFSET) -+ * SOFTIRQ_OFFSET usage: -+ * -+ * On !RT kernels 'count' is the preempt counter, on RT kernels this applies -+ * to a per CPU counter and to task::softirqs_disabled_cnt. -+ * -+ * - count is changed by SOFTIRQ_OFFSET on entering or leaving softirq -+ * processing. -+ * -+ * - count is changed by SOFTIRQ_DISABLE_OFFSET (= 2 * SOFTIRQ_OFFSET) - * on local_bh_disable or local_bh_enable. -+ * - * This lets us distinguish between whether we are currently processing - * softirq and whether we just have bh disabled. - */ -+#ifdef CONFIG_PREEMPT_RT -+ -+/* -+ * RT accounts for BH disabled sections in task::softirqs_disabled_cnt and -+ * also in per CPU softirq_ctrl::cnt. This is necessary to allow tasks in a -+ * softirq disabled section to be preempted. -+ * -+ * The per task counter is used for softirq_count(), in_softirq() and -+ * in_serving_softirqs() because these counts are only valid when the task -+ * holding softirq_ctrl::lock is running. -+ * -+ * The per CPU counter prevents pointless wakeups of ksoftirqd in case that -+ * the task which is in a softirq disabled section is preempted or blocks. -+ */ -+struct softirq_ctrl { -+ local_lock_t lock; -+ int cnt; -+}; -+ -+static DEFINE_PER_CPU(struct softirq_ctrl, softirq_ctrl) = { -+ .lock = INIT_LOCAL_LOCK(softirq_ctrl.lock), -+}; -+ -+void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) -+{ -+ unsigned long flags; -+ int newcnt; -+ -+ WARN_ON_ONCE(in_hardirq()); -+ -+ /* First entry of a task into a BH disabled section? */ -+ if (!current->softirq_disable_cnt) { -+ if (preemptible()) { -+ local_lock(&softirq_ctrl.lock); -+ /* Required to meet the RCU bottomhalf requirements. */ -+ rcu_read_lock(); -+ } else { -+ DEBUG_LOCKS_WARN_ON(this_cpu_read(softirq_ctrl.cnt)); -+ } -+ } -+ -+ /* -+ * Track the per CPU softirq disabled state. On RT this is per CPU -+ * state to allow preemption of bottom half disabled sections. -+ */ -+ newcnt = __this_cpu_add_return(softirq_ctrl.cnt, cnt); -+ /* -+ * Reflect the result in the task state to prevent recursion on the -+ * local lock and to make softirq_count() & al work. -+ */ -+ current->softirq_disable_cnt = newcnt; -+ -+ if (IS_ENABLED(CONFIG_TRACE_IRQFLAGS) && newcnt == cnt) { -+ raw_local_irq_save(flags); -+ lockdep_softirqs_off(ip); -+ raw_local_irq_restore(flags); -+ } -+} -+EXPORT_SYMBOL(__local_bh_disable_ip); -+ -+static void __local_bh_enable(unsigned int cnt, bool unlock) -+{ -+ unsigned long flags; -+ int newcnt; -+ -+ DEBUG_LOCKS_WARN_ON(current->softirq_disable_cnt != -+ this_cpu_read(softirq_ctrl.cnt)); -+ -+ if (IS_ENABLED(CONFIG_TRACE_IRQFLAGS) && softirq_count() == cnt) { -+ raw_local_irq_save(flags); -+ lockdep_softirqs_on(_RET_IP_); -+ raw_local_irq_restore(flags); -+ } -+ -+ newcnt = __this_cpu_sub_return(softirq_ctrl.cnt, cnt); -+ current->softirq_disable_cnt = newcnt; -+ -+ if (!newcnt && unlock) { -+ rcu_read_unlock(); -+ local_unlock(&softirq_ctrl.lock); -+ } -+} -+ -+void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) -+{ -+ bool preempt_on = preemptible(); -+ unsigned long flags; -+ u32 pending; -+ int curcnt; -+ -+ WARN_ON_ONCE(in_irq()); -+ lockdep_assert_irqs_enabled(); -+ -+ local_irq_save(flags); -+ curcnt = __this_cpu_read(softirq_ctrl.cnt); -+ -+ /* -+ * If this is not reenabling soft interrupts, no point in trying to -+ * run pending ones. -+ */ -+ if (curcnt != cnt) -+ goto out; -+ -+ pending = local_softirq_pending(); -+ if (!pending || ksoftirqd_running(pending)) -+ goto out; -+ -+ /* -+ * If this was called from non preemptible context, wake up the -+ * softirq daemon. -+ */ -+ if (!preempt_on) { -+ wakeup_softirqd(); -+ goto out; -+ } -+ -+ /* -+ * Adjust softirq count to SOFTIRQ_OFFSET which makes -+ * in_serving_softirq() become true. -+ */ -+ cnt = SOFTIRQ_OFFSET; -+ __local_bh_enable(cnt, false); -+ __do_softirq(); -+ -+out: -+ __local_bh_enable(cnt, preempt_on); -+ local_irq_restore(flags); -+} -+EXPORT_SYMBOL(__local_bh_enable_ip); -+ -+/* -+ * Invoked from ksoftirqd_run() outside of the interrupt disabled section -+ * to acquire the per CPU local lock for reentrancy protection. -+ */ -+static inline void ksoftirqd_run_begin(void) -+{ -+ __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); -+ local_irq_disable(); -+} -+ -+/* Counterpart to ksoftirqd_run_begin() */ -+static inline void ksoftirqd_run_end(void) -+{ -+ __local_bh_enable(SOFTIRQ_OFFSET, true); -+ WARN_ON_ONCE(in_interrupt()); -+ local_irq_enable(); -+} -+ -+static inline void softirq_handle_begin(void) { } -+static inline void softirq_handle_end(void) { } -+ -+static inline bool should_wake_ksoftirqd(void) -+{ -+ return !this_cpu_read(softirq_ctrl.cnt); -+} -+ -+static inline void invoke_softirq(void) -+{ -+ if (should_wake_ksoftirqd()) -+ wakeup_softirqd(); -+} -+ -+#else /* CONFIG_PREEMPT_RT */ - --#ifdef CONFIG_TRACE_IRQFLAGS - /* -- * This is for softirq.c-internal use, where hardirqs are disabled -+ * This one is for softirq.c-internal use, where hardirqs are disabled - * legitimately: - */ -+#ifdef CONFIG_TRACE_IRQFLAGS - void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) - { - unsigned long flags; -@@ -275,6 +445,8 @@ asmlinkage __visible void do_softirq(voi - local_irq_restore(flags); - } - -+#endif /* !CONFIG_PREEMPT_RT */ -+ - /* - * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times, - * but break the loop if need_resched() is set or after 2 ms. -@@ -379,8 +551,10 @@ asmlinkage __visible void __softirq_entr - pending >>= softirq_bit; - } - -- if (__this_cpu_read(ksoftirqd) == current) -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT) && -+ __this_cpu_read(ksoftirqd) == current) - rcu_softirq_qs(); -+ - local_irq_disable(); - - pending = local_softirq_pending(); diff --git a/kernel/patches-5.11.x-rt/0073-0019-tick-sched-Prevent-false-positive-softirq-pending-wa.patch b/kernel/patches-5.11.x-rt/0073-0019-tick-sched-Prevent-false-positive-softirq-pending-wa.patch deleted file mode 100644 index 3d3a12d23d..0000000000 --- a/kernel/patches-5.11.x-rt/0073-0019-tick-sched-Prevent-false-positive-softirq-pending-wa.patch +++ /dev/null @@ -1,73 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:55:57 +0100 -Subject: [PATCH 19/20] tick/sched: Prevent false positive softirq pending - warnings on RT - -On RT a task which has soft interrupts disabled can block on a lock and -schedule out to idle while soft interrupts are pending. This triggers the -warning in the NOHZ idle code which complains about going idle with pending -soft interrupts. But as the task is blocked soft interrupt processing is -temporarily blocked as well which means that such a warning is a false -positive. - -To prevent that check the per CPU state which indicates that a scheduled -out task has soft interrupts disabled. - -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Reviewed-by: Frederic Weisbecker -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/bottom_half.h | 6 ++++++ - kernel/softirq.c | 15 +++++++++++++++ - kernel/time/tick-sched.c | 2 +- - 3 files changed, 22 insertions(+), 1 deletion(-) - ---- a/include/linux/bottom_half.h -+++ b/include/linux/bottom_half.h -@@ -32,4 +32,10 @@ static inline void local_bh_enable(void) - __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET); - } - -+#ifdef CONFIG_PREEMPT_RT -+extern bool local_bh_blocked(void); -+#else -+static inline bool local_bh_blocked(void) { return false; } -+#endif -+ - #endif /* _LINUX_BH_H */ ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -139,6 +139,21 @@ static DEFINE_PER_CPU(struct softirq_ctr - .lock = INIT_LOCAL_LOCK(softirq_ctrl.lock), - }; - -+/** -+ * local_bh_blocked() - Check for idle whether BH processing is blocked -+ * -+ * Returns false if the per CPU softirq::cnt is 0 otherwise true. -+ * -+ * This is invoked from the idle task to guard against false positive -+ * softirq pending warnings, which would happen when the task which holds -+ * softirq_ctrl::lock was the only running task on the CPU and blocks on -+ * some other lock. -+ */ -+bool local_bh_blocked(void) -+{ -+ return __this_cpu_read(softirq_ctrl.cnt) != 0; -+} -+ - void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) - { - unsigned long flags; ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -973,7 +973,7 @@ static bool can_stop_idle_tick(int cpu, - if (unlikely(local_softirq_pending())) { - static int ratelimit; - -- if (ratelimit < 10 && -+ if (ratelimit < 10 && !local_bh_blocked() && - (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { - pr_warn("NOHZ tick-stop error: Non-RCU local softirq work is pending, handler #%02x!!!\n", - (unsigned int) local_softirq_pending()); diff --git a/kernel/patches-5.11.x-rt/0074-0020-rcu-Prevent-false-positive-softirq-warning-on-RT.patch b/kernel/patches-5.11.x-rt/0074-0020-rcu-Prevent-false-positive-softirq-warning-on-RT.patch deleted file mode 100644 index 13f42f6f5c..0000000000 --- a/kernel/patches-5.11.x-rt/0074-0020-rcu-Prevent-false-positive-softirq-warning-on-RT.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 9 Mar 2021 09:55:58 +0100 -Subject: [PATCH 20/20] rcu: Prevent false positive softirq warning on RT - -Soft interrupt disabled sections can legitimately be preempted or schedule -out when blocking on a lock on RT enabled kernels so the RCU preempt check -warning has to be disabled for RT kernels. - -Signed-off-by: Thomas Gleixner -Tested-by: Sebastian Andrzej Siewior -Reviewed-by: Paul E. McKenney -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rcupdate.h | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -328,7 +328,8 @@ static inline void rcu_preempt_sleep_che - #define rcu_sleep_check() \ - do { \ - rcu_preempt_sleep_check(); \ -- RCU_LOCKDEP_WARN(lock_is_held(&rcu_bh_lock_map), \ -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) \ -+ RCU_LOCKDEP_WARN(lock_is_held(&rcu_bh_lock_map), \ - "Illegal context switch in RCU-bh read-side critical section"); \ - RCU_LOCKDEP_WARN(lock_is_held(&rcu_sched_lock_map), \ - "Illegal context switch in RCU-sched read-side critical section"); \ diff --git a/kernel/patches-5.11.x-rt/0075-0001-chelsio-cxgb-Replace-the-workqueue-with-threaded-int.patch b/kernel/patches-5.11.x-rt/0075-0001-chelsio-cxgb-Replace-the-workqueue-with-threaded-int.patch deleted file mode 100644 index 20c8e4962d..0000000000 --- a/kernel/patches-5.11.x-rt/0075-0001-chelsio-cxgb-Replace-the-workqueue-with-threaded-int.patch +++ /dev/null @@ -1,256 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 2 Feb 2021 18:01:03 +0100 -Subject: [PATCH 1/2] chelsio: cxgb: Replace the workqueue with threaded - interrupt - -The external interrupt (F_PL_INTR_EXT) needs to be handled in a process -context and this is accomplished by utilizing a workqueue. - -The process context can also be provided by a threaded interrupt instead -of a workqueue. The threaded interrupt can be used later for other -interrupt related processing which require non-atomic context without -using yet another workqueue. free_irq() also ensures that the thread is -done which is currently missing (the worker could continue after the -module has been removed). - -Save pending flags in pending_thread_intr. Use the same mechanism -to disable F_PL_INTR_EXT as interrupt source like it is used before the -worker is scheduled. Enable the interrupt again once -t1_elmer0_ext_intr_handler() is done. - -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/net/ethernet/chelsio/cxgb/common.h | 5 +-- - drivers/net/ethernet/chelsio/cxgb/cxgb2.c | 44 ++--------------------------- - drivers/net/ethernet/chelsio/cxgb/sge.c | 33 +++++++++++++++++++-- - drivers/net/ethernet/chelsio/cxgb/sge.h | 1 - drivers/net/ethernet/chelsio/cxgb/subr.c | 26 +++++++++++------ - 5 files changed, 55 insertions(+), 54 deletions(-) - ---- a/drivers/net/ethernet/chelsio/cxgb/common.h -+++ b/drivers/net/ethernet/chelsio/cxgb/common.h -@@ -238,7 +238,6 @@ struct adapter { - int msg_enable; - u32 mmio_len; - -- struct work_struct ext_intr_handler_task; - struct adapter_params params; - - /* Terminator modules. */ -@@ -257,6 +256,7 @@ struct adapter { - - /* guards async operations */ - spinlock_t async_lock ____cacheline_aligned; -+ u32 pending_thread_intr; - u32 slow_intr_mask; - int t1powersave; - }; -@@ -334,8 +334,7 @@ void t1_interrupts_enable(adapter_t *ada - void t1_interrupts_disable(adapter_t *adapter); - void t1_interrupts_clear(adapter_t *adapter); - int t1_elmer0_ext_intr_handler(adapter_t *adapter); --void t1_elmer0_ext_intr(adapter_t *adapter); --int t1_slow_intr_handler(adapter_t *adapter); -+irqreturn_t t1_slow_intr_handler(adapter_t *adapter); - - int t1_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc); - const struct board_info *t1_get_board_info(unsigned int board_id); ---- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c -+++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c -@@ -211,9 +211,10 @@ static int cxgb_up(struct adapter *adapt - t1_interrupts_clear(adapter); - - adapter->params.has_msi = !disable_msi && !pci_enable_msi(adapter->pdev); -- err = request_irq(adapter->pdev->irq, t1_interrupt, -- adapter->params.has_msi ? 0 : IRQF_SHARED, -- adapter->name, adapter); -+ err = request_threaded_irq(adapter->pdev->irq, t1_interrupt, -+ t1_interrupt_thread, -+ adapter->params.has_msi ? 0 : IRQF_SHARED, -+ adapter->name, adapter); - if (err) { - if (adapter->params.has_msi) - pci_disable_msi(adapter->pdev); -@@ -916,41 +917,6 @@ static void mac_stats_task(struct work_s - spin_unlock(&adapter->work_lock); - } - --/* -- * Processes elmer0 external interrupts in process context. -- */ --static void ext_intr_task(struct work_struct *work) --{ -- struct adapter *adapter = -- container_of(work, struct adapter, ext_intr_handler_task); -- -- t1_elmer0_ext_intr_handler(adapter); -- -- /* Now reenable external interrupts */ -- spin_lock_irq(&adapter->async_lock); -- adapter->slow_intr_mask |= F_PL_INTR_EXT; -- writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE); -- writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, -- adapter->regs + A_PL_ENABLE); -- spin_unlock_irq(&adapter->async_lock); --} -- --/* -- * Interrupt-context handler for elmer0 external interrupts. -- */ --void t1_elmer0_ext_intr(struct adapter *adapter) --{ -- /* -- * Schedule a task to handle external interrupts as we require -- * a process context. We disable EXT interrupts in the interim -- * and let the task reenable them when it's done. -- */ -- adapter->slow_intr_mask &= ~F_PL_INTR_EXT; -- writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, -- adapter->regs + A_PL_ENABLE); -- schedule_work(&adapter->ext_intr_handler_task); --} -- - void t1_fatal_err(struct adapter *adapter) - { - if (adapter->flags & FULL_INIT_DONE) { -@@ -1062,8 +1028,6 @@ static int init_one(struct pci_dev *pdev - spin_lock_init(&adapter->async_lock); - spin_lock_init(&adapter->mac_lock); - -- INIT_WORK(&adapter->ext_intr_handler_task, -- ext_intr_task); - INIT_DELAYED_WORK(&adapter->stats_update_task, - mac_stats_task); - ---- a/drivers/net/ethernet/chelsio/cxgb/sge.c -+++ b/drivers/net/ethernet/chelsio/cxgb/sge.c -@@ -1619,11 +1619,38 @@ int t1_poll(struct napi_struct *napi, in - return work_done; - } - -+irqreturn_t t1_interrupt_thread(int irq, void *data) -+{ -+ struct adapter *adapter = data; -+ u32 pending_thread_intr; -+ -+ spin_lock_irq(&adapter->async_lock); -+ pending_thread_intr = adapter->pending_thread_intr; -+ adapter->pending_thread_intr = 0; -+ spin_unlock_irq(&adapter->async_lock); -+ -+ if (!pending_thread_intr) -+ return IRQ_NONE; -+ -+ if (pending_thread_intr & F_PL_INTR_EXT) -+ t1_elmer0_ext_intr_handler(adapter); -+ -+ spin_lock_irq(&adapter->async_lock); -+ adapter->slow_intr_mask |= F_PL_INTR_EXT; -+ -+ writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE); -+ writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, -+ adapter->regs + A_PL_ENABLE); -+ spin_unlock_irq(&adapter->async_lock); -+ -+ return IRQ_HANDLED; -+} -+ - irqreturn_t t1_interrupt(int irq, void *data) - { - struct adapter *adapter = data; - struct sge *sge = adapter->sge; -- int handled; -+ irqreturn_t handled; - - if (likely(responses_pending(adapter))) { - writel(F_PL_INTR_SGE_DATA, adapter->regs + A_PL_CAUSE); -@@ -1645,10 +1672,10 @@ irqreturn_t t1_interrupt(int irq, void * - handled = t1_slow_intr_handler(adapter); - spin_unlock(&adapter->async_lock); - -- if (!handled) -+ if (handled == IRQ_NONE) - sge->stats.unhandled_irqs++; - -- return IRQ_RETVAL(handled != 0); -+ return handled; - } - - /* ---- a/drivers/net/ethernet/chelsio/cxgb/sge.h -+++ b/drivers/net/ethernet/chelsio/cxgb/sge.h -@@ -74,6 +74,7 @@ struct sge *t1_sge_create(struct adapter - int t1_sge_configure(struct sge *, struct sge_params *); - int t1_sge_set_coalesce_params(struct sge *, struct sge_params *); - void t1_sge_destroy(struct sge *); -+irqreturn_t t1_interrupt_thread(int irq, void *data); - irqreturn_t t1_interrupt(int irq, void *cookie); - int t1_poll(struct napi_struct *, int); - ---- a/drivers/net/ethernet/chelsio/cxgb/subr.c -+++ b/drivers/net/ethernet/chelsio/cxgb/subr.c -@@ -210,7 +210,7 @@ static int fpga_phy_intr_handler(adapter - /* - * Slow path interrupt handler for FPGAs. - */ --static int fpga_slow_intr(adapter_t *adapter) -+static irqreturn_t fpga_slow_intr(adapter_t *adapter) - { - u32 cause = readl(adapter->regs + A_PL_CAUSE); - -@@ -238,7 +238,7 @@ static int fpga_slow_intr(adapter_t *ada - if (cause) - writel(cause, adapter->regs + A_PL_CAUSE); - -- return cause != 0; -+ return cause == 0 ? IRQ_NONE : IRQ_HANDLED; - } - #endif - -@@ -842,13 +842,14 @@ void t1_interrupts_clear(adapter_t* adap - /* - * Slow path interrupt handler for ASICs. - */ --static int asic_slow_intr(adapter_t *adapter) -+static irqreturn_t asic_slow_intr(adapter_t *adapter) - { - u32 cause = readl(adapter->regs + A_PL_CAUSE); -+ irqreturn_t ret = IRQ_HANDLED; - - cause &= adapter->slow_intr_mask; - if (!cause) -- return 0; -+ return IRQ_NONE; - if (cause & F_PL_INTR_SGE_ERR) - t1_sge_intr_error_handler(adapter->sge); - if (cause & F_PL_INTR_TP) -@@ -857,16 +858,25 @@ static int asic_slow_intr(adapter_t *ada - t1_espi_intr_handler(adapter->espi); - if (cause & F_PL_INTR_PCIX) - t1_pci_intr_handler(adapter); -- if (cause & F_PL_INTR_EXT) -- t1_elmer0_ext_intr(adapter); -+ if (cause & F_PL_INTR_EXT) { -+ /* Wake the threaded interrupt to handle external interrupts as -+ * we require a process context. We disable EXT interrupts in -+ * the interim and let the thread reenable them when it's done. -+ */ -+ adapter->pending_thread_intr |= F_PL_INTR_EXT; -+ adapter->slow_intr_mask &= ~F_PL_INTR_EXT; -+ writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, -+ adapter->regs + A_PL_ENABLE); -+ ret = IRQ_WAKE_THREAD; -+ } - - /* Clear the interrupts just processed. */ - writel(cause, adapter->regs + A_PL_CAUSE); - readl(adapter->regs + A_PL_CAUSE); /* flush writes */ -- return 1; -+ return ret; - } - --int t1_slow_intr_handler(adapter_t *adapter) -+irqreturn_t t1_slow_intr_handler(adapter_t *adapter) - { - #ifdef CONFIG_CHELSIO_T1_1G - if (!t1_is_asic(adapter)) diff --git a/kernel/patches-5.11.x-rt/0076-0002-chelsio-cxgb-Disable-the-card-on-error-in-threaded-i.patch b/kernel/patches-5.11.x-rt/0076-0002-chelsio-cxgb-Disable-the-card-on-error-in-threaded-i.patch deleted file mode 100644 index 453d8105e5..0000000000 --- a/kernel/patches-5.11.x-rt/0076-0002-chelsio-cxgb-Disable-the-card-on-error-in-threaded-i.patch +++ /dev/null @@ -1,200 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 2 Feb 2021 18:01:04 +0100 -Subject: [PATCH 2/2] chelsio: cxgb: Disable the card on error in threaded - interrupt - -t1_fatal_err() is invoked from the interrupt handler. The bad part is -that it invokes (via t1_sge_stop()) del_timer_sync() and tasklet_kill(). -Both functions must not be called from an interrupt because it is -possible that it will wait for the completion of the timer/tasklet it -just interrupted. - -In case of a fatal error, use t1_interrupts_disable() to disable all -interrupt sources and then wake the interrupt thread with -F_PL_INTR_SGE_ERR as pending flag. The threaded-interrupt will stop the -card via t1_sge_stop() and not re-enable the interrupts again. - -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/net/ethernet/chelsio/cxgb/common.h | 1 - drivers/net/ethernet/chelsio/cxgb/cxgb2.c | 10 ------- - drivers/net/ethernet/chelsio/cxgb/sge.c | 20 ++++++++++++--- - drivers/net/ethernet/chelsio/cxgb/sge.h | 2 - - drivers/net/ethernet/chelsio/cxgb/subr.c | 38 ++++++++++++++++++++--------- - 5 files changed, 44 insertions(+), 27 deletions(-) - ---- a/drivers/net/ethernet/chelsio/cxgb/common.h -+++ b/drivers/net/ethernet/chelsio/cxgb/common.h -@@ -346,7 +346,6 @@ int t1_get_board_rev(adapter_t *adapter, - int t1_init_hw_modules(adapter_t *adapter); - int t1_init_sw_modules(adapter_t *adapter, const struct board_info *bi); - void t1_free_sw_modules(adapter_t *adapter); --void t1_fatal_err(adapter_t *adapter); - void t1_link_changed(adapter_t *adapter, int port_id); - void t1_link_negotiated(adapter_t *adapter, int port_id, int link_stat, - int speed, int duplex, int pause); ---- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c -+++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c -@@ -917,16 +917,6 @@ static void mac_stats_task(struct work_s - spin_unlock(&adapter->work_lock); - } - --void t1_fatal_err(struct adapter *adapter) --{ -- if (adapter->flags & FULL_INIT_DONE) { -- t1_sge_stop(adapter->sge); -- t1_interrupts_disable(adapter); -- } -- pr_alert("%s: encountered fatal error, operation suspended\n", -- adapter->name); --} -- - static const struct net_device_ops cxgb_netdev_ops = { - .ndo_open = cxgb_open, - .ndo_stop = cxgb_close, ---- a/drivers/net/ethernet/chelsio/cxgb/sge.c -+++ b/drivers/net/ethernet/chelsio/cxgb/sge.c -@@ -940,10 +940,11 @@ void t1_sge_intr_clear(struct sge *sge) - /* - * SGE 'Error' interrupt handler - */ --int t1_sge_intr_error_handler(struct sge *sge) -+bool t1_sge_intr_error_handler(struct sge *sge) - { - struct adapter *adapter = sge->adapter; - u32 cause = readl(adapter->regs + A_SG_INT_CAUSE); -+ bool wake = false; - - if (adapter->port[0].dev->hw_features & NETIF_F_TSO) - cause &= ~F_PACKET_TOO_BIG; -@@ -967,11 +968,14 @@ int t1_sge_intr_error_handler(struct sge - sge->stats.pkt_mismatch++; - pr_alert("%s: SGE packet mismatch\n", adapter->name); - } -- if (cause & SGE_INT_FATAL) -- t1_fatal_err(adapter); -+ if (cause & SGE_INT_FATAL) { -+ t1_interrupts_disable(adapter); -+ adapter->pending_thread_intr |= F_PL_INTR_SGE_ERR; -+ wake = true; -+ } - - writel(cause, adapter->regs + A_SG_INT_CAUSE); -- return 0; -+ return wake; - } - - const struct sge_intr_counts *t1_sge_get_intr_counts(const struct sge *sge) -@@ -1635,6 +1639,14 @@ irqreturn_t t1_interrupt_thread(int irq, - if (pending_thread_intr & F_PL_INTR_EXT) - t1_elmer0_ext_intr_handler(adapter); - -+ /* This error is fatal, interrupts remain off */ -+ if (pending_thread_intr & F_PL_INTR_SGE_ERR) { -+ pr_alert("%s: encountered fatal error, operation suspended\n", -+ adapter->name); -+ t1_sge_stop(adapter->sge); -+ return IRQ_HANDLED; -+ } -+ - spin_lock_irq(&adapter->async_lock); - adapter->slow_intr_mask |= F_PL_INTR_EXT; - ---- a/drivers/net/ethernet/chelsio/cxgb/sge.h -+++ b/drivers/net/ethernet/chelsio/cxgb/sge.h -@@ -82,7 +82,7 @@ netdev_tx_t t1_start_xmit(struct sk_buff - void t1_vlan_mode(struct adapter *adapter, netdev_features_t features); - void t1_sge_start(struct sge *); - void t1_sge_stop(struct sge *); --int t1_sge_intr_error_handler(struct sge *); -+bool t1_sge_intr_error_handler(struct sge *sge); - void t1_sge_intr_enable(struct sge *); - void t1_sge_intr_disable(struct sge *); - void t1_sge_intr_clear(struct sge *); ---- a/drivers/net/ethernet/chelsio/cxgb/subr.c -+++ b/drivers/net/ethernet/chelsio/cxgb/subr.c -@@ -170,7 +170,7 @@ void t1_link_changed(adapter_t *adapter, - t1_link_negotiated(adapter, port_id, link_ok, speed, duplex, fc); - } - --static int t1_pci_intr_handler(adapter_t *adapter) -+static bool t1_pci_intr_handler(adapter_t *adapter) - { - u32 pcix_cause; - -@@ -179,9 +179,13 @@ static int t1_pci_intr_handler(adapter_t - if (pcix_cause) { - pci_write_config_dword(adapter->pdev, A_PCICFG_INTR_CAUSE, - pcix_cause); -- t1_fatal_err(adapter); /* PCI errors are fatal */ -+ /* PCI errors are fatal */ -+ t1_interrupts_disable(adapter); -+ adapter->pending_thread_intr |= F_PL_INTR_SGE_ERR; -+ pr_alert("%s: PCI error encountered.\n", adapter->name); -+ return true; - } -- return 0; -+ return false; - } - - #ifdef CONFIG_CHELSIO_T1_1G -@@ -213,10 +217,13 @@ static int fpga_phy_intr_handler(adapter - static irqreturn_t fpga_slow_intr(adapter_t *adapter) - { - u32 cause = readl(adapter->regs + A_PL_CAUSE); -+ irqreturn_t ret = IRQ_NONE; - - cause &= ~F_PL_INTR_SGE_DATA; -- if (cause & F_PL_INTR_SGE_ERR) -- t1_sge_intr_error_handler(adapter->sge); -+ if (cause & F_PL_INTR_SGE_ERR) { -+ if (t1_sge_intr_error_handler(adapter->sge)) -+ ret = IRQ_WAKE_THREAD; -+ } - - if (cause & FPGA_PCIX_INTERRUPT_GMAC) - fpga_phy_intr_handler(adapter); -@@ -231,13 +238,18 @@ static irqreturn_t fpga_slow_intr(adapte - /* Clear TP interrupt */ - writel(tp_cause, adapter->regs + FPGA_TP_ADDR_INTERRUPT_CAUSE); - } -- if (cause & FPGA_PCIX_INTERRUPT_PCIX) -- t1_pci_intr_handler(adapter); -+ if (cause & FPGA_PCIX_INTERRUPT_PCIX) { -+ if (t1_pci_intr_handler(adapter)) -+ ret = IRQ_WAKE_THREAD; -+ } - - /* Clear the interrupts just processed. */ - if (cause) - writel(cause, adapter->regs + A_PL_CAUSE); - -+ if (ret != IRQ_NONE) -+ return ret; -+ - return cause == 0 ? IRQ_NONE : IRQ_HANDLED; - } - #endif -@@ -850,14 +862,18 @@ static irqreturn_t asic_slow_intr(adapte - cause &= adapter->slow_intr_mask; - if (!cause) - return IRQ_NONE; -- if (cause & F_PL_INTR_SGE_ERR) -- t1_sge_intr_error_handler(adapter->sge); -+ if (cause & F_PL_INTR_SGE_ERR) { -+ if (t1_sge_intr_error_handler(adapter->sge)) -+ ret = IRQ_WAKE_THREAD; -+ } - if (cause & F_PL_INTR_TP) - t1_tp_intr_handler(adapter->tp); - if (cause & F_PL_INTR_ESPI) - t1_espi_intr_handler(adapter->espi); -- if (cause & F_PL_INTR_PCIX) -- t1_pci_intr_handler(adapter); -+ if (cause & F_PL_INTR_PCIX) { -+ if (t1_pci_intr_handler(adapter)) -+ ret = IRQ_WAKE_THREAD; -+ } - if (cause & F_PL_INTR_EXT) { - /* Wake the threaded interrupt to handle external interrupts as - * we require a process context. We disable EXT interrupts in diff --git a/kernel/patches-5.11.x-rt/0077-0001-locking-rtmutex-Remove-cruft.patch b/kernel/patches-5.11.x-rt/0077-0001-locking-rtmutex-Remove-cruft.patch deleted file mode 100644 index 7e9c2e00ab..0000000000 --- a/kernel/patches-5.11.x-rt/0077-0001-locking-rtmutex-Remove-cruft.patch +++ /dev/null @@ -1,86 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 29 Sep 2020 15:21:17 +0200 -Subject: [PATCH 01/22] locking/rtmutex: Remove cruft - -Most of this is around since the very beginning. I'm not sure if this -was used while the rtmutex-deadlock-tester was around but today it seems -to only waste memory: -- save_state: No users -- name: Assigned and printed if a dead lock was detected. I'm keeping it - but want to point out that lockdep has the same information. -- file + line: Printed if ::name was NULL. This is only used for - in-kernel locks so it ::name shouldn't be NULL and then ::file and - ::line isn't used. -- magic: Assigned to NULL by rt_mutex_destroy(). - -Remove members of rt_mutex which are not used. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rtmutex.h | 7 ++----- - kernel/locking/rtmutex-debug.c | 7 +------ - kernel/locking/rtmutex.c | 3 --- - kernel/locking/rtmutex_common.h | 1 - - 4 files changed, 3 insertions(+), 15 deletions(-) - ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -32,10 +32,7 @@ struct rt_mutex { - struct rb_root_cached waiters; - struct task_struct *owner; - #ifdef CONFIG_DEBUG_RT_MUTEXES -- int save_state; -- const char *name, *file; -- int line; -- void *magic; -+ const char *name; - #endif - #ifdef CONFIG_DEBUG_LOCK_ALLOC - struct lockdep_map dep_map; -@@ -60,7 +57,7 @@ struct hrtimer_sleeper; - - #ifdef CONFIG_DEBUG_RT_MUTEXES - # define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ -- , .name = #mutexname, .file = __FILE__, .line = __LINE__ -+ , .name = #mutexname - - # define rt_mutex_init(mutex) \ - do { \ ---- a/kernel/locking/rtmutex-debug.c -+++ b/kernel/locking/rtmutex-debug.c -@@ -42,12 +42,7 @@ static void printk_task(struct task_stru - - static void printk_lock(struct rt_mutex *lock, int print_owner) - { -- if (lock->name) -- printk(" [%p] {%s}\n", -- lock, lock->name); -- else -- printk(" [%p] {%s:%d}\n", -- lock, lock->file, lock->line); -+ printk(" [%p] {%s}\n", lock, lock->name); - - if (print_owner && rt_mutex_owner(lock)) { - printk(".. ->owner: %p\n", lock->owner); ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1655,9 +1655,6 @@ void __sched rt_mutex_futex_unlock(struc - void rt_mutex_destroy(struct rt_mutex *lock) - { - WARN_ON(rt_mutex_is_locked(lock)); --#ifdef CONFIG_DEBUG_RT_MUTEXES -- lock->magic = NULL; --#endif - } - EXPORT_SYMBOL_GPL(rt_mutex_destroy); - ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -30,7 +30,6 @@ struct rt_mutex_waiter { - struct task_struct *task; - struct rt_mutex *lock; - #ifdef CONFIG_DEBUG_RT_MUTEXES -- unsigned long ip; - struct pid *deadlock_task_pid; - struct rt_mutex *deadlock_lock; - #endif diff --git a/kernel/patches-5.11.x-rt/0078-0002-locking-rtmutex-Remove-output-from-deadlock-detector.patch b/kernel/patches-5.11.x-rt/0078-0002-locking-rtmutex-Remove-output-from-deadlock-detector.patch deleted file mode 100644 index 72e8df0d4f..0000000000 --- a/kernel/patches-5.11.x-rt/0078-0002-locking-rtmutex-Remove-output-from-deadlock-detector.patch +++ /dev/null @@ -1,294 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 29 Sep 2020 16:05:11 +0200 -Subject: [PATCH 02/22] locking/rtmutex: Remove output from deadlock detector. - -In commit - f5694788ad8da ("rt_mutex: Add lockdep annotations") - -rtmutex gained lockdep annotation for rt_mutex_lock() and and related -functions. -lockdep will see the locking order and may complain about a deadlock -before rtmutex' own mechanism gets a chance to detect it. -The rtmutex deadlock detector will only complain locks with the -RT_MUTEX_MIN_CHAINWALK and a waiter must be pending. That means it -works only for in-kernel locks because the futex interface always uses -RT_MUTEX_FULL_CHAINWALK. -The requirement for an active waiter limits the detector to actual -deadlocks and makes it possible to report potential deadlocks like -lockdep does. -It looks like lockdep is better suited for reporting deadlocks. - -Remove rtmutex' debug print on deadlock detection. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rtmutex.h | 7 -- - kernel/locking/rtmutex-debug.c | 97 ---------------------------------------- - kernel/locking/rtmutex-debug.h | 11 ---- - kernel/locking/rtmutex.c | 9 --- - kernel/locking/rtmutex.h | 7 -- - kernel/locking/rtmutex_common.h | 4 - - 6 files changed, 135 deletions(-) - ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -31,9 +31,6 @@ struct rt_mutex { - raw_spinlock_t wait_lock; - struct rb_root_cached waiters; - struct task_struct *owner; --#ifdef CONFIG_DEBUG_RT_MUTEXES -- const char *name; --#endif - #ifdef CONFIG_DEBUG_LOCK_ALLOC - struct lockdep_map dep_map; - #endif -@@ -56,8 +53,6 @@ struct hrtimer_sleeper; - #endif - - #ifdef CONFIG_DEBUG_RT_MUTEXES --# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ -- , .name = #mutexname - - # define rt_mutex_init(mutex) \ - do { \ -@@ -67,7 +62,6 @@ do { \ - - extern void rt_mutex_debug_task_free(struct task_struct *tsk); - #else --# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) - # define rt_mutex_init(mutex) __rt_mutex_init(mutex, NULL, NULL) - # define rt_mutex_debug_task_free(t) do { } while (0) - #endif -@@ -83,7 +77,6 @@ do { \ - { .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ - , .waiters = RB_ROOT_CACHED \ - , .owner = NULL \ -- __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ - __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)} - - #define DEFINE_RT_MUTEX(mutexname) \ ---- a/kernel/locking/rtmutex-debug.c -+++ b/kernel/locking/rtmutex-debug.c -@@ -32,105 +32,12 @@ - - #include "rtmutex_common.h" - --static void printk_task(struct task_struct *p) --{ -- if (p) -- printk("%16s:%5d [%p, %3d]", p->comm, task_pid_nr(p), p, p->prio); -- else -- printk(""); --} -- --static void printk_lock(struct rt_mutex *lock, int print_owner) --{ -- printk(" [%p] {%s}\n", lock, lock->name); -- -- if (print_owner && rt_mutex_owner(lock)) { -- printk(".. ->owner: %p\n", lock->owner); -- printk(".. held by: "); -- printk_task(rt_mutex_owner(lock)); -- printk("\n"); -- } --} -- - void rt_mutex_debug_task_free(struct task_struct *task) - { - DEBUG_LOCKS_WARN_ON(!RB_EMPTY_ROOT(&task->pi_waiters.rb_root)); - DEBUG_LOCKS_WARN_ON(task->pi_blocked_on); - } - --/* -- * We fill out the fields in the waiter to store the information about -- * the deadlock. We print when we return. act_waiter can be NULL in -- * case of a remove waiter operation. -- */ --void debug_rt_mutex_deadlock(enum rtmutex_chainwalk chwalk, -- struct rt_mutex_waiter *act_waiter, -- struct rt_mutex *lock) --{ -- struct task_struct *task; -- -- if (!debug_locks || chwalk == RT_MUTEX_FULL_CHAINWALK || !act_waiter) -- return; -- -- task = rt_mutex_owner(act_waiter->lock); -- if (task && task != current) { -- act_waiter->deadlock_task_pid = get_pid(task_pid(task)); -- act_waiter->deadlock_lock = lock; -- } --} -- --void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter) --{ -- struct task_struct *task; -- -- if (!waiter->deadlock_lock || !debug_locks) -- return; -- -- rcu_read_lock(); -- task = pid_task(waiter->deadlock_task_pid, PIDTYPE_PID); -- if (!task) { -- rcu_read_unlock(); -- return; -- } -- -- if (!debug_locks_off()) { -- rcu_read_unlock(); -- return; -- } -- -- pr_warn("\n"); -- pr_warn("============================================\n"); -- pr_warn("WARNING: circular locking deadlock detected!\n"); -- pr_warn("%s\n", print_tainted()); -- pr_warn("--------------------------------------------\n"); -- printk("%s/%d is deadlocking current task %s/%d\n\n", -- task->comm, task_pid_nr(task), -- current->comm, task_pid_nr(current)); -- -- printk("\n1) %s/%d is trying to acquire this lock:\n", -- current->comm, task_pid_nr(current)); -- printk_lock(waiter->lock, 1); -- -- printk("\n2) %s/%d is blocked on this lock:\n", -- task->comm, task_pid_nr(task)); -- printk_lock(waiter->deadlock_lock, 1); -- -- debug_show_held_locks(current); -- debug_show_held_locks(task); -- -- printk("\n%s/%d's [blocked] stackdump:\n\n", -- task->comm, task_pid_nr(task)); -- show_stack(task, NULL, KERN_DEFAULT); -- printk("\n%s/%d's [current] stackdump:\n\n", -- current->comm, task_pid_nr(current)); -- dump_stack(); -- debug_show_all_locks(); -- rcu_read_unlock(); -- -- printk("[ turning off deadlock detection." -- "Please report this trace. ]\n\n"); --} -- - void debug_rt_mutex_lock(struct rt_mutex *lock) - { - } -@@ -153,12 +60,10 @@ void debug_rt_mutex_proxy_unlock(struct - void debug_rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) - { - memset(waiter, 0x11, sizeof(*waiter)); -- waiter->deadlock_task_pid = NULL; - } - - void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter) - { -- put_pid(waiter->deadlock_task_pid); - memset(waiter, 0x22, sizeof(*waiter)); - } - -@@ -168,10 +73,8 @@ void debug_rt_mutex_init(struct rt_mutex - * Make sure we are not reinitializing a held lock: - */ - debug_check_no_locks_freed((void *)lock, sizeof(*lock)); -- lock->name = name; - - #ifdef CONFIG_DEBUG_LOCK_ALLOC - lockdep_init_map(&lock->dep_map, name, key, 0); - #endif - } -- ---- a/kernel/locking/rtmutex-debug.h -+++ b/kernel/locking/rtmutex-debug.h -@@ -18,20 +18,9 @@ extern void debug_rt_mutex_unlock(struct - extern void debug_rt_mutex_proxy_lock(struct rt_mutex *lock, - struct task_struct *powner); - extern void debug_rt_mutex_proxy_unlock(struct rt_mutex *lock); --extern void debug_rt_mutex_deadlock(enum rtmutex_chainwalk chwalk, -- struct rt_mutex_waiter *waiter, -- struct rt_mutex *lock); --extern void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter); --# define debug_rt_mutex_reset_waiter(w) \ -- do { (w)->deadlock_lock = NULL; } while (0) - - static inline bool debug_rt_mutex_detect_deadlock(struct rt_mutex_waiter *waiter, - enum rtmutex_chainwalk walk) - { - return (waiter != NULL); - } -- --static inline void rt_mutex_print_deadlock(struct rt_mutex_waiter *w) --{ -- debug_rt_mutex_print_deadlock(w); --} ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -597,7 +597,6 @@ static int rt_mutex_adjust_prio_chain(st - * walk, we detected a deadlock. - */ - if (lock == orig_lock || rt_mutex_owner(lock) == top_task) { -- debug_rt_mutex_deadlock(chwalk, orig_waiter, lock); - raw_spin_unlock(&lock->wait_lock); - ret = -EDEADLK; - goto out_unlock_pi; -@@ -1189,8 +1188,6 @@ static int __sched - - raw_spin_unlock_irq(&lock->wait_lock); - -- debug_rt_mutex_print_deadlock(waiter); -- - schedule(); - - raw_spin_lock_irq(&lock->wait_lock); -@@ -1211,10 +1208,6 @@ static void rt_mutex_handle_deadlock(int - if (res != -EDEADLOCK || detect_deadlock) - return; - -- /* -- * Yell lowdly and stop the task right here. -- */ -- rt_mutex_print_deadlock(w); - while (1) { - set_current_state(TASK_INTERRUPTIBLE); - schedule(); -@@ -1763,8 +1756,6 @@ int __rt_mutex_start_proxy_lock(struct r - ret = 0; - } - -- debug_rt_mutex_print_deadlock(waiter); -- - return ret; - } - ---- a/kernel/locking/rtmutex.h -+++ b/kernel/locking/rtmutex.h -@@ -19,15 +19,8 @@ - #define debug_rt_mutex_proxy_unlock(l) do { } while (0) - #define debug_rt_mutex_unlock(l) do { } while (0) - #define debug_rt_mutex_init(m, n, k) do { } while (0) --#define debug_rt_mutex_deadlock(d, a ,l) do { } while (0) --#define debug_rt_mutex_print_deadlock(w) do { } while (0) - #define debug_rt_mutex_reset_waiter(w) do { } while (0) - --static inline void rt_mutex_print_deadlock(struct rt_mutex_waiter *w) --{ -- WARN(1, "rtmutex deadlock detected\n"); --} -- - static inline bool debug_rt_mutex_detect_deadlock(struct rt_mutex_waiter *w, - enum rtmutex_chainwalk walk) - { ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -29,10 +29,6 @@ struct rt_mutex_waiter { - struct rb_node pi_tree_entry; - struct task_struct *task; - struct rt_mutex *lock; --#ifdef CONFIG_DEBUG_RT_MUTEXES -- struct pid *deadlock_task_pid; -- struct rt_mutex *deadlock_lock; --#endif - int prio; - u64 deadline; - }; diff --git a/kernel/patches-5.11.x-rt/0079-0003-locking-rtmutex-Move-rt_mutex_init-outside-of-CONFIG.patch b/kernel/patches-5.11.x-rt/0079-0003-locking-rtmutex-Move-rt_mutex_init-outside-of-CONFIG.patch deleted file mode 100644 index 6cbb41b8b7..0000000000 --- a/kernel/patches-5.11.x-rt/0079-0003-locking-rtmutex-Move-rt_mutex_init-outside-of-CONFIG.patch +++ /dev/null @@ -1,53 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 29 Sep 2020 16:32:49 +0200 -Subject: [PATCH 03/22] locking/rtmutex: Move rt_mutex_init() outside of - CONFIG_DEBUG_RT_MUTEXES - -rt_mutex_init() only initializes lockdep if CONFIG_DEBUG_RT_MUTEXES is -enabled. The static initializer (DEFINE_RT_MUTEX) does not have such a -restriction. - -Move rt_mutex_init() outside of CONFIG_DEBUG_RT_MUTEXES. -Move the remaining functions in this CONFIG_DEBUG_RT_MUTEXES block to -the upper block. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rtmutex.h | 12 +++--------- - 1 file changed, 3 insertions(+), 9 deletions(-) - ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -43,6 +43,7 @@ struct hrtimer_sleeper; - extern int rt_mutex_debug_check_no_locks_freed(const void *from, - unsigned long len); - extern void rt_mutex_debug_check_no_locks_held(struct task_struct *task); -+ extern void rt_mutex_debug_task_free(struct task_struct *tsk); - #else - static inline int rt_mutex_debug_check_no_locks_freed(const void *from, - unsigned long len) -@@ -50,22 +51,15 @@ struct hrtimer_sleeper; - return 0; - } - # define rt_mutex_debug_check_no_locks_held(task) do { } while (0) -+# define rt_mutex_debug_task_free(t) do { } while (0) - #endif - --#ifdef CONFIG_DEBUG_RT_MUTEXES -- --# define rt_mutex_init(mutex) \ -+#define rt_mutex_init(mutex) \ - do { \ - static struct lock_class_key __key; \ - __rt_mutex_init(mutex, __func__, &__key); \ - } while (0) - -- extern void rt_mutex_debug_task_free(struct task_struct *tsk); --#else --# define rt_mutex_init(mutex) __rt_mutex_init(mutex, NULL, NULL) --# define rt_mutex_debug_task_free(t) do { } while (0) --#endif -- - #ifdef CONFIG_DEBUG_LOCK_ALLOC - #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) \ - , .dep_map = { .name = #mutexname } diff --git a/kernel/patches-5.11.x-rt/0080-0004-locking-rtmutex-Remove-rt_mutex_timed_lock.patch b/kernel/patches-5.11.x-rt/0080-0004-locking-rtmutex-Remove-rt_mutex_timed_lock.patch deleted file mode 100644 index a7c2235c44..0000000000 --- a/kernel/patches-5.11.x-rt/0080-0004-locking-rtmutex-Remove-rt_mutex_timed_lock.patch +++ /dev/null @@ -1,89 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 7 Oct 2020 12:11:33 +0200 -Subject: [PATCH 04/22] locking/rtmutex: Remove rt_mutex_timed_lock() - -rt_mutex_timed_lock() has no callers since commit - c051b21f71d1f ("rtmutex: Confine deadlock logic to futex") - -Remove rt_mutex_timed_lock(). - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rtmutex.h | 3 --- - kernel/locking/rtmutex.c | 46 ---------------------------------------------- - 2 files changed, 49 deletions(-) - ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -99,9 +99,6 @@ extern void rt_mutex_lock(struct rt_mute - #endif - - extern int rt_mutex_lock_interruptible(struct rt_mutex *lock); --extern int rt_mutex_timed_lock(struct rt_mutex *lock, -- struct hrtimer_sleeper *timeout); -- - extern int rt_mutex_trylock(struct rt_mutex *lock); - - extern void rt_mutex_unlock(struct rt_mutex *lock); ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1406,21 +1406,6 @@ rt_mutex_fastlock(struct rt_mutex *lock, - } - - static inline int --rt_mutex_timed_fastlock(struct rt_mutex *lock, int state, -- struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk, -- int (*slowfn)(struct rt_mutex *lock, int state, -- struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk)) --{ -- if (chwalk == RT_MUTEX_MIN_CHAINWALK && -- likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) -- return 0; -- -- return slowfn(lock, state, timeout, chwalk); --} -- --static inline int - rt_mutex_fasttrylock(struct rt_mutex *lock, - int (*slowfn)(struct rt_mutex *lock)) - { -@@ -1528,37 +1513,6 @@ int __sched __rt_mutex_futex_trylock(str - } - - /** -- * rt_mutex_timed_lock - lock a rt_mutex interruptible -- * the timeout structure is provided -- * by the caller -- * -- * @lock: the rt_mutex to be locked -- * @timeout: timeout structure or NULL (no timeout) -- * -- * Returns: -- * 0 on success -- * -EINTR when interrupted by a signal -- * -ETIMEDOUT when the timeout expired -- */ --int --rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout) --{ -- int ret; -- -- might_sleep(); -- -- mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -- ret = rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout, -- RT_MUTEX_MIN_CHAINWALK, -- rt_mutex_slowlock); -- if (ret) -- mutex_release(&lock->dep_map, _RET_IP_); -- -- return ret; --} --EXPORT_SYMBOL_GPL(rt_mutex_timed_lock); -- --/** - * rt_mutex_trylock - try to lock a rt_mutex - * - * @lock: the rt_mutex to be locked diff --git a/kernel/patches-5.11.x-rt/0081-0005-locking-rtmutex-Handle-the-various-new-futex-race-co.patch b/kernel/patches-5.11.x-rt/0081-0005-locking-rtmutex-Handle-the-various-new-futex-race-co.patch deleted file mode 100644 index 3ffd5fe2e9..0000000000 --- a/kernel/patches-5.11.x-rt/0081-0005-locking-rtmutex-Handle-the-various-new-futex-race-co.patch +++ /dev/null @@ -1,245 +0,0 @@ -From: Thomas Gleixner -Date: Fri, 10 Jun 2011 11:04:15 +0200 -Subject: [PATCH 05/22] locking/rtmutex: Handle the various new futex race - conditions - -RT opens a few new interesting race conditions in the rtmutex/futex -combo due to futex hash bucket lock being a 'sleeping' spinlock and -therefor not disabling preemption. - -Signed-off-by: Thomas Gleixner ---- - kernel/futex.c | 78 ++++++++++++++++++++++++++++++++-------- - kernel/locking/rtmutex.c | 36 +++++++++++++++--- - kernel/locking/rtmutex_common.h | 2 + - 3 files changed, 95 insertions(+), 21 deletions(-) - ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -2154,6 +2154,16 @@ static int futex_requeue(u32 __user *uad - */ - requeue_pi_wake_futex(this, &key2, hb2); - continue; -+ } else if (ret == -EAGAIN) { -+ /* -+ * Waiter was woken by timeout or -+ * signal and has set pi_blocked_on to -+ * PI_WAKEUP_INPROGRESS before we -+ * tried to enqueue it on the rtmutex. -+ */ -+ this->pi_state = NULL; -+ put_pi_state(pi_state); -+ continue; - } else if (ret) { - /* - * rt_mutex_start_proxy_lock() detected a -@@ -3172,7 +3182,7 @@ static int futex_wait_requeue_pi(u32 __u - { - struct hrtimer_sleeper timeout, *to; - struct rt_mutex_waiter rt_waiter; -- struct futex_hash_bucket *hb; -+ struct futex_hash_bucket *hb, *hb2; - union futex_key key2 = FUTEX_KEY_INIT; - struct futex_q q = futex_q_init; - int res, ret; -@@ -3224,20 +3234,55 @@ static int futex_wait_requeue_pi(u32 __u - /* Queue the futex_q, drop the hb lock, wait for wakeup. */ - futex_wait_queue_me(hb, &q, to); - -- spin_lock(&hb->lock); -- ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); -- spin_unlock(&hb->lock); -- if (ret) -- goto out; -+ /* -+ * On RT we must avoid races with requeue and trying to block -+ * on two mutexes (hb->lock and uaddr2's rtmutex) by -+ * serializing access to pi_blocked_on with pi_lock. -+ */ -+ raw_spin_lock_irq(¤t->pi_lock); -+ if (current->pi_blocked_on) { -+ /* -+ * We have been requeued or are in the process of -+ * being requeued. -+ */ -+ raw_spin_unlock_irq(¤t->pi_lock); -+ } else { -+ /* -+ * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS -+ * prevents a concurrent requeue from moving us to the -+ * uaddr2 rtmutex. After that we can safely acquire -+ * (and possibly block on) hb->lock. -+ */ -+ current->pi_blocked_on = PI_WAKEUP_INPROGRESS; -+ raw_spin_unlock_irq(¤t->pi_lock); -+ -+ spin_lock(&hb->lock); -+ -+ /* -+ * Clean up pi_blocked_on. We might leak it otherwise -+ * when we succeeded with the hb->lock in the fast -+ * path. -+ */ -+ raw_spin_lock_irq(¤t->pi_lock); -+ current->pi_blocked_on = NULL; -+ raw_spin_unlock_irq(¤t->pi_lock); -+ -+ ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); -+ spin_unlock(&hb->lock); -+ if (ret) -+ goto out; -+ } - - /* -- * In order for us to be here, we know our q.key == key2, and since -- * we took the hb->lock above, we also know that futex_requeue() has -- * completed and we no longer have to concern ourselves with a wakeup -- * race with the atomic proxy lock acquisition by the requeue code. The -- * futex_requeue dropped our key1 reference and incremented our key2 -- * reference count. -+ * In order to be here, we have either been requeued, are in -+ * the process of being requeued, or requeue successfully -+ * acquired uaddr2 on our behalf. If pi_blocked_on was -+ * non-null above, we may be racing with a requeue. Do not -+ * rely on q->lock_ptr to be hb2->lock until after blocking on -+ * hb->lock or hb2->lock. The futex_requeue dropped our key1 -+ * reference and incremented our key2 reference count. - */ -+ hb2 = hash_futex(&key2); - - /* Check if the requeue code acquired the second futex for us. */ - if (!q.rt_waiter) { -@@ -3246,14 +3291,16 @@ static int futex_wait_requeue_pi(u32 __u - * did a lock-steal - fix up the PI-state in that case. - */ - if (q.pi_state && (q.pi_state->owner != current)) { -- spin_lock(q.lock_ptr); -+ spin_lock(&hb2->lock); -+ BUG_ON(&hb2->lock != q.lock_ptr); - ret = fixup_pi_state_owner(uaddr2, &q, current); - /* - * Drop the reference to the pi state which - * the requeue_pi() code acquired for us. - */ - put_pi_state(q.pi_state); -- spin_unlock(q.lock_ptr); -+ spin_unlock(&hb2->lock); -+ - /* - * Adjust the return value. It's either -EFAULT or - * success (1) but the caller expects 0 for success. -@@ -3272,7 +3319,8 @@ static int futex_wait_requeue_pi(u32 __u - pi_mutex = &q.pi_state->pi_mutex; - ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); - -- spin_lock(q.lock_ptr); -+ spin_lock(&hb2->lock); -+ BUG_ON(&hb2->lock != q.lock_ptr); - if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) - ret = 0; - ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -136,6 +136,11 @@ static void fixup_rt_mutex_waiters(struc - WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS); - } - -+static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) -+{ -+ return waiter && waiter != PI_WAKEUP_INPROGRESS; -+} -+ - /* - * We can speed up the acquire/release, if there's no debugging state to be - * set up. -@@ -378,7 +383,8 @@ int max_lock_depth = 1024; - - static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) - { -- return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; -+ return rt_mutex_real_waiter(p->pi_blocked_on) ? -+ p->pi_blocked_on->lock : NULL; - } - - /* -@@ -514,7 +520,7 @@ static int rt_mutex_adjust_prio_chain(st - * reached or the state of the chain has changed while we - * dropped the locks. - */ -- if (!waiter) -+ if (!rt_mutex_real_waiter(waiter)) - goto out_unlock_pi; - - /* -@@ -947,6 +953,22 @@ static int task_blocks_on_rt_mutex(struc - return -EDEADLK; - - raw_spin_lock(&task->pi_lock); -+ /* -+ * In the case of futex requeue PI, this will be a proxy -+ * lock. The task will wake unaware that it is enqueueed on -+ * this lock. Avoid blocking on two locks and corrupting -+ * pi_blocked_on via the PI_WAKEUP_INPROGRESS -+ * flag. futex_wait_requeue_pi() sets this when it wakes up -+ * before requeue (due to a signal or timeout). Do not enqueue -+ * the task if PI_WAKEUP_INPROGRESS is set. -+ */ -+ if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) { -+ raw_spin_unlock(&task->pi_lock); -+ return -EAGAIN; -+ } -+ -+ BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)); -+ - waiter->task = task; - waiter->lock = lock; - waiter->prio = task->prio; -@@ -970,7 +992,7 @@ static int task_blocks_on_rt_mutex(struc - rt_mutex_enqueue_pi(owner, waiter); - - rt_mutex_adjust_prio(owner); -- if (owner->pi_blocked_on) -+ if (rt_mutex_real_waiter(owner->pi_blocked_on)) - chain_walk = 1; - } else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) { - chain_walk = 1; -@@ -1066,7 +1088,7 @@ static void remove_waiter(struct rt_mute - { - bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock)); - struct task_struct *owner = rt_mutex_owner(lock); -- struct rt_mutex *next_lock; -+ struct rt_mutex *next_lock = NULL; - - lockdep_assert_held(&lock->wait_lock); - -@@ -1092,7 +1114,8 @@ static void remove_waiter(struct rt_mute - rt_mutex_adjust_prio(owner); - - /* Store the lock on which owner is blocked or NULL */ -- next_lock = task_blocked_on_lock(owner); -+ if (rt_mutex_real_waiter(owner->pi_blocked_on)) -+ next_lock = task_blocked_on_lock(owner); - - raw_spin_unlock(&owner->pi_lock); - -@@ -1128,7 +1151,8 @@ void rt_mutex_adjust_pi(struct task_stru - raw_spin_lock_irqsave(&task->pi_lock, flags); - - waiter = task->pi_blocked_on; -- if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { -+ if (!rt_mutex_real_waiter(waiter) || -+ rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { - raw_spin_unlock_irqrestore(&task->pi_lock, flags); - return; - } ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -125,6 +125,8 @@ enum rtmutex_chainwalk { - /* - * PI-futex support (proxy locking functions, etc.): - */ -+#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) -+ - extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); - extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, - struct task_struct *proxy_owner); diff --git a/kernel/patches-5.11.x-rt/0082-0006-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch b/kernel/patches-5.11.x-rt/0082-0006-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch deleted file mode 100644 index b0ee73c832..0000000000 --- a/kernel/patches-5.11.x-rt/0082-0006-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch +++ /dev/null @@ -1,109 +0,0 @@ -From: Steven Rostedt -Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: [PATCH 06/22] futex: Fix bug on when a requeued RT task times out - -Requeue with timeout causes a bug with PREEMPT_RT. - -The bug comes from a timed out condition. - - TASK 1 TASK 2 - ------ ------ - futex_wait_requeue_pi() - futex_wait_queue_me() - - - double_lock_hb(); - - raw_spin_lock(pi_lock); - if (current->pi_blocked_on) { - } else { - current->pi_blocked_on = PI_WAKE_INPROGRESS; - run_spin_unlock(pi_lock); - spin_lock(hb->lock); <-- blocked! - - plist_for_each_entry_safe(this) { - rt_mutex_start_proxy_lock(); - task_blocks_on_rt_mutex(); - BUG_ON(task->pi_blocked_on)!!!! - -The BUG_ON() actually has a check for PI_WAKE_INPROGRESS, but the -problem is that, after TASK 1 sets PI_WAKE_INPROGRESS, it then tries to -grab the hb->lock, which it fails to do so. As the hb->lock is a mutex, -it will block and set the "pi_blocked_on" to the hb->lock. - -When TASK 2 goes to requeue it, the check for PI_WAKE_INPROGESS fails -because the task1's pi_blocked_on is no longer set to that, but instead, -set to the hb->lock. - -The fix: - -When calling rt_mutex_start_proxy_lock() a check is made to see -if the proxy tasks pi_blocked_on is set. If so, exit out early. -Otherwise set it to a new flag PI_REQUEUE_INPROGRESS, which notifies -the proxy task that it is being requeued, and will handle things -appropriately. - -Signed-off-by: Steven Rostedt -Signed-off-by: Thomas Gleixner ---- - kernel/locking/rtmutex.c | 31 ++++++++++++++++++++++++++++++- - kernel/locking/rtmutex_common.h | 1 + - 2 files changed, 31 insertions(+), 1 deletion(-) - ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -138,7 +138,8 @@ static void fixup_rt_mutex_waiters(struc - - static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) - { -- return waiter && waiter != PI_WAKEUP_INPROGRESS; -+ return waiter && waiter != PI_WAKEUP_INPROGRESS && -+ waiter != PI_REQUEUE_INPROGRESS; - } - - /* -@@ -1720,6 +1721,34 @@ int __rt_mutex_start_proxy_lock(struct r - if (try_to_take_rt_mutex(lock, task, NULL)) - return 1; - -+#ifdef CONFIG_PREEMPT_RT -+ /* -+ * In PREEMPT_RT there's an added race. -+ * If the task, that we are about to requeue, times out, -+ * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue -+ * to skip this task. But right after the task sets -+ * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then -+ * block on the spin_lock(&hb->lock), which in RT is an rtmutex. -+ * This will replace the PI_WAKEUP_INPROGRESS with the actual -+ * lock that it blocks on. We *must not* place this task -+ * on this proxy lock in that case. -+ * -+ * To prevent this race, we first take the task's pi_lock -+ * and check if it has updated its pi_blocked_on. If it has, -+ * we assume that it woke up and we return -EAGAIN. -+ * Otherwise, we set the task's pi_blocked_on to -+ * PI_REQUEUE_INPROGRESS, so that if the task is waking up -+ * it will know that we are in the process of requeuing it. -+ */ -+ raw_spin_lock(&task->pi_lock); -+ if (task->pi_blocked_on) { -+ raw_spin_unlock(&task->pi_lock); -+ return -EAGAIN; -+ } -+ task->pi_blocked_on = PI_REQUEUE_INPROGRESS; -+ raw_spin_unlock(&task->pi_lock); -+#endif -+ - /* We enforce deadlock detection for futexes */ - ret = task_blocks_on_rt_mutex(lock, waiter, task, - RT_MUTEX_FULL_CHAINWALK); ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -126,6 +126,7 @@ enum rtmutex_chainwalk { - * PI-futex support (proxy locking functions, etc.): - */ - #define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) -+#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) - - extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); - extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, diff --git a/kernel/patches-5.11.x-rt/0083-0007-locking-rtmutex-Make-lock_killable-work.patch b/kernel/patches-5.11.x-rt/0083-0007-locking-rtmutex-Make-lock_killable-work.patch deleted file mode 100644 index f1e672e9f1..0000000000 --- a/kernel/patches-5.11.x-rt/0083-0007-locking-rtmutex-Make-lock_killable-work.patch +++ /dev/null @@ -1,43 +0,0 @@ -From: Thomas Gleixner -Date: Sat, 1 Apr 2017 12:50:59 +0200 -Subject: [PATCH 07/22] locking/rtmutex: Make lock_killable work - -Locking an rt mutex killable does not work because signal handling is -restricted to TASK_INTERRUPTIBLE. - -Use signal_pending_state() unconditionally. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 19 +++++++------------ - 1 file changed, 7 insertions(+), 12 deletions(-) - ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1197,18 +1197,13 @@ static int __sched - if (try_to_take_rt_mutex(lock, current, waiter)) - break; - -- /* -- * TASK_INTERRUPTIBLE checks for signals and -- * timeout. Ignored otherwise. -- */ -- if (likely(state == TASK_INTERRUPTIBLE)) { -- /* Signal pending? */ -- if (signal_pending(current)) -- ret = -EINTR; -- if (timeout && !timeout->task) -- ret = -ETIMEDOUT; -- if (ret) -- break; -+ if (timeout && !timeout->task) { -+ ret = -ETIMEDOUT; -+ break; -+ } -+ if (signal_pending_state(state, current)) { -+ ret = -EINTR; -+ break; - } - - raw_spin_unlock_irq(&lock->wait_lock); diff --git a/kernel/patches-5.11.x-rt/0084-0008-locking-spinlock-Split-the-lock-types-header.patch b/kernel/patches-5.11.x-rt/0084-0008-locking-spinlock-Split-the-lock-types-header.patch deleted file mode 100644 index d6b9e9d205..0000000000 --- a/kernel/patches-5.11.x-rt/0084-0008-locking-spinlock-Split-the-lock-types-header.patch +++ /dev/null @@ -1,238 +0,0 @@ -From: Thomas Gleixner -Date: Wed, 29 Jun 2011 19:34:01 +0200 -Subject: [PATCH 08/22] locking/spinlock: Split the lock types header - -Split raw_spinlock into its own file and the remaining spinlock_t into -its own non-RT header. The non-RT header will be replaced later by sleeping -spinlocks. - -Signed-off-by: Thomas Gleixner ---- - include/linux/rwlock_types.h | 4 + - include/linux/spinlock_types.h | 87 ------------------------------------ - include/linux/spinlock_types_nort.h | 39 ++++++++++++++++ - include/linux/spinlock_types_raw.h | 65 ++++++++++++++++++++++++++ - 4 files changed, 110 insertions(+), 85 deletions(-) - create mode 100644 include/linux/spinlock_types_nort.h - create mode 100644 include/linux/spinlock_types_raw.h - ---- a/include/linux/rwlock_types.h -+++ b/include/linux/rwlock_types.h -@@ -1,6 +1,10 @@ - #ifndef __LINUX_RWLOCK_TYPES_H - #define __LINUX_RWLOCK_TYPES_H - -+#if !defined(__LINUX_SPINLOCK_TYPES_H) -+# error "Do not include directly, include spinlock_types.h" -+#endif -+ - /* - * include/linux/rwlock_types.h - generic rwlock type definitions - * and initializers ---- a/include/linux/spinlock_types.h -+++ b/include/linux/spinlock_types.h -@@ -9,92 +9,9 @@ - * Released under the General Public License (GPL). - */ - --#if defined(CONFIG_SMP) --# include --#else --# include --#endif -+#include - --#include -- --typedef struct raw_spinlock { -- arch_spinlock_t raw_lock; --#ifdef CONFIG_DEBUG_SPINLOCK -- unsigned int magic, owner_cpu; -- void *owner; --#endif --#ifdef CONFIG_DEBUG_LOCK_ALLOC -- struct lockdep_map dep_map; --#endif --} raw_spinlock_t; -- --#define SPINLOCK_MAGIC 0xdead4ead -- --#define SPINLOCK_OWNER_INIT ((void *)-1L) -- --#ifdef CONFIG_DEBUG_LOCK_ALLOC --# define RAW_SPIN_DEP_MAP_INIT(lockname) \ -- .dep_map = { \ -- .name = #lockname, \ -- .wait_type_inner = LD_WAIT_SPIN, \ -- } --# define SPIN_DEP_MAP_INIT(lockname) \ -- .dep_map = { \ -- .name = #lockname, \ -- .wait_type_inner = LD_WAIT_CONFIG, \ -- } --#else --# define RAW_SPIN_DEP_MAP_INIT(lockname) --# define SPIN_DEP_MAP_INIT(lockname) --#endif -- --#ifdef CONFIG_DEBUG_SPINLOCK --# define SPIN_DEBUG_INIT(lockname) \ -- .magic = SPINLOCK_MAGIC, \ -- .owner_cpu = -1, \ -- .owner = SPINLOCK_OWNER_INIT, --#else --# define SPIN_DEBUG_INIT(lockname) --#endif -- --#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ -- { \ -- .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ -- SPIN_DEBUG_INIT(lockname) \ -- RAW_SPIN_DEP_MAP_INIT(lockname) } -- --#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ -- (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) -- --#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) -- --typedef struct spinlock { -- union { -- struct raw_spinlock rlock; -- --#ifdef CONFIG_DEBUG_LOCK_ALLOC --# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) -- struct { -- u8 __padding[LOCK_PADSIZE]; -- struct lockdep_map dep_map; -- }; --#endif -- }; --} spinlock_t; -- --#define ___SPIN_LOCK_INITIALIZER(lockname) \ -- { \ -- .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ -- SPIN_DEBUG_INIT(lockname) \ -- SPIN_DEP_MAP_INIT(lockname) } -- --#define __SPIN_LOCK_INITIALIZER(lockname) \ -- { { .rlock = ___SPIN_LOCK_INITIALIZER(lockname) } } -- --#define __SPIN_LOCK_UNLOCKED(lockname) \ -- (spinlock_t) __SPIN_LOCK_INITIALIZER(lockname) -- --#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) -+#include - - #include - ---- /dev/null -+++ b/include/linux/spinlock_types_nort.h -@@ -0,0 +1,39 @@ -+#ifndef __LINUX_SPINLOCK_TYPES_NORT_H -+#define __LINUX_SPINLOCK_TYPES_NORT_H -+ -+#ifndef __LINUX_SPINLOCK_TYPES_H -+#error "Do not include directly. Include spinlock_types.h instead" -+#endif -+ -+/* -+ * The non RT version maps spinlocks to raw_spinlocks -+ */ -+typedef struct spinlock { -+ union { -+ struct raw_spinlock rlock; -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) -+ struct { -+ u8 __padding[LOCK_PADSIZE]; -+ struct lockdep_map dep_map; -+ }; -+#endif -+ }; -+} spinlock_t; -+ -+#define ___SPIN_LOCK_INITIALIZER(lockname) \ -+{ \ -+ .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ -+ SPIN_DEBUG_INIT(lockname) \ -+ SPIN_DEP_MAP_INIT(lockname) } -+ -+#define __SPIN_LOCK_INITIALIZER(lockname) \ -+ { { .rlock = ___SPIN_LOCK_INITIALIZER(lockname) } } -+ -+#define __SPIN_LOCK_UNLOCKED(lockname) \ -+ (spinlock_t) __SPIN_LOCK_INITIALIZER(lockname) -+ -+#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) -+ -+#endif ---- /dev/null -+++ b/include/linux/spinlock_types_raw.h -@@ -0,0 +1,65 @@ -+#ifndef __LINUX_SPINLOCK_TYPES_RAW_H -+#define __LINUX_SPINLOCK_TYPES_RAW_H -+ -+#include -+ -+#if defined(CONFIG_SMP) -+# include -+#else -+# include -+#endif -+ -+#include -+ -+typedef struct raw_spinlock { -+ arch_spinlock_t raw_lock; -+#ifdef CONFIG_DEBUG_SPINLOCK -+ unsigned int magic, owner_cpu; -+ void *owner; -+#endif -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+} raw_spinlock_t; -+ -+#define SPINLOCK_MAGIC 0xdead4ead -+ -+#define SPINLOCK_OWNER_INIT ((void *)-1L) -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define RAW_SPIN_DEP_MAP_INIT(lockname) \ -+ .dep_map = { \ -+ .name = #lockname, \ -+ .wait_type_inner = LD_WAIT_SPIN, \ -+ } -+# define SPIN_DEP_MAP_INIT(lockname) \ -+ .dep_map = { \ -+ .name = #lockname, \ -+ .wait_type_inner = LD_WAIT_CONFIG, \ -+ } -+#else -+# define RAW_SPIN_DEP_MAP_INIT(lockname) -+# define SPIN_DEP_MAP_INIT(lockname) -+#endif -+ -+#ifdef CONFIG_DEBUG_SPINLOCK -+# define SPIN_DEBUG_INIT(lockname) \ -+ .magic = SPINLOCK_MAGIC, \ -+ .owner_cpu = -1, \ -+ .owner = SPINLOCK_OWNER_INIT, -+#else -+# define SPIN_DEBUG_INIT(lockname) -+#endif -+ -+#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ -+{ \ -+ .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ -+ SPIN_DEBUG_INIT(lockname) \ -+ RAW_SPIN_DEP_MAP_INIT(lockname) } -+ -+#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ -+ (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) -+ -+#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) -+ -+#endif diff --git a/kernel/patches-5.11.x-rt/0085-0009-locking-rtmutex-Avoid-include-hell.patch b/kernel/patches-5.11.x-rt/0085-0009-locking-rtmutex-Avoid-include-hell.patch deleted file mode 100644 index 4eb12e8898..0000000000 --- a/kernel/patches-5.11.x-rt/0085-0009-locking-rtmutex-Avoid-include-hell.patch +++ /dev/null @@ -1,23 +0,0 @@ -From: Thomas Gleixner -Date: Wed, 29 Jun 2011 20:06:39 +0200 -Subject: [PATCH 09/22] locking/rtmutex: Avoid include hell - -Include only the required raw types. This avoids pulling in the -complete spinlock header which in turn requires rtmutex.h at some point. - -Signed-off-by: Thomas Gleixner ---- - include/linux/rtmutex.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -15,7 +15,7 @@ - - #include - #include --#include -+#include - - extern int max_lock_depth; /* for sysctl */ - diff --git a/kernel/patches-5.11.x-rt/0086-0010-lockdep-Reduce-header-files-in-debug_locks.h.patch b/kernel/patches-5.11.x-rt/0086-0010-lockdep-Reduce-header-files-in-debug_locks.h.patch deleted file mode 100644 index fe8bb603c9..0000000000 --- a/kernel/patches-5.11.x-rt/0086-0010-lockdep-Reduce-header-files-in-debug_locks.h.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 14 Aug 2020 16:55:25 +0200 -Subject: [PATCH 11/23] lockdep: Reduce header files in debug_locks.h - -The inclusion of printk.h leads to circular dependency if spinlock_t is -based on rt_mutex. - -Include only atomic.h (xchg()) and cache.h (__read_mostly). - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/debug_locks.h | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - ---- a/include/linux/debug_locks.h -+++ b/include/linux/debug_locks.h -@@ -3,8 +3,7 @@ - #define __LINUX_DEBUG_LOCKING_H - - #include --#include --#include -+#include - - struct task_struct; - diff --git a/kernel/patches-5.11.x-rt/0087-0011-locking-split-out-the-rbtree-definition.patch b/kernel/patches-5.11.x-rt/0087-0011-locking-split-out-the-rbtree-definition.patch deleted file mode 100644 index cb0ab1fb16..0000000000 --- a/kernel/patches-5.11.x-rt/0087-0011-locking-split-out-the-rbtree-definition.patch +++ /dev/null @@ -1,108 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 14 Aug 2020 17:08:41 +0200 -Subject: [PATCH 11/22] locking: split out the rbtree definition - -rtmutex.h needs the definition for rb_root_cached. By including kernel.h -we will get to spinlock.h which requires rtmutex.h again. - -Split out the required struct definition and move it into its own header -file which can be included by rtmutex.h - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rbtree.h | 27 +-------------------------- - include/linux/rbtree_type.h | 31 +++++++++++++++++++++++++++++++ - include/linux/rtmutex.h | 2 +- - 3 files changed, 33 insertions(+), 27 deletions(-) - create mode 100644 include/linux/rbtree_type.h - ---- a/include/linux/rbtree.h -+++ b/include/linux/rbtree.h -@@ -19,19 +19,9 @@ - - #include - #include -+#include - #include - --struct rb_node { -- unsigned long __rb_parent_color; -- struct rb_node *rb_right; -- struct rb_node *rb_left; --} __attribute__((aligned(sizeof(long)))); -- /* The alignment might seem pointless, but allegedly CRIS needs it */ -- --struct rb_root { -- struct rb_node *rb_node; --}; -- - #define rb_parent(r) ((struct rb_node *)((r)->__rb_parent_color & ~3)) - - #define RB_ROOT (struct rb_root) { NULL, } -@@ -112,21 +102,6 @@ static inline void rb_link_node_rcu(stru - typeof(*pos), field); 1; }); \ - pos = n) - --/* -- * Leftmost-cached rbtrees. -- * -- * We do not cache the rightmost node based on footprint -- * size vs number of potential users that could benefit -- * from O(1) rb_last(). Just not worth it, users that want -- * this feature can always implement the logic explicitly. -- * Furthermore, users that want to cache both pointers may -- * find it a bit asymmetric, but that's ok. -- */ --struct rb_root_cached { -- struct rb_root rb_root; -- struct rb_node *rb_leftmost; --}; -- - #define RB_ROOT_CACHED (struct rb_root_cached) { {NULL, }, NULL } - - /* Same as rb_first(), but O(1) */ ---- /dev/null -+++ b/include/linux/rbtree_type.h -@@ -0,0 +1,31 @@ -+/* SPDX-License-Identifier: GPL-2.0-or-later */ -+#ifndef _LINUX_RBTREE_TYPE_H -+#define _LINUX_RBTREE_TYPE_H -+ -+struct rb_node { -+ unsigned long __rb_parent_color; -+ struct rb_node *rb_right; -+ struct rb_node *rb_left; -+} __attribute__((aligned(sizeof(long)))); -+/* The alignment might seem pointless, but allegedly CRIS needs it */ -+ -+struct rb_root { -+ struct rb_node *rb_node; -+}; -+ -+/* -+ * Leftmost-cached rbtrees. -+ * -+ * We do not cache the rightmost node based on footprint -+ * size vs number of potential users that could benefit -+ * from O(1) rb_last(). Just not worth it, users that want -+ * this feature can always implement the logic explicitly. -+ * Furthermore, users that want to cache both pointers may -+ * find it a bit asymmetric, but that's ok. -+ */ -+struct rb_root_cached { -+ struct rb_root rb_root; -+ struct rb_node *rb_leftmost; -+}; -+ -+#endif ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -14,7 +14,7 @@ - #define __LINUX_RT_MUTEX_H - - #include --#include -+#include - #include - - extern int max_lock_depth; /* for sysctl */ diff --git a/kernel/patches-5.11.x-rt/0088-0012-locking-rtmutex-Provide-rt_mutex_slowlock_locked.patch b/kernel/patches-5.11.x-rt/0088-0012-locking-rtmutex-Provide-rt_mutex_slowlock_locked.patch deleted file mode 100644 index e333c4ef5f..0000000000 --- a/kernel/patches-5.11.x-rt/0088-0012-locking-rtmutex-Provide-rt_mutex_slowlock_locked.patch +++ /dev/null @@ -1,136 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 16:14:22 +0200 -Subject: [PATCH 12/22] locking/rtmutex: Provide rt_mutex_slowlock_locked() - -This is the inner-part of rt_mutex_slowlock(), required for rwsem-rt. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 67 ++++++++++++++++++++++------------------ - kernel/locking/rtmutex_common.h | 7 ++++ - 2 files changed, 45 insertions(+), 29 deletions(-) - ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1234,35 +1234,16 @@ static void rt_mutex_handle_deadlock(int - } - } - --/* -- * Slow path lock function: -- */ --static int __sched --rt_mutex_slowlock(struct rt_mutex *lock, int state, -- struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk) -+int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, -+ struct hrtimer_sleeper *timeout, -+ enum rtmutex_chainwalk chwalk, -+ struct rt_mutex_waiter *waiter) - { -- struct rt_mutex_waiter waiter; -- unsigned long flags; -- int ret = 0; -- -- rt_mutex_init_waiter(&waiter); -- -- /* -- * Technically we could use raw_spin_[un]lock_irq() here, but this can -- * be called in early boot if the cmpxchg() fast path is disabled -- * (debug, no architecture support). In this case we will acquire the -- * rtmutex with lock->wait_lock held. But we cannot unconditionally -- * enable interrupts in that early boot case. So we need to use the -- * irqsave/restore variants. -- */ -- raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ int ret; - - /* Try to acquire the lock again: */ -- if (try_to_take_rt_mutex(lock, current, NULL)) { -- raw_spin_unlock_irqrestore(&lock->wait_lock, flags); -+ if (try_to_take_rt_mutex(lock, current, NULL)) - return 0; -- } - - set_current_state(state); - -@@ -1270,16 +1251,16 @@ rt_mutex_slowlock(struct rt_mutex *lock, - if (unlikely(timeout)) - hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS); - -- ret = task_blocks_on_rt_mutex(lock, &waiter, current, chwalk); -+ ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk); - - if (likely(!ret)) - /* sleep on the mutex */ -- ret = __rt_mutex_slowlock(lock, state, timeout, &waiter); -+ ret = __rt_mutex_slowlock(lock, state, timeout, waiter); - - if (unlikely(ret)) { - __set_current_state(TASK_RUNNING); -- remove_waiter(lock, &waiter); -- rt_mutex_handle_deadlock(ret, chwalk, &waiter); -+ remove_waiter(lock, waiter); -+ rt_mutex_handle_deadlock(ret, chwalk, waiter); - } - - /* -@@ -1287,6 +1268,34 @@ rt_mutex_slowlock(struct rt_mutex *lock, - * unconditionally. We might have to fix that up. - */ - fixup_rt_mutex_waiters(lock); -+ return ret; -+} -+ -+/* -+ * Slow path lock function: -+ */ -+static int __sched -+rt_mutex_slowlock(struct rt_mutex *lock, int state, -+ struct hrtimer_sleeper *timeout, -+ enum rtmutex_chainwalk chwalk) -+{ -+ struct rt_mutex_waiter waiter; -+ unsigned long flags; -+ int ret = 0; -+ -+ rt_mutex_init_waiter(&waiter); -+ -+ /* -+ * Technically we could use raw_spin_[un]lock_irq() here, but this can -+ * be called in early boot if the cmpxchg() fast path is disabled -+ * (debug, no architecture support). In this case we will acquire the -+ * rtmutex with lock->wait_lock held. But we cannot unconditionally -+ * enable interrupts in that early boot case. So we need to use the -+ * irqsave/restore variants. -+ */ -+ raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ -+ ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, &waiter); - - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -15,6 +15,7 @@ - - #include - #include -+#include - - /* - * This is the control structure for tasks blocked on a rt_mutex, -@@ -153,6 +154,12 @@ extern bool __rt_mutex_futex_unlock(stru - struct wake_q_head *wqh); - - extern void rt_mutex_postunlock(struct wake_q_head *wake_q); -+/* RW semaphore special interface */ -+ -+int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, -+ struct hrtimer_sleeper *timeout, -+ enum rtmutex_chainwalk chwalk, -+ struct rt_mutex_waiter *waiter); - - #ifdef CONFIG_DEBUG_RT_MUTEXES - # include "rtmutex-debug.h" diff --git a/kernel/patches-5.11.x-rt/0089-0013-locking-rtmutex-export-lockdep-less-version-of-rt_mu.patch b/kernel/patches-5.11.x-rt/0089-0013-locking-rtmutex-export-lockdep-less-version-of-rt_mu.patch deleted file mode 100644 index 75ba6a559f..0000000000 --- a/kernel/patches-5.11.x-rt/0089-0013-locking-rtmutex-export-lockdep-less-version-of-rt_mu.patch +++ /dev/null @@ -1,121 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 16:36:39 +0200 -Subject: [PATCH 13/22] locking/rtmutex: export lockdep-less version of - rt_mutex's lock, trylock and unlock - -Required for lock implementation ontop of rtmutex. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 54 ++++++++++++++++++++++++++++------------ - kernel/locking/rtmutex_common.h | 3 ++ - 2 files changed, 41 insertions(+), 16 deletions(-) - ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1469,12 +1469,33 @@ rt_mutex_fastunlock(struct rt_mutex *loc - rt_mutex_postunlock(&wake_q); - } - --static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) -+int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) - { - might_sleep(); -+ return rt_mutex_fastlock(lock, state, rt_mutex_slowlock); -+} -+ -+/** -+ * rt_mutex_lock_state - lock a rt_mutex with a given state -+ * -+ * @lock: The rt_mutex to be locked -+ * @state: The state to set when blocking on the rt_mutex -+ */ -+static inline int __sched rt_mutex_lock_state(struct rt_mutex *lock, -+ unsigned int subclass, int state) -+{ -+ int ret; - - mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); -- rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, rt_mutex_slowlock); -+ ret = __rt_mutex_lock_state(lock, state); -+ if (ret) -+ mutex_release(&lock->dep_map, _RET_IP_); -+ return ret; -+} -+ -+static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) -+{ -+ rt_mutex_lock_state(lock, subclass, TASK_UNINTERRUPTIBLE); - } - - #ifdef CONFIG_DEBUG_LOCK_ALLOC -@@ -1515,16 +1536,7 @@ EXPORT_SYMBOL_GPL(rt_mutex_lock); - */ - int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock) - { -- int ret; -- -- might_sleep(); -- -- mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -- ret = rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, rt_mutex_slowlock); -- if (ret) -- mutex_release(&lock->dep_map, _RET_IP_); -- -- return ret; -+ return rt_mutex_lock_state(lock, 0, TASK_INTERRUPTIBLE); - } - EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible); - -@@ -1541,6 +1553,14 @@ int __sched __rt_mutex_futex_trylock(str - return __rt_mutex_slowtrylock(lock); - } - -+int __sched __rt_mutex_trylock(struct rt_mutex *lock) -+{ -+ if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) -+ return 0; -+ -+ return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); -+} -+ - /** - * rt_mutex_trylock - try to lock a rt_mutex - * -@@ -1556,10 +1576,7 @@ int __sched rt_mutex_trylock(struct rt_m - { - int ret; - -- if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) -- return 0; -- -- ret = rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); -+ ret = __rt_mutex_trylock(lock); - if (ret) - mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); - -@@ -1567,6 +1584,11 @@ int __sched rt_mutex_trylock(struct rt_m - } - EXPORT_SYMBOL_GPL(rt_mutex_trylock); - -+void __sched __rt_mutex_unlock(struct rt_mutex *lock) -+{ -+ rt_mutex_fastunlock(lock, rt_mutex_slowunlock); -+} -+ - /** - * rt_mutex_unlock - unlock a rt_mutex - * ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -156,6 +156,9 @@ extern bool __rt_mutex_futex_unlock(stru - extern void rt_mutex_postunlock(struct wake_q_head *wake_q); - /* RW semaphore special interface */ - -+extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); -+extern int __rt_mutex_trylock(struct rt_mutex *lock); -+extern void __rt_mutex_unlock(struct rt_mutex *lock); - int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, diff --git a/kernel/patches-5.11.x-rt/0090-0014-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch b/kernel/patches-5.11.x-rt/0090-0014-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch deleted file mode 100644 index 02796d443b..0000000000 --- a/kernel/patches-5.11.x-rt/0090-0014-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch +++ /dev/null @@ -1,105 +0,0 @@ -From: Thomas Gleixner -Date: Sat, 25 Jun 2011 09:21:04 +0200 -Subject: [PATCH 14/22] sched: Add saved_state for tasks blocked on sleeping - locks - -Spinlocks are state preserving in !RT. RT changes the state when a -task gets blocked on a lock. So we need to remember the state before -the lock contention. If a regular wakeup (not a RTmutex related -wakeup) happens, the saved_state is updated to running. When the lock -sleep is done, the saved state is restored. - -Signed-off-by: Thomas Gleixner ---- - include/linux/sched.h | 3 +++ - kernel/sched/core.c | 34 ++++++++++++++++++++++++++++++++-- - kernel/sched/sched.h | 1 + - 3 files changed, 36 insertions(+), 2 deletions(-) - ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -655,6 +655,8 @@ struct task_struct { - #endif - /* -1 unrunnable, 0 runnable, >0 stopped: */ - volatile long state; -+ /* saved state for "spinlock sleepers" */ -+ volatile long saved_state; - - /* - * This begins the randomizable portion of task_struct. Only -@@ -1777,6 +1779,7 @@ extern struct task_struct *find_get_task - - extern int wake_up_state(struct task_struct *tsk, unsigned int state); - extern int wake_up_process(struct task_struct *tsk); -+extern int wake_up_lock_sleeper(struct task_struct *tsk); - extern void wake_up_new_task(struct task_struct *tsk); - - #ifdef CONFIG_SMP ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3316,7 +3316,7 @@ try_to_wake_up(struct task_struct *p, un - int cpu, success = 0; - - preempt_disable(); -- if (p == current) { -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT) && p == current) { - /* - * We're waking current, this means 'p->on_rq' and 'task_cpu(p) - * == smp_processor_id()'. Together this means we can special -@@ -3346,8 +3346,26 @@ try_to_wake_up(struct task_struct *p, un - */ - raw_spin_lock_irqsave(&p->pi_lock, flags); - smp_mb__after_spinlock(); -- if (!(p->state & state)) -+ if (!(p->state & state)) { -+ /* -+ * The task might be running due to a spinlock sleeper -+ * wakeup. Check the saved state and set it to running -+ * if the wakeup condition is true. -+ */ -+ if (!(wake_flags & WF_LOCK_SLEEPER)) { -+ if (p->saved_state & state) { -+ p->saved_state = TASK_RUNNING; -+ success = 1; -+ } -+ } - goto unlock; -+ } -+ /* -+ * If this is a regular wakeup, then we can unconditionally -+ * clear the saved state of a "lock sleeper". -+ */ -+ if (!(wake_flags & WF_LOCK_SLEEPER)) -+ p->saved_state = TASK_RUNNING; - - trace_sched_waking(p); - -@@ -3536,6 +3554,18 @@ int wake_up_process(struct task_struct * - } - EXPORT_SYMBOL(wake_up_process); - -+/** -+ * wake_up_lock_sleeper - Wake up a specific process blocked on a "sleeping lock" -+ * @p: The process to be woken up. -+ * -+ * Same as wake_up_process() above, but wake_flags=WF_LOCK_SLEEPER to indicate -+ * the nature of the wakeup. -+ */ -+int wake_up_lock_sleeper(struct task_struct *p) -+{ -+ return try_to_wake_up(p, TASK_UNINTERRUPTIBLE, WF_LOCK_SLEEPER); -+} -+ - int wake_up_state(struct task_struct *p, unsigned int state) - { - return try_to_wake_up(p, state, 0); ---- a/kernel/sched/sched.h -+++ b/kernel/sched/sched.h -@@ -1751,6 +1751,7 @@ static inline int task_on_rq_migrating(s - #define WF_SYNC 0x10 /* Waker goes to sleep after wakeup */ - #define WF_MIGRATED 0x20 /* Internal use, task got migrated */ - #define WF_ON_CPU 0x40 /* Wakee is on_cpu */ -+#define WF_LOCK_SLEEPER 0x80 /* Wakeup spinlock "sleeper" */ - - #ifdef CONFIG_SMP - static_assert(WF_EXEC == SD_BALANCE_EXEC); diff --git a/kernel/patches-5.11.x-rt/0091-0015-locking-rtmutex-add-sleeping-lock-implementation.patch b/kernel/patches-5.11.x-rt/0091-0015-locking-rtmutex-add-sleeping-lock-implementation.patch deleted file mode 100644 index 70a1c945ec..0000000000 --- a/kernel/patches-5.11.x-rt/0091-0015-locking-rtmutex-add-sleeping-lock-implementation.patch +++ /dev/null @@ -1,1195 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:11:19 +0200 -Subject: [PATCH 15/22] locking/rtmutex: add sleeping lock implementation - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/kernel.h | 5 - include/linux/preempt.h | 4 - include/linux/rtmutex.h | 19 + - include/linux/sched.h | 7 - include/linux/sched/wake_q.h | 13 + - include/linux/spinlock_rt.h | 155 +++++++++++++ - include/linux/spinlock_types_rt.h | 38 +++ - kernel/fork.c | 1 - kernel/futex.c | 10 - kernel/locking/rtmutex.c | 444 ++++++++++++++++++++++++++++++++++---- - kernel/locking/rtmutex_common.h | 14 - - kernel/sched/core.c | 39 ++- - 12 files changed, 694 insertions(+), 55 deletions(-) - create mode 100644 include/linux/spinlock_rt.h - create mode 100644 include/linux/spinlock_types_rt.h - ---- a/include/linux/kernel.h -+++ b/include/linux/kernel.h -@@ -107,6 +107,10 @@ extern void __cant_migrate(const char *f - */ - # define might_sleep() \ - do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) -+ -+# define might_sleep_no_state_check() \ -+ do { ___might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) -+ - /** - * cant_sleep - annotation for functions that cannot sleep - * -@@ -150,6 +154,7 @@ extern void __cant_migrate(const char *f - static inline void __might_sleep(const char *file, int line, - int preempt_offset) { } - # define might_sleep() do { might_resched(); } while (0) -+# define might_sleep_no_state_check() do { might_resched(); } while (0) - # define cant_sleep() do { } while (0) - # define cant_migrate() do { } while (0) - # define sched_annotate_sleep() do { } while (0) ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -121,7 +121,11 @@ - /* - * The preempt_count offset after spin_lock() - */ -+#if !defined(CONFIG_PREEMPT_RT) - #define PREEMPT_LOCK_OFFSET PREEMPT_DISABLE_OFFSET -+#else -+#define PREEMPT_LOCK_OFFSET 0 -+#endif - - /* - * The preempt_count offset needed for things like: ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -19,6 +19,10 @@ - - extern int max_lock_depth; /* for sysctl */ - -+#ifdef CONFIG_DEBUG_MUTEXES -+#include -+#endif -+ - /** - * The rt_mutex structure - * -@@ -31,6 +35,7 @@ struct rt_mutex { - raw_spinlock_t wait_lock; - struct rb_root_cached waiters; - struct task_struct *owner; -+ int save_state; - #ifdef CONFIG_DEBUG_LOCK_ALLOC - struct lockdep_map dep_map; - #endif -@@ -67,11 +72,19 @@ do { \ - #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) - #endif - --#define __RT_MUTEX_INITIALIZER(mutexname) \ -- { .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ -+#define __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ -+ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ - , .waiters = RB_ROOT_CACHED \ - , .owner = NULL \ -- __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)} -+ __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) -+ -+#define __RT_MUTEX_INITIALIZER(mutexname) \ -+ { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ -+ , .save_state = 0 } -+ -+#define __RT_MUTEX_INITIALIZER_SAVE_STATE(mutexname) \ -+ { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ -+ , .save_state = 1 } - - #define DEFINE_RT_MUTEX(mutexname) \ - struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname) ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -141,6 +141,9 @@ struct io_uring_task; - smp_store_mb(current->state, (state_value)); \ - } while (0) - -+#define __set_current_state_no_track(state_value) \ -+ current->state = (state_value); -+ - #define set_special_state(state_value) \ - do { \ - unsigned long flags; /* may shadow */ \ -@@ -194,6 +197,9 @@ struct io_uring_task; - #define set_current_state(state_value) \ - smp_store_mb(current->state, (state_value)) - -+#define __set_current_state_no_track(state_value) \ -+ __set_current_state(state_value) -+ - /* - * set_special_state() should be used for those states when the blocking task - * can not use the regular condition based wait-loop. In that case we must -@@ -1015,6 +1021,7 @@ struct task_struct { - raw_spinlock_t pi_lock; - - struct wake_q_node wake_q; -+ struct wake_q_node wake_q_sleeper; - - #ifdef CONFIG_RT_MUTEXES - /* PI waiters blocked on a rt_mutex held by this task: */ ---- a/include/linux/sched/wake_q.h -+++ b/include/linux/sched/wake_q.h -@@ -58,6 +58,17 @@ static inline bool wake_q_empty(struct w - - extern void wake_q_add(struct wake_q_head *head, struct task_struct *task); - extern void wake_q_add_safe(struct wake_q_head *head, struct task_struct *task); --extern void wake_up_q(struct wake_q_head *head); -+extern void wake_q_add_sleeper(struct wake_q_head *head, struct task_struct *task); -+extern void __wake_up_q(struct wake_q_head *head, bool sleeper); -+ -+static inline void wake_up_q(struct wake_q_head *head) -+{ -+ __wake_up_q(head, false); -+} -+ -+static inline void wake_up_q_sleeper(struct wake_q_head *head) -+{ -+ __wake_up_q(head, true); -+} - - #endif /* _LINUX_SCHED_WAKE_Q_H */ ---- /dev/null -+++ b/include/linux/spinlock_rt.h -@@ -0,0 +1,155 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#ifndef __LINUX_SPINLOCK_RT_H -+#define __LINUX_SPINLOCK_RT_H -+ -+#ifndef __LINUX_SPINLOCK_H -+#error Do not include directly. Use spinlock.h -+#endif -+ -+#include -+ -+extern void -+__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key); -+ -+#define spin_lock_init(slock) \ -+do { \ -+ static struct lock_class_key __key; \ -+ \ -+ rt_mutex_init(&(slock)->lock); \ -+ __rt_spin_lock_init(slock, #slock, &__key); \ -+} while (0) -+ -+extern void __lockfunc rt_spin_lock(spinlock_t *lock); -+extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass); -+extern void __lockfunc rt_spin_lock_nest_lock(spinlock_t *lock, struct lockdep_map *nest_lock); -+extern void __lockfunc rt_spin_unlock(spinlock_t *lock); -+extern void __lockfunc rt_spin_lock_unlock(spinlock_t *lock); -+extern int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags); -+extern int __lockfunc rt_spin_trylock_bh(spinlock_t *lock); -+extern int __lockfunc rt_spin_trylock(spinlock_t *lock); -+extern int atomic_dec_and_spin_lock(atomic_t *atomic, spinlock_t *lock); -+ -+/* -+ * lockdep-less calls, for derived types like rwlock: -+ * (for trylock they can use rt_mutex_trylock() directly. -+ * Migrate disable handling must be done at the call site. -+ */ -+extern void __lockfunc __rt_spin_lock(struct rt_mutex *lock); -+extern void __lockfunc __rt_spin_trylock(struct rt_mutex *lock); -+extern void __lockfunc __rt_spin_unlock(struct rt_mutex *lock); -+ -+#define spin_lock(lock) rt_spin_lock(lock) -+ -+#define spin_lock_bh(lock) \ -+ do { \ -+ local_bh_disable(); \ -+ rt_spin_lock(lock); \ -+ } while (0) -+ -+#define spin_lock_irq(lock) spin_lock(lock) -+ -+#define spin_do_trylock(lock) __cond_lock(lock, rt_spin_trylock(lock)) -+ -+#define spin_trylock(lock) \ -+({ \ -+ int __locked; \ -+ __locked = spin_do_trylock(lock); \ -+ __locked; \ -+}) -+ -+#ifdef CONFIG_LOCKDEP -+# define spin_lock_nested(lock, subclass) \ -+ do { \ -+ rt_spin_lock_nested(lock, subclass); \ -+ } while (0) -+ -+#define spin_lock_bh_nested(lock, subclass) \ -+ do { \ -+ local_bh_disable(); \ -+ rt_spin_lock_nested(lock, subclass); \ -+ } while (0) -+ -+# define spin_lock_nest_lock(lock, subclass) \ -+ do { \ -+ typecheck(struct lockdep_map *, &(subclass)->dep_map); \ -+ rt_spin_lock_nest_lock(lock, &(subclass)->dep_map); \ -+ } while (0) -+ -+# define spin_lock_irqsave_nested(lock, flags, subclass) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ flags = 0; \ -+ rt_spin_lock_nested(lock, subclass); \ -+ } while (0) -+#else -+# define spin_lock_nested(lock, subclass) spin_lock(((void)(subclass), (lock))) -+# define spin_lock_nest_lock(lock, subclass) spin_lock(((void)(subclass), (lock))) -+# define spin_lock_bh_nested(lock, subclass) spin_lock_bh(((void)(subclass), (lock))) -+ -+# define spin_lock_irqsave_nested(lock, flags, subclass) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ flags = 0; \ -+ spin_lock(((void)(subclass), (lock))); \ -+ } while (0) -+#endif -+ -+#define spin_lock_irqsave(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ flags = 0; \ -+ spin_lock(lock); \ -+ } while (0) -+ -+#define spin_unlock(lock) rt_spin_unlock(lock) -+ -+#define spin_unlock_bh(lock) \ -+ do { \ -+ rt_spin_unlock(lock); \ -+ local_bh_enable(); \ -+ } while (0) -+ -+#define spin_unlock_irq(lock) spin_unlock(lock) -+ -+#define spin_unlock_irqrestore(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ (void) flags; \ -+ spin_unlock(lock); \ -+ } while (0) -+ -+#define spin_trylock_bh(lock) __cond_lock(lock, rt_spin_trylock_bh(lock)) -+#define spin_trylock_irq(lock) spin_trylock(lock) -+ -+#define spin_trylock_irqsave(lock, flags) \ -+({ \ -+ int __locked; \ -+ \ -+ typecheck(unsigned long, flags); \ -+ flags = 0; \ -+ __locked = spin_trylock(lock); \ -+ __locked; \ -+}) -+ -+#ifdef CONFIG_GENERIC_LOCKBREAK -+# define spin_is_contended(lock) ((lock)->break_lock) -+#else -+# define spin_is_contended(lock) (((void)(lock), 0)) -+#endif -+ -+static inline int spin_can_lock(spinlock_t *lock) -+{ -+ return !rt_mutex_is_locked(&lock->lock); -+} -+ -+static inline int spin_is_locked(spinlock_t *lock) -+{ -+ return rt_mutex_is_locked(&lock->lock); -+} -+ -+static inline void assert_spin_locked(spinlock_t *lock) -+{ -+ BUG_ON(!spin_is_locked(lock)); -+} -+ -+#endif ---- /dev/null -+++ b/include/linux/spinlock_types_rt.h -@@ -0,0 +1,38 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#ifndef __LINUX_SPINLOCK_TYPES_RT_H -+#define __LINUX_SPINLOCK_TYPES_RT_H -+ -+#ifndef __LINUX_SPINLOCK_TYPES_H -+#error "Do not include directly. Include spinlock_types.h instead" -+#endif -+ -+#include -+ -+/* -+ * PREEMPT_RT: spinlocks - an RT mutex plus lock-break field: -+ */ -+typedef struct spinlock { -+ struct rt_mutex lock; -+ unsigned int break_lock; -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+} spinlock_t; -+ -+#define __RT_SPIN_INITIALIZER(name) \ -+ { \ -+ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ -+ .save_state = 1, \ -+ } -+/* -+.wait_list = PLIST_HEAD_INIT_RAW((name).lock.wait_list, (name).lock.wait_lock) -+*/ -+ -+#define __SPIN_LOCK_UNLOCKED(name) \ -+ { .lock = __RT_SPIN_INITIALIZER(name.lock), \ -+ SPIN_DEP_MAP_INIT(name) } -+ -+#define DEFINE_SPINLOCK(name) \ -+ spinlock_t name = __SPIN_LOCK_UNLOCKED(name) -+ -+#endif ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -927,6 +927,7 @@ static struct task_struct *dup_task_stru - tsk->splice_pipe = NULL; - tsk->task_frag.page = NULL; - tsk->wake_q.next = NULL; -+ tsk->wake_q_sleeper.next = NULL; - - account_kernel_stack(tsk, 1); - ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -1497,6 +1497,7 @@ static int wake_futex_pi(u32 __user *uad - struct task_struct *new_owner; - bool postunlock = false; - DEFINE_WAKE_Q(wake_q); -+ DEFINE_WAKE_Q(wake_sleeper_q); - int ret = 0; - - new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); -@@ -1546,14 +1547,15 @@ static int wake_futex_pi(u32 __user *uad - * not fail. - */ - pi_state_update_owner(pi_state, new_owner); -- postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q); -+ postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q, -+ &wake_sleeper_q); - } - - out_unlock: - raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); - - if (postunlock) -- rt_mutex_postunlock(&wake_q); -+ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); - - return ret; - } -@@ -2857,7 +2859,7 @@ static int futex_lock_pi(u32 __user *uad - goto no_block; - } - -- rt_mutex_init_waiter(&rt_waiter); -+ rt_mutex_init_waiter(&rt_waiter, false); - - /* - * On PREEMPT_RT_FULL, when hb->lock becomes an rt_mutex, we must not -@@ -3203,7 +3205,7 @@ static int futex_wait_requeue_pi(u32 __u - * The waiter is allocated on our stack, manipulated by the requeue - * code while we sleep on uaddr. - */ -- rt_mutex_init_waiter(&rt_waiter); -+ rt_mutex_init_waiter(&rt_waiter, false); - - ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, FUTEX_WRITE); - if (unlikely(ret != 0)) ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -8,6 +8,11 @@ - * Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner - * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt - * Copyright (C) 2006 Esben Nielsen -+ * Adaptive Spinlocks: -+ * Copyright (C) 2008 Novell, Inc., Gregory Haskins, Sven Dietrich, -+ * and Peter Morreale, -+ * Adaptive Spinlocks simplification: -+ * Copyright (C) 2008 Red Hat, Inc., Steven Rostedt - * - * See Documentation/locking/rt-mutex-design.rst for details. - */ -@@ -233,7 +238,7 @@ static inline bool unlock_rt_mutex_safe( - * Only use with rt_mutex_waiter_{less,equal}() - */ - #define task_to_waiter(p) \ -- &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline } -+ &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline, .task = (p) } - - static inline int - rt_mutex_waiter_less(struct rt_mutex_waiter *left, -@@ -273,6 +278,27 @@ rt_mutex_waiter_equal(struct rt_mutex_wa - return 1; - } - -+#define STEAL_NORMAL 0 -+#define STEAL_LATERAL 1 -+ -+static inline int -+rt_mutex_steal(struct rt_mutex *lock, struct rt_mutex_waiter *waiter, int mode) -+{ -+ struct rt_mutex_waiter *top_waiter = rt_mutex_top_waiter(lock); -+ -+ if (waiter == top_waiter || rt_mutex_waiter_less(waiter, top_waiter)) -+ return 1; -+ -+ /* -+ * Note that RT tasks are excluded from lateral-steals -+ * to prevent the introduction of an unbounded latency. -+ */ -+ if (mode == STEAL_NORMAL || rt_task(waiter->task)) -+ return 0; -+ -+ return rt_mutex_waiter_equal(waiter, top_waiter); -+} -+ - static void - rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) - { -@@ -377,6 +403,14 @@ static bool rt_mutex_cond_detect_deadloc - return debug_rt_mutex_detect_deadlock(waiter, chwalk); - } - -+static void rt_mutex_wake_waiter(struct rt_mutex_waiter *waiter) -+{ -+ if (waiter->savestate) -+ wake_up_lock_sleeper(waiter->task); -+ else -+ wake_up_process(waiter->task); -+} -+ - /* - * Max number of times we'll walk the boosting chain: - */ -@@ -700,13 +734,16 @@ static int rt_mutex_adjust_prio_chain(st - * follow here. This is the end of the chain we are walking. - */ - if (!rt_mutex_owner(lock)) { -+ struct rt_mutex_waiter *lock_top_waiter; -+ - /* - * If the requeue [7] above changed the top waiter, - * then we need to wake the new top waiter up to try - * to get the lock. - */ -- if (prerequeue_top_waiter != rt_mutex_top_waiter(lock)) -- wake_up_process(rt_mutex_top_waiter(lock)->task); -+ lock_top_waiter = rt_mutex_top_waiter(lock); -+ if (prerequeue_top_waiter != lock_top_waiter) -+ rt_mutex_wake_waiter(lock_top_waiter); - raw_spin_unlock_irq(&lock->wait_lock); - return 0; - } -@@ -807,9 +844,11 @@ static int rt_mutex_adjust_prio_chain(st - * @task: The task which wants to acquire the lock - * @waiter: The waiter that is queued to the lock's wait tree if the - * callsite called task_blocked_on_lock(), otherwise NULL -+ * @mode: Lock steal mode (STEAL_NORMAL, STEAL_LATERAL) - */ --static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, -- struct rt_mutex_waiter *waiter) -+static int __try_to_take_rt_mutex(struct rt_mutex *lock, -+ struct task_struct *task, -+ struct rt_mutex_waiter *waiter, int mode) - { - lockdep_assert_held(&lock->wait_lock); - -@@ -845,12 +884,11 @@ static int try_to_take_rt_mutex(struct r - */ - if (waiter) { - /* -- * If waiter is not the highest priority waiter of -- * @lock, give up. -+ * If waiter is not the highest priority waiter of @lock, -+ * or its peer when lateral steal is allowed, give up. - */ -- if (waiter != rt_mutex_top_waiter(lock)) -+ if (!rt_mutex_steal(lock, waiter, mode)) - return 0; -- - /* - * We can acquire the lock. Remove the waiter from the - * lock waiters tree. -@@ -868,14 +906,12 @@ static int try_to_take_rt_mutex(struct r - */ - if (rt_mutex_has_waiters(lock)) { - /* -- * If @task->prio is greater than or equal to -- * the top waiter priority (kernel view), -- * @task lost. -+ * If @task->prio is greater than the top waiter -+ * priority (kernel view), or equal to it when a -+ * lateral steal is forbidden, @task lost. - */ -- if (!rt_mutex_waiter_less(task_to_waiter(task), -- rt_mutex_top_waiter(lock))) -+ if (!rt_mutex_steal(lock, task_to_waiter(task), mode)) - return 0; -- - /* - * The current top waiter stays enqueued. We - * don't have to change anything in the lock -@@ -922,6 +958,289 @@ static int try_to_take_rt_mutex(struct r - return 1; - } - -+#ifdef CONFIG_PREEMPT_RT -+/* -+ * preemptible spin_lock functions: -+ */ -+static inline void rt_spin_lock_fastlock(struct rt_mutex *lock, -+ void (*slowfn)(struct rt_mutex *lock)) -+{ -+ might_sleep_no_state_check(); -+ -+ if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) -+ return; -+ else -+ slowfn(lock); -+} -+ -+static inline void rt_spin_lock_fastunlock(struct rt_mutex *lock, -+ void (*slowfn)(struct rt_mutex *lock)) -+{ -+ if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) -+ return; -+ else -+ slowfn(lock); -+} -+#ifdef CONFIG_SMP -+/* -+ * Note that owner is a speculative pointer and dereferencing relies -+ * on rcu_read_lock() and the check against the lock owner. -+ */ -+static int adaptive_wait(struct rt_mutex *lock, -+ struct task_struct *owner) -+{ -+ int res = 0; -+ -+ rcu_read_lock(); -+ for (;;) { -+ if (owner != rt_mutex_owner(lock)) -+ break; -+ /* -+ * Ensure that owner->on_cpu is dereferenced _after_ -+ * checking the above to be valid. -+ */ -+ barrier(); -+ if (!owner->on_cpu) { -+ res = 1; -+ break; -+ } -+ cpu_relax(); -+ } -+ rcu_read_unlock(); -+ return res; -+} -+#else -+static int adaptive_wait(struct rt_mutex *lock, -+ struct task_struct *orig_owner) -+{ -+ return 1; -+} -+#endif -+ -+static int task_blocks_on_rt_mutex(struct rt_mutex *lock, -+ struct rt_mutex_waiter *waiter, -+ struct task_struct *task, -+ enum rtmutex_chainwalk chwalk); -+/* -+ * Slow path lock function spin_lock style: this variant is very -+ * careful not to miss any non-lock wakeups. -+ * -+ * We store the current state under p->pi_lock in p->saved_state and -+ * the try_to_wake_up() code handles this accordingly. -+ */ -+void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, -+ struct rt_mutex_waiter *waiter, -+ unsigned long flags) -+{ -+ struct task_struct *lock_owner, *self = current; -+ struct rt_mutex_waiter *top_waiter; -+ int ret; -+ -+ if (__try_to_take_rt_mutex(lock, self, NULL, STEAL_LATERAL)) -+ return; -+ -+ BUG_ON(rt_mutex_owner(lock) == self); -+ -+ /* -+ * We save whatever state the task is in and we'll restore it -+ * after acquiring the lock taking real wakeups into account -+ * as well. We are serialized via pi_lock against wakeups. See -+ * try_to_wake_up(). -+ */ -+ raw_spin_lock(&self->pi_lock); -+ self->saved_state = self->state; -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock(&self->pi_lock); -+ -+ ret = task_blocks_on_rt_mutex(lock, waiter, self, RT_MUTEX_MIN_CHAINWALK); -+ BUG_ON(ret); -+ -+ for (;;) { -+ /* Try to acquire the lock again. */ -+ if (__try_to_take_rt_mutex(lock, self, waiter, STEAL_LATERAL)) -+ break; -+ -+ top_waiter = rt_mutex_top_waiter(lock); -+ lock_owner = rt_mutex_owner(lock); -+ -+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); -+ -+ if (top_waiter != waiter || adaptive_wait(lock, lock_owner)) -+ schedule(); -+ -+ raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ -+ raw_spin_lock(&self->pi_lock); -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock(&self->pi_lock); -+ } -+ -+ /* -+ * Restore the task state to current->saved_state. We set it -+ * to the original state above and the try_to_wake_up() code -+ * has possibly updated it when a real (non-rtmutex) wakeup -+ * happened while we were blocked. Clear saved_state so -+ * try_to_wakeup() does not get confused. -+ */ -+ raw_spin_lock(&self->pi_lock); -+ __set_current_state_no_track(self->saved_state); -+ self->saved_state = TASK_RUNNING; -+ raw_spin_unlock(&self->pi_lock); -+ -+ /* -+ * try_to_take_rt_mutex() sets the waiter bit -+ * unconditionally. We might have to fix that up: -+ */ -+ fixup_rt_mutex_waiters(lock); -+ -+ BUG_ON(rt_mutex_has_waiters(lock) && waiter == rt_mutex_top_waiter(lock)); -+ BUG_ON(!RB_EMPTY_NODE(&waiter->tree_entry)); -+} -+ -+static void noinline __sched rt_spin_lock_slowlock(struct rt_mutex *lock) -+{ -+ struct rt_mutex_waiter waiter; -+ unsigned long flags; -+ -+ rt_mutex_init_waiter(&waiter, true); -+ -+ raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ rt_spin_lock_slowlock_locked(lock, &waiter, flags); -+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); -+ debug_rt_mutex_free_waiter(&waiter); -+} -+ -+static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, -+ struct wake_q_head *wake_q, -+ struct wake_q_head *wq_sleeper); -+/* -+ * Slow path to release a rt_mutex spin_lock style -+ */ -+void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock) -+{ -+ unsigned long flags; -+ DEFINE_WAKE_Q(wake_q); -+ DEFINE_WAKE_Q(wake_sleeper_q); -+ bool postunlock; -+ -+ raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ postunlock = __rt_mutex_unlock_common(lock, &wake_q, &wake_sleeper_q); -+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); -+ -+ if (postunlock) -+ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); -+} -+ -+void __lockfunc rt_spin_lock(spinlock_t *lock) -+{ -+ spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); -+ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -+ migrate_disable(); -+} -+EXPORT_SYMBOL(rt_spin_lock); -+ -+void __lockfunc __rt_spin_lock(struct rt_mutex *lock) -+{ -+ rt_spin_lock_fastlock(lock, rt_spin_lock_slowlock); -+} -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) -+{ -+ spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); -+ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -+ migrate_disable(); -+} -+EXPORT_SYMBOL(rt_spin_lock_nested); -+ -+void __lockfunc rt_spin_lock_nest_lock(spinlock_t *lock, -+ struct lockdep_map *nest_lock) -+{ -+ spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); -+ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -+ migrate_disable(); -+} -+EXPORT_SYMBOL(rt_spin_lock_nest_lock); -+#endif -+ -+void __lockfunc rt_spin_unlock(spinlock_t *lock) -+{ -+ /* NOTE: we always pass in '1' for nested, for simplicity */ -+ spin_release(&lock->dep_map, _RET_IP_); -+ migrate_enable(); -+ rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); -+} -+EXPORT_SYMBOL(rt_spin_unlock); -+ -+void __lockfunc __rt_spin_unlock(struct rt_mutex *lock) -+{ -+ rt_spin_lock_fastunlock(lock, rt_spin_lock_slowunlock); -+} -+EXPORT_SYMBOL(__rt_spin_unlock); -+ -+/* -+ * Wait for the lock to get unlocked: instead of polling for an unlock -+ * (like raw spinlocks do), we lock and unlock, to force the kernel to -+ * schedule if there's contention: -+ */ -+void __lockfunc rt_spin_lock_unlock(spinlock_t *lock) -+{ -+ spin_lock(lock); -+ spin_unlock(lock); -+} -+EXPORT_SYMBOL(rt_spin_lock_unlock); -+ -+int __lockfunc rt_spin_trylock(spinlock_t *lock) -+{ -+ int ret; -+ -+ ret = __rt_mutex_trylock(&lock->lock); -+ if (ret) { -+ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ migrate_disable(); -+ } -+ return ret; -+} -+EXPORT_SYMBOL(rt_spin_trylock); -+ -+int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) -+{ -+ int ret; -+ -+ local_bh_disable(); -+ ret = __rt_mutex_trylock(&lock->lock); -+ if (ret) { -+ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ migrate_disable(); -+ } else { -+ local_bh_enable(); -+ } -+ return ret; -+} -+EXPORT_SYMBOL(rt_spin_trylock_bh); -+ -+void -+__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key) -+{ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ /* -+ * Make sure we are not reinitializing a held lock: -+ */ -+ debug_check_no_locks_freed((void *)lock, sizeof(*lock)); -+ lockdep_init_map(&lock->dep_map, name, key, 0); -+#endif -+} -+EXPORT_SYMBOL(__rt_spin_lock_init); -+ -+#endif /* PREEMPT_RT */ -+ -+static inline int -+try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, -+ struct rt_mutex_waiter *waiter) -+{ -+ return __try_to_take_rt_mutex(lock, task, waiter, STEAL_NORMAL); -+} -+ - /* - * Task blocks on lock. - * -@@ -1035,6 +1354,7 @@ static int task_blocks_on_rt_mutex(struc - * Called with lock->wait_lock held and interrupts disabled. - */ - static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, -+ struct wake_q_head *wake_sleeper_q, - struct rt_mutex *lock) - { - struct rt_mutex_waiter *waiter; -@@ -1074,7 +1394,10 @@ static void mark_wakeup_next_waiter(stru - * Pairs with preempt_enable() in rt_mutex_postunlock(); - */ - preempt_disable(); -- wake_q_add(wake_q, waiter->task); -+ if (waiter->savestate) -+ wake_q_add_sleeper(wake_sleeper_q, waiter->task); -+ else -+ wake_q_add(wake_q, waiter->task); - raw_spin_unlock(¤t->pi_lock); - } - -@@ -1158,21 +1481,22 @@ void rt_mutex_adjust_pi(struct task_stru - return; - } - next_lock = waiter->lock; -- raw_spin_unlock_irqrestore(&task->pi_lock, flags); - - /* gets dropped in rt_mutex_adjust_prio_chain()! */ - get_task_struct(task); - -+ raw_spin_unlock_irqrestore(&task->pi_lock, flags); - rt_mutex_adjust_prio_chain(task, RT_MUTEX_MIN_CHAINWALK, NULL, - next_lock, NULL, task); - } - --void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) -+void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate) - { - debug_rt_mutex_init_waiter(waiter); - RB_CLEAR_NODE(&waiter->pi_tree_entry); - RB_CLEAR_NODE(&waiter->tree_entry); - waiter->task = NULL; -+ waiter->savestate = savestate; - } - - /** -@@ -1283,7 +1607,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, - unsigned long flags; - int ret = 0; - -- rt_mutex_init_waiter(&waiter); -+ rt_mutex_init_waiter(&waiter, false); - - /* - * Technically we could use raw_spin_[un]lock_irq() here, but this can -@@ -1356,7 +1680,8 @@ static inline int rt_mutex_slowtrylock(s - * Return whether the current task needs to call rt_mutex_postunlock(). - */ - static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, -- struct wake_q_head *wake_q) -+ struct wake_q_head *wake_q, -+ struct wake_q_head *wake_sleeper_q) - { - unsigned long flags; - -@@ -1410,7 +1735,7 @@ static bool __sched rt_mutex_slowunlock( - * - * Queue the next waiter for wakeup once we release the wait_lock. - */ -- mark_wakeup_next_waiter(wake_q, lock); -+ mark_wakeup_next_waiter(wake_q, wake_sleeper_q, lock); - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - - return true; /* call rt_mutex_postunlock() */ -@@ -1447,9 +1772,11 @@ rt_mutex_fasttrylock(struct rt_mutex *lo - /* - * Performs the wakeup of the the top-waiter and re-enables preemption. - */ --void rt_mutex_postunlock(struct wake_q_head *wake_q) -+void rt_mutex_postunlock(struct wake_q_head *wake_q, -+ struct wake_q_head *wake_sleeper_q) - { - wake_up_q(wake_q); -+ wake_up_q_sleeper(wake_sleeper_q); - - /* Pairs with preempt_disable() in rt_mutex_slowunlock() */ - preempt_enable(); -@@ -1458,15 +1785,17 @@ void rt_mutex_postunlock(struct wake_q_h - static inline void - rt_mutex_fastunlock(struct rt_mutex *lock, - bool (*slowfn)(struct rt_mutex *lock, -- struct wake_q_head *wqh)) -+ struct wake_q_head *wqh, -+ struct wake_q_head *wq_sleeper)) - { - DEFINE_WAKE_Q(wake_q); -+ DEFINE_WAKE_Q(wake_sleeper_q); - - if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) - return; - -- if (slowfn(lock, &wake_q)) -- rt_mutex_postunlock(&wake_q); -+ if (slowfn(lock, &wake_q, &wake_sleeper_q)) -+ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); - } - - int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) -@@ -1597,16 +1926,13 @@ void __sched __rt_mutex_unlock(struct rt - void __sched rt_mutex_unlock(struct rt_mutex *lock) - { - mutex_release(&lock->dep_map, _RET_IP_); -- rt_mutex_fastunlock(lock, rt_mutex_slowunlock); -+ __rt_mutex_unlock(lock); - } - EXPORT_SYMBOL_GPL(rt_mutex_unlock); - --/** -- * Futex variant, that since futex variants do not use the fast-path, can be -- * simple and will not need to retry. -- */ --bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, -- struct wake_q_head *wake_q) -+static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, -+ struct wake_q_head *wake_q, -+ struct wake_q_head *wq_sleeper) - { - lockdep_assert_held(&lock->wait_lock); - -@@ -1623,23 +1949,35 @@ bool __sched __rt_mutex_futex_unlock(str - * avoid inversion prior to the wakeup. preempt_disable() - * therein pairs with rt_mutex_postunlock(). - */ -- mark_wakeup_next_waiter(wake_q, lock); -+ mark_wakeup_next_waiter(wake_q, wq_sleeper, lock); - - return true; /* call postunlock() */ - } - -+/** -+ * Futex variant, that since futex variants do not use the fast-path, can be -+ * simple and will not need to retry. -+ */ -+bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, -+ struct wake_q_head *wake_q, -+ struct wake_q_head *wq_sleeper) -+{ -+ return __rt_mutex_unlock_common(lock, wake_q, wq_sleeper); -+} -+ - void __sched rt_mutex_futex_unlock(struct rt_mutex *lock) - { - DEFINE_WAKE_Q(wake_q); -+ DEFINE_WAKE_Q(wake_sleeper_q); - unsigned long flags; - bool postunlock; - - raw_spin_lock_irqsave(&lock->wait_lock, flags); -- postunlock = __rt_mutex_futex_unlock(lock, &wake_q); -+ postunlock = __rt_mutex_futex_unlock(lock, &wake_q, &wake_sleeper_q); - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - - if (postunlock) -- rt_mutex_postunlock(&wake_q); -+ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); - } - - /** -@@ -1675,7 +2013,7 @@ void __rt_mutex_init(struct rt_mutex *lo - if (name && key) - debug_rt_mutex_init(lock, name, key); - } --EXPORT_SYMBOL_GPL(__rt_mutex_init); -+EXPORT_SYMBOL(__rt_mutex_init); - - /** - * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a -@@ -1695,6 +2033,14 @@ void rt_mutex_init_proxy_locked(struct r - struct task_struct *proxy_owner) - { - __rt_mutex_init(lock, NULL, NULL); -+#ifdef CONFIG_DEBUG_SPINLOCK -+ /* -+ * get another key class for the wait_lock. LOCK_PI and UNLOCK_PI is -+ * holding the ->wait_lock of the proxy_lock while unlocking a sleeping -+ * lock. -+ */ -+ raw_spin_lock_init(&lock->wait_lock); -+#endif - debug_rt_mutex_proxy_lock(lock, proxy_owner); - rt_mutex_set_owner(lock, proxy_owner); - } -@@ -1717,6 +2063,26 @@ void rt_mutex_proxy_unlock(struct rt_mut - rt_mutex_set_owner(lock, NULL); - } - -+static void fixup_rt_mutex_blocked(struct rt_mutex *lock) -+{ -+ struct task_struct *tsk = current; -+ /* -+ * RT has a problem here when the wait got interrupted by a timeout -+ * or a signal. task->pi_blocked_on is still set. The task must -+ * acquire the hash bucket lock when returning from this function. -+ * -+ * If the hash bucket lock is contended then the -+ * BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in -+ * task_blocks_on_rt_mutex() will trigger. This can be avoided by -+ * clearing task->pi_blocked_on which removes the task from the -+ * boosting chain of the rtmutex. That's correct because the task -+ * is not longer blocked on it. -+ */ -+ raw_spin_lock(&tsk->pi_lock); -+ tsk->pi_blocked_on = NULL; -+ raw_spin_unlock(&tsk->pi_lock); -+} -+ - /** - * __rt_mutex_start_proxy_lock() - Start lock acquisition for another task - * @lock: the rt_mutex to take -@@ -1789,6 +2155,9 @@ int __rt_mutex_start_proxy_lock(struct r - ret = 0; - } - -+ if (ret) -+ fixup_rt_mutex_blocked(lock); -+ - return ret; - } - -@@ -1878,6 +2247,9 @@ int rt_mutex_wait_proxy_lock(struct rt_m - * have to fix that up. - */ - fixup_rt_mutex_waiters(lock); -+ if (ret) -+ fixup_rt_mutex_blocked(lock); -+ - raw_spin_unlock_irq(&lock->wait_lock); - - return ret; ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -31,6 +31,7 @@ struct rt_mutex_waiter { - struct task_struct *task; - struct rt_mutex *lock; - int prio; -+ bool savestate; - u64 deadline; - }; - -@@ -133,7 +134,7 @@ extern struct task_struct *rt_mutex_next - extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, - struct task_struct *proxy_owner); - extern void rt_mutex_proxy_unlock(struct rt_mutex *lock); --extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter); -+extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savetate); - extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, - struct rt_mutex_waiter *waiter, - struct task_struct *task); -@@ -151,9 +152,12 @@ extern int __rt_mutex_futex_trylock(stru - - extern void rt_mutex_futex_unlock(struct rt_mutex *lock); - extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, -- struct wake_q_head *wqh); -+ struct wake_q_head *wqh, -+ struct wake_q_head *wq_sleeper); -+ -+extern void rt_mutex_postunlock(struct wake_q_head *wake_q, -+ struct wake_q_head *wake_sleeper_q); - --extern void rt_mutex_postunlock(struct wake_q_head *wake_q); - /* RW semaphore special interface */ - - extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); -@@ -163,6 +167,10 @@ int __sched rt_mutex_slowlock_locked(str - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, - struct rt_mutex_waiter *waiter); -+void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, -+ struct rt_mutex_waiter *waiter, -+ unsigned long flags); -+void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock); - - #ifdef CONFIG_DEBUG_RT_MUTEXES - # include "rtmutex-debug.h" ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -502,9 +502,15 @@ static bool set_nr_if_polling(struct tas - #endif - #endif - --static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task) -+static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task, -+ bool sleeper) - { -- struct wake_q_node *node = &task->wake_q; -+ struct wake_q_node *node; -+ -+ if (sleeper) -+ node = &task->wake_q_sleeper; -+ else -+ node = &task->wake_q; - - /* - * Atomically grab the task, if ->wake_q is !nil already it means -@@ -540,7 +546,13 @@ static bool __wake_q_add(struct wake_q_h - */ - void wake_q_add(struct wake_q_head *head, struct task_struct *task) - { -- if (__wake_q_add(head, task)) -+ if (__wake_q_add(head, task, false)) -+ get_task_struct(task); -+} -+ -+void wake_q_add_sleeper(struct wake_q_head *head, struct task_struct *task) -+{ -+ if (__wake_q_add(head, task, true)) - get_task_struct(task); - } - -@@ -563,28 +575,39 @@ void wake_q_add(struct wake_q_head *head - */ - void wake_q_add_safe(struct wake_q_head *head, struct task_struct *task) - { -- if (!__wake_q_add(head, task)) -+ if (!__wake_q_add(head, task, false)) - put_task_struct(task); - } - --void wake_up_q(struct wake_q_head *head) -+void __wake_up_q(struct wake_q_head *head, bool sleeper) - { - struct wake_q_node *node = head->first; - - while (node != WAKE_Q_TAIL) { - struct task_struct *task; - -- task = container_of(node, struct task_struct, wake_q); -+ if (sleeper) -+ task = container_of(node, struct task_struct, wake_q_sleeper); -+ else -+ task = container_of(node, struct task_struct, wake_q); -+ - BUG_ON(!task); - /* Task can safely be re-inserted now: */ - node = node->next; -- task->wake_q.next = NULL; - -+ if (sleeper) -+ task->wake_q_sleeper.next = NULL; -+ else -+ task->wake_q.next = NULL; - /* - * wake_up_process() executes a full barrier, which pairs with - * the queueing in wake_q_add() so as not to miss wakeups. - */ -- wake_up_process(task); -+ if (sleeper) -+ wake_up_lock_sleeper(task); -+ else -+ wake_up_process(task); -+ - put_task_struct(task); - } - } diff --git a/kernel/patches-5.11.x-rt/0092-0016-locking-rtmutex-Allow-rt_mutex_trylock-on-PREEMPT_RT.patch b/kernel/patches-5.11.x-rt/0092-0016-locking-rtmutex-Allow-rt_mutex_trylock-on-PREEMPT_RT.patch deleted file mode 100644 index 0412101446..0000000000 --- a/kernel/patches-5.11.x-rt/0092-0016-locking-rtmutex-Allow-rt_mutex_trylock-on-PREEMPT_RT.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 2 Dec 2015 11:34:07 +0100 -Subject: [PATCH 16/22] locking/rtmutex: Allow rt_mutex_trylock() on PREEMPT_RT - -Non PREEMPT_RT kernel can deadlock on rt_mutex_trylock() in softirq -context. -On PREEMPT_RT the softirq context is handled in thread context. This -avoids the deadlock in the slow path and PI-boosting will be done on the -correct thread. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1884,7 +1884,11 @@ int __sched __rt_mutex_futex_trylock(str - - int __sched __rt_mutex_trylock(struct rt_mutex *lock) - { -+#ifdef CONFIG_PREEMPT_RT -+ if (WARN_ON_ONCE(in_irq() || in_nmi())) -+#else - if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) -+#endif - return 0; - - return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); diff --git a/kernel/patches-5.11.x-rt/0093-0017-locking-rtmutex-add-mutex-implementation-based-on-rt.patch b/kernel/patches-5.11.x-rt/0093-0017-locking-rtmutex-add-mutex-implementation-based-on-rt.patch deleted file mode 100644 index 06198cd72d..0000000000 --- a/kernel/patches-5.11.x-rt/0093-0017-locking-rtmutex-add-mutex-implementation-based-on-rt.patch +++ /dev/null @@ -1,374 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:17:03 +0200 -Subject: [PATCH 17/22] locking/rtmutex: add mutex implementation based on - rtmutex - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/mutex_rt.h | 130 ++++++++++++++++++++++++++ - kernel/locking/mutex-rt.c | 224 ++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 354 insertions(+) - create mode 100644 include/linux/mutex_rt.h - create mode 100644 kernel/locking/mutex-rt.c - ---- /dev/null -+++ b/include/linux/mutex_rt.h -@@ -0,0 +1,130 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#ifndef __LINUX_MUTEX_RT_H -+#define __LINUX_MUTEX_RT_H -+ -+#ifndef __LINUX_MUTEX_H -+#error "Please include mutex.h" -+#endif -+ -+#include -+ -+/* FIXME: Just for __lockfunc */ -+#include -+ -+struct mutex { -+ struct rt_mutex lock; -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+}; -+ -+#define __MUTEX_INITIALIZER(mutexname) \ -+ { \ -+ .lock = __RT_MUTEX_INITIALIZER(mutexname.lock) \ -+ __DEP_MAP_MUTEX_INITIALIZER(mutexname) \ -+ } -+ -+#define DEFINE_MUTEX(mutexname) \ -+ struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) -+ -+extern void __mutex_do_init(struct mutex *lock, const char *name, struct lock_class_key *key); -+extern void __lockfunc _mutex_lock(struct mutex *lock); -+extern void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass); -+extern int __lockfunc _mutex_lock_interruptible(struct mutex *lock); -+extern int __lockfunc _mutex_lock_killable(struct mutex *lock); -+extern void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass); -+extern void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest_lock); -+extern int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass); -+extern int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass); -+extern int __lockfunc _mutex_trylock(struct mutex *lock); -+extern void __lockfunc _mutex_unlock(struct mutex *lock); -+ -+#define mutex_is_locked(l) rt_mutex_is_locked(&(l)->lock) -+#define mutex_lock(l) _mutex_lock(l) -+#define mutex_lock_interruptible(l) _mutex_lock_interruptible(l) -+#define mutex_lock_killable(l) _mutex_lock_killable(l) -+#define mutex_trylock(l) _mutex_trylock(l) -+#define mutex_unlock(l) _mutex_unlock(l) -+#define mutex_lock_io(l) _mutex_lock_io_nested(l, 0); -+ -+#define __mutex_owner(l) ((l)->lock.owner) -+ -+#ifdef CONFIG_DEBUG_MUTEXES -+#define mutex_destroy(l) rt_mutex_destroy(&(l)->lock) -+#else -+static inline void mutex_destroy(struct mutex *lock) {} -+#endif -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define mutex_lock_nested(l, s) _mutex_lock_nested(l, s) -+# define mutex_lock_interruptible_nested(l, s) \ -+ _mutex_lock_interruptible_nested(l, s) -+# define mutex_lock_killable_nested(l, s) \ -+ _mutex_lock_killable_nested(l, s) -+# define mutex_lock_io_nested(l, s) _mutex_lock_io_nested(l, s) -+ -+# define mutex_lock_nest_lock(lock, nest_lock) \ -+do { \ -+ typecheck(struct lockdep_map *, &(nest_lock)->dep_map); \ -+ _mutex_lock_nest_lock(lock, &(nest_lock)->dep_map); \ -+} while (0) -+ -+#else -+# define mutex_lock_nested(l, s) _mutex_lock(l) -+# define mutex_lock_interruptible_nested(l, s) \ -+ _mutex_lock_interruptible(l) -+# define mutex_lock_killable_nested(l, s) \ -+ _mutex_lock_killable(l) -+# define mutex_lock_nest_lock(lock, nest_lock) mutex_lock(lock) -+# define mutex_lock_io_nested(l, s) _mutex_lock_io_nested(l, s) -+#endif -+ -+# define mutex_init(mutex) \ -+do { \ -+ static struct lock_class_key __key; \ -+ \ -+ rt_mutex_init(&(mutex)->lock); \ -+ __mutex_do_init((mutex), #mutex, &__key); \ -+} while (0) -+ -+# define __mutex_init(mutex, name, key) \ -+do { \ -+ rt_mutex_init(&(mutex)->lock); \ -+ __mutex_do_init((mutex), name, key); \ -+} while (0) -+ -+/** -+ * These values are chosen such that FAIL and SUCCESS match the -+ * values of the regular mutex_trylock(). -+ */ -+enum mutex_trylock_recursive_enum { -+ MUTEX_TRYLOCK_FAILED = 0, -+ MUTEX_TRYLOCK_SUCCESS = 1, -+ MUTEX_TRYLOCK_RECURSIVE, -+}; -+/** -+ * mutex_trylock_recursive - trylock variant that allows recursive locking -+ * @lock: mutex to be locked -+ * -+ * This function should not be used, _ever_. It is purely for hysterical GEM -+ * raisins, and once those are gone this will be removed. -+ * -+ * Returns: -+ * MUTEX_TRYLOCK_FAILED - trylock failed, -+ * MUTEX_TRYLOCK_SUCCESS - lock acquired, -+ * MUTEX_TRYLOCK_RECURSIVE - we already owned the lock. -+ */ -+int __rt_mutex_owner_current(struct rt_mutex *lock); -+ -+static inline /* __deprecated */ __must_check enum mutex_trylock_recursive_enum -+mutex_trylock_recursive(struct mutex *lock) -+{ -+ if (unlikely(__rt_mutex_owner_current(&lock->lock))) -+ return MUTEX_TRYLOCK_RECURSIVE; -+ -+ return mutex_trylock(lock); -+} -+ -+extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); -+ -+#endif ---- /dev/null -+++ b/kernel/locking/mutex-rt.c -@@ -0,0 +1,224 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Real-Time Preemption Support -+ * -+ * started by Ingo Molnar: -+ * -+ * Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar -+ * Copyright (C) 2006, Timesys Corp., Thomas Gleixner -+ * -+ * historic credit for proving that Linux spinlocks can be implemented via -+ * RT-aware mutexes goes to many people: The Pmutex project (Dirk Grambow -+ * and others) who prototyped it on 2.4 and did lots of comparative -+ * research and analysis; TimeSys, for proving that you can implement a -+ * fully preemptible kernel via the use of IRQ threading and mutexes; -+ * Bill Huey for persuasively arguing on lkml that the mutex model is the -+ * right one; and to MontaVista, who ported pmutexes to 2.6. -+ * -+ * This code is a from-scratch implementation and is not based on pmutexes, -+ * but the idea of converting spinlocks to mutexes is used here too. -+ * -+ * lock debugging, locking tree, deadlock detection: -+ * -+ * Copyright (C) 2004, LynuxWorks, Inc., Igor Manyilov, Bill Huey -+ * Released under the General Public License (GPL). -+ * -+ * Includes portions of the generic R/W semaphore implementation from: -+ * -+ * Copyright (c) 2001 David Howells (dhowells@redhat.com). -+ * - Derived partially from idea by Andrea Arcangeli -+ * - Derived also from comments by Linus -+ * -+ * Pending ownership of locks and ownership stealing: -+ * -+ * Copyright (C) 2005, Kihon Technologies Inc., Steven Rostedt -+ * -+ * (also by Steven Rostedt) -+ * - Converted single pi_lock to individual task locks. -+ * -+ * By Esben Nielsen: -+ * Doing priority inheritance with help of the scheduler. -+ * -+ * Copyright (C) 2006, Timesys Corp., Thomas Gleixner -+ * - major rework based on Esben Nielsens initial patch -+ * - replaced thread_info references by task_struct refs -+ * - removed task->pending_owner dependency -+ * - BKL drop/reacquire for semaphore style locks to avoid deadlocks -+ * in the scheduler return path as discussed with Steven Rostedt -+ * -+ * Copyright (C) 2006, Kihon Technologies Inc. -+ * Steven Rostedt -+ * - debugged and patched Thomas Gleixner's rework. -+ * - added back the cmpxchg to the rework. -+ * - turned atomic require back on for SMP. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "rtmutex_common.h" -+ -+/* -+ * struct mutex functions -+ */ -+void __mutex_do_init(struct mutex *mutex, const char *name, -+ struct lock_class_key *key) -+{ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ /* -+ * Make sure we are not reinitializing a held lock: -+ */ -+ debug_check_no_locks_freed((void *)mutex, sizeof(*mutex)); -+ lockdep_init_map(&mutex->dep_map, name, key, 0); -+#endif -+ mutex->lock.save_state = 0; -+} -+EXPORT_SYMBOL(__mutex_do_init); -+ -+static int _mutex_lock_blk_flush(struct mutex *lock, int state) -+{ -+ /* -+ * Flush blk before ->pi_blocked_on is set. At schedule() time it is too -+ * late if one of the callbacks needs to acquire a sleeping lock. -+ */ -+ if (blk_needs_flush_plug(current)) -+ blk_schedule_flush_plug(current); -+ return __rt_mutex_lock_state(&lock->lock, state); -+} -+ -+void __lockfunc _mutex_lock(struct mutex *lock) -+{ -+ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -+ _mutex_lock_blk_flush(lock, TASK_UNINTERRUPTIBLE); -+} -+EXPORT_SYMBOL(_mutex_lock); -+ -+void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass) -+{ -+ int token; -+ -+ token = io_schedule_prepare(); -+ -+ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); -+ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); -+ -+ io_schedule_finish(token); -+} -+EXPORT_SYMBOL_GPL(_mutex_lock_io_nested); -+ -+int __lockfunc _mutex_lock_interruptible(struct mutex *lock) -+{ -+ int ret; -+ -+ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -+ ret = _mutex_lock_blk_flush(lock, TASK_INTERRUPTIBLE); -+ if (ret) -+ mutex_release(&lock->dep_map, _RET_IP_); -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_lock_interruptible); -+ -+int __lockfunc _mutex_lock_killable(struct mutex *lock) -+{ -+ int ret; -+ -+ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -+ ret = _mutex_lock_blk_flush(lock, TASK_KILLABLE); -+ if (ret) -+ mutex_release(&lock->dep_map, _RET_IP_); -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_lock_killable); -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass) -+{ -+ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); -+ _mutex_lock_blk_flush(lock, TASK_UNINTERRUPTIBLE); -+} -+EXPORT_SYMBOL(_mutex_lock_nested); -+ -+void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest) -+{ -+ mutex_acquire_nest(&lock->dep_map, 0, 0, nest, _RET_IP_); -+ _mutex_lock_blk_flush(lock, TASK_UNINTERRUPTIBLE); -+} -+EXPORT_SYMBOL(_mutex_lock_nest_lock); -+ -+int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass) -+{ -+ int ret; -+ -+ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); -+ ret = _mutex_lock_blk_flush(lock, TASK_INTERRUPTIBLE); -+ if (ret) -+ mutex_release(&lock->dep_map, _RET_IP_); -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_lock_interruptible_nested); -+ -+int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass) -+{ -+ int ret; -+ -+ mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); -+ ret = _mutex_lock_blk_flush(lock, TASK_KILLABLE); -+ if (ret) -+ mutex_release(&lock->dep_map, _RET_IP_); -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_lock_killable_nested); -+#endif -+ -+int __lockfunc _mutex_trylock(struct mutex *lock) -+{ -+ int ret = __rt_mutex_trylock(&lock->lock); -+ -+ if (ret) -+ mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_trylock); -+ -+void __lockfunc _mutex_unlock(struct mutex *lock) -+{ -+ mutex_release(&lock->dep_map, _RET_IP_); -+ __rt_mutex_unlock(&lock->lock); -+} -+EXPORT_SYMBOL(_mutex_unlock); -+ -+/** -+ * atomic_dec_and_mutex_lock - return holding mutex if we dec to 0 -+ * @cnt: the atomic which we are to dec -+ * @lock: the mutex to return holding if we dec to 0 -+ * -+ * return true and hold lock if we dec to 0, return false otherwise -+ */ -+int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock) -+{ -+ /* dec if we can't possibly hit 0 */ -+ if (atomic_add_unless(cnt, -1, 1)) -+ return 0; -+ /* we might hit 0, so take the lock */ -+ mutex_lock(lock); -+ if (!atomic_dec_and_test(cnt)) { -+ /* when we actually did the dec, we didn't hit 0 */ -+ mutex_unlock(lock); -+ return 0; -+ } -+ /* we hit 0, and we hold the lock */ -+ return 1; -+} -+EXPORT_SYMBOL(atomic_dec_and_mutex_lock); diff --git a/kernel/patches-5.11.x-rt/0094-0018-locking-rtmutex-add-rwsem-implementation-based-on-rt.patch b/kernel/patches-5.11.x-rt/0094-0018-locking-rtmutex-add-rwsem-implementation-based-on-rt.patch deleted file mode 100644 index 2529c5f764..0000000000 --- a/kernel/patches-5.11.x-rt/0094-0018-locking-rtmutex-add-rwsem-implementation-based-on-rt.patch +++ /dev/null @@ -1,444 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:28:34 +0200 -Subject: [PATCH 18/22] locking/rtmutex: add rwsem implementation based on - rtmutex - -The RT specific R/W semaphore implementation restricts the number of readers -to one because a writer cannot block on multiple readers and inherit its -priority or budget. - -The single reader restricting is painful in various ways: - - - Performance bottleneck for multi-threaded applications in the page fault - path (mmap sem) - - - Progress blocker for drivers which are carefully crafted to avoid the - potential reader/writer deadlock in mainline. - -The analysis of the writer code paths shows, that properly written RT tasks -should not take them. Syscalls like mmap(), file access which take mmap sem -write locked have unbound latencies which are completely unrelated to mmap -sem. Other R/W sem users like graphics drivers are not suitable for RT tasks -either. - -So there is little risk to hurt RT tasks when the RT rwsem implementation is -changed in the following way: - - - Allow concurrent readers - - - Make writers block until the last reader left the critical section. This - blocking is not subject to priority/budget inheritance. - - - Readers blocked on a writer inherit their priority/budget in the normal - way. - -There is a drawback with this scheme. R/W semaphores become writer unfair -though the applications which have triggered writer starvation (mostly on -mmap_sem) in the past are not really the typical workloads running on a RT -system. So while it's unlikely to hit writer starvation, it's possible. If -there are unexpected workloads on RT systems triggering it, we need to rethink -the approach. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rwsem-rt.h | 70 ++++++++++ - kernel/locking/rwsem-rt.c | 318 ++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 388 insertions(+) - create mode 100644 include/linux/rwsem-rt.h - create mode 100644 kernel/locking/rwsem-rt.c - ---- /dev/null -+++ b/include/linux/rwsem-rt.h -@@ -0,0 +1,70 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#ifndef _LINUX_RWSEM_RT_H -+#define _LINUX_RWSEM_RT_H -+ -+#ifndef _LINUX_RWSEM_H -+#error "Include rwsem.h" -+#endif -+ -+#include -+#include -+ -+#define READER_BIAS (1U << 31) -+#define WRITER_BIAS (1U << 30) -+ -+struct rw_semaphore { -+ atomic_t readers; -+ struct rt_mutex rtmutex; -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+}; -+ -+#define __RWSEM_INITIALIZER(name) \ -+{ \ -+ .readers = ATOMIC_INIT(READER_BIAS), \ -+ .rtmutex = __RT_MUTEX_INITIALIZER(name.rtmutex), \ -+ RW_DEP_MAP_INIT(name) \ -+} -+ -+#define DECLARE_RWSEM(lockname) \ -+ struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname) -+ -+extern void __rwsem_init(struct rw_semaphore *rwsem, const char *name, -+ struct lock_class_key *key); -+ -+#define __init_rwsem(sem, name, key) \ -+do { \ -+ rt_mutex_init(&(sem)->rtmutex); \ -+ __rwsem_init((sem), (name), (key)); \ -+} while (0) -+ -+#define init_rwsem(sem) \ -+do { \ -+ static struct lock_class_key __key; \ -+ \ -+ __init_rwsem((sem), #sem, &__key); \ -+} while (0) -+ -+static inline int rwsem_is_locked(struct rw_semaphore *sem) -+{ -+ return atomic_read(&sem->readers) != READER_BIAS; -+} -+ -+static inline int rwsem_is_contended(struct rw_semaphore *sem) -+{ -+ return atomic_read(&sem->readers) > 0; -+} -+ -+extern void __down_read(struct rw_semaphore *sem); -+extern int __down_read_interruptible(struct rw_semaphore *sem); -+extern int __down_read_killable(struct rw_semaphore *sem); -+extern int __down_read_trylock(struct rw_semaphore *sem); -+extern void __down_write(struct rw_semaphore *sem); -+extern int __must_check __down_write_killable(struct rw_semaphore *sem); -+extern int __down_write_trylock(struct rw_semaphore *sem); -+extern void __up_read(struct rw_semaphore *sem); -+extern void __up_write(struct rw_semaphore *sem); -+extern void __downgrade_write(struct rw_semaphore *sem); -+ -+#endif ---- /dev/null -+++ b/kernel/locking/rwsem-rt.c -@@ -0,0 +1,318 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#include -+#include -+#include -+#include -+#include -+ -+#include "rtmutex_common.h" -+ -+/* -+ * RT-specific reader/writer semaphores -+ * -+ * down_write() -+ * 1) Lock sem->rtmutex -+ * 2) Remove the reader BIAS to force readers into the slow path -+ * 3) Wait until all readers have left the critical region -+ * 4) Mark it write locked -+ * -+ * up_write() -+ * 1) Remove the write locked marker -+ * 2) Set the reader BIAS so readers can use the fast path again -+ * 3) Unlock sem->rtmutex to release blocked readers -+ * -+ * down_read() -+ * 1) Try fast path acquisition (reader BIAS is set) -+ * 2) Take sem->rtmutex.wait_lock which protects the writelocked flag -+ * 3) If !writelocked, acquire it for read -+ * 4) If writelocked, block on sem->rtmutex -+ * 5) unlock sem->rtmutex, goto 1) -+ * -+ * up_read() -+ * 1) Try fast path release (reader count != 1) -+ * 2) Wake the writer waiting in down_write()#3 -+ * -+ * down_read()#3 has the consequence, that rw semaphores on RT are not writer -+ * fair, but writers, which should be avoided in RT tasks (think mmap_sem), -+ * are subject to the rtmutex priority/DL inheritance mechanism. -+ * -+ * It's possible to make the rw semaphores writer fair by keeping a list of -+ * active readers. A blocked writer would force all newly incoming readers to -+ * block on the rtmutex, but the rtmutex would have to be proxy locked for one -+ * reader after the other. We can't use multi-reader inheritance because there -+ * is no way to support that with SCHED_DEADLINE. Implementing the one by one -+ * reader boosting/handover mechanism is a major surgery for a very dubious -+ * value. -+ * -+ * The risk of writer starvation is there, but the pathological use cases -+ * which trigger it are not necessarily the typical RT workloads. -+ */ -+ -+void __rwsem_init(struct rw_semaphore *sem, const char *name, -+ struct lock_class_key *key) -+{ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ /* -+ * Make sure we are not reinitializing a held semaphore: -+ */ -+ debug_check_no_locks_freed((void *)sem, sizeof(*sem)); -+ lockdep_init_map(&sem->dep_map, name, key, 0); -+#endif -+ atomic_set(&sem->readers, READER_BIAS); -+} -+EXPORT_SYMBOL(__rwsem_init); -+ -+int __down_read_trylock(struct rw_semaphore *sem) -+{ -+ int r, old; -+ -+ /* -+ * Increment reader count, if sem->readers < 0, i.e. READER_BIAS is -+ * set. -+ */ -+ for (r = atomic_read(&sem->readers); r < 0;) { -+ old = atomic_cmpxchg(&sem->readers, r, r + 1); -+ if (likely(old == r)) -+ return 1; -+ r = old; -+ } -+ return 0; -+} -+ -+static int __sched __down_read_common(struct rw_semaphore *sem, int state) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ struct rt_mutex_waiter waiter; -+ int ret; -+ -+ if (__down_read_trylock(sem)) -+ return 0; -+ -+ /* -+ * Flush blk before ->pi_blocked_on is set. At schedule() time it is too -+ * late if one of the callbacks needs to acquire a sleeping lock. -+ */ -+ if (blk_needs_flush_plug(current)) -+ blk_schedule_flush_plug(current); -+ -+ might_sleep(); -+ raw_spin_lock_irq(&m->wait_lock); -+ /* -+ * Allow readers as long as the writer has not completely -+ * acquired the semaphore for write. -+ */ -+ if (atomic_read(&sem->readers) != WRITER_BIAS) { -+ atomic_inc(&sem->readers); -+ raw_spin_unlock_irq(&m->wait_lock); -+ return 0; -+ } -+ -+ /* -+ * Call into the slow lock path with the rtmutex->wait_lock -+ * held, so this can't result in the following race: -+ * -+ * Reader1 Reader2 Writer -+ * down_read() -+ * down_write() -+ * rtmutex_lock(m) -+ * swait() -+ * down_read() -+ * unlock(m->wait_lock) -+ * up_read() -+ * swake() -+ * lock(m->wait_lock) -+ * sem->writelocked=true -+ * unlock(m->wait_lock) -+ * -+ * up_write() -+ * sem->writelocked=false -+ * rtmutex_unlock(m) -+ * down_read() -+ * down_write() -+ * rtmutex_lock(m) -+ * swait() -+ * rtmutex_lock(m) -+ * -+ * That would put Reader1 behind the writer waiting on -+ * Reader2 to call up_read() which might be unbound. -+ */ -+ rt_mutex_init_waiter(&waiter, false); -+ ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK, -+ &waiter); -+ /* -+ * The slowlock() above is guaranteed to return with the rtmutex (for -+ * ret = 0) is now held, so there can't be a writer active. Increment -+ * the reader count and immediately drop the rtmutex again. -+ * For ret != 0 we don't hold the rtmutex and need unlock the wait_lock. -+ * We don't own the lock then. -+ */ -+ if (!ret) -+ atomic_inc(&sem->readers); -+ raw_spin_unlock_irq(&m->wait_lock); -+ if (!ret) -+ __rt_mutex_unlock(m); -+ -+ debug_rt_mutex_free_waiter(&waiter); -+ return ret; -+} -+ -+void __down_read(struct rw_semaphore *sem) -+{ -+ int ret; -+ -+ ret = __down_read_common(sem, TASK_UNINTERRUPTIBLE); -+ WARN_ON_ONCE(ret); -+} -+ -+int __down_read_interruptible(struct rw_semaphore *sem) -+{ -+ int ret; -+ -+ ret = __down_read_common(sem, TASK_INTERRUPTIBLE); -+ if (likely(!ret)) -+ return ret; -+ WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret); -+ return -EINTR; -+} -+ -+int __down_read_killable(struct rw_semaphore *sem) -+{ -+ int ret; -+ -+ ret = __down_read_common(sem, TASK_KILLABLE); -+ if (likely(!ret)) -+ return ret; -+ WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret); -+ return -EINTR; -+} -+ -+void __up_read(struct rw_semaphore *sem) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ struct task_struct *tsk; -+ -+ /* -+ * sem->readers can only hit 0 when a writer is waiting for the -+ * active readers to leave the critical region. -+ */ -+ if (!atomic_dec_and_test(&sem->readers)) -+ return; -+ -+ might_sleep(); -+ raw_spin_lock_irq(&m->wait_lock); -+ /* -+ * Wake the writer, i.e. the rtmutex owner. It might release the -+ * rtmutex concurrently in the fast path (due to a signal), but to -+ * clean up the rwsem it needs to acquire m->wait_lock. The worst -+ * case which can happen is a spurious wakeup. -+ */ -+ tsk = rt_mutex_owner(m); -+ if (tsk) -+ wake_up_process(tsk); -+ -+ raw_spin_unlock_irq(&m->wait_lock); -+} -+ -+static void __up_write_unlock(struct rw_semaphore *sem, int bias, -+ unsigned long flags) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ -+ atomic_add(READER_BIAS - bias, &sem->readers); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ __rt_mutex_unlock(m); -+} -+ -+static int __sched __down_write_common(struct rw_semaphore *sem, int state) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ unsigned long flags; -+ -+ /* -+ * Flush blk before ->pi_blocked_on is set. At schedule() time it is too -+ * late if one of the callbacks needs to acquire a sleeping lock. -+ */ -+ if (blk_needs_flush_plug(current)) -+ blk_schedule_flush_plug(current); -+ -+ /* Take the rtmutex as a first step */ -+ if (__rt_mutex_lock_state(m, state)) -+ return -EINTR; -+ -+ /* Force readers into slow path */ -+ atomic_sub(READER_BIAS, &sem->readers); -+ might_sleep(); -+ -+ set_current_state(state); -+ for (;;) { -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ /* Have all readers left the critical region? */ -+ if (!atomic_read(&sem->readers)) { -+ atomic_set(&sem->readers, WRITER_BIAS); -+ __set_current_state(TASK_RUNNING); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return 0; -+ } -+ -+ if (signal_pending_state(state, current)) { -+ __set_current_state(TASK_RUNNING); -+ __up_write_unlock(sem, 0, flags); -+ return -EINTR; -+ } -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ -+ if (atomic_read(&sem->readers) != 0) { -+ schedule(); -+ set_current_state(state); -+ } -+ } -+} -+ -+void __sched __down_write(struct rw_semaphore *sem) -+{ -+ __down_write_common(sem, TASK_UNINTERRUPTIBLE); -+} -+ -+int __sched __down_write_killable(struct rw_semaphore *sem) -+{ -+ return __down_write_common(sem, TASK_KILLABLE); -+} -+ -+int __down_write_trylock(struct rw_semaphore *sem) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ unsigned long flags; -+ -+ if (!__rt_mutex_trylock(m)) -+ return 0; -+ -+ atomic_sub(READER_BIAS, &sem->readers); -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ if (!atomic_read(&sem->readers)) { -+ atomic_set(&sem->readers, WRITER_BIAS); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return 1; -+ } -+ __up_write_unlock(sem, 0, flags); -+ return 0; -+} -+ -+void __up_write(struct rw_semaphore *sem) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ __up_write_unlock(sem, WRITER_BIAS, flags); -+} -+ -+void __downgrade_write(struct rw_semaphore *sem) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ /* Release it and account current as reader */ -+ __up_write_unlock(sem, WRITER_BIAS - 1, flags); -+} diff --git a/kernel/patches-5.11.x-rt/0095-0019-locking-rtmutex-add-rwlock-implementation-based-on-r.patch b/kernel/patches-5.11.x-rt/0095-0019-locking-rtmutex-add-rwlock-implementation-based-on-r.patch deleted file mode 100644 index 99f27069ce..0000000000 --- a/kernel/patches-5.11.x-rt/0095-0019-locking-rtmutex-add-rwlock-implementation-based-on-r.patch +++ /dev/null @@ -1,532 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:18:06 +0200 -Subject: [PATCH 19/22] locking/rtmutex: add rwlock implementation based on - rtmutex - -The implementation is bias-based, similar to the rwsem implementation. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rwlock_rt.h | 109 +++++++++++++ - include/linux/rwlock_types_rt.h | 56 ++++++ - kernel/Kconfig.locks | 2 - kernel/locking/rwlock-rt.c | 328 ++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 494 insertions(+), 1 deletion(-) - create mode 100644 include/linux/rwlock_rt.h - create mode 100644 include/linux/rwlock_types_rt.h - create mode 100644 kernel/locking/rwlock-rt.c - ---- /dev/null -+++ b/include/linux/rwlock_rt.h -@@ -0,0 +1,109 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#ifndef __LINUX_RWLOCK_RT_H -+#define __LINUX_RWLOCK_RT_H -+ -+#ifndef __LINUX_SPINLOCK_H -+#error Do not include directly. Use spinlock.h -+#endif -+ -+extern void __lockfunc rt_write_lock(rwlock_t *rwlock); -+extern void __lockfunc rt_read_lock(rwlock_t *rwlock); -+extern int __lockfunc rt_write_trylock(rwlock_t *rwlock); -+extern int __lockfunc rt_read_trylock(rwlock_t *rwlock); -+extern void __lockfunc rt_write_unlock(rwlock_t *rwlock); -+extern void __lockfunc rt_read_unlock(rwlock_t *rwlock); -+extern int __lockfunc rt_read_can_lock(rwlock_t *rwlock); -+extern int __lockfunc rt_write_can_lock(rwlock_t *rwlock); -+extern void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key); -+ -+#define read_can_lock(rwlock) rt_read_can_lock(rwlock) -+#define write_can_lock(rwlock) rt_write_can_lock(rwlock) -+ -+#define read_trylock(lock) __cond_lock(lock, rt_read_trylock(lock)) -+#define write_trylock(lock) __cond_lock(lock, rt_write_trylock(lock)) -+ -+static inline int __write_trylock_rt_irqsave(rwlock_t *lock, unsigned long *flags) -+{ -+ *flags = 0; -+ return rt_write_trylock(lock); -+} -+ -+#define write_trylock_irqsave(lock, flags) \ -+ __cond_lock(lock, __write_trylock_rt_irqsave(lock, &(flags))) -+ -+#define read_lock_irqsave(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ rt_read_lock(lock); \ -+ flags = 0; \ -+ } while (0) -+ -+#define write_lock_irqsave(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ rt_write_lock(lock); \ -+ flags = 0; \ -+ } while (0) -+ -+#define read_lock(lock) rt_read_lock(lock) -+ -+#define read_lock_bh(lock) \ -+ do { \ -+ local_bh_disable(); \ -+ rt_read_lock(lock); \ -+ } while (0) -+ -+#define read_lock_irq(lock) read_lock(lock) -+ -+#define write_lock(lock) rt_write_lock(lock) -+ -+#define write_lock_bh(lock) \ -+ do { \ -+ local_bh_disable(); \ -+ rt_write_lock(lock); \ -+ } while (0) -+ -+#define write_lock_irq(lock) write_lock(lock) -+ -+#define read_unlock(lock) rt_read_unlock(lock) -+ -+#define read_unlock_bh(lock) \ -+ do { \ -+ rt_read_unlock(lock); \ -+ local_bh_enable(); \ -+ } while (0) -+ -+#define read_unlock_irq(lock) read_unlock(lock) -+ -+#define write_unlock(lock) rt_write_unlock(lock) -+ -+#define write_unlock_bh(lock) \ -+ do { \ -+ rt_write_unlock(lock); \ -+ local_bh_enable(); \ -+ } while (0) -+ -+#define write_unlock_irq(lock) write_unlock(lock) -+ -+#define read_unlock_irqrestore(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ (void) flags; \ -+ rt_read_unlock(lock); \ -+ } while (0) -+ -+#define write_unlock_irqrestore(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ (void) flags; \ -+ rt_write_unlock(lock); \ -+ } while (0) -+ -+#define rwlock_init(rwl) \ -+do { \ -+ static struct lock_class_key __key; \ -+ \ -+ __rt_rwlock_init(rwl, #rwl, &__key); \ -+} while (0) -+ -+#endif ---- /dev/null -+++ b/include/linux/rwlock_types_rt.h -@@ -0,0 +1,56 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#ifndef __LINUX_RWLOCK_TYPES_RT_H -+#define __LINUX_RWLOCK_TYPES_RT_H -+ -+#ifndef __LINUX_SPINLOCK_TYPES_H -+#error "Do not include directly. Include spinlock_types.h instead" -+#endif -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } -+#else -+# define RW_DEP_MAP_INIT(lockname) -+#endif -+ -+typedef struct rt_rw_lock rwlock_t; -+ -+#define __RW_LOCK_UNLOCKED(name) __RWLOCK_RT_INITIALIZER(name) -+ -+#define DEFINE_RWLOCK(name) \ -+ rwlock_t name = __RW_LOCK_UNLOCKED(name) -+ -+/* -+ * A reader biased implementation primarily for CPU pinning. -+ * -+ * Can be selected as general replacement for the single reader RT rwlock -+ * variant -+ */ -+struct rt_rw_lock { -+ struct rt_mutex rtmutex; -+ atomic_t readers; -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+}; -+ -+#define READER_BIAS (1U << 31) -+#define WRITER_BIAS (1U << 30) -+ -+#define __RWLOCK_RT_INITIALIZER(name) \ -+{ \ -+ .readers = ATOMIC_INIT(READER_BIAS), \ -+ .rtmutex = __RT_MUTEX_INITIALIZER_SAVE_STATE(name.rtmutex), \ -+ RW_DEP_MAP_INIT(name) \ -+} -+ -+void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, -+ struct lock_class_key *key); -+ -+#define rwlock_biased_rt_init(rwlock) \ -+ do { \ -+ static struct lock_class_key __key; \ -+ \ -+ __rwlock_biased_rt_init((rwlock), #rwlock, &__key); \ -+ } while (0) -+ -+#endif ---- a/kernel/Kconfig.locks -+++ b/kernel/Kconfig.locks -@@ -251,7 +251,7 @@ config ARCH_USE_QUEUED_RWLOCKS - - config QUEUED_RWLOCKS - def_bool y if ARCH_USE_QUEUED_RWLOCKS -- depends on SMP -+ depends on SMP && !PREEMPT_RT - - config ARCH_HAS_MMIOWB - bool ---- /dev/null -+++ b/kernel/locking/rwlock-rt.c -@@ -0,0 +1,328 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#include -+#include -+ -+#include "rtmutex_common.h" -+#include -+ -+/* -+ * RT-specific reader/writer locks -+ * -+ * write_lock() -+ * 1) Lock lock->rtmutex -+ * 2) Remove the reader BIAS to force readers into the slow path -+ * 3) Wait until all readers have left the critical region -+ * 4) Mark it write locked -+ * -+ * write_unlock() -+ * 1) Remove the write locked marker -+ * 2) Set the reader BIAS so readers can use the fast path again -+ * 3) Unlock lock->rtmutex to release blocked readers -+ * -+ * read_lock() -+ * 1) Try fast path acquisition (reader BIAS is set) -+ * 2) Take lock->rtmutex.wait_lock which protects the writelocked flag -+ * 3) If !writelocked, acquire it for read -+ * 4) If writelocked, block on lock->rtmutex -+ * 5) unlock lock->rtmutex, goto 1) -+ * -+ * read_unlock() -+ * 1) Try fast path release (reader count != 1) -+ * 2) Wake the writer waiting in write_lock()#3 -+ * -+ * read_lock()#3 has the consequence, that rw locks on RT are not writer -+ * fair, but writers, which should be avoided in RT tasks (think tasklist -+ * lock), are subject to the rtmutex priority/DL inheritance mechanism. -+ * -+ * It's possible to make the rw locks writer fair by keeping a list of -+ * active readers. A blocked writer would force all newly incoming readers -+ * to block on the rtmutex, but the rtmutex would have to be proxy locked -+ * for one reader after the other. We can't use multi-reader inheritance -+ * because there is no way to support that with -+ * SCHED_DEADLINE. Implementing the one by one reader boosting/handover -+ * mechanism is a major surgery for a very dubious value. -+ * -+ * The risk of writer starvation is there, but the pathological use cases -+ * which trigger it are not necessarily the typical RT workloads. -+ */ -+ -+void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, -+ struct lock_class_key *key) -+{ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ /* -+ * Make sure we are not reinitializing a held semaphore: -+ */ -+ debug_check_no_locks_freed((void *)lock, sizeof(*lock)); -+ lockdep_init_map(&lock->dep_map, name, key, 0); -+#endif -+ atomic_set(&lock->readers, READER_BIAS); -+ rt_mutex_init(&lock->rtmutex); -+ lock->rtmutex.save_state = 1; -+} -+ -+static int __read_rt_trylock(struct rt_rw_lock *lock) -+{ -+ int r, old; -+ -+ /* -+ * Increment reader count, if lock->readers < 0, i.e. READER_BIAS is -+ * set. -+ */ -+ for (r = atomic_read(&lock->readers); r < 0;) { -+ old = atomic_cmpxchg(&lock->readers, r, r + 1); -+ if (likely(old == r)) -+ return 1; -+ r = old; -+ } -+ return 0; -+} -+ -+static void __read_rt_lock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ struct rt_mutex_waiter waiter; -+ unsigned long flags; -+ -+ if (__read_rt_trylock(lock)) -+ return; -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ /* -+ * Allow readers as long as the writer has not completely -+ * acquired the semaphore for write. -+ */ -+ if (atomic_read(&lock->readers) != WRITER_BIAS) { -+ atomic_inc(&lock->readers); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return; -+ } -+ -+ /* -+ * Call into the slow lock path with the rtmutex->wait_lock -+ * held, so this can't result in the following race: -+ * -+ * Reader1 Reader2 Writer -+ * read_lock() -+ * write_lock() -+ * rtmutex_lock(m) -+ * swait() -+ * read_lock() -+ * unlock(m->wait_lock) -+ * read_unlock() -+ * swake() -+ * lock(m->wait_lock) -+ * lock->writelocked=true -+ * unlock(m->wait_lock) -+ * -+ * write_unlock() -+ * lock->writelocked=false -+ * rtmutex_unlock(m) -+ * read_lock() -+ * write_lock() -+ * rtmutex_lock(m) -+ * swait() -+ * rtmutex_lock(m) -+ * -+ * That would put Reader1 behind the writer waiting on -+ * Reader2 to call read_unlock() which might be unbound. -+ */ -+ rt_mutex_init_waiter(&waiter, true); -+ rt_spin_lock_slowlock_locked(m, &waiter, flags); -+ /* -+ * The slowlock() above is guaranteed to return with the rtmutex is -+ * now held, so there can't be a writer active. Increment the reader -+ * count and immediately drop the rtmutex again. -+ */ -+ atomic_inc(&lock->readers); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ rt_spin_lock_slowunlock(m); -+ -+ debug_rt_mutex_free_waiter(&waiter); -+} -+ -+static void __read_rt_unlock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ struct task_struct *tsk; -+ -+ /* -+ * sem->readers can only hit 0 when a writer is waiting for the -+ * active readers to leave the critical region. -+ */ -+ if (!atomic_dec_and_test(&lock->readers)) -+ return; -+ -+ raw_spin_lock_irq(&m->wait_lock); -+ /* -+ * Wake the writer, i.e. the rtmutex owner. It might release the -+ * rtmutex concurrently in the fast path, but to clean up the rw -+ * lock it needs to acquire m->wait_lock. The worst case which can -+ * happen is a spurious wakeup. -+ */ -+ tsk = rt_mutex_owner(m); -+ if (tsk) -+ wake_up_process(tsk); -+ -+ raw_spin_unlock_irq(&m->wait_lock); -+} -+ -+static void __write_unlock_common(struct rt_rw_lock *lock, int bias, -+ unsigned long flags) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ -+ atomic_add(READER_BIAS - bias, &lock->readers); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ rt_spin_lock_slowunlock(m); -+} -+ -+static void __write_rt_lock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ struct task_struct *self = current; -+ unsigned long flags; -+ -+ /* Take the rtmutex as a first step */ -+ __rt_spin_lock(m); -+ -+ /* Force readers into slow path */ -+ atomic_sub(READER_BIAS, &lock->readers); -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ -+ raw_spin_lock(&self->pi_lock); -+ self->saved_state = self->state; -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock(&self->pi_lock); -+ -+ for (;;) { -+ /* Have all readers left the critical region? */ -+ if (!atomic_read(&lock->readers)) { -+ atomic_set(&lock->readers, WRITER_BIAS); -+ raw_spin_lock(&self->pi_lock); -+ __set_current_state_no_track(self->saved_state); -+ self->saved_state = TASK_RUNNING; -+ raw_spin_unlock(&self->pi_lock); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return; -+ } -+ -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ -+ if (atomic_read(&lock->readers) != 0) -+ schedule(); -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ -+ raw_spin_lock(&self->pi_lock); -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock(&self->pi_lock); -+ } -+} -+ -+static int __write_rt_trylock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ unsigned long flags; -+ -+ if (!__rt_mutex_trylock(m)) -+ return 0; -+ -+ atomic_sub(READER_BIAS, &lock->readers); -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ if (!atomic_read(&lock->readers)) { -+ atomic_set(&lock->readers, WRITER_BIAS); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return 1; -+ } -+ __write_unlock_common(lock, 0, flags); -+ return 0; -+} -+ -+static void __write_rt_unlock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ __write_unlock_common(lock, WRITER_BIAS, flags); -+} -+ -+int __lockfunc rt_read_can_lock(rwlock_t *rwlock) -+{ -+ return atomic_read(&rwlock->readers) < 0; -+} -+ -+int __lockfunc rt_write_can_lock(rwlock_t *rwlock) -+{ -+ return atomic_read(&rwlock->readers) == READER_BIAS; -+} -+ -+/* -+ * The common functions which get wrapped into the rwlock API. -+ */ -+int __lockfunc rt_read_trylock(rwlock_t *rwlock) -+{ -+ int ret; -+ -+ ret = __read_rt_trylock(rwlock); -+ if (ret) { -+ rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); -+ migrate_disable(); -+ } -+ return ret; -+} -+EXPORT_SYMBOL(rt_read_trylock); -+ -+int __lockfunc rt_write_trylock(rwlock_t *rwlock) -+{ -+ int ret; -+ -+ ret = __write_rt_trylock(rwlock); -+ if (ret) { -+ rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); -+ migrate_disable(); -+ } -+ return ret; -+} -+EXPORT_SYMBOL(rt_write_trylock); -+ -+void __lockfunc rt_read_lock(rwlock_t *rwlock) -+{ -+ rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); -+ __read_rt_lock(rwlock); -+ migrate_disable(); -+} -+EXPORT_SYMBOL(rt_read_lock); -+ -+void __lockfunc rt_write_lock(rwlock_t *rwlock) -+{ -+ rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); -+ __write_rt_lock(rwlock); -+ migrate_disable(); -+} -+EXPORT_SYMBOL(rt_write_lock); -+ -+void __lockfunc rt_read_unlock(rwlock_t *rwlock) -+{ -+ rwlock_release(&rwlock->dep_map, _RET_IP_); -+ migrate_enable(); -+ __read_rt_unlock(rwlock); -+} -+EXPORT_SYMBOL(rt_read_unlock); -+ -+void __lockfunc rt_write_unlock(rwlock_t *rwlock) -+{ -+ rwlock_release(&rwlock->dep_map, _RET_IP_); -+ migrate_enable(); -+ __write_rt_unlock(rwlock); -+} -+EXPORT_SYMBOL(rt_write_unlock); -+ -+void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key) -+{ -+ __rwlock_biased_rt_init(rwlock, name, key); -+} -+EXPORT_SYMBOL(__rt_rwlock_init); diff --git a/kernel/patches-5.11.x-rt/0096-0020-locking-rtmutex-wire-up-RT-s-locking.patch b/kernel/patches-5.11.x-rt/0096-0020-locking-rtmutex-wire-up-RT-s-locking.patch deleted file mode 100644 index 70e588c765..0000000000 --- a/kernel/patches-5.11.x-rt/0096-0020-locking-rtmutex-wire-up-RT-s-locking.patch +++ /dev/null @@ -1,321 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:31:14 +0200 -Subject: [PATCH 20/22] locking/rtmutex: wire up RT's locking - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/mutex.h | 26 ++++++++++++++++---------- - include/linux/rwsem.h | 12 ++++++++++++ - include/linux/spinlock.h | 12 +++++++++++- - include/linux/spinlock_api_smp.h | 4 +++- - include/linux/spinlock_types.h | 11 ++++++++--- - include/linux/spinlock_types_up.h | 2 +- - kernel/Kconfig.preempt | 1 + - kernel/locking/Makefile | 10 +++++++--- - kernel/locking/rwsem.c | 6 ++++++ - kernel/locking/spinlock.c | 7 +++++++ - kernel/locking/spinlock_debug.c | 5 +++++ - 11 files changed, 77 insertions(+), 19 deletions(-) - ---- a/include/linux/mutex.h -+++ b/include/linux/mutex.h -@@ -22,6 +22,20 @@ - - struct ww_acquire_ctx; - -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ -+ , .dep_map = { \ -+ .name = #lockname, \ -+ .wait_type_inner = LD_WAIT_SLEEP, \ -+ } -+#else -+# define __DEP_MAP_MUTEX_INITIALIZER(lockname) -+#endif -+ -+#ifdef CONFIG_PREEMPT_RT -+# include -+#else -+ - /* - * Simple, straightforward mutexes with strict semantics: - * -@@ -119,16 +133,6 @@ do { \ - __mutex_init((mutex), #mutex, &__key); \ - } while (0) - --#ifdef CONFIG_DEBUG_LOCK_ALLOC --# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ -- , .dep_map = { \ -- .name = #lockname, \ -- .wait_type_inner = LD_WAIT_SLEEP, \ -- } --#else --# define __DEP_MAP_MUTEX_INITIALIZER(lockname) --#endif -- - #define __MUTEX_INITIALIZER(lockname) \ - { .owner = ATOMIC_LONG_INIT(0) \ - , .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \ -@@ -224,4 +228,6 @@ enum mutex_trylock_recursive_enum { - extern /* __deprecated */ __must_check enum mutex_trylock_recursive_enum - mutex_trylock_recursive(struct mutex *lock); - -+#endif /* !PREEMPT_RT */ -+ - #endif /* __LINUX_MUTEX_H */ ---- a/include/linux/rwsem.h -+++ b/include/linux/rwsem.h -@@ -16,6 +16,11 @@ - #include - #include - #include -+ -+#ifdef CONFIG_PREEMPT_RT -+#include -+#else /* PREEMPT_RT */ -+ - #ifdef CONFIG_RWSEM_SPIN_ON_OWNER - #include - #endif -@@ -119,6 +124,13 @@ static inline int rwsem_is_contended(str - return !list_empty(&sem->wait_list); - } - -+#endif /* !PREEMPT_RT */ -+ -+/* -+ * The functions below are the same for all rwsem implementations including -+ * the RT specific variant. -+ */ -+ - /* - * lock for reading - */ ---- a/include/linux/spinlock.h -+++ b/include/linux/spinlock.h -@@ -309,7 +309,11 @@ static inline void do_raw_spin_unlock(ra - }) - - /* Include rwlock functions */ --#include -+#ifdef CONFIG_PREEMPT_RT -+# include -+#else -+# include -+#endif - - /* - * Pull the _spin_*()/_read_*()/_write_*() functions/declarations: -@@ -320,6 +324,10 @@ static inline void do_raw_spin_unlock(ra - # include - #endif - -+#ifdef CONFIG_PREEMPT_RT -+# include -+#else /* PREEMPT_RT */ -+ - /* - * Map the spin_lock functions to the raw variants for PREEMPT_RT=n - */ -@@ -454,6 +462,8 @@ static __always_inline int spin_is_conte - - #define assert_spin_locked(lock) assert_raw_spin_locked(&(lock)->rlock) - -+#endif /* !PREEMPT_RT */ -+ - /* - * Pull the atomic_t declaration: - * (asm-mips/atomic.h needs above definitions) ---- a/include/linux/spinlock_api_smp.h -+++ b/include/linux/spinlock_api_smp.h -@@ -187,6 +187,8 @@ static inline int __raw_spin_trylock_bh( - return 0; - } - --#include -+#ifndef CONFIG_PREEMPT_RT -+# include -+#endif - - #endif /* __LINUX_SPINLOCK_API_SMP_H */ ---- a/include/linux/spinlock_types.h -+++ b/include/linux/spinlock_types.h -@@ -11,8 +11,13 @@ - - #include - --#include -- --#include -+#ifndef CONFIG_PREEMPT_RT -+# include -+# include -+#else -+# include -+# include -+# include -+#endif - - #endif /* __LINUX_SPINLOCK_TYPES_H */ ---- a/include/linux/spinlock_types_up.h -+++ b/include/linux/spinlock_types_up.h -@@ -1,7 +1,7 @@ - #ifndef __LINUX_SPINLOCK_TYPES_UP_H - #define __LINUX_SPINLOCK_TYPES_UP_H - --#ifndef __LINUX_SPINLOCK_TYPES_H -+#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__LINUX_RT_MUTEX_H) - # error "please don't include this file directly" - #endif - ---- a/kernel/Kconfig.preempt -+++ b/kernel/Kconfig.preempt -@@ -59,6 +59,7 @@ config PREEMPT_RT - bool "Fully Preemptible Kernel (Real-Time)" - depends on EXPERT && ARCH_SUPPORTS_RT - select PREEMPTION -+ select RT_MUTEXES - help - This option turns the kernel into a real-time kernel by replacing - various locking primitives (spinlocks, rwlocks, etc.) with ---- a/kernel/locking/Makefile -+++ b/kernel/locking/Makefile -@@ -3,7 +3,7 @@ - # and is generally not a function of system call inputs. - KCOV_INSTRUMENT := n - --obj-y += mutex.o semaphore.o rwsem.o percpu-rwsem.o -+obj-y += semaphore.o rwsem.o percpu-rwsem.o - - # Avoid recursion lockdep -> KCSAN -> ... -> lockdep. - KCSAN_SANITIZE_lockdep.o := n -@@ -15,19 +15,23 @@ CFLAGS_REMOVE_mutex-debug.o = $(CC_FLAGS - CFLAGS_REMOVE_rtmutex-debug.o = $(CC_FLAGS_FTRACE) - endif - --obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o - obj-$(CONFIG_LOCKDEP) += lockdep.o - ifeq ($(CONFIG_PROC_FS),y) - obj-$(CONFIG_LOCKDEP) += lockdep_proc.o - endif - obj-$(CONFIG_SMP) += spinlock.o --obj-$(CONFIG_LOCK_SPIN_ON_OWNER) += osq_lock.o - obj-$(CONFIG_PROVE_LOCKING) += spinlock.o - obj-$(CONFIG_QUEUED_SPINLOCKS) += qspinlock.o - obj-$(CONFIG_RT_MUTEXES) += rtmutex.o - obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o - obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o - obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o -+ifneq ($(CONFIG_PREEMPT_RT),y) -+obj-y += mutex.o -+obj-$(CONFIG_LOCK_SPIN_ON_OWNER) += osq_lock.o -+obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o -+endif -+obj-$(CONFIG_PREEMPT_RT) += mutex-rt.o rwsem-rt.o rwlock-rt.o - obj-$(CONFIG_QUEUED_RWLOCKS) += qrwlock.o - obj-$(CONFIG_LOCK_TORTURE_TEST) += locktorture.o - obj-$(CONFIG_WW_MUTEX_SELFTEST) += test-ww_mutex.o ---- a/kernel/locking/rwsem.c -+++ b/kernel/locking/rwsem.c -@@ -28,6 +28,7 @@ - #include - #include - -+#ifndef CONFIG_PREEMPT_RT - #include "lock_events.h" - - /* -@@ -1343,6 +1344,7 @@ static inline void __downgrade_write(str - if (tmp & RWSEM_FLAG_WAITERS) - rwsem_downgrade_wake(sem); - } -+#endif - - /* - * lock for reading -@@ -1506,7 +1508,9 @@ void down_read_non_owner(struct rw_semap - { - might_sleep(); - __down_read(sem); -+#ifndef CONFIG_PREEMPT_RT - __rwsem_set_reader_owned(sem, NULL); -+#endif - } - EXPORT_SYMBOL(down_read_non_owner); - -@@ -1535,7 +1539,9 @@ EXPORT_SYMBOL(down_write_killable_nested - - void up_read_non_owner(struct rw_semaphore *sem) - { -+#ifndef CONFIG_PREEMPT_RT - DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem); -+#endif - __up_read(sem); - } - EXPORT_SYMBOL(up_read_non_owner); ---- a/kernel/locking/spinlock.c -+++ b/kernel/locking/spinlock.c -@@ -124,8 +124,11 @@ void __lockfunc __raw_##op##_lock_bh(loc - * __[spin|read|write]_lock_bh() - */ - BUILD_LOCK_OPS(spin, raw_spinlock); -+ -+#ifndef CONFIG_PREEMPT_RT - BUILD_LOCK_OPS(read, rwlock); - BUILD_LOCK_OPS(write, rwlock); -+#endif - - #endif - -@@ -209,6 +212,8 @@ void __lockfunc _raw_spin_unlock_bh(raw_ - EXPORT_SYMBOL(_raw_spin_unlock_bh); - #endif - -+#ifndef CONFIG_PREEMPT_RT -+ - #ifndef CONFIG_INLINE_READ_TRYLOCK - int __lockfunc _raw_read_trylock(rwlock_t *lock) - { -@@ -353,6 +358,8 @@ void __lockfunc _raw_write_unlock_bh(rwl - EXPORT_SYMBOL(_raw_write_unlock_bh); - #endif - -+#endif /* !PREEMPT_RT */ -+ - #ifdef CONFIG_DEBUG_LOCK_ALLOC - - void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) ---- a/kernel/locking/spinlock_debug.c -+++ b/kernel/locking/spinlock_debug.c -@@ -31,6 +31,7 @@ void __raw_spin_lock_init(raw_spinlock_t - - EXPORT_SYMBOL(__raw_spin_lock_init); - -+#ifndef CONFIG_PREEMPT_RT - void __rwlock_init(rwlock_t *lock, const char *name, - struct lock_class_key *key) - { -@@ -48,6 +49,7 @@ void __rwlock_init(rwlock_t *lock, const - } - - EXPORT_SYMBOL(__rwlock_init); -+#endif - - static void spin_dump(raw_spinlock_t *lock, const char *msg) - { -@@ -139,6 +141,7 @@ void do_raw_spin_unlock(raw_spinlock_t * - arch_spin_unlock(&lock->raw_lock); - } - -+#ifndef CONFIG_PREEMPT_RT - static void rwlock_bug(rwlock_t *lock, const char *msg) - { - if (!debug_locks_off()) -@@ -228,3 +231,5 @@ void do_raw_write_unlock(rwlock_t *lock) - debug_write_unlock(lock); - arch_write_unlock(&lock->raw_lock); - } -+ -+#endif diff --git a/kernel/patches-5.11.x-rt/0097-0021-locking-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch b/kernel/patches-5.11.x-rt/0097-0021-locking-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch deleted file mode 100644 index 08c9e448c1..0000000000 --- a/kernel/patches-5.11.x-rt/0097-0021-locking-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch +++ /dev/null @@ -1,441 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 12 Oct 2017 17:34:38 +0200 -Subject: [PATCH 21/22] locking/rtmutex: add ww_mutex addon for mutex-rt - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/mutex.h | 8 - - include/linux/ww_mutex.h | 8 + - kernel/locking/rtmutex.c | 262 ++++++++++++++++++++++++++++++++++++++-- - kernel/locking/rtmutex_common.h | 2 - kernel/locking/rwsem-rt.c | 2 - 5 files changed, 262 insertions(+), 20 deletions(-) - ---- a/include/linux/mutex.h -+++ b/include/linux/mutex.h -@@ -82,14 +82,6 @@ struct mutex { - struct ww_class; - struct ww_acquire_ctx; - --struct ww_mutex { -- struct mutex base; -- struct ww_acquire_ctx *ctx; --#ifdef CONFIG_DEBUG_MUTEXES -- struct ww_class *ww_class; --#endif --}; -- - /* - * This is the control structure for tasks blocked on mutex, - * which resides on the blocked task's kernel stack: ---- a/include/linux/ww_mutex.h -+++ b/include/linux/ww_mutex.h -@@ -28,6 +28,14 @@ struct ww_class { - unsigned int is_wait_die; - }; - -+struct ww_mutex { -+ struct mutex base; -+ struct ww_acquire_ctx *ctx; -+#ifdef CONFIG_DEBUG_MUTEXES -+ struct ww_class *ww_class; -+#endif -+}; -+ - struct ww_acquire_ctx { - struct task_struct *task; - unsigned long stamp; ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -24,6 +24,7 @@ - #include - #include - #include -+#include - - #include "rtmutex_common.h" - -@@ -1234,6 +1235,40 @@ EXPORT_SYMBOL(__rt_spin_lock_init); - - #endif /* PREEMPT_RT */ - -+#ifdef CONFIG_PREEMPT_RT -+ static inline int __sched -+__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); -+ struct ww_acquire_ctx *hold_ctx = READ_ONCE(ww->ctx); -+ -+ if (!hold_ctx) -+ return 0; -+ -+ if (unlikely(ctx == hold_ctx)) -+ return -EALREADY; -+ -+ if (ctx->stamp - hold_ctx->stamp <= LONG_MAX && -+ (ctx->stamp != hold_ctx->stamp || ctx > hold_ctx)) { -+#ifdef CONFIG_DEBUG_MUTEXES -+ DEBUG_LOCKS_WARN_ON(ctx->contending_lock); -+ ctx->contending_lock = ww; -+#endif -+ return -EDEADLK; -+ } -+ -+ return 0; -+} -+#else -+ static inline int __sched -+__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+ BUG(); -+ return 0; -+} -+ -+#endif -+ - static inline int - try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, - struct rt_mutex_waiter *waiter) -@@ -1512,7 +1547,8 @@ void rt_mutex_init_waiter(struct rt_mute - static int __sched - __rt_mutex_slowlock(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, -- struct rt_mutex_waiter *waiter) -+ struct rt_mutex_waiter *waiter, -+ struct ww_acquire_ctx *ww_ctx) - { - int ret = 0; - -@@ -1530,6 +1566,12 @@ static int __sched - break; - } - -+ if (ww_ctx && ww_ctx->acquired > 0) { -+ ret = __mutex_lock_check_stamp(lock, ww_ctx); -+ if (ret) -+ break; -+ } -+ - raw_spin_unlock_irq(&lock->wait_lock); - - schedule(); -@@ -1558,16 +1600,106 @@ static void rt_mutex_handle_deadlock(int - } - } - -+static __always_inline void ww_mutex_lock_acquired(struct ww_mutex *ww, -+ struct ww_acquire_ctx *ww_ctx) -+{ -+#ifdef CONFIG_DEBUG_MUTEXES -+ /* -+ * If this WARN_ON triggers, you used ww_mutex_lock to acquire, -+ * but released with a normal mutex_unlock in this call. -+ * -+ * This should never happen, always use ww_mutex_unlock. -+ */ -+ DEBUG_LOCKS_WARN_ON(ww->ctx); -+ -+ /* -+ * Not quite done after calling ww_acquire_done() ? -+ */ -+ DEBUG_LOCKS_WARN_ON(ww_ctx->done_acquire); -+ -+ if (ww_ctx->contending_lock) { -+ /* -+ * After -EDEADLK you tried to -+ * acquire a different ww_mutex? Bad! -+ */ -+ DEBUG_LOCKS_WARN_ON(ww_ctx->contending_lock != ww); -+ -+ /* -+ * You called ww_mutex_lock after receiving -EDEADLK, -+ * but 'forgot' to unlock everything else first? -+ */ -+ DEBUG_LOCKS_WARN_ON(ww_ctx->acquired > 0); -+ ww_ctx->contending_lock = NULL; -+ } -+ -+ /* -+ * Naughty, using a different class will lead to undefined behavior! -+ */ -+ DEBUG_LOCKS_WARN_ON(ww_ctx->ww_class != ww->ww_class); -+#endif -+ ww_ctx->acquired++; -+} -+ -+#ifdef CONFIG_PREEMPT_RT -+static void ww_mutex_account_lock(struct rt_mutex *lock, -+ struct ww_acquire_ctx *ww_ctx) -+{ -+ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); -+ struct rt_mutex_waiter *waiter, *n; -+ -+ /* -+ * This branch gets optimized out for the common case, -+ * and is only important for ww_mutex_lock. -+ */ -+ ww_mutex_lock_acquired(ww, ww_ctx); -+ ww->ctx = ww_ctx; -+ -+ /* -+ * Give any possible sleeping processes the chance to wake up, -+ * so they can recheck if they have to back off. -+ */ -+ rbtree_postorder_for_each_entry_safe(waiter, n, &lock->waiters.rb_root, -+ tree_entry) { -+ /* XXX debug rt mutex waiter wakeup */ -+ -+ BUG_ON(waiter->lock != lock); -+ rt_mutex_wake_waiter(waiter); -+ } -+} -+ -+#else -+ -+static void ww_mutex_account_lock(struct rt_mutex *lock, -+ struct ww_acquire_ctx *ww_ctx) -+{ -+ BUG(); -+} -+#endif -+ - int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx, - struct rt_mutex_waiter *waiter) - { - int ret; - -+#ifdef CONFIG_PREEMPT_RT -+ if (ww_ctx) { -+ struct ww_mutex *ww; -+ -+ ww = container_of(lock, struct ww_mutex, base.lock); -+ if (unlikely(ww_ctx == READ_ONCE(ww->ctx))) -+ return -EALREADY; -+ } -+#endif -+ - /* Try to acquire the lock again: */ -- if (try_to_take_rt_mutex(lock, current, NULL)) -+ if (try_to_take_rt_mutex(lock, current, NULL)) { -+ if (ww_ctx) -+ ww_mutex_account_lock(lock, ww_ctx); - return 0; -+ } - - set_current_state(state); - -@@ -1577,14 +1709,24 @@ int __sched rt_mutex_slowlock_locked(str - - ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk); - -- if (likely(!ret)) -+ if (likely(!ret)) { - /* sleep on the mutex */ -- ret = __rt_mutex_slowlock(lock, state, timeout, waiter); -+ ret = __rt_mutex_slowlock(lock, state, timeout, waiter, -+ ww_ctx); -+ } else if (ww_ctx) { -+ /* ww_mutex received EDEADLK, let it become EALREADY */ -+ ret = __mutex_lock_check_stamp(lock, ww_ctx); -+ BUG_ON(!ret); -+ } - - if (unlikely(ret)) { - __set_current_state(TASK_RUNNING); - remove_waiter(lock, waiter); -- rt_mutex_handle_deadlock(ret, chwalk, waiter); -+ /* ww_mutex wants to report EDEADLK/EALREADY, let it */ -+ if (!ww_ctx) -+ rt_mutex_handle_deadlock(ret, chwalk, waiter); -+ } else if (ww_ctx) { -+ ww_mutex_account_lock(lock, ww_ctx); - } - - /* -@@ -1601,7 +1743,8 @@ int __sched rt_mutex_slowlock_locked(str - static int __sched - rt_mutex_slowlock(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk) -+ enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx) - { - struct rt_mutex_waiter waiter; - unsigned long flags; -@@ -1619,7 +1762,8 @@ rt_mutex_slowlock(struct rt_mutex *lock, - */ - raw_spin_lock_irqsave(&lock->wait_lock, flags); - -- ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, &waiter); -+ ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, ww_ctx, -+ &waiter); - - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - -@@ -1749,14 +1893,16 @@ static bool __sched rt_mutex_slowunlock( - */ - static inline int - rt_mutex_fastlock(struct rt_mutex *lock, int state, -+ struct ww_acquire_ctx *ww_ctx, - int (*slowfn)(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk)) -+ enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx)) - { - if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) - return 0; - -- return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK); -+ return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx); - } - - static inline int -@@ -1801,7 +1947,7 @@ rt_mutex_fastunlock(struct rt_mutex *loc - int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) - { - might_sleep(); -- return rt_mutex_fastlock(lock, state, rt_mutex_slowlock); -+ return rt_mutex_fastlock(lock, state, NULL, rt_mutex_slowlock); - } - - /** -@@ -2245,7 +2391,7 @@ int rt_mutex_wait_proxy_lock(struct rt_m - raw_spin_lock_irq(&lock->wait_lock); - /* sleep on the mutex */ - set_current_state(TASK_INTERRUPTIBLE); -- ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter); -+ ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter, NULL); - /* - * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might - * have to fix that up. -@@ -2315,3 +2461,97 @@ bool rt_mutex_cleanup_proxy_lock(struct - - return cleanup; - } -+ -+static inline int -+ww_mutex_deadlock_injection(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH -+ unsigned int tmp; -+ -+ if (ctx->deadlock_inject_countdown-- == 0) { -+ tmp = ctx->deadlock_inject_interval; -+ if (tmp > UINT_MAX/4) -+ tmp = UINT_MAX; -+ else -+ tmp = tmp*2 + tmp + tmp/2; -+ -+ ctx->deadlock_inject_interval = tmp; -+ ctx->deadlock_inject_countdown = tmp; -+ ctx->contending_lock = lock; -+ -+ ww_mutex_unlock(lock); -+ -+ return -EDEADLK; -+ } -+#endif -+ -+ return 0; -+} -+ -+#ifdef CONFIG_PREEMPT_RT -+int __sched -+ww_mutex_lock_interruptible(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+ int ret; -+ -+ might_sleep(); -+ -+ mutex_acquire_nest(&lock->base.dep_map, 0, 0, -+ ctx ? &ctx->dep_map : NULL, _RET_IP_); -+ ret = rt_mutex_slowlock(&lock->base.lock, TASK_INTERRUPTIBLE, NULL, 0, -+ ctx); -+ if (ret) -+ mutex_release(&lock->base.dep_map, _RET_IP_); -+ else if (!ret && ctx && ctx->acquired > 1) -+ return ww_mutex_deadlock_injection(lock, ctx); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(ww_mutex_lock_interruptible); -+ -+int __sched -+ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+ int ret; -+ -+ might_sleep(); -+ -+ mutex_acquire_nest(&lock->base.dep_map, 0, 0, -+ ctx ? &ctx->dep_map : NULL, _RET_IP_); -+ ret = rt_mutex_slowlock(&lock->base.lock, TASK_UNINTERRUPTIBLE, NULL, 0, -+ ctx); -+ if (ret) -+ mutex_release(&lock->base.dep_map, _RET_IP_); -+ else if (!ret && ctx && ctx->acquired > 1) -+ return ww_mutex_deadlock_injection(lock, ctx); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(ww_mutex_lock); -+ -+void __sched ww_mutex_unlock(struct ww_mutex *lock) -+{ -+ /* -+ * The unlocking fastpath is the 0->1 transition from 'locked' -+ * into 'unlocked' state: -+ */ -+ if (lock->ctx) { -+#ifdef CONFIG_DEBUG_MUTEXES -+ DEBUG_LOCKS_WARN_ON(!lock->ctx->acquired); -+#endif -+ if (lock->ctx->acquired > 0) -+ lock->ctx->acquired--; -+ lock->ctx = NULL; -+ } -+ -+ mutex_release(&lock->base.dep_map, _RET_IP_); -+ __rt_mutex_unlock(&lock->base.lock); -+} -+EXPORT_SYMBOL(ww_mutex_unlock); -+ -+int __rt_mutex_owner_current(struct rt_mutex *lock) -+{ -+ return rt_mutex_owner(lock) == current; -+} -+EXPORT_SYMBOL(__rt_mutex_owner_current); -+#endif ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -159,6 +159,7 @@ extern void rt_mutex_postunlock(struct w - struct wake_q_head *wake_sleeper_q); - - /* RW semaphore special interface */ -+struct ww_acquire_ctx; - - extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); - extern int __rt_mutex_trylock(struct rt_mutex *lock); -@@ -166,6 +167,7 @@ extern void __rt_mutex_unlock(struct rt_ - int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx, - struct rt_mutex_waiter *waiter); - void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, - struct rt_mutex_waiter *waiter, ---- a/kernel/locking/rwsem-rt.c -+++ b/kernel/locking/rwsem-rt.c -@@ -138,7 +138,7 @@ static int __sched __down_read_common(st - */ - rt_mutex_init_waiter(&waiter, false); - ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK, -- &waiter); -+ NULL, &waiter); - /* - * The slowlock() above is guaranteed to return with the rtmutex (for - * ret = 0) is now held, so there can't be a writer active. Increment diff --git a/kernel/patches-5.11.x-rt/0098-0022-locking-rtmutex-Use-custom-scheduling-function-for-s.patch b/kernel/patches-5.11.x-rt/0098-0022-locking-rtmutex-Use-custom-scheduling-function-for-s.patch deleted file mode 100644 index 82b226d7e8..0000000000 --- a/kernel/patches-5.11.x-rt/0098-0022-locking-rtmutex-Use-custom-scheduling-function-for-s.patch +++ /dev/null @@ -1,224 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 6 Oct 2020 13:07:17 +0200 -Subject: [PATCH 22/22] locking/rtmutex: Use custom scheduling function for - spin-schedule() - -PREEMPT_RT builds the rwsem, mutex, spinlock and rwlock typed locks on -top of a rtmutex lock. While blocked task->pi_blocked_on is set -(tsk_is_pi_blocked()) and task needs to schedule away while waiting. - -The schedule process must distinguish between blocking on a regular -sleeping lock (rwsem and mutex) and a RT-only sleeping lock (spinlock -and rwlock): -- rwsem and mutex must flush block requests (blk_schedule_flush_plug()) - even if blocked on a lock. This can not deadlock because this also - happens for non-RT. - There should be a warning if the scheduling point is within a RCU read - section. - -- spinlock and rwlock must not flush block requests. This will deadlock - if the callback attempts to acquire a lock which is already acquired. - Similarly to being preempted, there should be no warning if the - scheduling point is within a RCU read section. - -Add preempt_schedule_lock() which is invoked if scheduling is required -while blocking on a PREEMPT_RT-only sleeping lock. -Remove tsk_is_pi_blocked() from the scheduler path which is no longer -needed with the additional scheduler entry point. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm64/include/asm/preempt.h | 3 +++ - arch/x86/include/asm/preempt.h | 3 +++ - include/asm-generic/preempt.h | 3 +++ - include/linux/sched/rt.h | 8 -------- - kernel/locking/rtmutex.c | 2 +- - kernel/locking/rwlock-rt.c | 2 +- - kernel/sched/core.c | 32 +++++++++++++++++++++----------- - 7 files changed, 32 insertions(+), 21 deletions(-) - ---- a/arch/arm64/include/asm/preempt.h -+++ b/arch/arm64/include/asm/preempt.h -@@ -81,6 +81,9 @@ static inline bool should_resched(int pr - - #ifdef CONFIG_PREEMPTION - void preempt_schedule(void); -+#ifdef CONFIG_PREEMPT_RT -+void preempt_schedule_lock(void); -+#endif - #define __preempt_schedule() preempt_schedule() - void preempt_schedule_notrace(void); - #define __preempt_schedule_notrace() preempt_schedule_notrace() ---- a/arch/x86/include/asm/preempt.h -+++ b/arch/x86/include/asm/preempt.h -@@ -103,6 +103,9 @@ static __always_inline bool should_resch - } - - #ifdef CONFIG_PREEMPTION -+#ifdef CONFIG_PREEMPT_RT -+ extern void preempt_schedule_lock(void); -+#endif - extern asmlinkage void preempt_schedule_thunk(void); - # define __preempt_schedule() \ - asm volatile ("call preempt_schedule_thunk" : ASM_CALL_CONSTRAINT) ---- a/include/asm-generic/preempt.h -+++ b/include/asm-generic/preempt.h -@@ -79,6 +79,9 @@ static __always_inline bool should_resch - } - - #ifdef CONFIG_PREEMPTION -+#ifdef CONFIG_PREEMPT_RT -+extern void preempt_schedule_lock(void); -+#endif - extern asmlinkage void preempt_schedule(void); - #define __preempt_schedule() preempt_schedule() - extern asmlinkage void preempt_schedule_notrace(void); ---- a/include/linux/sched/rt.h -+++ b/include/linux/sched/rt.h -@@ -39,20 +39,12 @@ static inline struct task_struct *rt_mut - } - extern void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task); - extern void rt_mutex_adjust_pi(struct task_struct *p); --static inline bool tsk_is_pi_blocked(struct task_struct *tsk) --{ -- return tsk->pi_blocked_on != NULL; --} - #else - static inline struct task_struct *rt_mutex_get_top_task(struct task_struct *task) - { - return NULL; - } - # define rt_mutex_adjust_pi(p) do { } while (0) --static inline bool tsk_is_pi_blocked(struct task_struct *tsk) --{ -- return false; --} - #endif - - extern void normalize_rt_tasks(void); ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1067,7 +1067,7 @@ void __sched rt_spin_lock_slowlock_locke - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - - if (top_waiter != waiter || adaptive_wait(lock, lock_owner)) -- schedule(); -+ preempt_schedule_lock(); - - raw_spin_lock_irqsave(&lock->wait_lock, flags); - ---- a/kernel/locking/rwlock-rt.c -+++ b/kernel/locking/rwlock-rt.c -@@ -211,7 +211,7 @@ static void __write_rt_lock(struct rt_rw - raw_spin_unlock_irqrestore(&m->wait_lock, flags); - - if (atomic_read(&lock->readers) != 0) -- schedule(); -+ preempt_schedule_lock(); - - raw_spin_lock_irqsave(&m->wait_lock, flags); - ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -5006,7 +5006,7 @@ pick_next_task(struct rq *rq, struct tas - * - * WARNING: must be called with preemption disabled! - */ --static void __sched notrace __schedule(bool preempt) -+static void __sched notrace __schedule(bool preempt, bool spinning_lock) - { - struct task_struct *prev, *next; - unsigned long *switch_count; -@@ -5059,7 +5059,7 @@ static void __sched notrace __schedule(b - * - ptrace_{,un}freeze_traced() can change ->state underneath us. - */ - prev_state = prev->state; -- if (!preempt && prev_state) { -+ if ((!preempt || spinning_lock) && prev_state) { - if (signal_pending_state(prev_state, prev)) { - prev->state = TASK_RUNNING; - } else { -@@ -5143,7 +5143,7 @@ void __noreturn do_task_dead(void) - /* Tell freezer to ignore us: */ - current->flags |= PF_NOFREEZE; - -- __schedule(false); -+ __schedule(false, false); - BUG(); - - /* Avoid "noreturn function does return" - but don't continue if BUG() is a NOP: */ -@@ -5176,9 +5176,6 @@ static inline void sched_submit_work(str - preempt_enable_no_resched(); - } - -- if (tsk_is_pi_blocked(tsk)) -- return; -- - /* - * If we are going to sleep and we have plugged IO queued, - * make sure to submit it to avoid deadlocks. -@@ -5204,7 +5201,7 @@ asmlinkage __visible void __sched schedu - sched_submit_work(tsk); - do { - preempt_disable(); -- __schedule(false); -+ __schedule(false, false); - sched_preempt_enable_no_resched(); - } while (need_resched()); - sched_update_worker(tsk); -@@ -5232,7 +5229,7 @@ void __sched schedule_idle(void) - */ - WARN_ON_ONCE(current->state); - do { -- __schedule(false); -+ __schedule(false, false); - } while (need_resched()); - } - -@@ -5285,7 +5282,7 @@ static void __sched notrace preempt_sche - */ - preempt_disable_notrace(); - preempt_latency_start(1); -- __schedule(true); -+ __schedule(true, false); - preempt_latency_stop(1); - preempt_enable_no_resched_notrace(); - -@@ -5315,6 +5312,19 @@ asmlinkage __visible void __sched notrac - NOKPROBE_SYMBOL(preempt_schedule); - EXPORT_SYMBOL(preempt_schedule); - -+#ifdef CONFIG_PREEMPT_RT -+void __sched notrace preempt_schedule_lock(void) -+{ -+ do { -+ preempt_disable(); -+ __schedule(true, true); -+ sched_preempt_enable_no_resched(); -+ } while (need_resched()); -+} -+NOKPROBE_SYMBOL(preempt_schedule_lock); -+EXPORT_SYMBOL(preempt_schedule_lock); -+#endif -+ - /** - * preempt_schedule_notrace - preempt_schedule called by tracing - * -@@ -5358,7 +5368,7 @@ asmlinkage __visible void __sched notrac - * an infinite recursion. - */ - prev_ctx = exception_enter(); -- __schedule(true); -+ __schedule(true, false); - exception_exit(prev_ctx); - - preempt_latency_stop(1); -@@ -5387,7 +5397,7 @@ asmlinkage __visible void __sched preemp - do { - preempt_disable(); - local_irq_enable(); -- __schedule(true); -+ __schedule(true, false); - local_irq_disable(); - sched_preempt_enable_no_resched(); - } while (need_resched()); diff --git a/kernel/patches-5.11.x-rt/0099-signal-revert-ptrace-preempt-magic.patch b/kernel/patches-5.11.x-rt/0099-signal-revert-ptrace-preempt-magic.patch deleted file mode 100644 index 7e95a5ae35..0000000000 --- a/kernel/patches-5.11.x-rt/0099-signal-revert-ptrace-preempt-magic.patch +++ /dev/null @@ -1,32 +0,0 @@ -Subject: signal: Revert ptrace preempt magic -From: Thomas Gleixner -Date: Wed, 21 Sep 2011 19:57:12 +0200 - -Upstream commit '53da1d9456fe7f8 fix ptrace slowness' is nothing more -than a bandaid around the ptrace design trainwreck. It's not a -correctness issue, it's merily a cosmetic bandaid. - -Signed-off-by: Thomas Gleixner ---- - kernel/signal.c | 8 -------- - 1 file changed, 8 deletions(-) - ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -2203,16 +2203,8 @@ static void ptrace_stop(int exit_code, i - if (gstop_done && ptrace_reparented(current)) - do_notify_parent_cldstop(current, false, why); - -- /* -- * Don't want to allow preemption here, because -- * sys_ptrace() needs this task to be inactive. -- * -- * XXX: implement read_unlock_no_resched(). -- */ -- preempt_disable(); - read_unlock(&tasklist_lock); - cgroup_enter_frozen(); -- preempt_enable_no_resched(); - freezable_schedule(); - cgroup_leave_frozen(true); - } else { diff --git a/kernel/patches-5.11.x-rt/0100-preempt-nort-rt-variants.patch b/kernel/patches-5.11.x-rt/0100-preempt-nort-rt-variants.patch deleted file mode 100644 index 816e55ea56..0000000000 --- a/kernel/patches-5.11.x-rt/0100-preempt-nort-rt-variants.patch +++ /dev/null @@ -1,47 +0,0 @@ -From: Thomas Gleixner -Date: Fri, 24 Jul 2009 12:38:56 +0200 -Subject: preempt: Provide preempt_*_(no)rt variants - -RT needs a few preempt_disable/enable points which are not necessary -otherwise. Implement variants to avoid #ifdeffery. - -Signed-off-by: Thomas Gleixner - ---- - include/linux/preempt.h | 18 +++++++++++++++++- - 1 file changed, 17 insertions(+), 1 deletion(-) - ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -188,7 +188,11 @@ do { \ - preempt_count_dec(); \ - } while (0) - --#define preempt_enable_no_resched() sched_preempt_enable_no_resched() -+#ifdef CONFIG_PREEMPT_RT -+# define preempt_enable_no_resched() sched_preempt_enable_no_resched() -+#else -+# define preempt_enable_no_resched() preempt_enable() -+#endif - - #define preemptible() (preempt_count() == 0 && !irqs_disabled()) - -@@ -282,6 +286,18 @@ do { \ - set_preempt_need_resched(); \ - } while (0) - -+#ifdef CONFIG_PREEMPT_RT -+# define preempt_disable_rt() preempt_disable() -+# define preempt_enable_rt() preempt_enable() -+# define preempt_disable_nort() barrier() -+# define preempt_enable_nort() barrier() -+#else -+# define preempt_disable_rt() barrier() -+# define preempt_enable_rt() barrier() -+# define preempt_disable_nort() preempt_disable() -+# define preempt_enable_nort() preempt_enable() -+#endif -+ - #ifdef CONFIG_PREEMPT_NOTIFIERS - - struct preempt_notifier; diff --git a/kernel/patches-5.11.x-rt/0101-mm-make-vmstat-rt-aware.patch b/kernel/patches-5.11.x-rt/0101-mm-make-vmstat-rt-aware.patch deleted file mode 100644 index 12ff0598ac..0000000000 --- a/kernel/patches-5.11.x-rt/0101-mm-make-vmstat-rt-aware.patch +++ /dev/null @@ -1,136 +0,0 @@ -From: Ingo Molnar -Date: Fri, 3 Jul 2009 08:30:13 -0500 -Subject: mm/vmstat: Protect per cpu variables with preempt disable on RT - -Disable preemption on -RT for the vmstat code. On vanila the code runs in -IRQ-off regions while on -RT it is not. "preempt_disable" ensures that the -same ressources is not updated in parallel due to preemption. - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner - ---- - include/linux/vmstat.h | 4 ++++ - mm/vmstat.c | 12 ++++++++++++ - 2 files changed, 16 insertions(+) - ---- a/include/linux/vmstat.h -+++ b/include/linux/vmstat.h -@@ -63,7 +63,9 @@ DECLARE_PER_CPU(struct vm_event_state, v - */ - static inline void __count_vm_event(enum vm_event_item item) - { -+ preempt_disable_rt(); - raw_cpu_inc(vm_event_states.event[item]); -+ preempt_enable_rt(); - } - - static inline void count_vm_event(enum vm_event_item item) -@@ -73,7 +75,9 @@ static inline void count_vm_event(enum v - - static inline void __count_vm_events(enum vm_event_item item, long delta) - { -+ preempt_disable_rt(); - raw_cpu_add(vm_event_states.event[item], delta); -+ preempt_enable_rt(); - } - - static inline void count_vm_events(enum vm_event_item item, long delta) ---- a/mm/vmstat.c -+++ b/mm/vmstat.c -@@ -321,6 +321,7 @@ void __mod_zone_page_state(struct zone * - long x; - long t; - -+ preempt_disable_rt(); - x = delta + __this_cpu_read(*p); - - t = __this_cpu_read(pcp->stat_threshold); -@@ -330,6 +331,7 @@ void __mod_zone_page_state(struct zone * - x = 0; - } - __this_cpu_write(*p, x); -+ preempt_enable_rt(); - } - EXPORT_SYMBOL(__mod_zone_page_state); - -@@ -346,6 +348,7 @@ void __mod_node_page_state(struct pglist - delta >>= PAGE_SHIFT; - } - -+ preempt_disable_rt(); - x = delta + __this_cpu_read(*p); - - t = __this_cpu_read(pcp->stat_threshold); -@@ -355,6 +358,7 @@ void __mod_node_page_state(struct pglist - x = 0; - } - __this_cpu_write(*p, x); -+ preempt_enable_rt(); - } - EXPORT_SYMBOL(__mod_node_page_state); - -@@ -387,6 +391,7 @@ void __inc_zone_state(struct zone *zone, - s8 __percpu *p = pcp->vm_stat_diff + item; - s8 v, t; - -+ preempt_disable_rt(); - v = __this_cpu_inc_return(*p); - t = __this_cpu_read(pcp->stat_threshold); - if (unlikely(v > t)) { -@@ -395,6 +400,7 @@ void __inc_zone_state(struct zone *zone, - zone_page_state_add(v + overstep, zone, item); - __this_cpu_write(*p, -overstep); - } -+ preempt_enable_rt(); - } - - void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item) -@@ -405,6 +411,7 @@ void __inc_node_state(struct pglist_data - - VM_WARN_ON_ONCE(vmstat_item_in_bytes(item)); - -+ preempt_disable_rt(); - v = __this_cpu_inc_return(*p); - t = __this_cpu_read(pcp->stat_threshold); - if (unlikely(v > t)) { -@@ -413,6 +420,7 @@ void __inc_node_state(struct pglist_data - node_page_state_add(v + overstep, pgdat, item); - __this_cpu_write(*p, -overstep); - } -+ preempt_enable_rt(); - } - - void __inc_zone_page_state(struct page *page, enum zone_stat_item item) -@@ -433,6 +441,7 @@ void __dec_zone_state(struct zone *zone, - s8 __percpu *p = pcp->vm_stat_diff + item; - s8 v, t; - -+ preempt_disable_rt(); - v = __this_cpu_dec_return(*p); - t = __this_cpu_read(pcp->stat_threshold); - if (unlikely(v < - t)) { -@@ -441,6 +450,7 @@ void __dec_zone_state(struct zone *zone, - zone_page_state_add(v - overstep, zone, item); - __this_cpu_write(*p, overstep); - } -+ preempt_enable_rt(); - } - - void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item) -@@ -451,6 +461,7 @@ void __dec_node_state(struct pglist_data - - VM_WARN_ON_ONCE(vmstat_item_in_bytes(item)); - -+ preempt_disable_rt(); - v = __this_cpu_dec_return(*p); - t = __this_cpu_read(pcp->stat_threshold); - if (unlikely(v < - t)) { -@@ -459,6 +470,7 @@ void __dec_node_state(struct pglist_data - node_page_state_add(v - overstep, pgdat, item); - __this_cpu_write(*p, overstep); - } -+ preempt_enable_rt(); - } - - void __dec_zone_page_state(struct page *page, enum zone_stat_item item) diff --git a/kernel/patches-5.11.x-rt/0102-mm-memcontrol-Disable-preemption-in-__mod_memcg_lruv.patch b/kernel/patches-5.11.x-rt/0102-mm-memcontrol-Disable-preemption-in-__mod_memcg_lruv.patch deleted file mode 100644 index d6b51d46ce..0000000000 --- a/kernel/patches-5.11.x-rt/0102-mm-memcontrol-Disable-preemption-in-__mod_memcg_lruv.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 28 Oct 2020 18:15:32 +0100 -Subject: [PATCH] mm/memcontrol: Disable preemption in - __mod_memcg_lruvec_state() - -The callers expect disabled preemption/interrupts while invoking -__mod_memcg_lruvec_state(). This works mainline because a lock of -somekind is acquired. - -Use preempt_disable_rt() where per-CPU variables are accessed and a -stable pointer is expected. This is also done in __mod_zone_page_state() -for the same reason. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/memcontrol.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/mm/memcontrol.c -+++ b/mm/memcontrol.c -@@ -805,6 +805,7 @@ void __mod_memcg_lruvec_state(struct lru - pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); - memcg = pn->memcg; - -+ preempt_disable_rt(); - /* Update memcg */ - __mod_memcg_state(memcg, idx, val); - -@@ -824,6 +825,7 @@ void __mod_memcg_lruvec_state(struct lru - x = 0; - } - __this_cpu_write(pn->lruvec_stat_cpu->count[idx], x); -+ preempt_enable_rt(); - } - - /** diff --git a/kernel/patches-5.11.x-rt/0103-0024-xfrm-Use-sequence-counter-with-associated-spinlock.patch b/kernel/patches-5.11.x-rt/0103-0024-xfrm-Use-sequence-counter-with-associated-spinlock.patch deleted file mode 100644 index c14516969f..0000000000 --- a/kernel/patches-5.11.x-rt/0103-0024-xfrm-Use-sequence-counter-with-associated-spinlock.patch +++ /dev/null @@ -1,59 +0,0 @@ -From: "Ahmed S. Darwish" -Date: Wed, 10 Jun 2020 12:53:22 +0200 -Subject: [PATCH 24/24] xfrm: Use sequence counter with associated spinlock - -A sequence counter write side critical section must be protected by some -form of locking to serialize writers. A plain seqcount_t does not -contain the information of which lock must be held when entering a write -side critical section. - -Use the new seqcount_spinlock_t data type, which allows to associate a -spinlock with the sequence counter. This enables lockdep to verify that -the spinlock used for writer serialization is held when the write side -critical section is entered. - -If lockdep is disabled this lock association is compiled out and has -neither storage size nor runtime overhead. - -Upstream-status: The xfrm locking used for seqcoun writer serialization -appears to be broken. If that's the case, a proper fix will need to be -submitted upstream. (e.g. make the seqcount per network namespace?) - -Signed-off-by: Ahmed S. Darwish -Signed-off-by: Sebastian Andrzej Siewior ---- - net/xfrm/xfrm_state.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - ---- a/net/xfrm/xfrm_state.c -+++ b/net/xfrm/xfrm_state.c -@@ -44,7 +44,7 @@ static void xfrm_state_gc_task(struct wo - */ - - static unsigned int xfrm_state_hashmax __read_mostly = 1 * 1024 * 1024; --static __read_mostly seqcount_t xfrm_state_hash_generation = SEQCNT_ZERO(xfrm_state_hash_generation); -+static __read_mostly seqcount_spinlock_t xfrm_state_hash_generation; - static struct kmem_cache *xfrm_state_cache __ro_after_init; - - static DECLARE_WORK(xfrm_state_gc_work, xfrm_state_gc_task); -@@ -139,6 +139,11 @@ static void xfrm_hash_resize(struct work - return; - } - -+ /* XXX - the locking which protects the sequence counter appears -+ * to be broken here. The sequence counter is global, but the -+ * spinlock used for the sequence counter write serialization is -+ * per network namespace... -+ */ - spin_lock_bh(&net->xfrm.xfrm_state_lock); - write_seqcount_begin(&xfrm_state_hash_generation); - -@@ -2666,6 +2671,8 @@ int __net_init xfrm_state_init(struct ne - net->xfrm.state_num = 0; - INIT_WORK(&net->xfrm.state_hash_work, xfrm_hash_resize); - spin_lock_init(&net->xfrm.xfrm_state_lock); -+ seqcount_spinlock_init(&xfrm_state_hash_generation, -+ &net->xfrm.xfrm_state_lock); - return 0; - - out_byspi: diff --git a/kernel/patches-5.11.x-rt/0104-u64_stats-Disable-preemption-on-32bit-UP-SMP-with-RT.patch b/kernel/patches-5.11.x-rt/0104-u64_stats-Disable-preemption-on-32bit-UP-SMP-with-RT.patch deleted file mode 100644 index 4e0d4d2134..0000000000 --- a/kernel/patches-5.11.x-rt/0104-u64_stats-Disable-preemption-on-32bit-UP-SMP-with-RT.patch +++ /dev/null @@ -1,144 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 17 Aug 2020 12:28:10 +0200 -Subject: [PATCH] u64_stats: Disable preemption on 32bit-UP/SMP with RT during - updates - -On RT the seqcount_t is required even on UP because the softirq can be -preempted. The IRQ handler is threaded so it is also preemptible. - -Disable preemption on 32bit-RT during value updates. There is no need to -disable interrupts on RT because the handler is run threaded. Therefore -disabling preemption is enough to guarantee that the update is not -interruped. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/u64_stats_sync.h | 42 +++++++++++++++++++++++++++-------------- - 1 file changed, 28 insertions(+), 14 deletions(-) - ---- a/include/linux/u64_stats_sync.h -+++ b/include/linux/u64_stats_sync.h -@@ -66,7 +66,7 @@ - #include - - struct u64_stats_sync { --#if BITS_PER_LONG==32 && defined(CONFIG_SMP) -+#if BITS_PER_LONG==32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) - seqcount_t seq; - #endif - }; -@@ -117,22 +117,26 @@ static inline void u64_stats_inc(u64_sta - - static inline void u64_stats_init(struct u64_stats_sync *syncp) - { --#if BITS_PER_LONG == 32 && defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) - seqcount_init(&syncp->seq); - #endif - } - - static inline void u64_stats_update_begin(struct u64_stats_sync *syncp) - { --#if BITS_PER_LONG==32 && defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ preempt_disable(); - write_seqcount_begin(&syncp->seq); - #endif - } - - static inline void u64_stats_update_end(struct u64_stats_sync *syncp) - { --#if BITS_PER_LONG==32 && defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) - write_seqcount_end(&syncp->seq); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ preempt_enable(); - #endif - } - -@@ -141,8 +145,11 @@ u64_stats_update_begin_irqsave(struct u6 - { - unsigned long flags = 0; - --#if BITS_PER_LONG==32 && defined(CONFIG_SMP) -- local_irq_save(flags); -+#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ preempt_disable(); -+ else -+ local_irq_save(flags); - write_seqcount_begin(&syncp->seq); - #endif - return flags; -@@ -152,15 +159,18 @@ static inline void - u64_stats_update_end_irqrestore(struct u64_stats_sync *syncp, - unsigned long flags) - { --#if BITS_PER_LONG==32 && defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) - write_seqcount_end(&syncp->seq); -- local_irq_restore(flags); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) -+ preempt_enable(); -+ else -+ local_irq_restore(flags); - #endif - } - - static inline unsigned int __u64_stats_fetch_begin(const struct u64_stats_sync *syncp) - { --#if BITS_PER_LONG==32 && defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) - return read_seqcount_begin(&syncp->seq); - #else - return 0; -@@ -169,7 +179,7 @@ static inline unsigned int __u64_stats_f - - static inline unsigned int u64_stats_fetch_begin(const struct u64_stats_sync *syncp) - { --#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && (!defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_RT)) - preempt_disable(); - #endif - return __u64_stats_fetch_begin(syncp); -@@ -178,7 +188,7 @@ static inline unsigned int u64_stats_fet - static inline bool __u64_stats_fetch_retry(const struct u64_stats_sync *syncp, - unsigned int start) - { --#if BITS_PER_LONG==32 && defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) - return read_seqcount_retry(&syncp->seq, start); - #else - return false; -@@ -188,7 +198,7 @@ static inline bool __u64_stats_fetch_ret - static inline bool u64_stats_fetch_retry(const struct u64_stats_sync *syncp, - unsigned int start) - { --#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && (!defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_RT)) - preempt_enable(); - #endif - return __u64_stats_fetch_retry(syncp, start); -@@ -202,7 +212,9 @@ static inline bool u64_stats_fetch_retry - */ - static inline unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync *syncp) - { --#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && defined(CONFIG_PREEMPT_RT) -+ preempt_disable(); -+#elif BITS_PER_LONG == 32 && !defined(CONFIG_SMP) - local_irq_disable(); - #endif - return __u64_stats_fetch_begin(syncp); -@@ -211,7 +223,9 @@ static inline unsigned int u64_stats_fet - static inline bool u64_stats_fetch_retry_irq(const struct u64_stats_sync *syncp, - unsigned int start) - { --#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) -+#if BITS_PER_LONG == 32 && defined(CONFIG_PREEMPT_RT) -+ preempt_enable(); -+#elif BITS_PER_LONG == 32 && !defined(CONFIG_SMP) - local_irq_enable(); - #endif - return __u64_stats_fetch_retry(syncp, start); diff --git a/kernel/patches-5.11.x-rt/0105-fs-dcache-use-swait_queue-instead-of-waitqueue.patch b/kernel/patches-5.11.x-rt/0105-fs-dcache-use-swait_queue-instead-of-waitqueue.patch deleted file mode 100644 index b5f3eff050..0000000000 --- a/kernel/patches-5.11.x-rt/0105-fs-dcache-use-swait_queue-instead-of-waitqueue.patch +++ /dev/null @@ -1,234 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 14 Sep 2016 14:35:49 +0200 -Subject: [PATCH] fs/dcache: use swait_queue instead of waitqueue - -__d_lookup_done() invokes wake_up_all() while holding a hlist_bl_lock() -which disables preemption. As a workaround convert it to swait. - -Signed-off-by: Sebastian Andrzej Siewior ---- - fs/afs/dir_silly.c | 2 +- - fs/cifs/readdir.c | 2 +- - fs/dcache.c | 27 +++++++++++++++------------ - fs/fuse/readdir.c | 2 +- - fs/namei.c | 4 ++-- - fs/nfs/dir.c | 4 ++-- - fs/nfs/unlink.c | 4 ++-- - fs/proc/base.c | 3 ++- - fs/proc/proc_sysctl.c | 2 +- - include/linux/dcache.h | 4 ++-- - include/linux/nfs_xdr.h | 2 +- - kernel/sched/swait.c | 1 + - 12 files changed, 31 insertions(+), 26 deletions(-) - ---- a/fs/afs/dir_silly.c -+++ b/fs/afs/dir_silly.c -@@ -236,7 +236,7 @@ int afs_silly_iput(struct dentry *dentry - struct dentry *alias; - int ret; - -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - _enter("%p{%pd},%llx", dentry, dentry, vnode->fid.vnode); - ---- a/fs/cifs/readdir.c -+++ b/fs/cifs/readdir.c -@@ -82,7 +82,7 @@ cifs_prime_dcache(struct dentry *parent, - struct inode *inode; - struct super_block *sb = parent->d_sb; - struct cifs_sb_info *cifs_sb = CIFS_SB(sb); -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - cifs_dbg(FYI, "%s: for %s\n", __func__, name->name); - ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -2525,21 +2525,24 @@ static inline void end_dir_add(struct in - - static void d_wait_lookup(struct dentry *dentry) - { -- if (d_in_lookup(dentry)) { -- DECLARE_WAITQUEUE(wait, current); -- add_wait_queue(dentry->d_wait, &wait); -- do { -- set_current_state(TASK_UNINTERRUPTIBLE); -- spin_unlock(&dentry->d_lock); -- schedule(); -- spin_lock(&dentry->d_lock); -- } while (d_in_lookup(dentry)); -- } -+ struct swait_queue __wait; -+ -+ if (!d_in_lookup(dentry)) -+ return; -+ -+ INIT_LIST_HEAD(&__wait.task_list); -+ do { -+ prepare_to_swait_exclusive(dentry->d_wait, &__wait, TASK_UNINTERRUPTIBLE); -+ spin_unlock(&dentry->d_lock); -+ schedule(); -+ spin_lock(&dentry->d_lock); -+ } while (d_in_lookup(dentry)); -+ finish_swait(dentry->d_wait, &__wait); - } - - struct dentry *d_alloc_parallel(struct dentry *parent, - const struct qstr *name, -- wait_queue_head_t *wq) -+ struct swait_queue_head *wq) - { - unsigned int hash = name->hash; - struct hlist_bl_head *b = in_lookup_hash(parent, hash); -@@ -2654,7 +2657,7 @@ void __d_lookup_done(struct dentry *dent - hlist_bl_lock(b); - dentry->d_flags &= ~DCACHE_PAR_LOOKUP; - __hlist_bl_del(&dentry->d_u.d_in_lookup_hash); -- wake_up_all(dentry->d_wait); -+ swake_up_all(dentry->d_wait); - dentry->d_wait = NULL; - hlist_bl_unlock(b); - INIT_HLIST_NODE(&dentry->d_u.d_alias); ---- a/fs/fuse/readdir.c -+++ b/fs/fuse/readdir.c -@@ -158,7 +158,7 @@ static int fuse_direntplus_link(struct f - struct inode *dir = d_inode(parent); - struct fuse_conn *fc; - struct inode *inode; -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - if (!o->nodeid) { - /* ---- a/fs/namei.c -+++ b/fs/namei.c -@@ -1520,7 +1520,7 @@ static struct dentry *__lookup_slow(cons - { - struct dentry *dentry, *old; - struct inode *inode = dir->d_inode; -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - /* Don't go there if it's already dead */ - if (unlikely(IS_DEADDIR(inode))) -@@ -3016,7 +3016,7 @@ static struct dentry *lookup_open(struct - struct dentry *dentry; - int error, create_error = 0; - umode_t mode = op->mode; -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - if (unlikely(IS_DEADDIR(dir_inode))) - return ERR_PTR(-ENOENT); ---- a/fs/nfs/dir.c -+++ b/fs/nfs/dir.c -@@ -635,7 +635,7 @@ void nfs_prime_dcache(struct dentry *par - unsigned long dir_verifier) - { - struct qstr filename = QSTR_INIT(entry->name, entry->len); -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - struct dentry *dentry; - struct dentry *alias; - struct inode *inode; -@@ -1859,7 +1859,7 @@ int nfs_atomic_open(struct inode *dir, s - struct file *file, unsigned open_flags, - umode_t mode) - { -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - struct nfs_open_context *ctx; - struct dentry *res; - struct iattr attr = { .ia_valid = ATTR_OPEN }; ---- a/fs/nfs/unlink.c -+++ b/fs/nfs/unlink.c -@@ -13,7 +13,7 @@ - #include - #include - #include --#include -+#include - #include - #include - -@@ -180,7 +180,7 @@ nfs_async_unlink(struct dentry *dentry, - - data->cred = get_current_cred(); - data->res.dir_attr = &data->dir_attr; -- init_waitqueue_head(&data->wq); -+ init_swait_queue_head(&data->wq); - - status = -EBUSY; - spin_lock(&dentry->d_lock); ---- a/fs/proc/base.c -+++ b/fs/proc/base.c -@@ -96,6 +96,7 @@ - #include - #include - #include -+#include - #include - #include "internal.h" - #include "fd.h" -@@ -2038,7 +2039,7 @@ bool proc_fill_cache(struct file *file, - - child = d_hash_and_lookup(dir, &qname); - if (!child) { -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - child = d_alloc_parallel(dir, &qname, &wq); - if (IS_ERR(child)) - goto end_instantiate; ---- a/fs/proc/proc_sysctl.c -+++ b/fs/proc/proc_sysctl.c -@@ -683,7 +683,7 @@ static bool proc_sys_fill_cache(struct f - - child = d_lookup(dir, &qname); - if (!child) { -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - child = d_alloc_parallel(dir, &qname, &wq); - if (IS_ERR(child)) - return false; ---- a/include/linux/dcache.h -+++ b/include/linux/dcache.h -@@ -107,7 +107,7 @@ struct dentry { - - union { - struct list_head d_lru; /* LRU list */ -- wait_queue_head_t *d_wait; /* in-lookup ones only */ -+ struct swait_queue_head *d_wait; /* in-lookup ones only */ - }; - struct list_head d_child; /* child of parent list */ - struct list_head d_subdirs; /* our children */ -@@ -239,7 +239,7 @@ extern void d_set_d_op(struct dentry *de - extern struct dentry * d_alloc(struct dentry *, const struct qstr *); - extern struct dentry * d_alloc_anon(struct super_block *); - extern struct dentry * d_alloc_parallel(struct dentry *, const struct qstr *, -- wait_queue_head_t *); -+ struct swait_queue_head *); - extern struct dentry * d_splice_alias(struct inode *, struct dentry *); - extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *); - extern struct dentry * d_exact_alias(struct dentry *, struct inode *); ---- a/include/linux/nfs_xdr.h -+++ b/include/linux/nfs_xdr.h -@@ -1684,7 +1684,7 @@ struct nfs_unlinkdata { - struct nfs_removeargs args; - struct nfs_removeres res; - struct dentry *dentry; -- wait_queue_head_t wq; -+ struct swait_queue_head wq; - const struct cred *cred; - struct nfs_fattr dir_attr; - long timeout; ---- a/kernel/sched/swait.c -+++ b/kernel/sched/swait.c -@@ -64,6 +64,7 @@ void swake_up_all(struct swait_queue_hea - struct swait_queue *curr; - LIST_HEAD(tmp); - -+ WARN_ON(irqs_disabled()); - raw_spin_lock_irq(&q->lock); - list_splice_init(&q->task_list, &tmp); - while (!list_empty(&tmp)) { diff --git a/kernel/patches-5.11.x-rt/0106-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch b/kernel/patches-5.11.x-rt/0106-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch deleted file mode 100644 index c1e2d6122e..0000000000 --- a/kernel/patches-5.11.x-rt/0106-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch +++ /dev/null @@ -1,87 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 20 Oct 2017 11:29:53 +0200 -Subject: [PATCH] fs/dcache: disable preemption on i_dir_seq's write side - -i_dir_seq is an opencoded seqcounter. Based on the code it looks like we -could have two writers in parallel despite the fact that the d_lock is -held. The problem is that during the write process on RT the preemption -is still enabled and if this process is interrupted by a reader with RT -priority then we lock up. -To avoid that lock up I am disabling the preemption during the update. -The rename of i_dir_seq is here to ensure to catch new write sides in -future. - -Cc: stable-rt@vger.kernel.org -Reported-by: Oleg.Karfich@wago.com -Signed-off-by: Sebastian Andrzej Siewior ---- - fs/dcache.c | 12 +++++++----- - fs/inode.c | 2 +- - include/linux/fs.h | 2 +- - 3 files changed, 9 insertions(+), 7 deletions(-) - ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -2510,9 +2510,10 @@ EXPORT_SYMBOL(d_rehash); - static inline unsigned start_dir_add(struct inode *dir) - { - -+ preempt_disable_rt(); - for (;;) { -- unsigned n = dir->i_dir_seq; -- if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) -+ unsigned n = dir->__i_dir_seq; -+ if (!(n & 1) && cmpxchg(&dir->__i_dir_seq, n, n + 1) == n) - return n; - cpu_relax(); - } -@@ -2520,7 +2521,8 @@ static inline unsigned start_dir_add(str - - static inline void end_dir_add(struct inode *dir, unsigned n) - { -- smp_store_release(&dir->i_dir_seq, n + 2); -+ smp_store_release(&dir->__i_dir_seq, n + 2); -+ preempt_enable_rt(); - } - - static void d_wait_lookup(struct dentry *dentry) -@@ -2556,7 +2558,7 @@ struct dentry *d_alloc_parallel(struct d - - retry: - rcu_read_lock(); -- seq = smp_load_acquire(&parent->d_inode->i_dir_seq); -+ seq = smp_load_acquire(&parent->d_inode->__i_dir_seq); - r_seq = read_seqbegin(&rename_lock); - dentry = __d_lookup_rcu(parent, name, &d_seq); - if (unlikely(dentry)) { -@@ -2584,7 +2586,7 @@ struct dentry *d_alloc_parallel(struct d - } - - hlist_bl_lock(b); -- if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) { -+ if (unlikely(READ_ONCE(parent->d_inode->__i_dir_seq) != seq)) { - hlist_bl_unlock(b); - rcu_read_unlock(); - goto retry; ---- a/fs/inode.c -+++ b/fs/inode.c -@@ -157,7 +157,7 @@ int inode_init_always(struct super_block - inode->i_pipe = NULL; - inode->i_cdev = NULL; - inode->i_link = NULL; -- inode->i_dir_seq = 0; -+ inode->__i_dir_seq = 0; - inode->i_rdev = 0; - inode->dirtied_when = 0; - ---- a/include/linux/fs.h -+++ b/include/linux/fs.h -@@ -698,7 +698,7 @@ struct inode { - struct pipe_inode_info *i_pipe; - struct cdev *i_cdev; - char *i_link; -- unsigned i_dir_seq; -+ unsigned __i_dir_seq; - }; - - __u32 i_generation; diff --git a/kernel/patches-5.11.x-rt/0107-net-Qdisc-use-a-seqlock-instead-seqcount.patch b/kernel/patches-5.11.x-rt/0107-net-Qdisc-use-a-seqlock-instead-seqcount.patch deleted file mode 100644 index 77172ce8a8..0000000000 --- a/kernel/patches-5.11.x-rt/0107-net-Qdisc-use-a-seqlock-instead-seqcount.patch +++ /dev/null @@ -1,279 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 14 Sep 2016 17:36:35 +0200 -Subject: [PATCH] net/Qdisc: use a seqlock instead seqcount - -The seqcount disables preemption on -RT while it is held which can't -remove. Also we don't want the reader to spin for ages if the writer is -scheduled out. The seqlock on the other hand will serialize / sleep on -the lock while writer is active. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/net/gen_stats.h | 11 ++++++----- - include/net/net_seq_lock.h | 24 ++++++++++++++++++++++++ - include/net/sch_generic.h | 19 +++++++++++++++++-- - net/core/gen_estimator.c | 6 +++--- - net/core/gen_stats.c | 12 ++++++------ - net/sched/sch_api.c | 2 +- - net/sched/sch_generic.c | 10 ++++++++++ - 7 files changed, 67 insertions(+), 17 deletions(-) - create mode 100644 include/net/net_seq_lock.h - ---- a/include/net/gen_stats.h -+++ b/include/net/gen_stats.h -@@ -6,6 +6,7 @@ - #include - #include - #include -+#include - - /* Note: this used to be in include/uapi/linux/gen_stats.h */ - struct gnet_stats_basic_packed { -@@ -42,15 +43,15 @@ int gnet_stats_start_copy_compat(struct - spinlock_t *lock, struct gnet_dump *d, - int padattr); - --int gnet_stats_copy_basic(const seqcount_t *running, -+int gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_dump *d, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b); --void __gnet_stats_copy_basic(const seqcount_t *running, -+void __gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b); --int gnet_stats_copy_basic_hw(const seqcount_t *running, -+int gnet_stats_copy_basic_hw(net_seqlock_t *running, - struct gnet_dump *d, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b); -@@ -70,13 +71,13 @@ int gen_new_estimator(struct gnet_stats_ - struct gnet_stats_basic_cpu __percpu *cpu_bstats, - struct net_rate_estimator __rcu **rate_est, - spinlock_t *lock, -- seqcount_t *running, struct nlattr *opt); -+ net_seqlock_t *running, struct nlattr *opt); - void gen_kill_estimator(struct net_rate_estimator __rcu **ptr); - int gen_replace_estimator(struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu_bstats, - struct net_rate_estimator __rcu **ptr, - spinlock_t *lock, -- seqcount_t *running, struct nlattr *opt); -+ net_seqlock_t *running, struct nlattr *opt); - bool gen_estimator_active(struct net_rate_estimator __rcu **ptr); - bool gen_estimator_read(struct net_rate_estimator __rcu **ptr, - struct gnet_stats_rate_est64 *sample); ---- /dev/null -+++ b/include/net/net_seq_lock.h -@@ -0,0 +1,24 @@ -+#ifndef __NET_NET_SEQ_LOCK_H__ -+#define __NET_NET_SEQ_LOCK_H__ -+ -+#ifdef CONFIG_PREEMPT_RT -+# define net_seqlock_t seqlock_t -+# define net_seq_begin(__r) read_seqbegin(__r) -+# define net_seq_retry(__r, __s) read_seqretry(__r, __s) -+ -+static inline int try_write_seqlock(seqlock_t *sl) -+{ -+ if (spin_trylock(&sl->lock)) { -+ write_seqcount_begin(&sl->seqcount); -+ return 1; -+ } -+ return 0; -+} -+ -+#else -+# define net_seqlock_t seqcount_t -+# define net_seq_begin(__r) read_seqcount_begin(__r) -+# define net_seq_retry(__r, __s) read_seqcount_retry(__r, __s) -+#endif -+ -+#endif ---- a/include/net/sch_generic.h -+++ b/include/net/sch_generic.h -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -100,7 +101,7 @@ struct Qdisc { - struct sk_buff_head gso_skb ____cacheline_aligned_in_smp; - struct qdisc_skb_head q; - struct gnet_stats_basic_packed bstats; -- seqcount_t running; -+ net_seqlock_t running; - struct gnet_stats_queue qstats; - unsigned long state; - struct Qdisc *next_sched; -@@ -141,7 +142,11 @@ static inline bool qdisc_is_running(stru - { - if (qdisc->flags & TCQ_F_NOLOCK) - return spin_is_locked(&qdisc->seqlock); -+#ifdef CONFIG_PREEMPT_RT -+ return spin_is_locked(&qdisc->running.lock) ? true : false; -+#else - return (raw_read_seqcount(&qdisc->running) & 1) ? true : false; -+#endif - } - - static inline bool qdisc_is_percpu_stats(const struct Qdisc *q) -@@ -165,17 +170,27 @@ static inline bool qdisc_run_begin(struc - } else if (qdisc_is_running(qdisc)) { - return false; - } -+#ifdef CONFIG_PREEMPT_RT -+ if (try_write_seqlock(&qdisc->running)) -+ return true; -+ return false; -+#else - /* Variant of write_seqcount_begin() telling lockdep a trylock - * was attempted. - */ - raw_write_seqcount_begin(&qdisc->running); - seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_); - return true; -+#endif - } - - static inline void qdisc_run_end(struct Qdisc *qdisc) - { -+#ifdef CONFIG_PREEMPT_RT -+ write_sequnlock(&qdisc->running); -+#else - write_seqcount_end(&qdisc->running); -+#endif - if (qdisc->flags & TCQ_F_NOLOCK) - spin_unlock(&qdisc->seqlock); - } -@@ -538,7 +553,7 @@ static inline spinlock_t *qdisc_root_sle - return qdisc_lock(root); - } - --static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) -+static inline net_seqlock_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) - { - struct Qdisc *root = qdisc_root_sleeping(qdisc); - ---- a/net/core/gen_estimator.c -+++ b/net/core/gen_estimator.c -@@ -42,7 +42,7 @@ - struct net_rate_estimator { - struct gnet_stats_basic_packed *bstats; - spinlock_t *stats_lock; -- seqcount_t *running; -+ net_seqlock_t *running; - struct gnet_stats_basic_cpu __percpu *cpu_bstats; - u8 ewma_log; - u8 intvl_log; /* period : (250ms << intvl_log) */ -@@ -125,7 +125,7 @@ int gen_new_estimator(struct gnet_stats_ - struct gnet_stats_basic_cpu __percpu *cpu_bstats, - struct net_rate_estimator __rcu **rate_est, - spinlock_t *lock, -- seqcount_t *running, -+ net_seqlock_t *running, - struct nlattr *opt) - { - struct gnet_estimator *parm = nla_data(opt); -@@ -226,7 +226,7 @@ int gen_replace_estimator(struct gnet_st - struct gnet_stats_basic_cpu __percpu *cpu_bstats, - struct net_rate_estimator __rcu **rate_est, - spinlock_t *lock, -- seqcount_t *running, struct nlattr *opt) -+ net_seqlock_t *running, struct nlattr *opt) - { - return gen_new_estimator(bstats, cpu_bstats, rate_est, - lock, running, opt); ---- a/net/core/gen_stats.c -+++ b/net/core/gen_stats.c -@@ -137,7 +137,7 @@ static void - } - - void --__gnet_stats_copy_basic(const seqcount_t *running, -+__gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b) -@@ -150,15 +150,15 @@ void - } - do { - if (running) -- seq = read_seqcount_begin(running); -+ seq = net_seq_begin(running); - bstats->bytes = b->bytes; - bstats->packets = b->packets; -- } while (running && read_seqcount_retry(running, seq)); -+ } while (running && net_seq_retry(running, seq)); - } - EXPORT_SYMBOL(__gnet_stats_copy_basic); - - static int --___gnet_stats_copy_basic(const seqcount_t *running, -+___gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_dump *d, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b, -@@ -204,7 +204,7 @@ static int - * if the room in the socket buffer was not sufficient. - */ - int --gnet_stats_copy_basic(const seqcount_t *running, -+gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_dump *d, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b) -@@ -228,7 +228,7 @@ EXPORT_SYMBOL(gnet_stats_copy_basic); - * if the room in the socket buffer was not sufficient. - */ - int --gnet_stats_copy_basic_hw(const seqcount_t *running, -+gnet_stats_copy_basic_hw(net_seqlock_t *running, - struct gnet_dump *d, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b) ---- a/net/sched/sch_api.c -+++ b/net/sched/sch_api.c -@@ -1258,7 +1258,7 @@ static struct Qdisc *qdisc_create(struct - rcu_assign_pointer(sch->stab, stab); - } - if (tca[TCA_RATE]) { -- seqcount_t *running; -+ net_seqlock_t *running; - - err = -EOPNOTSUPP; - if (sch->flags & TCQ_F_MQROOT) { ---- a/net/sched/sch_generic.c -+++ b/net/sched/sch_generic.c -@@ -553,7 +553,11 @@ struct Qdisc noop_qdisc = { - .ops = &noop_qdisc_ops, - .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), - .dev_queue = &noop_netdev_queue, -+#ifdef CONFIG_PREEMPT_RT -+ .running = __SEQLOCK_UNLOCKED(noop_qdisc.running), -+#else - .running = SEQCNT_ZERO(noop_qdisc.running), -+#endif - .busylock = __SPIN_LOCK_UNLOCKED(noop_qdisc.busylock), - .gso_skb = { - .next = (struct sk_buff *)&noop_qdisc.gso_skb, -@@ -845,9 +849,15 @@ struct Qdisc *qdisc_alloc(struct netdev_ - lockdep_set_class(&sch->busylock, - dev->qdisc_tx_busylock ?: &qdisc_tx_busylock); - -+#ifdef CONFIG_PREEMPT_RT -+ seqlock_init(&sch->running); -+ lockdep_set_class(&sch->running.lock, -+ dev->qdisc_running_key ?: &qdisc_running_key); -+#else - seqcount_init(&sch->running); - lockdep_set_class(&sch->running, - dev->qdisc_running_key ?: &qdisc_running_key); -+#endif - - sch->ops = ops; - sch->flags = ops->static_flags; diff --git a/kernel/patches-5.11.x-rt/0108-net-Properly-annotate-the-try-lock-for-the-seqlock.patch b/kernel/patches-5.11.x-rt/0108-net-Properly-annotate-the-try-lock-for-the-seqlock.patch deleted file mode 100644 index 1a0afd2b83..0000000000 --- a/kernel/patches-5.11.x-rt/0108-net-Properly-annotate-the-try-lock-for-the-seqlock.patch +++ /dev/null @@ -1,61 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 8 Sep 2020 16:57:11 +0200 -Subject: [PATCH] net: Properly annotate the try-lock for the seqlock - -In patch - ("net/Qdisc: use a seqlock instead seqcount") - -the seqcount has been replaced with a seqlock to allow to reader to -boost the preempted writer. -The try_write_seqlock() acquired the lock with a try-lock but the -seqcount annotation was "lock". - -Opencode write_seqcount_t_begin() and use the try-lock annotation for -lockdep. - -Reported-by: Mike Galbraith -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - include/net/net_seq_lock.h | 9 --------- - include/net/sch_generic.h | 10 +++++++++- - 2 files changed, 9 insertions(+), 10 deletions(-) - ---- a/include/net/net_seq_lock.h -+++ b/include/net/net_seq_lock.h -@@ -6,15 +6,6 @@ - # define net_seq_begin(__r) read_seqbegin(__r) - # define net_seq_retry(__r, __s) read_seqretry(__r, __s) - --static inline int try_write_seqlock(seqlock_t *sl) --{ -- if (spin_trylock(&sl->lock)) { -- write_seqcount_begin(&sl->seqcount); -- return 1; -- } -- return 0; --} -- - #else - # define net_seqlock_t seqcount_t - # define net_seq_begin(__r) read_seqcount_begin(__r) ---- a/include/net/sch_generic.h -+++ b/include/net/sch_generic.h -@@ -171,8 +171,16 @@ static inline bool qdisc_run_begin(struc - return false; - } - #ifdef CONFIG_PREEMPT_RT -- if (try_write_seqlock(&qdisc->running)) -+ if (spin_trylock(&qdisc->running.lock)) { -+ seqcount_t *s = &qdisc->running.seqcount.seqcount; -+ /* -+ * Variant of write_seqcount_t_begin() telling lockdep that a -+ * trylock was attempted. -+ */ -+ do_raw_write_seqcount_begin(s); -+ seqcount_acquire(&s->dep_map, 0, 1, _RET_IP_); - return true; -+ } - return false; - #else - /* Variant of write_seqcount_begin() telling lockdep a trylock diff --git a/kernel/patches-5.11.x-rt/0109-kconfig-disable-a-few-options-rt.patch b/kernel/patches-5.11.x-rt/0109-kconfig-disable-a-few-options-rt.patch deleted file mode 100644 index 0b34219d5d..0000000000 --- a/kernel/patches-5.11.x-rt/0109-kconfig-disable-a-few-options-rt.patch +++ /dev/null @@ -1,33 +0,0 @@ -Subject: kconfig: Disable config options which are not RT compatible -From: Thomas Gleixner -Date: Sun, 24 Jul 2011 12:11:43 +0200 - -Disable stuff which is known to have issues on RT - -Signed-off-by: Thomas Gleixner ---- - arch/Kconfig | 1 + - mm/Kconfig | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - ---- a/arch/Kconfig -+++ b/arch/Kconfig -@@ -37,6 +37,7 @@ config OPROFILE - tristate "OProfile system profiling" - depends on PROFILING - depends on HAVE_OPROFILE -+ depends on !PREEMPT_RT - select RING_BUFFER - select RING_BUFFER_ALLOW_SWAP - help ---- a/mm/Kconfig -+++ b/mm/Kconfig -@@ -387,7 +387,7 @@ config NOMMU_INITIAL_TRIM_EXCESS - - config TRANSPARENT_HUGEPAGE - bool "Transparent Hugepage Support" -- depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE -+ depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE && !PREEMPT_RT - select COMPACTION - select XARRAY_MULTI - help diff --git a/kernel/patches-5.11.x-rt/0110-mm-disable-sloub-rt.patch b/kernel/patches-5.11.x-rt/0110-mm-disable-sloub-rt.patch deleted file mode 100644 index 4eb445af3c..0000000000 --- a/kernel/patches-5.11.x-rt/0110-mm-disable-sloub-rt.patch +++ /dev/null @@ -1,40 +0,0 @@ -From: Ingo Molnar -Date: Fri, 3 Jul 2009 08:44:03 -0500 -Subject: mm: Allow only SLUB on RT - -Memory allocation disables interrupts as part of the allocation and freeing -process. For -RT it is important that this section remain short and don't -depend on the size of the request or an internal state of the memory allocator. -At the beginning the SLAB memory allocator was adopted for RT's needs and it -required substantial changes. Later, with the addition of the SLUB memory -allocator we adopted this one as well and the changes were smaller. More -important, due to the design of the SLUB allocator it performs better and its -worst case latency was smaller. In the end only SLUB remained supported. - -Disable SLAB and SLOB on -RT. Only SLUB is adopted to -RT needs. - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - init/Kconfig | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1895,6 +1895,7 @@ choice - - config SLAB - bool "SLAB" -+ depends on !PREEMPT_RT - select HAVE_HARDENED_USERCOPY_ALLOCATOR - help - The regular slab allocator that is established and known to work -@@ -1915,6 +1916,7 @@ config SLUB - config SLOB - depends on EXPERT - bool "SLOB (Simple Allocator)" -+ depends on !PREEMPT_RT - help - SLOB replaces the stock allocator with a drastically simpler - allocator. SLOB is generally more space efficient but diff --git a/kernel/patches-5.11.x-rt/0111-sched-disable-rt-group-sched-on-rt.patch b/kernel/patches-5.11.x-rt/0111-sched-disable-rt-group-sched-on-rt.patch deleted file mode 100644 index f0121fca6d..0000000000 --- a/kernel/patches-5.11.x-rt/0111-sched-disable-rt-group-sched-on-rt.patch +++ /dev/null @@ -1,28 +0,0 @@ -Subject: sched: Disable CONFIG_RT_GROUP_SCHED on RT -From: Thomas Gleixner -Date: Mon, 18 Jul 2011 17:03:52 +0200 - -Carsten reported problems when running: - - taskset 01 chrt -f 1 sleep 1 - -from within rc.local on a F15 machine. The task stays running and -never gets on the run queue because some of the run queues have -rt_throttled=1 which does not go away. Works nice from a ssh login -shell. Disabling CONFIG_RT_GROUP_SCHED solves that as well. - -Signed-off-by: Thomas Gleixner ---- - init/Kconfig | 1 + - 1 file changed, 1 insertion(+) - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -968,6 +968,7 @@ config CFS_BANDWIDTH - config RT_GROUP_SCHED - bool "Group scheduling for SCHED_RR/FIFO" - depends on CGROUP_SCHED -+ depends on !PREEMPT_RT - default n - help - This feature lets you explicitly allocate real CPU bandwidth diff --git a/kernel/patches-5.11.x-rt/0112-net_disable_NET_RX_BUSY_POLL.patch b/kernel/patches-5.11.x-rt/0112-net_disable_NET_RX_BUSY_POLL.patch deleted file mode 100644 index 1b52d019f5..0000000000 --- a/kernel/patches-5.11.x-rt/0112-net_disable_NET_RX_BUSY_POLL.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Sat, 27 May 2017 19:02:06 +0200 -Subject: net/core: disable NET_RX_BUSY_POLL on RT - -napi_busy_loop() disables preemption and performs a NAPI poll. We can't acquire -sleeping locks with disabled preemption so we would have to work around this -and add explicit locking for synchronisation against ksoftirqd. -Without explicit synchronisation a low priority process would "own" the NAPI -state (by setting NAPIF_STATE_SCHED) and could be scheduled out (no -preempt_disable() and BH is preemptible on RT). -In case a network packages arrives then the interrupt handler would set -NAPIF_STATE_MISSED and the system would wait until the task owning the NAPI -would be scheduled in again. -Should a task with RT priority busy poll then it would consume the CPU instead -allowing tasks with lower priority to run. - -The NET_RX_BUSY_POLL is disabled by default (the system wide sysctls for -poll/read are set to zero) so disable NET_RX_BUSY_POLL on RT to avoid wrong -locking context on RT. Should this feature be considered useful on RT systems -then it could be enabled again with proper locking and synchronisation. - -Signed-off-by: Sebastian Andrzej Siewior ---- - net/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/net/Kconfig -+++ b/net/Kconfig -@@ -282,7 +282,7 @@ config CGROUP_NET_CLASSID - - config NET_RX_BUSY_POLL - bool -- default y -+ default y if !PREEMPT_RT - - config BQL - bool diff --git a/kernel/patches-5.11.x-rt/0113-efi-Disable-runtime-services-on-RT.patch b/kernel/patches-5.11.x-rt/0113-efi-Disable-runtime-services-on-RT.patch deleted file mode 100644 index 2eecd1a8d5..0000000000 --- a/kernel/patches-5.11.x-rt/0113-efi-Disable-runtime-services-on-RT.patch +++ /dev/null @@ -1,39 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 26 Jul 2018 15:03:16 +0200 -Subject: [PATCH] efi: Disable runtime services on RT - -Based on meassurements the EFI functions get_variable / -get_next_variable take up to 2us which looks okay. -The functions get_time, set_time take around 10ms. Those 10ms are too -much. Even one ms would be too much. -Ard mentioned that SetVariable might even trigger larger latencies if -the firware will erase flash blocks on NOR. - -The time-functions are used by efi-rtc and can be triggered during -runtimed (either via explicit read/write or ntp sync). - -The variable write could be used by pstore. -These functions can be disabled without much of a loss. The poweroff / -reboot hooks may be provided by PSCI. - -Disable EFI's runtime wrappers. - -This was observed on "EFI v2.60 by SoftIron Overdrive 1000". - -Acked-by: Ard Biesheuvel -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/firmware/efi/efi.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/firmware/efi/efi.c -+++ b/drivers/firmware/efi/efi.c -@@ -66,7 +66,7 @@ struct mm_struct efi_mm = { - - struct workqueue_struct *efi_rts_wq; - --static bool disable_runtime; -+static bool disable_runtime = IS_ENABLED(CONFIG_PREEMPT_RT); - static int __init setup_noefi(char *arg) - { - disable_runtime = true; diff --git a/kernel/patches-5.11.x-rt/0114-efi-Allow-efi-runtime.patch b/kernel/patches-5.11.x-rt/0114-efi-Allow-efi-runtime.patch deleted file mode 100644 index 97ac4fdccb..0000000000 --- a/kernel/patches-5.11.x-rt/0114-efi-Allow-efi-runtime.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 26 Jul 2018 15:06:10 +0200 -Subject: [PATCH] efi: Allow efi=runtime - -In case the command line option "efi=noruntime" is default at built-time, the user -could overwrite its state by `efi=runtime' and allow it again. - -Acked-by: Ard Biesheuvel -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/firmware/efi/efi.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/firmware/efi/efi.c -+++ b/drivers/firmware/efi/efi.c -@@ -97,6 +97,9 @@ static int __init parse_efi_cmdline(char - if (parse_option_str(str, "noruntime")) - disable_runtime = true; - -+ if (parse_option_str(str, "runtime")) -+ disable_runtime = false; -+ - if (parse_option_str(str, "nosoftreserve")) - set_bit(EFI_MEM_NO_SOFT_RESERVE, &efi.flags); - diff --git a/kernel/patches-5.11.x-rt/0115-rt-local-irq-lock.patch b/kernel/patches-5.11.x-rt/0115-rt-local-irq-lock.patch deleted file mode 100644 index 5a2744d22b..0000000000 --- a/kernel/patches-5.11.x-rt/0115-rt-local-irq-lock.patch +++ /dev/null @@ -1,199 +0,0 @@ -Subject: rt: Add local irq locks -From: Thomas Gleixner -Date: Mon, 20 Jun 2011 09:03:47 +0200 - -Introduce locallock. For !RT this maps to preempt_disable()/ -local_irq_disable() so there is not much that changes. For RT this will -map to a spinlock. This makes preemption possible and locked "ressource" -gets the lockdep anotation it wouldn't have otherwise. The locks are -recursive for owner == current. Also, all locks user migrate_disable() -which ensures that the task is not migrated to another CPU while the lock -is held and the owner is preempted. - -Signed-off-by: Thomas Gleixner ---- - include/linux/local_lock_internal.h | 126 ++++++++++++++++++++++++++++++++---- - 1 file changed, 113 insertions(+), 13 deletions(-) - ---- a/include/linux/local_lock_internal.h -+++ b/include/linux/local_lock_internal.h -@@ -7,33 +7,90 @@ - #include - - typedef struct { --#ifdef CONFIG_DEBUG_LOCK_ALLOC -+#ifdef CONFIG_PREEMPT_RT -+ spinlock_t lock; -+ struct task_struct *owner; -+ int nestcnt; -+ -+#elif defined(CONFIG_DEBUG_LOCK_ALLOC) - struct lockdep_map dep_map; - struct task_struct *owner; - #endif - } local_lock_t; - --#ifdef CONFIG_DEBUG_LOCK_ALLOC --# define LL_DEP_MAP_INIT(lockname) \ -+#ifdef CONFIG_PREEMPT_RT -+ -+#define INIT_LOCAL_LOCK(lockname) { \ -+ __SPIN_LOCK_UNLOCKED((lockname).lock), \ -+ .owner = NULL, \ -+ .nestcnt = 0, \ -+ } -+#else -+ -+# ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define LL_DEP_MAP_INIT(lockname) \ - .dep_map = { \ - .name = #lockname, \ - .wait_type_inner = LD_WAIT_CONFIG, \ - } --#else --# define LL_DEP_MAP_INIT(lockname) --#endif -+# else -+# define LL_DEP_MAP_INIT(lockname) -+# endif - - #define INIT_LOCAL_LOCK(lockname) { LL_DEP_MAP_INIT(lockname) } - --#define __local_lock_init(lock) \ -+#endif -+ -+#ifdef CONFIG_PREEMPT_RT -+ -+static inline void ___local_lock_init(local_lock_t *l) -+{ -+ l->owner = NULL; -+ l->nestcnt = 0; -+} -+ -+#define __local_lock_init(l) \ -+do { \ -+ spin_lock_init(&(l)->lock); \ -+ ___local_lock_init(l); \ -+} while (0) -+ -+#else -+ -+#define __local_lock_init(l) \ - do { \ - static struct lock_class_key __key; \ - \ -- debug_check_no_locks_freed((void *)lock, sizeof(*lock));\ -- lockdep_init_map_wait(&(lock)->dep_map, #lock, &__key, 0, LD_WAIT_CONFIG);\ -+ debug_check_no_locks_freed((void *)l, sizeof(*l)); \ -+ lockdep_init_map_wait(&(l)->dep_map, #l, &__key, 0, LD_WAIT_CONFIG);\ - } while (0) -+#endif -+ -+#ifdef CONFIG_PREEMPT_RT -+ -+static inline void local_lock_acquire(local_lock_t *l) -+{ -+ if (l->owner != current) { -+ spin_lock(&l->lock); -+ DEBUG_LOCKS_WARN_ON(l->owner); -+ DEBUG_LOCKS_WARN_ON(l->nestcnt); -+ l->owner = current; -+ } -+ l->nestcnt++; -+} -+ -+static inline void local_lock_release(local_lock_t *l) -+{ -+ DEBUG_LOCKS_WARN_ON(l->nestcnt == 0); -+ DEBUG_LOCKS_WARN_ON(l->owner != current); -+ if (--l->nestcnt) -+ return; -+ -+ l->owner = NULL; -+ spin_unlock(&l->lock); -+} - --#ifdef CONFIG_DEBUG_LOCK_ALLOC -+#elif defined(CONFIG_DEBUG_LOCK_ALLOC) - static inline void local_lock_acquire(local_lock_t *l) - { - lock_map_acquire(&l->dep_map); -@@ -53,21 +110,50 @@ static inline void local_lock_acquire(lo - static inline void local_lock_release(local_lock_t *l) { } - #endif /* !CONFIG_DEBUG_LOCK_ALLOC */ - -+#ifdef CONFIG_PREEMPT_RT -+ - #define __local_lock(lock) \ - do { \ -- preempt_disable(); \ -+ migrate_disable(); \ - local_lock_acquire(this_cpu_ptr(lock)); \ - } while (0) - -+#define __local_unlock(lock) \ -+ do { \ -+ local_lock_release(this_cpu_ptr(lock)); \ -+ migrate_enable(); \ -+ } while (0) -+ - #define __local_lock_irq(lock) \ - do { \ -- local_irq_disable(); \ -+ migrate_disable(); \ - local_lock_acquire(this_cpu_ptr(lock)); \ - } while (0) - - #define __local_lock_irqsave(lock, flags) \ - do { \ -- local_irq_save(flags); \ -+ migrate_disable(); \ -+ flags = 0; \ -+ local_lock_acquire(this_cpu_ptr(lock)); \ -+ } while (0) -+ -+#define __local_unlock_irq(lock) \ -+ do { \ -+ local_lock_release(this_cpu_ptr(lock)); \ -+ migrate_enable(); \ -+ } while (0) -+ -+#define __local_unlock_irqrestore(lock, flags) \ -+ do { \ -+ local_lock_release(this_cpu_ptr(lock)); \ -+ migrate_enable(); \ -+ } while (0) -+ -+#else -+ -+#define __local_lock(lock) \ -+ do { \ -+ preempt_disable(); \ - local_lock_acquire(this_cpu_ptr(lock)); \ - } while (0) - -@@ -77,6 +163,18 @@ static inline void local_lock_release(lo - preempt_enable(); \ - } while (0) - -+#define __local_lock_irq(lock) \ -+ do { \ -+ local_irq_disable(); \ -+ local_lock_acquire(this_cpu_ptr(lock)); \ -+ } while (0) -+ -+#define __local_lock_irqsave(lock, flags) \ -+ do { \ -+ local_irq_save(flags); \ -+ local_lock_acquire(this_cpu_ptr(lock)); \ -+ } while (0) -+ - #define __local_unlock_irq(lock) \ - do { \ - local_lock_release(this_cpu_ptr(lock)); \ -@@ -88,3 +186,5 @@ static inline void local_lock_release(lo - local_lock_release(this_cpu_ptr(lock)); \ - local_irq_restore(flags); \ - } while (0) -+ -+#endif diff --git a/kernel/patches-5.11.x-rt/0116-oleg-signal-rt-fix.patch b/kernel/patches-5.11.x-rt/0116-oleg-signal-rt-fix.patch deleted file mode 100644 index 52603af484..0000000000 --- a/kernel/patches-5.11.x-rt/0116-oleg-signal-rt-fix.patch +++ /dev/null @@ -1,129 +0,0 @@ -From: Oleg Nesterov -Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: signal/x86: Delay calling signals in atomic - -On x86_64 we must disable preemption before we enable interrupts -for stack faults, int3 and debugging, because the current task is using -a per CPU debug stack defined by the IST. If we schedule out, another task -can come in and use the same stack and cause the stack to be corrupted -and crash the kernel on return. - -When CONFIG_PREEMPT_RT is enabled, spin_locks become mutexes, and -one of these is the spin lock used in signal handling. - -Some of the debug code (int3) causes do_trap() to send a signal. -This function calls a spin lock that has been converted to a mutex -and has the possibility to sleep. If this happens, the above issues with -the corrupted stack is possible. - -Instead of calling the signal right away, for PREEMPT_RT and x86_64, -the signal information is stored on the stacks task_struct and -TIF_NOTIFY_RESUME is set. Then on exit of the trap, the signal resume -code will send the signal when preemption is enabled. - -[ rostedt: Switched from #ifdef CONFIG_PREEMPT_RT to - ARCH_RT_DELAYS_SIGNAL_SEND and added comments to the code. ] - - -Signed-off-by: Oleg Nesterov -Signed-off-by: Steven Rostedt -Signed-off-by: Thomas Gleixner -[bigeasy: also needed on 32bit as per Yang Shi ] -Signed-off-by: Sebastian Andrzej Siewior ---- - - arch/x86/include/asm/signal.h | 13 +++++++++++++ - include/linux/sched.h | 4 ++++ - kernel/entry/common.c | 8 ++++++++ - kernel/signal.c | 28 ++++++++++++++++++++++++++++ - 4 files changed, 53 insertions(+) - ---- a/arch/x86/include/asm/signal.h -+++ b/arch/x86/include/asm/signal.h -@@ -28,6 +28,19 @@ typedef struct { - #define SA_IA32_ABI 0x02000000u - #define SA_X32_ABI 0x01000000u - -+/* -+ * Because some traps use the IST stack, we must keep preemption -+ * disabled while calling do_trap(), but do_trap() may call -+ * force_sig_info() which will grab the signal spin_locks for the -+ * task, which in PREEMPT_RT are mutexes. By defining -+ * ARCH_RT_DELAYS_SIGNAL_SEND the force_sig_info() will set -+ * TIF_NOTIFY_RESUME and set up the signal to be sent on exit of the -+ * trap. -+ */ -+#if defined(CONFIG_PREEMPT_RT) -+#define ARCH_RT_DELAYS_SIGNAL_SEND -+#endif -+ - #ifndef CONFIG_COMPAT - typedef sigset_t compat_sigset_t; - #endif ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -994,6 +994,10 @@ struct task_struct { - /* Restored if set_restore_sigmask() was used: */ - sigset_t saved_sigmask; - struct sigpending pending; -+#ifdef CONFIG_PREEMPT_RT -+ /* TODO: move me into ->restart_block ? */ -+ struct kernel_siginfo forced_info; -+#endif - unsigned long sas_ss_sp; - size_t sas_ss_size; - unsigned int sas_ss_flags; ---- a/kernel/entry/common.c -+++ b/kernel/entry/common.c -@@ -161,6 +161,14 @@ static unsigned long exit_to_user_mode_l - if (ti_work & _TIF_NEED_RESCHED) - schedule(); - -+#ifdef ARCH_RT_DELAYS_SIGNAL_SEND -+ if (unlikely(current->forced_info.si_signo)) { -+ struct task_struct *t = current; -+ force_sig_info(&t->forced_info); -+ t->forced_info.si_signo = 0; -+ } -+#endif -+ - if (ti_work & _TIF_UPROBE) - uprobe_notify_resume(regs); - ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -1314,6 +1314,34 @@ force_sig_info_to_task(struct kernel_sig - struct k_sigaction *action; - int sig = info->si_signo; - -+ /* -+ * On some archs, PREEMPT_RT has to delay sending a signal from a trap -+ * since it can not enable preemption, and the signal code's spin_locks -+ * turn into mutexes. Instead, it must set TIF_NOTIFY_RESUME which will -+ * send the signal on exit of the trap. -+ */ -+#ifdef ARCH_RT_DELAYS_SIGNAL_SEND -+ if (in_atomic()) { -+ struct task_struct *t = current; -+ -+ if (WARN_ON_ONCE(t->forced_info.si_signo)) -+ return 0; -+ -+ if (is_si_special(info)) { -+ WARN_ON_ONCE(info != SEND_SIG_PRIV); -+ t->forced_info.si_signo = info->si_signo; -+ t->forced_info.si_errno = 0; -+ t->forced_info.si_code = SI_KERNEL; -+ t->forced_info.si_pid = 0; -+ t->forced_info.si_uid = 0; -+ } else { -+ t->forced_info = *info; -+ } -+ -+ set_tsk_thread_flag(t, TIF_NOTIFY_RESUME); -+ return 0; -+ } -+#endif - spin_lock_irqsave(&t->sighand->siglock, flags); - action = &t->sighand->action[sig-1]; - ignored = action->sa.sa_handler == SIG_IGN; diff --git a/kernel/patches-5.11.x-rt/0117-add_cpu_light.patch b/kernel/patches-5.11.x-rt/0117-add_cpu_light.patch deleted file mode 100644 index 83568853c4..0000000000 --- a/kernel/patches-5.11.x-rt/0117-add_cpu_light.patch +++ /dev/null @@ -1,21 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Sat, 27 May 2017 19:02:06 +0200 -Subject: kernel/sched: add {put|get}_cpu_light() - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/smp.h | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/include/linux/smp.h -+++ b/include/linux/smp.h -@@ -238,6 +238,9 @@ static inline int get_boot_cpu_id(void) - #define get_cpu() ({ preempt_disable(); __smp_processor_id(); }) - #define put_cpu() preempt_enable() - -+#define get_cpu_light() ({ migrate_disable(); __smp_processor_id(); }) -+#define put_cpu_light() migrate_enable() -+ - /* - * Callback to arch code if there's nosmp or maxcpus=0 on the - * boot command line: diff --git a/kernel/patches-5.11.x-rt/0118-ftrace-migrate-disable-tracing.patch b/kernel/patches-5.11.x-rt/0118-ftrace-migrate-disable-tracing.patch deleted file mode 100644 index 232d4ee30b..0000000000 --- a/kernel/patches-5.11.x-rt/0118-ftrace-migrate-disable-tracing.patch +++ /dev/null @@ -1,110 +0,0 @@ -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 21:56:42 +0200 -Subject: trace: Add migrate-disabled counter to tracing output - -Signed-off-by: Thomas Gleixner ---- - include/linux/trace_events.h | 2 ++ - kernel/trace/trace.c | 26 +++++++++++++++++++------- - kernel/trace/trace_events.c | 1 + - kernel/trace/trace_output.c | 5 +++++ - 4 files changed, 27 insertions(+), 7 deletions(-) - ---- a/include/linux/trace_events.h -+++ b/include/linux/trace_events.h -@@ -67,6 +67,7 @@ struct trace_entry { - unsigned char flags; - unsigned char preempt_count; - int pid; -+ unsigned char migrate_disable; - }; - - #define TRACE_EVENT_TYPE_MAX \ -@@ -153,6 +154,7 @@ static inline void tracing_generic_entry - unsigned int trace_ctx) - { - entry->preempt_count = trace_ctx & 0xff; -+ entry->migrate_disable = (trace_ctx >> 8) & 0xff; - entry->pid = current->pid; - entry->type = type; - entry->flags = trace_ctx >> 16; ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -2578,6 +2578,15 @@ enum print_line_t trace_handle_return(st - } - EXPORT_SYMBOL_GPL(trace_handle_return); - -+static unsigned short migration_disable_value(void) -+{ -+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT) -+ return current->migration_disabled; -+#else -+ return 0; -+#endif -+} -+ - unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status) - { - unsigned int trace_flags = irqs_status; -@@ -2596,7 +2605,8 @@ unsigned int tracing_gen_ctx_irq_test(un - trace_flags |= TRACE_FLAG_NEED_RESCHED; - if (test_preempt_need_resched()) - trace_flags |= TRACE_FLAG_PREEMPT_RESCHED; -- return (trace_flags << 16) | (pc & 0xff); -+ return (trace_flags << 16) | (pc & 0xff) | -+ (migration_disable_value() & 0xff) << 8; - } - - struct ring_buffer_event * -@@ -3802,9 +3812,10 @@ static void print_lat_help_header(struct - "# | / _----=> need-resched \n" - "# || / _---=> hardirq/softirq \n" - "# ||| / _--=> preempt-depth \n" -- "# |||| / delay \n" -- "# cmd pid ||||| time | caller \n" -- "# \\ / ||||| \\ | / \n"); -+ "# |||| / _-=> migrate-disable \n" -+ "# ||||| / delay \n" -+ "# cmd pid |||||| time | caller \n" -+ "# \\ / |||||| \\ | / \n"); - } - - static void print_event_info(struct array_buffer *buf, struct seq_file *m) -@@ -3842,9 +3853,10 @@ static void print_func_help_header_irq(s - seq_printf(m, "# %.*s / _----=> need-resched\n", prec, space); - seq_printf(m, "# %.*s| / _---=> hardirq/softirq\n", prec, space); - seq_printf(m, "# %.*s|| / _--=> preempt-depth\n", prec, space); -- seq_printf(m, "# %.*s||| / delay\n", prec, space); -- seq_printf(m, "# TASK-PID %.*s CPU# |||| TIMESTAMP FUNCTION\n", prec, " TGID "); -- seq_printf(m, "# | | %.*s | |||| | |\n", prec, " | "); -+ seq_printf(m, "# %.*s||| / _-=> migrate-disable\n", prec, space); -+ seq_printf(m, "# %.*s|||| / delay\n", prec, space); -+ seq_printf(m, "# TASK-PID %.*s CPU# ||||| TIMESTAMP FUNCTION\n", prec, " TGID "); -+ seq_printf(m, "# | | %.*s | ||||| | |\n", prec, " | "); - } - - void ---- a/kernel/trace/trace_events.c -+++ b/kernel/trace/trace_events.c -@@ -183,6 +183,7 @@ static int trace_define_common_fields(vo - __common_field(unsigned char, flags); - __common_field(unsigned char, preempt_count); - __common_field(int, pid); -+ __common_field(unsigned char, migrate_disable); - - return ret; - } ---- a/kernel/trace/trace_output.c -+++ b/kernel/trace/trace_output.c -@@ -487,6 +487,11 @@ int trace_print_lat_fmt(struct trace_seq - else - trace_seq_putc(s, '.'); - -+ if (entry->migrate_disable) -+ trace_seq_printf(s, "%x", entry->migrate_disable); -+ else -+ trace_seq_putc(s, '.'); -+ - return !trace_seq_has_overflowed(s); - } - diff --git a/kernel/patches-5.11.x-rt/0119-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch b/kernel/patches-5.11.x-rt/0119-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch deleted file mode 100644 index 0993143d32..0000000000 --- a/kernel/patches-5.11.x-rt/0119-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch +++ /dev/null @@ -1,143 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 4 Aug 2017 17:40:42 +0200 -Subject: [PATCH 1/2] locking: don't check for __LINUX_SPINLOCK_TYPES_H on -RT - archs - -Upstream uses arch_spinlock_t within spinlock_t and requests that -spinlock_types.h header file is included first. -On -RT we have the rt_mutex with its raw_lock wait_lock which needs -architectures' spinlock_types.h header file for its definition. However -we need rt_mutex first because it is used to build the spinlock_t so -that check does not work for us. -Therefore I am dropping that check. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/alpha/include/asm/spinlock_types.h | 4 ---- - arch/arm/include/asm/spinlock_types.h | 4 ---- - arch/arm64/include/asm/spinlock_types.h | 4 ---- - arch/hexagon/include/asm/spinlock_types.h | 4 ---- - arch/ia64/include/asm/spinlock_types.h | 4 ---- - arch/powerpc/include/asm/spinlock_types.h | 4 ---- - arch/s390/include/asm/spinlock_types.h | 4 ---- - arch/sh/include/asm/spinlock_types.h | 4 ---- - arch/xtensa/include/asm/spinlock_types.h | 4 ---- - 9 files changed, 36 deletions(-) - ---- a/arch/alpha/include/asm/spinlock_types.h -+++ b/arch/alpha/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef _ALPHA_SPINLOCK_TYPES_H - #define _ALPHA_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int lock; - } arch_spinlock_t; ---- a/arch/arm/include/asm/spinlock_types.h -+++ b/arch/arm/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef __ASM_SPINLOCK_TYPES_H - #define __ASM_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - #define TICKET_SHIFT 16 - - typedef struct { ---- a/arch/arm64/include/asm/spinlock_types.h -+++ b/arch/arm64/include/asm/spinlock_types.h -@@ -5,10 +5,6 @@ - #ifndef __ASM_SPINLOCK_TYPES_H - #define __ASM_SPINLOCK_TYPES_H - --#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__ASM_SPINLOCK_H) --# error "please don't include this file directly" --#endif -- - #include - #include - ---- a/arch/hexagon/include/asm/spinlock_types.h -+++ b/arch/hexagon/include/asm/spinlock_types.h -@@ -8,10 +8,6 @@ - #ifndef _ASM_SPINLOCK_TYPES_H - #define _ASM_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int lock; - } arch_spinlock_t; ---- a/arch/ia64/include/asm/spinlock_types.h -+++ b/arch/ia64/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef _ASM_IA64_SPINLOCK_TYPES_H - #define _ASM_IA64_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int lock; - } arch_spinlock_t; ---- a/arch/powerpc/include/asm/spinlock_types.h -+++ b/arch/powerpc/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef _ASM_POWERPC_SPINLOCK_TYPES_H - #define _ASM_POWERPC_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - #ifdef CONFIG_PPC_QUEUED_SPINLOCKS - #include - #include ---- a/arch/s390/include/asm/spinlock_types.h -+++ b/arch/s390/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef __ASM_SPINLOCK_TYPES_H - #define __ASM_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - int lock; - } __attribute__ ((aligned (4))) arch_spinlock_t; ---- a/arch/sh/include/asm/spinlock_types.h -+++ b/arch/sh/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef __ASM_SH_SPINLOCK_TYPES_H - #define __ASM_SH_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int lock; - } arch_spinlock_t; ---- a/arch/xtensa/include/asm/spinlock_types.h -+++ b/arch/xtensa/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef __ASM_SPINLOCK_TYPES_H - #define __ASM_SPINLOCK_TYPES_H - --#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__ASM_SPINLOCK_H) --# error "please don't include this file directly" --#endif -- - #include - #include - diff --git a/kernel/patches-5.11.x-rt/0120-0001-mm-sl-au-b-Change-list_lock-to-raw_spinlock_t.patch b/kernel/patches-5.11.x-rt/0120-0001-mm-sl-au-b-Change-list_lock-to-raw_spinlock_t.patch deleted file mode 100644 index fbdef8c36f..0000000000 --- a/kernel/patches-5.11.x-rt/0120-0001-mm-sl-au-b-Change-list_lock-to-raw_spinlock_t.patch +++ /dev/null @@ -1,592 +0,0 @@ -From: Thomas Gleixner -Date: Mon, 28 May 2018 15:24:22 +0200 -Subject: [PATCH 1/8] mm: sl[au]b: Change list_lock to raw_spinlock_t - -The list_lock is used with used with IRQs off on PREEMPT_RT. Make it a -raw_spinlock_t otherwise the interrupts won't be disabled on PREEMPT_RT. -The locking rules remain unchanged. -The lock is updated for SLAB and SLUB since both share the same header -file for struct kmem_cache_node defintion. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/slab.c | 90 +++++++++++++++++++++++++++++++------------------------------- - mm/slab.h | 2 - - mm/slub.c | 50 +++++++++++++++++----------------- - 3 files changed, 71 insertions(+), 71 deletions(-) - ---- a/mm/slab.c -+++ b/mm/slab.c -@@ -233,7 +233,7 @@ static void kmem_cache_node_init(struct - parent->shared = NULL; - parent->alien = NULL; - parent->colour_next = 0; -- spin_lock_init(&parent->list_lock); -+ raw_spin_lock_init(&parent->list_lock); - parent->free_objects = 0; - parent->free_touched = 0; - } -@@ -558,9 +558,9 @@ static noinline void cache_free_pfmemall - page_node = page_to_nid(page); - n = get_node(cachep, page_node); - -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - free_block(cachep, &objp, 1, page_node, &list); -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - - slabs_destroy(cachep, &list); - } -@@ -698,7 +698,7 @@ static void __drain_alien_cache(struct k - struct kmem_cache_node *n = get_node(cachep, node); - - if (ac->avail) { -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - /* - * Stuff objects into the remote nodes shared array first. - * That way we could avoid the overhead of putting the objects -@@ -709,7 +709,7 @@ static void __drain_alien_cache(struct k - - free_block(cachep, ac->entry, ac->avail, node, list); - ac->avail = 0; -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - } - } - -@@ -782,9 +782,9 @@ static int __cache_free_alien(struct kme - slabs_destroy(cachep, &list); - } else { - n = get_node(cachep, page_node); -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - free_block(cachep, &objp, 1, page_node, &list); -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - slabs_destroy(cachep, &list); - } - return 1; -@@ -825,10 +825,10 @@ static int init_cache_node(struct kmem_c - */ - n = get_node(cachep, node); - if (n) { -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - n->free_limit = (1 + nr_cpus_node(node)) * cachep->batchcount + - cachep->num; -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - - return 0; - } -@@ -907,7 +907,7 @@ static int setup_kmem_cache_node(struct - goto fail; - - n = get_node(cachep, node); -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - if (n->shared && force_change) { - free_block(cachep, n->shared->entry, - n->shared->avail, node, &list); -@@ -925,7 +925,7 @@ static int setup_kmem_cache_node(struct - new_alien = NULL; - } - -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - slabs_destroy(cachep, &list); - - /* -@@ -964,7 +964,7 @@ static void cpuup_canceled(long cpu) - if (!n) - continue; - -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - - /* Free limit for this kmem_cache_node */ - n->free_limit -= cachep->batchcount; -@@ -975,7 +975,7 @@ static void cpuup_canceled(long cpu) - nc->avail = 0; - - if (!cpumask_empty(mask)) { -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - goto free_slab; - } - -@@ -989,7 +989,7 @@ static void cpuup_canceled(long cpu) - alien = n->alien; - n->alien = NULL; - -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - - kfree(shared); - if (alien) { -@@ -1173,7 +1173,7 @@ static void __init init_list(struct kmem - /* - * Do not assume that spinlocks can be initialized via memcpy: - */ -- spin_lock_init(&ptr->list_lock); -+ raw_spin_lock_init(&ptr->list_lock); - - MAKE_ALL_LISTS(cachep, ptr, nodeid); - cachep->node[nodeid] = ptr; -@@ -1344,11 +1344,11 @@ slab_out_of_memory(struct kmem_cache *ca - for_each_kmem_cache_node(cachep, node, n) { - unsigned long total_slabs, free_slabs, free_objs; - -- spin_lock_irqsave(&n->list_lock, flags); -+ raw_spin_lock_irqsave(&n->list_lock, flags); - total_slabs = n->total_slabs; - free_slabs = n->free_slabs; - free_objs = n->free_objects; -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - - pr_warn(" node %d: slabs: %ld/%ld, objs: %ld/%ld\n", - node, total_slabs - free_slabs, total_slabs, -@@ -2107,7 +2107,7 @@ static void check_spinlock_acquired(stru - { - #ifdef CONFIG_SMP - check_irq_off(); -- assert_spin_locked(&get_node(cachep, numa_mem_id())->list_lock); -+ assert_raw_spin_locked(&get_node(cachep, numa_mem_id())->list_lock); - #endif - } - -@@ -2115,7 +2115,7 @@ static void check_spinlock_acquired_node - { - #ifdef CONFIG_SMP - check_irq_off(); -- assert_spin_locked(&get_node(cachep, node)->list_lock); -+ assert_raw_spin_locked(&get_node(cachep, node)->list_lock); - #endif - } - -@@ -2155,9 +2155,9 @@ static void do_drain(void *arg) - check_irq_off(); - ac = cpu_cache_get(cachep); - n = get_node(cachep, node); -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - free_block(cachep, ac->entry, ac->avail, node, &list); -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - ac->avail = 0; - slabs_destroy(cachep, &list); - } -@@ -2175,9 +2175,9 @@ static void drain_cpu_caches(struct kmem - drain_alien_cache(cachep, n->alien); - - for_each_kmem_cache_node(cachep, node, n) { -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - drain_array_locked(cachep, n->shared, node, true, &list); -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - - slabs_destroy(cachep, &list); - } -@@ -2199,10 +2199,10 @@ static int drain_freelist(struct kmem_ca - nr_freed = 0; - while (nr_freed < tofree && !list_empty(&n->slabs_free)) { - -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - p = n->slabs_free.prev; - if (p == &n->slabs_free) { -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - goto out; - } - -@@ -2215,7 +2215,7 @@ static int drain_freelist(struct kmem_ca - * to the cache. - */ - n->free_objects -= cache->num; -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - slab_destroy(cache, page); - nr_freed++; - } -@@ -2651,7 +2651,7 @@ static void cache_grow_end(struct kmem_c - INIT_LIST_HEAD(&page->slab_list); - n = get_node(cachep, page_to_nid(page)); - -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - n->total_slabs++; - if (!page->active) { - list_add_tail(&page->slab_list, &n->slabs_free); -@@ -2661,7 +2661,7 @@ static void cache_grow_end(struct kmem_c - - STATS_INC_GROWN(cachep); - n->free_objects += cachep->num - page->active; -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - - fixup_objfreelist_debug(cachep, &list); - } -@@ -2827,7 +2827,7 @@ static struct page *get_first_slab(struc - { - struct page *page; - -- assert_spin_locked(&n->list_lock); -+ assert_raw_spin_locked(&n->list_lock); - page = list_first_entry_or_null(&n->slabs_partial, struct page, - slab_list); - if (!page) { -@@ -2854,10 +2854,10 @@ static noinline void *cache_alloc_pfmema - if (!gfp_pfmemalloc_allowed(flags)) - return NULL; - -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - page = get_first_slab(n, true); - if (!page) { -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - return NULL; - } - -@@ -2866,7 +2866,7 @@ static noinline void *cache_alloc_pfmema - - fixup_slab_list(cachep, n, page, &list); - -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - fixup_objfreelist_debug(cachep, &list); - - return obj; -@@ -2925,7 +2925,7 @@ static void *cache_alloc_refill(struct k - if (!n->free_objects && (!shared || !shared->avail)) - goto direct_grow; - -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - shared = READ_ONCE(n->shared); - - /* See if we can refill from the shared array */ -@@ -2949,7 +2949,7 @@ static void *cache_alloc_refill(struct k - must_grow: - n->free_objects -= ac->avail; - alloc_done: -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - fixup_objfreelist_debug(cachep, &list); - - direct_grow: -@@ -3174,7 +3174,7 @@ static void *____cache_alloc_node(struct - BUG_ON(!n); - - check_irq_off(); -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - page = get_first_slab(n, false); - if (!page) - goto must_grow; -@@ -3192,12 +3192,12 @@ static void *____cache_alloc_node(struct - - fixup_slab_list(cachep, n, page, &list); - -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - fixup_objfreelist_debug(cachep, &list); - return obj; - - must_grow: -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - page = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid); - if (page) { - /* This slab isn't counted yet so don't update free_objects */ -@@ -3375,7 +3375,7 @@ static void cache_flusharray(struct kmem - - check_irq_off(); - n = get_node(cachep, node); -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - if (n->shared) { - struct array_cache *shared_array = n->shared; - int max = shared_array->limit - shared_array->avail; -@@ -3404,7 +3404,7 @@ static void cache_flusharray(struct kmem - STATS_SET_FREEABLE(cachep, i); - } - #endif -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - ac->avail -= batchcount; - memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail); - slabs_destroy(cachep, &list); -@@ -3834,9 +3834,9 @@ static int do_tune_cpucache(struct kmem_ - - node = cpu_to_mem(cpu); - n = get_node(cachep, node); -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - free_block(cachep, ac->entry, ac->avail, node, &list); -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - slabs_destroy(cachep, &list); - } - free_percpu(prev); -@@ -3931,9 +3931,9 @@ static void drain_array(struct kmem_cach - return; - } - -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - drain_array_locked(cachep, ac, node, false, &list); -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - - slabs_destroy(cachep, &list); - } -@@ -4017,7 +4017,7 @@ void get_slabinfo(struct kmem_cache *cac - - for_each_kmem_cache_node(cachep, node, n) { - check_irq_on(); -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - - total_slabs += n->total_slabs; - free_slabs += n->free_slabs; -@@ -4026,7 +4026,7 @@ void get_slabinfo(struct kmem_cache *cac - if (n->shared) - shared_avail += n->shared->avail; - -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - } - num_objs = total_slabs * cachep->num; - active_slabs = total_slabs - free_slabs; ---- a/mm/slab.h -+++ b/mm/slab.h -@@ -523,7 +523,7 @@ static inline void slab_post_alloc_hook( - * The slab lists for all objects. - */ - struct kmem_cache_node { -- spinlock_t list_lock; -+ raw_spinlock_t list_lock; - - #ifdef CONFIG_SLAB - struct list_head slabs_partial; /* partial list first, better asm code */ ---- a/mm/slub.c -+++ b/mm/slub.c -@@ -1216,7 +1216,7 @@ static noinline int free_debug_processin - unsigned long flags; - int ret = 0; - -- spin_lock_irqsave(&n->list_lock, flags); -+ raw_spin_lock_irqsave(&n->list_lock, flags); - slab_lock(page); - - if (s->flags & SLAB_CONSISTENCY_CHECKS) { -@@ -1251,7 +1251,7 @@ static noinline int free_debug_processin - bulk_cnt, cnt); - - slab_unlock(page); -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - if (!ret) - slab_fix(s, "Object at 0x%p not freed", object); - return ret; -@@ -1964,7 +1964,7 @@ static void *get_partial_node(struct kme - if (!n || !n->nr_partial) - return NULL; - -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - list_for_each_entry_safe(page, page2, &n->partial, slab_list) { - void *t; - -@@ -1989,7 +1989,7 @@ static void *get_partial_node(struct kme - break; - - } -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - return object; - } - -@@ -2243,7 +2243,7 @@ static void deactivate_slab(struct kmem_ - * that acquire_slab() will see a slab page that - * is frozen - */ -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - } - } else { - m = M_FULL; -@@ -2254,7 +2254,7 @@ static void deactivate_slab(struct kmem_ - * slabs from diagnostic functions will not see - * any frozen slabs. - */ -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - } - } - -@@ -2278,7 +2278,7 @@ static void deactivate_slab(struct kmem_ - goto redo; - - if (lock) -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - - if (m == M_PARTIAL) - stat(s, tail); -@@ -2317,10 +2317,10 @@ static void unfreeze_partials(struct kme - n2 = get_node(s, page_to_nid(page)); - if (n != n2) { - if (n) -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - - n = n2; -- spin_lock(&n->list_lock); -+ raw_spin_lock(&n->list_lock); - } - - do { -@@ -2349,7 +2349,7 @@ static void unfreeze_partials(struct kme - } - - if (n) -- spin_unlock(&n->list_lock); -+ raw_spin_unlock(&n->list_lock); - - while (discard_page) { - page = discard_page; -@@ -2516,10 +2516,10 @@ static unsigned long count_partial(struc - unsigned long x = 0; - struct page *page; - -- spin_lock_irqsave(&n->list_lock, flags); -+ raw_spin_lock_irqsave(&n->list_lock, flags); - list_for_each_entry(page, &n->partial, slab_list) - x += get_count(page); -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - return x; - } - #endif /* CONFIG_SLUB_DEBUG || CONFIG_SYSFS */ -@@ -2979,7 +2979,7 @@ static void __slab_free(struct kmem_cach - - do { - if (unlikely(n)) { -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - n = NULL; - } - prior = page->freelist; -@@ -3011,7 +3011,7 @@ static void __slab_free(struct kmem_cach - * Otherwise the list_lock will synchronize with - * other processors updating the list of slabs. - */ -- spin_lock_irqsave(&n->list_lock, flags); -+ raw_spin_lock_irqsave(&n->list_lock, flags); - - } - } -@@ -3053,7 +3053,7 @@ static void __slab_free(struct kmem_cach - add_partial(n, page, DEACTIVATE_TO_TAIL); - stat(s, FREE_ADD_PARTIAL); - } -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - return; - - slab_empty: -@@ -3068,7 +3068,7 @@ static void __slab_free(struct kmem_cach - remove_full(s, n, page); - } - -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - stat(s, FREE_SLAB); - discard_slab(s, page); - } -@@ -3487,7 +3487,7 @@ static void - init_kmem_cache_node(struct kmem_cache_node *n) - { - n->nr_partial = 0; -- spin_lock_init(&n->list_lock); -+ raw_spin_lock_init(&n->list_lock); - INIT_LIST_HEAD(&n->partial); - #ifdef CONFIG_SLUB_DEBUG - atomic_long_set(&n->nr_slabs, 0); -@@ -3888,7 +3888,7 @@ static void free_partial(struct kmem_cac - struct page *page, *h; - - BUG_ON(irqs_disabled()); -- spin_lock_irq(&n->list_lock); -+ raw_spin_lock_irq(&n->list_lock); - list_for_each_entry_safe(page, h, &n->partial, slab_list) { - if (!page->inuse) { - remove_partial(n, page); -@@ -3898,7 +3898,7 @@ static void free_partial(struct kmem_cac - "Objects remaining in %s on __kmem_cache_shutdown()"); - } - } -- spin_unlock_irq(&n->list_lock); -+ raw_spin_unlock_irq(&n->list_lock); - - list_for_each_entry_safe(page, h, &discard, slab_list) - discard_slab(s, page); -@@ -4169,7 +4169,7 @@ int __kmem_cache_shrink(struct kmem_cach - for (i = 0; i < SHRINK_PROMOTE_MAX; i++) - INIT_LIST_HEAD(promote + i); - -- spin_lock_irqsave(&n->list_lock, flags); -+ raw_spin_lock_irqsave(&n->list_lock, flags); - - /* - * Build lists of slabs to discard or promote. -@@ -4200,7 +4200,7 @@ int __kmem_cache_shrink(struct kmem_cach - for (i = SHRINK_PROMOTE_MAX - 1; i >= 0; i--) - list_splice(promote + i, &n->partial); - -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - - /* Release empty slabs */ - list_for_each_entry_safe(page, t, &discard, slab_list) -@@ -4562,7 +4562,7 @@ static int validate_slab_node(struct kme - struct page *page; - unsigned long flags; - -- spin_lock_irqsave(&n->list_lock, flags); -+ raw_spin_lock_irqsave(&n->list_lock, flags); - - list_for_each_entry(page, &n->partial, slab_list) { - validate_slab(s, page); -@@ -4584,7 +4584,7 @@ static int validate_slab_node(struct kme - s->name, count, atomic_long_read(&n->nr_slabs)); - - out: -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - return count; - } - -@@ -4763,12 +4763,12 @@ static int list_locations(struct kmem_ca - if (!atomic_long_read(&n->nr_slabs)) - continue; - -- spin_lock_irqsave(&n->list_lock, flags); -+ raw_spin_lock_irqsave(&n->list_lock, flags); - list_for_each_entry(page, &n->partial, slab_list) - process_slab(&t, s, page, alloc); - list_for_each_entry(page, &n->full, slab_list) - process_slab(&t, s, page, alloc); -- spin_unlock_irqrestore(&n->list_lock, flags); -+ raw_spin_unlock_irqrestore(&n->list_lock, flags); - } - - for (i = 0; i < t.count; i++) { diff --git a/kernel/patches-5.11.x-rt/0121-0002-mm-slub-Make-object_map_lock-a-raw_spinlock_t.patch b/kernel/patches-5.11.x-rt/0121-0002-mm-slub-Make-object_map_lock-a-raw_spinlock_t.patch deleted file mode 100644 index 6f9805aedb..0000000000 --- a/kernel/patches-5.11.x-rt/0121-0002-mm-slub-Make-object_map_lock-a-raw_spinlock_t.patch +++ /dev/null @@ -1,43 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 16 Jul 2020 18:47:50 +0200 -Subject: [PATCH 2/8] mm: slub: Make object_map_lock a raw_spinlock_t - -The variable object_map is protected by object_map_lock. The lock is always -acquired in debug code and within already atomic context - -Make object_map_lock a raw_spinlock_t. - -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/slub.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/mm/slub.c -+++ b/mm/slub.c -@@ -436,7 +436,7 @@ static inline bool cmpxchg_double_slab(s - - #ifdef CONFIG_SLUB_DEBUG - static unsigned long object_map[BITS_TO_LONGS(MAX_OBJS_PER_PAGE)]; --static DEFINE_SPINLOCK(object_map_lock); -+static DEFINE_RAW_SPINLOCK(object_map_lock); - - /* - * Determine a map of object in use on a page. -@@ -452,7 +452,7 @@ static unsigned long *get_map(struct kme - - VM_BUG_ON(!irqs_disabled()); - -- spin_lock(&object_map_lock); -+ raw_spin_lock(&object_map_lock); - - bitmap_zero(object_map, page->objects); - -@@ -465,7 +465,7 @@ static unsigned long *get_map(struct kme - static void put_map(unsigned long *map) __releases(&object_map_lock) - { - VM_BUG_ON(map != object_map); -- spin_unlock(&object_map_lock); -+ raw_spin_unlock(&object_map_lock); - } - - static inline unsigned int size_from_object(struct kmem_cache *s) diff --git a/kernel/patches-5.11.x-rt/0122-0003-mm-slub-Enable-irqs-for-__GFP_WAIT.patch b/kernel/patches-5.11.x-rt/0122-0003-mm-slub-Enable-irqs-for-__GFP_WAIT.patch deleted file mode 100644 index a89e89f128..0000000000 --- a/kernel/patches-5.11.x-rt/0122-0003-mm-slub-Enable-irqs-for-__GFP_WAIT.patch +++ /dev/null @@ -1,70 +0,0 @@ -From: Thomas Gleixner -Date: Wed, 9 Jan 2013 12:08:15 +0100 -Subject: [PATCH 3/8] mm: slub: Enable irqs for __GFP_WAIT - -SYSTEM_RUNNING might be too late for enabling interrupts. Allocations -with GFP_WAIT can happen before that. So use this as an indicator. - -[bigeasy: Add warning on RT for allocations in atomic context. - Don't enable interrupts on allocations during SYSTEM_SUSPEND. This is done - during suspend by ACPI, noticed by Liwei Song -] - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/slub.c | 18 +++++++++++++++++- - 1 file changed, 17 insertions(+), 1 deletion(-) - ---- a/mm/slub.c -+++ b/mm/slub.c -@@ -1739,10 +1739,18 @@ static struct page *allocate_slab(struct - void *start, *p, *next; - int idx; - bool shuffle; -+ bool enableirqs = false; - - flags &= gfp_allowed_mask; - - if (gfpflags_allow_blocking(flags)) -+ enableirqs = true; -+ -+#ifdef CONFIG_PREEMPT_RT -+ if (system_state > SYSTEM_BOOTING && system_state < SYSTEM_SUSPEND) -+ enableirqs = true; -+#endif -+ if (enableirqs) - local_irq_enable(); - - flags |= s->allocflags; -@@ -1803,7 +1811,7 @@ static struct page *allocate_slab(struct - page->frozen = 1; - - out: -- if (gfpflags_allow_blocking(flags)) -+ if (enableirqs) - local_irq_disable(); - if (!page) - return NULL; -@@ -2814,6 +2822,10 @@ static __always_inline void *slab_alloc_ - unsigned long tid; - struct obj_cgroup *objcg = NULL; - -+ if (IS_ENABLED(CONFIG_PREEMPT_RT) && IS_ENABLED(CONFIG_DEBUG_ATOMIC_SLEEP)) -+ WARN_ON_ONCE(!preemptible() && -+ (system_state > SYSTEM_BOOTING && system_state < SYSTEM_SUSPEND)); -+ - s = slab_pre_alloc_hook(s, &objcg, 1, gfpflags); - if (!s) - return NULL; -@@ -3279,6 +3291,10 @@ int kmem_cache_alloc_bulk(struct kmem_ca - int i; - struct obj_cgroup *objcg = NULL; - -+ if (IS_ENABLED(CONFIG_PREEMPT_RT) && IS_ENABLED(CONFIG_DEBUG_ATOMIC_SLEEP)) -+ WARN_ON_ONCE(!preemptible() && -+ (system_state > SYSTEM_BOOTING && system_state < SYSTEM_SUSPEND)); -+ - /* memcg and kmem_cache debug support */ - s = slab_pre_alloc_hook(s, &objcg, size, flags); - if (unlikely(!s)) diff --git a/kernel/patches-5.11.x-rt/0123-0004-mm-slub-Move-discard_slab-invocations-out-of-IRQ-off.patch b/kernel/patches-5.11.x-rt/0123-0004-mm-slub-Move-discard_slab-invocations-out-of-IRQ-off.patch deleted file mode 100644 index bc2aaca0fe..0000000000 --- a/kernel/patches-5.11.x-rt/0123-0004-mm-slub-Move-discard_slab-invocations-out-of-IRQ-off.patch +++ /dev/null @@ -1,410 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 26 Feb 2021 15:14:15 +0100 -Subject: [PATCH 4/8] mm: slub: Move discard_slab() invocations out of IRQ-off - sections - -discard_slab() gives the memory back to the page-allocator. Some of its -invocation occur from IRQ-disabled sections which were disabled by SLUB. -An example is the deactivate_slab() invocation from within -___slab_alloc() or put_cpu_partial(). - -Instead of giving the memory back directly, put the pages on a list and -process it once the caller is out of the known IRQ-off region. - -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/slub.c | 114 ++++++++++++++++++++++++++++++++++++++++++-------------------- - 1 file changed, 78 insertions(+), 36 deletions(-) - ---- a/mm/slub.c -+++ b/mm/slub.c -@@ -1869,12 +1869,29 @@ static void free_slab(struct kmem_cache - __free_slab(s, page); - } - -+static void discard_slab_delayed(struct kmem_cache *s, struct page *page, -+ struct list_head *delayed_free) -+{ -+ dec_slabs_node(s, page_to_nid(page), page->objects); -+ list_add(&page->lru, delayed_free); -+} -+ - static void discard_slab(struct kmem_cache *s, struct page *page) - { - dec_slabs_node(s, page_to_nid(page), page->objects); - free_slab(s, page); - } - -+static void discard_delayed(struct list_head *l) -+{ -+ while (!list_empty(l)) { -+ struct page *page = list_first_entry(l, struct page, lru); -+ -+ list_del(&page->lru); -+ __free_slab(page->slab_cache, page); -+ } -+} -+ - /* - * Management of partially allocated slabs. - */ -@@ -1948,15 +1965,16 @@ static inline void *acquire_slab(struct - WARN_ON(!freelist); - return freelist; - } -- --static void put_cpu_partial(struct kmem_cache *s, struct page *page, int drain); -+static void put_cpu_partial(struct kmem_cache *s, struct page *page, int drain, -+ struct list_head *delayed_free); - static inline bool pfmemalloc_match(struct page *page, gfp_t gfpflags); - - /* - * Try to allocate a partial slab from a specific node. - */ - static void *get_partial_node(struct kmem_cache *s, struct kmem_cache_node *n, -- struct kmem_cache_cpu *c, gfp_t flags) -+ struct kmem_cache_cpu *c, gfp_t flags, -+ struct list_head *delayed_free) - { - struct page *page, *page2; - void *object = NULL; -@@ -1989,7 +2007,7 @@ static void *get_partial_node(struct kme - stat(s, ALLOC_FROM_PARTIAL); - object = t; - } else { -- put_cpu_partial(s, page, 0); -+ put_cpu_partial(s, page, 0, delayed_free); - stat(s, CPU_PARTIAL_NODE); - } - if (!kmem_cache_has_cpu_partial(s) -@@ -2005,7 +2023,8 @@ static void *get_partial_node(struct kme - * Get a page from somewhere. Search in increasing NUMA distances. - */ - static void *get_any_partial(struct kmem_cache *s, gfp_t flags, -- struct kmem_cache_cpu *c) -+ struct kmem_cache_cpu *c, -+ struct list_head *delayed_free) - { - #ifdef CONFIG_NUMA - struct zonelist *zonelist; -@@ -2047,7 +2066,7 @@ static void *get_any_partial(struct kmem - - if (n && cpuset_zone_allowed(zone, flags) && - n->nr_partial > s->min_partial) { -- object = get_partial_node(s, n, c, flags); -+ object = get_partial_node(s, n, c, flags, delayed_free); - if (object) { - /* - * Don't check read_mems_allowed_retry() -@@ -2069,7 +2088,8 @@ static void *get_any_partial(struct kmem - * Get a partial page, lock it and return it. - */ - static void *get_partial(struct kmem_cache *s, gfp_t flags, int node, -- struct kmem_cache_cpu *c) -+ struct kmem_cache_cpu *c, -+ struct list_head *delayed_free) - { - void *object; - int searchnode = node; -@@ -2077,11 +2097,12 @@ static void *get_partial(struct kmem_cac - if (node == NUMA_NO_NODE) - searchnode = numa_mem_id(); - -- object = get_partial_node(s, get_node(s, searchnode), c, flags); -+ object = get_partial_node(s, get_node(s, searchnode), c, flags, -+ delayed_free); - if (object || node != NUMA_NO_NODE) - return object; - -- return get_any_partial(s, flags, c); -+ return get_any_partial(s, flags, c, delayed_free); - } - - #ifdef CONFIG_PREEMPTION -@@ -2157,7 +2178,8 @@ static void init_kmem_cache_cpus(struct - * Remove the cpu slab - */ - static void deactivate_slab(struct kmem_cache *s, struct page *page, -- void *freelist, struct kmem_cache_cpu *c) -+ void *freelist, struct kmem_cache_cpu *c, -+ struct list_head *delayed_free) - { - enum slab_modes { M_NONE, M_PARTIAL, M_FULL, M_FREE }; - struct kmem_cache_node *n = get_node(s, page_to_nid(page)); -@@ -2294,7 +2316,7 @@ static void deactivate_slab(struct kmem_ - stat(s, DEACTIVATE_FULL); - else if (m == M_FREE) { - stat(s, DEACTIVATE_EMPTY); -- discard_slab(s, page); -+ discard_slab_delayed(s, page, delayed_free); - stat(s, FREE_SLAB); - } - -@@ -2309,8 +2331,8 @@ static void deactivate_slab(struct kmem_ - * for the cpu using c (or some other guarantee must be there - * to guarantee no concurrent accesses). - */ --static void unfreeze_partials(struct kmem_cache *s, -- struct kmem_cache_cpu *c) -+static void unfreeze_partials(struct kmem_cache *s, struct kmem_cache_cpu *c, -+ struct list_head *delayed_free) - { - #ifdef CONFIG_SLUB_CPU_PARTIAL - struct kmem_cache_node *n = NULL, *n2 = NULL; -@@ -2364,7 +2386,7 @@ static void unfreeze_partials(struct kme - discard_page = discard_page->next; - - stat(s, DEACTIVATE_EMPTY); -- discard_slab(s, page); -+ discard_slab_delayed(s, page, delayed_free); - stat(s, FREE_SLAB); - } - #endif /* CONFIG_SLUB_CPU_PARTIAL */ -@@ -2377,7 +2399,8 @@ static void unfreeze_partials(struct kme - * If we did not find a slot then simply move all the partials to the - * per node partial list. - */ --static void put_cpu_partial(struct kmem_cache *s, struct page *page, int drain) -+static void put_cpu_partial(struct kmem_cache *s, struct page *page, int drain, -+ struct list_head *delayed_free) - { - #ifdef CONFIG_SLUB_CPU_PARTIAL - struct page *oldpage; -@@ -2400,7 +2423,8 @@ static void put_cpu_partial(struct kmem_ - * set to the per node partial list. - */ - local_irq_save(flags); -- unfreeze_partials(s, this_cpu_ptr(s->cpu_slab)); -+ unfreeze_partials(s, this_cpu_ptr(s->cpu_slab), -+ delayed_free); - local_irq_restore(flags); - oldpage = NULL; - pobjects = 0; -@@ -2422,17 +2446,18 @@ static void put_cpu_partial(struct kmem_ - unsigned long flags; - - local_irq_save(flags); -- unfreeze_partials(s, this_cpu_ptr(s->cpu_slab)); -+ unfreeze_partials(s, this_cpu_ptr(s->cpu_slab), delayed_free); - local_irq_restore(flags); - } - preempt_enable(); - #endif /* CONFIG_SLUB_CPU_PARTIAL */ - } - --static inline void flush_slab(struct kmem_cache *s, struct kmem_cache_cpu *c) -+static inline void flush_slab(struct kmem_cache *s, struct kmem_cache_cpu *c, -+ struct list_head *delayed_free) - { - stat(s, CPUSLAB_FLUSH); -- deactivate_slab(s, c->page, c->freelist, c); -+ deactivate_slab(s, c->page, c->freelist, c, delayed_free); - - c->tid = next_tid(c->tid); - } -@@ -2442,21 +2467,24 @@ static inline void flush_slab(struct kme - * - * Called from IPI handler with interrupts disabled. - */ --static inline void __flush_cpu_slab(struct kmem_cache *s, int cpu) -+static inline void __flush_cpu_slab(struct kmem_cache *s, int cpu, -+ struct list_head *delayed_free) - { - struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu); - - if (c->page) -- flush_slab(s, c); -+ flush_slab(s, c, delayed_free); - -- unfreeze_partials(s, c); -+ unfreeze_partials(s, c, delayed_free); - } - - static void flush_cpu_slab(void *d) - { - struct kmem_cache *s = d; -+ LIST_HEAD(delayed_free); - -- __flush_cpu_slab(s, smp_processor_id()); -+ __flush_cpu_slab(s, smp_processor_id(), &delayed_free); -+ discard_delayed(&delayed_free); - } - - static bool has_cpu_slab(int cpu, void *info) -@@ -2480,13 +2508,15 @@ static int slub_cpu_dead(unsigned int cp - { - struct kmem_cache *s; - unsigned long flags; -+ LIST_HEAD(delayed_free); - - mutex_lock(&slab_mutex); - list_for_each_entry(s, &slab_caches, list) { - local_irq_save(flags); -- __flush_cpu_slab(s, cpu); -+ __flush_cpu_slab(s, cpu, &delayed_free); - local_irq_restore(flags); - } -+ discard_delayed(&delayed_free); - mutex_unlock(&slab_mutex); - return 0; - } -@@ -2570,7 +2600,8 @@ slab_out_of_memory(struct kmem_cache *s, - } - - static inline void *new_slab_objects(struct kmem_cache *s, gfp_t flags, -- int node, struct kmem_cache_cpu **pc) -+ int node, struct kmem_cache_cpu **pc, -+ struct list_head *delayed_free) - { - void *freelist; - struct kmem_cache_cpu *c = *pc; -@@ -2578,7 +2609,7 @@ static inline void *new_slab_objects(str - - WARN_ON_ONCE(s->ctor && (flags & __GFP_ZERO)); - -- freelist = get_partial(s, flags, node, c); -+ freelist = get_partial(s, flags, node, c, delayed_free); - - if (freelist) - return freelist; -@@ -2587,7 +2618,7 @@ static inline void *new_slab_objects(str - if (page) { - c = raw_cpu_ptr(s->cpu_slab); - if (c->page) -- flush_slab(s, c); -+ flush_slab(s, c, delayed_free); - - /* - * No other reference to the page yet so we can -@@ -2666,7 +2697,8 @@ static inline void *get_freelist(struct - * already disabled (which is the case for bulk allocation). - */ - static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, -- unsigned long addr, struct kmem_cache_cpu *c) -+ unsigned long addr, struct kmem_cache_cpu *c, -+ struct list_head *delayed_free) - { - void *freelist; - struct page *page; -@@ -2696,7 +2728,7 @@ static void *___slab_alloc(struct kmem_c - goto redo; - } else { - stat(s, ALLOC_NODE_MISMATCH); -- deactivate_slab(s, page, c->freelist, c); -+ deactivate_slab(s, page, c->freelist, c, delayed_free); - goto new_slab; - } - } -@@ -2707,7 +2739,7 @@ static void *___slab_alloc(struct kmem_c - * information when the page leaves the per-cpu allocator - */ - if (unlikely(!pfmemalloc_match(page, gfpflags))) { -- deactivate_slab(s, page, c->freelist, c); -+ deactivate_slab(s, page, c->freelist, c, delayed_free); - goto new_slab; - } - -@@ -2746,7 +2778,7 @@ static void *___slab_alloc(struct kmem_c - goto redo; - } - -- freelist = new_slab_objects(s, gfpflags, node, &c); -+ freelist = new_slab_objects(s, gfpflags, node, &c, delayed_free); - - if (unlikely(!freelist)) { - slab_out_of_memory(s, gfpflags, node); -@@ -2762,7 +2794,7 @@ static void *___slab_alloc(struct kmem_c - !alloc_debug_processing(s, page, freelist, addr)) - goto new_slab; /* Slab failed checks. Next slab needed */ - -- deactivate_slab(s, page, get_freepointer(s, freelist), c); -+ deactivate_slab(s, page, get_freepointer(s, freelist), c, delayed_free); - return freelist; - } - -@@ -2775,6 +2807,7 @@ static void *__slab_alloc(struct kmem_ca - { - void *p; - unsigned long flags; -+ LIST_HEAD(delayed_free); - - local_irq_save(flags); - #ifdef CONFIG_PREEMPTION -@@ -2786,8 +2819,9 @@ static void *__slab_alloc(struct kmem_ca - c = this_cpu_ptr(s->cpu_slab); - #endif - -- p = ___slab_alloc(s, gfpflags, node, addr, c); -+ p = ___slab_alloc(s, gfpflags, node, addr, c, &delayed_free); - local_irq_restore(flags); -+ discard_delayed(&delayed_free); - return p; - } - -@@ -3042,11 +3076,13 @@ static void __slab_free(struct kmem_cach - */ - stat(s, FREE_FROZEN); - } else if (new.frozen) { -+ LIST_HEAD(delayed_free); - /* - * If we just froze the page then put it onto the - * per cpu partial list. - */ -- put_cpu_partial(s, page, 1); -+ put_cpu_partial(s, page, 1, &delayed_free); -+ discard_delayed(&delayed_free); - stat(s, CPU_PARTIAL_FREE); - } - -@@ -3290,6 +3326,7 @@ int kmem_cache_alloc_bulk(struct kmem_ca - struct kmem_cache_cpu *c; - int i; - struct obj_cgroup *objcg = NULL; -+ LIST_HEAD(delayed_free); - - if (IS_ENABLED(CONFIG_PREEMPT_RT) && IS_ENABLED(CONFIG_DEBUG_ATOMIC_SLEEP)) - WARN_ON_ONCE(!preemptible() && -@@ -3325,7 +3362,7 @@ int kmem_cache_alloc_bulk(struct kmem_ca - * of re-populating per CPU c->freelist - */ - p[i] = ___slab_alloc(s, flags, NUMA_NO_NODE, -- _RET_IP_, c); -+ _RET_IP_, c, &delayed_free); - if (unlikely(!p[i])) - goto error; - -@@ -3341,6 +3378,8 @@ int kmem_cache_alloc_bulk(struct kmem_ca - c->tid = next_tid(c->tid); - local_irq_enable(); - -+ discard_delayed(&delayed_free); -+ - /* Clear memory outside IRQ disabled fastpath loop */ - if (unlikely(slab_want_init_on_alloc(flags, s))) { - int j; -@@ -3354,6 +3393,7 @@ int kmem_cache_alloc_bulk(struct kmem_ca - return i; - error: - local_irq_enable(); -+ discard_delayed(&delayed_free); - slab_post_alloc_hook(s, objcg, flags, i, p); - __kmem_cache_free_bulk(s, i, p); - return 0; -@@ -4363,6 +4403,7 @@ static struct kmem_cache * __init bootst - int node; - struct kmem_cache *s = kmem_cache_zalloc(kmem_cache, GFP_NOWAIT); - struct kmem_cache_node *n; -+ LIST_HEAD(delayed_free); - - memcpy(s, static_cache, kmem_cache->object_size); - -@@ -4371,7 +4412,8 @@ static struct kmem_cache * __init bootst - * up. Even if it weren't true, IRQs are not up so we couldn't fire - * IPIs around. - */ -- __flush_cpu_slab(s, smp_processor_id()); -+ __flush_cpu_slab(s, smp_processor_id(), &delayed_free); -+ discard_delayed(&delayed_free); - for_each_kmem_cache_node(s, node, n) { - struct page *p; - diff --git a/kernel/patches-5.11.x-rt/0124-0005-mm-slub-Move-flush_cpu_slab-invocations-__free_slab-.patch b/kernel/patches-5.11.x-rt/0124-0005-mm-slub-Move-flush_cpu_slab-invocations-__free_slab-.patch deleted file mode 100644 index ee3c563389..0000000000 --- a/kernel/patches-5.11.x-rt/0124-0005-mm-slub-Move-flush_cpu_slab-invocations-__free_slab-.patch +++ /dev/null @@ -1,114 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 26 Feb 2021 17:11:55 +0100 -Subject: [PATCH 5/8] mm: slub: Move flush_cpu_slab() invocations __free_slab() - invocations out of IRQ context - -flush_all() flushes a specific SLAB cache on each CPU (where the cache -is present). The discard_delayed()/__free_slab() invocation happens -within IPI handler and is problematic for PREEMPT_RT. - -The flush operation is not a frequent operation or a hot path. The -per-CPU flush operation can be moved to within a workqueue. - -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/slub.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- - 1 file changed, 52 insertions(+), 8 deletions(-) - ---- a/mm/slub.c -+++ b/mm/slub.c -@@ -2478,26 +2478,70 @@ static inline void __flush_cpu_slab(stru - unfreeze_partials(s, c, delayed_free); - } - --static void flush_cpu_slab(void *d) -+struct slub_flush_work { -+ struct work_struct work; -+ struct kmem_cache *s; -+ bool skip; -+}; -+ -+static void flush_cpu_slab(struct work_struct *w) - { -- struct kmem_cache *s = d; -+ struct slub_flush_work *sfw; - LIST_HEAD(delayed_free); - -- __flush_cpu_slab(s, smp_processor_id(), &delayed_free); -+ sfw = container_of(w, struct slub_flush_work, work); -+ -+ local_irq_disable(); -+ __flush_cpu_slab(sfw->s, smp_processor_id(), &delayed_free); -+ local_irq_enable(); -+ - discard_delayed(&delayed_free); - } - --static bool has_cpu_slab(int cpu, void *info) -+static bool has_cpu_slab(int cpu, struct kmem_cache *s) - { -- struct kmem_cache *s = info; - struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu); - - return c->page || slub_percpu_partial(c); - } - -+static DEFINE_MUTEX(flush_lock); -+static DEFINE_PER_CPU(struct slub_flush_work, slub_flush); -+ -+static void flush_all_locked(struct kmem_cache *s) -+{ -+ struct slub_flush_work *sfw; -+ unsigned int cpu; -+ -+ mutex_lock(&flush_lock); -+ -+ for_each_online_cpu(cpu) { -+ sfw = &per_cpu(slub_flush, cpu); -+ if (!has_cpu_slab(cpu, s)) { -+ sfw->skip = true; -+ continue; -+ } -+ INIT_WORK(&sfw->work, flush_cpu_slab); -+ sfw->skip = false; -+ sfw->s = s; -+ schedule_work_on(cpu, &sfw->work); -+ } -+ -+ for_each_online_cpu(cpu) { -+ sfw = &per_cpu(slub_flush, cpu); -+ if (sfw->skip) -+ continue; -+ flush_work(&sfw->work); -+ } -+ -+ mutex_unlock(&flush_lock); -+} -+ - static void flush_all(struct kmem_cache *s) - { -- on_each_cpu_cond(has_cpu_slab, flush_cpu_slab, s, 1); -+ cpus_read_lock(); -+ flush_all_locked(s); -+ cpus_read_unlock(); - } - - /* -@@ -3979,7 +4023,7 @@ int __kmem_cache_shutdown(struct kmem_ca - int node; - struct kmem_cache_node *n; - -- flush_all(s); -+ flush_all_locked(s); - /* Attempt to free all objects */ - for_each_kmem_cache_node(s, node, n) { - free_partial(s, n); -@@ -4219,7 +4263,7 @@ int __kmem_cache_shrink(struct kmem_cach - unsigned long flags; - int ret = 0; - -- flush_all(s); -+ flush_all_locked(s); - for_each_kmem_cache_node(s, node, n) { - INIT_LIST_HEAD(&discard); - for (i = 0; i < SHRINK_PROMOTE_MAX; i++) diff --git a/kernel/patches-5.11.x-rt/0125-0006-mm-slub-Don-t-resize-the-location-tracking-cache-on-.patch b/kernel/patches-5.11.x-rt/0125-0006-mm-slub-Don-t-resize-the-location-tracking-cache-on-.patch deleted file mode 100644 index a650733705..0000000000 --- a/kernel/patches-5.11.x-rt/0125-0006-mm-slub-Don-t-resize-the-location-tracking-cache-on-.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 26 Feb 2021 17:26:04 +0100 -Subject: [PATCH 6/8] mm: slub: Don't resize the location tracking cache on - PREEMPT_RT - -The location tracking cache has a size of a page and is resized if its -current size is too small. -This allocation happens with disabled interrupts and can't happen on -PREEMPT_RT. -Should one page be too small, then we have to allocate more at the -beginning. The only downside is that less callers will be visible. - -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/slub.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/mm/slub.c -+++ b/mm/slub.c -@@ -4737,6 +4737,9 @@ static int alloc_loc_track(struct loc_tr - struct location *l; - int order; - -+ if (IS_ENABLED(CONFIG_PREEMPT_RT) && flags == GFP_ATOMIC) -+ return 0; -+ - order = get_order(sizeof(struct location) * max); - - l = (void *)__get_free_pages(flags, order); diff --git a/kernel/patches-5.11.x-rt/0126-0007-mm-page_alloc-Use-migrate_disable-in-drain_local_pag.patch b/kernel/patches-5.11.x-rt/0126-0007-mm-page_alloc-Use-migrate_disable-in-drain_local_pag.patch deleted file mode 100644 index 378ea22579..0000000000 --- a/kernel/patches-5.11.x-rt/0126-0007-mm-page_alloc-Use-migrate_disable-in-drain_local_pag.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 2 Jul 2020 14:27:23 +0200 -Subject: [PATCH 7/8] mm: page_alloc: Use migrate_disable() in - drain_local_pages_wq() - -drain_local_pages_wq() disables preemption to avoid CPU migration during -CPU hotplug and can't use cpus_read_lock(). - -Using migrate_disable() works here, too. The scheduler won't take the -CPU offline until the task left the migrate-disable section. - -Use migrate_disable() in drain_local_pages_wq(). - -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/page_alloc.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -3033,9 +3033,9 @@ static void drain_local_pages_wq(struct - * cpu which is allright but we also have to make sure to not move to - * a different one. - */ -- preempt_disable(); -+ migrate_disable(); - drain_local_pages(drain->zone); -- preempt_enable(); -+ migrate_enable(); - } - - /* diff --git a/kernel/patches-5.11.x-rt/0127-0008-mm-page_alloc-Use-a-local_lock-instead-of-explicit-l.patch b/kernel/patches-5.11.x-rt/0127-0008-mm-page_alloc-Use-a-local_lock-instead-of-explicit-l.patch deleted file mode 100644 index 0855077930..0000000000 --- a/kernel/patches-5.11.x-rt/0127-0008-mm-page_alloc-Use-a-local_lock-instead-of-explicit-l.patch +++ /dev/null @@ -1,204 +0,0 @@ -From: Ingo Molnar -Date: Fri, 3 Jul 2009 08:29:37 -0500 -Subject: [PATCH 8/8] mm: page_alloc: Use a local_lock instead of explicit - local_irq_save(). - -The page-allocator disables interrupts for a few reasons: -- Decouple interrupt the irqsave operation from spin_lock() so it can be - extended over the actual lock region and cover other areas. Areas like - counters increments where the preemptible version can be avoided. - -- Access to the per-CPU pcp from struct zone. - -Replace the irqsave with a local-lock. The counters are expected to be -always modified with disabled preemption and no access from interrupt -context. - -Contains fixes from: - Peter Zijlstra - Thomas Gleixner - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/page_alloc.c | 49 ++++++++++++++++++++++++++++++------------------- - 1 file changed, 30 insertions(+), 19 deletions(-) - ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -62,6 +62,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -363,6 +364,13 @@ EXPORT_SYMBOL(nr_online_nodes); - - int page_group_by_mobility_disabled __read_mostly; - -+struct pa_lock { -+ local_lock_t l; -+}; -+static DEFINE_PER_CPU(struct pa_lock, pa_lock) = { -+ .l = INIT_LOCAL_LOCK(l), -+}; -+ - #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT - /* - * During boot we initialize deferred pages on-demand, as needed, but once -@@ -1537,11 +1545,11 @@ static void __free_pages_ok(struct page - return; - - migratetype = get_pfnblock_migratetype(page, pfn); -- local_irq_save(flags); -+ local_lock_irqsave(&pa_lock.l, flags); - __count_vm_events(PGFREE, 1 << order); - free_one_page(page_zone(page), page, pfn, order, migratetype, - fpi_flags); -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - } - - void __free_pages_core(struct page *page, unsigned int order) -@@ -2957,12 +2965,12 @@ void drain_zone_pages(struct zone *zone, - unsigned long flags; - int to_drain, batch; - -- local_irq_save(flags); -+ local_lock_irqsave(&pa_lock.l, flags); - batch = READ_ONCE(pcp->batch); - to_drain = min(pcp->count, batch); - if (to_drain > 0) - free_pcppages_bulk(zone, to_drain, pcp); -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - } - #endif - -@@ -2979,13 +2987,13 @@ static void drain_pages_zone(unsigned in - struct per_cpu_pageset *pset; - struct per_cpu_pages *pcp; - -- local_irq_save(flags); -+ local_lock_irqsave(&pa_lock.l, flags); - pset = per_cpu_ptr(zone->pageset, cpu); - - pcp = &pset->pcp; - if (pcp->count) - free_pcppages_bulk(zone, pcp->count, pcp); -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - } - - /* -@@ -3248,9 +3256,9 @@ void free_unref_page(struct page *page) - if (!free_unref_page_prepare(page, pfn)) - return; - -- local_irq_save(flags); -+ local_lock_irqsave(&pa_lock.l, flags); - free_unref_page_commit(page, pfn); -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - } - - /* -@@ -3270,7 +3278,7 @@ void free_unref_page_list(struct list_he - set_page_private(page, pfn); - } - -- local_irq_save(flags); -+ local_lock_irqsave(&pa_lock.l, flags); - list_for_each_entry_safe(page, next, list, lru) { - unsigned long pfn = page_private(page); - -@@ -3283,12 +3291,12 @@ void free_unref_page_list(struct list_he - * a large list of pages to free. - */ - if (++batch_count == SWAP_CLUSTER_MAX) { -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - batch_count = 0; -- local_irq_save(flags); -+ local_lock_irqsave(&pa_lock.l, flags); - } - } -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - } - - /* -@@ -3443,7 +3451,7 @@ static struct page *rmqueue_pcplist(stru - struct page *page; - unsigned long flags; - -- local_irq_save(flags); -+ local_lock_irqsave(&pa_lock.l, flags); - pcp = &this_cpu_ptr(zone->pageset)->pcp; - list = &pcp->lists[migratetype]; - page = __rmqueue_pcplist(zone, migratetype, alloc_flags, pcp, list); -@@ -3451,7 +3459,7 @@ static struct page *rmqueue_pcplist(stru - __count_zid_vm_events(PGALLOC, page_zonenum(page), 1); - zone_statistics(preferred_zone, zone); - } -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - return page; - } - -@@ -3485,7 +3493,9 @@ struct page *rmqueue(struct zone *prefer - * allocate greater than order-1 page units with __GFP_NOFAIL. - */ - WARN_ON_ONCE((gfp_flags & __GFP_NOFAIL) && (order > 1)); -- spin_lock_irqsave(&zone->lock, flags); -+ -+ local_lock_irqsave(&pa_lock.l, flags); -+ spin_lock(&zone->lock); - - do { - page = NULL; -@@ -3506,12 +3516,13 @@ struct page *rmqueue(struct zone *prefer - spin_unlock(&zone->lock); - if (!page) - goto failed; -+ - __mod_zone_freepage_state(zone, -(1 << order), - get_pcppage_migratetype(page)); - - __count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order); - zone_statistics(preferred_zone, zone); -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - - out: - /* Separate test+clear to avoid unnecessary atomics */ -@@ -3524,7 +3535,7 @@ struct page *rmqueue(struct zone *prefer - return page; - - failed: -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - return NULL; - } - -@@ -8828,7 +8839,7 @@ void zone_pcp_reset(struct zone *zone) - struct per_cpu_pageset *pset; - - /* avoid races with drain_pages() */ -- local_irq_save(flags); -+ local_lock_irqsave(&pa_lock.l, flags); - if (zone->pageset != &boot_pageset) { - for_each_online_cpu(cpu) { - pset = per_cpu_ptr(zone->pageset, cpu); -@@ -8837,7 +8848,7 @@ void zone_pcp_reset(struct zone *zone) - free_percpu(zone->pageset); - zone->pageset = &boot_pageset; - } -- local_irq_restore(flags); -+ local_unlock_irqrestore(&pa_lock.l, flags); - } - - #ifdef CONFIG_MEMORY_HOTREMOVE diff --git a/kernel/patches-5.11.x-rt/0128-mm-slub-Don-t-enable-partial-CPU-caches-on-PREEMPT_R.patch b/kernel/patches-5.11.x-rt/0128-mm-slub-Don-t-enable-partial-CPU-caches-on-PREEMPT_R.patch deleted file mode 100644 index 8435015365..0000000000 --- a/kernel/patches-5.11.x-rt/0128-mm-slub-Don-t-enable-partial-CPU-caches-on-PREEMPT_R.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 2 Mar 2021 18:58:04 +0100 -Subject: [PATCH] mm: slub: Don't enable partial CPU caches on PREEMPT_RT by - default - -SLUB's partial CPU caches lead to higher latencies in a hackbench -benchmark. - -Don't enable partial CPU caches by default on PREEMPT_RT. - -Signed-off-by: Sebastian Andrzej Siewior ---- - init/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1983,7 +1983,7 @@ config SHUFFLE_PAGE_ALLOCATOR - Say Y if unsure. - - config SLUB_CPU_PARTIAL -- default y -+ default y if !PREEMPT_RT - depends on SLUB && SMP - bool "SLUB per cpu partial cache" - help diff --git a/kernel/patches-5.11.x-rt/0129-mm-memcontrol-Provide-a-local_lock-for-per-CPU-memcg.patch b/kernel/patches-5.11.x-rt/0129-mm-memcontrol-Provide-a-local_lock-for-per-CPU-memcg.patch deleted file mode 100644 index 4e4769210c..0000000000 --- a/kernel/patches-5.11.x-rt/0129-mm-memcontrol-Provide-a-local_lock-for-per-CPU-memcg.patch +++ /dev/null @@ -1,136 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 18 Aug 2020 10:30:00 +0200 -Subject: [PATCH] mm: memcontrol: Provide a local_lock for per-CPU memcg_stock - -The interrupts are disabled to ensure CPU-local access to the per-CPU -variable `memcg_stock'. -As the code inside the interrupt disabled section acquires regular -spinlocks, which are converted to 'sleeping' spinlocks on a PREEMPT_RT -kernel, this conflicts with the RT semantics. - -Convert it to a local_lock which allows RT kernels to substitute them with -a real per CPU lock. On non RT kernels this maps to local_irq_save() as -before, but provides also lockdep coverage of the critical region. -No functional change. - -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/memcontrol.c | 31 ++++++++++++++++++------------- - 1 file changed, 18 insertions(+), 13 deletions(-) - ---- a/mm/memcontrol.c -+++ b/mm/memcontrol.c -@@ -2234,6 +2234,7 @@ void unlock_page_memcg(struct page *page - EXPORT_SYMBOL(unlock_page_memcg); - - struct memcg_stock_pcp { -+ local_lock_t lock; - struct mem_cgroup *cached; /* this never be root cgroup */ - unsigned int nr_pages; - -@@ -2285,7 +2286,7 @@ static bool consume_stock(struct mem_cgr - if (nr_pages > MEMCG_CHARGE_BATCH) - return ret; - -- local_irq_save(flags); -+ local_lock_irqsave(&memcg_stock.lock, flags); - - stock = this_cpu_ptr(&memcg_stock); - if (memcg == stock->cached && stock->nr_pages >= nr_pages) { -@@ -2293,7 +2294,7 @@ static bool consume_stock(struct mem_cgr - ret = true; - } - -- local_irq_restore(flags); -+ local_unlock_irqrestore(&memcg_stock.lock, flags); - - return ret; - } -@@ -2328,14 +2329,14 @@ static void drain_local_stock(struct wor - * The only protection from memory hotplug vs. drain_stock races is - * that we always operate on local CPU stock here with IRQ disabled - */ -- local_irq_save(flags); -+ local_lock_irqsave(&memcg_stock.lock, flags); - - stock = this_cpu_ptr(&memcg_stock); - drain_obj_stock(stock); - drain_stock(stock); - clear_bit(FLUSHING_CACHED_CHARGE, &stock->flags); - -- local_irq_restore(flags); -+ local_unlock_irqrestore(&memcg_stock.lock, flags); - } - - /* -@@ -2347,7 +2348,7 @@ static void refill_stock(struct mem_cgro - struct memcg_stock_pcp *stock; - unsigned long flags; - -- local_irq_save(flags); -+ local_lock_irqsave(&memcg_stock.lock, flags); - - stock = this_cpu_ptr(&memcg_stock); - if (stock->cached != memcg) { /* reset if necessary */ -@@ -2360,7 +2361,7 @@ static void refill_stock(struct mem_cgro - if (stock->nr_pages > MEMCG_CHARGE_BATCH) - drain_stock(stock); - -- local_irq_restore(flags); -+ local_unlock_irqrestore(&memcg_stock.lock, flags); - } - - /* -@@ -3167,7 +3168,7 @@ static bool consume_obj_stock(struct obj - unsigned long flags; - bool ret = false; - -- local_irq_save(flags); -+ local_lock_irqsave(&memcg_stock.lock, flags); - - stock = this_cpu_ptr(&memcg_stock); - if (objcg == stock->cached_objcg && stock->nr_bytes >= nr_bytes) { -@@ -3175,7 +3176,7 @@ static bool consume_obj_stock(struct obj - ret = true; - } - -- local_irq_restore(flags); -+ local_unlock_irqrestore(&memcg_stock.lock, flags); - - return ret; - } -@@ -3234,7 +3235,7 @@ static void refill_obj_stock(struct obj_ - struct memcg_stock_pcp *stock; - unsigned long flags; - -- local_irq_save(flags); -+ local_lock_irqsave(&memcg_stock.lock, flags); - - stock = this_cpu_ptr(&memcg_stock); - if (stock->cached_objcg != objcg) { /* reset if necessary */ -@@ -3248,7 +3249,7 @@ static void refill_obj_stock(struct obj_ - if (stock->nr_bytes > PAGE_SIZE) - drain_obj_stock(stock); - -- local_irq_restore(flags); -+ local_unlock_irqrestore(&memcg_stock.lock, flags); - } - - int obj_cgroup_charge(struct obj_cgroup *objcg, gfp_t gfp, size_t size) -@@ -7089,9 +7090,13 @@ static int __init mem_cgroup_init(void) - cpuhp_setup_state_nocalls(CPUHP_MM_MEMCQ_DEAD, "mm/memctrl:dead", NULL, - memcg_hotplug_cpu_dead); - -- for_each_possible_cpu(cpu) -- INIT_WORK(&per_cpu_ptr(&memcg_stock, cpu)->work, -- drain_local_stock); -+ for_each_possible_cpu(cpu) { -+ struct memcg_stock_pcp *stock; -+ -+ stock = per_cpu_ptr(&memcg_stock, cpu); -+ INIT_WORK(&stock->work, drain_local_stock); -+ local_lock_init(&stock->lock); -+ } - - for_each_node(node) { - struct mem_cgroup_tree_per_node *rtpn; diff --git a/kernel/patches-5.11.x-rt/0130-mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch b/kernel/patches-5.11.x-rt/0130-mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch deleted file mode 100644 index fe94964b42..0000000000 --- a/kernel/patches-5.11.x-rt/0130-mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch +++ /dev/null @@ -1,68 +0,0 @@ -From: Yang Shi -Subject: mm/memcontrol: Don't call schedule_work_on in preemption disabled context -Date: Wed, 30 Oct 2013 11:48:33 -0700 - -The following trace is triggered when running ltp oom test cases: - -BUG: sleeping function called from invalid context at kernel/rtmutex.c:659 -in_atomic(): 1, irqs_disabled(): 0, pid: 17188, name: oom03 -Preemption disabled at:[] mem_cgroup_reclaim+0x90/0xe0 - -CPU: 2 PID: 17188 Comm: oom03 Not tainted 3.10.10-rt3 #2 -Hardware name: Intel Corporation Calpella platform/MATXM-CORE-411-B, BIOS 4.6.3 08/18/2010 -ffff88007684d730 ffff880070df9b58 ffffffff8169918d ffff880070df9b70 -ffffffff8106db31 ffff88007688b4a0 ffff880070df9b88 ffffffff8169d9c0 -ffff88007688b4a0 ffff880070df9bc8 ffffffff81059da1 0000000170df9bb0 -Call Trace: -[] dump_stack+0x19/0x1b -[] __might_sleep+0xf1/0x170 -[] rt_spin_lock+0x20/0x50 -[] queue_work_on+0x61/0x100 -[] drain_all_stock+0xe1/0x1c0 -[] mem_cgroup_reclaim+0x90/0xe0 -[] __mem_cgroup_try_charge+0x41a/0xc40 -[] ? release_pages+0x1b1/0x1f0 -[] ? sched_exec+0x40/0xb0 -[] mem_cgroup_charge_common+0x37/0x70 -[] mem_cgroup_newpage_charge+0x26/0x30 -[] handle_pte_fault+0x618/0x840 -[] ? unpin_current_cpu+0x16/0x70 -[] ? migrate_enable+0xd4/0x200 -[] handle_mm_fault+0x145/0x1e0 -[] __do_page_fault+0x1a1/0x4c0 -[] ? preempt_schedule_irq+0x4b/0x70 -[] ? retint_kernel+0x37/0x40 -[] do_page_fault+0xe/0x10 -[] page_fault+0x22/0x30 - -So, to prevent schedule_work_on from being called in preempt disabled context, -replace the pair of get/put_cpu() to get/put_cpu_light(). - - -Signed-off-by: Yang Shi -Signed-off-by: Sebastian Andrzej Siewior ---- - - mm/memcontrol.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/mm/memcontrol.c -+++ b/mm/memcontrol.c -@@ -2381,7 +2381,7 @@ static void drain_all_stock(struct mem_c - * as well as workers from this path always operate on the local - * per-cpu data. CPU up doesn't touch memcg_stock at all. - */ -- curcpu = get_cpu(); -+ curcpu = get_cpu_light(); - for_each_online_cpu(cpu) { - struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); - struct mem_cgroup *memcg; -@@ -2404,7 +2404,7 @@ static void drain_all_stock(struct mem_c - schedule_work_on(cpu, &stock->work); - } - } -- put_cpu(); -+ put_cpu_light(); - mutex_unlock(&percpu_charge_mutex); - } - diff --git a/kernel/patches-5.11.x-rt/0131-mm-memcontrol-do_not_disable_irq.patch b/kernel/patches-5.11.x-rt/0131-mm-memcontrol-do_not_disable_irq.patch deleted file mode 100644 index cf9653b39b..0000000000 --- a/kernel/patches-5.11.x-rt/0131-mm-memcontrol-do_not_disable_irq.patch +++ /dev/null @@ -1,115 +0,0 @@ -From: Sebastian Andrzej Siewior -Subject: mm/memcontrol: Replace local_irq_disable with local locks -Date: Wed, 28 Jan 2015 17:14:16 +0100 - -There are a few local_irq_disable() which then take sleeping locks. This -patch converts them local locks. - -[bigeasy: Move unlock after memcg_check_events() in mem_cgroup_swapout(), - pointed out by Matt Fleming ] -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/memcontrol.c | 29 +++++++++++++++++++++-------- - 1 file changed, 21 insertions(+), 8 deletions(-) - ---- a/mm/memcontrol.c -+++ b/mm/memcontrol.c -@@ -66,6 +66,7 @@ - #include - #include - #include "slab.h" -+#include - - #include - -@@ -96,6 +97,13 @@ bool cgroup_memory_noswap __read_mostly; - static DECLARE_WAIT_QUEUE_HEAD(memcg_cgwb_frn_waitq); - #endif - -+struct event_lock { -+ local_lock_t l; -+}; -+static DEFINE_PER_CPU(struct event_lock, event_lock) = { -+ .l = INIT_LOCAL_LOCK(l), -+}; -+ - /* Whether legacy memory+swap accounting is active */ - static bool do_memsw_account(void) - { -@@ -5696,12 +5704,12 @@ static int mem_cgroup_move_account(struc - - ret = 0; - -- local_irq_disable(); -+ local_lock_irq(&event_lock.l); - mem_cgroup_charge_statistics(to, page, nr_pages); - memcg_check_events(to, page); - mem_cgroup_charge_statistics(from, page, -nr_pages); - memcg_check_events(from, page); -- local_irq_enable(); -+ local_unlock_irq(&event_lock.l); - out_unlock: - unlock_page(page); - out: -@@ -6752,10 +6760,10 @@ int mem_cgroup_charge(struct page *page, - css_get(&memcg->css); - commit_charge(page, memcg); - -- local_irq_disable(); -+ local_lock_irq(&event_lock.l); - mem_cgroup_charge_statistics(memcg, page, nr_pages); - memcg_check_events(memcg, page); -- local_irq_enable(); -+ local_unlock_irq(&event_lock.l); - - /* - * Cgroup1's unified memory+swap counter has been charged with the -@@ -6811,11 +6819,11 @@ static void uncharge_batch(const struct - memcg_oom_recover(ug->memcg); - } - -- local_irq_save(flags); -+ local_lock_irqsave(&event_lock.l, flags); - __count_memcg_events(ug->memcg, PGPGOUT, ug->pgpgout); - __this_cpu_add(ug->memcg->vmstats_percpu->nr_page_events, ug->nr_pages); - memcg_check_events(ug->memcg, ug->dummy_page); -- local_irq_restore(flags); -+ local_unlock_irqrestore(&event_lock.l, flags); - - /* drop reference from uncharge_page */ - css_put(&ug->memcg->css); -@@ -6967,10 +6975,10 @@ void mem_cgroup_migrate(struct page *old - css_get(&memcg->css); - commit_charge(newpage, memcg); - -- local_irq_save(flags); -+ local_lock_irqsave(&event_lock.l, flags); - mem_cgroup_charge_statistics(memcg, newpage, nr_pages); - memcg_check_events(memcg, newpage); -- local_irq_restore(flags); -+ local_unlock_irqrestore(&event_lock.l, flags); - } - - DEFINE_STATIC_KEY_FALSE(memcg_sockets_enabled_key); -@@ -7145,6 +7153,7 @@ void mem_cgroup_swapout(struct page *pag - struct mem_cgroup *memcg, *swap_memcg; - unsigned int nr_entries; - unsigned short oldid; -+ unsigned long flags; - - VM_BUG_ON_PAGE(PageLRU(page), page); - VM_BUG_ON_PAGE(page_count(page), page); -@@ -7193,9 +7202,13 @@ void mem_cgroup_swapout(struct page *pag - * important here to have the interrupts disabled because it is the - * only synchronisation we have for updating the per-CPU variables. - */ -+ local_lock_irqsave(&event_lock.l, flags); -+#ifndef CONFIG_PREEMPT_RT - VM_BUG_ON(!irqs_disabled()); -+#endif - mem_cgroup_charge_statistics(memcg, page, -nr_entries); - memcg_check_events(memcg, page); -+ local_unlock_irqrestore(&event_lock.l, flags); - - css_put(&memcg->css); - } diff --git a/kernel/patches-5.11.x-rt/0132-mm_zsmalloc_copy_with_get_cpu_var_and_locking.patch b/kernel/patches-5.11.x-rt/0132-mm_zsmalloc_copy_with_get_cpu_var_and_locking.patch deleted file mode 100644 index 0fd7ef8de4..0000000000 --- a/kernel/patches-5.11.x-rt/0132-mm_zsmalloc_copy_with_get_cpu_var_and_locking.patch +++ /dev/null @@ -1,205 +0,0 @@ -From: Mike Galbraith -Date: Tue, 22 Mar 2016 11:16:09 +0100 -Subject: [PATCH] mm/zsmalloc: copy with get_cpu_var() and locking - -get_cpu_var() disables preemption and triggers a might_sleep() splat later. -This is replaced with get_locked_var(). -This bitspinlocks are replaced with a proper mutex which requires a slightly -larger struct to allocate. - -Signed-off-by: Mike Galbraith -[bigeasy: replace the bitspin_lock() with a mutex, get_locked_var(). Mike then -fixed the size magic] -Signed-off-by: Sebastian Andrzej Siewior ---- - mm/zsmalloc.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 79 insertions(+), 6 deletions(-) - ---- a/mm/zsmalloc.c -+++ b/mm/zsmalloc.c -@@ -57,6 +57,7 @@ - #include - #include - #include -+#include - - #define ZSPAGE_MAGIC 0x58 - -@@ -77,6 +78,20 @@ - - #define ZS_HANDLE_SIZE (sizeof(unsigned long)) - -+#ifdef CONFIG_PREEMPT_RT -+ -+struct zsmalloc_handle { -+ unsigned long addr; -+ struct mutex lock; -+}; -+ -+#define ZS_HANDLE_ALLOC_SIZE (sizeof(struct zsmalloc_handle)) -+ -+#else -+ -+#define ZS_HANDLE_ALLOC_SIZE (sizeof(unsigned long)) -+#endif -+ - /* - * Object location (, ) is encoded as - * a single (unsigned long) handle value. -@@ -293,6 +308,7 @@ struct zspage { - }; - - struct mapping_area { -+ local_lock_t lock; - char *vm_buf; /* copy buffer for objects that span pages */ - char *vm_addr; /* address of kmap_atomic()'ed pages */ - enum zs_mapmode vm_mm; /* mapping mode */ -@@ -322,7 +338,7 @@ static void SetZsPageMovable(struct zs_p - - static int create_cache(struct zs_pool *pool) - { -- pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_SIZE, -+ pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_ALLOC_SIZE, - 0, 0, NULL); - if (!pool->handle_cachep) - return 1; -@@ -346,9 +362,26 @@ static void destroy_cache(struct zs_pool - - static unsigned long cache_alloc_handle(struct zs_pool *pool, gfp_t gfp) - { -- return (unsigned long)kmem_cache_alloc(pool->handle_cachep, -- gfp & ~(__GFP_HIGHMEM|__GFP_MOVABLE)); -+ void *p; -+ -+ p = kmem_cache_alloc(pool->handle_cachep, -+ gfp & ~(__GFP_HIGHMEM|__GFP_MOVABLE)); -+#ifdef CONFIG_PREEMPT_RT -+ if (p) { -+ struct zsmalloc_handle *zh = p; -+ -+ mutex_init(&zh->lock); -+ } -+#endif -+ return (unsigned long)p; -+} -+ -+#ifdef CONFIG_PREEMPT_RT -+static struct zsmalloc_handle *zs_get_pure_handle(unsigned long handle) -+{ -+ return (void *)(handle &~((1 << OBJ_TAG_BITS) - 1)); - } -+#endif - - static void cache_free_handle(struct zs_pool *pool, unsigned long handle) - { -@@ -368,12 +401,18 @@ static void cache_free_zspage(struct zs_ - - static void record_obj(unsigned long handle, unsigned long obj) - { -+#ifdef CONFIG_PREEMPT_RT -+ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); -+ -+ WRITE_ONCE(zh->addr, obj); -+#else - /* - * lsb of @obj represents handle lock while other bits - * represent object value the handle is pointing so - * updating shouldn't do store tearing. - */ - WRITE_ONCE(*(unsigned long *)handle, obj); -+#endif - } - - /* zpool driver */ -@@ -455,7 +494,10 @@ MODULE_ALIAS("zpool-zsmalloc"); - #endif /* CONFIG_ZPOOL */ - - /* per-cpu VM mapping areas for zspage accesses that cross page boundaries */ --static DEFINE_PER_CPU(struct mapping_area, zs_map_area); -+static DEFINE_PER_CPU(struct mapping_area, zs_map_area) = { -+ /* XXX remove this and use a spin_lock_t in pin_tag() */ -+ .lock = INIT_LOCAL_LOCK(lock), -+}; - - static bool is_zspage_isolated(struct zspage *zspage) - { -@@ -862,7 +904,13 @@ static unsigned long location_to_obj(str - - static unsigned long handle_to_obj(unsigned long handle) - { -+#ifdef CONFIG_PREEMPT_RT -+ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); -+ -+ return zh->addr; -+#else - return *(unsigned long *)handle; -+#endif - } - - static unsigned long obj_to_head(struct page *page, void *obj) -@@ -876,22 +924,46 @@ static unsigned long obj_to_head(struct - - static inline int testpin_tag(unsigned long handle) - { -+#ifdef CONFIG_PREEMPT_RT -+ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); -+ -+ return mutex_is_locked(&zh->lock); -+#else - return bit_spin_is_locked(HANDLE_PIN_BIT, (unsigned long *)handle); -+#endif - } - - static inline int trypin_tag(unsigned long handle) - { -+#ifdef CONFIG_PREEMPT_RT -+ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); -+ -+ return mutex_trylock(&zh->lock); -+#else - return bit_spin_trylock(HANDLE_PIN_BIT, (unsigned long *)handle); -+#endif - } - - static void pin_tag(unsigned long handle) __acquires(bitlock) - { -+#ifdef CONFIG_PREEMPT_RT -+ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); -+ -+ return mutex_lock(&zh->lock); -+#else - bit_spin_lock(HANDLE_PIN_BIT, (unsigned long *)handle); -+#endif - } - - static void unpin_tag(unsigned long handle) __releases(bitlock) - { -+#ifdef CONFIG_PREEMPT_RT -+ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); -+ -+ return mutex_unlock(&zh->lock); -+#else - bit_spin_unlock(HANDLE_PIN_BIT, (unsigned long *)handle); -+#endif - } - - static void reset_page(struct page *page) -@@ -1275,7 +1347,8 @@ void *zs_map_object(struct zs_pool *pool - class = pool->size_class[class_idx]; - off = (class->size * obj_idx) & ~PAGE_MASK; - -- area = &get_cpu_var(zs_map_area); -+ local_lock(&zs_map_area.lock); -+ area = this_cpu_ptr(&zs_map_area); - area->vm_mm = mm; - if (off + class->size <= PAGE_SIZE) { - /* this object is contained entirely within a page */ -@@ -1329,7 +1402,7 @@ void zs_unmap_object(struct zs_pool *poo - - __zs_unmap_object(area, pages, off, class->size); - } -- put_cpu_var(zs_map_area); -+ local_unlock(&zs_map_area.lock); - - migrate_read_unlock(zspage); - unpin_tag(handle); diff --git a/kernel/patches-5.11.x-rt/0133-x86-kvm-require-const-tsc-for-rt.patch b/kernel/patches-5.11.x-rt/0133-x86-kvm-require-const-tsc-for-rt.patch deleted file mode 100644 index e3e007961a..0000000000 --- a/kernel/patches-5.11.x-rt/0133-x86-kvm-require-const-tsc-for-rt.patch +++ /dev/null @@ -1,31 +0,0 @@ -Subject: x86: kvm Require const tsc for RT -From: Thomas Gleixner -Date: Sun, 06 Nov 2011 12:26:18 +0100 - -Non constant TSC is a nightmare on bare metal already, but with -virtualization it becomes a complete disaster because the workarounds -are horrible latency wise. That's also a preliminary for running RT in -a guest on top of a RT host. - -Signed-off-by: Thomas Gleixner ---- - arch/x86/kvm/x86.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -7908,6 +7908,14 @@ int kvm_arch_init(void *opaque) - goto out; - } - -+#ifdef CONFIG_PREEMPT_RT -+ if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) { -+ pr_err("RT requires X86_FEATURE_CONSTANT_TSC\n"); -+ r = -EOPNOTSUPP; -+ goto out; -+ } -+#endif -+ - r = -ENOMEM; - x86_fpu_cache = kmem_cache_create("x86_fpu", sizeof(struct fpu), - __alignof__(struct fpu), SLAB_ACCOUNT, diff --git a/kernel/patches-5.11.x-rt/0134-wait.h-include-atomic.h.patch b/kernel/patches-5.11.x-rt/0134-wait.h-include-atomic.h.patch deleted file mode 100644 index 0a04f78594..0000000000 --- a/kernel/patches-5.11.x-rt/0134-wait.h-include-atomic.h.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 28 Oct 2013 12:19:57 +0100 -Subject: wait.h: include atomic.h - -| CC init/main.o -|In file included from include/linux/mmzone.h:9:0, -| from include/linux/gfp.h:4, -| from include/linux/kmod.h:22, -| from include/linux/module.h:13, -| from init/main.c:15: -|include/linux/wait.h: In function ‘wait_on_atomic_t’: -|include/linux/wait.h:982:2: error: implicit declaration of function ‘atomic_read’ [-Werror=implicit-function-declaration] -| if (atomic_read(val) == 0) -| ^ - -This pops up on ARM. Non-RT gets its atomic.h include from spinlock.h - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/wait.h | 1 + - 1 file changed, 1 insertion(+) - ---- a/include/linux/wait.h -+++ b/include/linux/wait.h -@@ -10,6 +10,7 @@ - - #include - #include -+#include - - typedef struct wait_queue_entry wait_queue_entry_t; - diff --git a/kernel/patches-5.11.x-rt/0135-sched-limit-nr-migrate.patch b/kernel/patches-5.11.x-rt/0135-sched-limit-nr-migrate.patch deleted file mode 100644 index 3d0c9aecab..0000000000 --- a/kernel/patches-5.11.x-rt/0135-sched-limit-nr-migrate.patch +++ /dev/null @@ -1,26 +0,0 @@ -Subject: sched: Limit the number of task migrations per batch -From: Thomas Gleixner -Date: Mon, 06 Jun 2011 12:12:51 +0200 - -Put an upper limit on the number of tasks which are migrated per batch -to avoid large latencies. - -Signed-off-by: Thomas Gleixner ---- - kernel/sched/core.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -64,7 +64,11 @@ const_debug unsigned int sysctl_sched_fe - * Number of tasks to iterate in a single balance run. - * Limited because this is done with IRQs disabled. - */ -+#ifdef CONFIG_PREEMPT_RT -+const_debug unsigned int sysctl_sched_nr_migrate = 8; -+#else - const_debug unsigned int sysctl_sched_nr_migrate = 32; -+#endif - - /* - * period over which we measure -rt task CPU usage in us. diff --git a/kernel/patches-5.11.x-rt/0136-sched-mmdrop-delayed.patch b/kernel/patches-5.11.x-rt/0136-sched-mmdrop-delayed.patch deleted file mode 100644 index af93b6295b..0000000000 --- a/kernel/patches-5.11.x-rt/0136-sched-mmdrop-delayed.patch +++ /dev/null @@ -1,102 +0,0 @@ -Subject: sched: Move mmdrop to RCU on RT -From: Thomas Gleixner -Date: Mon, 06 Jun 2011 12:20:33 +0200 - -Takes sleeping locks and calls into the memory allocator, so nothing -we want to do in task switch and oder atomic contexts. - -Signed-off-by: Thomas Gleixner ---- - include/linux/mm_types.h | 4 ++++ - include/linux/sched/mm.h | 11 +++++++++++ - kernel/fork.c | 13 +++++++++++++ - kernel/sched/core.c | 7 ++++++- - 4 files changed, 34 insertions(+), 1 deletion(-) - ---- a/include/linux/mm_types.h -+++ b/include/linux/mm_types.h -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -553,6 +554,9 @@ struct mm_struct { - bool tlb_flush_batched; - #endif - struct uprobes_state uprobes_state; -+#ifdef CONFIG_PREEMPT_RT -+ struct rcu_head delayed_drop; -+#endif - #ifdef CONFIG_HUGETLB_PAGE - atomic_long_t hugetlb_usage; - #endif ---- a/include/linux/sched/mm.h -+++ b/include/linux/sched/mm.h -@@ -49,6 +49,17 @@ static inline void mmdrop(struct mm_stru - __mmdrop(mm); - } - -+#ifdef CONFIG_PREEMPT_RT -+extern void __mmdrop_delayed(struct rcu_head *rhp); -+static inline void mmdrop_delayed(struct mm_struct *mm) -+{ -+ if (atomic_dec_and_test(&mm->mm_count)) -+ call_rcu(&mm->delayed_drop, __mmdrop_delayed); -+} -+#else -+# define mmdrop_delayed(mm) mmdrop(mm) -+#endif -+ - /** - * mmget() - Pin the address space associated with a &struct mm_struct. - * @mm: The address space to pin. ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -689,6 +689,19 @@ void __mmdrop(struct mm_struct *mm) - } - EXPORT_SYMBOL_GPL(__mmdrop); - -+#ifdef CONFIG_PREEMPT_RT -+/* -+ * RCU callback for delayed mm drop. Not strictly rcu, but we don't -+ * want another facility to make this work. -+ */ -+void __mmdrop_delayed(struct rcu_head *rhp) -+{ -+ struct mm_struct *mm = container_of(rhp, struct mm_struct, delayed_drop); -+ -+ __mmdrop(mm); -+} -+#endif -+ - static void mmdrop_async_fn(struct work_struct *work) - { - struct mm_struct *mm; ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -4272,9 +4272,13 @@ static struct rq *finish_task_switch(str - * provided by mmdrop(), - * - a sync_core for SYNC_CORE. - */ -+ /* -+ * We use mmdrop_delayed() here so we don't have to do the -+ * full __mmdrop() when we are the last user. -+ */ - if (mm) { - membarrier_mm_sync_core_before_usermode(mm); -- mmdrop(mm); -+ mmdrop_delayed(mm); - } - if (unlikely(prev_state == TASK_DEAD)) { - if (prev->sched_class->task_dead) -@@ -7291,6 +7295,7 @@ void sched_setnuma(struct task_struct *p - #endif /* CONFIG_NUMA_BALANCING */ - - #ifdef CONFIG_HOTPLUG_CPU -+ - /* - * Ensure that the idle task is using init_mm right before its CPU goes - * offline. diff --git a/kernel/patches-5.11.x-rt/0137-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch b/kernel/patches-5.11.x-rt/0137-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch deleted file mode 100644 index f3af653958..0000000000 --- a/kernel/patches-5.11.x-rt/0137-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch +++ /dev/null @@ -1,72 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Mon, 21 Nov 2016 19:31:08 +0100 -Subject: [PATCH] kernel/sched: move stack + kprobe clean up to - __put_task_struct() - -There is no need to free the stack before the task struct (except for reasons -mentioned in commit 68f24b08ee89 ("sched/core: Free the stack early if -CONFIG_THREAD_INFO_IN_TASK")). This also comes handy on -RT because we can't -free memory in preempt disabled region. -vfree_atomic() delays the memory cleanup to a worker. Since we move everything -to the RCU callback, we can also free it immediately. - -Cc: stable-rt@vger.kernel.org #for kprobe_flush_task() -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/fork.c | 12 +++++++++++- - kernel/sched/core.c | 9 --------- - 2 files changed, 11 insertions(+), 10 deletions(-) - ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -42,6 +42,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -288,7 +289,7 @@ static inline void free_thread_stack(str - return; - } - -- vfree_atomic(tsk->stack); -+ vfree(tsk->stack); - return; - } - #endif -@@ -743,6 +744,15 @@ void __put_task_struct(struct task_struc - WARN_ON(refcount_read(&tsk->usage)); - WARN_ON(tsk == current); - -+ /* -+ * Remove function-return probe instances associated with this -+ * task and put them back on the free list. -+ */ -+ kprobe_flush_task(tsk); -+ -+ /* Task is done with its stack. */ -+ put_task_stack(tsk); -+ - io_uring_free(tsk); - cgroup_free(tsk); - task_numa_free(tsk, true); ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -4284,15 +4284,6 @@ static struct rq *finish_task_switch(str - if (prev->sched_class->task_dead) - prev->sched_class->task_dead(prev); - -- /* -- * Remove function-return probe instances associated with this -- * task and put them back on the free list. -- */ -- kprobe_flush_task(prev); -- -- /* Task is done with its stack. */ -- put_task_stack(prev); -- - put_task_struct_rcu_user(prev); - } - diff --git a/kernel/patches-5.11.x-rt/0138-sched-might-sleep-do-not-account-rcu-depth.patch b/kernel/patches-5.11.x-rt/0138-sched-might-sleep-do-not-account-rcu-depth.patch deleted file mode 100644 index 3b80a729d5..0000000000 --- a/kernel/patches-5.11.x-rt/0138-sched-might-sleep-do-not-account-rcu-depth.patch +++ /dev/null @@ -1,47 +0,0 @@ -Subject: sched: Do not account rcu_preempt_depth on RT in might_sleep() -From: Thomas Gleixner -Date: Tue, 07 Jun 2011 09:19:06 +0200 - -RT changes the rcu_preempt_depth semantics, so we cannot check for it -in might_sleep(). - -Signed-off-by: Thomas Gleixner ---- - include/linux/rcupdate.h | 7 +++++++ - kernel/sched/core.c | 2 +- - 2 files changed, 8 insertions(+), 1 deletion(-) - ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -52,6 +52,11 @@ void __rcu_read_unlock(void); - * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. - */ - #define rcu_preempt_depth() (current->rcu_read_lock_nesting) -+#ifndef CONFIG_PREEMPT_RT -+#define sched_rcu_preempt_depth() rcu_preempt_depth() -+#else -+static inline int sched_rcu_preempt_depth(void) { return 0; } -+#endif - - #else /* #ifdef CONFIG_PREEMPT_RCU */ - -@@ -77,6 +82,8 @@ static inline int rcu_preempt_depth(void - return 0; - } - -+#define sched_rcu_preempt_depth() rcu_preempt_depth() -+ - #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ - - /* Internal to kernel */ ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -7958,7 +7958,7 @@ void __init sched_init(void) - #ifdef CONFIG_DEBUG_ATOMIC_SLEEP - static inline int preempt_count_equals(int preempt_offset) - { -- int nested = preempt_count() + rcu_preempt_depth(); -+ int nested = preempt_count() + sched_rcu_preempt_depth(); - - return (nested == preempt_offset); - } diff --git a/kernel/patches-5.11.x-rt/0139-sched-disable-ttwu-queue.patch b/kernel/patches-5.11.x-rt/0139-sched-disable-ttwu-queue.patch deleted file mode 100644 index b4de5f0f8b..0000000000 --- a/kernel/patches-5.11.x-rt/0139-sched-disable-ttwu-queue.patch +++ /dev/null @@ -1,31 +0,0 @@ -Subject: sched: Disable TTWU_QUEUE on RT -From: Thomas Gleixner -Date: Tue, 13 Sep 2011 16:42:35 +0200 - -The queued remote wakeup mechanism can introduce rather large -latencies if the number of migrated tasks is high. Disable it for RT. - -Signed-off-by: Thomas Gleixner ---- - kernel/sched/features.h | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/kernel/sched/features.h -+++ b/kernel/sched/features.h -@@ -45,11 +45,16 @@ SCHED_FEAT(DOUBLE_TICK, false) - */ - SCHED_FEAT(NONTASK_CAPACITY, true) - -+#ifdef CONFIG_PREEMPT_RT -+SCHED_FEAT(TTWU_QUEUE, false) -+#else -+ - /* - * Queue remote wakeups on the target CPU and process them - * using the scheduler IPI. Reduces rq->lock contention/bounces. - */ - SCHED_FEAT(TTWU_QUEUE, true) -+#endif - - /* - * When doing wakeups, attempt to limit superfluous scans of the LLC domain. diff --git a/kernel/patches-5.11.x-rt/0140-softirq-preempt-fix-3-re.patch b/kernel/patches-5.11.x-rt/0140-softirq-preempt-fix-3-re.patch deleted file mode 100644 index ec00a132b1..0000000000 --- a/kernel/patches-5.11.x-rt/0140-softirq-preempt-fix-3-re.patch +++ /dev/null @@ -1,141 +0,0 @@ -Subject: softirq: Check preemption after reenabling interrupts -From: Thomas Gleixner -Date: Sun, 13 Nov 2011 17:17:09 +0100 (CET) - -raise_softirq_irqoff() disables interrupts and wakes the softirq -daemon, but after reenabling interrupts there is no preemption check, -so the execution of the softirq thread might be delayed arbitrarily. - -In principle we could add that check to local_irq_enable/restore, but -that's overkill as the rasie_softirq_irqoff() sections are the only -ones which show this behaviour. - -Reported-by: Carsten Emde -Signed-off-by: Thomas Gleixner - ---- - include/linux/preempt.h | 3 +++ - lib/irq_poll.c | 5 +++++ - net/core/dev.c | 7 +++++++ - 3 files changed, 15 insertions(+) - ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -190,8 +190,10 @@ do { \ - - #ifdef CONFIG_PREEMPT_RT - # define preempt_enable_no_resched() sched_preempt_enable_no_resched() -+# define preempt_check_resched_rt() preempt_check_resched() - #else - # define preempt_enable_no_resched() preempt_enable() -+# define preempt_check_resched_rt() barrier(); - #endif - - #define preemptible() (preempt_count() == 0 && !irqs_disabled()) -@@ -262,6 +264,7 @@ do { \ - #define preempt_disable_notrace() barrier() - #define preempt_enable_no_resched_notrace() barrier() - #define preempt_enable_notrace() barrier() -+#define preempt_check_resched_rt() barrier() - #define preemptible() 0 - - #endif /* CONFIG_PREEMPT_COUNT */ ---- a/lib/irq_poll.c -+++ b/lib/irq_poll.c -@@ -37,6 +37,7 @@ void irq_poll_sched(struct irq_poll *iop - list_add_tail(&iop->list, this_cpu_ptr(&blk_cpu_iopoll)); - raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(irq_poll_sched); - -@@ -72,6 +73,7 @@ void irq_poll_complete(struct irq_poll * - local_irq_save(flags); - __irq_poll_complete(iop); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(irq_poll_complete); - -@@ -96,6 +98,7 @@ static void __latent_entropy irq_poll_so - } - - local_irq_enable(); -+ preempt_check_resched_rt(); - - /* Even though interrupts have been re-enabled, this - * access is safe because interrupts can only add new -@@ -133,6 +136,7 @@ static void __latent_entropy irq_poll_so - __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); - - local_irq_enable(); -+ preempt_check_resched_rt(); - } - - /** -@@ -196,6 +200,7 @@ static int irq_poll_cpu_dead(unsigned in - this_cpu_ptr(&blk_cpu_iopoll)); - __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); - local_irq_enable(); -+ preempt_check_resched_rt(); - - return 0; - } ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3041,6 +3041,7 @@ static void __netif_reschedule(struct Qd - sd->output_queue_tailp = &q->next_sched; - raise_softirq_irqoff(NET_TX_SOFTIRQ); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - - void __netif_schedule(struct Qdisc *q) -@@ -3103,6 +3104,7 @@ void __dev_kfree_skb_irq(struct sk_buff - __this_cpu_write(softnet_data.completion_queue, skb); - raise_softirq_irqoff(NET_TX_SOFTIRQ); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(__dev_kfree_skb_irq); - -@@ -4570,6 +4572,7 @@ static int enqueue_to_backlog(struct sk_ - rps_unlock(sd); - - local_irq_restore(flags); -+ preempt_check_resched_rt(); - - atomic_long_inc(&skb->dev->rx_dropped); - kfree_skb(skb); -@@ -6288,12 +6291,14 @@ static void net_rps_action_and_irq_enabl - sd->rps_ipi_list = NULL; - - local_irq_enable(); -+ preempt_check_resched_rt(); - - /* Send pending IPI's to kick RPS processing on remote cpus. */ - net_rps_send_ipi(remsd); - } else - #endif - local_irq_enable(); -+ preempt_check_resched_rt(); - } - - static bool sd_has_rps_ipi_waiting(struct softnet_data *sd) -@@ -6371,6 +6376,7 @@ void __napi_schedule(struct napi_struct - local_irq_save(flags); - ____napi_schedule(this_cpu_ptr(&softnet_data), n); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(__napi_schedule); - -@@ -10980,6 +10986,7 @@ static int dev_cpu_dead(unsigned int old - - raise_softirq_irqoff(NET_TX_SOFTIRQ); - local_irq_enable(); -+ preempt_check_resched_rt(); - - #ifdef CONFIG_RPS - remsd = oldsd->rps_ipi_list; diff --git a/kernel/patches-5.11.x-rt/0141-softirq-disable-softirq-stacks-for-rt.patch b/kernel/patches-5.11.x-rt/0141-softirq-disable-softirq-stacks-for-rt.patch deleted file mode 100644 index 4c06e1e276..0000000000 --- a/kernel/patches-5.11.x-rt/0141-softirq-disable-softirq-stacks-for-rt.patch +++ /dev/null @@ -1,147 +0,0 @@ -Subject: softirq: Disable softirq stacks for RT -From: Thomas Gleixner -Date: Mon, 18 Jul 2011 13:59:17 +0200 - -Disable extra stacks for softirqs. We want to preempt softirqs and -having them on special IRQ-stack does not make this easier. - -Signed-off-by: Thomas Gleixner ---- - arch/powerpc/kernel/irq.c | 2 ++ - arch/powerpc/kernel/misc_32.S | 2 ++ - arch/powerpc/kernel/misc_64.S | 2 ++ - arch/sh/kernel/irq.c | 2 ++ - arch/sparc/kernel/irq_64.c | 2 ++ - arch/x86/kernel/irq_32.c | 2 ++ - arch/x86/kernel/irq_64.c | 2 ++ - include/linux/interrupt.h | 2 +- - 8 files changed, 15 insertions(+), 1 deletion(-) - ---- a/arch/powerpc/kernel/irq.c -+++ b/arch/powerpc/kernel/irq.c -@@ -753,10 +753,12 @@ void *mcheckirq_ctx[NR_CPUS] __read_most - void *softirq_ctx[NR_CPUS] __read_mostly; - void *hardirq_ctx[NR_CPUS] __read_mostly; - -+#ifndef CONFIG_PREEMPT_RT - void do_softirq_own_stack(void) - { - call_do_softirq(softirq_ctx[smp_processor_id()]); - } -+#endif - - irq_hw_number_t virq_to_hw(unsigned int virq) - { ---- a/arch/powerpc/kernel/misc_32.S -+++ b/arch/powerpc/kernel/misc_32.S -@@ -31,6 +31,7 @@ - * We store the saved ksp_limit in the unused part - * of the STACK_FRAME_OVERHEAD - */ -+#ifndef CONFIG_PREEMPT_RT - _GLOBAL(call_do_softirq) - mflr r0 - stw r0,4(r1) -@@ -46,6 +47,7 @@ - stw r10,THREAD+KSP_LIMIT(r2) - mtlr r0 - blr -+#endif - - /* - * void call_do_irq(struct pt_regs *regs, void *sp); ---- a/arch/powerpc/kernel/misc_64.S -+++ b/arch/powerpc/kernel/misc_64.S -@@ -27,6 +27,7 @@ - - .text - -+#ifndef CONFIG_PREEMPT_RT - _GLOBAL(call_do_softirq) - mflr r0 - std r0,16(r1) -@@ -37,6 +38,7 @@ - ld r0,16(r1) - mtlr r0 - blr -+#endif - - _GLOBAL(call_do_irq) - mflr r0 ---- a/arch/sh/kernel/irq.c -+++ b/arch/sh/kernel/irq.c -@@ -148,6 +148,7 @@ void irq_ctx_exit(int cpu) - hardirq_ctx[cpu] = NULL; - } - -+#ifndef CONFIG_PREEMPT_RT - void do_softirq_own_stack(void) - { - struct thread_info *curctx; -@@ -175,6 +176,7 @@ void do_softirq_own_stack(void) - "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr" - ); - } -+#endif - #else - static inline void handle_one_irq(unsigned int irq) - { ---- a/arch/sparc/kernel/irq_64.c -+++ b/arch/sparc/kernel/irq_64.c -@@ -854,6 +854,7 @@ void __irq_entry handler_irq(int pil, st - set_irq_regs(old_regs); - } - -+#ifndef CONFIG_PREEMPT_RT - void do_softirq_own_stack(void) - { - void *orig_sp, *sp = softirq_stack[smp_processor_id()]; -@@ -868,6 +869,7 @@ void do_softirq_own_stack(void) - __asm__ __volatile__("mov %0, %%sp" - : : "r" (orig_sp)); - } -+#endif - - #ifdef CONFIG_HOTPLUG_CPU - void fixup_irqs(void) ---- a/arch/x86/kernel/irq_32.c -+++ b/arch/x86/kernel/irq_32.c -@@ -131,6 +131,7 @@ int irq_init_percpu_irqstack(unsigned in - return 0; - } - -+#ifndef CONFIG_PREEMPT_RT - void do_softirq_own_stack(void) - { - struct irq_stack *irqstk; -@@ -147,6 +148,7 @@ void do_softirq_own_stack(void) - - call_on_stack(__do_softirq, isp); - } -+#endif - - void __handle_irq(struct irq_desc *desc, struct pt_regs *regs) - { ---- a/arch/x86/kernel/irq_64.c -+++ b/arch/x86/kernel/irq_64.c -@@ -72,7 +72,9 @@ int irq_init_percpu_irqstack(unsigned in - return map_irq_stack(cpu); - } - -+#ifndef CONFIG_PREEMPT_RT - void do_softirq_own_stack(void) - { - run_on_irqstack_cond(__do_softirq, NULL); - } -+#endif ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -569,7 +569,7 @@ struct softirq_action - asmlinkage void do_softirq(void); - asmlinkage void __do_softirq(void); - --#ifdef __ARCH_HAS_DO_SOFTIRQ -+#if defined(__ARCH_HAS_DO_SOFTIRQ) && !defined(CONFIG_PREEMPT_RT) - void do_softirq_own_stack(void); - #else - static inline void do_softirq_own_stack(void) diff --git a/kernel/patches-5.11.x-rt/0142-net-core-use-local_bh_disable-in-netif_rx_ni.patch b/kernel/patches-5.11.x-rt/0142-net-core-use-local_bh_disable-in-netif_rx_ni.patch deleted file mode 100644 index d3d47d8d43..0000000000 --- a/kernel/patches-5.11.x-rt/0142-net-core-use-local_bh_disable-in-netif_rx_ni.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 16 Jun 2017 19:03:16 +0200 -Subject: [PATCH] net/core: use local_bh_disable() in netif_rx_ni() - -In 2004 netif_rx_ni() gained a preempt_disable() section around -netif_rx() and its do_softirq() + testing for it. The do_softirq() part -is required because netif_rx() raises the softirq but does not invoke -it. The preempt_disable() is required to remain on the same CPU which added the -skb to the per-CPU list. -All this can be avoided be putting this into a local_bh_disable()ed -section. The local_bh_enable() part will invoke do_softirq() if -required. - -Signed-off-by: Sebastian Andrzej Siewior ---- - net/core/dev.c | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -4844,11 +4844,9 @@ int netif_rx_ni(struct sk_buff *skb) - - trace_netif_rx_ni_entry(skb); - -- preempt_disable(); -+ local_bh_disable(); - err = netif_rx_internal(skb); -- if (local_softirq_pending()) -- do_softirq(); -- preempt_enable(); -+ local_bh_enable(); - trace_netif_rx_ni_exit(err); - - return err; diff --git a/kernel/patches-5.11.x-rt/0143-pid.h-include-atomic.h.patch b/kernel/patches-5.11.x-rt/0143-pid.h-include-atomic.h.patch deleted file mode 100644 index 6668bde604..0000000000 --- a/kernel/patches-5.11.x-rt/0143-pid.h-include-atomic.h.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: Grygorii Strashko -Date: Tue, 21 Jul 2015 19:43:56 +0300 -Subject: pid.h: include atomic.h - -This patch fixes build error: - CC kernel/pid_namespace.o -In file included from kernel/pid_namespace.c:11:0: -include/linux/pid.h: In function 'get_pid': -include/linux/pid.h:78:3: error: implicit declaration of function 'atomic_inc' [-Werror=implicit-function-declaration] - atomic_inc(&pid->count); - ^ -which happens when - CONFIG_PROVE_LOCKING=n - CONFIG_DEBUG_SPINLOCK=n - CONFIG_DEBUG_MUTEXES=n - CONFIG_DEBUG_LOCK_ALLOC=n - CONFIG_PID_NS=y - -Vanilla gets this via spinlock.h. - -Signed-off-by: Grygorii Strashko -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/pid.h | 1 + - 1 file changed, 1 insertion(+) - ---- a/include/linux/pid.h -+++ b/include/linux/pid.h -@@ -3,6 +3,7 @@ - #define _LINUX_PID_H - - #include -+#include - #include - #include - diff --git a/kernel/patches-5.11.x-rt/0144-ptrace-fix-ptrace-vs-tasklist_lock-race.patch b/kernel/patches-5.11.x-rt/0144-ptrace-fix-ptrace-vs-tasklist_lock-race.patch deleted file mode 100644 index 3e504968fa..0000000000 --- a/kernel/patches-5.11.x-rt/0144-ptrace-fix-ptrace-vs-tasklist_lock-race.patch +++ /dev/null @@ -1,155 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 29 Aug 2013 18:21:04 +0200 -Subject: ptrace: fix ptrace vs tasklist_lock race - -As explained by Alexander Fyodorov : - -|read_lock(&tasklist_lock) in ptrace_stop() is converted to mutex on RT kernel, -|and it can remove __TASK_TRACED from task->state (by moving it to -|task->saved_state). If parent does wait() on child followed by a sys_ptrace -|call, the following race can happen: -| -|- child sets __TASK_TRACED in ptrace_stop() -|- parent does wait() which eventually calls wait_task_stopped() and returns -| child's pid -|- child blocks on read_lock(&tasklist_lock) in ptrace_stop() and moves -| __TASK_TRACED flag to saved_state -|- parent calls sys_ptrace, which calls ptrace_check_attach() and wait_task_inactive() - -The patch is based on his initial patch where an additional check is -added in case the __TASK_TRACED moved to ->saved_state. The pi_lock is -taken in case the caller is interrupted between looking into ->state and -->saved_state. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/sched.h | 49 +++++++++++++++++++++++++++++++++++++++++++++---- - kernel/ptrace.c | 9 ++++++++- - kernel/sched/core.c | 17 +++++++++++++++-- - 3 files changed, 68 insertions(+), 7 deletions(-) - ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -112,12 +112,8 @@ struct io_uring_task; - __TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \ - TASK_PARKED) - --#define task_is_traced(task) ((task->state & __TASK_TRACED) != 0) -- - #define task_is_stopped(task) ((task->state & __TASK_STOPPED) != 0) - --#define task_is_stopped_or_traced(task) ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) -- - #ifdef CONFIG_DEBUG_ATOMIC_SLEEP - - /* -@@ -1881,6 +1877,51 @@ static inline int test_tsk_need_resched( - return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); - } - -+static inline bool __task_is_stopped_or_traced(struct task_struct *task) -+{ -+ if (task->state & (__TASK_STOPPED | __TASK_TRACED)) -+ return true; -+#ifdef CONFIG_PREEMPT_RT -+ if (task->saved_state & (__TASK_STOPPED | __TASK_TRACED)) -+ return true; -+#endif -+ return false; -+} -+ -+static inline bool task_is_stopped_or_traced(struct task_struct *task) -+{ -+ bool traced_stopped; -+ -+#ifdef CONFIG_PREEMPT_RT -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&task->pi_lock, flags); -+ traced_stopped = __task_is_stopped_or_traced(task); -+ raw_spin_unlock_irqrestore(&task->pi_lock, flags); -+#else -+ traced_stopped = __task_is_stopped_or_traced(task); -+#endif -+ return traced_stopped; -+} -+ -+static inline bool task_is_traced(struct task_struct *task) -+{ -+ bool traced = false; -+ -+ if (task->state & __TASK_TRACED) -+ return true; -+#ifdef CONFIG_PREEMPT_RT -+ /* in case the task is sleeping on tasklist_lock */ -+ raw_spin_lock_irq(&task->pi_lock); -+ if (task->state & __TASK_TRACED) -+ traced = true; -+ else if (task->saved_state & __TASK_TRACED) -+ traced = true; -+ raw_spin_unlock_irq(&task->pi_lock); -+#endif -+ return traced; -+} -+ - /* - * cond_resched() and cond_resched_lock(): latency reduction via - * explicit rescheduling in places that are safe. The return ---- a/kernel/ptrace.c -+++ b/kernel/ptrace.c -@@ -180,7 +180,14 @@ static bool ptrace_freeze_traced(struct - - spin_lock_irq(&task->sighand->siglock); - if (task_is_traced(task) && !__fatal_signal_pending(task)) { -- task->state = __TASK_TRACED; -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&task->pi_lock, flags); -+ if (task->state & __TASK_TRACED) -+ task->state = __TASK_TRACED; -+ else -+ task->saved_state = __TASK_TRACED; -+ raw_spin_unlock_irqrestore(&task->pi_lock, flags); - ret = true; - } - spin_unlock_irq(&task->sighand->siglock); ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -2598,6 +2598,18 @@ int migrate_swap(struct task_struct *cur - } - #endif /* CONFIG_NUMA_BALANCING */ - -+static bool check_task_state(struct task_struct *p, long match_state) -+{ -+ bool match = false; -+ -+ raw_spin_lock_irq(&p->pi_lock); -+ if (p->state == match_state || p->saved_state == match_state) -+ match = true; -+ raw_spin_unlock_irq(&p->pi_lock); -+ -+ return match; -+} -+ - /* - * wait_task_inactive - wait for a thread to unschedule. - * -@@ -2642,7 +2654,7 @@ unsigned long wait_task_inactive(struct - * is actually now running somewhere else! - */ - while (task_running(rq, p)) { -- if (match_state && unlikely(p->state != match_state)) -+ if (match_state && !check_task_state(p, match_state)) - return 0; - cpu_relax(); - } -@@ -2657,7 +2669,8 @@ unsigned long wait_task_inactive(struct - running = task_running(rq, p); - queued = task_on_rq_queued(p); - ncsw = 0; -- if (!match_state || p->state == match_state) -+ if (!match_state || p->state == match_state || -+ p->saved_state == match_state) - ncsw = p->nvcsw | LONG_MIN; /* sets MSB */ - task_rq_unlock(rq, p, &rf); - diff --git a/kernel/patches-5.11.x-rt/0145-ptrace-fix-ptrace_unfreeze_traced-race-with-rt-lock.patch b/kernel/patches-5.11.x-rt/0145-ptrace-fix-ptrace_unfreeze_traced-race-with-rt-lock.patch deleted file mode 100644 index eab4267192..0000000000 --- a/kernel/patches-5.11.x-rt/0145-ptrace-fix-ptrace_unfreeze_traced-race-with-rt-lock.patch +++ /dev/null @@ -1,57 +0,0 @@ -From: Oleg Nesterov -Date: Tue, 3 Nov 2020 12:39:01 +0100 -Subject: [PATCH] ptrace: fix ptrace_unfreeze_traced() race with rt-lock - -The patch "ptrace: fix ptrace vs tasklist_lock race" changed -ptrace_freeze_traced() to take task->saved_state into account, but -ptrace_unfreeze_traced() has the same problem and needs a similar fix: -it should check/update both ->state and ->saved_state. - -Reported-by: Luis Claudio R. Goncalves -Fixes: "ptrace: fix ptrace vs tasklist_lock race" -Signed-off-by: Oleg Nesterov -Signed-off-by: Sebastian Andrzej Siewior -Cc: stable-rt@vger.kernel.org ---- - kernel/ptrace.c | 23 +++++++++++++++-------- - 1 file changed, 15 insertions(+), 8 deletions(-) - ---- a/kernel/ptrace.c -+++ b/kernel/ptrace.c -@@ -197,8 +197,8 @@ static bool ptrace_freeze_traced(struct - - static void ptrace_unfreeze_traced(struct task_struct *task) - { -- if (task->state != __TASK_TRACED) -- return; -+ unsigned long flags; -+ bool frozen = true; - - WARN_ON(!task->ptrace || task->parent != current); - -@@ -207,12 +207,19 @@ static void ptrace_unfreeze_traced(struc - * Recheck state under the lock to close this race. - */ - spin_lock_irq(&task->sighand->siglock); -- if (task->state == __TASK_TRACED) { -- if (__fatal_signal_pending(task)) -- wake_up_state(task, __TASK_TRACED); -- else -- task->state = TASK_TRACED; -- } -+ -+ raw_spin_lock_irqsave(&task->pi_lock, flags); -+ if (task->state == __TASK_TRACED) -+ task->state = TASK_TRACED; -+ else if (task->saved_state == __TASK_TRACED) -+ task->saved_state = TASK_TRACED; -+ else -+ frozen = false; -+ raw_spin_unlock_irqrestore(&task->pi_lock, flags); -+ -+ if (frozen && __fatal_signal_pending(task)) -+ wake_up_state(task, __TASK_TRACED); -+ - spin_unlock_irq(&task->sighand->siglock); - } - diff --git a/kernel/patches-5.11.x-rt/0146-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch b/kernel/patches-5.11.x-rt/0146-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch deleted file mode 100644 index 84c66fb9d5..0000000000 --- a/kernel/patches-5.11.x-rt/0146-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch +++ /dev/null @@ -1,116 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 19 Nov 2019 09:25:04 +0100 -Subject: [PATCH] locking: Make spinlock_t and rwlock_t a RCU section on RT - -On !RT a locked spinlock_t and rwlock_t disables preemption which -implies a RCU read section. There is code that relies on that behaviour. - -Add an explicit RCU read section on RT while a sleeping lock (a lock -which would disables preemption on !RT) acquired. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 6 ++++++ - kernel/locking/rwlock-rt.c | 6 ++++++ - 2 files changed, 12 insertions(+) - ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1136,6 +1136,7 @@ void __lockfunc rt_spin_lock(spinlock_t - { - spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); - rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -+ rcu_read_lock(); - migrate_disable(); - } - EXPORT_SYMBOL(rt_spin_lock); -@@ -1150,6 +1151,7 @@ void __lockfunc rt_spin_lock_nested(spin - { - spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); - rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -+ rcu_read_lock(); - migrate_disable(); - } - EXPORT_SYMBOL(rt_spin_lock_nested); -@@ -1159,6 +1161,7 @@ void __lockfunc rt_spin_lock_nest_lock(s - { - spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); - rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -+ rcu_read_lock(); - migrate_disable(); - } - EXPORT_SYMBOL(rt_spin_lock_nest_lock); -@@ -1169,6 +1172,7 @@ void __lockfunc rt_spin_unlock(spinlock_ - /* NOTE: we always pass in '1' for nested, for simplicity */ - spin_release(&lock->dep_map, _RET_IP_); - migrate_enable(); -+ rcu_read_unlock(); - rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); - } - EXPORT_SYMBOL(rt_spin_unlock); -@@ -1198,6 +1202,7 @@ int __lockfunc rt_spin_trylock(spinlock_ - ret = __rt_mutex_trylock(&lock->lock); - if (ret) { - spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ rcu_read_lock(); - migrate_disable(); - } - return ret; -@@ -1212,6 +1217,7 @@ int __lockfunc rt_spin_trylock_bh(spinlo - ret = __rt_mutex_trylock(&lock->lock); - if (ret) { - spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ rcu_read_lock(); - migrate_disable(); - } else { - local_bh_enable(); ---- a/kernel/locking/rwlock-rt.c -+++ b/kernel/locking/rwlock-rt.c -@@ -270,6 +270,7 @@ int __lockfunc rt_read_trylock(rwlock_t - ret = __read_rt_trylock(rwlock); - if (ret) { - rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); -+ rcu_read_lock(); - migrate_disable(); - } - return ret; -@@ -283,6 +284,7 @@ int __lockfunc rt_write_trylock(rwlock_t - ret = __write_rt_trylock(rwlock); - if (ret) { - rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); -+ rcu_read_lock(); - migrate_disable(); - } - return ret; -@@ -293,6 +295,7 @@ void __lockfunc rt_read_lock(rwlock_t *r - { - rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); - __read_rt_lock(rwlock); -+ rcu_read_lock(); - migrate_disable(); - } - EXPORT_SYMBOL(rt_read_lock); -@@ -301,6 +304,7 @@ void __lockfunc rt_write_lock(rwlock_t * - { - rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); - __write_rt_lock(rwlock); -+ rcu_read_lock(); - migrate_disable(); - } - EXPORT_SYMBOL(rt_write_lock); -@@ -309,6 +313,7 @@ void __lockfunc rt_read_unlock(rwlock_t - { - rwlock_release(&rwlock->dep_map, _RET_IP_); - migrate_enable(); -+ rcu_read_unlock(); - __read_rt_unlock(rwlock); - } - EXPORT_SYMBOL(rt_read_unlock); -@@ -317,6 +322,7 @@ void __lockfunc rt_write_unlock(rwlock_t - { - rwlock_release(&rwlock->dep_map, _RET_IP_); - migrate_enable(); -+ rcu_read_unlock(); - __write_rt_unlock(rwlock); - } - EXPORT_SYMBOL(rt_write_unlock); diff --git a/kernel/patches-5.11.x-rt/0147-rcutorture-Avoid-problematic-critical-section-nestin.patch b/kernel/patches-5.11.x-rt/0147-rcutorture-Avoid-problematic-critical-section-nestin.patch deleted file mode 100644 index c908297d73..0000000000 --- a/kernel/patches-5.11.x-rt/0147-rcutorture-Avoid-problematic-critical-section-nestin.patch +++ /dev/null @@ -1,189 +0,0 @@ -From: Scott Wood -Date: Wed, 11 Sep 2019 17:57:29 +0100 -Subject: [PATCH] rcutorture: Avoid problematic critical section nesting - on RT - -rcutorture was generating some nesting scenarios that are not -reasonable. Constrain the state selection to avoid them. - -Example #1: - -1. preempt_disable() -2. local_bh_disable() -3. preempt_enable() -4. local_bh_enable() - -On PREEMPT_RT, BH disabling takes a local lock only when called in -non-atomic context. Thus, atomic context must be retained until after BH -is re-enabled. Likewise, if BH is initially disabled in non-atomic -context, it cannot be re-enabled in atomic context. - -Example #2: - -1. rcu_read_lock() -2. local_irq_disable() -3. rcu_read_unlock() -4. local_irq_enable() - -If the thread is preempted between steps 1 and 2, -rcu_read_unlock_special.b.blocked will be set, but it won't be -acted on in step 3 because IRQs are disabled. Thus, reporting of the -quiescent state will be delayed beyond the local_irq_enable(). - -For now, these scenarios will continue to be tested on non-PREEMPT_RT -kernels, until debug checks are added to ensure that they are not -happening elsewhere. - -Signed-off-by: Scott Wood -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/rcu/rcutorture.c | 97 +++++++++++++++++++++++++++++++++++++++++------- - 1 file changed, 83 insertions(+), 14 deletions(-) - ---- a/kernel/rcu/rcutorture.c -+++ b/kernel/rcu/rcutorture.c -@@ -61,10 +61,13 @@ MODULE_AUTHOR("Paul E. McKenney > RCUTORTURE_RDR_SHIFT) > 1); - rtrsp->rt_readstate = newstate; - -- /* First, put new protection in place to avoid critical-section gap. */ -+ /* -+ * First, put new protection in place to avoid critical-section gap. -+ * Disable preemption around the ATOM disables to ensure that -+ * in_atomic() is true. -+ */ - if (statesnew & RCUTORTURE_RDR_BH) - local_bh_disable(); -+ if (statesnew & RCUTORTURE_RDR_RBH) -+ rcu_read_lock_bh(); - if (statesnew & RCUTORTURE_RDR_IRQ) - local_irq_disable(); - if (statesnew & RCUTORTURE_RDR_PREEMPT) - preempt_disable(); -- if (statesnew & RCUTORTURE_RDR_RBH) -- rcu_read_lock_bh(); - if (statesnew & RCUTORTURE_RDR_SCHED) - rcu_read_lock_sched(); -+ preempt_disable(); -+ if (statesnew & RCUTORTURE_RDR_ATOM_BH) -+ local_bh_disable(); -+ if (statesnew & RCUTORTURE_RDR_ATOM_RBH) -+ rcu_read_lock_bh(); -+ preempt_enable(); - if (statesnew & RCUTORTURE_RDR_RCU) - idxnew = cur_ops->readlock() << RCUTORTURE_RDR_SHIFT; - -- /* Next, remove old protection, irq first due to bh conflict. */ -+ /* -+ * Next, remove old protection, in decreasing order of strength -+ * to avoid unlock paths that aren't safe in the stronger -+ * context. Disable preemption around the ATOM enables in -+ * case the context was only atomic due to IRQ disabling. -+ */ -+ preempt_disable(); - if (statesold & RCUTORTURE_RDR_IRQ) - local_irq_enable(); -- if (statesold & RCUTORTURE_RDR_BH) -+ if (statesold & RCUTORTURE_RDR_ATOM_BH) - local_bh_enable(); -+ if (statesold & RCUTORTURE_RDR_ATOM_RBH) -+ rcu_read_unlock_bh(); -+ preempt_enable(); - if (statesold & RCUTORTURE_RDR_PREEMPT) - preempt_enable(); -- if (statesold & RCUTORTURE_RDR_RBH) -- rcu_read_unlock_bh(); - if (statesold & RCUTORTURE_RDR_SCHED) - rcu_read_unlock_sched(); -+ if (statesold & RCUTORTURE_RDR_BH) -+ local_bh_enable(); -+ if (statesold & RCUTORTURE_RDR_RBH) -+ rcu_read_unlock_bh(); -+ - if (statesold & RCUTORTURE_RDR_RCU) { - bool lockit = !statesnew && !(torture_random(trsp) & 0xffff); - -@@ -1317,6 +1342,12 @@ rcutorture_extend_mask(int oldmask, stru - int mask = rcutorture_extend_mask_max(); - unsigned long randmask1 = torture_random(trsp) >> 8; - unsigned long randmask2 = randmask1 >> 3; -+ unsigned long preempts = RCUTORTURE_RDR_PREEMPT | RCUTORTURE_RDR_SCHED; -+ unsigned long preempts_irq = preempts | RCUTORTURE_RDR_IRQ; -+ unsigned long nonatomic_bhs = RCUTORTURE_RDR_BH | RCUTORTURE_RDR_RBH; -+ unsigned long atomic_bhs = RCUTORTURE_RDR_ATOM_BH | -+ RCUTORTURE_RDR_ATOM_RBH; -+ unsigned long tmp; - - WARN_ON_ONCE(mask >> RCUTORTURE_RDR_SHIFT); - /* Mostly only one bit (need preemption!), sometimes lots of bits. */ -@@ -1324,11 +1355,49 @@ rcutorture_extend_mask(int oldmask, stru - mask = mask & randmask2; - else - mask = mask & (1 << (randmask2 % RCUTORTURE_RDR_NBITS)); -- /* Can't enable bh w/irq disabled. */ -- if ((mask & RCUTORTURE_RDR_IRQ) && -- ((!(mask & RCUTORTURE_RDR_BH) && (oldmask & RCUTORTURE_RDR_BH)) || -- (!(mask & RCUTORTURE_RDR_RBH) && (oldmask & RCUTORTURE_RDR_RBH)))) -- mask |= RCUTORTURE_RDR_BH | RCUTORTURE_RDR_RBH; -+ -+ /* -+ * Can't enable bh w/irq disabled. -+ */ -+ tmp = atomic_bhs | nonatomic_bhs; -+ if (mask & RCUTORTURE_RDR_IRQ) -+ mask |= oldmask & tmp; -+ -+ /* -+ * Ideally these sequences would be detected in debug builds -+ * (regardless of RT), but until then don't stop testing -+ * them on non-RT. -+ */ -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) { -+ /* -+ * Can't release the outermost rcu lock in an irq disabled -+ * section without preemption also being disabled, if irqs -+ * had ever been enabled during this RCU critical section -+ * (could leak a special flag and delay reporting the qs). -+ */ -+ if ((oldmask & RCUTORTURE_RDR_RCU) && -+ (mask & RCUTORTURE_RDR_IRQ) && -+ !(mask & preempts)) -+ mask |= RCUTORTURE_RDR_RCU; -+ -+ /* Can't modify atomic bh in non-atomic context */ -+ if ((oldmask & atomic_bhs) && (mask & atomic_bhs) && -+ !(mask & preempts_irq)) { -+ mask |= oldmask & preempts_irq; -+ if (mask & RCUTORTURE_RDR_IRQ) -+ mask |= oldmask & tmp; -+ } -+ if ((mask & atomic_bhs) && !(mask & preempts_irq)) -+ mask |= RCUTORTURE_RDR_PREEMPT; -+ -+ /* Can't modify non-atomic bh in atomic context */ -+ tmp = nonatomic_bhs; -+ if (oldmask & preempts_irq) -+ mask &= ~tmp; -+ if ((oldmask | mask) & preempts_irq) -+ mask |= oldmask & tmp; -+ } -+ - return mask ?: RCUTORTURE_RDR_RCU; - } - diff --git a/kernel/patches-5.11.x-rt/0148-mm-vmalloc-use-get-cpu-light.patch b/kernel/patches-5.11.x-rt/0148-mm-vmalloc-use-get-cpu-light.patch deleted file mode 100644 index a8e244ba70..0000000000 --- a/kernel/patches-5.11.x-rt/0148-mm-vmalloc-use-get-cpu-light.patch +++ /dev/null @@ -1,65 +0,0 @@ -Subject: mm/vmalloc: Another preempt disable region which sucks -From: Thomas Gleixner -Date: Tue, 12 Jul 2011 11:39:36 +0200 - -Avoid the preempt disable version of get_cpu_var(). The inner-lock should -provide enough serialisation. - -Signed-off-by: Thomas Gleixner ---- - mm/vmalloc.c | 13 ++++++++----- - 1 file changed, 8 insertions(+), 5 deletions(-) - ---- a/mm/vmalloc.c -+++ b/mm/vmalloc.c -@@ -1558,7 +1558,7 @@ static void *new_vmap_block(unsigned int - struct vmap_block *vb; - struct vmap_area *va; - unsigned long vb_idx; -- int node, err; -+ int node, err, cpu; - void *vaddr; - - node = numa_node_id(); -@@ -1595,11 +1595,12 @@ static void *new_vmap_block(unsigned int - return ERR_PTR(err); - } - -- vbq = &get_cpu_var(vmap_block_queue); -+ cpu = get_cpu_light(); -+ vbq = this_cpu_ptr(&vmap_block_queue); - spin_lock(&vbq->lock); - list_add_tail_rcu(&vb->free_list, &vbq->free); - spin_unlock(&vbq->lock); -- put_cpu_var(vmap_block_queue); -+ put_cpu_light(); - - return vaddr; - } -@@ -1664,6 +1665,7 @@ static void *vb_alloc(unsigned long size - struct vmap_block *vb; - void *vaddr = NULL; - unsigned int order; -+ int cpu; - - BUG_ON(offset_in_page(size)); - BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); -@@ -1678,7 +1680,8 @@ static void *vb_alloc(unsigned long size - order = get_order(size); - - rcu_read_lock(); -- vbq = &get_cpu_var(vmap_block_queue); -+ cpu = get_cpu_light(); -+ vbq = this_cpu_ptr(&vmap_block_queue); - list_for_each_entry_rcu(vb, &vbq->free, free_list) { - unsigned long pages_off; - -@@ -1701,7 +1704,7 @@ static void *vb_alloc(unsigned long size - break; - } - -- put_cpu_var(vmap_block_queue); -+ put_cpu_light(); - rcu_read_unlock(); - - /* Allocate new block if nothing was found */ diff --git a/kernel/patches-5.11.x-rt/0149-block-mq-drop-preempt-disable.patch b/kernel/patches-5.11.x-rt/0149-block-mq-drop-preempt-disable.patch deleted file mode 100644 index 5968396912..0000000000 --- a/kernel/patches-5.11.x-rt/0149-block-mq-drop-preempt-disable.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: block/mq: do not invoke preempt_disable() - -preempt_disable() and get_cpu() don't play well together with the sleeping -locks it tries to allocate later. -It seems to be enough to replace it with get_cpu_light() and migrate_disable(). - -Signed-off-by: Sebastian Andrzej Siewior ---- - block/blk-mq.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/block/blk-mq.c -+++ b/block/blk-mq.c -@@ -1560,14 +1560,14 @@ static void __blk_mq_delay_run_hw_queue( - return; - - if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) { -- int cpu = get_cpu(); -+ int cpu = get_cpu_light(); - if (cpumask_test_cpu(cpu, hctx->cpumask)) { - __blk_mq_run_hw_queue(hctx); -- put_cpu(); -+ put_cpu_light(); - return; - } - -- put_cpu(); -+ put_cpu_light(); - } - - kblockd_mod_delayed_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work, diff --git a/kernel/patches-5.11.x-rt/0150-md-raid5-percpu-handling-rt-aware.patch b/kernel/patches-5.11.x-rt/0150-md-raid5-percpu-handling-rt-aware.patch deleted file mode 100644 index f5ac873076..0000000000 --- a/kernel/patches-5.11.x-rt/0150-md-raid5-percpu-handling-rt-aware.patch +++ /dev/null @@ -1,61 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 6 Apr 2010 16:51:31 +0200 -Subject: md: raid5: Make raid5_percpu handling RT aware - -__raid_run_ops() disables preemption with get_cpu() around the access -to the raid5_percpu variables. That causes scheduling while atomic -spews on RT. - -Serialize the access to the percpu data with a lock and keep the code -preemptible. - -Reported-by: Udo van den Heuvel -Signed-off-by: Thomas Gleixner -Tested-by: Udo van den Heuvel - ---- - drivers/md/raid5.c | 7 +++++-- - drivers/md/raid5.h | 1 + - 2 files changed, 6 insertions(+), 2 deletions(-) - ---- a/drivers/md/raid5.c -+++ b/drivers/md/raid5.c -@@ -2216,8 +2216,9 @@ static void raid_run_ops(struct stripe_h - struct raid5_percpu *percpu; - unsigned long cpu; - -- cpu = get_cpu(); -+ cpu = get_cpu_light(); - percpu = per_cpu_ptr(conf->percpu, cpu); -+ spin_lock(&percpu->lock); - if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) { - ops_run_biofill(sh); - overlap_clear++; -@@ -2276,7 +2277,8 @@ static void raid_run_ops(struct stripe_h - if (test_and_clear_bit(R5_Overlap, &dev->flags)) - wake_up(&sh->raid_conf->wait_for_overlap); - } -- put_cpu(); -+ spin_unlock(&percpu->lock); -+ put_cpu_light(); - } - - static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh) -@@ -7097,6 +7099,7 @@ static int raid456_cpu_up_prepare(unsign - __func__, cpu); - return -ENOMEM; - } -+ spin_lock_init(&per_cpu_ptr(conf->percpu, cpu)->lock); - return 0; - } - ---- a/drivers/md/raid5.h -+++ b/drivers/md/raid5.h -@@ -635,6 +635,7 @@ struct r5conf { - int recovery_disabled; - /* per cpu variables */ - struct raid5_percpu { -+ spinlock_t lock; /* Protection for -RT */ - struct page *spare_page; /* Used when checking P/Q in raid6 */ - void *scribble; /* space for constructing buffer - * lists and performing address diff --git a/kernel/patches-5.11.x-rt/0151-scsi-fcoe-rt-aware.patch b/kernel/patches-5.11.x-rt/0151-scsi-fcoe-rt-aware.patch deleted file mode 100644 index 57b40ee0ad..0000000000 --- a/kernel/patches-5.11.x-rt/0151-scsi-fcoe-rt-aware.patch +++ /dev/null @@ -1,105 +0,0 @@ -Subject: scsi/fcoe: Make RT aware. -From: Thomas Gleixner -Date: Sat, 12 Nov 2011 14:00:48 +0100 - -Do not disable preemption while taking sleeping locks. All user look safe -for migrate_diable() only. - -Signed-off-by: Thomas Gleixner ---- - drivers/scsi/fcoe/fcoe.c | 16 ++++++++-------- - drivers/scsi/fcoe/fcoe_ctlr.c | 4 ++-- - drivers/scsi/libfc/fc_exch.c | 4 ++-- - 3 files changed, 12 insertions(+), 12 deletions(-) - ---- a/drivers/scsi/fcoe/fcoe.c -+++ b/drivers/scsi/fcoe/fcoe.c -@@ -1452,11 +1452,11 @@ static int fcoe_rcv(struct sk_buff *skb, - static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen) - { - struct fcoe_percpu_s *fps; -- int rc; -+ int rc, cpu = get_cpu_light(); - -- fps = &get_cpu_var(fcoe_percpu); -+ fps = &per_cpu(fcoe_percpu, cpu); - rc = fcoe_get_paged_crc_eof(skb, tlen, fps); -- put_cpu_var(fcoe_percpu); -+ put_cpu_light(); - - return rc; - } -@@ -1641,11 +1641,11 @@ static inline int fcoe_filter_frames(str - return 0; - } - -- stats = per_cpu_ptr(lport->stats, get_cpu()); -+ stats = per_cpu_ptr(lport->stats, get_cpu_light()); - stats->InvalidCRCCount++; - if (stats->InvalidCRCCount < 5) - printk(KERN_WARNING "fcoe: dropping frame with CRC error\n"); -- put_cpu(); -+ put_cpu_light(); - return -EINVAL; - } - -@@ -1686,7 +1686,7 @@ static void fcoe_recv_frame(struct sk_bu - */ - hp = (struct fcoe_hdr *) skb_network_header(skb); - -- stats = per_cpu_ptr(lport->stats, get_cpu()); -+ stats = per_cpu_ptr(lport->stats, get_cpu_light()); - if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) { - if (stats->ErrorFrames < 5) - printk(KERN_WARNING "fcoe: FCoE version " -@@ -1718,13 +1718,13 @@ static void fcoe_recv_frame(struct sk_bu - goto drop; - - if (!fcoe_filter_frames(lport, fp)) { -- put_cpu(); -+ put_cpu_light(); - fc_exch_recv(lport, fp); - return; - } - drop: - stats->ErrorFrames++; -- put_cpu(); -+ put_cpu_light(); - kfree_skb(skb); - } - ---- a/drivers/scsi/fcoe/fcoe_ctlr.c -+++ b/drivers/scsi/fcoe/fcoe_ctlr.c -@@ -828,7 +828,7 @@ static unsigned long fcoe_ctlr_age_fcfs( - - INIT_LIST_HEAD(&del_list); - -- stats = per_cpu_ptr(fip->lp->stats, get_cpu()); -+ stats = per_cpu_ptr(fip->lp->stats, get_cpu_light()); - - list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { - deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2; -@@ -864,7 +864,7 @@ static unsigned long fcoe_ctlr_age_fcfs( - sel_time = fcf->time; - } - } -- put_cpu(); -+ put_cpu_light(); - - list_for_each_entry_safe(fcf, next, &del_list, list) { - /* Removes fcf from current list */ ---- a/drivers/scsi/libfc/fc_exch.c -+++ b/drivers/scsi/libfc/fc_exch.c -@@ -825,10 +825,10 @@ static struct fc_exch *fc_exch_em_alloc( - } - memset(ep, 0, sizeof(*ep)); - -- cpu = get_cpu(); -+ cpu = get_cpu_light(); - pool = per_cpu_ptr(mp->pool, cpu); - spin_lock_bh(&pool->lock); -- put_cpu(); -+ put_cpu_light(); - - /* peek cache of free slot */ - if (pool->left != FC_XID_UNKNOWN) { diff --git a/kernel/patches-5.11.x-rt/0152-sunrpc-make-svc_xprt_do_enqueue-use-get_cpu_light.patch b/kernel/patches-5.11.x-rt/0152-sunrpc-make-svc_xprt_do_enqueue-use-get_cpu_light.patch deleted file mode 100644 index 41d42ecdb6..0000000000 --- a/kernel/patches-5.11.x-rt/0152-sunrpc-make-svc_xprt_do_enqueue-use-get_cpu_light.patch +++ /dev/null @@ -1,53 +0,0 @@ -From: Mike Galbraith -Date: Wed, 18 Feb 2015 16:05:28 +0100 -Subject: sunrpc: Make svc_xprt_do_enqueue() use get_cpu_light() - -|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:915 -|in_atomic(): 1, irqs_disabled(): 0, pid: 3194, name: rpc.nfsd -|Preemption disabled at:[] svc_xprt_received+0x4b/0xc0 [sunrpc] -|CPU: 6 PID: 3194 Comm: rpc.nfsd Not tainted 3.18.7-rt1 #9 -|Hardware name: MEDION MS-7848/MS-7848, BIOS M7848W08.404 11/06/2014 -| ffff880409630000 ffff8800d9a33c78 ffffffff815bdeb5 0000000000000002 -| 0000000000000000 ffff8800d9a33c98 ffffffff81073c86 ffff880408dd6008 -| ffff880408dd6000 ffff8800d9a33cb8 ffffffff815c3d84 ffff88040b3ac000 -|Call Trace: -| [] dump_stack+0x4f/0x9e -| [] __might_sleep+0xe6/0x150 -| [] rt_spin_lock+0x24/0x50 -| [] svc_xprt_do_enqueue+0x80/0x230 [sunrpc] -| [] svc_xprt_received+0x4b/0xc0 [sunrpc] -| [] svc_add_new_perm_xprt+0x6d/0x80 [sunrpc] -| [] svc_addsock+0x143/0x200 [sunrpc] -| [] write_ports+0x28c/0x340 [nfsd] -| [] nfsctl_transaction_write+0x4c/0x80 [nfsd] -| [] vfs_write+0xb3/0x1d0 -| [] SyS_write+0x49/0xb0 -| [] system_call_fastpath+0x16/0x1b - - -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - net/sunrpc/svc_xprt.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/net/sunrpc/svc_xprt.c -+++ b/net/sunrpc/svc_xprt.c -@@ -422,7 +422,7 @@ void svc_xprt_do_enqueue(struct svc_xprt - if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) - return; - -- cpu = get_cpu(); -+ cpu = get_cpu_light(); - pool = svc_pool_for_cpu(xprt->xpt_server, cpu); - - atomic_long_inc(&pool->sp_stats.packets); -@@ -446,7 +446,7 @@ void svc_xprt_do_enqueue(struct svc_xprt - rqstp = NULL; - out_unlock: - rcu_read_unlock(); -- put_cpu(); -+ put_cpu_light(); - trace_svc_xprt_do_enqueue(xprt, rqstp); - } - EXPORT_SYMBOL_GPL(svc_xprt_do_enqueue); diff --git a/kernel/patches-5.11.x-rt/0153-rt-introduce-cpu-chill.patch b/kernel/patches-5.11.x-rt/0153-rt-introduce-cpu-chill.patch deleted file mode 100644 index 07bc09e92c..0000000000 --- a/kernel/patches-5.11.x-rt/0153-rt-introduce-cpu-chill.patch +++ /dev/null @@ -1,113 +0,0 @@ -Subject: rt: Introduce cpu_chill() -From: Thomas Gleixner -Date: Wed, 07 Mar 2012 20:51:03 +0100 - -Retry loops on RT might loop forever when the modifying side was -preempted. Add cpu_chill() to replace cpu_relax(). cpu_chill() -defaults to cpu_relax() for non RT. On RT it puts the looping task to -sleep for a tick so the preempted task can make progress. - -Steven Rostedt changed it to use a hrtimer instead of msleep(): -| -|Ulrich Obergfell pointed out that cpu_chill() calls msleep() which is woken -|up by the ksoftirqd running the TIMER softirq. But as the cpu_chill() is -|called from softirq context, it may block the ksoftirqd() from running, in -|which case, it may never wake up the msleep() causing the deadlock. - -+ bigeasy later changed to schedule_hrtimeout() -|If a task calls cpu_chill() and gets woken up by a regular or spurious -|wakeup and has a signal pending, then it exits the sleep loop in -|do_nanosleep() and sets up the restart block. If restart->nanosleep.type is -|not TI_NONE then this results in accessing a stale user pointer from a -|previously interrupted syscall and a copy to user based on the stale -|pointer or a BUG() when 'type' is not supported in nanosleep_copyout(). - -+ bigeasy: add PF_NOFREEZE: -| [....] Waiting for /dev to be fully populated... -| ===================================== -| [ BUG: udevd/229 still has locks held! ] -| 3.12.11-rt17 #23 Not tainted -| ------------------------------------- -| 1 lock held by udevd/229: -| #0: (&type->i_mutex_dir_key#2){+.+.+.}, at: lookup_slow+0x28/0x98 -| -| stack backtrace: -| CPU: 0 PID: 229 Comm: udevd Not tainted 3.12.11-rt17 #23 -| (unwind_backtrace+0x0/0xf8) from (show_stack+0x10/0x14) -| (show_stack+0x10/0x14) from (dump_stack+0x74/0xbc) -| (dump_stack+0x74/0xbc) from (do_nanosleep+0x120/0x160) -| (do_nanosleep+0x120/0x160) from (hrtimer_nanosleep+0x90/0x110) -| (hrtimer_nanosleep+0x90/0x110) from (cpu_chill+0x30/0x38) -| (cpu_chill+0x30/0x38) from (dentry_kill+0x158/0x1ec) -| (dentry_kill+0x158/0x1ec) from (dput+0x74/0x15c) -| (dput+0x74/0x15c) from (lookup_real+0x4c/0x50) -| (lookup_real+0x4c/0x50) from (__lookup_hash+0x34/0x44) -| (__lookup_hash+0x34/0x44) from (lookup_slow+0x38/0x98) -| (lookup_slow+0x38/0x98) from (path_lookupat+0x208/0x7fc) -| (path_lookupat+0x208/0x7fc) from (filename_lookup+0x20/0x60) -| (filename_lookup+0x20/0x60) from (user_path_at_empty+0x50/0x7c) -| (user_path_at_empty+0x50/0x7c) from (user_path_at+0x14/0x1c) -| (user_path_at+0x14/0x1c) from (vfs_fstatat+0x48/0x94) -| (vfs_fstatat+0x48/0x94) from (SyS_stat64+0x14/0x30) -| (SyS_stat64+0x14/0x30) from (ret_fast_syscall+0x0/0x48) - -Signed-off-by: Thomas Gleixner -Signed-off-by: Steven Rostedt -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/hrtimer.h | 6 ++++++ - kernel/time/hrtimer.c | 30 ++++++++++++++++++++++++++++++ - 2 files changed, 36 insertions(+) - ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h -@@ -540,4 +540,10 @@ int hrtimers_dead_cpu(unsigned int cpu); - #define hrtimers_dead_cpu NULL - #endif - -+#ifdef CONFIG_PREEMPT_RT -+extern void cpu_chill(void); -+#else -+# define cpu_chill() cpu_relax() -+#endif -+ - #endif ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -1988,6 +1988,36 @@ SYSCALL_DEFINE2(nanosleep_time32, struct - } - #endif - -+#ifdef CONFIG_PREEMPT_RT -+/* -+ * Sleep for 1 ms in hope whoever holds what we want will let it go. -+ */ -+void cpu_chill(void) -+{ -+ unsigned int freeze_flag = current->flags & PF_NOFREEZE; -+ struct task_struct *self = current; -+ ktime_t chill_time; -+ -+ raw_spin_lock_irq(&self->pi_lock); -+ self->saved_state = self->state; -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock_irq(&self->pi_lock); -+ -+ chill_time = ktime_set(0, NSEC_PER_MSEC); -+ -+ current->flags |= PF_NOFREEZE; -+ schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); -+ if (!freeze_flag) -+ current->flags &= ~PF_NOFREEZE; -+ -+ raw_spin_lock_irq(&self->pi_lock); -+ __set_current_state_no_track(self->saved_state); -+ self->saved_state = TASK_RUNNING; -+ raw_spin_unlock_irq(&self->pi_lock); -+} -+EXPORT_SYMBOL(cpu_chill); -+#endif -+ - /* - * Functions related to boot-time initialization: - */ diff --git a/kernel/patches-5.11.x-rt/0154-fs-namespace-use-cpu-chill-in-trylock-loops.patch b/kernel/patches-5.11.x-rt/0154-fs-namespace-use-cpu-chill-in-trylock-loops.patch deleted file mode 100644 index 4ad9bb7f57..0000000000 --- a/kernel/patches-5.11.x-rt/0154-fs-namespace-use-cpu-chill-in-trylock-loops.patch +++ /dev/null @@ -1,38 +0,0 @@ -Subject: fs: namespace: Use cpu_chill() in trylock loops -From: Thomas Gleixner -Date: Wed, 07 Mar 2012 21:00:34 +0100 - -Retry loops on RT might loop forever when the modifying side was -preempted. Use cpu_chill() instead of cpu_relax() to let the system -make progress. - -Signed-off-by: Thomas Gleixner - ---- - fs/namespace.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - ---- a/fs/namespace.c -+++ b/fs/namespace.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -321,8 +322,11 @@ int __mnt_want_write(struct vfsmount *m) - * incremented count after it has set MNT_WRITE_HOLD. - */ - smp_mb(); -- while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) -- cpu_relax(); -+ while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) { -+ preempt_enable(); -+ cpu_chill(); -+ preempt_disable(); -+ } - /* - * After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will - * be set to match its requirements. So we must not load that until diff --git a/kernel/patches-5.11.x-rt/0155-debugobjects-rt.patch b/kernel/patches-5.11.x-rt/0155-debugobjects-rt.patch deleted file mode 100644 index 8e51477754..0000000000 --- a/kernel/patches-5.11.x-rt/0155-debugobjects-rt.patch +++ /dev/null @@ -1,25 +0,0 @@ -Subject: debugobjects: Make RT aware -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 21:41:35 +0200 - -Avoid filling the pool / allocating memory with irqs off(). - -Signed-off-by: Thomas Gleixner ---- - lib/debugobjects.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - ---- a/lib/debugobjects.c -+++ b/lib/debugobjects.c -@@ -557,7 +557,10 @@ static void - struct debug_obj *obj; - unsigned long flags; - -- fill_pool(); -+#ifdef CONFIG_PREEMPT_RT -+ if (preempt_count() == 0 && !irqs_disabled()) -+#endif -+ fill_pool(); - - db = get_bucket((unsigned long) addr); - diff --git a/kernel/patches-5.11.x-rt/0156-skbufhead-raw-lock.patch b/kernel/patches-5.11.x-rt/0156-skbufhead-raw-lock.patch deleted file mode 100644 index 7fdb02ca07..0000000000 --- a/kernel/patches-5.11.x-rt/0156-skbufhead-raw-lock.patch +++ /dev/null @@ -1,65 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 12 Jul 2011 15:38:34 +0200 -Subject: net: Use skbufhead with raw lock - -Use the rps lock as rawlock so we can keep irq-off regions. It looks low -latency. However we can't kfree() from this context therefore we defer this -to the softirq and use the tofree_queue list for it (similar to process_queue). - -Signed-off-by: Thomas Gleixner ---- - include/linux/skbuff.h | 7 +++++++ - net/core/dev.c | 6 +++--- - 2 files changed, 10 insertions(+), 3 deletions(-) - ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -295,6 +295,7 @@ struct sk_buff_head { - - __u32 qlen; - spinlock_t lock; -+ raw_spinlock_t raw_lock; - }; - - struct sk_buff; -@@ -1890,6 +1891,12 @@ static inline void skb_queue_head_init(s - __skb_queue_head_init(list); - } - -+static inline void skb_queue_head_init_raw(struct sk_buff_head *list) -+{ -+ raw_spin_lock_init(&list->raw_lock); -+ __skb_queue_head_init(list); -+} -+ - static inline void skb_queue_head_init_class(struct sk_buff_head *list, - struct lock_class_key *class) - { ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -221,14 +221,14 @@ static inline struct hlist_head *dev_ind - static inline void rps_lock(struct softnet_data *sd) - { - #ifdef CONFIG_RPS -- spin_lock(&sd->input_pkt_queue.lock); -+ raw_spin_lock(&sd->input_pkt_queue.raw_lock); - #endif - } - - static inline void rps_unlock(struct softnet_data *sd) - { - #ifdef CONFIG_RPS -- spin_unlock(&sd->input_pkt_queue.lock); -+ raw_spin_unlock(&sd->input_pkt_queue.raw_lock); - #endif - } - -@@ -11314,7 +11314,7 @@ static int __init net_dev_init(void) - - INIT_WORK(flush, flush_backlog); - -- skb_queue_head_init(&sd->input_pkt_queue); -+ skb_queue_head_init_raw(&sd->input_pkt_queue); - skb_queue_head_init(&sd->process_queue); - #ifdef CONFIG_XFRM_OFFLOAD - skb_queue_head_init(&sd->xfrm_backlog); diff --git a/kernel/patches-5.11.x-rt/0157-net-Dequeue-in-dev_cpu_dead-without-the-lock.patch b/kernel/patches-5.11.x-rt/0157-net-Dequeue-in-dev_cpu_dead-without-the-lock.patch deleted file mode 100644 index 5227a7d52d..0000000000 --- a/kernel/patches-5.11.x-rt/0157-net-Dequeue-in-dev_cpu_dead-without-the-lock.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 16 Sep 2020 16:15:39 +0200 -Subject: [PATCH] net: Dequeue in dev_cpu_dead() without the lock - -Upstream uses skb_dequeue() to acquire lock of `input_pkt_queue'. The reason is -to synchronize against a remote CPU which still thinks that the CPU is online -enqueues packets to this CPU. -There are no guarantees that the packet is enqueued before the callback is run, -it just hope. -RT however complains about an not initialized lock because it uses another lock -for `input_pkt_queue' due to the IRQ-off nature of the context. - -Use the unlocked dequeue version for `input_pkt_queue'. - -Signed-off-by: Sebastian Andrzej Siewior ---- - net/core/dev.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -10998,7 +10998,7 @@ static int dev_cpu_dead(unsigned int old - netif_rx_ni(skb); - input_queue_head_incr(oldsd); - } -- while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) { -+ while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { - netif_rx_ni(skb); - input_queue_head_incr(oldsd); - } diff --git a/kernel/patches-5.11.x-rt/0158-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch b/kernel/patches-5.11.x-rt/0158-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch deleted file mode 100644 index b6a6afcfc8..0000000000 --- a/kernel/patches-5.11.x-rt/0158-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 30 Mar 2016 13:36:29 +0200 -Subject: [PATCH] net: dev: always take qdisc's busylock in __dev_xmit_skb() - -The root-lock is dropped before dev_hard_start_xmit() is invoked and after -setting the __QDISC___STATE_RUNNING bit. If this task is now pushed away -by a task with a higher priority then the task with the higher priority -won't be able to submit packets to the NIC directly instead they will be -enqueued into the Qdisc. The NIC will remain idle until the task(s) with -higher priority leave the CPU and the task with lower priority gets back -and finishes the job. - -If we take always the busylock we ensure that the RT task can boost the -low-prio task and submit the packet. - -Signed-off-by: Sebastian Andrzej Siewior ---- - net/core/dev.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3777,7 +3777,11 @@ static inline int __dev_xmit_skb(struct - * This permits qdisc->running owner to get the lock more - * often and dequeue packets faster. - */ -+#ifdef CONFIG_PREEMPT_RT -+ contended = true; -+#else - contended = qdisc_is_running(q); -+#endif - if (unlikely(contended)) - spin_lock(&q->busylock); - diff --git a/kernel/patches-5.11.x-rt/0159-irqwork-push_most_work_into_softirq_context.patch b/kernel/patches-5.11.x-rt/0159-irqwork-push_most_work_into_softirq_context.patch deleted file mode 100644 index 24c77ea88e..0000000000 --- a/kernel/patches-5.11.x-rt/0159-irqwork-push_most_work_into_softirq_context.patch +++ /dev/null @@ -1,188 +0,0 @@ -Subject: irqwork: push most work into softirq context -From: Sebastian Andrzej Siewior -Date: Tue, 23 Jun 2015 15:32:51 +0200 - -Initially we defered all irqwork into softirq because we didn't want the -latency spikes if perf or another user was busy and delayed the RT task. -The NOHZ trigger (nohz_full_kick_work) was the first user that did not work -as expected if it did not run in the original irqwork context so we had to -bring it back somehow for it. push_irq_work_func is the second one that -requires this. - -This patch adds the IRQ_WORK_HARD_IRQ which makes sure the callback runs -in raw-irq context. Everything else is defered into softirq context. Without --RT we have the orignal behavior. - -This patch incorporates tglx orignal work which revoked a little bringing back -the arch_irq_work_raise() if possible and a few fixes from Steven Rostedt and -Mike Galbraith, - -[bigeasy: melt tglx's irq_work_tick_soft() which splits irq_work_tick() into a - hard and soft variant] -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/irq_work.h | 6 ++++ - kernel/irq_work.c | 69 ++++++++++++++++++++++++++++++++++++++--------- - kernel/sched/topology.c | 3 +- - kernel/time/timer.c | 2 + - 4 files changed, 66 insertions(+), 14 deletions(-) - ---- a/include/linux/irq_work.h -+++ b/include/linux/irq_work.h -@@ -64,4 +64,10 @@ static inline void irq_work_run(void) { - static inline void irq_work_single(void *arg) { } - #endif - -+#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT) -+void irq_work_tick_soft(void); -+#else -+static inline void irq_work_tick_soft(void) { } -+#endif -+ - #endif /* _LINUX_IRQ_WORK_H */ ---- a/kernel/irq_work.c -+++ b/kernel/irq_work.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - - -@@ -52,13 +53,27 @@ void __weak arch_irq_work_raise(void) - /* Enqueue on current CPU, work must already be claimed and preempt disabled */ - static void __irq_work_queue_local(struct irq_work *work) - { -- /* If the work is "lazy", handle it from next tick if any */ -- if (atomic_read(&work->node.a_flags) & IRQ_WORK_LAZY) { -- if (llist_add(&work->node.llist, this_cpu_ptr(&lazy_list)) && -- tick_nohz_tick_stopped()) -- arch_irq_work_raise(); -- } else { -- if (llist_add(&work->node.llist, this_cpu_ptr(&raised_list))) -+ struct llist_head *list; -+ bool lazy_work; -+ int work_flags; -+ -+ work_flags = atomic_read(&work->node.a_flags); -+ if (work_flags & IRQ_WORK_LAZY) -+ lazy_work = true; -+ else if (IS_ENABLED(CONFIG_PREEMPT_RT) && -+ !(work_flags & IRQ_WORK_HARD_IRQ)) -+ lazy_work = true; -+ else -+ lazy_work = false; -+ -+ if (lazy_work) -+ list = this_cpu_ptr(&lazy_list); -+ else -+ list = this_cpu_ptr(&raised_list); -+ -+ if (llist_add(&work->node.llist, list)) { -+ /* If the work is "lazy", handle it from next tick if any */ -+ if (!lazy_work || tick_nohz_tick_stopped()) - arch_irq_work_raise(); - } - } -@@ -102,7 +117,14 @@ bool irq_work_queue_on(struct irq_work * - if (cpu != smp_processor_id()) { - /* Arch remote IPI send/receive backend aren't NMI safe */ - WARN_ON_ONCE(in_nmi()); -- __smp_call_single_queue(cpu, &work->node.llist); -+ -+ if (IS_ENABLED(CONFIG_PREEMPT_RT) && !(atomic_read(&work->node.a_flags) & IRQ_WORK_HARD_IRQ)) { -+ if (llist_add(&work->node.llist, &per_cpu(lazy_list, cpu))) -+ /* && tick_nohz_tick_stopped_cpu(cpu) */ -+ arch_send_call_function_single_ipi(cpu); -+ } else { -+ __smp_call_single_queue(cpu, &work->node.llist); -+ } - } else { - __irq_work_queue_local(work); - } -@@ -120,9 +142,8 @@ bool irq_work_needs_cpu(void) - raised = this_cpu_ptr(&raised_list); - lazy = this_cpu_ptr(&lazy_list); - -- if (llist_empty(raised) || arch_irq_work_has_interrupt()) -- if (llist_empty(lazy)) -- return false; -+ if (llist_empty(raised) && llist_empty(lazy)) -+ return false; - - /* All work should have been flushed before going offline */ - WARN_ON_ONCE(cpu_is_offline(smp_processor_id())); -@@ -165,8 +186,12 @@ static void irq_work_run_list(struct lli - struct irq_work *work, *tmp; - struct llist_node *llnode; - -+#ifndef CONFIG_PREEMPT_RT -+ /* -+ * nort: On RT IRQ-work may run in SOFTIRQ context. -+ */ - BUG_ON(!irqs_disabled()); -- -+#endif - if (llist_empty(list)) - return; - -@@ -182,7 +207,16 @@ static void irq_work_run_list(struct lli - void irq_work_run(void) - { - irq_work_run_list(this_cpu_ptr(&raised_list)); -- irq_work_run_list(this_cpu_ptr(&lazy_list)); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) { -+ /* -+ * NOTE: we raise softirq via IPI for safety, -+ * and execute in irq_work_tick() to move the -+ * overhead from hard to soft irq context. -+ */ -+ if (!llist_empty(this_cpu_ptr(&lazy_list))) -+ raise_softirq(TIMER_SOFTIRQ); -+ } else -+ irq_work_run_list(this_cpu_ptr(&lazy_list)); - } - EXPORT_SYMBOL_GPL(irq_work_run); - -@@ -192,8 +226,17 @@ void irq_work_tick(void) - - if (!llist_empty(raised) && !arch_irq_work_has_interrupt()) - irq_work_run_list(raised); -+ -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) -+ irq_work_run_list(this_cpu_ptr(&lazy_list)); -+} -+ -+#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT) -+void irq_work_tick_soft(void) -+{ - irq_work_run_list(this_cpu_ptr(&lazy_list)); - } -+#endif - - /* - * Synchronize against the irq_work @entry, ensures the entry is not ---- a/kernel/sched/topology.c -+++ b/kernel/sched/topology.c -@@ -526,7 +526,8 @@ static int init_rootdomain(struct root_d - #ifdef HAVE_RT_PUSH_IPI - rd->rto_cpu = -1; - raw_spin_lock_init(&rd->rto_lock); -- init_irq_work(&rd->rto_push_work, rto_push_irq_work_func); -+// init_irq_work(&rd->rto_push_work, rto_push_irq_work_func); -+ rd->rto_push_work = IRQ_WORK_INIT_HARD(rto_push_irq_work_func); - #endif - - rd->visit_gen = 0; ---- a/kernel/time/timer.c -+++ b/kernel/time/timer.c -@@ -1743,6 +1743,8 @@ static __latent_entropy void run_timer_s - { - struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); - -+ irq_work_tick_soft(); -+ - __run_timers(base); - if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) - __run_timers(this_cpu_ptr(&timer_bases[BASE_DEF])); diff --git a/kernel/patches-5.11.x-rt/0160-x86-crypto-reduce-preempt-disabled-regions.patch b/kernel/patches-5.11.x-rt/0160-x86-crypto-reduce-preempt-disabled-regions.patch deleted file mode 100644 index 2136a6cb2a..0000000000 --- a/kernel/patches-5.11.x-rt/0160-x86-crypto-reduce-preempt-disabled-regions.patch +++ /dev/null @@ -1,111 +0,0 @@ -Subject: x86: crypto: Reduce preempt disabled regions -From: Peter Zijlstra -Date: Mon, 14 Nov 2011 18:19:27 +0100 - -Restrict the preempt disabled regions to the actual floating point -operations and enable preemption for the administrative actions. - -This is necessary on RT to avoid that kfree and other operations are -called with preemption disabled. - -Reported-and-tested-by: Carsten Emde -Signed-off-by: Peter Zijlstra - -Signed-off-by: Thomas Gleixner ---- - arch/x86/crypto/aesni-intel_glue.c | 22 ++++++++++++---------- - 1 file changed, 12 insertions(+), 10 deletions(-) - ---- a/arch/x86/crypto/aesni-intel_glue.c -+++ b/arch/x86/crypto/aesni-intel_glue.c -@@ -376,14 +376,14 @@ static int ecb_encrypt(struct skcipher_r - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes)) { -+ kernel_fpu_begin(); - aesni_ecb_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } -- kernel_fpu_end(); - - return err; - } -@@ -398,14 +398,14 @@ static int ecb_decrypt(struct skcipher_r - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes)) { -+ kernel_fpu_begin(); - aesni_ecb_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } -- kernel_fpu_end(); - - return err; - } -@@ -420,14 +420,14 @@ static int cbc_encrypt(struct skcipher_r - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes)) { -+ kernel_fpu_begin(); - aesni_cbc_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK, walk.iv); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } -- kernel_fpu_end(); - - return err; - } -@@ -442,14 +442,14 @@ static int cbc_decrypt(struct skcipher_r - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes)) { -+ kernel_fpu_begin(); - aesni_cbc_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK, walk.iv); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } -- kernel_fpu_end(); - - return err; - } -@@ -497,18 +497,20 @@ static int ctr_crypt(struct skcipher_req - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) { -+ kernel_fpu_begin(); - aesni_ctr_enc_tfm(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK, walk.iv); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } - if (walk.nbytes) { -+ kernel_fpu_begin(); - ctr_crypt_final(ctx, &walk); -+ kernel_fpu_end(); - err = skcipher_walk_done(&walk, 0); - } -- kernel_fpu_end(); - - return err; - } diff --git a/kernel/patches-5.11.x-rt/0161-crypto-Reduce-preempt-disabled-regions-more-algos.patch b/kernel/patches-5.11.x-rt/0161-crypto-Reduce-preempt-disabled-regions-more-algos.patch deleted file mode 100644 index 83f60f1551..0000000000 --- a/kernel/patches-5.11.x-rt/0161-crypto-Reduce-preempt-disabled-regions-more-algos.patch +++ /dev/null @@ -1,232 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 21 Feb 2014 17:24:04 +0100 -Subject: crypto: Reduce preempt disabled regions, more algos - -Don Estabrook reported -| kernel: WARNING: CPU: 2 PID: 858 at kernel/sched/core.c:2428 migrate_disable+0xed/0x100() -| kernel: WARNING: CPU: 2 PID: 858 at kernel/sched/core.c:2462 migrate_enable+0x17b/0x200() -| kernel: WARNING: CPU: 3 PID: 865 at kernel/sched/core.c:2428 migrate_disable+0xed/0x100() - -and his backtrace showed some crypto functions which looked fine. - -The problem is the following sequence: - -glue_xts_crypt_128bit() -{ - blkcipher_walk_virt(); /* normal migrate_disable() */ - - glue_fpu_begin(); /* get atomic */ - - while (nbytes) { - __glue_xts_crypt_128bit(); - blkcipher_walk_done(); /* with nbytes = 0, migrate_enable() - * while we are atomic */ - }; - glue_fpu_end() /* no longer atomic */ -} - -and this is why the counter get out of sync and the warning is printed. -The other problem is that we are non-preemptible between -glue_fpu_begin() and glue_fpu_end() and the latency grows. To fix this, -I shorten the FPU off region and ensure blkcipher_walk_done() is called -with preemption enabled. This might hurt the performance because we now -enable/disable the FPU state more often but we gain lower latency and -the bug is gone. - - -Reported-by: Don Estabrook -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/crypto/cast5_avx_glue.c | 21 +++++++++------------ - arch/x86/crypto/glue_helper.c | 26 +++++++++++++++----------- - 2 files changed, 24 insertions(+), 23 deletions(-) - ---- a/arch/x86/crypto/cast5_avx_glue.c -+++ b/arch/x86/crypto/cast5_avx_glue.c -@@ -46,7 +46,7 @@ static inline void cast5_fpu_end(bool fp - - static int ecb_crypt(struct skcipher_request *req, bool enc) - { -- bool fpu_enabled = false; -+ bool fpu_enabled; - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); - struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); - struct skcipher_walk walk; -@@ -61,7 +61,7 @@ static int ecb_crypt(struct skcipher_req - u8 *wsrc = walk.src.virt.addr; - u8 *wdst = walk.dst.virt.addr; - -- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); -+ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); - - /* Process multi-block batch */ - if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) { -@@ -90,10 +90,9 @@ static int ecb_crypt(struct skcipher_req - } while (nbytes >= bsize); - - done: -+ cast5_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } -- -- cast5_fpu_end(fpu_enabled); - return err; - } - -@@ -197,7 +196,7 @@ static int cbc_decrypt(struct skcipher_r - { - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); - struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); -- bool fpu_enabled = false; -+ bool fpu_enabled; - struct skcipher_walk walk; - unsigned int nbytes; - int err; -@@ -205,12 +204,11 @@ static int cbc_decrypt(struct skcipher_r - err = skcipher_walk_virt(&walk, req, false); - - while ((nbytes = walk.nbytes)) { -- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); -+ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); - nbytes = __cbc_decrypt(ctx, &walk); -+ cast5_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } -- -- cast5_fpu_end(fpu_enabled); - return err; - } - -@@ -277,7 +275,7 @@ static int ctr_crypt(struct skcipher_req - { - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); - struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); -- bool fpu_enabled = false; -+ bool fpu_enabled; - struct skcipher_walk walk; - unsigned int nbytes; - int err; -@@ -285,13 +283,12 @@ static int ctr_crypt(struct skcipher_req - err = skcipher_walk_virt(&walk, req, false); - - while ((nbytes = walk.nbytes) >= CAST5_BLOCK_SIZE) { -- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); -+ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); - nbytes = __ctr_crypt(&walk, ctx); -+ cast5_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } - -- cast5_fpu_end(fpu_enabled); -- - if (walk.nbytes) { - ctr_crypt_final(&walk, ctx); - err = skcipher_walk_done(&walk, 0); ---- a/arch/x86/crypto/glue_helper.c -+++ b/arch/x86/crypto/glue_helper.c -@@ -24,7 +24,7 @@ int glue_ecb_req_128bit(const struct com - void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); - const unsigned int bsize = 128 / 8; - struct skcipher_walk walk; -- bool fpu_enabled = false; -+ bool fpu_enabled; - unsigned int nbytes; - int err; - -@@ -37,7 +37,7 @@ int glue_ecb_req_128bit(const struct com - unsigned int i; - - fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -- &walk, fpu_enabled, nbytes); -+ &walk, false, nbytes); - for (i = 0; i < gctx->num_funcs; i++) { - func_bytes = bsize * gctx->funcs[i].num_blocks; - -@@ -55,10 +55,9 @@ int glue_ecb_req_128bit(const struct com - if (nbytes < bsize) - break; - } -+ glue_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } -- -- glue_fpu_end(fpu_enabled); - return err; - } - EXPORT_SYMBOL_GPL(glue_ecb_req_128bit); -@@ -101,7 +100,7 @@ int glue_cbc_decrypt_req_128bit(const st - void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); - const unsigned int bsize = 128 / 8; - struct skcipher_walk walk; -- bool fpu_enabled = false; -+ bool fpu_enabled; - unsigned int nbytes; - int err; - -@@ -115,7 +114,7 @@ int glue_cbc_decrypt_req_128bit(const st - u128 last_iv; - - fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -- &walk, fpu_enabled, nbytes); -+ &walk, false, nbytes); - /* Start of the last block. */ - src += nbytes / bsize - 1; - dst += nbytes / bsize - 1; -@@ -148,10 +147,10 @@ int glue_cbc_decrypt_req_128bit(const st - done: - u128_xor(dst, dst, (u128 *)walk.iv); - *(u128 *)walk.iv = last_iv; -+ glue_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } - -- glue_fpu_end(fpu_enabled); - return err; - } - EXPORT_SYMBOL_GPL(glue_cbc_decrypt_req_128bit); -@@ -162,7 +161,7 @@ int glue_ctr_req_128bit(const struct com - void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); - const unsigned int bsize = 128 / 8; - struct skcipher_walk walk; -- bool fpu_enabled = false; -+ bool fpu_enabled; - unsigned int nbytes; - int err; - -@@ -176,7 +175,7 @@ int glue_ctr_req_128bit(const struct com - le128 ctrblk; - - fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -- &walk, fpu_enabled, nbytes); -+ &walk, false, nbytes); - - be128_to_le128(&ctrblk, (be128 *)walk.iv); - -@@ -202,11 +201,10 @@ int glue_ctr_req_128bit(const struct com - } - - le128_to_be128((be128 *)walk.iv, &ctrblk); -+ glue_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } - -- glue_fpu_end(fpu_enabled); -- - if (nbytes) { - le128 ctrblk; - u128 tmp; -@@ -306,8 +304,14 @@ int glue_xts_req_128bit(const struct com - tweak_fn(tweak_ctx, walk.iv, walk.iv); - - while (nbytes) { -+ fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -+ &walk, fpu_enabled, -+ nbytes < bsize ? bsize : nbytes); - nbytes = __glue_xts_req_128bit(gctx, crypt_ctx, &walk); - -+ glue_fpu_end(fpu_enabled); -+ fpu_enabled = false; -+ - err = skcipher_walk_done(&walk, nbytes); - nbytes = walk.nbytes; - } diff --git a/kernel/patches-5.11.x-rt/0162-crypto-limit-more-FPU-enabled-sections.patch b/kernel/patches-5.11.x-rt/0162-crypto-limit-more-FPU-enabled-sections.patch deleted file mode 100644 index 22b3d6d539..0000000000 --- a/kernel/patches-5.11.x-rt/0162-crypto-limit-more-FPU-enabled-sections.patch +++ /dev/null @@ -1,65 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 30 Nov 2017 13:40:10 +0100 -Subject: [PATCH] crypto: limit more FPU-enabled sections -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Those crypto drivers use SSE/AVX/… for their crypto work and in order to -do so in kernel they need to enable the "FPU" in kernel mode which -disables preemption. -There are two problems with the way they are used: -- the while loop which processes X bytes may create latency spikes and - should be avoided or limited. -- the cipher-walk-next part may allocate/free memory and may use - kmap_atomic(). - -The whole kernel_fpu_begin()/end() processing isn't probably that cheap. -It most likely makes sense to process as much of those as possible in one -go. The new *_fpu_sched_rt() schedules only if a RT task is pending. - -Probably we should measure the performance those ciphers in pure SW -mode and with this optimisations to see if it makes sense to keep them -for RT. - -This kernel_fpu_resched() makes the code more preemptible which might hurt -performance. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/include/asm/fpu/api.h | 1 + - arch/x86/kernel/fpu/core.c | 12 ++++++++++++ - 2 files changed, 13 insertions(+) - ---- a/arch/x86/include/asm/fpu/api.h -+++ b/arch/x86/include/asm/fpu/api.h -@@ -28,6 +28,7 @@ extern void kernel_fpu_begin_mask(unsign - extern void kernel_fpu_end(void); - extern bool irq_fpu_usable(void); - extern void fpregs_mark_activate(void); -+extern void kernel_fpu_resched(void); - - /* Code that is unaware of kernel_fpu_begin_mask() can use this */ - static inline void kernel_fpu_begin(void) ---- a/arch/x86/kernel/fpu/core.c -+++ b/arch/x86/kernel/fpu/core.c -@@ -159,6 +159,18 @@ void kernel_fpu_end(void) - } - EXPORT_SYMBOL_GPL(kernel_fpu_end); - -+void kernel_fpu_resched(void) -+{ -+ WARN_ON_FPU(!this_cpu_read(in_kernel_fpu)); -+ -+ if (should_resched(PREEMPT_OFFSET)) { -+ kernel_fpu_end(); -+ cond_resched(); -+ kernel_fpu_begin(); -+ } -+} -+EXPORT_SYMBOL_GPL(kernel_fpu_resched); -+ - /* - * Save the FPU state (mark it for reload if necessary): - * diff --git a/kernel/patches-5.11.x-rt/0163-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch b/kernel/patches-5.11.x-rt/0163-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch deleted file mode 100644 index 2d9a85243c..0000000000 --- a/kernel/patches-5.11.x-rt/0163-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch +++ /dev/null @@ -1,78 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 26 Jul 2018 18:52:00 +0200 -Subject: [PATCH] crypto: cryptd - add a lock instead - preempt_disable/local_bh_disable - -cryptd has a per-CPU lock which protected with local_bh_disable() and -preempt_disable(). -Add an explicit spin_lock to make the locking context more obvious and -visible to lockdep. Since it is a per-CPU lock, there should be no lock -contention on the actual spinlock. -There is a small race-window where we could be migrated to another CPU -after the cpu_queue has been obtain. This is not a problem because the -actual ressource is protected by the spinlock. - -Signed-off-by: Sebastian Andrzej Siewior ---- - crypto/cryptd.c | 19 +++++++++---------- - 1 file changed, 9 insertions(+), 10 deletions(-) - ---- a/crypto/cryptd.c -+++ b/crypto/cryptd.c -@@ -36,6 +36,7 @@ static struct workqueue_struct *cryptd_w - struct cryptd_cpu_queue { - struct crypto_queue queue; - struct work_struct work; -+ spinlock_t qlock; - }; - - struct cryptd_queue { -@@ -105,6 +106,7 @@ static int cryptd_init_queue(struct cryp - cpu_queue = per_cpu_ptr(queue->cpu_queue, cpu); - crypto_init_queue(&cpu_queue->queue, max_cpu_qlen); - INIT_WORK(&cpu_queue->work, cryptd_queue_worker); -+ spin_lock_init(&cpu_queue->qlock); - } - pr_info("cryptd: max_cpu_qlen set to %d\n", max_cpu_qlen); - return 0; -@@ -129,8 +131,10 @@ static int cryptd_enqueue_request(struct - struct cryptd_cpu_queue *cpu_queue; - refcount_t *refcnt; - -- cpu = get_cpu(); -- cpu_queue = this_cpu_ptr(queue->cpu_queue); -+ cpu_queue = raw_cpu_ptr(queue->cpu_queue); -+ spin_lock_bh(&cpu_queue->qlock); -+ cpu = smp_processor_id(); -+ - err = crypto_enqueue_request(&cpu_queue->queue, request); - - refcnt = crypto_tfm_ctx(request->tfm); -@@ -146,7 +150,7 @@ static int cryptd_enqueue_request(struct - refcount_inc(refcnt); - - out_put_cpu: -- put_cpu(); -+ spin_unlock_bh(&cpu_queue->qlock); - - return err; - } -@@ -162,16 +166,11 @@ static void cryptd_queue_worker(struct w - cpu_queue = container_of(work, struct cryptd_cpu_queue, work); - /* - * Only handle one request at a time to avoid hogging crypto workqueue. -- * preempt_disable/enable is used to prevent being preempted by -- * cryptd_enqueue_request(). local_bh_disable/enable is used to prevent -- * cryptd_enqueue_request() being accessed from software interrupts. - */ -- local_bh_disable(); -- preempt_disable(); -+ spin_lock_bh(&cpu_queue->qlock); - backlog = crypto_get_backlog(&cpu_queue->queue); - req = crypto_dequeue_request(&cpu_queue->queue); -- preempt_enable(); -- local_bh_enable(); -+ spin_unlock_bh(&cpu_queue->qlock); - - if (!req) - return; diff --git a/kernel/patches-5.11.x-rt/0164-panic-disable-random-on-rt.patch b/kernel/patches-5.11.x-rt/0164-panic-disable-random-on-rt.patch deleted file mode 100644 index c93df5d15e..0000000000 --- a/kernel/patches-5.11.x-rt/0164-panic-disable-random-on-rt.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: Thomas Gleixner -Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: panic: skip get_random_bytes for RT_FULL in init_oops_id - -Disable on -RT. If this is invoked from irq-context we will have problems -to acquire the sleeping lock. - -Signed-off-by: Thomas Gleixner ---- - kernel/panic.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/kernel/panic.c -+++ b/kernel/panic.c -@@ -544,9 +544,11 @@ static u64 oops_id; - - static int init_oops_id(void) - { -+#ifndef CONFIG_PREEMPT_RT - if (!oops_id) - get_random_bytes(&oops_id, sizeof(oops_id)); - else -+#endif - oops_id++; - - return 0; diff --git a/kernel/patches-5.11.x-rt/0165-x86-stackprot-no-random-on-rt.patch b/kernel/patches-5.11.x-rt/0165-x86-stackprot-no-random-on-rt.patch deleted file mode 100644 index 64b7cd5620..0000000000 --- a/kernel/patches-5.11.x-rt/0165-x86-stackprot-no-random-on-rt.patch +++ /dev/null @@ -1,45 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 16 Dec 2010 14:25:18 +0100 -Subject: x86: stackprotector: Avoid random pool on rt - -CPU bringup calls into the random pool to initialize the stack -canary. During boot that works nicely even on RT as the might sleep -checks are disabled. During CPU hotplug the might sleep checks -trigger. Making the locks in random raw is a major PITA, so avoid the -call on RT is the only sensible solution. This is basically the same -randomness which we get during boot where the random pool has no -entropy and we rely on the TSC randomnness. - -Reported-by: Carsten Emde -Signed-off-by: Thomas Gleixner - ---- - arch/x86/include/asm/stackprotector.h | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - ---- a/arch/x86/include/asm/stackprotector.h -+++ b/arch/x86/include/asm/stackprotector.h -@@ -65,7 +65,7 @@ - */ - static __always_inline void boot_init_stack_canary(void) - { -- u64 canary; -+ u64 canary = 0; - u64 tsc; - - #ifdef CONFIG_X86_64 -@@ -76,8 +76,14 @@ static __always_inline void boot_init_st - * of randomness. The TSC only matters for very early init, - * there it already has some randomness on most systems. Later - * on during the bootup the random pool has true entropy too. -+ * For preempt-rt we need to weaken the randomness a bit, as -+ * we can't call into the random generator from atomic context -+ * due to locking constraints. We just leave canary -+ * uninitialized and use the TSC based randomness on top of it. - */ -+#ifndef CONFIG_PREEMPT_RT - get_random_bytes(&canary, sizeof(canary)); -+#endif - tsc = rdtsc(); - canary += tsc + (tsc << 32UL); - canary &= CANARY_MASK; diff --git a/kernel/patches-5.11.x-rt/0166-random-make-it-work-on-rt.patch b/kernel/patches-5.11.x-rt/0166-random-make-it-work-on-rt.patch deleted file mode 100644 index 7f6e9b93ae..0000000000 --- a/kernel/patches-5.11.x-rt/0166-random-make-it-work-on-rt.patch +++ /dev/null @@ -1,168 +0,0 @@ -Subject: random: Make it work on rt -From: Thomas Gleixner -Date: Tue, 21 Aug 2012 20:38:50 +0200 - -Delegate the random insertion to the forced threaded interrupt -handler. Store the return IP of the hard interrupt handler in the irq -descriptor and feed it into the random generator as a source of -entropy. - -Signed-off-by: Thomas Gleixner - ---- - arch/x86/kernel/cpu/mshyperv.c | 3 ++- - drivers/char/random.c | 11 +++++------ - drivers/hv/hyperv_vmbus.h | 1 + - drivers/hv/vmbus_drv.c | 5 ++++- - include/linux/irqdesc.h | 1 + - include/linux/random.h | 2 +- - kernel/irq/handle.c | 8 +++++++- - kernel/irq/manage.c | 6 ++++++ - 8 files changed, 27 insertions(+), 10 deletions(-) - ---- a/arch/x86/kernel/cpu/mshyperv.c -+++ b/arch/x86/kernel/cpu/mshyperv.c -@@ -80,11 +80,12 @@ EXPORT_SYMBOL_GPL(hv_remove_vmbus_irq); - DEFINE_IDTENTRY_SYSVEC(sysvec_hyperv_stimer0) - { - struct pt_regs *old_regs = set_irq_regs(regs); -+ u64 ip = regs ? instruction_pointer(regs) : 0; - - inc_irq_stat(hyperv_stimer0_count); - if (hv_stimer0_handler) - hv_stimer0_handler(); -- add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0); -+ add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0, ip); - ack_APIC_irq(); - - set_irq_regs(old_regs); ---- a/drivers/char/random.c -+++ b/drivers/char/random.c -@@ -1252,28 +1252,27 @@ static __u32 get_reg(struct fast_pool *f - return *ptr; - } - --void add_interrupt_randomness(int irq, int irq_flags) -+void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) - { - struct entropy_store *r; - struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness); -- struct pt_regs *regs = get_irq_regs(); - unsigned long now = jiffies; - cycles_t cycles = random_get_entropy(); - __u32 c_high, j_high; -- __u64 ip; - unsigned long seed; - int credit = 0; - - if (cycles == 0) -- cycles = get_reg(fast_pool, regs); -+ cycles = get_reg(fast_pool, NULL); - c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0; - j_high = (sizeof(now) > 4) ? now >> 32 : 0; - fast_pool->pool[0] ^= cycles ^ j_high ^ irq; - fast_pool->pool[1] ^= now ^ c_high; -- ip = regs ? instruction_pointer(regs) : _RET_IP_; -+ if (!ip) -+ ip = _RET_IP_; - fast_pool->pool[2] ^= ip; - fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 : -- get_reg(fast_pool, regs); -+ get_reg(fast_pool, NULL); - - fast_mix(fast_pool); - add_interrupt_bench(cycles); ---- a/drivers/hv/hyperv_vmbus.h -+++ b/drivers/hv/hyperv_vmbus.h -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - - #include "hv_trace.h" - ---- a/drivers/hv/vmbus_drv.c -+++ b/drivers/hv/vmbus_drv.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -1310,6 +1311,8 @@ static void vmbus_isr(void) - void *page_addr = hv_cpu->synic_event_page; - struct hv_message *msg; - union hv_synic_event_flags *event; -+ struct pt_regs *regs = get_irq_regs(); -+ u64 ip = regs ? instruction_pointer(regs) : 0; - bool handled = false; - - if (unlikely(page_addr == NULL)) -@@ -1354,7 +1357,7 @@ static void vmbus_isr(void) - tasklet_schedule(&hv_cpu->msg_dpc); - } - -- add_interrupt_randomness(hv_get_vector(), 0); -+ add_interrupt_randomness(hv_get_vector(), 0, ip); - } - - /* ---- a/include/linux/irqdesc.h -+++ b/include/linux/irqdesc.h -@@ -68,6 +68,7 @@ struct irq_desc { - unsigned int irqs_unhandled; - atomic_t threads_handled; - int threads_handled_last; -+ u64 random_ip; - raw_spinlock_t lock; - struct cpumask *percpu_enabled; - const struct cpumask *percpu_affinity; ---- a/include/linux/random.h -+++ b/include/linux/random.h -@@ -35,7 +35,7 @@ static inline void add_latent_entropy(vo - - extern void add_input_randomness(unsigned int type, unsigned int code, - unsigned int value) __latent_entropy; --extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy; -+extern void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) __latent_entropy; - - extern void get_random_bytes(void *buf, int nbytes); - extern int wait_for_random_bytes(void); ---- a/kernel/irq/handle.c -+++ b/kernel/irq/handle.c -@@ -192,10 +192,16 @@ irqreturn_t handle_irq_event_percpu(stru - { - irqreturn_t retval; - unsigned int flags = 0; -+ struct pt_regs *regs = get_irq_regs(); -+ u64 ip = regs ? instruction_pointer(regs) : 0; - - retval = __handle_irq_event_percpu(desc, &flags); - -- add_interrupt_randomness(desc->irq_data.irq, flags); -+#ifdef CONFIG_PREEMPT_RT -+ desc->random_ip = ip; -+#else -+ add_interrupt_randomness(desc->irq_data.irq, flags, ip); -+#endif - - if (!noirqdebug) - note_interrupt(desc, retval); ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -1247,6 +1247,12 @@ static int irq_thread(void *data) - if (action_ret == IRQ_WAKE_THREAD) - irq_wake_secondary(desc, action); - -+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) { -+ migrate_disable(); -+ add_interrupt_randomness(action->irq, 0, -+ desc->random_ip ^ (unsigned long) action); -+ migrate_enable(); -+ } - wake_threads_waitq(desc); - } - diff --git a/kernel/patches-5.11.x-rt/0167-upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch b/kernel/patches-5.11.x-rt/0167-upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch deleted file mode 100644 index bd18c9fe4e..0000000000 --- a/kernel/patches-5.11.x-rt/0167-upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch +++ /dev/null @@ -1,63 +0,0 @@ -Subject: net: Remove preemption disabling in netif_rx() -From: Priyanka Jain -Date: Thu, 17 May 2012 09:35:11 +0530 - -1)enqueue_to_backlog() (called from netif_rx) should be - bind to a particluar CPU. This can be achieved by - disabling migration. No need to disable preemption - -2)Fixes crash "BUG: scheduling while atomic: ksoftirqd" - in case of RT. - If preemption is disabled, enqueue_to_backog() is called - in atomic context. And if backlog exceeds its count, - kfree_skb() is called. But in RT, kfree_skb() might - gets scheduled out, so it expects non atomic context. - --Replace preempt_enable(), preempt_disable() with - migrate_enable(), migrate_disable() respectively --Replace get_cpu(), put_cpu() with get_cpu_light(), - put_cpu_light() respectively - -Signed-off-by: Priyanka Jain -Acked-by: Rajan Srivastava -Cc: -Link: http://lkml.kernel.org/r/1337227511-2271-1-git-send-email-Priyanka.Jain@freescale.com - -Signed-off-by: Thomas Gleixner -[bigeasy: Remove assumption about migrate_disable() from the description.] -Signed-off-by: Sebastian Andrzej Siewior ---- - Testing: Tested successfully on p4080ds(8-core SMP system) - - net/core/dev.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -4792,7 +4792,7 @@ static int netif_rx_internal(struct sk_b - struct rps_dev_flow voidflow, *rflow = &voidflow; - int cpu; - -- preempt_disable(); -+ migrate_disable(); - rcu_read_lock(); - - cpu = get_rps_cpu(skb->dev, skb, &rflow); -@@ -4802,14 +4802,14 @@ static int netif_rx_internal(struct sk_b - ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); - - rcu_read_unlock(); -- preempt_enable(); -+ migrate_enable(); - } else - #endif - { - unsigned int qtail; - -- ret = enqueue_to_backlog(skb, get_cpu(), &qtail); -- put_cpu(); -+ ret = enqueue_to_backlog(skb, get_cpu_light(), &qtail); -+ put_cpu_light(); - } - return ret; - } diff --git a/kernel/patches-5.11.x-rt/0168-lockdep-no-softirq-accounting-on-rt.patch b/kernel/patches-5.11.x-rt/0168-lockdep-no-softirq-accounting-on-rt.patch deleted file mode 100644 index 5110ef7427..0000000000 --- a/kernel/patches-5.11.x-rt/0168-lockdep-no-softirq-accounting-on-rt.patch +++ /dev/null @@ -1,69 +0,0 @@ -Subject: lockdep: Make it RT aware -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 18:51:23 +0200 - -teach lockdep that we don't really do softirqs on -RT. - -Signed-off-by: Thomas Gleixner ---- - include/linux/irqflags.h | 23 +++++++++++++++-------- - kernel/locking/lockdep.c | 2 ++ - 2 files changed, 17 insertions(+), 8 deletions(-) - ---- a/include/linux/irqflags.h -+++ b/include/linux/irqflags.h -@@ -71,14 +71,6 @@ do { \ - do { \ - __this_cpu_dec(hardirq_context); \ - } while (0) --# define lockdep_softirq_enter() \ --do { \ -- current->softirq_context++; \ --} while (0) --# define lockdep_softirq_exit() \ --do { \ -- current->softirq_context--; \ --} while (0) - - # define lockdep_hrtimer_enter(__hrtimer) \ - ({ \ -@@ -140,6 +132,21 @@ do { \ - # define lockdep_irq_work_exit(__work) do { } while (0) - #endif - -+#if defined(CONFIG_TRACE_IRQFLAGS) && !defined(CONFIG_PREEMPT_RT) -+# define lockdep_softirq_enter() \ -+do { \ -+ current->softirq_context++; \ -+} while (0) -+# define lockdep_softirq_exit() \ -+do { \ -+ current->softirq_context--; \ -+} while (0) -+ -+#else -+# define lockdep_softirq_enter() do { } while (0) -+# define lockdep_softirq_exit() do { } while (0) -+#endif -+ - #if defined(CONFIG_IRQSOFF_TRACER) || \ - defined(CONFIG_PREEMPT_TRACER) - extern void stop_critical_timings(void); ---- a/kernel/locking/lockdep.c -+++ b/kernel/locking/lockdep.c -@@ -5291,6 +5291,7 @@ static noinstr void check_flags(unsigned - } - } - -+#ifndef CONFIG_PREEMPT_RT - /* - * We dont accurately track softirq state in e.g. - * hardirq contexts (such as on 4KSTACKS), so only -@@ -5305,6 +5306,7 @@ static noinstr void check_flags(unsigned - DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled); - } - } -+#endif - - if (!debug_locks) - print_irqtrace_events(current); diff --git a/kernel/patches-5.11.x-rt/0169-lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch b/kernel/patches-5.11.x-rt/0169-lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch deleted file mode 100644 index 68a6799ad7..0000000000 --- a/kernel/patches-5.11.x-rt/0169-lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch +++ /dev/null @@ -1,56 +0,0 @@ -Subject: lockdep: selftest: Only do hardirq context test for raw spinlock -From: Yong Zhang -Date: Mon, 16 Apr 2012 15:01:56 +0800 - -From: Yong Zhang - -On -rt there is no softirq context any more and rwlock is sleepable, -disable softirq context test and rwlock+irq test. - -Signed-off-by: Yong Zhang -Cc: Yong Zhang -Link: http://lkml.kernel.org/r/1334559716-18447-3-git-send-email-yong.zhang0@gmail.com -Signed-off-by: Thomas Gleixner ---- - lib/locking-selftest.c | 23 +++++++++++++++++++++++ - 1 file changed, 23 insertions(+) - ---- a/lib/locking-selftest.c -+++ b/lib/locking-selftest.c -@@ -2517,6 +2517,7 @@ void locking_selftest(void) - - printk(" --------------------------------------------------------------------------\n"); - -+#ifndef CONFIG_PREEMPT_RT - /* - * irq-context testcases: - */ -@@ -2531,6 +2532,28 @@ void locking_selftest(void) - DO_TESTCASE_6x2x2RW("irq read-recursion #2", irq_read_recursion2); - DO_TESTCASE_6x2x2RW("irq read-recursion #3", irq_read_recursion3); - -+#else -+ /* On -rt, we only do hardirq context test for raw spinlock */ -+ DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 12); -+ DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 21); -+ -+ DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 12); -+ DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 21); -+ -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 123); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 132); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 213); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 231); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 312); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 321); -+ -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 123); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 132); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 213); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 231); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 312); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 321); -+#endif - ww_tests(); - - force_read_lock_recursive = 0; diff --git a/kernel/patches-5.11.x-rt/0170-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch b/kernel/patches-5.11.x-rt/0170-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch deleted file mode 100644 index 9ab9505cdd..0000000000 --- a/kernel/patches-5.11.x-rt/0170-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch +++ /dev/null @@ -1,142 +0,0 @@ -From: Josh Cartwright -Date: Wed, 28 Jan 2015 13:08:45 -0600 -Subject: lockdep: selftest: fix warnings due to missing PREEMPT_RT conditionals - -"lockdep: Selftest: Only do hardirq context test for raw spinlock" -disabled the execution of certain tests with PREEMPT_RT, but did -not prevent the tests from still being defined. This leads to warnings -like: - - ./linux/lib/locking-selftest.c:574:1: warning: 'irqsafe1_hard_rlock_12' defined but not used [-Wunused-function] - ./linux/lib/locking-selftest.c:574:1: warning: 'irqsafe1_hard_rlock_21' defined but not used [-Wunused-function] - ./linux/lib/locking-selftest.c:577:1: warning: 'irqsafe1_hard_wlock_12' defined but not used [-Wunused-function] - ./linux/lib/locking-selftest.c:577:1: warning: 'irqsafe1_hard_wlock_21' defined but not used [-Wunused-function] - ./linux/lib/locking-selftest.c:580:1: warning: 'irqsafe1_soft_spin_12' defined but not used [-Wunused-function] - ... - -Fixed by wrapping the test definitions in #ifndef CONFIG_PREEMPT_RT -conditionals. - - -Signed-off-by: Josh Cartwright -Signed-off-by: Xander Huff -Acked-by: Gratian Crisan -Signed-off-by: Sebastian Andrzej Siewior ---- - lib/locking-selftest.c | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - ---- a/lib/locking-selftest.c -+++ b/lib/locking-selftest.c -@@ -787,6 +787,8 @@ GENERATE_TESTCASE(init_held_rtmutex); - #include "locking-selftest-spin-hardirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin) - -+#ifndef CONFIG_PREEMPT_RT -+ - #include "locking-selftest-rlock-hardirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock) - -@@ -802,9 +804,12 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_ - #include "locking-selftest-wlock-softirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_wlock) - -+#endif -+ - #undef E1 - #undef E2 - -+#ifndef CONFIG_PREEMPT_RT - /* - * Enabling hardirqs with a softirq-safe lock held: - */ -@@ -837,6 +842,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A - #undef E1 - #undef E2 - -+#endif -+ - /* - * Enabling irqs with an irq-safe lock held: - */ -@@ -860,6 +867,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A - #include "locking-selftest-spin-hardirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin) - -+#ifndef CONFIG_PREEMPT_RT -+ - #include "locking-selftest-rlock-hardirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock) - -@@ -875,6 +884,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B - #include "locking-selftest-wlock-softirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock) - -+#endif -+ - #undef E1 - #undef E2 - -@@ -906,6 +917,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B - #include "locking-selftest-spin-hardirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin) - -+#ifndef CONFIG_PREEMPT_RT -+ - #include "locking-selftest-rlock-hardirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock) - -@@ -921,6 +934,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_ - #include "locking-selftest-wlock-softirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock) - -+#endif -+ - #undef E1 - #undef E2 - #undef E3 -@@ -954,6 +969,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_ - #include "locking-selftest-spin-hardirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin) - -+#ifndef CONFIG_PREEMPT_RT -+ - #include "locking-selftest-rlock-hardirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock) - -@@ -969,10 +986,14 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_ - #include "locking-selftest-wlock-softirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_wlock) - -+#endif -+ - #undef E1 - #undef E2 - #undef E3 - -+#ifndef CONFIG_PREEMPT_RT -+ - /* - * read-lock / write-lock irq inversion. - * -@@ -1162,6 +1183,11 @@ GENERATE_PERMUTATIONS_3_EVENTS(W1W2_R2R3 - #undef E1 - #undef E2 - #undef E3 -+ -+#endif -+ -+#ifndef CONFIG_PREEMPT_RT -+ - /* - * read-lock / write-lock recursion that is actually safe. - */ -@@ -1208,6 +1234,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_read_ - #undef E2 - #undef E3 - -+#endif -+ - /* - * read-lock / write-lock recursion that is unsafe. - */ diff --git a/kernel/patches-5.11.x-rt/0171-lockdep-disable-self-test.patch b/kernel/patches-5.11.x-rt/0171-lockdep-disable-self-test.patch deleted file mode 100644 index e190e7b5b8..0000000000 --- a/kernel/patches-5.11.x-rt/0171-lockdep-disable-self-test.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 17 Oct 2017 16:36:18 +0200 -Subject: [PATCH] lockdep: disable self-test -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The self-test wasn't always 100% accurate for RT. We disabled a few -tests which failed because they had a different semantic for RT. Some -still reported false positives. Now the selftest locks up the system -during boot and it needs to be investigated… - -Signed-off-by: Sebastian Andrzej Siewior ---- - lib/Kconfig.debug | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/lib/Kconfig.debug -+++ b/lib/Kconfig.debug -@@ -1353,7 +1353,7 @@ config DEBUG_ATOMIC_SLEEP - - config DEBUG_LOCKING_API_SELFTESTS - bool "Locking API boot-time self-tests" -- depends on DEBUG_KERNEL -+ depends on DEBUG_KERNEL && !PREEMPT_RT - help - Say Y here if you want the kernel to run a short self-test during - bootup. The self-test checks whether common types of locking bugs diff --git a/kernel/patches-5.11.x-rt/0172-drmradeoni915_Use_preempt_disableenable_rt()_where_recommended.patch b/kernel/patches-5.11.x-rt/0172-drmradeoni915_Use_preempt_disableenable_rt()_where_recommended.patch deleted file mode 100644 index 4de2ffafbb..0000000000 --- a/kernel/patches-5.11.x-rt/0172-drmradeoni915_Use_preempt_disableenable_rt()_where_recommended.patch +++ /dev/null @@ -1,51 +0,0 @@ -Subject: drm,radeon,i915: Use preempt_disable/enable_rt() where recommended -From: Mike Galbraith -Date: Sat, 27 Feb 2016 08:09:11 +0100 - -DRM folks identified the spots, so use them. - -Signed-off-by: Mike Galbraith -Cc: Sebastian Andrzej Siewior -Cc: linux-rt-users -Signed-off-by: Thomas Gleixner ---- - drivers/gpu/drm/i915/i915_irq.c | 2 ++ - drivers/gpu/drm/radeon/radeon_display.c | 2 ++ - 2 files changed, 4 insertions(+) - ---- a/drivers/gpu/drm/i915/i915_irq.c -+++ b/drivers/gpu/drm/i915/i915_irq.c -@@ -878,6 +878,7 @@ static bool i915_get_crtc_scanoutpos(str - spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); - - /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ -+ preempt_disable_rt(); - - /* Get optional system timestamp before query. */ - if (stime) -@@ -929,6 +930,7 @@ static bool i915_get_crtc_scanoutpos(str - *etime = ktime_get(); - - /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ -+ preempt_enable_rt(); - - spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); - ---- a/drivers/gpu/drm/radeon/radeon_display.c -+++ b/drivers/gpu/drm/radeon/radeon_display.c -@@ -1813,6 +1813,7 @@ int radeon_get_crtc_scanoutpos(struct dr - struct radeon_device *rdev = dev->dev_private; - - /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ -+ preempt_disable_rt(); - - /* Get optional system timestamp before query. */ - if (stime) -@@ -1905,6 +1906,7 @@ int radeon_get_crtc_scanoutpos(struct dr - *etime = ktime_get(); - - /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ -+ preempt_enable_rt(); - - /* Decode into vertical and horizontal scanout position. */ - *vpos = position & 0x1fff; diff --git a/kernel/patches-5.11.x-rt/0173-drm-i915-Don-t-disable-interrupts-on-PREEMPT_RT-duri.patch b/kernel/patches-5.11.x-rt/0173-drm-i915-Don-t-disable-interrupts-on-PREEMPT_RT-duri.patch deleted file mode 100644 index e60ae6c198..0000000000 --- a/kernel/patches-5.11.x-rt/0173-drm-i915-Don-t-disable-interrupts-on-PREEMPT_RT-duri.patch +++ /dev/null @@ -1,73 +0,0 @@ -From: Mike Galbraith -Date: Sat, 27 Feb 2016 09:01:42 +0100 -Subject: [PATCH] drm/i915: Don't disable interrupts on PREEMPT_RT during - atomic updates - -Commit - 8d7849db3eab7 ("drm/i915: Make sprite updates atomic") - -started disabling interrupts across atomic updates. This breaks on PREEMPT_RT -because within this section the code attempt to acquire spinlock_t locks which -are sleeping locks on PREEMPT_RT. - -According to the comment the interrupts are disabled to avoid random delays and -not required for protection or synchronisation. - -Don't disable interrupts on PREEMPT_RT during atomic updates. - -[bigeasy: drop local locks, commit message] - -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/gpu/drm/i915/display/intel_sprite.c | 15 ++++++++++----- - 1 file changed, 10 insertions(+), 5 deletions(-) - ---- a/drivers/gpu/drm/i915/display/intel_sprite.c -+++ b/drivers/gpu/drm/i915/display/intel_sprite.c -@@ -122,7 +122,8 @@ void intel_pipe_update_start(const struc - "PSR idle timed out 0x%x, atomic update may fail\n", - psr_status); - -- local_irq_disable(); -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) -+ local_irq_disable(); - - crtc->debug.min_vbl = min; - crtc->debug.max_vbl = max; -@@ -147,11 +148,13 @@ void intel_pipe_update_start(const struc - break; - } - -- local_irq_enable(); -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) -+ local_irq_enable(); - - timeout = schedule_timeout(timeout); - -- local_irq_disable(); -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) -+ local_irq_disable(); - } - - finish_wait(wq, &wait); -@@ -184,7 +187,8 @@ void intel_pipe_update_start(const struc - return; - - irq_disable: -- local_irq_disable(); -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) -+ local_irq_disable(); - } - - /** -@@ -233,7 +237,8 @@ void intel_pipe_update_end(struct intel_ - new_crtc_state->uapi.event = NULL; - } - -- local_irq_enable(); -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) -+ local_irq_enable(); - - if (intel_vgpu_active(dev_priv)) - return; diff --git a/kernel/patches-5.11.x-rt/0174-drm-i915-disable-tracing-on-RT.patch b/kernel/patches-5.11.x-rt/0174-drm-i915-disable-tracing-on-RT.patch deleted file mode 100644 index caf523a546..0000000000 --- a/kernel/patches-5.11.x-rt/0174-drm-i915-disable-tracing-on-RT.patch +++ /dev/null @@ -1,40 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 6 Dec 2018 09:52:20 +0100 -Subject: [PATCH] drm/i915: disable tracing on -RT - -Luca Abeni reported this: -| BUG: scheduling while atomic: kworker/u8:2/15203/0x00000003 -| CPU: 1 PID: 15203 Comm: kworker/u8:2 Not tainted 4.19.1-rt3 #10 -| Call Trace: -| rt_spin_lock+0x3f/0x50 -| gen6_read32+0x45/0x1d0 [i915] -| g4x_get_vblank_counter+0x36/0x40 [i915] -| trace_event_raw_event_i915_pipe_update_start+0x7d/0xf0 [i915] - -The tracing events use trace_i915_pipe_update_start() among other events -use functions acquire spin locks. A few trace points use -intel_get_crtc_scanline(), others use ->get_vblank_counter() wich also -might acquire a sleeping lock. - -Based on this I don't see any other way than disable trace points on RT. - -Cc: stable-rt@vger.kernel.org -Reported-by: Luca Abeni -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/gpu/drm/i915/i915_trace.h | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/drivers/gpu/drm/i915/i915_trace.h -+++ b/drivers/gpu/drm/i915/i915_trace.h -@@ -2,6 +2,10 @@ - #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) - #define _I915_TRACE_H_ - -+#ifdef CONFIG_PREEMPT_RT -+#define NOTRACE -+#endif -+ - #include - #include - #include diff --git a/kernel/patches-5.11.x-rt/0175-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch b/kernel/patches-5.11.x-rt/0175-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch deleted file mode 100644 index 276d8eca67..0000000000 --- a/kernel/patches-5.11.x-rt/0175-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 19 Dec 2018 10:47:02 +0100 -Subject: [PATCH] drm/i915: skip DRM_I915_LOW_LEVEL_TRACEPOINTS with NOTRACE - -The order of the header files is important. If this header file is -included after tracepoint.h was included then the NOTRACE here becomes a -nop. Currently this happens for two .c files which use the tracepoitns -behind DRM_I915_LOW_LEVEL_TRACEPOINTS. - -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/gpu/drm/i915/i915_trace.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/gpu/drm/i915/i915_trace.h -+++ b/drivers/gpu/drm/i915/i915_trace.h -@@ -782,7 +782,7 @@ DEFINE_EVENT(i915_request, i915_request_ - TP_ARGS(rq) - ); - --#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) -+#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) && !defined(NOTRACE) - DEFINE_EVENT(i915_request, i915_request_submit, - TP_PROTO(struct i915_request *rq), - TP_ARGS(rq) diff --git a/kernel/patches-5.11.x-rt/0176-drm-i915-gt-Only-disable-interrupts-for-the-timeline.patch b/kernel/patches-5.11.x-rt/0176-drm-i915-gt-Only-disable-interrupts-for-the-timeline.patch deleted file mode 100644 index 1122f5c6e5..0000000000 --- a/kernel/patches-5.11.x-rt/0176-drm-i915-gt-Only-disable-interrupts-for-the-timeline.patch +++ /dev/null @@ -1,45 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 7 Jul 2020 12:25:11 +0200 -Subject: [PATCH] drm/i915/gt: Only disable interrupts for the timeline lock on - !force-threaded - -According to commit - d67739268cf0e ("drm/i915/gt: Mark up the nested engine-pm timeline lock as irqsafe") - -the intrrupts are disabled the code may be called from an interrupt -handler and from preemptible context. -With `force_irqthreads' set the timeline mutex is never observed in IRQ -context so it is not neede to disable interrupts. - -Disable only interrupts if not in `force_irqthreads' mode. - -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/gpu/drm/i915/gt/intel_engine_pm.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - ---- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c -+++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c -@@ -73,9 +73,10 @@ static int __engine_unpark(struct intel_ - - static inline unsigned long __timeline_mark_lock(struct intel_context *ce) - { -- unsigned long flags; -+ unsigned long flags = 0; - -- local_irq_save(flags); -+ if (!force_irqthreads) -+ local_irq_save(flags); - mutex_acquire(&ce->timeline->mutex.dep_map, 2, 0, _THIS_IP_); - - return flags; -@@ -85,7 +86,8 @@ static inline void __timeline_mark_unloc - unsigned long flags) - { - mutex_release(&ce->timeline->mutex.dep_map, _THIS_IP_); -- local_irq_restore(flags); -+ if (!force_irqthreads) -+ local_irq_restore(flags); - } - - #else diff --git a/kernel/patches-5.11.x-rt/0177-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch b/kernel/patches-5.11.x-rt/0177-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch deleted file mode 100644 index a4a8c83b19..0000000000 --- a/kernel/patches-5.11.x-rt/0177-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch +++ /dev/null @@ -1,322 +0,0 @@ -From: Mike Galbraith -Date: Sun, 8 Jan 2017 09:32:25 +0100 -Subject: [PATCH] cpuset: Convert callback_lock to raw_spinlock_t - -The two commits below add up to a cpuset might_sleep() splat for RT: - -8447a0fee974 cpuset: convert callback_mutex to a spinlock -344736f29b35 cpuset: simplify cpuset_node_allowed API - -BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:995 -in_atomic(): 0, irqs_disabled(): 1, pid: 11718, name: cset -CPU: 135 PID: 11718 Comm: cset Tainted: G E 4.10.0-rt1-rt #4 -Hardware name: Intel Corporation BRICKLAND/BRICKLAND, BIOS BRHSXSD1.86B.0056.R01.1409242327 09/24/2014 -Call Trace: - ? dump_stack+0x5c/0x81 - ? ___might_sleep+0xf4/0x170 - ? rt_spin_lock+0x1c/0x50 - ? __cpuset_node_allowed+0x66/0xc0 - ? ___slab_alloc+0x390/0x570 - ? anon_vma_fork+0x8f/0x140 - ? copy_page_range+0x6cf/0xb00 - ? anon_vma_fork+0x8f/0x140 - ? __slab_alloc.isra.74+0x5a/0x81 - ? anon_vma_fork+0x8f/0x140 - ? kmem_cache_alloc+0x1b5/0x1f0 - ? anon_vma_fork+0x8f/0x140 - ? copy_process.part.35+0x1670/0x1ee0 - ? _do_fork+0xdd/0x3f0 - ? _do_fork+0xdd/0x3f0 - ? do_syscall_64+0x61/0x170 - ? entry_SYSCALL64_slow_path+0x25/0x25 - -The later ensured that a NUMA box WILL take callback_lock in atomic -context by removing the allocator and reclaim path __GFP_HARDWALL -usage which prevented such contexts from taking callback_mutex. - -One option would be to reinstate __GFP_HARDWALL protections for -RT, however, as the 8447a0fee974 changelog states: - -The callback_mutex is only used to synchronize reads/updates of cpusets' -flags and cpu/node masks. These operations should always proceed fast so -there's no reason why we can't use a spinlock instead of the mutex. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/cgroup/cpuset.c | 70 ++++++++++++++++++++++++------------------------- - 1 file changed, 35 insertions(+), 35 deletions(-) - ---- a/kernel/cgroup/cpuset.c -+++ b/kernel/cgroup/cpuset.c -@@ -345,7 +345,7 @@ void cpuset_read_unlock(void) - percpu_up_read(&cpuset_rwsem); - } - --static DEFINE_SPINLOCK(callback_lock); -+static DEFINE_RAW_SPINLOCK(callback_lock); - - static struct workqueue_struct *cpuset_migrate_mm_wq; - -@@ -1280,7 +1280,7 @@ static int update_parent_subparts_cpumas - * Newly added CPUs will be removed from effective_cpus and - * newly deleted ones will be added back to effective_cpus. - */ -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - if (adding) { - cpumask_or(parent->subparts_cpus, - parent->subparts_cpus, tmp->addmask); -@@ -1299,7 +1299,7 @@ static int update_parent_subparts_cpumas - } - - parent->nr_subparts_cpus = cpumask_weight(parent->subparts_cpus); -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - return cmd == partcmd_update; - } -@@ -1404,7 +1404,7 @@ static void update_cpumasks_hier(struct - continue; - rcu_read_unlock(); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - - cpumask_copy(cp->effective_cpus, tmp->new_cpus); - if (cp->nr_subparts_cpus && -@@ -1435,7 +1435,7 @@ static void update_cpumasks_hier(struct - = cpumask_weight(cp->subparts_cpus); - } - } -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - WARN_ON(!is_in_v2_mode() && - !cpumask_equal(cp->cpus_allowed, cp->effective_cpus)); -@@ -1553,7 +1553,7 @@ static int update_cpumask(struct cpuset - return -EINVAL; - } - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed); - - /* -@@ -1564,7 +1564,7 @@ static int update_cpumask(struct cpuset - cs->cpus_allowed); - cs->nr_subparts_cpus = cpumask_weight(cs->subparts_cpus); - } -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - update_cpumasks_hier(cs, &tmp); - -@@ -1758,9 +1758,9 @@ static void update_nodemasks_hier(struct - continue; - rcu_read_unlock(); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cp->effective_mems = *new_mems; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - WARN_ON(!is_in_v2_mode() && - !nodes_equal(cp->mems_allowed, cp->effective_mems)); -@@ -1828,9 +1828,9 @@ static int update_nodemask(struct cpuset - if (retval < 0) - goto done; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cs->mems_allowed = trialcs->mems_allowed; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - /* use trialcs->mems_allowed as a temp variable */ - update_nodemasks_hier(cs, &trialcs->mems_allowed); -@@ -1921,9 +1921,9 @@ static int update_flag(cpuset_flagbits_t - spread_flag_changed = ((is_spread_slab(cs) != is_spread_slab(trialcs)) - || (is_spread_page(cs) != is_spread_page(trialcs))); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cs->flags = trialcs->flags; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - if (!cpumask_empty(trialcs->cpus_allowed) && balance_flag_changed) - rebuild_sched_domains_locked(); -@@ -2432,7 +2432,7 @@ static int cpuset_common_seq_show(struct - cpuset_filetype_t type = seq_cft(sf)->private; - int ret = 0; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - - switch (type) { - case FILE_CPULIST: -@@ -2454,7 +2454,7 @@ static int cpuset_common_seq_show(struct - ret = -EINVAL; - } - -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - return ret; - } - -@@ -2767,14 +2767,14 @@ static int cpuset_css_online(struct cgro - - cpuset_inc(); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - if (is_in_v2_mode()) { - cpumask_copy(cs->effective_cpus, parent->effective_cpus); - cs->effective_mems = parent->effective_mems; - cs->use_parent_ecpus = true; - parent->child_ecpus_count++; - } -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags)) - goto out_unlock; -@@ -2801,12 +2801,12 @@ static int cpuset_css_online(struct cgro - } - rcu_read_unlock(); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cs->mems_allowed = parent->mems_allowed; - cs->effective_mems = parent->mems_allowed; - cpumask_copy(cs->cpus_allowed, parent->cpus_allowed); - cpumask_copy(cs->effective_cpus, parent->cpus_allowed); -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - out_unlock: - percpu_up_write(&cpuset_rwsem); - put_online_cpus(); -@@ -2862,7 +2862,7 @@ static void cpuset_css_free(struct cgrou - static void cpuset_bind(struct cgroup_subsys_state *root_css) - { - percpu_down_write(&cpuset_rwsem); -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - - if (is_in_v2_mode()) { - cpumask_copy(top_cpuset.cpus_allowed, cpu_possible_mask); -@@ -2873,7 +2873,7 @@ static void cpuset_bind(struct cgroup_su - top_cpuset.mems_allowed = top_cpuset.effective_mems; - } - -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - percpu_up_write(&cpuset_rwsem); - } - -@@ -2970,12 +2970,12 @@ hotplug_update_tasks_legacy(struct cpuse - { - bool is_empty; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cpumask_copy(cs->cpus_allowed, new_cpus); - cpumask_copy(cs->effective_cpus, new_cpus); - cs->mems_allowed = *new_mems; - cs->effective_mems = *new_mems; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - /* - * Don't call update_tasks_cpumask() if the cpuset becomes empty, -@@ -3012,10 +3012,10 @@ hotplug_update_tasks(struct cpuset *cs, - if (nodes_empty(*new_mems)) - *new_mems = parent_cs(cs)->effective_mems; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cpumask_copy(cs->effective_cpus, new_cpus); - cs->effective_mems = *new_mems; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - if (cpus_updated) - update_tasks_cpumask(cs); -@@ -3170,7 +3170,7 @@ static void cpuset_hotplug_workfn(struct - - /* synchronize cpus_allowed to cpu_active_mask */ - if (cpus_updated) { -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - if (!on_dfl) - cpumask_copy(top_cpuset.cpus_allowed, &new_cpus); - /* -@@ -3190,17 +3190,17 @@ static void cpuset_hotplug_workfn(struct - } - } - cpumask_copy(top_cpuset.effective_cpus, &new_cpus); -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - /* we don't mess with cpumasks of tasks in top_cpuset */ - } - - /* synchronize mems_allowed to N_MEMORY */ - if (mems_updated) { -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - if (!on_dfl) - top_cpuset.mems_allowed = new_mems; - top_cpuset.effective_mems = new_mems; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - update_tasks_nodemask(&top_cpuset); - } - -@@ -3301,11 +3301,11 @@ void cpuset_cpus_allowed(struct task_str - { - unsigned long flags; - -- spin_lock_irqsave(&callback_lock, flags); -+ raw_spin_lock_irqsave(&callback_lock, flags); - rcu_read_lock(); - guarantee_online_cpus(task_cs(tsk), pmask); - rcu_read_unlock(); -- spin_unlock_irqrestore(&callback_lock, flags); -+ raw_spin_unlock_irqrestore(&callback_lock, flags); - } - - /** -@@ -3366,11 +3366,11 @@ nodemask_t cpuset_mems_allowed(struct ta - nodemask_t mask; - unsigned long flags; - -- spin_lock_irqsave(&callback_lock, flags); -+ raw_spin_lock_irqsave(&callback_lock, flags); - rcu_read_lock(); - guarantee_online_mems(task_cs(tsk), &mask); - rcu_read_unlock(); -- spin_unlock_irqrestore(&callback_lock, flags); -+ raw_spin_unlock_irqrestore(&callback_lock, flags); - - return mask; - } -@@ -3462,14 +3462,14 @@ bool __cpuset_node_allowed(int node, gfp - return true; - - /* Not hardwall and node outside mems_allowed: scan up cpusets */ -- spin_lock_irqsave(&callback_lock, flags); -+ raw_spin_lock_irqsave(&callback_lock, flags); - - rcu_read_lock(); - cs = nearest_hardwall_ancestor(task_cs(current)); - allowed = node_isset(node, cs->mems_allowed); - rcu_read_unlock(); - -- spin_unlock_irqrestore(&callback_lock, flags); -+ raw_spin_unlock_irqrestore(&callback_lock, flags); - return allowed; - } - diff --git a/kernel/patches-5.11.x-rt/0178-x86-Enable-RT.patch b/kernel/patches-5.11.x-rt/0178-x86-Enable-RT.patch deleted file mode 100644 index 87f17975b9..0000000000 --- a/kernel/patches-5.11.x-rt/0178-x86-Enable-RT.patch +++ /dev/null @@ -1,21 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 7 Aug 2019 18:15:38 +0200 -Subject: [PATCH] x86: Allow to enable RT - -Allow to select RT. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/Kconfig | 1 + - 1 file changed, 1 insertion(+) - ---- a/arch/x86/Kconfig -+++ b/arch/x86/Kconfig -@@ -27,6 +27,7 @@ config X86_64 - # Options that are inherently 64-bit kernel only: - select ARCH_HAS_GIGANTIC_PAGE - select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 -+ select ARCH_SUPPORTS_RT - select ARCH_USE_CMPXCHG_LOCKREF - select HAVE_ARCH_SOFT_DIRTY - select MODULES_USE_ELF_RELA diff --git a/kernel/patches-5.11.x-rt/0179-mm-scatterlist-dont-disable-irqs-on-RT.patch b/kernel/patches-5.11.x-rt/0179-mm-scatterlist-dont-disable-irqs-on-RT.patch deleted file mode 100644 index fd87beb258..0000000000 --- a/kernel/patches-5.11.x-rt/0179-mm-scatterlist-dont-disable-irqs-on-RT.patch +++ /dev/null @@ -1,23 +0,0 @@ -From: Thomas Gleixner -Date: Fri, 3 Jul 2009 08:44:34 -0500 -Subject: mm/scatterlist: Do not disable irqs on RT - -For -RT it is enough to keep pagefault disabled (which is currently handled by -kmap_atomic()). - -Signed-off-by: Thomas Gleixner ---- - lib/scatterlist.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/lib/scatterlist.c -+++ b/lib/scatterlist.c -@@ -892,7 +892,7 @@ void sg_miter_stop(struct sg_mapping_ite - flush_kernel_dcache_page(miter->page); - - if (miter->__flags & SG_MITER_ATOMIC) { -- WARN_ON_ONCE(preemptible()); -+ WARN_ON_ONCE(!pagefault_disabled()); - kunmap_atomic(miter->addr); - } else - kunmap(miter->page); diff --git a/kernel/patches-5.11.x-rt/0180-preempt-lazy-support.patch b/kernel/patches-5.11.x-rt/0180-preempt-lazy-support.patch deleted file mode 100644 index be1071e9d3..0000000000 --- a/kernel/patches-5.11.x-rt/0180-preempt-lazy-support.patch +++ /dev/null @@ -1,662 +0,0 @@ -Subject: sched: Add support for lazy preemption -From: Thomas Gleixner -Date: Fri, 26 Oct 2012 18:50:54 +0100 - -It has become an obsession to mitigate the determinism vs. throughput -loss of RT. Looking at the mainline semantics of preemption points -gives a hint why RT sucks throughput wise for ordinary SCHED_OTHER -tasks. One major issue is the wakeup of tasks which are right away -preempting the waking task while the waking task holds a lock on which -the woken task will block right after having preempted the wakee. In -mainline this is prevented due to the implicit preemption disable of -spin/rw_lock held regions. On RT this is not possible due to the fully -preemptible nature of sleeping spinlocks. - -Though for a SCHED_OTHER task preempting another SCHED_OTHER task this -is really not a correctness issue. RT folks are concerned about -SCHED_FIFO/RR tasks preemption and not about the purely fairness -driven SCHED_OTHER preemption latencies. - -So I introduced a lazy preemption mechanism which only applies to -SCHED_OTHER tasks preempting another SCHED_OTHER task. Aside of the -existing preempt_count each tasks sports now a preempt_lazy_count -which is manipulated on lock acquiry and release. This is slightly -incorrect as for lazyness reasons I coupled this on -migrate_disable/enable so some other mechanisms get the same treatment -(e.g. get_cpu_light). - -Now on the scheduler side instead of setting NEED_RESCHED this sets -NEED_RESCHED_LAZY in case of a SCHED_OTHER/SCHED_OTHER preemption and -therefor allows to exit the waking task the lock held region before -the woken task preempts. That also works better for cross CPU wakeups -as the other side can stay in the adaptive spinning loop. - -For RT class preemption there is no change. This simply sets -NEED_RESCHED and forgoes the lazy preemption counter. - - Initial test do not expose any observable latency increasement, but -history shows that I've been proven wrong before :) - -The lazy preemption mode is per default on, but with -CONFIG_SCHED_DEBUG enabled it can be disabled via: - - # echo NO_PREEMPT_LAZY >/sys/kernel/debug/sched_features - -and reenabled via - - # echo PREEMPT_LAZY >/sys/kernel/debug/sched_features - -The test results so far are very machine and workload dependent, but -there is a clear trend that it enhances the non RT workload -performance. - -Signed-off-by: Thomas Gleixner ---- - include/linux/preempt.h | 54 ++++++++++++++++++++++++++-- - include/linux/sched.h | 38 +++++++++++++++++++ - include/linux/thread_info.h | 12 +++++- - include/linux/trace_events.h | 5 ++ - kernel/Kconfig.preempt | 6 +++ - kernel/sched/core.c | 82 +++++++++++++++++++++++++++++++++++++++++-- - kernel/sched/fair.c | 16 ++++---- - kernel/sched/features.h | 3 + - kernel/sched/sched.h | 9 ++++ - kernel/trace/trace.c | 50 ++++++++++++++++---------- - kernel/trace/trace_events.c | 1 - kernel/trace/trace_output.c | 14 ++++++- - 12 files changed, 254 insertions(+), 36 deletions(-) - ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -174,6 +174,20 @@ extern void preempt_count_sub(int val); - #define preempt_count_inc() preempt_count_add(1) - #define preempt_count_dec() preempt_count_sub(1) - -+#ifdef CONFIG_PREEMPT_LAZY -+#define add_preempt_lazy_count(val) do { preempt_lazy_count() += (val); } while (0) -+#define sub_preempt_lazy_count(val) do { preempt_lazy_count() -= (val); } while (0) -+#define inc_preempt_lazy_count() add_preempt_lazy_count(1) -+#define dec_preempt_lazy_count() sub_preempt_lazy_count(1) -+#define preempt_lazy_count() (current_thread_info()->preempt_lazy_count) -+#else -+#define add_preempt_lazy_count(val) do { } while (0) -+#define sub_preempt_lazy_count(val) do { } while (0) -+#define inc_preempt_lazy_count() do { } while (0) -+#define dec_preempt_lazy_count() do { } while (0) -+#define preempt_lazy_count() (0) -+#endif -+ - #ifdef CONFIG_PREEMPT_COUNT - - #define preempt_disable() \ -@@ -182,6 +196,12 @@ do { \ - barrier(); \ - } while (0) - -+#define preempt_lazy_disable() \ -+do { \ -+ inc_preempt_lazy_count(); \ -+ barrier(); \ -+} while (0) -+ - #define sched_preempt_enable_no_resched() \ - do { \ - barrier(); \ -@@ -219,6 +239,18 @@ do { \ - __preempt_schedule(); \ - } while (0) - -+/* -+ * open code preempt_check_resched() because it is not exported to modules and -+ * used by local_unlock() or bpf_enable_instrumentation(). -+ */ -+#define preempt_lazy_enable() \ -+do { \ -+ dec_preempt_lazy_count(); \ -+ barrier(); \ -+ if (should_resched(0)) \ -+ __preempt_schedule(); \ -+} while (0) -+ - #else /* !CONFIG_PREEMPTION */ - #define preempt_enable() \ - do { \ -@@ -226,6 +258,12 @@ do { \ - preempt_count_dec(); \ - } while (0) - -+#define preempt_lazy_enable() \ -+do { \ -+ dec_preempt_lazy_count(); \ -+ barrier(); \ -+} while (0) -+ - #define preempt_enable_notrace() \ - do { \ - barrier(); \ -@@ -267,6 +305,9 @@ do { \ - #define preempt_check_resched_rt() barrier() - #define preemptible() 0 - -+#define preempt_lazy_disable() barrier() -+#define preempt_lazy_enable() barrier() -+ - #endif /* CONFIG_PREEMPT_COUNT */ - - #ifdef MODULE -@@ -285,7 +326,7 @@ do { \ - } while (0) - #define preempt_fold_need_resched() \ - do { \ -- if (tif_need_resched()) \ -+ if (tif_need_resched_now()) \ - set_preempt_need_resched(); \ - } while (0) - -@@ -413,8 +454,15 @@ extern void migrate_enable(void); - - #else - --static inline void migrate_disable(void) { } --static inline void migrate_enable(void) { } -+static inline void migrate_disable(void) -+{ -+ preempt_lazy_disable(); -+} -+ -+static inline void migrate_enable(void) -+{ -+ preempt_lazy_enable(); -+} - - #endif /* CONFIG_SMP */ - ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1877,6 +1877,44 @@ static inline int test_tsk_need_resched( - return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); - } - -+#ifdef CONFIG_PREEMPT_LAZY -+static inline void set_tsk_need_resched_lazy(struct task_struct *tsk) -+{ -+ set_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); -+} -+ -+static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) -+{ -+ clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); -+} -+ -+static inline int test_tsk_need_resched_lazy(struct task_struct *tsk) -+{ -+ return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY)); -+} -+ -+static inline int need_resched_lazy(void) -+{ -+ return test_thread_flag(TIF_NEED_RESCHED_LAZY); -+} -+ -+static inline int need_resched_now(void) -+{ -+ return test_thread_flag(TIF_NEED_RESCHED); -+} -+ -+#else -+static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) { } -+static inline int need_resched_lazy(void) { return 0; } -+ -+static inline int need_resched_now(void) -+{ -+ return test_thread_flag(TIF_NEED_RESCHED); -+} -+ -+#endif -+ -+ - static inline bool __task_is_stopped_or_traced(struct task_struct *task) - { - if (task->state & (__TASK_STOPPED | __TASK_TRACED)) ---- a/include/linux/thread_info.h -+++ b/include/linux/thread_info.h -@@ -149,7 +149,17 @@ static inline int test_ti_thread_flag(st - clear_ti_thread_flag(task_thread_info(t), TIF_##fl) - #endif /* !CONFIG_GENERIC_ENTRY */ - --#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) -+#ifdef CONFIG_PREEMPT_LAZY -+#define tif_need_resched() (test_thread_flag(TIF_NEED_RESCHED) || \ -+ test_thread_flag(TIF_NEED_RESCHED_LAZY)) -+#define tif_need_resched_now() (test_thread_flag(TIF_NEED_RESCHED)) -+#define tif_need_resched_lazy() test_thread_flag(TIF_NEED_RESCHED_LAZY) -+ -+#else -+#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) -+#define tif_need_resched_now() test_thread_flag(TIF_NEED_RESCHED) -+#define tif_need_resched_lazy() 0 -+#endif - - #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES - static inline int arch_within_stack_frames(const void * const stack, ---- a/include/linux/trace_events.h -+++ b/include/linux/trace_events.h -@@ -68,6 +68,7 @@ struct trace_entry { - unsigned char preempt_count; - int pid; - unsigned char migrate_disable; -+ unsigned char preempt_lazy_count; - }; - - #define TRACE_EVENT_TYPE_MAX \ -@@ -155,9 +156,10 @@ static inline void tracing_generic_entry - { - entry->preempt_count = trace_ctx & 0xff; - entry->migrate_disable = (trace_ctx >> 8) & 0xff; -+ entry->preempt_lazy_count = (trace_ctx >> 16) & 0xff; - entry->pid = current->pid; - entry->type = type; -- entry->flags = trace_ctx >> 16; -+ entry->flags = trace_ctx >> 24; - } - - unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status); -@@ -170,6 +172,7 @@ enum trace_flag_type { - TRACE_FLAG_SOFTIRQ = 0x10, - TRACE_FLAG_PREEMPT_RESCHED = 0x20, - TRACE_FLAG_NMI = 0x40, -+ TRACE_FLAG_NEED_RESCHED_LAZY = 0x80, - }; - - #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT ---- a/kernel/Kconfig.preempt -+++ b/kernel/Kconfig.preempt -@@ -1,5 +1,11 @@ - # SPDX-License-Identifier: GPL-2.0-only - -+config HAVE_PREEMPT_LAZY -+ bool -+ -+config PREEMPT_LAZY -+ def_bool y if HAVE_PREEMPT_LAZY && PREEMPT_RT -+ - choice - prompt "Preemption Model" - default PREEMPT_NONE ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -647,6 +647,48 @@ void resched_curr(struct rq *rq) - trace_sched_wake_idle_without_ipi(cpu); - } - -+#ifdef CONFIG_PREEMPT_LAZY -+ -+static int tsk_is_polling(struct task_struct *p) -+{ -+#ifdef TIF_POLLING_NRFLAG -+ return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); -+#else -+ return 0; -+#endif -+} -+ -+void resched_curr_lazy(struct rq *rq) -+{ -+ struct task_struct *curr = rq->curr; -+ int cpu; -+ -+ if (!sched_feat(PREEMPT_LAZY)) { -+ resched_curr(rq); -+ return; -+ } -+ -+ lockdep_assert_held(&rq->lock); -+ -+ if (test_tsk_need_resched(curr)) -+ return; -+ -+ if (test_tsk_need_resched_lazy(curr)) -+ return; -+ -+ set_tsk_need_resched_lazy(curr); -+ -+ cpu = cpu_of(rq); -+ if (cpu == smp_processor_id()) -+ return; -+ -+ /* NEED_RESCHED_LAZY must be visible before we test polling */ -+ smp_mb(); -+ if (!tsk_is_polling(curr)) -+ smp_send_reschedule(cpu); -+} -+#endif -+ - void resched_cpu(int cpu) - { - struct rq *rq = cpu_rq(cpu); -@@ -1778,6 +1820,7 @@ void migrate_disable(void) - preempt_disable(); - this_rq()->nr_pinned++; - p->migration_disabled = 1; -+ preempt_lazy_disable(); - preempt_enable(); - } - EXPORT_SYMBOL_GPL(migrate_disable); -@@ -1806,6 +1849,7 @@ void migrate_enable(void) - barrier(); - p->migration_disabled = 0; - this_rq()->nr_pinned--; -+ preempt_lazy_enable(); - preempt_enable(); - } - EXPORT_SYMBOL_GPL(migrate_enable); -@@ -3853,6 +3897,9 @@ int sched_fork(unsigned long clone_flags - p->on_cpu = 0; - #endif - init_task_preempt_count(p); -+#ifdef CONFIG_HAVE_PREEMPT_LAZY -+ task_thread_info(p)->preempt_lazy_count = 0; -+#endif - #ifdef CONFIG_SMP - plist_node_init(&p->pushable_tasks, MAX_PRIO); - RB_CLEAR_NODE(&p->pushable_dl_tasks); -@@ -5106,6 +5153,7 @@ static void __sched notrace __schedule(b - - next = pick_next_task(rq, prev, &rf); - clear_tsk_need_resched(prev); -+ clear_tsk_need_resched_lazy(prev); - clear_preempt_need_resched(); - - if (likely(prev != next)) { -@@ -5305,6 +5353,30 @@ static void __sched notrace preempt_sche - } while (need_resched()); - } - -+#ifdef CONFIG_PREEMPT_LAZY -+/* -+ * If TIF_NEED_RESCHED is then we allow to be scheduled away since this is -+ * set by a RT task. Oterwise we try to avoid beeing scheduled out as long as -+ * preempt_lazy_count counter >0. -+ */ -+static __always_inline int preemptible_lazy(void) -+{ -+ if (test_thread_flag(TIF_NEED_RESCHED)) -+ return 1; -+ if (current_thread_info()->preempt_lazy_count) -+ return 0; -+ return 1; -+} -+ -+#else -+ -+static inline int preemptible_lazy(void) -+{ -+ return 1; -+} -+ -+#endif -+ - #ifdef CONFIG_PREEMPTION - /* - * This is the entry point to schedule() from in-kernel preemption -@@ -5318,7 +5390,8 @@ asmlinkage __visible void __sched notrac - */ - if (likely(!preemptible())) - return; -- -+ if (!preemptible_lazy()) -+ return; - preempt_schedule_common(); - } - NOKPROBE_SYMBOL(preempt_schedule); -@@ -5358,6 +5431,9 @@ asmlinkage __visible void __sched notrac - if (likely(!preemptible())) - return; - -+ if (!preemptible_lazy()) -+ return; -+ - do { - /* - * Because the function tracer can trace preempt_count_sub() -@@ -7194,7 +7270,9 @@ void init_idle(struct task_struct *idle, - - /* Set the preempt count _outside_ the spinlocks! */ - init_idle_preempt_count(idle, cpu); -- -+#ifdef CONFIG_HAVE_PREEMPT_LAZY -+ task_thread_info(idle)->preempt_lazy_count = 0; -+#endif - /* - * The idle tasks have their own, simple scheduling class: - */ ---- a/kernel/sched/fair.c -+++ b/kernel/sched/fair.c -@@ -4383,7 +4383,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq - ideal_runtime = sched_slice(cfs_rq, curr); - delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; - if (delta_exec > ideal_runtime) { -- resched_curr(rq_of(cfs_rq)); -+ resched_curr_lazy(rq_of(cfs_rq)); - /* - * The current task ran long enough, ensure it doesn't get - * re-elected due to buddy favours. -@@ -4407,7 +4407,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq - return; - - if (delta > ideal_runtime) -- resched_curr(rq_of(cfs_rq)); -+ resched_curr_lazy(rq_of(cfs_rq)); - } - - static void -@@ -4550,7 +4550,7 @@ entity_tick(struct cfs_rq *cfs_rq, struc - * validating it and just reschedule. - */ - if (queued) { -- resched_curr(rq_of(cfs_rq)); -+ resched_curr_lazy(rq_of(cfs_rq)); - return; - } - /* -@@ -4687,7 +4687,7 @@ static void __account_cfs_rq_runtime(str - * hierarchy can be throttled - */ - if (!assign_cfs_rq_runtime(cfs_rq) && likely(cfs_rq->curr)) -- resched_curr(rq_of(cfs_rq)); -+ resched_curr_lazy(rq_of(cfs_rq)); - } - - static __always_inline -@@ -5431,7 +5431,7 @@ static void hrtick_start_fair(struct rq - - if (delta < 0) { - if (rq->curr == p) -- resched_curr(rq); -+ resched_curr_lazy(rq); - return; - } - hrtick_start(rq, delta); -@@ -7017,7 +7017,7 @@ static void check_preempt_wakeup(struct - return; - - preempt: -- resched_curr(rq); -+ resched_curr_lazy(rq); - /* - * Only set the backward buddy when the current task is still - * on the rq. This can happen when a wakeup gets interleaved -@@ -10794,7 +10794,7 @@ static void task_fork_fair(struct task_s - * 'current' within the tree based on its new key value. - */ - swap(curr->vruntime, se->vruntime); -- resched_curr(rq); -+ resched_curr_lazy(rq); - } - - se->vruntime -= cfs_rq->min_vruntime; -@@ -10821,7 +10821,7 @@ prio_changed_fair(struct rq *rq, struct - */ - if (rq->curr == p) { - if (p->prio > oldprio) -- resched_curr(rq); -+ resched_curr_lazy(rq); - } else - check_preempt_curr(rq, p, 0); - } ---- a/kernel/sched/features.h -+++ b/kernel/sched/features.h -@@ -47,6 +47,9 @@ SCHED_FEAT(NONTASK_CAPACITY, true) - - #ifdef CONFIG_PREEMPT_RT - SCHED_FEAT(TTWU_QUEUE, false) -+# ifdef CONFIG_PREEMPT_LAZY -+SCHED_FEAT(PREEMPT_LAZY, true) -+# endif - #else - - /* ---- a/kernel/sched/sched.h -+++ b/kernel/sched/sched.h -@@ -2015,6 +2015,15 @@ extern void reweight_task(struct task_st - extern void resched_curr(struct rq *rq); - extern void resched_cpu(int cpu); - -+#ifdef CONFIG_PREEMPT_LAZY -+extern void resched_curr_lazy(struct rq *rq); -+#else -+static inline void resched_curr_lazy(struct rq *rq) -+{ -+ resched_curr(rq); -+} -+#endif -+ - extern struct rt_bandwidth def_rt_bandwidth; - extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime); - ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -2605,8 +2605,16 @@ unsigned int tracing_gen_ctx_irq_test(un - trace_flags |= TRACE_FLAG_NEED_RESCHED; - if (test_preempt_need_resched()) - trace_flags |= TRACE_FLAG_PREEMPT_RESCHED; -- return (trace_flags << 16) | (pc & 0xff) | -- (migration_disable_value() & 0xff) << 8; -+ -+#ifdef CONFIG_PREEMPT_LAZY -+ if (need_resched_lazy()) -+ trace_flags |= TRACE_FLAG_NEED_RESCHED_LAZY; -+#endif -+ -+ return (pc & 0xff) | -+ (migration_disable_value() & 0xff) << 8 | -+ (preempt_lazy_count() & 0xff) << 16 | -+ (trace_flags << 24); - } - - struct ring_buffer_event * -@@ -3807,15 +3815,17 @@ unsigned long trace_total_entries(struct - - static void print_lat_help_header(struct seq_file *m) - { -- seq_puts(m, "# _------=> CPU# \n" -- "# / _-----=> irqs-off \n" -- "# | / _----=> need-resched \n" -- "# || / _---=> hardirq/softirq \n" -- "# ||| / _--=> preempt-depth \n" -- "# |||| / _-=> migrate-disable \n" -- "# ||||| / delay \n" -- "# cmd pid |||||| time | caller \n" -- "# \\ / |||||| \\ | / \n"); -+ seq_puts(m, "# _--------=> CPU# \n" -+ "# / _-------=> irqs-off \n" -+ "# | / _------=> need-resched \n" -+ "# || / _-----=> need-resched-lazy\n" -+ "# ||| / _----=> hardirq/softirq \n" -+ "# |||| / _---=> preempt-depth \n" -+ "# ||||| / _--=> preempt-lazy-depth\n" -+ "# |||||| / _-=> migrate-disable \n" -+ "# ||||||| / delay \n" -+ "# cmd pid |||||||| time | caller \n" -+ "# \\ / |||||||| \\ | / \n"); - } - - static void print_event_info(struct array_buffer *buf, struct seq_file *m) -@@ -3849,14 +3859,16 @@ static void print_func_help_header_irq(s - - print_event_info(buf, m); - -- seq_printf(m, "# %.*s _-----=> irqs-off\n", prec, space); -- seq_printf(m, "# %.*s / _----=> need-resched\n", prec, space); -- seq_printf(m, "# %.*s| / _---=> hardirq/softirq\n", prec, space); -- seq_printf(m, "# %.*s|| / _--=> preempt-depth\n", prec, space); -- seq_printf(m, "# %.*s||| / _-=> migrate-disable\n", prec, space); -- seq_printf(m, "# %.*s|||| / delay\n", prec, space); -- seq_printf(m, "# TASK-PID %.*s CPU# ||||| TIMESTAMP FUNCTION\n", prec, " TGID "); -- seq_printf(m, "# | | %.*s | ||||| | |\n", prec, " | "); -+ seq_printf(m, "# %.*s _-------=> irqs-off\n", prec, space); -+ seq_printf(m, "# %.*s / _------=> need-resched\n", prec, space); -+ seq_printf(m, "# %.*s| / _-----=> need-resched-lazy\n", prec, space); -+ seq_printf(m, "# %.*s|| / _----=> hardirq/softirq\n", prec, space); -+ seq_printf(m, "# %.*s||| / _---=> preempt-depth\n", prec, space); -+ seq_printf(m, "# %.*s|||| / _--=> preempt-lazy-depth\n", prec, space); -+ seq_printf(m, "# %.*s||||| / _-=> migrate-disable\n", prec, space); -+ seq_printf(m, "# %.*s|||||| / delay\n", prec, space); -+ seq_printf(m, "# TASK-PID %.*s CPU# ||||||| TIMESTAMP FUNCTION\n", prec, " TGID "); -+ seq_printf(m, "# | | %.*s | ||||||| | |\n", prec, " | "); - } - - void ---- a/kernel/trace/trace_events.c -+++ b/kernel/trace/trace_events.c -@@ -184,6 +184,7 @@ static int trace_define_common_fields(vo - __common_field(unsigned char, preempt_count); - __common_field(int, pid); - __common_field(unsigned char, migrate_disable); -+ __common_field(unsigned char, preempt_lazy_count); - - return ret; - } ---- a/kernel/trace/trace_output.c -+++ b/kernel/trace/trace_output.c -@@ -441,6 +441,7 @@ int trace_print_lat_fmt(struct trace_seq - { - char hardsoft_irq; - char need_resched; -+ char need_resched_lazy; - char irqs_off; - int hardirq; - int softirq; -@@ -471,6 +472,9 @@ int trace_print_lat_fmt(struct trace_seq - break; - } - -+ need_resched_lazy = -+ (entry->flags & TRACE_FLAG_NEED_RESCHED_LAZY) ? 'L' : '.'; -+ - hardsoft_irq = - (nmi && hardirq) ? 'Z' : - nmi ? 'z' : -@@ -479,14 +483,20 @@ int trace_print_lat_fmt(struct trace_seq - softirq ? 's' : - '.' ; - -- trace_seq_printf(s, "%c%c%c", -- irqs_off, need_resched, hardsoft_irq); -+ trace_seq_printf(s, "%c%c%c%c", -+ irqs_off, need_resched, need_resched_lazy, -+ hardsoft_irq); - - if (entry->preempt_count) - trace_seq_printf(s, "%x", entry->preempt_count); - else - trace_seq_putc(s, '.'); - -+ if (entry->preempt_lazy_count) -+ trace_seq_printf(s, "%x", entry->preempt_lazy_count); -+ else -+ trace_seq_putc(s, '.'); -+ - if (entry->migrate_disable) - trace_seq_printf(s, "%x", entry->migrate_disable); - else diff --git a/kernel/patches-5.11.x-rt/0181-x86-entry-Use-should_resched-in-idtentry_exit_cond_r.patch b/kernel/patches-5.11.x-rt/0181-x86-entry-Use-should_resched-in-idtentry_exit_cond_r.patch deleted file mode 100644 index c5871ca205..0000000000 --- a/kernel/patches-5.11.x-rt/0181-x86-entry-Use-should_resched-in-idtentry_exit_cond_r.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 30 Jun 2020 11:45:14 +0200 -Subject: [PATCH] x86/entry: Use should_resched() in - idtentry_exit_cond_resched() - -The TIF_NEED_RESCHED bit is inlined on x86 into the preemption counter. -By using should_resched(0) instead of need_resched() the same check can -be performed which uses the same variable as 'preempt_count()` which was -issued before. - -Use should_resched(0) instead need_resched(). - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/entry/common.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/kernel/entry/common.c -+++ b/kernel/entry/common.c -@@ -396,7 +396,7 @@ void irqentry_exit_cond_resched(void) - rcu_irq_exit_check_preempt(); - if (IS_ENABLED(CONFIG_DEBUG_ENTRY)) - WARN_ON_ONCE(!on_thread_stack()); -- if (need_resched()) -+ if (should_resched(0)) - preempt_schedule_irq(); - } - } diff --git a/kernel/patches-5.11.x-rt/0182-x86-preempt-lazy.patch b/kernel/patches-5.11.x-rt/0182-x86-preempt-lazy.patch deleted file mode 100644 index eeca917c83..0000000000 --- a/kernel/patches-5.11.x-rt/0182-x86-preempt-lazy.patch +++ /dev/null @@ -1,141 +0,0 @@ -Subject: x86: Support for lazy preemption -From: Thomas Gleixner -Date: Thu, 01 Nov 2012 11:03:47 +0100 - -Implement the x86 pieces for lazy preempt. - -Signed-off-by: Thomas Gleixner ---- - arch/x86/Kconfig | 1 + - arch/x86/include/asm/preempt.h | 33 ++++++++++++++++++++++++++++++++- - arch/x86/include/asm/thread_info.h | 7 +++++++ - include/linux/entry-common.h | 2 +- - kernel/entry/common.c | 2 +- - 5 files changed, 42 insertions(+), 3 deletions(-) - ---- a/arch/x86/Kconfig -+++ b/arch/x86/Kconfig -@@ -216,6 +216,7 @@ config X86 - select HAVE_PCI - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP -+ select HAVE_PREEMPT_LAZY - select MMU_GATHER_RCU_TABLE_FREE if PARAVIRT - select HAVE_POSIX_CPU_TIMERS_TASK_WORK - select HAVE_REGS_AND_STACK_ACCESS_API ---- a/arch/x86/include/asm/preempt.h -+++ b/arch/x86/include/asm/preempt.h -@@ -89,17 +89,48 @@ static __always_inline void __preempt_co - * a decrement which hits zero means we have no preempt_count and should - * reschedule. - */ --static __always_inline bool __preempt_count_dec_and_test(void) -+static __always_inline bool ____preempt_count_dec_and_test(void) - { - return GEN_UNARY_RMWcc("decl", __preempt_count, e, __percpu_arg([var])); - } - -+static __always_inline bool __preempt_count_dec_and_test(void) -+{ -+ if (____preempt_count_dec_and_test()) -+ return true; -+#ifdef CONFIG_PREEMPT_LAZY -+ if (preempt_count()) -+ return false; -+ if (current_thread_info()->preempt_lazy_count) -+ return false; -+ return test_thread_flag(TIF_NEED_RESCHED_LAZY); -+#else -+ return false; -+#endif -+} -+ - /* - * Returns true when we need to resched and can (barring IRQ state). - */ - static __always_inline bool should_resched(int preempt_offset) - { -+#ifdef CONFIG_PREEMPT_LAZY -+ u32 tmp; -+ tmp = raw_cpu_read_4(__preempt_count); -+ if (tmp == preempt_offset) -+ return true; -+ -+ /* preempt count == 0 ? */ -+ tmp &= ~PREEMPT_NEED_RESCHED; -+ if (tmp != preempt_offset) -+ return false; -+ /* XXX PREEMPT_LOCK_OFFSET */ -+ if (current_thread_info()->preempt_lazy_count) -+ return false; -+ return test_thread_flag(TIF_NEED_RESCHED_LAZY); -+#else - return unlikely(raw_cpu_read_4(__preempt_count) == preempt_offset); -+#endif - } - - #ifdef CONFIG_PREEMPTION ---- a/arch/x86/include/asm/thread_info.h -+++ b/arch/x86/include/asm/thread_info.h -@@ -57,11 +57,14 @@ struct thread_info { - unsigned long flags; /* low level flags */ - unsigned long syscall_work; /* SYSCALL_WORK_ flags */ - u32 status; /* thread synchronous flags */ -+ int preempt_lazy_count; /* 0 => lazy preemptable -+ <0 => BUG */ - }; - - #define INIT_THREAD_INFO(tsk) \ - { \ - .flags = 0, \ -+ .preempt_lazy_count = 0, \ - } - - #else /* !__ASSEMBLY__ */ -@@ -90,6 +93,7 @@ struct thread_info { - #define TIF_NOTSC 16 /* TSC is not accessible in userland */ - #define TIF_NOTIFY_SIGNAL 17 /* signal notifications exist */ - #define TIF_SLD 18 /* Restore split lock detection on context switch */ -+#define TIF_NEED_RESCHED_LAZY 19 /* lazy rescheduling necessary */ - #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ - #define TIF_POLLING_NRFLAG 21 /* idle is polling for TIF_NEED_RESCHED */ - #define TIF_IO_BITMAP 22 /* uses I/O bitmap */ -@@ -113,6 +117,7 @@ struct thread_info { - #define _TIF_NOTSC (1 << TIF_NOTSC) - #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) - #define _TIF_SLD (1 << TIF_SLD) -+#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) - #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) - #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) - #define _TIF_FORCED_TF (1 << TIF_FORCED_TF) -@@ -143,6 +148,8 @@ struct thread_info { - - #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) - -+#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) -+ - #define STACK_WARN (THREAD_SIZE/8) - - /* ---- a/include/linux/entry-common.h -+++ b/include/linux/entry-common.h -@@ -58,7 +58,7 @@ - - #define EXIT_TO_USER_MODE_WORK \ - (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ -- _TIF_NEED_RESCHED | _TIF_PATCH_PENDING | _TIF_NOTIFY_SIGNAL | \ -+ _TIF_NEED_RESCHED_MASK | _TIF_PATCH_PENDING | _TIF_NOTIFY_SIGNAL | \ - ARCH_EXIT_TO_USER_MODE_WORK) - - /** ---- a/kernel/entry/common.c -+++ b/kernel/entry/common.c -@@ -158,7 +158,7 @@ static unsigned long exit_to_user_mode_l - - local_irq_enable_exit_to_user(ti_work); - -- if (ti_work & _TIF_NEED_RESCHED) -+ if (ti_work & _TIF_NEED_RESCHED_MASK) - schedule(); - - #ifdef ARCH_RT_DELAYS_SIGNAL_SEND diff --git a/kernel/patches-5.11.x-rt/0183-arm-preempt-lazy-support.patch b/kernel/patches-5.11.x-rt/0183-arm-preempt-lazy-support.patch deleted file mode 100644 index 5b45d1d371..0000000000 --- a/kernel/patches-5.11.x-rt/0183-arm-preempt-lazy-support.patch +++ /dev/null @@ -1,122 +0,0 @@ -Subject: arm: Add support for lazy preemption -From: Thomas Gleixner -Date: Wed, 31 Oct 2012 12:04:11 +0100 - -Implement the arm pieces for lazy preempt. - -Signed-off-by: Thomas Gleixner ---- - arch/arm/Kconfig | 1 + - arch/arm/include/asm/thread_info.h | 6 +++++- - arch/arm/kernel/asm-offsets.c | 1 + - arch/arm/kernel/entry-armv.S | 19 ++++++++++++++++--- - arch/arm/kernel/signal.c | 3 ++- - 5 files changed, 25 insertions(+), 5 deletions(-) - ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -107,6 +107,7 @@ config ARM - select HAVE_PERF_EVENTS - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP -+ select HAVE_PREEMPT_LAZY - select MMU_GATHER_RCU_TABLE_FREE if SMP && ARM_LPAE - select HAVE_REGS_AND_STACK_ACCESS_API - select HAVE_RSEQ ---- a/arch/arm/include/asm/thread_info.h -+++ b/arch/arm/include/asm/thread_info.h -@@ -54,6 +54,7 @@ struct cpu_context_save { - struct thread_info { - unsigned long flags; /* low level flags */ - int preempt_count; /* 0 => preemptable, <0 => bug */ -+ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ - mm_segment_t addr_limit; /* address limit */ - struct task_struct *task; /* main task structure */ - __u32 cpu; /* cpu */ -@@ -146,6 +147,7 @@ extern int vfp_restore_user_hwstate(stru - #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ - #define TIF_SECCOMP 7 /* seccomp syscall filtering active */ - #define TIF_NOTIFY_SIGNAL 8 /* signal notifications exist */ -+#define TIF_NEED_RESCHED_LAZY 9 - - #define TIF_USING_IWMMXT 17 - #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ -@@ -160,6 +162,7 @@ extern int vfp_restore_user_hwstate(stru - #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) - #define _TIF_SECCOMP (1 << TIF_SECCOMP) - #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) -+#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) - #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) - - /* Checks for any syscall work in entry-common.S */ -@@ -169,7 +172,8 @@ extern int vfp_restore_user_hwstate(stru - /* - * Change these and you break ASM code in entry-common.S - */ --#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ -+#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY | \ -+ _TIF_SIGPENDING | \ - _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ - _TIF_NOTIFY_SIGNAL) - ---- a/arch/arm/kernel/asm-offsets.c -+++ b/arch/arm/kernel/asm-offsets.c -@@ -42,6 +42,7 @@ int main(void) - BLANK(); - DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); - DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); -+ DEFINE(TI_PREEMPT_LAZY, offsetof(struct thread_info, preempt_lazy_count)); - DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); - DEFINE(TI_TASK, offsetof(struct thread_info, task)); - DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); ---- a/arch/arm/kernel/entry-armv.S -+++ b/arch/arm/kernel/entry-armv.S -@@ -206,11 +206,18 @@ ENDPROC(__dabt_svc) - - #ifdef CONFIG_PREEMPTION - ldr r8, [tsk, #TI_PREEMPT] @ get preempt count -- ldr r0, [tsk, #TI_FLAGS] @ get flags - teq r8, #0 @ if preempt count != 0 -+ bne 1f @ return from exeption -+ ldr r0, [tsk, #TI_FLAGS] @ get flags -+ tst r0, #_TIF_NEED_RESCHED @ if NEED_RESCHED is set -+ blne svc_preempt @ preempt! -+ -+ ldr r8, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count -+ teq r8, #0 @ if preempt lazy count != 0 - movne r0, #0 @ force flags to 0 -- tst r0, #_TIF_NEED_RESCHED -+ tst r0, #_TIF_NEED_RESCHED_LAZY - blne svc_preempt -+1: - #endif - - svc_exit r5, irq = 1 @ return from exception -@@ -225,8 +232,14 @@ ENDPROC(__irq_svc) - 1: bl preempt_schedule_irq @ irq en/disable is done inside - ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS - tst r0, #_TIF_NEED_RESCHED -+ bne 1b -+ tst r0, #_TIF_NEED_RESCHED_LAZY - reteq r8 @ go again -- b 1b -+ ldr r0, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count -+ teq r0, #0 @ if preempt lazy count != 0 -+ beq 1b -+ ret r8 @ go again -+ - #endif - - __und_fault: ---- a/arch/arm/kernel/signal.c -+++ b/arch/arm/kernel/signal.c -@@ -649,7 +649,8 @@ do_work_pending(struct pt_regs *regs, un - */ - trace_hardirqs_off(); - do { -- if (likely(thread_flags & _TIF_NEED_RESCHED)) { -+ if (likely(thread_flags & (_TIF_NEED_RESCHED | -+ _TIF_NEED_RESCHED_LAZY))) { - schedule(); - } else { - if (unlikely(!user_mode(regs))) diff --git a/kernel/patches-5.11.x-rt/0184-powerpc-preempt-lazy-support.patch b/kernel/patches-5.11.x-rt/0184-powerpc-preempt-lazy-support.patch deleted file mode 100644 index e1355d1a3e..0000000000 --- a/kernel/patches-5.11.x-rt/0184-powerpc-preempt-lazy-support.patch +++ /dev/null @@ -1,250 +0,0 @@ -From: Thomas Gleixner -Date: Thu, 1 Nov 2012 10:14:11 +0100 -Subject: powerpc: Add support for lazy preemption - -Implement the powerpc pieces for lazy preempt. - -Signed-off-by: Thomas Gleixner ---- - arch/powerpc/Kconfig | 1 + - arch/powerpc/include/asm/thread_info.h | 15 ++++++++++++--- - arch/powerpc/kernel/asm-offsets.c | 1 + - arch/powerpc/kernel/entry_32.S | 23 ++++++++++++++++------- - arch/powerpc/kernel/exceptions-64e.S | 16 ++++++++++++---- - arch/powerpc/kernel/syscall_64.c | 10 +++++++--- - 6 files changed, 49 insertions(+), 17 deletions(-) - ---- a/arch/powerpc/Kconfig -+++ b/arch/powerpc/Kconfig -@@ -233,6 +233,7 @@ config PPC - select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP -+ select HAVE_PREEMPT_LAZY - select MMU_GATHER_RCU_TABLE_FREE - select MMU_GATHER_PAGE_SIZE - select HAVE_REGS_AND_STACK_ACCESS_API ---- a/arch/powerpc/include/asm/thread_info.h -+++ b/arch/powerpc/include/asm/thread_info.h -@@ -48,6 +48,8 @@ - struct thread_info { - int preempt_count; /* 0 => preemptable, - <0 => BUG */ -+ int preempt_lazy_count; /* 0 => preemptable, -+ <0 => BUG */ - unsigned long local_flags; /* private flags for thread */ - #ifdef CONFIG_LIVEPATCH - unsigned long *livepatch_sp; -@@ -96,11 +98,12 @@ void arch_setup_new_exec(void); - #define TIF_SINGLESTEP 8 /* singlestepping active */ - #define TIF_NOHZ 9 /* in adaptive nohz mode */ - #define TIF_SECCOMP 10 /* secure computing */ --#define TIF_RESTOREALL 11 /* Restore all regs (implies NOERROR) */ --#define TIF_NOERROR 12 /* Force successful syscall return */ -+ -+#define TIF_NEED_RESCHED_LAZY 11 /* lazy rescheduling necessary */ -+#define TIF_SYSCALL_TRACEPOINT 12 /* syscall tracepoint instrumentation */ -+ - #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ - #define TIF_UPROBE 14 /* breakpointed or single-stepping */ --#define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ - #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation - for stack store? */ - #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ -@@ -109,6 +112,9 @@ void arch_setup_new_exec(void); - #endif - #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ - #define TIF_32BIT 20 /* 32 bit binary */ -+#define TIF_RESTOREALL 21 /* Restore all regs (implies NOERROR) */ -+#define TIF_NOERROR 22 /* Force successful syscall return */ -+ - - /* as above, but as bit values */ - #define _TIF_SYSCALL_TRACE (1<msr & MSR_EE)); - again: -- if (IS_ENABLED(CONFIG_PREEMPT)) { -+ if (IS_ENABLED(CONFIG_PREEMPTION)) { - /* Return to preemptible kernel context */ - if (unlikely(*ti_flagsp & _TIF_NEED_RESCHED)) { - if (preempt_count() == 0) - preempt_schedule_irq(); -+ } else if (unlikely(*ti_flagsp & _TIF_NEED_RESCHED_LAZY)) { -+ if ((preempt_count() == 0) && -+ (current_thread_info()->preempt_lazy_count == 0)) -+ preempt_schedule_irq(); - } - } - diff --git a/kernel/patches-5.11.x-rt/0185-arch-arm64-Add-lazy-preempt-support.patch b/kernel/patches-5.11.x-rt/0185-arch-arm64-Add-lazy-preempt-support.patch deleted file mode 100644 index 2087084ae6..0000000000 --- a/kernel/patches-5.11.x-rt/0185-arch-arm64-Add-lazy-preempt-support.patch +++ /dev/null @@ -1,154 +0,0 @@ -From: Anders Roxell -Date: Thu, 14 May 2015 17:52:17 +0200 -Subject: arch/arm64: Add lazy preempt support - -arm64 is missing support for PREEMPT_RT. The main feature which is -lacking is support for lazy preemption. The arch-specific entry code, -thread information structure definitions, and associated data tables -have to be extended to provide this support. Then the Kconfig file has -to be extended to indicate the support is available, and also to -indicate that support for full RT preemption is now available. - -Signed-off-by: Anders Roxell ---- - arch/arm64/Kconfig | 1 + - arch/arm64/include/asm/preempt.h | 25 ++++++++++++++++++++++++- - arch/arm64/include/asm/thread_info.h | 8 +++++++- - arch/arm64/kernel/asm-offsets.c | 1 + - arch/arm64/kernel/entry.S | 13 +++++++++++-- - arch/arm64/kernel/signal.c | 2 +- - 6 files changed, 45 insertions(+), 5 deletions(-) - ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -177,6 +177,7 @@ config ARM64 - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP - select HAVE_REGS_AND_STACK_ACCESS_API -+ select HAVE_PREEMPT_LAZY - select HAVE_FUNCTION_ARG_ACCESS_API - select HAVE_FUTEX_CMPXCHG if FUTEX - select MMU_GATHER_RCU_TABLE_FREE ---- a/arch/arm64/include/asm/preempt.h -+++ b/arch/arm64/include/asm/preempt.h -@@ -70,13 +70,36 @@ static inline bool __preempt_count_dec_a - * interrupt occurring between the non-atomic READ_ONCE/WRITE_ONCE - * pair. - */ -- return !pc || !READ_ONCE(ti->preempt_count); -+ if (!pc || !READ_ONCE(ti->preempt_count)) -+ return true; -+#ifdef CONFIG_PREEMPT_LAZY -+ if ((pc & ~PREEMPT_NEED_RESCHED)) -+ return false; -+ if (current_thread_info()->preempt_lazy_count) -+ return false; -+ return test_thread_flag(TIF_NEED_RESCHED_LAZY); -+#else -+ return false; -+#endif - } - - static inline bool should_resched(int preempt_offset) - { -+#ifdef CONFIG_PREEMPT_LAZY -+ u64 pc = READ_ONCE(current_thread_info()->preempt_count); -+ if (pc == preempt_offset) -+ return true; -+ -+ if ((pc & ~PREEMPT_NEED_RESCHED) != preempt_offset) -+ return false; -+ -+ if (current_thread_info()->preempt_lazy_count) -+ return false; -+ return test_thread_flag(TIF_NEED_RESCHED_LAZY); -+#else - u64 pc = READ_ONCE(current_thread_info()->preempt_count); - return pc == preempt_offset; -+#endif - } - - #ifdef CONFIG_PREEMPTION ---- a/arch/arm64/include/asm/thread_info.h -+++ b/arch/arm64/include/asm/thread_info.h -@@ -26,6 +26,7 @@ struct thread_info { - #ifdef CONFIG_ARM64_SW_TTBR0_PAN - u64 ttbr0; /* saved TTBR0_EL1 */ - #endif -+ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ - union { - u64 preempt_count; /* 0 => preemptible, <0 => bug */ - struct { -@@ -65,6 +66,7 @@ void arch_release_task_struct(struct tas - #define TIF_UPROBE 4 /* uprobe breakpoint or singlestep */ - #define TIF_MTE_ASYNC_FAULT 5 /* MTE Asynchronous Tag Check Fault */ - #define TIF_NOTIFY_SIGNAL 6 /* signal notifications exist */ -+#define TIF_NEED_RESCHED_LAZY 7 - #define TIF_SYSCALL_TRACE 8 /* syscall trace active */ - #define TIF_SYSCALL_AUDIT 9 /* syscall auditing */ - #define TIF_SYSCALL_TRACEPOINT 10 /* syscall tracepoint for ftrace */ -@@ -95,8 +97,10 @@ void arch_release_task_struct(struct tas - #define _TIF_SVE (1 << TIF_SVE) - #define _TIF_MTE_ASYNC_FAULT (1 << TIF_MTE_ASYNC_FAULT) - #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) -+#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) - --#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ -+#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY | \ -+ _TIF_SIGPENDING | \ - _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \ - _TIF_UPROBE | _TIF_MTE_ASYNC_FAULT | \ - _TIF_NOTIFY_SIGNAL) -@@ -105,6 +109,8 @@ void arch_release_task_struct(struct tas - _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \ - _TIF_SYSCALL_EMU) - -+#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) -+ - #ifdef CONFIG_SHADOW_CALL_STACK - #define INIT_SCS \ - .scs_base = init_shadow_call_stack, \ ---- a/arch/arm64/kernel/asm-offsets.c -+++ b/arch/arm64/kernel/asm-offsets.c -@@ -30,6 +30,7 @@ int main(void) - BLANK(); - DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags)); - DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count)); -+ DEFINE(TSK_TI_PREEMPT_LAZY, offsetof(struct task_struct, thread_info.preempt_lazy_count)); - #ifdef CONFIG_ARM64_SW_TTBR0_PAN - DEFINE(TSK_TI_TTBR0, offsetof(struct task_struct, thread_info.ttbr0)); - #endif ---- a/arch/arm64/kernel/entry.S -+++ b/arch/arm64/kernel/entry.S -@@ -678,9 +678,18 @@ alternative_if ARM64_HAS_IRQ_PRIO_MASKIN - mrs x0, daif - orr x24, x24, x0 - alternative_else_nop_endif -- cbnz x24, 1f // preempt count != 0 || NMI return path -- bl arm64_preempt_schedule_irq // irq en/disable is done inside -+ -+ cbz x24, 1f // (need_resched + count) == 0 -+ cbnz w24, 2f // count != 0 -+ -+ ldr w24, [tsk, #TSK_TI_PREEMPT_LAZY] // get preempt lazy count -+ cbnz w24, 2f // preempt lazy count != 0 -+ -+ ldr x0, [tsk, #TSK_TI_FLAGS] // get flags -+ tbz x0, #TIF_NEED_RESCHED_LAZY, 2f // needs rescheduling? - 1: -+ bl arm64_preempt_schedule_irq // irq en/disable is done inside -+2: - #endif - - mov x0, sp ---- a/arch/arm64/kernel/signal.c -+++ b/arch/arm64/kernel/signal.c -@@ -915,7 +915,7 @@ asmlinkage void do_notify_resume(struct - unsigned long thread_flags) - { - do { -- if (thread_flags & _TIF_NEED_RESCHED) { -+ if (thread_flags & _TIF_NEED_RESCHED_MASK) { - /* Unmask Debug and SError for the next task */ - local_daif_restore(DAIF_PROCCTX_NOIRQ); - diff --git a/kernel/patches-5.11.x-rt/0186-jump-label-rt.patch b/kernel/patches-5.11.x-rt/0186-jump-label-rt.patch deleted file mode 100644 index 7b9d40c8ae..0000000000 --- a/kernel/patches-5.11.x-rt/0186-jump-label-rt.patch +++ /dev/null @@ -1,35 +0,0 @@ -Subject: jump-label: disable if stop_machine() is used -From: Thomas Gleixner -Date: Wed, 08 Jul 2015 17:14:48 +0200 - -Some architectures are using stop_machine() while switching the opcode which -leads to latency spikes. -The architectures which use stop_machine() atm: -- ARM stop machine -- s390 stop machine - -The architecures which use other sorcery: -- MIPS -- X86 -- powerpc -- sparc -- arm64 - -Signed-off-by: Thomas Gleixner -[bigeasy: only ARM for now] -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -66,7 +66,7 @@ config ARM - select HARDIRQS_SW_RESEND - select HAVE_ARCH_AUDITSYSCALL if AEABI && !OABI_COMPAT - select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 -- select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU -+ select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU && !PREEMPT_RT - select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU - select HAVE_ARCH_KASAN if MMU && !XIP_KERNEL - select HAVE_ARCH_MMAP_RND_BITS if MMU diff --git a/kernel/patches-5.11.x-rt/0187-leds-trigger-disable-CPU-trigger-on-RT.patch b/kernel/patches-5.11.x-rt/0187-leds-trigger-disable-CPU-trigger-on-RT.patch deleted file mode 100644 index 4de8abe6bc..0000000000 --- a/kernel/patches-5.11.x-rt/0187-leds-trigger-disable-CPU-trigger-on-RT.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 23 Jan 2014 14:45:59 +0100 -Subject: leds: trigger: disable CPU trigger on -RT - -as it triggers: -|CPU: 0 PID: 0 Comm: swapper Not tainted 3.12.8-rt10 #141 -|[] (unwind_backtrace+0x0/0xf8) from [] (show_stack+0x1c/0x20) -|[] (show_stack+0x1c/0x20) from [] (dump_stack+0x20/0x2c) -|[] (dump_stack+0x20/0x2c) from [] (__might_sleep+0x13c/0x170) -|[] (__might_sleep+0x13c/0x170) from [] (__rt_spin_lock+0x28/0x38) -|[] (__rt_spin_lock+0x28/0x38) from [] (rt_read_lock+0x68/0x7c) -|[] (rt_read_lock+0x68/0x7c) from [] (led_trigger_event+0x2c/0x5c) -|[] (led_trigger_event+0x2c/0x5c) from [] (ledtrig_cpu+0x54/0x5c) -|[] (ledtrig_cpu+0x54/0x5c) from [] (arch_cpu_idle_exit+0x18/0x1c) -|[] (arch_cpu_idle_exit+0x18/0x1c) from [] (cpu_startup_entry+0xa8/0x234) -|[] (cpu_startup_entry+0xa8/0x234) from [] (rest_init+0xb8/0xe0) -|[] (rest_init+0xb8/0xe0) from [] (start_kernel+0x2c4/0x380) - - -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/leds/trigger/Kconfig | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/leds/trigger/Kconfig -+++ b/drivers/leds/trigger/Kconfig -@@ -64,6 +64,7 @@ config LEDS_TRIGGER_BACKLIGHT - - config LEDS_TRIGGER_CPU - bool "LED CPU Trigger" -+ depends on !PREEMPT_RT - help - This allows LEDs to be controlled by active CPUs. This shows - the active CPUs across an array of LEDs so you can see which diff --git a/kernel/patches-5.11.x-rt/0188-drivers-tty-fix-omap-lock-crap.patch b/kernel/patches-5.11.x-rt/0188-drivers-tty-fix-omap-lock-crap.patch deleted file mode 100644 index 1e7206eb5b..0000000000 --- a/kernel/patches-5.11.x-rt/0188-drivers-tty-fix-omap-lock-crap.patch +++ /dev/null @@ -1,42 +0,0 @@ -Subject: tty/serial/omap: Make the locking RT aware -From: Thomas Gleixner -Date: Thu, 28 Jul 2011 13:32:57 +0200 - -The lock is a sleeping lock and local_irq_save() is not the -optimsation we are looking for. Redo it to make it work on -RT and -non-RT. - -Signed-off-by: Thomas Gleixner ---- - drivers/tty/serial/omap-serial.c | 12 ++++-------- - 1 file changed, 4 insertions(+), 8 deletions(-) - ---- a/drivers/tty/serial/omap-serial.c -+++ b/drivers/tty/serial/omap-serial.c -@@ -1301,13 +1301,10 @@ serial_omap_console_write(struct console - - pm_runtime_get_sync(up->dev); - -- local_irq_save(flags); -- if (up->port.sysrq) -- locked = 0; -- else if (oops_in_progress) -- locked = spin_trylock(&up->port.lock); -+ if (up->port.sysrq || oops_in_progress) -+ locked = spin_trylock_irqsave(&up->port.lock, flags); - else -- spin_lock(&up->port.lock); -+ spin_lock_irqsave(&up->port.lock, flags); - - /* - * First save the IER then disable the interrupts -@@ -1336,8 +1333,7 @@ serial_omap_console_write(struct console - pm_runtime_mark_last_busy(up->dev); - pm_runtime_put_autosuspend(up->dev); - if (locked) -- spin_unlock(&up->port.lock); -- local_irq_restore(flags); -+ spin_unlock_irqrestore(&up->port.lock, flags); - } - - static int __init diff --git a/kernel/patches-5.11.x-rt/0189-drivers-tty-pl011-irq-disable-madness.patch b/kernel/patches-5.11.x-rt/0189-drivers-tty-pl011-irq-disable-madness.patch deleted file mode 100644 index d231b15257..0000000000 --- a/kernel/patches-5.11.x-rt/0189-drivers-tty-pl011-irq-disable-madness.patch +++ /dev/null @@ -1,53 +0,0 @@ -Subject: tty/serial/pl011: Make the locking work on RT -From: Thomas Gleixner -Date: Tue, 08 Jan 2013 21:36:51 +0100 - -The lock is a sleeping lock and local_irq_save() is not the optimsation -we are looking for. Redo it to make it work on -RT and non-RT. - -Signed-off-by: Thomas Gleixner ---- - drivers/tty/serial/amba-pl011.c | 17 +++++++++++------ - 1 file changed, 11 insertions(+), 6 deletions(-) - ---- a/drivers/tty/serial/amba-pl011.c -+++ b/drivers/tty/serial/amba-pl011.c -@@ -2201,18 +2201,24 @@ pl011_console_write(struct console *co, - { - struct uart_amba_port *uap = amba_ports[co->index]; - unsigned int old_cr = 0, new_cr; -- unsigned long flags; -+ unsigned long flags = 0; - int locked = 1; - - clk_enable(uap->clk); - -- local_irq_save(flags); -+ /* -+ * local_irq_save(flags); -+ * -+ * This local_irq_save() is nonsense. If we come in via sysrq -+ * handling then interrupts are already disabled. Aside of -+ * that the port.sysrq check is racy on SMP regardless. -+ */ - if (uap->port.sysrq) - locked = 0; - else if (oops_in_progress) -- locked = spin_trylock(&uap->port.lock); -+ locked = spin_trylock_irqsave(&uap->port.lock, flags); - else -- spin_lock(&uap->port.lock); -+ spin_lock_irqsave(&uap->port.lock, flags); - - /* - * First save the CR then disable the interrupts -@@ -2238,8 +2244,7 @@ pl011_console_write(struct console *co, - pl011_write(old_cr, uap, REG_CR); - - if (locked) -- spin_unlock(&uap->port.lock); -- local_irq_restore(flags); -+ spin_unlock_irqrestore(&uap->port.lock, flags); - - clk_disable(uap->clk); - } diff --git a/kernel/patches-5.11.x-rt/0190-ARM-enable-irq-in-translation-section-permission-fau.patch b/kernel/patches-5.11.x-rt/0190-ARM-enable-irq-in-translation-section-permission-fau.patch deleted file mode 100644 index 74a9592756..0000000000 --- a/kernel/patches-5.11.x-rt/0190-ARM-enable-irq-in-translation-section-permission-fau.patch +++ /dev/null @@ -1,85 +0,0 @@ -From: "Yadi.hu" -Date: Wed, 10 Dec 2014 10:32:09 +0800 -Subject: ARM: enable irq in translation/section permission fault handlers - -Probably happens on all ARM, with -CONFIG_PREEMPT_RT -CONFIG_DEBUG_ATOMIC_SLEEP - -This simple program.... - -int main() { - *((char*)0xc0001000) = 0; -}; - -[ 512.742724] BUG: sleeping function called from invalid context at kernel/rtmutex.c:658 -[ 512.743000] in_atomic(): 0, irqs_disabled(): 128, pid: 994, name: a -[ 512.743217] INFO: lockdep is turned off. -[ 512.743360] irq event stamp: 0 -[ 512.743482] hardirqs last enabled at (0): [< (null)>] (null) -[ 512.743714] hardirqs last disabled at (0): [] copy_process+0x3b0/0x11c0 -[ 512.744013] softirqs last enabled at (0): [] copy_process+0x3b0/0x11c0 -[ 512.744303] softirqs last disabled at (0): [< (null)>] (null) -[ 512.744631] [] (unwind_backtrace+0x0/0x104) -[ 512.745001] [] (dump_stack+0x20/0x24) -[ 512.745355] [] (__might_sleep+0x1dc/0x1e0) -[ 512.745717] [] (rt_spin_lock+0x34/0x6c) -[ 512.746073] [] (do_force_sig_info+0x34/0xf0) -[ 512.746457] [] (force_sig_info+0x18/0x1c) -[ 512.746829] [] (__do_user_fault+0x9c/0xd8) -[ 512.747185] [] (do_bad_area+0x7c/0x94) -[ 512.747536] [] (do_sect_fault+0x40/0x48) -[ 512.747898] [] (do_DataAbort+0x40/0xa0) -[ 512.748181] Exception stack(0xecaa1fb0 to 0xecaa1ff8) - -Oxc0000000 belongs to kernel address space, user task can not be -allowed to access it. For above condition, correct result is that -test case should receive a “segment fault” and exits but not stacks. - -the root cause is commit 02fe2845d6a8 ("avoid enabling interrupts in -prefetch/data abort handlers"),it deletes irq enable block in Data -abort assemble code and move them into page/breakpiont/alignment fault -handlers instead. But author does not enable irq in translation/section -permission fault handlers. ARM disables irq when it enters exception/ -interrupt mode, if kernel doesn't enable irq, it would be still disabled -during translation/section permission fault. - -We see the above splat because do_force_sig_info is still called with -IRQs off, and that code eventually does a: - - spin_lock_irqsave(&t->sighand->siglock, flags); - -As this is architecture independent code, and we've not seen any other -need for other arch to have the siglock converted to raw lock, we can -conclude that we should enable irq for ARM translation/section -permission exception. - - -Signed-off-by: Yadi.hu -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm/mm/fault.c | 6 ++++++ - 1 file changed, 6 insertions(+) - ---- a/arch/arm/mm/fault.c -+++ b/arch/arm/mm/fault.c -@@ -400,6 +400,9 @@ do_translation_fault(unsigned long addr, - if (addr < TASK_SIZE) - return do_page_fault(addr, fsr, regs); - -+ if (interrupts_enabled(regs)) -+ local_irq_enable(); -+ - if (user_mode(regs)) - goto bad_area; - -@@ -470,6 +473,9 @@ do_translation_fault(unsigned long addr, - static int - do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) - { -+ if (interrupts_enabled(regs)) -+ local_irq_enable(); -+ - do_bad_area(addr, fsr, regs); - return 0; - } diff --git a/kernel/patches-5.11.x-rt/0191-genirq-update-irq_set_irqchip_state-documentation.patch b/kernel/patches-5.11.x-rt/0191-genirq-update-irq_set_irqchip_state-documentation.patch deleted file mode 100644 index 9b9e681b95..0000000000 --- a/kernel/patches-5.11.x-rt/0191-genirq-update-irq_set_irqchip_state-documentation.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Josh Cartwright -Date: Thu, 11 Feb 2016 11:54:00 -0600 -Subject: genirq: update irq_set_irqchip_state documentation - -On -rt kernels, the use of migrate_disable()/migrate_enable() is -sufficient to guarantee a task isn't moved to another CPU. Update the -irq_set_irqchip_state() documentation to reflect this. - -Signed-off-by: Josh Cartwright -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/irq/manage.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -2787,7 +2787,7 @@ EXPORT_SYMBOL_GPL(irq_get_irqchip_state) - * This call sets the internal irqchip state of an interrupt, - * depending on the value of @which. - * -- * This function should be called with preemption disabled if the -+ * This function should be called with migration disabled if the - * interrupt controller has per-cpu registers. - */ - int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which, diff --git a/kernel/patches-5.11.x-rt/0192-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch b/kernel/patches-5.11.x-rt/0192-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch deleted file mode 100644 index 3f22ed2681..0000000000 --- a/kernel/patches-5.11.x-rt/0192-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch +++ /dev/null @@ -1,51 +0,0 @@ -From: Josh Cartwright -Date: Thu, 11 Feb 2016 11:54:01 -0600 -Subject: KVM: arm/arm64: downgrade preempt_disable()d region to migrate_disable() - -kvm_arch_vcpu_ioctl_run() disables the use of preemption when updating -the vgic and timer states to prevent the calling task from migrating to -another CPU. It does so to prevent the task from writing to the -incorrect per-CPU GIC distributor registers. - -On -rt kernels, it's possible to maintain the same guarantee with the -use of migrate_{disable,enable}(), with the added benefit that the -migrate-disabled region is preemptible. Update -kvm_arch_vcpu_ioctl_run() to do so. - -Cc: Christoffer Dall -Reported-by: Manish Jaggi -Signed-off-by: Josh Cartwright -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm64/kvm/arm.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/arch/arm64/kvm/arm.c -+++ b/arch/arm64/kvm/arm.c -@@ -732,7 +732,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v - * involves poking the GIC, which must be done in a - * non-preemptible context. - */ -- preempt_disable(); -+ migrate_disable(); - - kvm_pmu_flush_hwstate(vcpu); - -@@ -781,7 +781,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v - kvm_timer_sync_user(vcpu); - kvm_vgic_sync_hwstate(vcpu); - local_irq_enable(); -- preempt_enable(); -+ migrate_enable(); - continue; - } - -@@ -853,7 +853,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v - /* Exit types that need handling before we can be preempted */ - handle_exit_early(vcpu, ret); - -- preempt_enable(); -+ migrate_enable(); - - /* - * The ARMv8 architecture doesn't give the hypervisor diff --git a/kernel/patches-5.11.x-rt/0193-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch b/kernel/patches-5.11.x-rt/0193-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch deleted file mode 100644 index 4078b8dba4..0000000000 --- a/kernel/patches-5.11.x-rt/0193-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch +++ /dev/null @@ -1,58 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Wed, 25 Jul 2018 14:02:38 +0200 -Subject: [PATCH] arm64: fpsimd: Delay freeing memory in fpsimd_flush_thread() - -fpsimd_flush_thread() invokes kfree() via sve_free() within a preempt disabled -section which is not working on -RT. - -Delay freeing of memory until preemption is enabled again. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm64/kernel/fpsimd.c | 14 +++++++++++++- - 1 file changed, 13 insertions(+), 1 deletion(-) - ---- a/arch/arm64/kernel/fpsimd.c -+++ b/arch/arm64/kernel/fpsimd.c -@@ -226,6 +226,16 @@ static void sve_free(struct task_struct - __sve_free(task); - } - -+static void *sve_free_atomic(struct task_struct *task) -+{ -+ void *sve_state = task->thread.sve_state; -+ -+ WARN_ON(test_tsk_thread_flag(task, TIF_SVE)); -+ -+ task->thread.sve_state = NULL; -+ return sve_state; -+} -+ - /* - * TIF_SVE controls whether a task can use SVE without trapping while - * in userspace, and also the way a task's FPSIMD/SVE state is stored -@@ -1022,6 +1032,7 @@ void fpsimd_thread_switch(struct task_st - void fpsimd_flush_thread(void) - { - int vl, supported_vl; -+ void *mem = NULL; - - if (!system_supports_fpsimd()) - return; -@@ -1034,7 +1045,7 @@ void fpsimd_flush_thread(void) - - if (system_supports_sve()) { - clear_thread_flag(TIF_SVE); -- sve_free(current); -+ mem = sve_free_atomic(current); - - /* - * Reset the task vector length as required. -@@ -1068,6 +1079,7 @@ void fpsimd_flush_thread(void) - } - - put_cpu_fpsimd_context(); -+ kfree(mem); - } - - /* diff --git a/kernel/patches-5.11.x-rt/0194-x86-Enable-RT-also-on-32bit.patch b/kernel/patches-5.11.x-rt/0194-x86-Enable-RT-also-on-32bit.patch deleted file mode 100644 index 54b3af2828..0000000000 --- a/kernel/patches-5.11.x-rt/0194-x86-Enable-RT-also-on-32bit.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Thu, 7 Nov 2019 17:49:20 +0100 -Subject: [PATCH] x86: Enable RT also on 32bit - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/x86/Kconfig -+++ b/arch/x86/Kconfig -@@ -27,7 +27,6 @@ config X86_64 - # Options that are inherently 64-bit kernel only: - select ARCH_HAS_GIGANTIC_PAGE - select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 -- select ARCH_SUPPORTS_RT - select ARCH_USE_CMPXCHG_LOCKREF - select HAVE_ARCH_SOFT_DIRTY - select MODULES_USE_ELF_RELA -@@ -97,6 +96,7 @@ config X86 - select ARCH_SUPPORTS_DEBUG_PAGEALLOC - select ARCH_SUPPORTS_NUMA_BALANCING if X86_64 - select ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP if NR_CPUS <= 4096 -+ select ARCH_SUPPORTS_RT - select ARCH_USE_BUILTIN_BSWAP - select ARCH_USE_QUEUED_RWLOCKS - select ARCH_USE_QUEUED_SPINLOCKS diff --git a/kernel/patches-5.11.x-rt/0195-ARM-Allow-to-enable-RT.patch b/kernel/patches-5.11.x-rt/0195-ARM-Allow-to-enable-RT.patch deleted file mode 100644 index ea82b69c82..0000000000 --- a/kernel/patches-5.11.x-rt/0195-ARM-Allow-to-enable-RT.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 11 Oct 2019 13:14:29 +0200 -Subject: [PATCH] ARM: Allow to enable RT - -Allow to select RT. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm/Kconfig | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -30,6 +30,7 @@ config ARM - select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX - select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT if CPU_V7 - select ARCH_SUPPORTS_ATOMIC_RMW -+ select ARCH_SUPPORTS_RT if HAVE_POSIX_CPU_TIMERS_TASK_WORK - select ARCH_USE_BUILTIN_BSWAP - select ARCH_USE_CMPXCHG_LOCKREF - select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU -@@ -123,6 +124,7 @@ config ARM - select OLD_SIGSUSPEND3 - select PCI_SYSCALL if PCI - select PERF_USE_VMALLOC -+ select HAVE_POSIX_CPU_TIMERS_TASK_WORK if !KVM - select RTC_LIB - select SET_FS - select SYS_SUPPORTS_APM_EMULATION diff --git a/kernel/patches-5.11.x-rt/0196-ARM64-Allow-to-enable-RT.patch b/kernel/patches-5.11.x-rt/0196-ARM64-Allow-to-enable-RT.patch deleted file mode 100644 index 17e8ae2a32..0000000000 --- a/kernel/patches-5.11.x-rt/0196-ARM64-Allow-to-enable-RT.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 11 Oct 2019 13:14:35 +0200 -Subject: [PATCH] ARM64: Allow to enable RT - -Allow to select RT. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm64/Kconfig | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -76,6 +76,7 @@ config ARM64 - select ARCH_SUPPORTS_ATOMIC_RMW - select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 && (GCC_VERSION >= 50000 || CC_IS_CLANG) - select ARCH_SUPPORTS_NUMA_BALANCING -+ select ARCH_SUPPORTS_RT if HAVE_POSIX_CPU_TIMERS_TASK_WORK - select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT - select ARCH_WANT_DEFAULT_BPF_JIT - select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT -@@ -198,6 +199,7 @@ config ARM64 - select PCI_DOMAINS_GENERIC if PCI - select PCI_ECAM if (ACPI && PCI) - select PCI_SYSCALL if PCI -+ select HAVE_POSIX_CPU_TIMERS_TASK_WORK if !KVM - select POWER_RESET - select POWER_SUPPLY - select SPARSE_IRQ diff --git a/kernel/patches-5.11.x-rt/0197-powerpc-traps.patch b/kernel/patches-5.11.x-rt/0197-powerpc-traps.patch deleted file mode 100644 index 07ce6ec563..0000000000 --- a/kernel/patches-5.11.x-rt/0197-powerpc-traps.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 26 Jul 2019 11:30:49 +0200 -Subject: [PATCH] powerpc: traps: Use PREEMPT_RT - -Add PREEMPT_RT to the backtrace if enabled. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/kernel/traps.c | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - ---- a/arch/powerpc/kernel/traps.c -+++ b/arch/powerpc/kernel/traps.c -@@ -259,12 +259,17 @@ static char *get_mmu_str(void) - - static int __die(const char *str, struct pt_regs *regs, long err) - { -+ const char *pr = ""; -+ - printk("Oops: %s, sig: %ld [#%d]\n", str, err, ++die_counter); - -+ if (IS_ENABLED(CONFIG_PREEMPTION)) -+ pr = IS_ENABLED(CONFIG_PREEMPT_RT) ? " PREEMPT_RT" : " PREEMPT"; -+ - printk("%s PAGE_SIZE=%luK%s%s%s%s%s%s %s\n", - IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN) ? "LE" : "BE", - PAGE_SIZE / 1024, get_mmu_str(), -- IS_ENABLED(CONFIG_PREEMPT) ? " PREEMPT" : "", -+ pr, - IS_ENABLED(CONFIG_SMP) ? " SMP" : "", - IS_ENABLED(CONFIG_SMP) ? (" NR_CPUS=" __stringify(NR_CPUS)) : "", - debug_pagealloc_enabled() ? " DEBUG_PAGEALLOC" : "", diff --git a/kernel/patches-5.11.x-rt/0198-powerpc-pseries-iommu-Use-a-locallock-instead-local_ir.patch b/kernel/patches-5.11.x-rt/0198-powerpc-pseries-iommu-Use-a-locallock-instead-local_ir.patch deleted file mode 100644 index 470c640204..0000000000 --- a/kernel/patches-5.11.x-rt/0198-powerpc-pseries-iommu-Use-a-locallock-instead-local_ir.patch +++ /dev/null @@ -1,110 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 26 Mar 2019 18:31:54 +0100 -Subject: [PATCH] powerpc/pseries/iommu: Use a locallock instead - local_irq_save() - -The locallock protects the per-CPU variable tce_page. The function -attempts to allocate memory while tce_page is protected (by disabling -interrupts). - -Use local_irq_save() instead of local_irq_disable(). - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/platforms/pseries/iommu.c | 31 ++++++++++++++++++++----------- - 1 file changed, 20 insertions(+), 11 deletions(-) - ---- a/arch/powerpc/platforms/pseries/iommu.c -+++ b/arch/powerpc/platforms/pseries/iommu.c -@@ -24,6 +24,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -190,7 +191,13 @@ static int tce_build_pSeriesLP(unsigned - return ret; - } - --static DEFINE_PER_CPU(__be64 *, tce_page); -+struct tce_page { -+ __be64 * page; -+ local_lock_t lock; -+}; -+static DEFINE_PER_CPU(struct tce_page, tce_page) = { -+ .lock = INIT_LOCAL_LOCK(lock), -+}; - - static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, - long npages, unsigned long uaddr, -@@ -212,9 +219,10 @@ static int tce_buildmulti_pSeriesLP(stru - direction, attrs); - } - -- local_irq_save(flags); /* to protect tcep and the page behind it */ -+ /* to protect tcep and the page behind it */ -+ local_lock_irqsave(&tce_page.lock, flags); - -- tcep = __this_cpu_read(tce_page); -+ tcep = __this_cpu_read(tce_page.page); - - /* This is safe to do since interrupts are off when we're called - * from iommu_alloc{,_sg}() -@@ -223,12 +231,12 @@ static int tce_buildmulti_pSeriesLP(stru - tcep = (__be64 *)__get_free_page(GFP_ATOMIC); - /* If allocation fails, fall back to the loop implementation */ - if (!tcep) { -- local_irq_restore(flags); -+ local_unlock_irqrestore(&tce_page.lock, flags); - return tce_build_pSeriesLP(tbl->it_index, tcenum, - tbl->it_page_shift, - npages, uaddr, direction, attrs); - } -- __this_cpu_write(tce_page, tcep); -+ __this_cpu_write(tce_page.page, tcep); - } - - rpn = __pa(uaddr) >> TCE_SHIFT; -@@ -258,7 +266,7 @@ static int tce_buildmulti_pSeriesLP(stru - tcenum += limit; - } while (npages > 0 && !rc); - -- local_irq_restore(flags); -+ local_unlock_irqrestore(&tce_page.lock, flags); - - if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) { - ret = (int)rc; -@@ -429,16 +437,17 @@ static int tce_setrange_multi_pSeriesLP( - DMA_BIDIRECTIONAL, 0); - } - -- local_irq_disable(); /* to protect tcep and the page behind it */ -- tcep = __this_cpu_read(tce_page); -+ /* to protect tcep and the page behind it */ -+ local_lock_irq(&tce_page.lock); -+ tcep = __this_cpu_read(tce_page.page); - - if (!tcep) { - tcep = (__be64 *)__get_free_page(GFP_ATOMIC); - if (!tcep) { -- local_irq_enable(); -+ local_unlock_irq(&tce_page.lock); - return -ENOMEM; - } -- __this_cpu_write(tce_page, tcep); -+ __this_cpu_write(tce_page.page, tcep); - } - - proto_tce = TCE_PCI_READ | TCE_PCI_WRITE; -@@ -481,7 +490,7 @@ static int tce_setrange_multi_pSeriesLP( - - /* error cleanup: caller will clear whole range */ - -- local_irq_enable(); -+ local_unlock_irq(&tce_page.lock); - return rc; - } - diff --git a/kernel/patches-5.11.x-rt/0199-powerpc-kvm-Disable-in-kernel-MPIC-emulation-for-PRE.patch b/kernel/patches-5.11.x-rt/0199-powerpc-kvm-Disable-in-kernel-MPIC-emulation-for-PRE.patch deleted file mode 100644 index bbd087bf30..0000000000 --- a/kernel/patches-5.11.x-rt/0199-powerpc-kvm-Disable-in-kernel-MPIC-emulation-for-PRE.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Bogdan Purcareata -Date: Fri, 24 Apr 2015 15:53:13 +0000 -Subject: powerpc/kvm: Disable in-kernel MPIC emulation for PREEMPT_RT - -While converting the openpic emulation code to use a raw_spinlock_t enables -guests to run on RT, there's still a performance issue. For interrupts sent in -directed delivery mode with a multiple CPU mask, the emulated openpic will loop -through all of the VCPUs, and for each VCPUs, it call IRQ_check, which will loop -through all the pending interrupts for that VCPU. This is done while holding the -raw_lock, meaning that in all this time the interrupts and preemption are -disabled on the host Linux. A malicious user app can max both these number and -cause a DoS. - -This temporary fix is sent for two reasons. First is so that users who want to -use the in-kernel MPIC emulation are aware of the potential latencies, thus -making sure that the hardware MPIC and their usage scenario does not involve -interrupts sent in directed delivery mode, and the number of possible pending -interrupts is kept small. Secondly, this should incentivize the development of a -proper openpic emulation that would be better suited for RT. - -Acked-by: Scott Wood -Signed-off-by: Bogdan Purcareata -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/kvm/Kconfig | 1 + - 1 file changed, 1 insertion(+) - ---- a/arch/powerpc/kvm/Kconfig -+++ b/arch/powerpc/kvm/Kconfig -@@ -179,6 +179,7 @@ config KVM_E500MC - config KVM_MPIC - bool "KVM in-kernel MPIC emulation" - depends on KVM && E500 -+ depends on !PREEMPT_RT - select HAVE_KVM_IRQCHIP - select HAVE_KVM_IRQFD - select HAVE_KVM_IRQ_ROUTING diff --git a/kernel/patches-5.11.x-rt/0200-powerpc-stackprotector-work-around-stack-guard-init-.patch b/kernel/patches-5.11.x-rt/0200-powerpc-stackprotector-work-around-stack-guard-init-.patch deleted file mode 100644 index 40f5820ccd..0000000000 --- a/kernel/patches-5.11.x-rt/0200-powerpc-stackprotector-work-around-stack-guard-init-.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Tue, 26 Mar 2019 18:31:29 +0100 -Subject: [PATCH ] powerpc/stackprotector: work around stack-guard init from - atomic - -This is invoked from the secondary CPU in atomic context. On x86 we use -tsc instead. On Power we XOR it against mftb() so lets use stack address -as the initial value. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/include/asm/stackprotector.h | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/arch/powerpc/include/asm/stackprotector.h -+++ b/arch/powerpc/include/asm/stackprotector.h -@@ -24,7 +24,11 @@ static __always_inline void boot_init_st - unsigned long canary; - - /* Try to get a semi random initial value. */ -+#ifdef CONFIG_PREEMPT_RT -+ canary = (unsigned long)&canary; -+#else - canary = get_random_canary(); -+#endif - canary ^= mftb(); - canary ^= LINUX_VERSION_CODE; - canary &= CANARY_MASK; diff --git a/kernel/patches-5.11.x-rt/0201-powerpc-Avoid-recursive-header-includes.patch b/kernel/patches-5.11.x-rt/0201-powerpc-Avoid-recursive-header-includes.patch deleted file mode 100644 index 6a048d5987..0000000000 --- a/kernel/patches-5.11.x-rt/0201-powerpc-Avoid-recursive-header-includes.patch +++ /dev/null @@ -1,39 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 8 Jan 2021 19:48:21 +0100 -Subject: [PATCH] powerpc: Avoid recursive header includes - -- The include of bug.h leads to an include of printk.h which gets back - to spinlock.h and complains then about missing xchg(). - Remove bug.h and add bits.h which is needed for BITS_PER_BYTE. - -- Avoid the "please don't include this file directly" error from - rwlock-rt. Allow an include from/with rtmutex.h. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/include/asm/cmpxchg.h | 2 +- - arch/powerpc/include/asm/simple_spinlock_types.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - ---- a/arch/powerpc/include/asm/cmpxchg.h -+++ b/arch/powerpc/include/asm/cmpxchg.h -@@ -5,7 +5,7 @@ - #ifdef __KERNEL__ - #include - #include --#include -+#include - - #ifdef __BIG_ENDIAN - #define BITOFF_CAL(size, off) ((sizeof(u32) - size - off) * BITS_PER_BYTE) ---- a/arch/powerpc/include/asm/simple_spinlock_types.h -+++ b/arch/powerpc/include/asm/simple_spinlock_types.h -@@ -2,7 +2,7 @@ - #ifndef _ASM_POWERPC_SIMPLE_SPINLOCK_TYPES_H - #define _ASM_POWERPC_SIMPLE_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H -+#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__LINUX_RT_MUTEX_H) - # error "please don't include this file directly" - #endif - diff --git a/kernel/patches-5.11.x-rt/0202-POWERPC-Allow-to-enable-RT.patch b/kernel/patches-5.11.x-rt/0202-POWERPC-Allow-to-enable-RT.patch deleted file mode 100644 index 4a4abc82a3..0000000000 --- a/kernel/patches-5.11.x-rt/0202-POWERPC-Allow-to-enable-RT.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Sebastian Andrzej Siewior -Date: Fri, 11 Oct 2019 13:14:41 +0200 -Subject: [PATCH] POWERPC: Allow to enable RT - -Allow to select RT. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/powerpc/Kconfig | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/arch/powerpc/Kconfig -+++ b/arch/powerpc/Kconfig -@@ -147,6 +147,7 @@ config PPC - select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX - select ARCH_SUPPORTS_ATOMIC_RMW - select ARCH_SUPPORTS_DEBUG_PAGEALLOC if PPC32 || PPC_BOOK3S_64 -+ select ARCH_SUPPORTS_RT if HAVE_POSIX_CPU_TIMERS_TASK_WORK - select ARCH_USE_BUILTIN_BSWAP - select ARCH_USE_CMPXCHG_LOCKREF if PPC64 - select ARCH_USE_QUEUED_RWLOCKS if PPC_QUEUED_SPINLOCKS -@@ -241,6 +242,7 @@ config PPC - select HAVE_SYSCALL_TRACEPOINTS - select HAVE_VIRT_CPU_ACCOUNTING - select HAVE_IRQ_TIME_ACCOUNTING -+ select HAVE_POSIX_CPU_TIMERS_TASK_WORK if !KVM - select HAVE_RSEQ - select IOMMU_HELPER if PPC64 - select IRQ_DOMAIN diff --git a/kernel/patches-5.11.x-rt/0203-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch b/kernel/patches-5.11.x-rt/0203-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch deleted file mode 100644 index e1ee8673d6..0000000000 --- a/kernel/patches-5.11.x-rt/0203-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch +++ /dev/null @@ -1,84 +0,0 @@ -From: Mike Galbraith -Date: Thu, 31 Mar 2016 04:08:28 +0200 -Subject: [PATCH] drivers/block/zram: Replace bit spinlocks with rtmutex - for -rt - -They're nondeterministic, and lead to ___might_sleep() splats in -rt. -OTOH, they're a lot less wasteful than an rtmutex per page. - -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/block/zram/zram_drv.c | 36 ++++++++++++++++++++++++++++++++++++ - drivers/block/zram/zram_drv.h | 1 + - 2 files changed, 37 insertions(+) - ---- a/drivers/block/zram/zram_drv.c -+++ b/drivers/block/zram/zram_drv.c -@@ -59,6 +59,40 @@ static void zram_free_page(struct zram * - static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, - u32 index, int offset, struct bio *bio); - -+#ifdef CONFIG_PREEMPT_RT -+static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) -+{ -+ size_t index; -+ -+ for (index = 0; index < num_pages; index++) -+ spin_lock_init(&zram->table[index].lock); -+} -+ -+static int zram_slot_trylock(struct zram *zram, u32 index) -+{ -+ int ret; -+ -+ ret = spin_trylock(&zram->table[index].lock); -+ if (ret) -+ __set_bit(ZRAM_LOCK, &zram->table[index].flags); -+ return ret; -+} -+ -+static void zram_slot_lock(struct zram *zram, u32 index) -+{ -+ spin_lock(&zram->table[index].lock); -+ __set_bit(ZRAM_LOCK, &zram->table[index].flags); -+} -+ -+static void zram_slot_unlock(struct zram *zram, u32 index) -+{ -+ __clear_bit(ZRAM_LOCK, &zram->table[index].flags); -+ spin_unlock(&zram->table[index].lock); -+} -+ -+#else -+ -+static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) { } - - static int zram_slot_trylock(struct zram *zram, u32 index) - { -@@ -74,6 +108,7 @@ static void zram_slot_unlock(struct zram - { - bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags); - } -+#endif - - static inline bool init_done(struct zram *zram) - { -@@ -1165,6 +1200,7 @@ static bool zram_meta_alloc(struct zram - - if (!huge_class_size) - huge_class_size = zs_huge_class_size(zram->mem_pool); -+ zram_meta_init_table_locks(zram, num_pages); - return true; - } - ---- a/drivers/block/zram/zram_drv.h -+++ b/drivers/block/zram/zram_drv.h -@@ -63,6 +63,7 @@ struct zram_table_entry { - unsigned long element; - }; - unsigned long flags; -+ spinlock_t lock; - #ifdef CONFIG_ZRAM_MEMORY_TRACKING - ktime_t ac_time; - #endif diff --git a/kernel/patches-5.11.x-rt/0204-tpm_tis-fix-stall-after-iowrite-s.patch b/kernel/patches-5.11.x-rt/0204-tpm_tis-fix-stall-after-iowrite-s.patch deleted file mode 100644 index 445d8ab7d6..0000000000 --- a/kernel/patches-5.11.x-rt/0204-tpm_tis-fix-stall-after-iowrite-s.patch +++ /dev/null @@ -1,77 +0,0 @@ -From: Haris Okanovic -Date: Tue, 15 Aug 2017 15:13:08 -0500 -Subject: [PATCH] tpm_tis: fix stall after iowrite*()s - -ioread8() operations to TPM MMIO addresses can stall the cpu when -immediately following a sequence of iowrite*()'s to the same region. - -For example, cyclitest measures ~400us latency spikes when a non-RT -usermode application communicates with an SPI-based TPM chip (Intel Atom -E3940 system, PREEMPT_RT kernel). The spikes are caused by a -stalling ioread8() operation following a sequence of 30+ iowrite8()s to -the same address. I believe this happens because the write sequence is -buffered (in cpu or somewhere along the bus), and gets flushed on the -first LOAD instruction (ioread*()) that follows. - -The enclosed change appears to fix this issue: read the TPM chip's -access register (status code) after every iowrite*() operation to -amortize the cost of flushing data to chip across multiple instructions. - -Signed-off-by: Haris Okanovic -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/char/tpm/tpm_tis.c | 29 +++++++++++++++++++++++++++-- - 1 file changed, 27 insertions(+), 2 deletions(-) - ---- a/drivers/char/tpm/tpm_tis.c -+++ b/drivers/char/tpm/tpm_tis.c -@@ -50,6 +50,31 @@ static inline struct tpm_tis_tcg_phy *to - return container_of(data, struct tpm_tis_tcg_phy, priv); - } - -+#ifdef CONFIG_PREEMPT_RT -+/* -+ * Flushes previous write operations to chip so that a subsequent -+ * ioread*()s won't stall a cpu. -+ */ -+static inline void tpm_tis_flush(void __iomem *iobase) -+{ -+ ioread8(iobase + TPM_ACCESS(0)); -+} -+#else -+#define tpm_tis_flush(iobase) do { } while (0) -+#endif -+ -+static inline void tpm_tis_iowrite8(u8 b, void __iomem *iobase, u32 addr) -+{ -+ iowrite8(b, iobase + addr); -+ tpm_tis_flush(iobase); -+} -+ -+static inline void tpm_tis_iowrite32(u32 b, void __iomem *iobase, u32 addr) -+{ -+ iowrite32(b, iobase + addr); -+ tpm_tis_flush(iobase); -+} -+ - static int interrupts = -1; - module_param(interrupts, int, 0444); - MODULE_PARM_DESC(interrupts, "Enable interrupts"); -@@ -169,7 +194,7 @@ static int tpm_tcg_write_bytes(struct tp - struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); - - while (len--) -- iowrite8(*value++, phy->iobase + addr); -+ tpm_tis_iowrite8(*value++, phy->iobase, addr); - - return 0; - } -@@ -196,7 +221,7 @@ static int tpm_tcg_write32(struct tpm_ti - { - struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); - -- iowrite32(value, phy->iobase + addr); -+ tpm_tis_iowrite32(value, phy->iobase, addr); - - return 0; - } diff --git a/kernel/patches-5.11.x-rt/0205-signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch b/kernel/patches-5.11.x-rt/0205-signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch deleted file mode 100644 index 51cf1a0ccf..0000000000 --- a/kernel/patches-5.11.x-rt/0205-signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch +++ /dev/null @@ -1,202 +0,0 @@ -From: Thomas Gleixner -Date: Fri, 3 Jul 2009 08:44:56 -0500 -Subject: signals: Allow RT tasks to cache one sigqueue struct - -Allow realtime tasks to cache one sigqueue in task struct. This avoids an -allocation which can cause latencies or fail. -Ideally the sigqueue is cached after first sucessfull delivery and will be -available for next signal delivery. This works under the assumption that the RT -task has never an unprocessed singal while one is about to be queued. -The caching is not used for SIGQUEUE_PREALLOC because this kind of sigqueue is -handled differently (and not used for regular signal delivery). - -[bigeasy: With a fix from Matt Fleming ] -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/sched.h | 1 - include/linux/signal.h | 1 - kernel/exit.c | 2 - - kernel/fork.c | 1 - kernel/signal.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++--- - 5 files changed, 67 insertions(+), 5 deletions(-) - ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -985,6 +985,7 @@ struct task_struct { - /* Signal handlers: */ - struct signal_struct *signal; - struct sighand_struct __rcu *sighand; -+ struct sigqueue *sigqueue_cache; - sigset_t blocked; - sigset_t real_blocked; - /* Restored if set_restore_sigmask() was used: */ ---- a/include/linux/signal.h -+++ b/include/linux/signal.h -@@ -265,6 +265,7 @@ static inline void init_sigpending(struc - } - - extern void flush_sigqueue(struct sigpending *queue); -+extern void flush_task_sigqueue(struct task_struct *tsk); - - /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ - static inline int valid_signal(unsigned long sig) ---- a/kernel/exit.c -+++ b/kernel/exit.c -@@ -152,7 +152,7 @@ static void __exit_signal(struct task_st - * Do this under ->siglock, we can race with another thread - * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals. - */ -- flush_sigqueue(&tsk->pending); -+ flush_task_sigqueue(tsk); - tsk->sighand = NULL; - spin_unlock(&sighand->siglock); - ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -2017,6 +2017,7 @@ static __latent_entropy struct task_stru - spin_lock_init(&p->alloc_lock); - - init_sigpending(&p->pending); -+ p->sigqueue_cache = NULL; - - p->utime = p->stime = p->gtime = 0; - #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -404,13 +405,30 @@ void task_join_group_stop(struct task_st - task_set_jobctl_pending(task, mask | JOBCTL_STOP_PENDING); - } - -+static struct sigqueue *sigqueue_from_cache(struct task_struct *t) -+{ -+ struct sigqueue *q = t->sigqueue_cache; -+ -+ if (q && cmpxchg(&t->sigqueue_cache, q, NULL) == q) -+ return q; -+ return NULL; -+} -+ -+static bool sigqueue_add_cache(struct task_struct *t, struct sigqueue *q) -+{ -+ if (!t->sigqueue_cache && cmpxchg(&t->sigqueue_cache, NULL, q) == NULL) -+ return true; -+ return false; -+} -+ - /* - * allocate a new signal queue record - * - this may be called without locks if and only if t == current, otherwise an - * appropriate lock must be held to stop the target task from exiting - */ - static struct sigqueue * --__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimit) -+__sigqueue_do_alloc(int sig, struct task_struct *t, gfp_t flags, -+ int override_rlimit, bool fromslab) - { - struct sigqueue *q = NULL; - struct user_struct *user; -@@ -432,7 +450,10 @@ static struct sigqueue * - rcu_read_unlock(); - - if (override_rlimit || likely(sigpending <= task_rlimit(t, RLIMIT_SIGPENDING))) { -- q = kmem_cache_alloc(sigqueue_cachep, flags); -+ if (!fromslab) -+ q = sigqueue_from_cache(t); -+ if (!q) -+ q = kmem_cache_alloc(sigqueue_cachep, flags); - } else { - print_dropped_signal(sig); - } -@@ -449,6 +470,13 @@ static struct sigqueue * - return q; - } - -+static struct sigqueue * -+__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, -+ int override_rlimit) -+{ -+ return __sigqueue_do_alloc(sig, t, flags, override_rlimit, false); -+} -+ - static void __sigqueue_free(struct sigqueue *q) - { - if (q->flags & SIGQUEUE_PREALLOC) -@@ -458,6 +486,20 @@ static void __sigqueue_free(struct sigqu - kmem_cache_free(sigqueue_cachep, q); - } - -+static void __sigqueue_cache_or_free(struct sigqueue *q) -+{ -+ struct user_struct *up; -+ -+ if (q->flags & SIGQUEUE_PREALLOC) -+ return; -+ -+ up = q->user; -+ if (atomic_dec_and_test(&up->sigpending)) -+ free_uid(up); -+ if (!task_is_realtime(current) || !sigqueue_add_cache(current, q)) -+ kmem_cache_free(sigqueue_cachep, q); -+} -+ - void flush_sigqueue(struct sigpending *queue) - { - struct sigqueue *q; -@@ -471,6 +513,21 @@ void flush_sigqueue(struct sigpending *q - } - - /* -+ * Called from __exit_signal. Flush tsk->pending and -+ * tsk->sigqueue_cache -+ */ -+void flush_task_sigqueue(struct task_struct *tsk) -+{ -+ struct sigqueue *q; -+ -+ flush_sigqueue(&tsk->pending); -+ -+ q = sigqueue_from_cache(tsk); -+ if (q) -+ kmem_cache_free(sigqueue_cachep, q); -+} -+ -+/* - * Flush all pending signals for this kthread. - */ - void flush_signals(struct task_struct *t) -@@ -594,7 +651,7 @@ static void collect_signal(int sig, stru - (info->si_code == SI_TIMER) && - (info->si_sys_private); - -- __sigqueue_free(first); -+ __sigqueue_cache_or_free(first); - } else { - /* - * Ok, it wasn't in the queue. This must be -@@ -631,6 +688,8 @@ int dequeue_signal(struct task_struct *t - bool resched_timer = false; - int signr; - -+ WARN_ON_ONCE(tsk != current); -+ - /* We only dequeue private signals from ourselves, we don't let - * signalfd steal them - */ -@@ -1835,7 +1894,7 @@ EXPORT_SYMBOL(kill_pid); - */ - struct sigqueue *sigqueue_alloc(void) - { -- struct sigqueue *q = __sigqueue_alloc(-1, current, GFP_KERNEL, 0); -+ struct sigqueue *q = __sigqueue_do_alloc(-1, current, GFP_KERNEL, 0, true); - - if (q) - q->flags |= SIGQUEUE_PREALLOC; diff --git a/kernel/patches-5.11.x-rt/0206-genirq-disable-irqpoll-on-rt.patch b/kernel/patches-5.11.x-rt/0206-genirq-disable-irqpoll-on-rt.patch deleted file mode 100644 index fd88efd9c2..0000000000 --- a/kernel/patches-5.11.x-rt/0206-genirq-disable-irqpoll-on-rt.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Ingo Molnar -Date: Fri, 3 Jul 2009 08:29:57 -0500 -Subject: genirq: Disable irqpoll on -rt - -Creates long latencies for no value - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner - ---- - kernel/irq/spurious.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - ---- a/kernel/irq/spurious.c -+++ b/kernel/irq/spurious.c -@@ -443,6 +443,10 @@ MODULE_PARM_DESC(noirqdebug, "Disable ir - - static int __init irqfixup_setup(char *str) - { -+#ifdef CONFIG_PREEMPT_RT -+ pr_warn("irqfixup boot option not supported w/ CONFIG_PREEMPT_RT\n"); -+ return 1; -+#endif - irqfixup = 1; - printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n"); - printk(KERN_WARNING "This may impact system performance.\n"); -@@ -455,6 +459,10 @@ module_param(irqfixup, int, 0644); - - static int __init irqpoll_setup(char *str) - { -+#ifdef CONFIG_PREEMPT_RT -+ pr_warn("irqpoll boot option not supported w/ CONFIG_PREEMPT_RT\n"); -+ return 1; -+#endif - irqfixup = 2; - printk(KERN_WARNING "Misrouted IRQ fixup and polling support " - "enabled\n"); diff --git a/kernel/patches-5.11.x-rt/0207-sysfs-realtime-entry.patch b/kernel/patches-5.11.x-rt/0207-sysfs-realtime-entry.patch deleted file mode 100644 index 7f859e5851..0000000000 --- a/kernel/patches-5.11.x-rt/0207-sysfs-realtime-entry.patch +++ /dev/null @@ -1,47 +0,0 @@ -Subject: sysfs: Add /sys/kernel/realtime entry -From: Clark Williams -Date: Sat Jul 30 21:55:53 2011 -0500 - -Add a /sys/kernel entry to indicate that the kernel is a -realtime kernel. - -Clark says that he needs this for udev rules, udev needs to evaluate -if its a PREEMPT_RT kernel a few thousand times and parsing uname -output is too slow or so. - -Are there better solutions? Should it exist and return 0 on !-rt? - -Signed-off-by: Clark Williams -Signed-off-by: Peter Zijlstra ---- - kernel/ksysfs.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - ---- a/kernel/ksysfs.c -+++ b/kernel/ksysfs.c -@@ -138,6 +138,15 @@ KERNEL_ATTR_RO(vmcoreinfo); - - #endif /* CONFIG_CRASH_CORE */ - -+#if defined(CONFIG_PREEMPT_RT) -+static ssize_t realtime_show(struct kobject *kobj, -+ struct kobj_attribute *attr, char *buf) -+{ -+ return sprintf(buf, "%d\n", 1); -+} -+KERNEL_ATTR_RO(realtime); -+#endif -+ - /* whether file capabilities are enabled */ - static ssize_t fscaps_show(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -@@ -229,6 +238,9 @@ static struct attribute * kernel_attrs[] - &rcu_expedited_attr.attr, - &rcu_normal_attr.attr, - #endif -+#ifdef CONFIG_PREEMPT_RT -+ &realtime_attr.attr, -+#endif - NULL - }; - diff --git a/kernel/patches-5.11.x-rt/0208-localversion.patch b/kernel/patches-5.11.x-rt/0208-localversion.patch deleted file mode 100644 index 58842b503a..0000000000 --- a/kernel/patches-5.11.x-rt/0208-localversion.patch +++ /dev/null @@ -1,13 +0,0 @@ -Subject: Add localversion for -RT release -From: Thomas Gleixner -Date: Fri, 08 Jul 2011 20:25:16 +0200 - -Signed-off-by: Thomas Gleixner ---- - localversion-rt | 1 + - 1 file changed, 1 insertion(+) - ---- /dev/null -+++ b/localversion-rt -@@ -0,0 +1 @@ -+-rt11 diff --git a/kernel/patches-5.11.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch b/kernel/patches-5.11.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch deleted file mode 100644 index 9307744a8a..0000000000 --- a/kernel/patches-5.11.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 3635a8090f2271103511b68a5853b1d7e0a925b5 Mon Sep 17 00:00:00 2001 -From: Matt Redfearn -Date: Wed, 3 Jan 2018 09:57:30 +0000 -Subject: [PATCH] include/uapi/linux/swab: Fix potentially missing - __always_inline -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Commit bc27fb68aaad ("include/uapi/linux/byteorder, swab: force inlining -of some byteswap operations") added __always_inline to swab functions -and commit 283d75737837 ("uapi/linux/stddef.h: Provide __always_inline to -userspace headers") added a definition of __always_inline for use in -exported headers when the kernel's compiler.h is not available. - -However, since swab.h does not include stddef.h, if the header soup does -not indirectly include it, the definition of __always_inline is missing, -resulting in a compilation failure, which was observed compiling the -perf tool using exported headers containing this commit: - -In file included from /usr/include/linux/byteorder/little_endian.h:12:0, - from /usr/include/asm/byteorder.h:14, - from tools/include/uapi/linux/perf_event.h:20, - from perf.h:8, - from builtin-bench.c:18: -/usr/include/linux/swab.h:160:8: error: unknown type name ‘__always_inline’ - static __always_inline __u16 __swab16p(const __u16 *p) - -Fix this by replacing the inclusion of linux/compiler.h with -linux/stddef.h to ensure that we pick up that definition if required, -without relying on it's indirect inclusion. compiler.h is then included -indirectly, via stddef.h. - -Fixes: 283d75737837 ("uapi/linux/stddef.h: Provide __always_inline to userspace headers") -Signed-off-by: Matt Redfearn ---- - include/uapi/linux/swab.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/include/uapi/linux/swab.h b/include/uapi/linux/swab.h -index 7272f85d6d6a..3736f2fe1541 100644 ---- a/include/uapi/linux/swab.h -+++ b/include/uapi/linux/swab.h -@@ -3,7 +3,7 @@ - #define _UAPI_LINUX_SWAB_H - - #include --#include -+#include - #include - #include - --- -2.26.2 - diff --git a/kernel/patches-5.4.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch b/kernel/patches-5.4.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch deleted file mode 100644 index 9307744a8a..0000000000 --- a/kernel/patches-5.4.x/0001-include-uapi-linux-swab-Fix-potentially-missing-__al.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 3635a8090f2271103511b68a5853b1d7e0a925b5 Mon Sep 17 00:00:00 2001 -From: Matt Redfearn -Date: Wed, 3 Jan 2018 09:57:30 +0000 -Subject: [PATCH] include/uapi/linux/swab: Fix potentially missing - __always_inline -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Commit bc27fb68aaad ("include/uapi/linux/byteorder, swab: force inlining -of some byteswap operations") added __always_inline to swab functions -and commit 283d75737837 ("uapi/linux/stddef.h: Provide __always_inline to -userspace headers") added a definition of __always_inline for use in -exported headers when the kernel's compiler.h is not available. - -However, since swab.h does not include stddef.h, if the header soup does -not indirectly include it, the definition of __always_inline is missing, -resulting in a compilation failure, which was observed compiling the -perf tool using exported headers containing this commit: - -In file included from /usr/include/linux/byteorder/little_endian.h:12:0, - from /usr/include/asm/byteorder.h:14, - from tools/include/uapi/linux/perf_event.h:20, - from perf.h:8, - from builtin-bench.c:18: -/usr/include/linux/swab.h:160:8: error: unknown type name ‘__always_inline’ - static __always_inline __u16 __swab16p(const __u16 *p) - -Fix this by replacing the inclusion of linux/compiler.h with -linux/stddef.h to ensure that we pick up that definition if required, -without relying on it's indirect inclusion. compiler.h is then included -indirectly, via stddef.h. - -Fixes: 283d75737837 ("uapi/linux/stddef.h: Provide __always_inline to userspace headers") -Signed-off-by: Matt Redfearn ---- - include/uapi/linux/swab.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/include/uapi/linux/swab.h b/include/uapi/linux/swab.h -index 7272f85d6d6a..3736f2fe1541 100644 ---- a/include/uapi/linux/swab.h -+++ b/include/uapi/linux/swab.h -@@ -3,7 +3,7 @@ - #define _UAPI_LINUX_SWAB_H - - #include --#include -+#include - #include - #include - --- -2.26.2 - diff --git a/test/cases/000_build/000_formats/test.yml b/test/cases/000_build/000_formats/test.yml index a738be2d36..fee6cfe11c 100644 --- a/test/cases/000_build/000_formats/test.yml +++ b/test/cases/000_build/000_formats/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/000_build/010_reproducible/test.yml b/test/cases/000_build/010_reproducible/test.yml index 6458d1e56f..a7637de894 100644 --- a/test/cases/000_build/010_reproducible/test.yml +++ b/test/cases/000_build/010_reproducible/test.yml @@ -1,6 +1,6 @@ # NOTE: Images build from this file likely do not run kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/000_qemu/000_run_kernel+initrd/test.yml b/test/cases/010_platforms/000_qemu/000_run_kernel+initrd/test.yml index e7702d3945..dbd593ea0a 100644 --- a/test/cases/010_platforms/000_qemu/000_run_kernel+initrd/test.yml +++ b/test/cases/010_platforms/000_qemu/000_run_kernel+initrd/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/000_qemu/005_run_kernel+squashfs/test.yml b/test/cases/010_platforms/000_qemu/005_run_kernel+squashfs/test.yml index e7702d3945..dbd593ea0a 100644 --- a/test/cases/010_platforms/000_qemu/005_run_kernel+squashfs/test.yml +++ b/test/cases/010_platforms/000_qemu/005_run_kernel+squashfs/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/000_qemu/010_run_iso/test.yml b/test/cases/010_platforms/000_qemu/010_run_iso/test.yml index 4e7be3e83e..d9f025856f 100644 --- a/test/cases/010_platforms/000_qemu/010_run_iso/test.yml +++ b/test/cases/010_platforms/000_qemu/010_run_iso/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/000_qemu/020_run_efi/test.yml b/test/cases/010_platforms/000_qemu/020_run_efi/test.yml index fa2eab2316..1968149af1 100644 --- a/test/cases/010_platforms/000_qemu/020_run_efi/test.yml +++ b/test/cases/010_platforms/000_qemu/020_run_efi/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/000_qemu/030_run_qcow_bios/test.yml b/test/cases/010_platforms/000_qemu/030_run_qcow_bios/test.yml index fa2eab2316..1968149af1 100644 --- a/test/cases/010_platforms/000_qemu/030_run_qcow_bios/test.yml +++ b/test/cases/010_platforms/000_qemu/030_run_qcow_bios/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/000_qemu/040_run_raw_bios/test.yml b/test/cases/010_platforms/000_qemu/040_run_raw_bios/test.yml index fa2eab2316..1968149af1 100644 --- a/test/cases/010_platforms/000_qemu/040_run_raw_bios/test.yml +++ b/test/cases/010_platforms/000_qemu/040_run_raw_bios/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/000_qemu/050_run_aws/test.yml b/test/cases/010_platforms/000_qemu/050_run_aws/test.yml index fa2eab2316..1968149af1 100644 --- a/test/cases/010_platforms/000_qemu/050_run_aws/test.yml +++ b/test/cases/010_platforms/000_qemu/050_run_aws/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/000_qemu/100_container/test.yml b/test/cases/010_platforms/000_qemu/100_container/test.yml index 0db9738ba2..fb547b73c4 100644 --- a/test/cases/010_platforms/000_qemu/100_container/test.yml +++ b/test/cases/010_platforms/000_qemu/100_container/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/010_hyperkit/000_run_kernel+initrd/test.yml b/test/cases/010_platforms/010_hyperkit/000_run_kernel+initrd/test.yml index fa2eab2316..1968149af1 100644 --- a/test/cases/010_platforms/010_hyperkit/000_run_kernel+initrd/test.yml +++ b/test/cases/010_platforms/010_hyperkit/000_run_kernel+initrd/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/010_hyperkit/005_run_kernel+squashfs/test.yml b/test/cases/010_platforms/010_hyperkit/005_run_kernel+squashfs/test.yml index fa2eab2316..1968149af1 100644 --- a/test/cases/010_platforms/010_hyperkit/005_run_kernel+squashfs/test.yml +++ b/test/cases/010_platforms/010_hyperkit/005_run_kernel+squashfs/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/010_hyperkit/010_acpi/test.yml b/test/cases/010_platforms/010_hyperkit/010_acpi/test.yml index 962edc7b72..580910923a 100644 --- a/test/cases/010_platforms/010_hyperkit/010_acpi/test.yml +++ b/test/cases/010_platforms/010_hyperkit/010_acpi/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/010_platforms/110_gcp/000_run/test.yml b/test/cases/010_platforms/110_gcp/000_run/test.yml index fa2eab2316..1968149af1 100644 --- a/test/cases/010_platforms/110_gcp/000_run/test.yml +++ b/test/cases/010_platforms/110_gcp/000_run/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/020_kernel/011_config_5.4.x/test.yml b/test/cases/020_kernel/011_config_5.4.x/test.yml index 9405dc2b65..e958152cc7 100644 --- a/test/cases/020_kernel/011_config_5.4.x/test.yml +++ b/test/cases/020_kernel/011_config_5.4.x/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.4.172 + image: linuxkit/kernel:5.4.242 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/020_kernel/013_config_5.10.x/test.yml b/test/cases/020_kernel/013_config_5.10.x/test.yml index 45b5ffd6d9..26286ebb48 100644 --- a/test/cases/020_kernel/013_config_5.10.x/test.yml +++ b/test/cases/020_kernel/013_config_5.10.x/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/020_kernel/016_config_5.15.x/test.yml b/test/cases/020_kernel/016_config_5.15.x/test.yml index 9c7b33e430..400b1efa1a 100644 --- a/test/cases/020_kernel/016_config_5.15.x/test.yml +++ b/test/cases/020_kernel/016_config_5.15.x/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.15.27 + image: linuxkit/kernel:5.15.110 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/020_kernel/111_kmod_5.4.x/Dockerfile b/test/cases/020_kernel/111_kmod_5.4.x/Dockerfile index 253aed5807..ae0490b54e 100644 --- a/test/cases/020_kernel/111_kmod_5.4.x/Dockerfile +++ b/test/cases/020_kernel/111_kmod_5.4.x/Dockerfile @@ -3,10 +3,10 @@ # In the last stage, it creates a package, which can be used for # testing. -FROM linuxkit/kernel:5.4.172 AS ksrc +FROM linuxkit/kernel:5.4.242 AS ksrc # Extract headers and compile module -FROM linuxkit/kernel:5.4.172-builder AS build +FROM linuxkit/kernel:5.4.242-builder AS build RUN apk add build-base elfutils-dev COPY --from=ksrc /kernel-dev.tar / diff --git a/test/cases/020_kernel/111_kmod_5.4.x/test.yml b/test/cases/020_kernel/111_kmod_5.4.x/test.yml index cdbb017f42..1846ec4a26 100644 --- a/test/cases/020_kernel/111_kmod_5.4.x/test.yml +++ b/test/cases/020_kernel/111_kmod_5.4.x/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.4.172 + image: linuxkit/kernel:5.4.242 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/020_kernel/113_kmod_5.10.x/Dockerfile b/test/cases/020_kernel/113_kmod_5.10.x/Dockerfile index e1d1d019d3..a42839b997 100644 --- a/test/cases/020_kernel/113_kmod_5.10.x/Dockerfile +++ b/test/cases/020_kernel/113_kmod_5.10.x/Dockerfile @@ -3,10 +3,10 @@ # In the last stage, it creates a package, which can be used for # testing. -FROM linuxkit/kernel:5.10.104 AS ksrc +FROM linuxkit/kernel:5.10.179 AS ksrc # Extract headers and compile module -FROM linuxkit/kernel:5.10.104-builder AS build +FROM linuxkit/kernel:5.10.179-builder AS build RUN apk add build-base elfutils-dev COPY --from=ksrc /kernel-dev.tar / diff --git a/test/cases/020_kernel/113_kmod_5.10.x/test.yml b/test/cases/020_kernel/113_kmod_5.10.x/test.yml index 06e8e70d9a..5f9c877620 100644 --- a/test/cases/020_kernel/113_kmod_5.10.x/test.yml +++ b/test/cases/020_kernel/113_kmod_5.10.x/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/020_kernel/116_kmod_5.15.x/Dockerfile b/test/cases/020_kernel/116_kmod_5.15.x/Dockerfile index d0fb99db60..e04c46dbd1 100644 --- a/test/cases/020_kernel/116_kmod_5.15.x/Dockerfile +++ b/test/cases/020_kernel/116_kmod_5.15.x/Dockerfile @@ -3,10 +3,10 @@ # In the last stage, it creates a package, which can be used for # testing. -FROM linuxkit/kernel:5.15.27 AS ksrc +FROM linuxkit/kernel:5.15.110 AS ksrc # Extract headers and compile module -FROM linuxkit/kernel:5.15.27-builder AS build +FROM linuxkit/kernel:5.15.110-builder AS build RUN apk add build-base elfutils-dev COPY --from=ksrc /kernel-dev.tar / diff --git a/test/cases/020_kernel/116_kmod_5.15.x/test.yml b/test/cases/020_kernel/116_kmod_5.15.x/test.yml index 054e29e0bc..044f83d633 100644 --- a/test/cases/020_kernel/116_kmod_5.15.x/test.yml +++ b/test/cases/020_kernel/116_kmod_5.15.x/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.15.27 + image: linuxkit/kernel:5.15.110 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/020_kernel/200_namespace/common.yml b/test/cases/020_kernel/200_namespace/common.yml index 4a31290e4f..104ef653ff 100644 --- a/test/cases/020_kernel/200_namespace/common.yml +++ b/test/cases/020_kernel/200_namespace/common.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/030_security/000_docker-bench/test.yml b/test/cases/030_security/000_docker-bench/test.yml index 2e60115ca5..e6296397a8 100644 --- a/test/cases/030_security/000_docker-bench/test.yml +++ b/test/cases/030_security/000_docker-bench/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/030_security/010_ports/test.yml b/test/cases/030_security/010_ports/test.yml index ad61513fb6..070077e700 100644 --- a/test/cases/030_security/010_ports/test.yml +++ b/test/cases/030_security/010_ports/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 page_poison=1" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/001_dummy/test.yml b/test/cases/040_packages/001_dummy/test.yml index aed16ee70a..79640eabff 100644 --- a/test/cases/040_packages/001_dummy/test.yml +++ b/test/cases/040_packages/001_dummy/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/002_bcc/test.yml b/test/cases/040_packages/002_bcc/test.yml index ab41cf47da..0a8f5f8beb 100644 --- a/test/cases/040_packages/002_bcc/test.yml +++ b/test/cases/040_packages/002_bcc/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/002_binfmt/test.yml b/test/cases/040_packages/002_binfmt/test.yml index 1a3c42f8bd..60f8477f84 100644 --- a/test/cases/040_packages/002_binfmt/test.yml +++ b/test/cases/040_packages/002_binfmt/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/002_bpftrace/test.yml b/test/cases/040_packages/002_bpftrace/test.yml index 3b8bbf37e7..dfe61317ca 100644 --- a/test/cases/040_packages/002_bpftrace/test.yml +++ b/test/cases/040_packages/002_bpftrace/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/003_ca-certificates/test.yml b/test/cases/040_packages/003_ca-certificates/test.yml index 49d170cf6a..64caeb4940 100644 --- a/test/cases/040_packages/003_ca-certificates/test.yml +++ b/test/cases/040_packages/003_ca-certificates/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/003_cgroupv2/test.yml b/test/cases/040_packages/003_cgroupv2/test.yml index 797a647399..92fe38d520 100644 --- a/test/cases/040_packages/003_cgroupv2/test.yml +++ b/test/cases/040_packages/003_cgroupv2/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "linuxkit.unified_cgroup_hierarchy=1 console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/003_containerd/test.yml b/test/cases/040_packages/003_containerd/test.yml index c60cccd2b9..f9c2b7da2c 100644 --- a/test/cases/040_packages/003_containerd/test.yml +++ b/test/cases/040_packages/003_containerd/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/004_dhcpcd/test.yml b/test/cases/040_packages/004_dhcpcd/test.yml index 709c2013fb..a97e0b2a41 100644 --- a/test/cases/040_packages/004_dhcpcd/test.yml +++ b/test/cases/040_packages/004_dhcpcd/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/004_dm-crypt/000_simple/test.yml b/test/cases/040_packages/004_dm-crypt/000_simple/test.yml index 7d2b54c959..d62e257b69 100644 --- a/test/cases/040_packages/004_dm-crypt/000_simple/test.yml +++ b/test/cases/040_packages/004_dm-crypt/000_simple/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/004_dm-crypt/001_luks/test.yml b/test/cases/040_packages/004_dm-crypt/001_luks/test.yml index 47fefbc473..dfca7e0407 100644 --- a/test/cases/040_packages/004_dm-crypt/001_luks/test.yml +++ b/test/cases/040_packages/004_dm-crypt/001_luks/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/004_dm-crypt/002_key/test.yml b/test/cases/040_packages/004_dm-crypt/002_key/test.yml index 8326c4d7a4..281228994d 100644 --- a/test/cases/040_packages/004_dm-crypt/002_key/test.yml +++ b/test/cases/040_packages/004_dm-crypt/002_key/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/005_extend/000_ext4/test-create.yml b/test/cases/040_packages/005_extend/000_ext4/test-create.yml index 66f6808ef9..345f47a918 100644 --- a/test/cases/040_packages/005_extend/000_ext4/test-create.yml +++ b/test/cases/040_packages/005_extend/000_ext4/test-create.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/005_extend/000_ext4/test.yml b/test/cases/040_packages/005_extend/000_ext4/test.yml index 75985605cd..5e7ca45868 100644 --- a/test/cases/040_packages/005_extend/000_ext4/test.yml +++ b/test/cases/040_packages/005_extend/000_ext4/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/005_extend/001_btrfs/test-create.yml b/test/cases/040_packages/005_extend/001_btrfs/test-create.yml index f324fe554a..a843a4efe9 100644 --- a/test/cases/040_packages/005_extend/001_btrfs/test-create.yml +++ b/test/cases/040_packages/005_extend/001_btrfs/test-create.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/005_extend/001_btrfs/test.yml b/test/cases/040_packages/005_extend/001_btrfs/test.yml index 1f71d3ae87..676c50753d 100644 --- a/test/cases/040_packages/005_extend/001_btrfs/test.yml +++ b/test/cases/040_packages/005_extend/001_btrfs/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/005_extend/002_xfs/test-create.yml b/test/cases/040_packages/005_extend/002_xfs/test-create.yml index 8e67b13c93..3b5a4dc10a 100644 --- a/test/cases/040_packages/005_extend/002_xfs/test-create.yml +++ b/test/cases/040_packages/005_extend/002_xfs/test-create.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/005_extend/002_xfs/test.yml b/test/cases/040_packages/005_extend/002_xfs/test.yml index 5677844a98..0a5bf38344 100644 --- a/test/cases/040_packages/005_extend/002_xfs/test.yml +++ b/test/cases/040_packages/005_extend/002_xfs/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/005_extend/003_gpt/test-create.yml b/test/cases/040_packages/005_extend/003_gpt/test-create.yml index b2d7ec6a38..076722b4a2 100644 --- a/test/cases/040_packages/005_extend/003_gpt/test-create.yml +++ b/test/cases/040_packages/005_extend/003_gpt/test-create.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/005_extend/003_gpt/test.yml b/test/cases/040_packages/005_extend/003_gpt/test.yml index 75985605cd..5e7ca45868 100644 --- a/test/cases/040_packages/005_extend/003_gpt/test.yml +++ b/test/cases/040_packages/005_extend/003_gpt/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/006_format_mount/000_auto/test.yml b/test/cases/040_packages/006_format_mount/000_auto/test.yml index 9a672f22ea..ca8155196d 100644 --- a/test/cases/040_packages/006_format_mount/000_auto/test.yml +++ b/test/cases/040_packages/006_format_mount/000_auto/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/006_format_mount/001_by_label/test.yml b/test/cases/040_packages/006_format_mount/001_by_label/test.yml index e9772cf65f..c979f75037 100644 --- a/test/cases/040_packages/006_format_mount/001_by_label/test.yml +++ b/test/cases/040_packages/006_format_mount/001_by_label/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/006_format_mount/002_by_name/test.yml.in b/test/cases/040_packages/006_format_mount/002_by_name/test.yml.in index 1355975197..82f2969536 100644 --- a/test/cases/040_packages/006_format_mount/002_by_name/test.yml.in +++ b/test/cases/040_packages/006_format_mount/002_by_name/test.yml.in @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/006_format_mount/003_btrfs/test.yml b/test/cases/040_packages/006_format_mount/003_btrfs/test.yml index 9deed5e38f..32fb2ab344 100644 --- a/test/cases/040_packages/006_format_mount/003_btrfs/test.yml +++ b/test/cases/040_packages/006_format_mount/003_btrfs/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/006_format_mount/004_xfs/test.yml b/test/cases/040_packages/006_format_mount/004_xfs/test.yml index f1ba9c69f0..4e5a278970 100644 --- a/test/cases/040_packages/006_format_mount/004_xfs/test.yml +++ b/test/cases/040_packages/006_format_mount/004_xfs/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/006_format_mount/005_by_device_force/test.yml b/test/cases/040_packages/006_format_mount/005_by_device_force/test.yml index 80d8148685..d66a00ec67 100644 --- a/test/cases/040_packages/006_format_mount/005_by_device_force/test.yml +++ b/test/cases/040_packages/006_format_mount/005_by_device_force/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/006_format_mount/006_gpt/test.yml b/test/cases/040_packages/006_format_mount/006_gpt/test.yml index 546ba8e06d..cbe7c02d3a 100644 --- a/test/cases/040_packages/006_format_mount/006_gpt/test.yml +++ b/test/cases/040_packages/006_format_mount/006_gpt/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/006_format_mount/010_multiple/test.yml b/test/cases/040_packages/006_format_mount/010_multiple/test.yml index f29754e837..da41658cc9 100644 --- a/test/cases/040_packages/006_format_mount/010_multiple/test.yml +++ b/test/cases/040_packages/006_format_mount/010_multiple/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/007_getty-containerd/test.yml b/test/cases/040_packages/007_getty-containerd/test.yml index 5b7af2dba4..58aad0973c 100644 --- a/test/cases/040_packages/007_getty-containerd/test.yml +++ b/test/cases/040_packages/007_getty-containerd/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/009_init_containerd/test.yml b/test/cases/040_packages/009_init_containerd/test.yml index 91ca1e7dfb..b63959b3e5 100644 --- a/test/cases/040_packages/009_init_containerd/test.yml +++ b/test/cases/040_packages/009_init_containerd/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/011_kmsg/test.yml b/test/cases/040_packages/011_kmsg/test.yml index 4e309d39b9..7ce9591542 100644 --- a/test/cases/040_packages/011_kmsg/test.yml +++ b/test/cases/040_packages/011_kmsg/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/012_logwrite/test.yml b/test/cases/040_packages/012_logwrite/test.yml index a381ffad51..a9c64f71d1 100644 --- a/test/cases/040_packages/012_logwrite/test.yml +++ b/test/cases/040_packages/012_logwrite/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/012_losetup/test.yml b/test/cases/040_packages/012_losetup/test.yml index 9f3977262b..d602448bf8 100644 --- a/test/cases/040_packages/012_losetup/test.yml +++ b/test/cases/040_packages/012_losetup/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/013_metadata/000_cidata/test.yml b/test/cases/040_packages/013_metadata/000_cidata/test.yml index 562c6f7d3a..5a12bb6f31 100644 --- a/test/cases/040_packages/013_metadata/000_cidata/test.yml +++ b/test/cases/040_packages/013_metadata/000_cidata/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/013_mkimage/mkimage.yml b/test/cases/040_packages/013_mkimage/mkimage.yml index 9156d80bc2..fcaadecf01 100644 --- a/test/cases/040_packages/013_mkimage/mkimage.yml +++ b/test/cases/040_packages/013_mkimage/mkimage.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/013_mkimage/run.yml b/test/cases/040_packages/013_mkimage/run.yml index 198105e1ed..8e920b8f5c 100644 --- a/test/cases/040_packages/013_mkimage/run.yml +++ b/test/cases/040_packages/013_mkimage/run.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/019_sysctl/test.yml b/test/cases/040_packages/019_sysctl/test.yml index b0d2136be7..61bbc0673b 100644 --- a/test/cases/040_packages/019_sysctl/test.yml +++ b/test/cases/040_packages/019_sysctl/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda diff --git a/test/cases/040_packages/023_wireguard/test.yml b/test/cases/040_packages/023_wireguard/test.yml index 5dd318d870..90b1a65444 100644 --- a/test/cases/040_packages/023_wireguard/test.yml +++ b/test/cases/040_packages/023_wireguard/test.yml @@ -1,5 +1,5 @@ kernel: - image: linuxkit/kernel:5.10.104 + image: linuxkit/kernel:5.10.179 cmdline: "console=ttyS0 console=ttyAMA0" init: - linuxkit/init:144c9cee8aed9e30a16940f2bf1d3813883aceda