ID Workflow Result Correct Bug Created Started Finished Revision
70c5c0ae assessment-security DenialOfService: ✅ Exploitable: ❌ FilesystemTrigger: ❌ NetworkTrigger: ❌ PeripheralTrigger: ❌ RemoteTrigger: ❌ Unprivileged: ✅ UserNamespace: ❌ VMGuestTrigger: ❌ VMHostTrigger: ❌ ❓ BUG: sleeping function called from invalid context in jbd2_journal_commit_transaction 2026/05/31 22:02 2026/05/31 22:02 2026/05/31 23:28 6b4a8443
Agent: prod-syz-agent-2
External Bug ID: ---

Inputs:
BaseBranch master
BaseCommit RC
BaseRepository git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
BugTitle BUG: sleeping function called from invalid context in jbd2_journal_commit_transaction
CrashLogID 5081079494475776
CrashReportID 5000178685181952
KernelCommit 6596a02b207886e9e00bb0161c7fd59fea53c081
KernelConfig
Show (272829 bytes)
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 syzkaller Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50)"
CONFIG_GCC_VERSION=0
CONFIG_CC_IS_CLANG=y
CONFIG_CLANG_VERSION=210108
CONFIG_AS_IS_LLVM=y
CONFIG_AS_VERSION=210108
CONFIG_LD_VERSION=0
CONFIG_LD_IS_LLD=y
CONFIG_LLD_VERSION=210108
CONFIG_RUSTC_VERSION=109101
CONFIG_RUST_IS_AVAILABLE=y
CONFIG_RUSTC_LLVM_VERSION=210102
CONFIG_RUSTC_LLVM_MAJOR_VERSION=21
CONFIG_RUSTC_CLANG_LLVM_COMPATIBLE=y
CONFIG_CC_CAN_LINK=y
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
CONFIG_TOOLS_SUPPORT_RELR=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_ASSUME=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
CONFIG_CC_HAS_COUNTED_BY=y
CONFIG_CC_HAS_BROKEN_COUNTED_BY_REF=y
CONFIG_CC_HAS_MULTIDIMENSIONAL_NONSTRING=y
CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y
CONFIG_RUSTC_HAS_SPAN_FILE=y
CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y
CONFIG_RUSTC_HAS_FILE_WITH_NUL=y
CONFIG_RUSTC_HAS_FILE_AS_C_STR=y
CONFIG_PAHOLE_VERSION=130
CONFIG_CONSTRUCTORS=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_WERROR is not set
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
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_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_WATCH_QUEUE=y
CONFIG_CROSS_MEMORY_ATTACH=y
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_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_ARCH_WANTS_CLOCKSOURCE_READ_INLINE=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST_IDLE=y
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
CONFIG_GENERIC_CLOCKEVENTS_COUPLED=y
CONFIG_GENERIC_CLOCKEVENTS_COUPLED_INLINE=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_HRTIMER_REARM_DEFERRED=y
CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
CONFIG_CONTEXT_TRACKING=y
CONFIG_CONTEXT_TRACKING_IDLE=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_CONTEXT_TRACKING_USER=y
# CONFIG_CONTEXT_TRACKING_USER_FORCE is not set
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_POSIX_AUX_CLOCKS=y
# end of Timers subsystem

CONFIG_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y

#
# BPF subsystem
#
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set
CONFIG_BPF_PRELOAD=y
CONFIG_BPF_PRELOAD_UMD=y
CONFIG_BPF_LSM=y
# end of BPF subsystem

CONFIG_PREEMPT_BUILD=y
CONFIG_ARCH_HAS_PREEMPT_LAZY=y
CONFIG_PREEMPT=y
# CONFIG_PREEMPT_LAZY is not set
CONFIG_PREEMPT_RT=y
# CONFIG_PREEMPT_RT_NEEDS_BH_LOCK is not set
CONFIG_PREEMPT_COUNT=y
CONFIG_PREEMPTION=y
CONFIG_PREEMPT_DYNAMIC=y
CONFIG_SCHED_CORE=y

#
# CPU/Task time and stats accounting
#
CONFIG_VIRT_CPU_ACCOUNTING=y
# CONFIG_TICK_CPU_ACCOUNTING is not set
CONFIG_VIRT_CPU_ACCOUNTING_GEN=y
CONFIG_IRQ_TIME_ACCOUNTING=y
CONFIG_HAVE_SCHED_AVG_IRQ=y
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=y
# CONFIG_PSI_DEFAULT_DISABLED 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_TREE_SRCU=y
CONFIG_TASKS_RCU_GENERIC=y
CONFIG_NEED_TASKS_RCU=y
CONFIG_TASKS_RCU=y
CONFIG_TASKS_TRACE_RCU=y
CONFIG_RCU_STALL_COMMON=y
CONFIG_RCU_NEED_SEGCBLIST=y
# CONFIG_RCU_BOOST is not set
# end of RCU Subsystem

CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
# CONFIG_IKHEADERS is not set
CONFIG_LOG_BUF_SHIFT=18
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
# CONFIG_PRINTK_INDEX is not set
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_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough"
CONFIG_CC_MS_EXTENSIONS="-fms-extensions"
CONFIG_GCC10_NO_ARRAY_BOUNDS=y
CONFIG_GCC_NO_STRINGOP_OVERFLOW=y
CONFIG_ARCH_SUPPORTS_INT128=y
CONFIG_SLAB_OBJ_EXT=y
CONFIG_CGROUPS=y
CONFIG_PAGE_COUNTER=y
# CONFIG_CGROUP_FAVOR_DYNMODS is not set
CONFIG_MEMCG=y
CONFIG_MEMCG_V1=y
CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_GROUP_SCHED_WEIGHT=y
CONFIG_GROUP_SCHED_BANDWIDTH=y
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_CFS_BANDWIDTH=y
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_SCHED_MM_CID=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
# CONFIG_CGROUP_DMEM is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CPUSETS=y
# CONFIG_CPUSETS_V1 is not set
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
# CONFIG_CGROUP_BPF is not set
CONFIG_CGROUP_MISC=y
CONFIG_CGROUP_DEBUG=y
CONFIG_SOCK_CGROUP_DATA=y
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_TIME_NS=y
CONFIG_TIME_NS_VDSO=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_CHECKPOINT_RESTORE=y
# CONFIG_SCHED_AUTOGROUP is not set
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
CONFIG_RD_LZ4=y
CONFIG_RD_ZSTD=y
# CONFIG_BOOT_CONFIG is not set
CONFIG_CMDLINE_LOG_WRAP_IDEAL_LEN=1021
CONFIG_INITRAMFS_PRESERVE_MTIME=y
CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_LD_ORPHAN_WARN=y
CONFIG_LD_ORPHAN_WARN_LEVEL="warn"
CONFIG_SYSCTL=y
CONFIG_HAVE_UID16=y
CONFIG_SYSCTL_EXCEPTION_TRACE=y
CONFIG_SYSFS_SYSCALL=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
CONFIG_EXPERT=y
CONFIG_UID16=y
CONFIG_MULTIUSER=y
CONFIG_SGETMASK_SYSCALL=y
CONFIG_FHANDLE=y
CONFIG_POSIX_TIMERS=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
# CONFIG_BASE_SMALL is not set
CONFIG_FUTEX=y
CONFIG_FUTEX_PI=y
CONFIG_FUTEX_PRIVATE_HASH=y
CONFIG_FUTEX_MPOL=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
CONFIG_IO_URING=y
CONFIG_IO_URING_MOCK_FILE=y
CONFIG_ADVISE_SYSCALLS=y
CONFIG_MEMBARRIER=y
CONFIG_KCMP=y
CONFIG_RSEQ=y
# CONFIG_RSEQ_SLICE_EXTENSION is not set
# CONFIG_RSEQ_STATS is not set
# CONFIG_RSEQ_DEBUG_DEFAULT_ENABLE is not set
CONFIG_CACHESTAT_SYSCALL=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_SELFTEST is not set
CONFIG_KALLSYMS_ALL=y
CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
CONFIG_ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS=y
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_GUEST_PERF_EVENTS=y
CONFIG_PERF_GUEST_MEDIATED_PMU=y

#
# 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_SYSTEM_DATA_VERIFICATION=y
CONFIG_PROFILING=y
# CONFIG_RUST is not set
CONFIG_TRACEPOINTS=y

#
# Kexec and crash features
#
CONFIG_CRASH_RESERVE=y
CONFIG_VMCORE_INFO=y
CONFIG_KEXEC_CORE=y
CONFIG_KEXEC=y
# CONFIG_KEXEC_FILE is not set
# CONFIG_KEXEC_JUMP is not set
CONFIG_CRASH_DUMP=y
CONFIG_CRASH_HOTPLUG=y
CONFIG_CRASH_MAX_MEMORY_RANGES=8192
# end of Kexec and crash features

#
# Live Update and Kexec HandOver
#
# CONFIG_KEXEC_HANDOVER is not set
# end of Live Update and Kexec HandOver
# 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_CSUM=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_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_AUDIT_ARCH=y
CONFIG_KASAN_SHADOW_OFFSET=0xdffffc0000000000
CONFIG_HAVE_INTEL_TXT=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_PGTABLE_LEVELS=5

#
# Processor type and features
#
CONFIG_SMP=y
CONFIG_X86_X2APIC=y
# CONFIG_X86_POSTED_MSI is not set
CONFIG_X86_MPPARSE=y
# CONFIG_X86_CPU_RESCTRL is not set
CONFIG_X86_FRED=y
CONFIG_X86_EXTENDED_PLATFORM=y
# CONFIG_X86_NUMACHIP is not set
# CONFIG_X86_VSMP is not set
# CONFIG_X86_INTEL_MID is not set
# CONFIG_X86_GOLDFISH is not set
# CONFIG_X86_INTEL_LPSS is not set
# CONFIG_X86_AMD_PLATFORM_DEVICE is not set
CONFIG_IOSF_MBI=y
# CONFIG_IOSF_MBI_DEBUG is not set
CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_HYPERVISOR_GUEST=y
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_SPINLOCKS=y
CONFIG_X86_HV_CALLBACK_VECTOR=y
# CONFIG_XEN is not set
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_BHYVE_GUEST is not set
CONFIG_CC_HAS_MARCH_NATIVE=y
# CONFIG_X86_NATIVE_CPU is not set
CONFIG_X86_INTERNODE_CACHE_SHIFT=6
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_TSC=y
CONFIG_X86_HAVE_PAE=y
CONFIG_X86_CX8=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=y
CONFIG_BROADCAST_TLB_FLUSH=y
CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_AMD=y
# CONFIG_CPU_SUP_HYGON is not set
# CONFIG_CPU_SUP_CENTAUR is not set
# CONFIG_CPU_SUP_ZHAOXIN is not set
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
# CONFIG_GART_IOMMU is not set
CONFIG_BOOT_VESA_SUPPORT=y
# 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=8
CONFIG_SCHED_MC_PRIO=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_ACPI_MADT_WAKEUP=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
CONFIG_X86_MCE=y
# CONFIG_X86_MCELOG_LEGACY is not set
CONFIG_X86_MCE_INTEL=y
CONFIG_X86_MCE_AMD=y
CONFIG_X86_MCE_THRESHOLD=y
# CONFIG_X86_MCE_INJECT 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
CONFIG_PERF_EVENTS_AMD_UNCORE=y
# CONFIG_PERF_EVENTS_AMD_BRS is not set
# end of Performance monitoring

CONFIG_X86_16BIT=y
CONFIG_X86_ESPFIX64=y
CONFIG_X86_VSYSCALL_EMULATION=y
CONFIG_X86_IOPL_IOPERM=y
CONFIG_MICROCODE=y
# CONFIG_MICROCODE_LATE_LOADING is not set
# CONFIG_MICROCODE_DBG is not set
CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_X86_DIRECT_GBPAGES=y
# CONFIG_X86_CPA_STATISTICS is not set
CONFIG_NUMA=y
CONFIG_AMD_NUMA=y
CONFIG_X86_64_ACPI_NUMA=y
CONFIG_NODES_SHIFT=6
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=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_MTRR=y
# CONFIG_MTRR_SANITIZER is not set
CONFIG_X86_PAT=y
CONFIG_X86_UMIP=y
CONFIG_CC_HAS_IBT=y
CONFIG_X86_CET=y
CONFIG_X86_KERNEL_IBT=y
CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y
CONFIG_ARCH_PKEY_BITS=4
# CONFIG_X86_INTEL_TSX_MODE_OFF is not set
CONFIG_X86_INTEL_TSX_MODE_ON=y
# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set
CONFIG_X86_SGX=y
CONFIG_X86_USER_SHADOW_STACK=y
# CONFIG_INTEL_TDX_HOST is not set
# CONFIG_EFI is not set
CONFIG_HZ_100=y
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=100
CONFIG_SCHED_HRTICK=y
CONFIG_ARCH_SUPPORTS_KEXEC=y
CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y
CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y
CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y
CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y
CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y
CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y
CONFIG_ARCH_SUPPORTS_KEXEC_HANDOVER=y
CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y
CONFIG_ARCH_DEFAULT_CRASH_DUMP=y
CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y
CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y
CONFIG_PHYSICAL_START=0x1000000
# CONFIG_RELOCATABLE is not set
CONFIG_PHYSICAL_ALIGN=0x200000
CONFIG_HOTPLUG_CPU=y
# CONFIG_COMPAT_VDSO is not set
CONFIG_LEGACY_VSYSCALL_XONLY=y
# CONFIG_LEGACY_VSYSCALL_NONE is not set
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="earlyprintk=serial net.ifnames=0 sysctl.kernel.hung_task_all_cpu_backtrace=1 ima_policy=tcb nf-conntrack-ftp.ports=20000 nf-conntrack-tftp.ports=20000 nf-conntrack-sip.ports=20000 nf-conntrack-irc.ports=20000 nf-conntrack-sane.ports=20000 binder.debug_mask=0 rcupdate.rcu_expedited=1 rcupdate.rcu_cpu_stall_cputime=1 no_hash_pointers page_owner=on sysctl.vm.nr_hugepages=4 sysctl.vm.nr_overcommit_hugepages=4 secretmem.enable=1 sysctl.max_rcu_stall_to_panic=1 msr.allow_writes=off coredump_filter=0xffff root=/dev/sda console=ttyS0 vsyscall=native numa=fake=2 kvm-intel.nested=1 spec_store_bypass_disable=prctl nopcid vivid.n_devs=64 vivid.multiplanar=1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2 netrom.nr_ndevs=32 rose.rose_ndevs=32 smp.csd_lock_timeout=100000 watchdog_thresh=55 workqueue.watchdog_thresh=140 sysctl.net.core.netdev_unregister_timeout_secs=140 dummy_hcd.num=32 max_loop=32 nbds_max=32 comedi.comedi_num_legacy_minors=4 panic_on_warn=1"
# CONFIG_CMDLINE_OVERRIDE is not set
CONFIG_MODIFY_LDT_SYSCALL=y
# CONFIG_STRICT_SIGALTSTACK_SIZE is not set
CONFIG_HAVE_LIVEPATCH=y
CONFIG_HAVE_KLP_BUILD=y
CONFIG_X86_BUS_LOCK_DETECT=y
# end of Processor type and features

CONFIG_CC_HAS_SLS=y
CONFIG_CC_HAS_RETURN_THUNK=y
CONFIG_CC_HAS_ENTRY_PADDING=y
CONFIG_CC_HAS_KCFI_ARITY=y
CONFIG_FUNCTION_PADDING_CFI=11
CONFIG_FUNCTION_PADDING_BYTES=16
CONFIG_CALL_PADDING=y
CONFIG_HAVE_CALL_THUNKS=y
CONFIG_CALL_THUNKS=y
CONFIG_PREFIX_SYMBOLS=y
CONFIG_CPU_MITIGATIONS=y
CONFIG_MITIGATION_PAGE_TABLE_ISOLATION=y
CONFIG_MITIGATION_RETPOLINE=y
CONFIG_MITIGATION_RETHUNK=y
CONFIG_MITIGATION_UNRET_ENTRY=y
CONFIG_MITIGATION_CALL_DEPTH_TRACKING=y
# CONFIG_CALL_THUNKS_DEBUG is not set
CONFIG_MITIGATION_IBPB_ENTRY=y
CONFIG_MITIGATION_IBRS_ENTRY=y
CONFIG_MITIGATION_SRSO=y
# CONFIG_MITIGATION_SLS is not set
CONFIG_MITIGATION_GDS=y
CONFIG_MITIGATION_RFDS=y
CONFIG_MITIGATION_SPECTRE_BHI=y
CONFIG_MITIGATION_MDS=y
CONFIG_MITIGATION_TAA=y
CONFIG_MITIGATION_MMIO_STALE_DATA=y
CONFIG_MITIGATION_L1TF=y
CONFIG_MITIGATION_RETBLEED=y
CONFIG_MITIGATION_SPECTRE_V1=y
CONFIG_MITIGATION_SPECTRE_V2=y
CONFIG_MITIGATION_SRBDS=y
CONFIG_MITIGATION_SSB=y
CONFIG_MITIGATION_ITS=y
CONFIG_MITIGATION_TSA=y
# CONFIG_MITIGATION_VMSCAPE is not set
CONFIG_ARCH_HAS_ADD_PAGES=y

#
# Power management and ACPI options
#
CONFIG_ARCH_HIBERNATION_HEADER=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
# CONFIG_SUSPEND_SKIP_SYNC is not set
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y
CONFIG_HIBERNATION_SNAPSHOT_DEV=y
CONFIG_HIBERNATION_COMP_LZO=y
# CONFIG_HIBERNATION_COMP_LZ4 is not set
CONFIG_HIBERNATION_DEF_COMP="lzo"
CONFIG_PM_STD_PARTITION=""
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_PM_USERSPACE_AUTOSLEEP is not set
# CONFIG_PM_WAKELOCKS is not set
# CONFIG_PM_QOS_CPU_SYSTEM_WAKEUP is not set
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_PM_ADVANCED_DEBUG is not set
# CONFIG_PM_TEST_SUSPEND is not set
CONFIG_PM_SLEEP_DEBUG=y
# CONFIG_DPM_WATCHDOG is not set
CONFIG_PM_TRACE=y
CONFIG_PM_TRACE_RTC=y
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_THERMAL_LIB=y
# CONFIG_ACPI_DEBUGGER is not set
CONFIG_ACPI_SPCR_TABLE=y
# CONFIG_ACPI_FPDT is not set
CONFIG_ACPI_LPIT=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y
CONFIG_ACPI_EC=y
# CONFIG_ACPI_EC_DEBUGFS is not set
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=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 is not set
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_PLATFORM_PROFILE=y
CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y
CONFIG_ACPI_TABLE_UPGRADE=y
CONFIG_ACPI_DEBUG=y
# 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 is not set
# CONFIG_ACPI_HED is not set
# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
CONFIG_ACPI_NHLT=y
CONFIG_ACPI_NFIT=y
# CONFIG_NFIT_SECURITY_DEBUG is not set
CONFIG_ACPI_NUMA=y
# CONFIG_ACPI_HMAT is not set
CONFIG_HAVE_ACPI_APEI=y
CONFIG_HAVE_ACPI_APEI_NMI=y
# CONFIG_ACPI_APEI is not set
# CONFIG_ACPI_DPTF is not set
# CONFIG_ACPI_EXTLOG is not set
# CONFIG_ACPI_CONFIGFS is not set
# CONFIG_ACPI_PFRUT is not set
CONFIG_ACPI_PCC=y
# CONFIG_ACPI_FFH is not set
CONFIG_ACPI_MRRM=y
CONFIG_PMIC_OPREGION=y
CONFIG_BXT_WC_PMIC_OPREGION=y
# CONFIG_CHT_WC_PMIC_OPREGION is not set
CONFIG_X86_PM_TIMER=y

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
CONFIG_CPU_FREQ_GOV_COMMON=y
# CONFIG_CPU_FREQ_STAT is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
# 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=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y

#
# CPU frequency scaling drivers
#
# CONFIG_CPUFREQ_DT is not set
# CONFIG_CPUFREQ_DT_PLATDEV is not set
CONFIG_X86_INTEL_PSTATE=y
# CONFIG_X86_PCC_CPUFREQ is not set
CONFIG_X86_AMD_PSTATE=y
CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
# CONFIG_X86_AMD_PSTATE_DYNAMIC_EPP is not set
# CONFIG_X86_AMD_PSTATE_UT is not set
CONFIG_X86_ACPI_CPUFREQ=y
CONFIG_X86_ACPI_CPUFREQ_CPB=y
# CONFIG_X86_POWERNOW_K8 is not set
# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set
# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
# CONFIG_X86_P4_CLOCKMOD is not set

#
# shared options
#
CONFIG_CPUFREQ_ARCH_CUR_FREQ=y
# end of CPU Frequency scaling

#
# CPU Idle
#
CONFIG_CPU_IDLE=y
# CONFIG_CPU_IDLE_GOV_LADDER is not set
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_CPU_IDLE_GOV_TEO is not set
CONFIG_CPU_IDLE_GOV_HALTPOLL=y
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_MMCONF_FAM10H=y
CONFIG_ISA_BUS=y
CONFIG_ISA_DMA_API=y
CONFIG_AMD_NB=y
CONFIG_AMD_NODE=y
# end of Bus options (PCI etc.)

#
# Binary Emulations
#
CONFIG_IA32_EMULATION=y
# CONFIG_IA32_EMULATION_DEFAULT_DISABLED is not set
CONFIG_COMPAT_32=y
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
# end of Binary Emulations

CONFIG_KVM_COMMON=y
CONFIG_HAVE_KVM_PFNCACHE=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
CONFIG_HAVE_KVM_DIRTY_RING=y
CONFIG_HAVE_KVM_DIRTY_RING_TSO=y
CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_HAVE_KVM_MSI=y
CONFIG_HAVE_KVM_READONLY_MEM=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_KVM_VFIO=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY=y
CONFIG_KVM_COMPAT=y
CONFIG_HAVE_KVM_IRQ_BYPASS=y
CONFIG_HAVE_KVM_NO_POLL=y
CONFIG_VIRT_XFER_TO_GUEST_WORK=y
CONFIG_HAVE_KVM_PM_NOTIFIER=y
CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y
CONFIG_KVM_ELIDE_TLB_FLUSH_IF_YOUNG=y
CONFIG_KVM_MMU_LOCKLESS_AGING=y
CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES=y
CONFIG_KVM_GUEST_MEMFD=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM_X86=y
CONFIG_KVM=y
CONFIG_KVM_SW_PROTECTED_VM=y
CONFIG_KVM_INTEL=y
# CONFIG_KVM_INTEL_PROVE_VE is not set
CONFIG_X86_SGX_KVM=y
CONFIG_KVM_AMD=y
CONFIG_KVM_IOAPIC=y
# CONFIG_KVM_SMM is not set
CONFIG_KVM_HYPERV=y
CONFIG_KVM_XEN=y
CONFIG_KVM_PROVE_MMU=y
CONFIG_KVM_MAX_NR_VCPUS=1024
CONFIG_X86_REQUIRED_FEATURE_ALWAYS=y
CONFIG_X86_REQUIRED_FEATURE_NOPL=y
CONFIG_X86_REQUIRED_FEATURE_CX8=y
CONFIG_X86_REQUIRED_FEATURE_CMOV=y
CONFIG_X86_REQUIRED_FEATURE_CPUID=y
CONFIG_X86_REQUIRED_FEATURE_FPU=y
CONFIG_X86_REQUIRED_FEATURE_PAE=y
CONFIG_X86_REQUIRED_FEATURE_PSE=y
CONFIG_X86_REQUIRED_FEATURE_PGE=y
CONFIG_X86_REQUIRED_FEATURE_MSR=y
CONFIG_X86_REQUIRED_FEATURE_FXSR=y
CONFIG_X86_REQUIRED_FEATURE_XMM=y
CONFIG_X86_REQUIRED_FEATURE_XMM2=y
CONFIG_X86_REQUIRED_FEATURE_LM=y
CONFIG_X86_DISABLED_FEATURE_VME=y
CONFIG_X86_DISABLED_FEATURE_K6_MTRR=y
CONFIG_X86_DISABLED_FEATURE_CYRIX_ARR=y
CONFIG_X86_DISABLED_FEATURE_CENTAUR_MCR=y
CONFIG_X86_DISABLED_FEATURE_LAM=y
CONFIG_X86_DISABLED_FEATURE_XENPV=y
CONFIG_X86_DISABLED_FEATURE_TDX_GUEST=y
CONFIG_X86_DISABLED_FEATURE_SEV_SNP=y
CONFIG_AS_WRUSS=y
CONFIG_ARCH_CONFIGURES_CPU_MITIGATIONS=y

#
# General architecture-dependent options
#
CONFIG_HOTPLUG_SMT=y
CONFIG_ARCH_SUPPORTS_SCHED_SMT=y
CONFIG_ARCH_SUPPORTS_SCHED_CLUSTER=y
CONFIG_ARCH_SUPPORTS_SCHED_MC=y
CONFIG_SCHED_SMT=y
CONFIG_SCHED_CLUSTER=y
CONFIG_SCHED_MC=y
CONFIG_HOTPLUG_CORE_SYNC=y
CONFIG_HOTPLUG_CORE_SYNC_DEAD=y
CONFIG_HOTPLUG_CORE_SYNC_FULL=y
CONFIG_HOTPLUG_SPLIT_STARTUP=y
CONFIG_HOTPLUG_PARALLEL=y
CONFIG_GENERIC_IRQ_ENTRY=y
CONFIG_GENERIC_SYSCALL=y
CONFIG_GENERIC_ENTRY=y
# CONFIG_KPROBES is not set
CONFIG_JUMP_LABEL=y
# CONFIG_STATIC_KEYS_SELFTEST is not set
# CONFIG_STATIC_CALL_SELFTEST is not set
CONFIG_UPROBES=y
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_ARCH_USE_BUILTIN_BSWAP=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_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=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
CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
CONFIG_ARCH_HAS_SET_MEMORY=y
CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y
CONFIG_ARCH_HAS_CPU_PASID=y
CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y
CONFIG_ARCH_WANTS_NO_INSTR=y
CONFIG_HAVE_ASM_MODVERSIONS=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_RSEQ=y
CONFIG_HAVE_RUST=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_UNWIND_USER=y
CONFIG_HAVE_UNWIND_USER_FP=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_MMU_GATHER_MERGE_VMAS=y
CONFIG_ARCH_WANT_IRQS_OFF_ACTIVATE_MM=y
CONFIG_MMU_LAZY_TLB_REFCOUNT=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
CONFIG_ARCH_HAVE_EXTRA_ELF_NOTES=y
CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=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_KSTACK_ERASE=y
CONFIG_HAVE_STACKPROTECTOR=y
CONFIG_STACKPROTECTOR=y
CONFIG_STACKPROTECTOR_STRONG=y
CONFIG_ARCH_SUPPORTS_LTO_CLANG=y
CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y
CONFIG_HAS_LTO_CLANG=y
CONFIG_LTO_NONE=y
# CONFIG_LTO_CLANG_FULL is not set
# CONFIG_LTO_CLANG_THIN is not set
CONFIG_ARCH_SUPPORTS_AUTOFDO_CLANG=y
CONFIG_AUTOFDO_CLANG=y
CONFIG_ARCH_SUPPORTS_PROPELLER_CLANG=y
CONFIG_PROPELLER_CLANG=y
CONFIG_ARCH_SUPPORTS_CFI=y
# CONFIG_CFI is not set
CONFIG_HAVE_CFI_ICALL_NORMALIZE_INTEGERS=y
CONFIG_HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC=y
CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y
CONFIG_HAVE_CONTEXT_TRACKING_USER=y
CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
CONFIG_HAVE_PV_STEAL_CLOCK_GEN=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_HAVE_ARCH_HUGE_VMALLOC=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_EXECMEM_ROX=y
CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=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_PAGE_SIZE_4KB=y
CONFIG_PAGE_SIZE_4KB=y
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
CONFIG_PAGE_SHIFT=12
CONFIG_HAVE_OBJTOOL=y
CONFIG_HAVE_JUMP_LABEL_HACK=y
CONFIG_HAVE_NOINSTR_HACK=y
CONFIG_HAVE_NOINSTR_VALIDATION=y
CONFIG_HAVE_UACCESS_VALIDATION=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_ARCH_SUPPORTS_RT=y
CONFIG_HAVE_ARCH_VMAP_STACK=y
CONFIG_VMAP_STACK=y
CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
CONFIG_RANDOMIZE_KSTACK_OFFSET=y
# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set
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_LOCK_EVENT_COUNTS is not set
CONFIG_ARCH_HAS_MEM_ENCRYPT=y
CONFIG_HAVE_STATIC_CALL=y
CONFIG_HAVE_STATIC_CALL_INLINE=y
CONFIG_HAVE_PREEMPT_DYNAMIC=y
CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y
CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y
CONFIG_ARCH_HAS_ELFCORE_COMPAT=y
CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y
CONFIG_DYNAMIC_SIGFRAME=y
CONFIG_HAVE_ARCH_NODE_DEV_GROUP=y
CONFIG_ARCH_HAS_HW_PTE_YOUNG=y
CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y
CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y
CONFIG_HAVE_GENERIC_TIF_BITS=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_FUNCTION_ALIGNMENT_4B=y
CONFIG_FUNCTION_ALIGNMENT_16B=y
CONFIG_FUNCTION_ALIGNMENT=16
CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT=y
CONFIG_ARCH_HAS_CPU_ATTACK_VECTORS=y
# end of General architecture-dependent options

CONFIG_RT_MUTEXES=y
CONFIG_MODULE_SIG_FORMAT=y
CONFIG_MODULES=y
# CONFIG_MODULE_DEBUG is not set
# CONFIG_MODULE_FORCE_LOAD is not set
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set
CONFIG_MODVERSIONS=y
# CONFIG_GENKSYMS is not set
CONFIG_GENDWARFKSYMS=y
CONFIG_ASM_MODVERSIONS=y
# CONFIG_EXTENDED_MODVERSIONS is not set
# CONFIG_BASIC_MODVERSIONS is not set
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_MODULE_SIG=y
# CONFIG_MODULE_SIG_FORCE is not set
# CONFIG_MODULE_SIG_ALL is not set
CONFIG_MODULE_SIG_SHA256=y
# CONFIG_MODULE_SIG_SHA384 is not set
# CONFIG_MODULE_SIG_SHA512 is not set
# CONFIG_MODULE_SIG_SHA3_256 is not set
# CONFIG_MODULE_SIG_SHA3_384 is not set
# CONFIG_MODULE_SIG_SHA3_512 is not set
CONFIG_MODULE_SIG_HASH="sha256"
# CONFIG_MODULE_COMPRESS is not set
# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
CONFIG_MODPROBE_PATH="/sbin/modprobe"
# CONFIG_TRIM_UNUSED_KSYMS is not set
CONFIG_MODULES_TREE_LOOKUP=y
CONFIG_BLOCK=y
CONFIG_BLOCK_LEGACY_AUTOLOAD=y
CONFIG_BLK_RQ_ALLOC_TIME=y
CONFIG_BLK_CGROUP_RWSTAT=y
CONFIG_BLK_CGROUP_PUNT_BIO=y
CONFIG_BLK_DEV_BSG_COMMON=y
CONFIG_BLK_ICQ=y
CONFIG_BLK_DEV_BSGLIB=y
CONFIG_BLK_DEV_INTEGRITY=y
# CONFIG_BLK_DEV_WRITE_MOUNTED is not set
CONFIG_BLK_DEV_ZONED=y
CONFIG_BLK_DEV_THROTTLING=y
CONFIG_BLK_WBT=y
CONFIG_BLK_WBT_MQ=y
CONFIG_BLK_CGROUP_IOLATENCY=y
# CONFIG_BLK_CGROUP_FC_APPID is not set
CONFIG_BLK_CGROUP_IOCOST=y
CONFIG_BLK_CGROUP_IOPRIO=y
CONFIG_BLK_DEBUG_FS=y
# CONFIG_BLK_SED_OPAL is not set
CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
CONFIG_ACORN_PARTITION=y
CONFIG_ACORN_PARTITION_CUMANA=y
CONFIG_ACORN_PARTITION_EESOX=y
CONFIG_ACORN_PARTITION_ICS=y
CONFIG_ACORN_PARTITION_ADFS=y
CONFIG_ACORN_PARTITION_POWERTEC=y
CONFIG_ACORN_PARTITION_RISCIX=y
CONFIG_AIX_PARTITION=y
CONFIG_OSF_PARTITION=y
CONFIG_AMIGA_PARTITION=y
CONFIG_ATARI_PARTITION=y
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
CONFIG_LDM_PARTITION=y
# CONFIG_LDM_DEBUG is not set
CONFIG_SGI_PARTITION=y
CONFIG_ULTRIX_PARTITION=y
CONFIG_SUN_PARTITION=y
CONFIG_KARMA_PARTITION=y
CONFIG_EFI_PARTITION=y
CONFIG_SYSV68_PARTITION=y
CONFIG_CMDLINE_PARTITION=y
# CONFIG_OF_PARTITION is not set
# end of Partition Types

CONFIG_BLK_PM=y
CONFIG_BLOCK_HOLDER_DEPRECATED=y
CONFIG_BLK_MQ_STACKING=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=y
# end of IO Schedulers

CONFIG_PREEMPT_NOTIFIERS=y
CONFIG_PADATA=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_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=y
CONFIG_BINFMT_SCRIPT=y
CONFIG_BINFMT_MISC=y
CONFIG_COREDUMP=y
# end of Executable file formats

#
# Memory Management options
#
CONFIG_SWAP=y
CONFIG_ZSWAP=y
CONFIG_ZSWAP_DEFAULT_ON=y
CONFIG_ZSWAP_SHRINKER_DEFAULT_ON=y
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO is not set
CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842=y
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set
CONFIG_ZSWAP_COMPRESSOR_DEFAULT="842"
CONFIG_ZSMALLOC=y

#
# Zsmalloc allocator options
#

#
# Zsmalloc is a common backend allocator for zswap & zram
#
# CONFIG_ZSMALLOC_STAT is not set
CONFIG_ZSMALLOC_CHAIN_SIZE=8
# end of Zsmalloc allocator options

#
# Slab allocator options
#
CONFIG_SLUB=y
CONFIG_KVFREE_RCU_BATCHED=y
# CONFIG_SLUB_TINY is not set
CONFIG_SLAB_MERGE_DEFAULT=y
# CONFIG_SLAB_FREELIST_RANDOM is not set
# CONFIG_SLAB_FREELIST_HARDENED is not set
# CONFIG_SLAB_BUCKETS is not set
# CONFIG_SLUB_STATS is not set
# CONFIG_RANDOM_KMALLOC_CACHES is not set
# end of Slab allocator options

# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
# CONFIG_COMPAT_BRK is not set
CONFIG_SPARSEMEM=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_SPARSEMEM_VMEMMAP_PREINIT=y
CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y
CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y
CONFIG_ARCH_WANT_HUGETLB_VMEMMAP_PREINIT=y
CONFIG_HAVE_GUP_FAST=y
CONFIG_NUMA_KEEP_MEMINFO=y
CONFIG_MEMORY_ISOLATION=y
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
CONFIG_HAVE_BOOTMEM_INFO_NODE=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTPLUG=y
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_OFFLINE is not set
CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_AUTO=y
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_KERNEL is not set
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_MOVABLE is not set
CONFIG_MEMORY_HOTREMOVE=y
CONFIG_MHP_MEMMAP_ON_MEMORY=y
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
CONFIG_SPLIT_PTE_PTLOCKS=y
CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
CONFIG_SPLIT_PMD_PTLOCKS=y
CONFIG_BALLOON=y
CONFIG_BALLOON_MIGRATION=y
CONFIG_COMPACTION=y
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=0
CONFIG_PAGE_REPORTING=y
CONFIG_NUMA_MIGRATION=y
CONFIG_MIGRATION=y
CONFIG_DEVICE_MIGRATION=y
CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y
CONFIG_CONTIG_ALLOC=y
CONFIG_PCP_BATCH_SCALE_MAX=5
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_MMU_NOTIFIER=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
# CONFIG_MEMORY_FAILURE is not set
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
CONFIG_ARCH_WANTS_THP_SWAP=y
CONFIG_PAGE_MAPCOUNT=y
CONFIG_PGTABLE_HAS_HUGE_LEAVES=y
CONFIG_HAVE_GIGANTIC_FOLIOS=y
CONFIG_ASYNC_KERNEL_PGTABLE_FREE=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_USE_PERCPU_NUMA_NODE_ID=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_CMA=y
# CONFIG_CMA_DEBUGFS is not set
# CONFIG_CMA_SYSFS is not set
CONFIG_CMA_AREAS=20
CONFIG_PAGE_BLOCK_MAX_ORDER=10
CONFIG_MEM_SOFT_DIRTY=y
CONFIG_GENERIC_EARLY_IOREMAP=y
# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
CONFIG_PAGE_IDLE_FLAG=y
# CONFIG_IDLE_PAGE_TRACKING is not set
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
CONFIG_ARCH_HAS_ZONE_DMA_SET=y
CONFIG_ZONE_DMA=y
CONFIG_ZONE_DMA32=y
CONFIG_ZONE_DEVICE=y
CONFIG_HMM_MIRROR=y
CONFIG_GET_FREE_REGION=y
CONFIG_DEVICE_PRIVATE=y
CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
CONFIG_ARCH_HAS_PKEYS=y
CONFIG_ARCH_USES_PG_ARCH_2=y
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_PERCPU_STATS=y
# CONFIG_GUP_TEST is not set
# CONFIG_DMAPOOL_TEST is not set
CONFIG_ARCH_HAS_PTE_SPECIAL=y
CONFIG_MAPPING_DIRTY_HELPERS=y
CONFIG_KMAP_LOCAL=y
CONFIG_MEMFD_CREATE=y
CONFIG_SECRETMEM=y
CONFIG_ANON_VMA_NAME=y
CONFIG_HAVE_ARCH_USERFAULTFD_WP=y
CONFIG_HAVE_ARCH_USERFAULTFD_MINOR=y
CONFIG_USERFAULTFD=y
# CONFIG_PTE_MARKER_UFFD_WP is not set
# CONFIG_LRU_GEN is not set
CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y
CONFIG_PER_VMA_LOCK=y
CONFIG_LOCK_MM_AND_FIND_VMA=y
CONFIG_IOMMU_MM_DATA=y
CONFIG_EXECMEM=y
CONFIG_NUMA_MEMBLKS=y
CONFIG_NUMA_EMU=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
CONFIG_PT_RECLAIM=y

#
# Data Access Monitoring
#
CONFIG_DAMON=y
# CONFIG_DAMON_DEBUG_SANITY is not set
CONFIG_DAMON_VADDR=y
CONFIG_DAMON_PADDR=y
# CONFIG_DAMON_SYSFS is not set
CONFIG_DAMON_RECLAIM=y
# CONFIG_DAMON_LRU_SORT is not set
# CONFIG_DAMON_STAT is not set
# end of Data Access Monitoring
# end of Memory Management options

CONFIG_NET=y
CONFIG_WANT_COMPAT_NETLINK_MESSAGES=y
CONFIG_COMPAT_NETLINK_MESSAGES=y
CONFIG_NET_INGRESS=y
CONFIG_NET_EGRESS=y
CONFIG_NET_XGRESS=y
CONFIG_NET_REDIRECT=y
CONFIG_SKB_DECRYPTED=y
CONFIG_SKB_EXTENSIONS=y
CONFIG_NET_DEVMEM=y
CONFIG_NET_SHAPER=y
CONFIG_NET_CRC32C=y

#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_DIAG=y
CONFIG_INET_PSP=y
CONFIG_UNIX=y
CONFIG_AF_UNIX_OOB=y
CONFIG_UNIX_DIAG=y
CONFIG_TLS=y
CONFIG_TLS_DEVICE=y
CONFIG_TLS_TOE=y
CONFIG_XFRM=y
CONFIG_XFRM_OFFLOAD=y
CONFIG_XFRM_ALGO=y
CONFIG_XFRM_USER=y
CONFIG_XFRM_USER_COMPAT=y
CONFIG_XFRM_INTERFACE=y
CONFIG_XFRM_SUB_POLICY=y
CONFIG_XFRM_MIGRATE=y
CONFIG_XFRM_STATISTICS=y
CONFIG_XFRM_AH=y
CONFIG_XFRM_ESP=y
CONFIG_XFRM_IPCOMP=y
CONFIG_NET_KEY=y
CONFIG_NET_KEY_MIGRATE=y
# CONFIG_XFRM_IPTFS is not set
CONFIG_XFRM_ESPINTCP=y
CONFIG_SMC=y
CONFIG_SMC_DIAG=y
# CONFIG_SMC_HS_CTRL_BPF is not set
CONFIG_DIBS=y
CONFIG_DIBS_LO=y
CONFIG_XDP_SOCKETS=y
CONFIG_XDP_SOCKETS_DIAG=y
CONFIG_NET_HANDSHAKE=y
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=y
CONFIG_IP_PNP_RARP=y
CONFIG_NET_IPIP=y
CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IP_TUNNEL=y
CONFIG_NET_IPGRE=y
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=y
CONFIG_NET_UDP_TUNNEL=y
CONFIG_NET_FOU=y
CONFIG_NET_FOU_IP_TUNNELS=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_ESP_OFFLOAD=y
CONFIG_INET_ESPINTCP=y
CONFIG_INET_IPCOMP=y
CONFIG_INET_TABLE_PERTURB_ORDER=16
CONFIG_INET_XFRM_TUNNEL=y
CONFIG_INET_TUNNEL=y
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
CONFIG_INET_UDP_DIAG=y
CONFIG_INET_RAW_DIAG=y
CONFIG_INET_DIAG_DESTROY=y
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_BIC=y
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_WESTWOOD=y
CONFIG_TCP_CONG_HTCP=y
CONFIG_TCP_CONG_HSTCP=y
CONFIG_TCP_CONG_HYBLA=y
CONFIG_TCP_CONG_VEGAS=y
CONFIG_TCP_CONG_NV=y
CONFIG_TCP_CONG_SCALABLE=y
CONFIG_TCP_CONG_LP=y
CONFIG_TCP_CONG_VENO=y
CONFIG_TCP_CONG_YEAH=y
CONFIG_TCP_CONG_ILLINOIS=y
CONFIG_TCP_CONG_DCTCP=y
CONFIG_TCP_CONG_CDG=y
CONFIG_TCP_CONG_BBR=y
# CONFIG_DEFAULT_BIC is not set
CONFIG_DEFAULT_CUBIC=y
# CONFIG_DEFAULT_HTCP is not set
# CONFIG_DEFAULT_HYBLA is not set
# CONFIG_DEFAULT_VEGAS is not set
# CONFIG_DEFAULT_VENO is not set
# CONFIG_DEFAULT_WESTWOOD is not set
# CONFIG_DEFAULT_DCTCP is not set
# CONFIG_DEFAULT_CDG is not set
# CONFIG_DEFAULT_BBR is not set
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_TCP_AO is not set
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
CONFIG_INET6_AH=y
CONFIG_INET6_ESP=y
CONFIG_INET6_ESP_OFFLOAD=y
CONFIG_INET6_ESPINTCP=y
CONFIG_INET6_IPCOMP=y
CONFIG_IPV6_MIP6=y
CONFIG_IPV6_ILA=y
CONFIG_INET6_XFRM_TUNNEL=y
CONFIG_INET6_TUNNEL=y
CONFIG_IPV6_VTI=y
CONFIG_IPV6_SIT=y
CONFIG_IPV6_SIT_6RD=y
CONFIG_IPV6_NDISC_NODETYPE=y
CONFIG_IPV6_TUNNEL=y
CONFIG_IPV6_GRE=y
CONFIG_IPV6_FOU=y
CONFIG_IPV6_FOU_TUNNEL=y
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_IPV6_SUBTREES=y
CONFIG_IPV6_MROUTE=y
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
CONFIG_IPV6_PIMSM_V2=y
CONFIG_IPV6_SEG6_LWTUNNEL=y
CONFIG_IPV6_SEG6_HMAC=y
CONFIG_IPV6_SEG6_BPF=y
CONFIG_IPV6_RPL_LWTUNNEL=y
# CONFIG_IPV6_IOAM6_LWTUNNEL is not set
CONFIG_NETLABEL=y
CONFIG_MPTCP=y
CONFIG_INET_MPTCP_DIAG=y
CONFIG_MPTCP_IPV6=y
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_EGRESS=y
CONFIG_NETFILTER_SKIP_EGRESS=y
CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_FAMILY_BRIDGE=y
CONFIG_NETFILTER_FAMILY_ARP=y
CONFIG_NETFILTER_BPF_LINK=y
# CONFIG_NETFILTER_NETLINK_HOOK is not set
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_SYSLOG=y
CONFIG_NETFILTER_CONNCOUNT=y
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_ZONES=y
# CONFIG_NF_CONNTRACK_PROCFS is not set
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_TIMEOUT=y
CONFIG_NF_CONNTRACK_TIMESTAMP=y
CONFIG_NF_CONNTRACK_LABELS=y
CONFIG_NF_CONNTRACK_OVS=y
CONFIG_NF_CT_PROTO_GRE=y
CONFIG_NF_CT_PROTO_SCTP=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_NF_NAT_OVS=y
CONFIG_NETFILTER_SYNPROXY=y
CONFIG_NF_TABLES=y
CONFIG_NF_TABLES_INET=y
CONFIG_NF_TABLES_NETDEV=y
CONFIG_NFT_NUMGEN=y
CONFIG_NFT_CT=y
CONFIG_NFT_EXTHDR_DCCP=y
CONFIG_NFT_FLOW_OFFLOAD=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_QUEUE=y
CONFIG_NFT_QUOTA=y
CONFIG_NFT_REJECT=y
CONFIG_NFT_REJECT_INET=y
CONFIG_NFT_COMPAT=y
CONFIG_NFT_HASH=y
CONFIG_NFT_FIB=y
CONFIG_NFT_FIB_INET=y
CONFIG_NFT_XFRM=y
CONFIG_NFT_SOCKET=y
CONFIG_NFT_OSF=y
CONFIG_NFT_TPROXY=y
CONFIG_NFT_SYNPROXY=y
CONFIG_NF_DUP_NETDEV=y
CONFIG_NFT_DUP_NETDEV=y
CONFIG_NFT_FWD_NETDEV=y
CONFIG_NFT_FIB_NETDEV=y
CONFIG_NFT_REJECT_NETDEV=y
CONFIG_NF_FLOW_TABLE_INET=y
CONFIG_NF_FLOW_TABLE=y
# CONFIG_NF_FLOW_TABLE_PROCFS is not set
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XTABLES_COMPAT=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=y
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=y
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
# CONFIG_NETFILTER_XT_TARGET_CT is not set
CONFIG_NETFILTER_XT_TARGET_DSCP=y
# CONFIG_NETFILTER_XT_TARGET_HL is not set
CONFIG_NETFILTER_XT_TARGET_HMARK=y
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
CONFIG_NETFILTER_XT_TARGET_LED=y
CONFIG_NETFILTER_XT_TARGET_LOG=y
CONFIG_NETFILTER_XT_TARGET_MARK=y
CONFIG_NETFILTER_XT_NAT=y
# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
CONFIG_NETFILTER_XT_TARGET_RATEEST=y
# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set
CONFIG_NETFILTER_XT_TARGET_MASQUERADE=y
CONFIG_NETFILTER_XT_TARGET_TEE=y
CONFIG_NETFILTER_XT_TARGET_TPROXY=y
CONFIG_NETFILTER_XT_TARGET_SECMARK=y
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=y
CONFIG_IP_SET_HASH_IPPORT=y
CONFIG_IP_SET_HASH_IPPORTIP=y
CONFIG_IP_SET_HASH_IPPORTNET=y
CONFIG_IP_SET_HASH_IPMAC=y
CONFIG_IP_SET_HASH_MAC=y
CONFIG_IP_SET_HASH_NETPORTNET=y
CONFIG_IP_SET_HASH_NET=y
CONFIG_IP_SET_HASH_NETNET=y
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 is not set
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
CONFIG_IP_VS_TWOS=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=y
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_TARGET_REJECT=y
CONFIG_IP_NF_TARGET_SYNPROXY=y
CONFIG_IP_NF_TARGET_ECN=y
CONFIG_NFT_COMPAT_ARP=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=y
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=y
CONFIG_IP6_NF_TARGET_REJECT=y
CONFIG_IP6_NF_TARGET_SYNPROXY=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=y
CONFIG_NFT_BRIDGE_REJECT=y
CONFIG_NF_CONNTRACK_BRIDGE=y
CONFIG_BRIDGE_NF_EBTABLES=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_IP_SCTP=y
# CONFIG_SCTP_DBG_OBJCNT is not set
CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA256=y
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set
CONFIG_INET_SCTP_DIAG=y
CONFIG_RDS=y
CONFIG_RDS_RDMA=y
CONFIG_RDS_TCP=y
# CONFIG_RDS_DEBUG is not set
CONFIG_TIPC=y
CONFIG_TIPC_MEDIA_IB=y
CONFIG_TIPC_MEDIA_UDP=y
CONFIG_TIPC_CRYPTO=y
CONFIG_TIPC_DIAG=y
CONFIG_ATM=y
CONFIG_ATM_CLIP=y
# CONFIG_ATM_CLIP_NO_ICMP is not set
CONFIG_ATM_LANE=y
CONFIG_ATM_MPOA=y
CONFIG_ATM_BR2684=y
# CONFIG_ATM_BR2684_IPFILTER is not set
CONFIG_L2TP=y
# CONFIG_L2TP_DEBUGFS is not set
CONFIG_L2TP_V3=y
CONFIG_L2TP_IP=y
CONFIG_L2TP_ETH=y
CONFIG_STP=y
CONFIG_GARP=y
CONFIG_MRP=y
CONFIG_BRIDGE=y
CONFIG_BRIDGE_IGMP_SNOOPING=y
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_BRIDGE_MRP=y
CONFIG_BRIDGE_CFM=y
CONFIG_NET_DSA=y
# CONFIG_NET_DSA_TAG_NONE is not set
# CONFIG_NET_DSA_TAG_AR9331 is not set
CONFIG_NET_DSA_TAG_BRCM_COMMON=y
CONFIG_NET_DSA_TAG_BRCM=y
# CONFIG_NET_DSA_TAG_BRCM_LEGACY is not set
# CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS is not set
CONFIG_NET_DSA_TAG_BRCM_PREPEND=y
# CONFIG_NET_DSA_TAG_HELLCREEK is not set
# CONFIG_NET_DSA_TAG_GSWIP is not set
# CONFIG_NET_DSA_TAG_DSA is not set
# CONFIG_NET_DSA_TAG_EDSA is not set
CONFIG_NET_DSA_TAG_MTK=y
# CONFIG_NET_DSA_TAG_MXL_862XX is not set
# CONFIG_NET_DSA_TAG_MXL_GSW1XX is not set
# CONFIG_NET_DSA_TAG_KSZ is not set
# CONFIG_NET_DSA_TAG_OCELOT is not set
# CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set
CONFIG_NET_DSA_TAG_QCA=y
CONFIG_NET_DSA_TAG_RTL4_A=y
# CONFIG_NET_DSA_TAG_RTL8_4 is not set
# CONFIG_NET_DSA_TAG_RZN1_A5PSW is not set
# CONFIG_NET_DSA_TAG_LAN9303 is not set
# CONFIG_NET_DSA_TAG_SJA1105 is not set
# CONFIG_NET_DSA_TAG_TRAILER is not set
# CONFIG_NET_DSA_TAG_VSC73XX_8021Q is not set
# CONFIG_NET_DSA_TAG_XRS700X is not set
# CONFIG_NET_DSA_TAG_YT921X is not set
CONFIG_VLAN_8021Q=y
CONFIG_VLAN_8021Q_GVRP=y
CONFIG_VLAN_8021Q_MVRP=y
CONFIG_LLC=y
CONFIG_LLC2=y
# CONFIG_ATALK is not set
CONFIG_X25=y
CONFIG_LAPB=y
CONFIG_PHONET=y
CONFIG_6LOWPAN=y
# CONFIG_6LOWPAN_DEBUGFS is not set
CONFIG_6LOWPAN_NHC=y
CONFIG_6LOWPAN_NHC_DEST=y
CONFIG_6LOWPAN_NHC_FRAGMENT=y
CONFIG_6LOWPAN_NHC_HOP=y
CONFIG_6LOWPAN_NHC_IPV6=y
CONFIG_6LOWPAN_NHC_MOBILITY=y
CONFIG_6LOWPAN_NHC_ROUTING=y
CONFIG_6LOWPAN_NHC_UDP=y
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=y
CONFIG_6LOWPAN_GHC_UDP=y
CONFIG_6LOWPAN_GHC_ICMPV6=y
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=y
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=y
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=y
CONFIG_IEEE802154=y
CONFIG_IEEE802154_NL802154_EXPERIMENTAL=y
CONFIG_IEEE802154_SOCKET=y
CONFIG_IEEE802154_6LOWPAN=y
CONFIG_MAC802154=y
CONFIG_NET_SCHED=y

#
# Queueing/Scheduling
#
CONFIG_NET_SCH_HTB=y
CONFIG_NET_SCH_HFSC=y
CONFIG_NET_SCH_PRIO=y
CONFIG_NET_SCH_MULTIQ=y
CONFIG_NET_SCH_RED=y
CONFIG_NET_SCH_SFB=y
CONFIG_NET_SCH_SFQ=y
CONFIG_NET_SCH_TEQL=y
CONFIG_NET_SCH_TBF=y
CONFIG_NET_SCH_CBS=y
CONFIG_NET_SCH_ETF=y
CONFIG_NET_SCH_MQPRIO_LIB=y
CONFIG_NET_SCH_TAPRIO=y
CONFIG_NET_SCH_GRED=y
CONFIG_NET_SCH_NETEM=y
CONFIG_NET_SCH_DRR=y
CONFIG_NET_SCH_MQPRIO=y
CONFIG_NET_SCH_SKBPRIO=y
CONFIG_NET_SCH_CHOKE=y
CONFIG_NET_SCH_QFQ=y
CONFIG_NET_SCH_CODEL=y
CONFIG_NET_SCH_FQ_CODEL=y
CONFIG_NET_SCH_CAKE=y
CONFIG_NET_SCH_FQ=y
CONFIG_NET_SCH_HHF=y
CONFIG_NET_SCH_PIE=y
CONFIG_NET_SCH_FQ_PIE=y
CONFIG_NET_SCH_INGRESS=y
CONFIG_NET_SCH_PLUG=y
CONFIG_NET_SCH_ETS=y
# CONFIG_NET_SCH_DUALPI2 is not set
CONFIG_NET_SCH_DEFAULT=y
# CONFIG_DEFAULT_FQ is not set
CONFIG_DEFAULT_CODEL=y
# CONFIG_DEFAULT_FQ_CODEL is not set
# CONFIG_DEFAULT_FQ_PIE is not set
# CONFIG_DEFAULT_SFQ is not set
# CONFIG_DEFAULT_PFIFO_FAST is not set
CONFIG_DEFAULT_NET_SCH="pfifo_fast"

#
# Classification
#
CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=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_FLOW=y
CONFIG_NET_CLS_CGROUP=y
CONFIG_NET_CLS_BPF=y
CONFIG_NET_CLS_FLOWER=y
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_CANID=y
CONFIG_NET_EMATCH_IPSET=y
CONFIG_NET_EMATCH_IPT=y
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=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=y
CONFIG_NET_ACT_VLAN=y
CONFIG_NET_ACT_BPF=y
CONFIG_NET_ACT_CONNMARK=y
CONFIG_NET_ACT_CTINFO=y
CONFIG_NET_ACT_SKBMOD=y
CONFIG_NET_ACT_IFE=y
CONFIG_NET_ACT_TUNNEL_KEY=y
CONFIG_NET_ACT_CT=y
CONFIG_NET_ACT_GATE=y
CONFIG_NET_IFE_SKBMARK=y
CONFIG_NET_IFE_SKBPRIO=y
CONFIG_NET_IFE_SKBTCINDEX=y
CONFIG_NET_TC_SKB_EXT=y
CONFIG_NET_SCH_FIFO=y
CONFIG_DCB=y
CONFIG_DNS_RESOLVER=y
CONFIG_BATMAN_ADV=y
CONFIG_BATMAN_ADV_BATMAN_V=y
CONFIG_BATMAN_ADV_BLA=y
CONFIG_BATMAN_ADV_DAT=y
CONFIG_BATMAN_ADV_MCAST=y
# CONFIG_BATMAN_ADV_DEBUG is not set
# CONFIG_BATMAN_ADV_TRACING is not set
CONFIG_OPENVSWITCH=y
CONFIG_OPENVSWITCH_GRE=y
CONFIG_OPENVSWITCH_VXLAN=y
CONFIG_OPENVSWITCH_GENEVE=y
CONFIG_VSOCKETS=y
CONFIG_VSOCKETS_DIAG=y
CONFIG_VSOCKETS_LOOPBACK=y
# CONFIG_VMWARE_VMCI_VSOCKETS is not set
CONFIG_VIRTIO_VSOCKETS=y
CONFIG_VIRTIO_VSOCKETS_COMMON=y
CONFIG_NETLINK_DIAG=y
CONFIG_MPLS=y
CONFIG_NET_MPLS_GSO=y
CONFIG_MPLS_ROUTING=y
CONFIG_MPLS_IPTUNNEL=y
CONFIG_NET_NSH=y
CONFIG_HSR=y
CONFIG_NET_SWITCHDEV=y
CONFIG_NET_L3_MASTER_DEV=y
CONFIG_QRTR=y
CONFIG_QRTR_TUN=y
# CONFIG_QRTR_MHI is not set
CONFIG_NET_NCSI=y
# CONFIG_NCSI_OEM_CMD_GET_MAC is not set
# CONFIG_NCSI_OEM_CMD_KEEP_PHY is not set
# CONFIG_PCPU_DEV_REFCNT is not set
CONFIG_MAX_SKB_FRAGS=17
CONFIG_RPS=y
CONFIG_RFS_ACCEL=y
CONFIG_SOCK_RX_QUEUE_MAPPING=y
CONFIG_XPS=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
CONFIG_BQL=y
CONFIG_NET_FLOW_LIMIT=y

#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
CONFIG_NET_DROP_MONITOR=y
# end of Network testing
# end of Networking options

CONFIG_HAMRADIO=y

#
# Packet Radio protocols
#
CONFIG_AX25=y
CONFIG_AX25_DAMA_SLAVE=y
CONFIG_NETROM=y
CONFIG_ROSE=y

#
# AX.25 network device drivers
#
CONFIG_MKISS=y
CONFIG_6PACK=y
CONFIG_BPQETHER=y
# CONFIG_BAYCOM_SER_FDX is not set
# CONFIG_BAYCOM_SER_HDX is not set
# CONFIG_BAYCOM_PAR is not set
# CONFIG_YAM is not set
# end of AX.25 network device drivers

CONFIG_CAN=y
CONFIG_CAN_RAW=y
CONFIG_CAN_BCM=y
CONFIG_CAN_GW=y
CONFIG_CAN_J1939=y
CONFIG_CAN_ISOTP=y
CONFIG_BT=y
CONFIG_BT_BREDR=y
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=y
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=y
CONFIG_BT_LE=y
CONFIG_BT_LE_L2CAP_ECRED=y
CONFIG_BT_6LOWPAN=y
CONFIG_BT_LEDS=y
CONFIG_BT_MSFTEXT=y
# CONFIG_BT_AOSPEXT is not set
# CONFIG_BT_DEBUGFS is not set
# CONFIG_BT_SELFTEST is not set

#
# Bluetooth device drivers
#
CONFIG_BT_INTEL=y
CONFIG_BT_BCM=y
CONFIG_BT_RTL=y
CONFIG_BT_QCA=y
CONFIG_BT_MTK=y
CONFIG_BT_HCIBTUSB=y
CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y
CONFIG_BT_HCIBTUSB_POLL_SYNC=y
CONFIG_BT_HCIBTUSB_BCM=y
CONFIG_BT_HCIBTUSB_MTK=y
CONFIG_BT_HCIBTUSB_RTL=y
# CONFIG_BT_HCIBTSDIO is not set
CONFIG_BT_HCIUART=y
CONFIG_BT_HCIUART_SERDEV=y
CONFIG_BT_HCIUART_H4=y
# CONFIG_BT_HCIUART_NOKIA is not set
CONFIG_BT_HCIUART_BCSP=y
# CONFIG_BT_HCIUART_ATH3K is not set
CONFIG_BT_HCIUART_LL=y
CONFIG_BT_HCIUART_3WIRE=y
# CONFIG_BT_HCIUART_INTEL is not set
# CONFIG_BT_HCIUART_BCM is not set
# CONFIG_BT_HCIUART_RTL is not set
CONFIG_BT_HCIUART_QCA=y
CONFIG_BT_HCIUART_AG6XX=y
CONFIG_BT_HCIUART_MRVL=y
# CONFIG_BT_HCIUART_AML is not set
CONFIG_BT_HCIBCM203X=y
# CONFIG_BT_HCIBCM4377 is not set
CONFIG_BT_HCIBPA10X=y
CONFIG_BT_HCIBFUSB=y
# CONFIG_BT_HCIDTL1 is not set
# CONFIG_BT_HCIBT3C is not set
# CONFIG_BT_HCIBLUECARD is not set
CONFIG_BT_HCIVHCI=y
CONFIG_BT_MRVL=y
CONFIG_BT_MRVL_SDIO=y
CONFIG_BT_ATH3K=y
CONFIG_BT_MTKSDIO=y
CONFIG_BT_MTKUART=y
# CONFIG_BT_VIRTIO is not set
# CONFIG_BT_NXPUART is not set
# CONFIG_BT_INTEL_PCIE is not set
# end of Bluetooth device drivers

CONFIG_AF_RXRPC=y
CONFIG_AF_RXRPC_IPV6=y
# CONFIG_AF_RXRPC_INJECT_LOSS is not set
# CONFIG_AF_RXRPC_INJECT_RX_DELAY is not set
# CONFIG_AF_RXRPC_DEBUG is not set
CONFIG_RXKAD=y
# CONFIG_RXGK is not set
# CONFIG_RXPERF is not set
CONFIG_AF_KCM=y
CONFIG_STREAM_PARSER=y
CONFIG_MCTP=y
CONFIG_FIB_RULES=y
CONFIG_WIRELESS=y
CONFIG_WEXT_CORE=y
CONFIG_WEXT_PROC=y
CONFIG_CFG80211=y
# CONFIG_NL80211_TESTMODE is not set
# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y
CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y
CONFIG_CFG80211_DEFAULT_PS=y
CONFIG_CFG80211_DEBUGFS=y
CONFIG_CFG80211_CRDA_SUPPORT=y
CONFIG_CFG80211_WEXT=y
CONFIG_MAC80211=y
CONFIG_MAC80211_HAS_RC=y
CONFIG_MAC80211_RC_MINSTREL=y
CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
CONFIG_MAC80211_MESH=y
CONFIG_MAC80211_LEDS=y
CONFIG_MAC80211_DEBUGFS=y
# CONFIG_MAC80211_MESSAGE_TRACING is not set
# CONFIG_MAC80211_DEBUG_MENU is not set
CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
CONFIG_RFKILL=y
CONFIG_RFKILL_LEDS=y
CONFIG_RFKILL_INPUT=y
# CONFIG_RFKILL_GPIO is not set
CONFIG_NET_9P=y
CONFIG_NET_9P_FD=y
CONFIG_NET_9P_VIRTIO=y
# CONFIG_NET_9P_USBG is not set
CONFIG_NET_9P_RDMA=y
# CONFIG_NET_9P_DEBUG is not set
CONFIG_CAIF=y
CONFIG_CAIF_DEBUG=y
CONFIG_CAIF_NETDEV=y
CONFIG_CAIF_USB=y
CONFIG_CEPH_LIB=y
# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
CONFIG_CEPH_LIB_USE_DNS_RESOLVER=y
CONFIG_NFC=y
CONFIG_NFC_DIGITAL=y
CONFIG_NFC_NCI=y
# CONFIG_NFC_NCI_SPI is not set
CONFIG_NFC_NCI_UART=y
CONFIG_NFC_HCI=y
CONFIG_NFC_SHDLC=y

#
# Near Field Communication (NFC) devices
#
# CONFIG_NFC_TRF7970A is not set
# CONFIG_NFC_MEI_PHY is not set
CONFIG_NFC_SIM=y
CONFIG_NFC_PORT100=y
CONFIG_NFC_VIRTUAL_NCI=y
CONFIG_NFC_FDP=y
# CONFIG_NFC_FDP_I2C is not set
# CONFIG_NFC_PN544_I2C is not set
CONFIG_NFC_PN533=y
CONFIG_NFC_PN533_USB=y
# CONFIG_NFC_PN533_I2C is not set
# CONFIG_NFC_PN532_UART is not set
# CONFIG_NFC_MICROREAD_I2C is not set
CONFIG_NFC_MRVL=y
CONFIG_NFC_MRVL_USB=y
# CONFIG_NFC_MRVL_UART is not set
# CONFIG_NFC_MRVL_I2C is not set
# CONFIG_NFC_ST21NFCA_I2C is not set
# CONFIG_NFC_ST_NCI_I2C is not set
# CONFIG_NFC_ST_NCI_SPI is not set
# CONFIG_NFC_NXP_NCI is not set
# CONFIG_NFC_S3FWRN5_I2C is not set
# CONFIG_NFC_S3FWRN82_UART is not set
# CONFIG_NFC_ST95HF is not set
# end of Near Field Communication (NFC) devices

CONFIG_PSAMPLE=y
CONFIG_NET_IFE=y
CONFIG_LWTUNNEL=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_DST_CACHE=y
CONFIG_GRO_CELLS=y
CONFIG_SOCK_VALIDATE_XMIT=y
CONFIG_NET_SELFTESTS=y
CONFIG_NET_SOCK_MSG=y
CONFIG_NET_DEVLINK=y
CONFIG_PAGE_POOL=y
# CONFIG_PAGE_POOL_STATS is not set
CONFIG_FAILOVER=y
CONFIG_ETHTOOL_NETLINK=y

#
# Device Drivers
#
CONFIG_HAVE_PCI=y
CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCIEPORTBUS=y
CONFIG_HOTPLUG_PCI_PCIE=y
CONFIG_PCIEAER=y
# CONFIG_PCIEAER_INJECT is not set
# CONFIG_PCIE_ECRC 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_DPC is not set
# CONFIG_PCIE_PTM is not set
CONFIG_PCI_MSI=y
CONFIG_PCI_QUIRKS=y
# CONFIG_PCI_DEBUG is not set
# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
# CONFIG_PCI_STUB is not set
# CONFIG_PCI_PF_STUB is not set
CONFIG_PCI_ATS=y
# CONFIG_PCI_TSM is not set
# CONFIG_PCI_DOE is not set
CONFIG_PCI_ECAM=y
CONFIG_PCI_LOCKLESS_CONFIG=y
CONFIG_PCI_IOV=y
# CONFIG_PCI_NPEM is not set
CONFIG_PCI_PRI=y
CONFIG_PCI_PASID=y
# CONFIG_PCIE_TPH is not set
# CONFIG_PCI_P2PDMA is not set
CONFIG_PCI_LABEL=y
# CONFIG_PCI_DYNAMIC_OF_NODES 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_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_HOTPLUG_PCI=y
# CONFIG_HOTPLUG_PCI_ACPI is not set
# CONFIG_HOTPLUG_PCI_CPCI is not set
# CONFIG_HOTPLUG_PCI_OCTEONEP is not set
# CONFIG_HOTPLUG_PCI_SHPC is not set

#
# PCI controller drivers
#
CONFIG_PCI_HOST_COMMON=y
# CONFIG_PCI_FTPCI100 is not set
CONFIG_PCI_HOST_GENERIC=y
# CONFIG_VMD is not set
# CONFIG_PCIE_XILINX is not set

#
# Cadence-based PCIe controllers
#
# CONFIG_PCIE_CADENCE_PLAT_HOST is not set
# CONFIG_PCIE_CADENCE_PLAT_EP is not set
# end of Cadence-based PCIe controllers

#
# DesignWare-based PCIe controllers
#
# CONFIG_PCI_MESON is not set
# CONFIG_PCIE_INTEL_GW is not set
# CONFIG_PCIE_DW_PLAT_HOST is not set
# CONFIG_PCIE_DW_PLAT_EP is not set
# end of DesignWare-based PCIe controllers

#
# Mobiveil-based PCIe controllers
#
# end of Mobiveil-based PCIe controllers

#
# PLDA-based PCIe controllers
#
# CONFIG_PCIE_MICROCHIP_HOST is not set
# end of PLDA-based PCIe controllers
# end of PCI controller drivers

#
# PCI Endpoint
#
CONFIG_PCI_ENDPOINT=y
# CONFIG_PCI_ENDPOINT_CONFIGFS is not set
# CONFIG_PCI_ENDPOINT_MSI_DOORBELL is not set
# CONFIG_PCI_EPF_TEST is not set
# CONFIG_PCI_EPF_NTB 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_PCI_PWRCTRL_GENERIC is not set
# CONFIG_PCI_PWRCTRL_TC9563 is not set
# CONFIG_CXL_BUS is not set
CONFIG_PCCARD=y
CONFIG_PCMCIA=y
CONFIG_PCMCIA_LOAD_CIS=y
CONFIG_CARDBUS=y

#
# PC-card bridges
#
CONFIG_YENTA=y
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
# CONFIG_PD6729 is not set
# CONFIG_I82092 is not set
CONFIG_PCCARD_NONSTATIC=y
# CONFIG_RAPIDIO is not set
# CONFIG_PC104 is not set

#
# Generic Driver Options
#
CONFIG_AUXILIARY_BUS=y
CONFIG_UEVENT_HELPER=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_DEVTMPFS_SAFE is not set
CONFIG_DRIVER_DEFERRED_PROBE_TIMEOUT=10
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y

#
# Firmware loader
#
CONFIG_FW_LOADER=y
# CONFIG_FW_LOADER_DEBUG is not set
CONFIG_FW_LOADER_PAGED_BUF=y
CONFIG_FW_LOADER_SYSFS=y
CONFIG_EXTRA_FIRMWARE=""
CONFIG_FW_LOADER_USER_HELPER=y
CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y
CONFIG_FW_LOADER_COMPRESS=y
# CONFIG_FW_LOADER_COMPRESS_XZ is not set
# CONFIG_FW_LOADER_COMPRESS_ZSTD is not set
CONFIG_FW_CACHE=y
# CONFIG_FW_UPLOAD is not set
# end of Firmware loader

CONFIG_WANT_DEV_COREDUMP=y
CONFIG_ALLOW_DEV_COREDUMP=y
CONFIG_DEV_COREDUMP=y
# CONFIG_DEBUG_DRIVER is not set
CONFIG_DEBUG_DEVRES=y
# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
CONFIG_GENERIC_CPU_DEVICES=y
CONFIG_GENERIC_CPU_AUTOPROBE=y
CONFIG_GENERIC_CPU_VULNERABILITIES=y
CONFIG_REGMAP=y
CONFIG_REGMAP_I2C=y
CONFIG_REGMAP_SPI=y
CONFIG_REGMAP_MMIO=y
CONFIG_REGMAP_IRQ=y
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_DMA_FENCE_TRACE is not set
# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set
# end of Generic Driver Options

#
# Bus devices
#
# CONFIG_MOXTET is not set
CONFIG_MHI_BUS=y
# CONFIG_MHI_BUS_DEBUG is not set
# CONFIG_MHI_BUS_PCI_GENERIC is not set
# CONFIG_MHI_BUS_EP is not set
# end of Bus devices

CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y

#
# Firmware Drivers
#

#
# ARM System Control and Management Interface Protocol
#
# end of ARM System Control and Management Interface Protocol

# CONFIG_EDD is not set
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_DMIID=y
# CONFIG_DMI_SYSFS is not set
CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y
# CONFIG_ISCSI_IBFT is not set
# CONFIG_FW_CFG_SYSFS is not set
CONFIG_SYSFB=y
# CONFIG_SYSFB_SIMPLEFB is not set
CONFIG_GOOGLE_FIRMWARE=y
# CONFIG_GOOGLE_SMI is not set
# CONFIG_GOOGLE_CBMEM is not set
CONFIG_GOOGLE_COREBOOT_TABLE=y
CONFIG_GOOGLE_MEMCONSOLE=y
# CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY is not set
# CONFIG_GOOGLE_FRAMEBUFFER_COREBOOT is not set
CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y
CONFIG_GOOGLE_VPD=y

#
# Qualcomm firmware drivers
#
# end of Qualcomm firmware drivers

#
# Tegra firmware driver
#
# end of Tegra firmware driver
# end of Firmware Drivers

# CONFIG_FWCTL is not set
CONFIG_GNSS=y
# CONFIG_GNSS_MTK_SERIAL is not set
# CONFIG_GNSS_SIRF_SERIAL is not set
# CONFIG_GNSS_UBX_SERIAL is not set
CONFIG_GNSS_USB=y
CONFIG_MTD=y
# CONFIG_MTD_TESTS is not set

#
# Partition parsers
#
# CONFIG_MTD_CMDLINE_PARTS is not set
# CONFIG_MTD_OF_PARTS is not set
# CONFIG_MTD_REDBOOT_PARTS is not set
# end of Partition parsers

#
# User Modules And Translation Layers
#
CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y

#
# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK.
#
CONFIG_FTL=y
# CONFIG_NFTL is not set
# CONFIG_INFTL is not set
# CONFIG_RFD_FTL is not set
# CONFIG_SSFDC is not set
# CONFIG_SM_FTL is not set
# CONFIG_MTD_OOPS is not set
# CONFIG_MTD_SWAP is not set
# CONFIG_MTD_PARTITIONED_MASTER is not set

#
# RAM/ROM/Flash chip drivers
#
# CONFIG_MTD_CFI is not set
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_MAP_BANK_WIDTH_1=y
CONFIG_MTD_MAP_BANK_WIDTH_2=y
CONFIG_MTD_MAP_BANK_WIDTH_4=y
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
# end of RAM/ROM/Flash chip drivers

#
# Mapping drivers for chip access
#
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
# CONFIG_MTD_PLATRAM is not set
# end of Mapping drivers for chip access

#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_DATAFLASH is not set
# CONFIG_MTD_MCHP23K256 is not set
# CONFIG_MTD_MCHP48L640 is not set
# CONFIG_MTD_SST25L is not set
CONFIG_MTD_SLRAM=y
CONFIG_MTD_PHRAM=y
CONFIG_MTD_MTDRAM=y
CONFIG_MTDRAM_TOTAL_SIZE=128
CONFIG_MTDRAM_ERASE_SIZE=4
CONFIG_MTD_BLOCK2MTD=y

#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOCG3 is not set
# end of Self-contained MTD device drivers

#
# NAND
#
# CONFIG_MTD_ONENAND is not set
# CONFIG_MTD_RAW_NAND is not set
# CONFIG_MTD_SPI_NAND is not set

#
# ECC engine support
#
# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set
# CONFIG_MTD_NAND_ECC_SW_BCH is not set
# CONFIG_MTD_NAND_ECC_MXIC is not set
# end of ECC engine support
# end of NAND

#
# LPDDR & LPDDR2 PCM memory drivers
#
# CONFIG_MTD_LPDDR is not set
# end of LPDDR & LPDDR2 PCM memory drivers

# CONFIG_MTD_SPI_NOR is not set
CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
# CONFIG_MTD_UBI_GLUEBI is not set
# CONFIG_MTD_UBI_BLOCK is not set
# CONFIG_MTD_UBI_FAULT_INJECTION is not set
# CONFIG_MTD_UBI_NVMEM is not set
# CONFIG_MTD_HYPERBUS 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_ADDRESS=y
CONFIG_OF_IRQ=y
CONFIG_OF_RESERVED_MEM=y
# CONFIG_OF_OVERLAY is not set
CONFIG_OF_NUMA=y
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
CONFIG_PARPORT=y
# CONFIG_PARPORT_PC is not set
# CONFIG_PARPORT_1284 is not set
CONFIG_PARPORT_NOT_PC=y
CONFIG_PNP=y
CONFIG_PNP_DEBUG_MESSAGES=y

#
# Protocols
#
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_NULL_BLK=y
CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION=y
# CONFIG_BLK_DEV_FD is not set
CONFIG_CDROM=y
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
CONFIG_ZRAM=y
# CONFIG_ZRAM_BACKEND_LZ4 is not set
# CONFIG_ZRAM_BACKEND_LZ4HC is not set
# CONFIG_ZRAM_BACKEND_ZSTD is not set
# CONFIG_ZRAM_BACKEND_DEFLATE is not set
# CONFIG_ZRAM_BACKEND_842 is not set
CONFIG_ZRAM_BACKEND_FORCE_LZO=y
CONFIG_ZRAM_BACKEND_LZO=y
# CONFIG_ZRAM_DEF_COMP_LZORLE is not set
CONFIG_ZRAM_DEF_COMP_LZO=y
CONFIG_ZRAM_DEF_COMP="lzo"
# CONFIG_ZRAM_WRITEBACK is not set
# CONFIG_ZRAM_TRACK_ENTRY_ACTIME is not set
# CONFIG_ZRAM_MEMORY_TRACKING is not set
# CONFIG_ZRAM_MULTI_COMP is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_LOOP_MIN_COUNT=16
# CONFIG_BLK_DEV_DRBD is not set
CONFIG_BLK_DEV_NBD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_ATA_OVER_ETH=y
CONFIG_VIRTIO_BLK=y
# CONFIG_BLK_DEV_RBD is not set
# CONFIG_BLK_DEV_UBLK is not set
CONFIG_BLK_DEV_RNBD=y
CONFIG_BLK_DEV_RNBD_CLIENT=y
# CONFIG_BLK_DEV_ZONED_LOOP is not set

#
# NVME Support
#
CONFIG_NVME_CORE=y
CONFIG_BLK_DEV_NVME=y
CONFIG_NVME_MULTIPATH=y
# CONFIG_NVME_VERBOSE_ERRORS is not set
# CONFIG_NVME_HWMON is not set
CONFIG_NVME_FABRICS=y
CONFIG_NVME_RDMA=y
CONFIG_NVME_FC=y
CONFIG_NVME_TCP=y
# CONFIG_NVME_TCP_TLS is not set
# CONFIG_NVME_HOST_AUTH is not set
CONFIG_NVME_TARGET=y
# CONFIG_NVME_TARGET_DEBUGFS is not set
# CONFIG_NVME_TARGET_PASSTHRU is not set
CONFIG_NVME_TARGET_LOOP=y
CONFIG_NVME_TARGET_RDMA=y
CONFIG_NVME_TARGET_FC=y
CONFIG_NVME_TARGET_FCLOOP=y
CONFIG_NVME_TARGET_TCP=y
# CONFIG_NVME_TARGET_TCP_TLS is not set
# CONFIG_NVME_TARGET_AUTH is not set
# CONFIG_NVME_TARGET_PCI_EPF 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_RPMB is not set
# CONFIG_TI_FPC202 is not set
# CONFIG_TIFM_CORE is not set
# CONFIG_ICS932S401 is not set
# CONFIG_ENCLOSURE_SERVICES is not set
# 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_VMWARE_BALLOON is not set
# CONFIG_LATTICE_ECP3_CONFIG is not set
# CONFIG_SRAM is not set
# CONFIG_DW_XDATA_PCIE is not set
# CONFIG_PCI_ENDPOINT_TEST is not set
# CONFIG_XILINX_SDFEC is not set
CONFIG_MISC_RTSX=y
# CONFIG_HISI_HIKEY_USB is not set
# CONFIG_OPEN_DICE is not set
# CONFIG_NTSYNC is not set
# CONFIG_VCPU_STALL_DETECTOR is not set
# CONFIG_NSM is not set
# CONFIG_C2PORT is not set

#
# EEPROM support
#
# CONFIG_EEPROM_AT24 is not set
# CONFIG_EEPROM_AT25 is not set
# CONFIG_EEPROM_MAX6875 is not set
CONFIG_EEPROM_93CX6=y
# CONFIG_EEPROM_93XX46 is not set
# CONFIG_EEPROM_IDT_89HPESX is not set
# CONFIG_EEPROM_EE1004 is not set
# CONFIG_EEPROM_M24LR is not set
# end of EEPROM support

# CONFIG_CB710_CORE is not set
# CONFIG_SENSORS_LIS3_I2C is not set
# CONFIG_ALTERA_STAPL is not set
CONFIG_INTEL_MEI=y
CONFIG_INTEL_MEI_ME=y
# CONFIG_INTEL_MEI_TXE is not set
# CONFIG_INTEL_MEI_VSC_HW is not set
CONFIG_VMWARE_VMCI=y
# CONFIG_GENWQE is not set
# CONFIG_BCM_VK is not set
# CONFIG_MISC_ALCOR_PCI is not set
# CONFIG_MISC_RTSX_PCI is not set
CONFIG_MISC_RTSX_USB=y
# CONFIG_UACCE is not set
# CONFIG_PVPANIC is not set
# CONFIG_GP_PCI1XXXX is not set
# CONFIG_KEBA_CP500 is not set
# CONFIG_MISC_RP1 is not set
# end of Misc devices

#
# SCSI device support
#
CONFIG_SCSI_MOD=y
CONFIG_RAID_ATTRS=y
CONFIG_SCSI_COMMON=y
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
CONFIG_SCSI_NETLINK=y
CONFIG_SCSI_PROC_FS=y

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_ST=y
CONFIG_BLK_DEV_SR=y
CONFIG_CHR_DEV_SG=y
CONFIG_BLK_DEV_BSG=y
# CONFIG_CHR_DEV_SCH is not set
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y

#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_FC_ATTRS=y
CONFIG_SCSI_ISCSI_ATTRS=y
CONFIG_SCSI_SAS_ATTRS=y
CONFIG_SCSI_SAS_LIBSAS=y
CONFIG_SCSI_SAS_ATA=y
# CONFIG_SCSI_SAS_HOST_SMP is not set
CONFIG_SCSI_SRP_ATTRS=y
# end of SCSI Transports

CONFIG_SCSI_LOWLEVEL=y
# CONFIG_ISCSI_TCP is not set
# 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=y
# 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_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 is not set
# CONFIG_SCSI_MPT3SAS is not set
# CONFIG_SCSI_MPT2SAS is not set
# CONFIG_SCSI_MPI3MR is not set
# CONFIG_SCSI_SMARTPQI 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 is not set
# CONFIG_LIBFC is not set
# CONFIG_SCSI_SNIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_FDOMAIN_PCI 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_FC is not set
# CONFIG_SCSI_QLA_ISCSI is not set
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_EFCT 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_BFA_FC is not set
CONFIG_SCSI_VIRTIO=y
# CONFIG_SCSI_CHELSIO_FCOE is not set
# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
# 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=y
CONFIG_ATA_FORCE=y
CONFIG_ATA_ACPI=y
# CONFIG_SATA_ZPODD is not set
CONFIG_SATA_PMP=y

#
# Controllers with non-SFF native interface
#
CONFIG_SATA_AHCI=y
CONFIG_SATA_MOBILE_LPM_POLICY=3
# CONFIG_SATA_AHCI_PLATFORM is not set
# CONFIG_AHCI_DWC is not set
# CONFIG_AHCI_CEVA 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_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=y
# 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=y
# 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=y
# CONFIG_PATA_SERVERWORKS is not set
# CONFIG_PATA_SIL680 is not set
# CONFIG_PATA_SIS is not set
# 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_PCMCIA is not set
# CONFIG_PATA_OF_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=y
CONFIG_MD_BITMAP=y
# CONFIG_MD_LLBITMAP is not set
CONFIG_MD_AUTODETECT=y
CONFIG_MD_BITMAP_FILE=y
# CONFIG_MD_LINEAR is not set
CONFIG_MD_RAID0=y
CONFIG_MD_RAID1=y
CONFIG_MD_RAID10=y
CONFIG_MD_RAID456=y
# CONFIG_MD_CLUSTER is not set
CONFIG_BCACHE=y
# CONFIG_BCACHE_DEBUG is not set
# CONFIG_BCACHE_ASYNC_REGISTRATION 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=y
CONFIG_DM_CACHE_SMQ=y
CONFIG_DM_WRITECACHE=y
# CONFIG_DM_EBS is not set
# CONFIG_DM_ERA is not set
CONFIG_DM_CLONE=y
CONFIG_DM_MIRROR=y
# CONFIG_DM_LOG_USERSPACE is not set
CONFIG_DM_RAID=y
CONFIG_DM_ZERO=y
CONFIG_DM_MULTIPATH=y
CONFIG_DM_MULTIPATH_QL=y
CONFIG_DM_MULTIPATH_ST=y
# 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=y
CONFIG_DM_FLAKEY=y
CONFIG_DM_VERITY=y
# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set
CONFIG_DM_VERITY_FEC=y
# CONFIG_DM_SWITCH is not set
# CONFIG_DM_LOG_WRITES is not set
CONFIG_DM_INTEGRITY=y
CONFIG_DM_ZONED=y
CONFIG_DM_AUDIT=y
# CONFIG_DM_VDO is not set
CONFIG_TARGET_CORE=y
# CONFIG_TCM_IBLOCK is not set
# CONFIG_TCM_FILEIO is not set
# CONFIG_TCM_PSCSI is not set
# CONFIG_LOOPBACK_TARGET is not set
# CONFIG_ISCSI_TARGET is not set
# CONFIG_SBP_TARGET is not set
# CONFIG_REMOTE_TARGET is not set
# CONFIG_FUSION is not set

#
# IEEE 1394 (FireWire) support
#
CONFIG_FIREWIRE=y
CONFIG_FIREWIRE_OHCI=y
CONFIG_FIREWIRE_SBP2=y
CONFIG_FIREWIRE_NET=y
# CONFIG_FIREWIRE_NOSY is not set
# end of IEEE 1394 (FireWire) support

# CONFIG_MACINTOSH_DRIVERS is not set
CONFIG_NETDEVICES=y
CONFIG_MII=y
CONFIG_NET_CORE=y
CONFIG_BONDING=y
CONFIG_DUMMY=y
CONFIG_WIREGUARD=y
# CONFIG_WIREGUARD_DEBUG is not set
# CONFIG_OVPN is not set
CONFIG_EQUALIZER=y
CONFIG_NET_FC=y
CONFIG_IFB=y
CONFIG_NET_TEAM=y
CONFIG_NET_TEAM_MODE_BROADCAST=y
CONFIG_NET_TEAM_MODE_ROUNDROBIN=y
CONFIG_NET_TEAM_MODE_RANDOM=y
CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=y
CONFIG_NET_TEAM_MODE_LOADBALANCE=y
CONFIG_MACVLAN=y
CONFIG_MACVTAP=y
CONFIG_IPVLAN_L3S=y
CONFIG_IPVLAN=y
CONFIG_IPVTAP=y
CONFIG_VXLAN=y
CONFIG_GENEVE=y
CONFIG_BAREUDP=y
CONFIG_GTP=y
# CONFIG_PFCP is not set
# CONFIG_AMT is not set
CONFIG_MACSEC=y
CONFIG_NETCONSOLE=y
# CONFIG_NETCONSOLE_DYNAMIC is not set
# CONFIG_NETCONSOLE_EXTENDED_LOG is not set
CONFIG_NETPOLL=y
CONFIG_NET_POLL_CONTROLLER=y
CONFIG_TUN=y
CONFIG_TAP=y
CONFIG_TUN_VNET_CROSS_LE=y
CONFIG_VETH=y
CONFIG_VIRTIO_NET=y
CONFIG_NLMON=y
# CONFIG_NETKIT is not set
CONFIG_NET_VRF=y
CONFIG_VSOCKMON=y
# CONFIG_MHI_NET is not set
# CONFIG_ARCNET is not set
CONFIG_ATM_DRIVERS=y
# CONFIG_ATM_DUMMY is not set
CONFIG_ATM_TCP=y
# CONFIG_ATM_LANAI is not set
# CONFIG_ATM_ENI is not set
# CONFIG_ATM_NICSTAR is not set
# CONFIG_ATM_IDT77252 is not set
# CONFIG_ATM_IA is not set
# CONFIG_ATM_FORE200E is not set
# CONFIG_ATM_HE is not set
# CONFIG_ATM_SOLOS is not set
CONFIG_CAIF_DRIVERS=y
CONFIG_CAIF_TTY=y
CONFIG_CAIF_VIRTIO=y

#
# Distributed Switch Architecture drivers
#
# CONFIG_B53 is not set
# CONFIG_NET_DSA_BCM_SF2 is not set
# CONFIG_NET_DSA_LOOP is not set
# CONFIG_NET_DSA_HIRSCHMANN_HELLCREEK is not set
# CONFIG_NET_DSA_LANTIQ_GSWIP is not set
# CONFIG_NET_DSA_MXL_GSW1XX is not set
# CONFIG_NET_DSA_MT7530 is not set
# CONFIG_NET_DSA_MV88E6060 is not set
# CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON is not set
# CONFIG_NET_DSA_MV88E6XXX is not set
# CONFIG_NET_DSA_MXL862 is not set
# CONFIG_NET_DSA_AR9331 is not set
# CONFIG_NET_DSA_QCA8K is not set
# CONFIG_NET_DSA_SJA1105 is not set
# CONFIG_NET_DSA_XRS700X_I2C is not set
# CONFIG_NET_DSA_XRS700X_MDIO is not set
# CONFIG_NET_DSA_REALTEK is not set
# CONFIG_NET_DSA_KS8995 is not set
# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set
# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set
# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set
# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set
# CONFIG_NET_DSA_YT921X is not set
# end of Distributed Switch Architecture drivers

CONFIG_ETHERNET=y
# 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_ALTERA_TSE is not set
CONFIG_NET_VENDOR_AMAZON=y
# CONFIG_ENA_ETHERNET is not set
# CONFIG_NET_VENDOR_AMD is not set
# CONFIG_NET_VENDOR_AQUANTIA is not set
# CONFIG_NET_VENDOR_ARC is not set
CONFIG_NET_VENDOR_ASIX=y
# CONFIG_SPI_AX88796C is not set
# CONFIG_NET_VENDOR_ATHEROS is not set
# CONFIG_CX_ECAT is not set
# CONFIG_NET_VENDOR_BROADCOM 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=y
# CONFIG_ENIC is not set
# CONFIG_NET_VENDOR_CORTINA is not set
CONFIG_NET_VENDOR_DAVICOM=y
# CONFIG_DM9051 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_ENGLEDER=y
# CONFIG_TSNEP is not set
# CONFIG_NET_VENDOR_EZCHIP is not set
# CONFIG_NET_VENDOR_FUJITSU is not set
CONFIG_NET_VENDOR_FUNGIBLE=y
# CONFIG_FUN_ETH is not set
CONFIG_NET_VENDOR_GOOGLE=y
CONFIG_GVE=y
CONFIG_NET_VENDOR_HISILICON=y
# CONFIG_HIBMCGE is not set
# CONFIG_NET_VENDOR_HUAWEI is not set
CONFIG_NET_VENDOR_I825XX=y
CONFIG_NET_VENDOR_INTEL=y
CONFIG_E100=y
CONFIG_E1000=y
CONFIG_E1000E=y
CONFIG_E1000E_HWTS=y
# CONFIG_IGB is not set
# CONFIG_IGBVF is not set
# CONFIG_IXGBE is not set
# CONFIG_IXGBEVF is not set
# CONFIG_I40E is not set
# CONFIG_I40EVF is not set
# CONFIG_ICE is not set
# CONFIG_FM10K is not set
# CONFIG_IGC is not set
# CONFIG_IDPF is not set
# CONFIG_JME is not set
# CONFIG_NET_VENDOR_ADI is not set
CONFIG_NET_VENDOR_LITEX=y
# CONFIG_LITEX_LITEETH is not set
# CONFIG_NET_VENDOR_MARVELL is not set
CONFIG_NET_VENDOR_MELLANOX=y
# CONFIG_MLX4_EN is not set
CONFIG_MLX4_CORE=y
# CONFIG_MLX4_DEBUG is not set
# CONFIG_MLX4_CORE_GEN2 is not set
# CONFIG_MLX5_CORE is not set
# CONFIG_MLXSW_CORE is not set
# CONFIG_MLXFW is not set
CONFIG_NET_VENDOR_META=y
# CONFIG_FBNIC is not set
# CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_NET_VENDOR_MICROSEMI is not set
CONFIG_NET_VENDOR_MICROSOFT=y
CONFIG_NET_VENDOR_MUCSE=y
# CONFIG_MGBE is not set
# 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_NETRONOME 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 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 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_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 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_VERTEXCOM=y
# CONFIG_MSE102X is not set
# CONFIG_NET_VENDOR_VIA is not set
CONFIG_NET_VENDOR_WANGXUN=y
# CONFIG_NGBE is not set
# CONFIG_TXGBE is not set
# CONFIG_TXGBEVF is not set
# CONFIG_NGBEVF is not set
# CONFIG_NET_VENDOR_WIZNET is not set
# CONFIG_NET_VENDOR_XILINX is not set
# CONFIG_NET_VENDOR_XIRCOM is not set
CONFIG_FDDI=y
# CONFIG_DEFXX is not set
# CONFIG_SKFP is not set
CONFIG_PHYLINK=y
CONFIG_PHYLIB=y
CONFIG_SWPHY=y
CONFIG_PHY_PACKAGE=y
# CONFIG_LED_TRIGGER_PHY is not set
CONFIG_PHYLIB_LEDS=y
CONFIG_FIXED_PHY=y
# CONFIG_SFP is not set

#
# MII PHY device drivers
#
# CONFIG_AS21XXX_PHY is not set
# CONFIG_AIR_EN8811H_PHY is not set
# CONFIG_AMD_PHY is not set
# CONFIG_ADIN_PHY is not set
# CONFIG_ADIN1100_PHY is not set
# CONFIG_AQUANTIA_PHY is not set
CONFIG_AX88796B_PHY=y
# 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_MARVELL_88Q2XXX_PHY is not set
# CONFIG_MARVELL_88X2222_PHY is not set
# CONFIG_MAXLINEAR_GPHY is not set
# CONFIG_MAXLINEAR_86110_PHY is not set
# CONFIG_MEDIATEK_GE_PHY is not set
# CONFIG_MICREL_PHY is not set
# CONFIG_MICROCHIP_T1S_PHY is not set
CONFIG_MICROCHIP_PHY=y
# CONFIG_MICROCHIP_T1_PHY is not set
# CONFIG_MICROSEMI_PHY is not set
# CONFIG_MOTORCOMM_PHY is not set
# CONFIG_NATIONAL_PHY is not set
# CONFIG_NXP_CBTX_PHY is not set
# CONFIG_NXP_C45_TJA11XX_PHY is not set
# CONFIG_NXP_TJA11XX_PHY is not set
# CONFIG_NCN26000_PHY is not set
# CONFIG_AT803X_PHY is not set
# CONFIG_QCA83XX_PHY is not set
# CONFIG_QCA808X_PHY is not set
# CONFIG_QCA807X_PHY is not set
# CONFIG_QSEMI_PHY is not set
CONFIG_REALTEK_PHY=y
# CONFIG_REALTEK_PHY_HWMON is not set
# CONFIG_RENESAS_PHY is not set
# CONFIG_ROCKCHIP_PHY is not set
CONFIG_SMSC_PHY=y
# 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_DP83TD510_PHY is not set
# CONFIG_DP83TG720_PHY is not set
# CONFIG_VITESSE_PHY is not set
# CONFIG_XILINX_GMII2RGMII is not set
# CONFIG_PSE_CONTROLLER is not set
CONFIG_CAN_DEV=y
CONFIG_CAN_VCAN=y
CONFIG_CAN_VXCAN=y
CONFIG_CAN_NETLINK=y
CONFIG_CAN_CALC_BITTIMING=y
CONFIG_CAN_RX_OFFLOAD=y
# CONFIG_CAN_CAN327 is not set
# CONFIG_CAN_DUMMY is not set
# CONFIG_CAN_FLEXCAN is not set
# CONFIG_CAN_GRCAN is not set
# CONFIG_CAN_KVASER_PCIEFD is not set
CONFIG_CAN_SLCAN=y
# CONFIG_CAN_C_CAN is not set
# CONFIG_CAN_CC770 is not set
# CONFIG_CAN_CTUCANFD_PCI is not set
# CONFIG_CAN_CTUCANFD_PLATFORM is not set
# CONFIG_CAN_ESD_402_PCI is not set
CONFIG_CAN_IFI_CANFD=y
# CONFIG_CAN_M_CAN is not set
# CONFIG_CAN_PEAK_PCIEFD is not set
# CONFIG_CAN_SJA1000 is not set
# CONFIG_CAN_SOFTING is not set

#
# CAN SPI interfaces
#
# CONFIG_CAN_HI311X is not set
# CONFIG_CAN_MCP251X is not set
# CONFIG_CAN_MCP251XFD is not set
# end of CAN SPI interfaces

#
# CAN USB interfaces
#
CONFIG_CAN_8DEV_USB=y
CONFIG_CAN_EMS_USB=y
CONFIG_CAN_ESD_USB=y
CONFIG_CAN_ETAS_ES58X=y
CONFIG_CAN_F81604=y
CONFIG_CAN_GS_USB=y
CONFIG_CAN_KVASER_USB=y
CONFIG_CAN_MCBA_USB=y
CONFIG_CAN_PEAK_USB=y
CONFIG_CAN_UCAN=y
# end of CAN USB interfaces

# CONFIG_CAN_DEBUG_DEVICES is not set

#
# MCTP Device Drivers
#
# CONFIG_MCTP_SERIAL is not set
# CONFIG_MCTP_TRANSPORT_I2C is not set
# CONFIG_MCTP_TRANSPORT_USB is not set
# end of MCTP Device Drivers

CONFIG_FWNODE_MDIO=y
CONFIG_OF_MDIO=y
CONFIG_ACPI_MDIO=y
# CONFIG_MDIO_BITBANG is not set
# CONFIG_MDIO_BCM_UNIMAC is not set
# CONFIG_MDIO_HISI_FEMAC is not set
CONFIG_MDIO_MVUSB=y
# CONFIG_MDIO_MSCC_MIIM is not set
# CONFIG_MDIO_OCTEON is not set
# CONFIG_MDIO_PIC64HPSC is not set
# CONFIG_MDIO_IPQ4019 is not set
# CONFIG_MDIO_IPQ8064 is not set
# CONFIG_MDIO_THUNDER is not set

#
# 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_PLIP is not set
CONFIG_PPP=y
CONFIG_PPP_BSDCOMP=y
CONFIG_PPP_DEFLATE=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOATM=y
CONFIG_PPPOE=y
CONFIG_PPPOE_HASH_BITS_1=y
# CONFIG_PPPOE_HASH_BITS_2 is not set
# CONFIG_PPPOE_HASH_BITS_4 is not set
# CONFIG_PPPOE_HASH_BITS_8 is not set
CONFIG_PPPOE_HASH_BITS=1
CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y
CONFIG_SLIP=y
CONFIG_SLHC=y
CONFIG_SLIP_COMPRESSED=y
CONFIG_SLIP_SMART=y
CONFIG_SLIP_MODE_SLIP6=y
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_CATC=y
CONFIG_USB_KAWETH=y
CONFIG_USB_PEGASUS=y
CONFIG_USB_RTL8150=y
CONFIG_USB_RTL8152=y
CONFIG_USB_LAN78XX=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_AX8817X=y
CONFIG_USB_NET_AX88179_178A=y
CONFIG_USB_NET_CDCETHER=y
CONFIG_USB_NET_CDC_EEM=y
CONFIG_USB_NET_CDC_NCM=y
CONFIG_USB_NET_HUAWEI_CDC_NCM=y
CONFIG_USB_NET_CDC_MBIM=y
CONFIG_USB_NET_DM9601=y
CONFIG_USB_NET_SR9700=y
CONFIG_USB_NET_SR9800=y
CONFIG_USB_NET_SMSC75XX=y
CONFIG_USB_NET_SMSC95XX=y
CONFIG_USB_NET_GL620A=y
CONFIG_USB_NET_NET1080=y
CONFIG_USB_NET_PLUSB=y
CONFIG_USB_NET_MCS7830=y
CONFIG_USB_NET_RNDIS_HOST=y
CONFIG_USB_NET_CDC_SUBSET_ENABLE=y
CONFIG_USB_NET_CDC_SUBSET=y
CONFIG_USB_ALI_M5632=y
CONFIG_USB_AN2720=y
CONFIG_USB_BELKIN=y
CONFIG_USB_ARMLINUX=y
CONFIG_USB_EPSON2888=y
CONFIG_USB_KC2190=y
CONFIG_USB_NET_ZAURUS=y
CONFIG_USB_NET_CX82310_ETH=y
CONFIG_USB_NET_KALMIA=y
CONFIG_USB_NET_QMI_WWAN=y
CONFIG_USB_HSO=y
CONFIG_USB_NET_INT51X1=y
CONFIG_USB_CDC_PHONET=y
CONFIG_USB_IPHETH=y
CONFIG_USB_SIERRA_NET=y
CONFIG_USB_VL600=y
CONFIG_USB_NET_CH9200=y
CONFIG_USB_NET_AQC111=y
CONFIG_USB_RTL8153_ECM=y
CONFIG_WLAN=y
CONFIG_WLAN_VENDOR_ADMTEK=y
# CONFIG_ADM8211 is not set
CONFIG_ATH_COMMON=y
CONFIG_WLAN_VENDOR_ATH=y
# CONFIG_ATH_DEBUG is not set
# CONFIG_ATH5K is not set
# CONFIG_ATH5K_PCI is not set
CONFIG_ATH9K_HW=y
CONFIG_ATH9K_COMMON=y
CONFIG_ATH9K_COMMON_DEBUG=y
CONFIG_ATH9K_BTCOEX_SUPPORT=y
CONFIG_ATH9K=y
CONFIG_ATH9K_PCI=y
CONFIG_ATH9K_AHB=y
CONFIG_ATH9K_DEBUGFS=y
# CONFIG_ATH9K_STATION_STATISTICS is not set
CONFIG_ATH9K_DYNACK=y
# CONFIG_ATH9K_WOW is not set
CONFIG_ATH9K_RFKILL=y
CONFIG_ATH9K_CHANNEL_CONTEXT=y
CONFIG_ATH9K_PCOEM=y
# CONFIG_ATH9K_PCI_NO_EEPROM is not set
CONFIG_ATH9K_HTC=y
CONFIG_ATH9K_HTC_DEBUGFS=y
# CONFIG_ATH9K_HWRNG is not set
CONFIG_ATH9K_COMMON_SPECTRAL=y
CONFIG_CARL9170=y
CONFIG_CARL9170_LEDS=y
# CONFIG_CARL9170_DEBUGFS is not set
CONFIG_CARL9170_WPC=y
CONFIG_CARL9170_HWRNG=y
CONFIG_ATH6KL=y
# CONFIG_ATH6KL_SDIO is not set
CONFIG_ATH6KL_USB=y
# CONFIG_ATH6KL_DEBUG is not set
# CONFIG_ATH6KL_TRACING is not set
CONFIG_AR5523=y
# CONFIG_WIL6210 is not set
CONFIG_ATH10K=y
CONFIG_ATH10K_CE=y
CONFIG_ATH10K_PCI=y
# CONFIG_ATH10K_AHB is not set
# CONFIG_ATH10K_SDIO is not set
CONFIG_ATH10K_USB=y
# CONFIG_ATH10K_DEBUG is not set
# CONFIG_ATH10K_DEBUGFS is not set
CONFIG_ATH10K_LEDS=y
# CONFIG_ATH10K_TRACING is not set
# CONFIG_WCN36XX is not set
CONFIG_ATH11K=y
# CONFIG_ATH11K_PCI is not set
# CONFIG_ATH11K_DEBUG is not set
# CONFIG_ATH11K_DEBUGFS is not set
# CONFIG_ATH11K_TRACING is not set
# CONFIG_ATH12K is not set
# CONFIG_WLAN_VENDOR_ATMEL is not set
# CONFIG_WLAN_VENDOR_BROADCOM is not set
# CONFIG_WLAN_VENDOR_INTEL is not set
# CONFIG_WLAN_VENDOR_INTERSIL is not set
# CONFIG_WLAN_VENDOR_MARVELL is not set
# CONFIG_WLAN_VENDOR_MEDIATEK is not set
# CONFIG_WLAN_VENDOR_MICROCHIP is not set
CONFIG_WLAN_VENDOR_PURELIFI=y
CONFIG_PLFXLC=y
# CONFIG_WLAN_VENDOR_RALINK is not set
# CONFIG_WLAN_VENDOR_REALTEK is not set
# CONFIG_WLAN_VENDOR_RSI is not set
CONFIG_WLAN_VENDOR_SILABS=y
# CONFIG_WFX is not set
# CONFIG_WLAN_VENDOR_ST is not set
# CONFIG_WLAN_VENDOR_TI is not set
# CONFIG_WLAN_VENDOR_ZYDAS is not set
# CONFIG_WLAN_VENDOR_QUANTENNA is not set
CONFIG_MAC80211_HWSIM=y
CONFIG_VIRT_WIFI=y
CONFIG_WAN=y
CONFIG_HDLC=y
CONFIG_HDLC_RAW=y
CONFIG_HDLC_RAW_ETH=y
CONFIG_HDLC_CISCO=y
CONFIG_HDLC_FR=y
CONFIG_HDLC_PPP=y
CONFIG_HDLC_X25=y
# CONFIG_FRAMER is not set
# CONFIG_PCI200SYN is not set
# CONFIG_WANXL is not set
# CONFIG_PC300TOO is not set
# CONFIG_FARSYNC is not set
CONFIG_LAPBETHER=y
CONFIG_IEEE802154_DRIVERS=y
# CONFIG_IEEE802154_FAKELB is not set
# CONFIG_IEEE802154_AT86RF230 is not set
# CONFIG_IEEE802154_MRF24J40 is not set
# CONFIG_IEEE802154_CC2520 is not set
CONFIG_IEEE802154_ATUSB=y
# CONFIG_IEEE802154_ADF7242 is not set
# CONFIG_IEEE802154_CA8210 is not set
# CONFIG_IEEE802154_MCR20A is not set
CONFIG_IEEE802154_HWSIM=y

#
# Wireless WAN
#
CONFIG_WWAN=y
# CONFIG_WWAN_DEBUGFS is not set
# CONFIG_WWAN_HWSIM is not set
CONFIG_MHI_WWAN_CTRL=y
# CONFIG_MHI_WWAN_MBIM is not set
# CONFIG_IOSM is not set
# CONFIG_MTK_T7XX is not set
# end of Wireless WAN

CONFIG_VMXNET3=y
# CONFIG_FUJITSU_ES is not set
CONFIG_USB4_NET=y
CONFIG_NETDEVSIM=y
CONFIG_NET_FAILOVER=y
CONFIG_ISDN=y
CONFIG_ISDN_CAPI=y
CONFIG_MISDN=y
CONFIG_MISDN_DSP=y
CONFIG_MISDN_L1OIP=y

#
# mISDN hardware drivers
#
# CONFIG_MISDN_HFCPCI is not set
# CONFIG_MISDN_HFCMULTI is not set
CONFIG_MISDN_HFCUSB=y
# CONFIG_MISDN_AVMFRITZ is not set
# CONFIG_MISDN_SPEEDFAX is not set
# CONFIG_MISDN_INFINEON is not set
# CONFIG_MISDN_W6692 is not set
# CONFIG_MISDN_NETJET is not set

#
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_LEDS=y
CONFIG_INPUT_FF_MEMLESS=y
CONFIG_INPUT_SPARSEKMAP=y
# CONFIG_INPUT_MATRIXKMAP is not set
CONFIG_INPUT_VIVALDIFMAP=y

#
# 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

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ADC is not set
# CONFIG_KEYBOARD_ADP5588 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_TCA8418 is not set
# CONFIG_KEYBOARD_MATRIX is not set
# CONFIG_KEYBOARD_LM8323 is not set
# CONFIG_KEYBOARD_LM8333 is not set
# CONFIG_KEYBOARD_MAX7359 is not set
# CONFIG_KEYBOARD_MPR121 is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_OPENCORES is not set
# CONFIG_KEYBOARD_PINEPHONE 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_TM2_TOUCHKEY is not set
# CONFIG_KEYBOARD_TWL4030 is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_CAP11XX is not set
# CONFIG_KEYBOARD_BCM is not set
# CONFIG_KEYBOARD_CYPRESS_SF is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_BYD=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y
CONFIG_MOUSE_PS2_CYPRESS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
# CONFIG_MOUSE_PS2_ELANTECH is not set
# CONFIG_MOUSE_PS2_SENTELIC is not set
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
CONFIG_MOUSE_PS2_FOCALTECH=y
# CONFIG_MOUSE_PS2_VMMOUSE is not set
CONFIG_MOUSE_PS2_SMBUS=y
# CONFIG_MOUSE_SERIAL is not set
CONFIG_MOUSE_APPLETOUCH=y
CONFIG_MOUSE_BCM5974=y
# CONFIG_MOUSE_CYAPA is not set
# CONFIG_MOUSE_ELAN_I2C is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_MOUSE_GPIO is not set
# CONFIG_MOUSE_SYNAPTICS_I2C is not set
CONFIG_MOUSE_SYNAPTICS_USB=y
CONFIG_INPUT_JOYSTICK=y
# CONFIG_JOYSTICK_ANALOG is not set
# CONFIG_JOYSTICK_A3D is not set
# CONFIG_JOYSTICK_ADC is not set
# CONFIG_JOYSTICK_ADI is not set
# CONFIG_JOYSTICK_COBRA is not set
# CONFIG_JOYSTICK_GF2K is not set
# CONFIG_JOYSTICK_GRIP is not set
# CONFIG_JOYSTICK_GRIP_MP is not set
# CONFIG_JOYSTICK_GUILLEMOT is not set
# CONFIG_JOYSTICK_INTERACT is not set
# CONFIG_JOYSTICK_SIDEWINDER is not set
# CONFIG_JOYSTICK_TMDC is not set
CONFIG_JOYSTICK_IFORCE=y
CONFIG_JOYSTICK_IFORCE_USB=y
# CONFIG_JOYSTICK_IFORCE_232 is not set
# CONFIG_JOYSTICK_WARRIOR is not set
# CONFIG_JOYSTICK_MAGELLAN is not set
# CONFIG_JOYSTICK_SPACEORB is not set
# CONFIG_JOYSTICK_SPACEBALL is not set
# CONFIG_JOYSTICK_STINGER is not set
# CONFIG_JOYSTICK_TWIDJOY is not set
# CONFIG_JOYSTICK_ZHENHUA is not set
# CONFIG_JOYSTICK_DB9 is not set
# CONFIG_JOYSTICK_GAMECON is not set
# CONFIG_JOYSTICK_TURBOGRAFX is not set
# CONFIG_JOYSTICK_AS5011 is not set
# CONFIG_JOYSTICK_JOYDUMP is not set
CONFIG_JOYSTICK_XPAD=y
CONFIG_JOYSTICK_XPAD_FF=y
CONFIG_JOYSTICK_XPAD_LEDS=y
# CONFIG_JOYSTICK_WALKERA0701 is not set
# CONFIG_JOYSTICK_PSXPAD_SPI is not set
CONFIG_JOYSTICK_PXRC=y
# CONFIG_JOYSTICK_QWIIC is not set
# CONFIG_JOYSTICK_FSIA6B is not set
# CONFIG_JOYSTICK_SENSEHAT is not set
# CONFIG_JOYSTICK_SEESAW is not set
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_USB_ACECAD=y
CONFIG_TABLET_USB_AIPTEK=y
CONFIG_TABLET_USB_HANWANG=y
CONFIG_TABLET_USB_KBTAB=y
CONFIG_TABLET_USB_PEGASUS=y
# CONFIG_TABLET_SERIAL_WACOM4 is not set
CONFIG_INPUT_TOUCHSCREEN=y
# CONFIG_TOUCHSCREEN_ADS7846 is not set
# CONFIG_TOUCHSCREEN_AD7877 is not set
# CONFIG_TOUCHSCREEN_AD7879 is not set
# CONFIG_TOUCHSCREEN_ADC is not set
# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
# CONFIG_TOUCHSCREEN_BU21013 is not set
# CONFIG_TOUCHSCREEN_BU21029 is not set
# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set
# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
# CONFIG_TOUCHSCREEN_CYTTSP5 is not set
# CONFIG_TOUCHSCREEN_DYNAPRO is not set
# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
# CONFIG_TOUCHSCREEN_EETI is not set
# CONFIG_TOUCHSCREEN_EGALAX is not set
# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
# CONFIG_TOUCHSCREEN_EXC3000 is not set
# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set
# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set
# CONFIG_TOUCHSCREEN_HIDEEP is not set
# CONFIG_TOUCHSCREEN_HIMAX_HX852X is not set
# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set
# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set
# CONFIG_TOUCHSCREEN_HYNITRON_CST816X is not set
# CONFIG_TOUCHSCREEN_ILI210X is not set
# CONFIG_TOUCHSCREEN_ILITEK is not set
# CONFIG_TOUCHSCREEN_S6SY761 is not set
# CONFIG_TOUCHSCREEN_GUNZE is not set
# CONFIG_TOUCHSCREEN_EKTF2127 is not set
# CONFIG_TOUCHSCREEN_ELAN is not set
# CONFIG_TOUCHSCREEN_ELO is not set
# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
# CONFIG_TOUCHSCREEN_MAX11801 is not set
# CONFIG_TOUCHSCREEN_MMS114 is not set
# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
# CONFIG_TOUCHSCREEN_MSG2638 is not set
# CONFIG_TOUCHSCREEN_MTOUCH is not set
# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set
# CONFIG_TOUCHSCREEN_IMAGIS is not set
# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
# CONFIG_TOUCHSCREEN_INEXIO is not set
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_PIXCIR is not set
# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
CONFIG_TOUCHSCREEN_USB_COMPOSITE=y
CONFIG_TOUCHSCREEN_USB_EGALAX=y
CONFIG_TOUCHSCREEN_USB_PANJIT=y
CONFIG_TOUCHSCREEN_USB_3M=y
CONFIG_TOUCHSCREEN_USB_ITM=y
CONFIG_TOUCHSCREEN_USB_ETURBO=y
CONFIG_TOUCHSCREEN_USB_GUNZE=y
CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y
CONFIG_TOUCHSCREEN_USB_IRTOUCH=y
CONFIG_TOUCHSCREEN_USB_IDEALTEK=y
CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y
CONFIG_TOUCHSCREEN_USB_GOTOP=y
CONFIG_TOUCHSCREEN_USB_JASTEC=y
CONFIG_TOUCHSCREEN_USB_ELO=y
CONFIG_TOUCHSCREEN_USB_E2I=y
CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y
CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y
CONFIG_TOUCHSCREEN_USB_NEXIO=y
CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
# CONFIG_TOUCHSCREEN_TSC2004 is not set
# CONFIG_TOUCHSCREEN_TSC2005 is not set
# CONFIG_TOUCHSCREEN_TSC2007 is not set
# CONFIG_TOUCHSCREEN_RM_TS is not set
# CONFIG_TOUCHSCREEN_SILEAD is not set
# CONFIG_TOUCHSCREEN_SIS_I2C is not set
# CONFIG_TOUCHSCREEN_ST1232 is not set
# CONFIG_TOUCHSCREEN_STMFTS is not set
CONFIG_TOUCHSCREEN_SUR40=y
# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
# CONFIG_TOUCHSCREEN_SX8654 is not set
# CONFIG_TOUCHSCREEN_TPS6507X is not set
# CONFIG_TOUCHSCREEN_ZET6223 is not set
# CONFIG_TOUCHSCREEN_ZFORCE is not set
# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set
# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
# CONFIG_TOUCHSCREEN_IQS5XX is not set
# CONFIG_TOUCHSCREEN_IQS7211 is not set
# CONFIG_TOUCHSCREEN_ZINITIX is not set
# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set
CONFIG_INPUT_MISC=y
# CONFIG_INPUT_AD714X is not set
# CONFIG_INPUT_ATMEL_CAPTOUCH is not set
# CONFIG_INPUT_AW86927 is not set
# CONFIG_INPUT_BMA150 is not set
# CONFIG_INPUT_E3X0_BUTTON is not set
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INPUT_MMA8450 is not set
# CONFIG_INPUT_APANEL 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_ATLAS_BTNS is not set
CONFIG_INPUT_ATI_REMOTE2=y
CONFIG_INPUT_KEYSPAN_REMOTE=y
# CONFIG_INPUT_KXTJ9 is not set
CONFIG_INPUT_POWERMATE=y
CONFIG_INPUT_YEALINK=y
CONFIG_INPUT_CM109=y
# CONFIG_INPUT_REGULATOR_HAPTIC is not set
# CONFIG_INPUT_RETU_PWRBUTTON is not set
# CONFIG_INPUT_TWL4030_PWRBUTTON is not set
# CONFIG_INPUT_TWL4030_VIBRA is not set
CONFIG_INPUT_UINPUT=y
# CONFIG_INPUT_PCF8574 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_IBM_PANEL is not set
CONFIG_INPUT_IMS_PCU=y
# CONFIG_INPUT_IQS269A is not set
# CONFIG_INPUT_IQS626A is not set
# CONFIG_INPUT_IQS7222 is not set
# CONFIG_INPUT_CMA3000 is not set
# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set
# CONFIG_INPUT_DRV260X_HAPTICS is not set
# CONFIG_INPUT_DRV2665_HAPTICS is not set
# CONFIG_INPUT_DRV2667_HAPTICS is not set
CONFIG_RMI4_CORE=y
# CONFIG_RMI4_I2C is not set
# CONFIG_RMI4_SPI is not set
# CONFIG_RMI4_SMB is not set
CONFIG_RMI4_F03=y
CONFIG_RMI4_F03_SERIO=y
CONFIG_RMI4_2D_SENSOR=y
CONFIG_RMI4_F11=y
CONFIG_RMI4_F12=y
# CONFIG_RMI4_F1A is not set
# CONFIG_RMI4_F21 is not set
CONFIG_RMI4_F30=y
# CONFIG_RMI4_F34 is not set
CONFIG_RMI4_F3A=y
# CONFIG_RMI4_F54 is not set
# CONFIG_RMI4_F55 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_PARKBD is not set
# 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=y
# 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_VT_HW_CONSOLE_BINDING=y
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
CONFIG_LEGACY_TIOCSTI=y
CONFIG_LDISC_AUTOLOAD=y

#
# Serial drivers
#
CONFIG_SERIAL_EARLYCON=y
CONFIG_SERIAL_8250=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_PCILIB=y
CONFIG_SERIAL_8250_PCI=y
# CONFIG_SERIAL_8250_EXAR is not set
# CONFIG_SERIAL_8250_CS is not set
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_RSA=y
CONFIG_SERIAL_8250_MANY_PORTS=y
# CONFIG_SERIAL_8250_PCI1XXXX is not set
# CONFIG_SERIAL_8250_DW is not set
# CONFIG_SERIAL_8250_RT288X is not set
CONFIG_SERIAL_8250_LPSS=y
CONFIG_SERIAL_8250_MID=y
CONFIG_SERIAL_8250_PERICOM=y
# CONFIG_SERIAL_8250_NI is not set
# CONFIG_SERIAL_OF_PLATFORM is not set
CONFIG_SERIAL_8250_DWLIB=y

#
# Non-8250 serial port support
#
# CONFIG_SERIAL_MAX3100 is not set
# CONFIG_SERIAL_MAX310X is not set
# CONFIG_SERIAL_UARTLITE is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set
# CONFIG_SERIAL_SIFIVE is not set
# CONFIG_SERIAL_LANTIQ is not set
# CONFIG_SERIAL_SCCNXP is not set
# CONFIG_SERIAL_SC16IS7XX 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=y
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
CONFIG_N_HDLC=y
# CONFIG_IPWIRELESS is not set
CONFIG_N_GSM=y
CONFIG_NOZOMI=y
CONFIG_NULL_TTY=y
CONFIG_HVC_DRIVER=y
CONFIG_SERIAL_DEV_BUS=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
CONFIG_TTY_PRINTK=y
CONFIG_TTY_PRINTK_LEVEL=6
# CONFIG_PRINTER is not set
# CONFIG_PPDEV is not set
CONFIG_VIRTIO_CONSOLE=y
# CONFIG_IPMI_HANDLER is not set
# CONFIG_SSIF_IPMI_BMC is not set
# CONFIG_IPMB_DEVICE_INTERFACE is not set
CONFIG_HW_RANDOM=y
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
# CONFIG_HW_RANDOM_INTEL is not set
# CONFIG_HW_RANDOM_AMD is not set
# CONFIG_HW_RANDOM_BA431 is not set
# CONFIG_HW_RANDOM_VIA is not set
CONFIG_HW_RANDOM_VIRTIO=y
# CONFIG_HW_RANDOM_CCTRNG is not set
# CONFIG_HW_RANDOM_XIPHERA is not set
# CONFIG_APPLICOM is not set
# CONFIG_DEVMEM is not set
CONFIG_NVRAM=y
# CONFIG_DEVPORT is not set
CONFIG_HPET=y
CONFIG_HPET_MMAP=y
CONFIG_HPET_MMAP_DEFAULT=y
# CONFIG_HANGCHECK_TIMER is not set
CONFIG_TCG_TPM=y
# CONFIG_TCG_TPM2_HMAC is not set
# CONFIG_HW_RANDOM_TPM is not set
CONFIG_TCG_TIS_CORE=y
CONFIG_TCG_TIS=y
# CONFIG_TCG_TIS_SPI is not set
# CONFIG_TCG_TIS_I2C is not set
# CONFIG_TCG_TIS_I2C_CR50 is not set
# CONFIG_TCG_TIS_I2C_ATMEL is not set
# CONFIG_TCG_TIS_I2C_INFINEON is not set
# CONFIG_TCG_TIS_I2C_NUVOTON is not set
# CONFIG_TCG_NSC is not set
# CONFIG_TCG_ATMEL is not set
# CONFIG_TCG_INFINEON is not set
CONFIG_TCG_CRB=y
# CONFIG_TCG_VTPM_PROXY is not set
# CONFIG_TCG_TIS_ST33ZP24_I2C is not set
# CONFIG_TCG_TIS_ST33ZP24_SPI is not set
# CONFIG_TELCLOCK is not set
CONFIG_XILLYBUS_CLASS=y
# CONFIG_XILLYBUS is not set
CONFIG_XILLYUSB=y
# end of Character devices

#
# I2C support
#
CONFIG_I2C=y
CONFIG_ACPI_I2C_OPREGION=y
CONFIG_I2C_BOARDINFO=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_REG=y
# CONFIG_I2C_MUX_MLXCPLD is not set
# end of Multiplexer I2C Chip support

CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_SMBUS=y
CONFIG_I2C_ALGOBIT=y

#
# 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=y
# CONFIG_I2C_ISCH is not set
# CONFIG_I2C_ISMT is not set
# CONFIG_I2C_PIIX4 is not set
# CONFIG_I2C_CHT_WC 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
# CONFIG_I2C_ZHAOXIN is not set

#
# ACPI drivers
#
# CONFIG_I2C_SCMI is not set

#
# I2C system bus drivers (mostly embedded / system-on-chip)
#
# CONFIG_I2C_CBUS_GPIO is not set
CONFIG_I2C_DESIGNWARE_CORE=y
CONFIG_I2C_DESIGNWARE_PLATFORM=y
# CONFIG_I2C_DESIGNWARE_BAYTRAIL is not set
# CONFIG_I2C_DESIGNWARE_PCI is not set
# CONFIG_I2C_EMEV2 is not set
# CONFIG_I2C_GPIO is not set
# CONFIG_I2C_OCORES is not set
# CONFIG_I2C_PCA_PLATFORM is not set
# CONFIG_I2C_RK3X is not set
# CONFIG_I2C_SIMTEC is not set
# CONFIG_I2C_XILINX is not set

#
# External I2C/SMBus adapter drivers
#
CONFIG_I2C_DIOLAN_U2C=y
CONFIG_I2C_DLN2=y
CONFIG_I2C_LJCA=y
CONFIG_I2C_CP2615=y
# CONFIG_I2C_PARPORT is not set
# CONFIG_I2C_PCI1XXXX is not set
CONFIG_I2C_ROBOTFUZZ_OSIF=y
# CONFIG_I2C_TAOS_EVM is not set
CONFIG_I2C_TINY_USB=y
CONFIG_I2C_VIPERBOARD=y

#
# Other I2C/SMBus bus drivers
#
# CONFIG_I2C_MLXCPLD is not set
# CONFIG_I2C_VIRTIO is not set
# end of I2C Hardware Bus support

# CONFIG_I2C_STUB is not set
CONFIG_I2C_SLAVE=y
CONFIG_I2C_SLAVE_EEPROM=y
# CONFIG_I2C_SLAVE_TESTUNIT 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_I3C_OR_I2C=y
CONFIG_SPI=y
# CONFIG_SPI_DEBUG is not set
CONFIG_SPI_MASTER=y
# CONFIG_SPI_MEM is not set

#
# SPI Master Controller Drivers
#
# CONFIG_SPI_ALTERA is not set
# CONFIG_SPI_AXI_SPI_ENGINE is not set
# CONFIG_SPI_BITBANG is not set
# CONFIG_SPI_BUTTERFLY is not set
# CONFIG_SPI_CADENCE is not set
# CONFIG_SPI_CADENCE_QUADSPI is not set
# CONFIG_SPI_CH341 is not set
# CONFIG_SPI_DESIGNWARE is not set
CONFIG_SPI_DLN2=y
# CONFIG_SPI_GPIO is not set
# CONFIG_SPI_LM70_LLP is not set
# CONFIG_SPI_FSL_SPI is not set
CONFIG_SPI_LJCA=y
# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set
# CONFIG_SPI_MICROCHIP_CORE_SPI is not set
# CONFIG_SPI_LANTIQ_SSC is not set
# CONFIG_SPI_OC_TINY is not set
# CONFIG_SPI_PCI1XXXX is not set
# CONFIG_SPI_PXA2XX is not set
# CONFIG_SPI_SC18IS602 is not set
# CONFIG_SPI_SIFIVE is not set
# CONFIG_SPI_MXIC is not set
# CONFIG_SPI_VIRTIO is not set
# CONFIG_SPI_XCOMM is not set
# CONFIG_SPI_XILINX is not set

#
# SPI Multiplexer support
#
# CONFIG_SPI_MUX is not set

#
# SPI Protocol Masters
#
# CONFIG_SPI_SPIDEV is not set
# CONFIG_SPI_LOOPBACK_TEST is not set
# CONFIG_SPI_TLE62X0 is not set
# CONFIG_SPI_SLAVE is not set
CONFIG_SPI_DYNAMIC=y
# 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_PARPORT is not set
# CONFIG_PPS_CLIENT_GPIO is not set
# CONFIG_PPS_GENERATOR is not set

#
# PTP clock support
#
CONFIG_PTP_1588_CLOCK=y
CONFIG_PTP_1588_CLOCK_OPTIONAL=y

#
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
#
CONFIG_PTP_1588_CLOCK_KVM=y
CONFIG_PTP_1588_CLOCK_VMCLOCK=y
# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set
# CONFIG_PTP_1588_CLOCK_IDTCM is not set
# CONFIG_PTP_1588_CLOCK_FC3W is not set
# CONFIG_PTP_1588_CLOCK_MOCK is not set
# CONFIG_PTP_1588_CLOCK_VMW is not set
# CONFIG_PTP_1588_CLOCK_OCP is not set
# CONFIG_PTP_NETC_V4_TIMER is not set
# end of PTP clock support

#
# DPLL device support
#
# CONFIG_ZL3073X_I2C is not set
# CONFIG_ZL3073X_SPI is not set
# end of DPLL device support

# CONFIG_PINCTRL is not set
CONFIG_GPIOLIB_LEGACY=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 is not set

#
# 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_BY_PINCTRL is not set
# CONFIG_GPIO_CADENCE is not set
# CONFIG_GPIO_DWAPB is not set
# CONFIG_GPIO_FTGPIO010 is not set
# CONFIG_GPIO_GENERIC_PLATFORM is not set
# CONFIG_GPIO_GRANITERAPIDS is not set
# CONFIG_GPIO_GRGPIO is not set
# CONFIG_GPIO_HLWD is not set
# CONFIG_GPIO_ICH is not set
# CONFIG_GPIO_LOGICVC is not set
# CONFIG_GPIO_MB86S7X is not set
# CONFIG_GPIO_POLARFIRE_SOC is not set
# CONFIG_GPIO_SIFIVE is not set
# CONFIG_GPIO_SYSCON is not set
# CONFIG_GPIO_XILINX is not set
# CONFIG_GPIO_AMD_FCH is not set
# end of Memory mapped GPIO drivers

#
# Port-mapped I/O GPIO drivers
#
# CONFIG_GPIO_VX855 is not set
# CONFIG_GPIO_F7188X is not set
# CONFIG_GPIO_IT87 is not set
# CONFIG_GPIO_NOVALAKE is not set
# CONFIG_GPIO_SCH311X is not set
# CONFIG_GPIO_WINBOND is not set
# CONFIG_GPIO_WS16C48 is not set
# end of Port-mapped I/O GPIO drivers

#
# I2C GPIO expanders
#
# CONFIG_GPIO_ADNP is not set
# CONFIG_GPIO_FXL6408 is not set
# CONFIG_GPIO_DS4520 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
#
CONFIG_GPIO_DLN2=y
CONFIG_GPIO_LJCA=y
# CONFIG_GPIO_TWL4030 is not set
# CONFIG_GPIO_WHISKEY_COVE is not set
# end of MFD GPIO expanders

#
# PCI GPIO expanders
#
# CONFIG_GPIO_AMD8111 is not set
# CONFIG_GPIO_BT8XX is not set
# CONFIG_GPIO_ML_IOH 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
# CONFIG_GPIO_SODAVILLE is not set
# end of PCI GPIO expanders

#
# SPI GPIO expanders
#
# CONFIG_GPIO_74X164 is not set
# CONFIG_GPIO_MAX3191X is not set
# CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MC33880 is not set
# CONFIG_GPIO_PISOSR is not set
# CONFIG_GPIO_XRA1403 is not set
# end of SPI GPIO expanders

#
# USB GPIO expanders
#
CONFIG_GPIO_VIPERBOARD=y
# CONFIG_GPIO_MPSSE is not set
# end of USB GPIO expanders

#
# Virtual GPIO drivers
#
# CONFIG_GPIO_AGGREGATOR is not set
# CONFIG_GPIO_LATCH is not set
# CONFIG_GPIO_LINE_MUX is not set
# CONFIG_GPIO_MOCKUP is not set
# CONFIG_GPIO_VIRTIO is not set
# CONFIG_GPIO_SIM is not set
# end of Virtual GPIO drivers

#
# GPIO Debugging utilities
#
# CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER is not set
# CONFIG_GPIO_VIRTUSER is not set
# end of GPIO Debugging utilities

# CONFIG_W1 is not set
# CONFIG_POWER_RESET is not set
# CONFIG_POWER_SEQUENCING is not set
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
CONFIG_POWER_SUPPLY_HWMON=y
# CONFIG_GENERIC_ADC_BATTERY is not set
# CONFIG_IP5XXX_POWER is not set
# CONFIG_TEST_POWER is not set
# CONFIG_CHARGER_ADP5061 is not set
# CONFIG_BATTERY_CHAGALL 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_SAMSUNG_SDI is not set
# CONFIG_BATTERY_S2MU005 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_BATTERY_MAX1720X is not set
CONFIG_CHARGER_ISP1704=y
# CONFIG_CHARGER_MAX8903 is not set
# CONFIG_CHARGER_TWL4030 is not set
# CONFIG_CHARGER_TWL6030 is not set
# CONFIG_CHARGER_LP8727 is not set
# CONFIG_CHARGER_GPIO is not set
# CONFIG_CHARGER_MANAGER is not set
# CONFIG_CHARGER_LT3651 is not set
# CONFIG_CHARGER_LTC4162L is not set
# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
# CONFIG_CHARGER_MAX77976 is not set
# CONFIG_CHARGER_MAX8971 is not set
# CONFIG_CHARGER_MT6360 is not set
# CONFIG_CHARGER_MT6370 is not set
# CONFIG_CHARGER_BQ2415X is not set
CONFIG_CHARGER_BQ24190=y
# 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_BQ256XX is not set
# CONFIG_CHARGER_SMB347 is not set
# CONFIG_BATTERY_GAUGE_LTC2941 is not set
# CONFIG_BATTERY_GOLDFISH is not set
# CONFIG_BATTERY_RT5033 is not set
# CONFIG_CHARGER_RT9455 is not set
# CONFIG_CHARGER_RT9467 is not set
# CONFIG_CHARGER_RT9471 is not set
# CONFIG_CHARGER_RT9756 is not set
# CONFIG_FUEL_GAUGE_STC3117 is not set
# CONFIG_CHARGER_UCS1002 is not set
# CONFIG_CHARGER_BD99954 is not set
# CONFIG_BATTERY_SURFACE is not set
# CONFIG_CHARGER_SURFACE is not set
# CONFIG_BATTERY_UG3105 is not set
# CONFIG_FUEL_GAUGE_MM8013 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_AD7314 is not set
# CONFIG_SENSORS_AD7414 is not set
# CONFIG_SENSORS_AD7418 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_ADT7310 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_AHT10 is not set
CONFIG_SENSORS_AQUACOMPUTER_D5NEXT=y
# CONFIG_SENSORS_AS370 is not set
# CONFIG_SENSORS_ASC7621 is not set
# CONFIG_SENSORS_ASUS_ROG_RYUJIN 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_APPLESMC is not set
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ATXP1 is not set
# CONFIG_SENSORS_CHIPCAP2 is not set
CONFIG_SENSORS_CORSAIR_CPRO=y
CONFIG_SENSORS_CORSAIR_PSU=y
# 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_FTSTEUTATES is not set
CONFIG_SENSORS_GIGABYTE_WATERFORCE=y
# CONFIG_SENSORS_GL518SM is not set
# CONFIG_SENSORS_GL520SM is not set
# CONFIG_SENSORS_GPD 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_HS3001 is not set
# CONFIG_SENSORS_HTU31 is not set
# CONFIG_SENSORS_IIO_HWMON is not set
# CONFIG_SENSORS_I5500 is not set
# CONFIG_SENSORS_CORETEMP is not set
# CONFIG_SENSORS_ISL28022 is not set
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_JC42 is not set
CONFIG_SENSORS_POWERZ=y
# CONFIG_SENSORS_POWR1220 is not set
# CONFIG_SENSORS_LATTEPANDA_SIGMA_EC is not set
# CONFIG_SENSORS_LENOVO_EC is not set
# CONFIG_SENSORS_LINEAGE is not set
# CONFIG_SENSORS_LTC2945 is not set
# CONFIG_SENSORS_LTC2947_I2C is not set
# CONFIG_SENSORS_LTC2947_SPI is not set
# CONFIG_SENSORS_LTC2990 is not set
# CONFIG_SENSORS_LTC2991 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_LTC4282 is not set
# CONFIG_SENSORS_MAX1111 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_MAX31722 is not set
# CONFIG_SENSORS_MAX31730 is not set
# CONFIG_SENSORS_MAX31760 is not set
# CONFIG_MAX31827 is not set
# CONFIG_SENSORS_MAX6620 is not set
# CONFIG_SENSORS_MAX6621 is not set
# CONFIG_SENSORS_MAX6639 is not set
# CONFIG_SENSORS_MAX6650 is not set
# CONFIG_SENSORS_MAX6697 is not set
# CONFIG_SENSORS_MAX31790 is not set
# CONFIG_SENSORS_MC34VR500 is not set
# CONFIG_SENSORS_MCP3021 is not set
# CONFIG_SENSORS_MCP9982 is not set
# CONFIG_SENSORS_TC654 is not set
# CONFIG_SENSORS_TPS23861 is not set
# CONFIG_SENSORS_MR75203 is not set
# CONFIG_SENSORS_ADCXX is not set
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM70 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_NCT6775_I2C is not set
# CONFIG_SENSORS_NCT7363 is not set
# CONFIG_SENSORS_NCT7802 is not set
# CONFIG_SENSORS_NCT7904 is not set
# CONFIG_SENSORS_NPCM7XX is not set
CONFIG_SENSORS_NZXT_KRAKEN2=y
# CONFIG_SENSORS_NZXT_KRAKEN3 is not set
CONFIG_SENSORS_NZXT_SMART2=y
# CONFIG_SENSORS_OCC_P8_I2C is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_PMBUS is not set
# CONFIG_SENSORS_PT5161L is not set
# 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_SHT4x 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_EMC2305 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_SCH5627 is not set
# CONFIG_SENSORS_SCH5636 is not set
# CONFIG_SENSORS_STTS751 is not set
# CONFIG_SENSORS_SURFACE_FAN is not set
# CONFIG_SENSORS_SURFACE_TEMP is not set
# CONFIG_SENSORS_ADC128D818 is not set
# CONFIG_SENSORS_ADS7828 is not set
# CONFIG_SENSORS_ADS7871 is not set
# CONFIG_SENSORS_AMC6821 is not set
# CONFIG_SENSORS_INA209 is not set
# CONFIG_SENSORS_INA2XX is not set
# CONFIG_SENSORS_INA238 is not set
# CONFIG_SENSORS_INA3221 is not set
# CONFIG_SENSORS_SPD5118 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_TMP464 is not set
# CONFIG_SENSORS_TMP513 is not set
# CONFIG_SENSORS_TSC1641 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
# CONFIG_SENSORS_YOGAFAN is not set

#
# ACPI drivers
#
# CONFIG_SENSORS_ACPI_POWER is not set
# CONFIG_SENSORS_ATK0110 is not set
# CONFIG_SENSORS_ASUS_WMI is not set
# CONFIG_SENSORS_ASUS_EC is not set
# CONFIG_SENSORS_HP_WMI is not set
CONFIG_THERMAL=y
CONFIG_THERMAL_NETLINK=y
# CONFIG_THERMAL_STATISTICS is not set
# CONFIG_THERMAL_DEBUGFS is not set
# CONFIG_THERMAL_CORE_TESTING is not set
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
CONFIG_THERMAL_HWMON=y
# CONFIG_THERMAL_OF 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_PCIE_THERMAL is not set
# CONFIG_THERMAL_EMULATION is not set
# CONFIG_THERMAL_MMIO is not set

#
# Intel thermal drivers
#
# CONFIG_INTEL_POWERCLAMP is not set
CONFIG_X86_THERMAL_VECTOR=y
# CONFIG_X86_PKG_TEMP_THERMAL 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_BXT_PMIC_THERMAL is not set
# CONFIG_INTEL_PCH_THERMAL is not set
# CONFIG_INTEL_TCC_COOLING is not set
# CONFIG_INTEL_HFI_THERMAL is not set
# end of Intel thermal drivers

# CONFIG_GENERIC_ADC_THERMAL is not set
CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_CORE is not set
# CONFIG_WATCHDOG_NOWAYOUT is not set
CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y
CONFIG_WATCHDOG_OPEN_TIMEOUT=0
# CONFIG_WATCHDOG_SYSFS is not set
# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set

#
# Watchdog Pretimeout Governors
#

#
# Watchdog Device Drivers
#
# CONFIG_SOFT_WATCHDOG is not set
# CONFIG_GPIO_WATCHDOG is not set
# CONFIG_LENOVO_SE10_WDT is not set
# CONFIG_LENOVO_SE30_WDT is not set
# CONFIG_WDAT_WDT is not set
# CONFIG_XILINX_WATCHDOG is not set
# CONFIG_ZIIRAVE_WATCHDOG is not set
# CONFIG_CADENCE_WATCHDOG is not set
# CONFIG_DW_WATCHDOG is not set
# CONFIG_TWL4030_WATCHDOG is not set
# CONFIG_MAX63XX_WATCHDOG is not set
# CONFIG_RETU_WATCHDOG is not set
# CONFIG_ACQUIRE_WDT is not set
# CONFIG_ADVANTECH_WDT is not set
# CONFIG_ADVANTECH_EC_WDT is not set
# CONFIG_ALIM1535_WDT is not set
# CONFIG_ALIM7101_WDT is not set
# CONFIG_EBC_C384_WDT is not set
# CONFIG_EXAR_WDT is not set
# CONFIG_F71808E_WDT is not set
# CONFIG_SP5100_TCO is not set
# CONFIG_SBC_FITPC2_WATCHDOG is not set
# CONFIG_EUROTECH_WDT is not set
# CONFIG_IB700_WDT is not set
# CONFIG_IBMASR is not set
# CONFIG_WAFER_WDT is not set
# CONFIG_I6300ESB_WDT is not set
# CONFIG_IE6XX_WDT is not set
# CONFIG_INTEL_OC_WATCHDOG is not set
# CONFIG_ITCO_WDT is not set
# CONFIG_IT8712F_WDT is not set
# CONFIG_IT87_WDT is not set
# CONFIG_HP_WATCHDOG is not set
# CONFIG_SC1200_WDT is not set
# CONFIG_PC87413_WDT is not set
# CONFIG_NV_TCO is not set
# CONFIG_60XX_WDT is not set
# CONFIG_SMSC_SCH311X_WDT is not set
# CONFIG_SMSC37B787_WDT is not set
# CONFIG_TQMX86_WDT is not set
# CONFIG_VIA_WDT is not set
# CONFIG_W83627HF_WDT is not set
# CONFIG_W83877F_WDT is not set
# CONFIG_W83977F_WDT is not set
# CONFIG_MACHZ_WDT is not set
# CONFIG_SBC_EPX_C3_WATCHDOG is not set
# CONFIG_INTEL_MEI_WDT is not set
# CONFIG_NI903X_WDT is not set
# CONFIG_NIC7018_WDT is not set
# CONFIG_MEN_A21_WDT is not set

#
# PCI-based Watchdog Cards
#
# CONFIG_PCIPCWATCHDOG is not set
# CONFIG_WDTPCI is not set

#
# USB-based Watchdog Cards
#
CONFIG_USBPCWATCHDOG=y
CONFIG_SSB_POSSIBLE=y
CONFIG_SSB=y
CONFIG_SSB_PCIHOST_POSSIBLE=y
# CONFIG_SSB_PCIHOST is not set
CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
# CONFIG_SSB_PCMCIAHOST is not set
CONFIG_SSB_SDIOHOST_POSSIBLE=y
# CONFIG_SSB_SDIOHOST is not set
# CONFIG_SSB_DRIVER_GPIO is not set
CONFIG_BCMA_POSSIBLE=y
CONFIG_BCMA=y
CONFIG_BCMA_HOST_PCI_POSSIBLE=y
# CONFIG_BCMA_HOST_PCI is not set
# CONFIG_BCMA_HOST_SOC is not set
# CONFIG_BCMA_DRIVER_PCI is not set
# CONFIG_BCMA_DRIVER_GMAC_CMN is not set
# CONFIG_BCMA_DRIVER_GPIO is not set
# CONFIG_BCMA_DEBUG is not set

#
# Multifunction device drivers
#
CONFIG_MFD_CORE=y
# CONFIG_MFD_ADP5585 is not set
# CONFIG_MFD_ACT8945A is not set
# CONFIG_MFD_AS3711 is not set
# CONFIG_MFD_SMPRO 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_CGBC is not set
# CONFIG_MFD_CS40L50_I2C is not set
# CONFIG_MFD_CS40L50_SPI is not set
# CONFIG_MFD_CS42L43_I2C is not set
# CONFIG_MFD_CS42L43_SDW is not set
# CONFIG_MFD_LOCHNAGAR is not set
# CONFIG_MFD_MADERA is not set
# CONFIG_PMIC_DA903X is not set
# CONFIG_MFD_DA9052_SPI 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=y
# CONFIG_MFD_GATEWORKS_GSC is not set
# CONFIG_MFD_MC13XXX_SPI is not set
# CONFIG_MFD_MC13XXX_I2C is not set
# CONFIG_MFD_MP2629 is not set
# CONFIG_MFD_PF1550 is not set
# CONFIG_MFD_HI6421_PMIC is not set
# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set
CONFIG_LPC_ICH=y
# CONFIG_LPC_SCH is not set
# CONFIG_INTEL_SOC_PMIC is not set
CONFIG_INTEL_SOC_PMIC_BXTWC=y
CONFIG_INTEL_SOC_PMIC_CHTWC=y
# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set
# CONFIG_MFD_INTEL_LPSS_ACPI is not set
# CONFIG_MFD_INTEL_LPSS_PCI is not set
CONFIG_MFD_INTEL_PMC_BXT=y
# 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_88PM886_PMIC is not set
# CONFIG_MFD_MAX5970 is not set
# CONFIG_MFD_MAX14577 is not set
# CONFIG_MFD_MAX77541 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_MAX77705 is not set
# CONFIG_MFD_MAX77714 is not set
# CONFIG_MFD_MAX77759 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=y
CONFIG_MFD_MT6370=y
# CONFIG_MFD_MT6397 is not set
# CONFIG_MFD_MENF21BMC is not set
# CONFIG_MFD_NCT6694 is not set
# CONFIG_MFD_OCELOT is not set
# CONFIG_EZX_PCAP is not set
# CONFIG_MFD_CPCAP is not set
CONFIG_MFD_VIPERBOARD=y
# CONFIG_MFD_NTXEC is not set
CONFIG_MFD_RETU=y
# CONFIG_MFD_SY7636A is not set
# CONFIG_MFD_RDC321X is not set
# CONFIG_MFD_RT4831 is not set
# CONFIG_MFD_RT5033 is not set
# CONFIG_MFD_RT5120 is not set
# CONFIG_MFD_RC5T583 is not set
# CONFIG_MFD_RK8XX_I2C is not set
# CONFIG_MFD_RK8XX_SPI is not set
# CONFIG_MFD_RN5T618 is not set
# CONFIG_MFD_SEC_I2C is not set
# CONFIG_MFD_SI476X_CORE is not set
# CONFIG_MFD_SM501 is not set
# CONFIG_MFD_SKY81452 is not set
# CONFIG_MFD_STMPE is not set
CONFIG_MFD_SYSCON=y
# CONFIG_MFD_LP3943 is not set
# CONFIG_MFD_LP8788 is not set
# CONFIG_MFD_TI_LMU is not set
# CONFIG_MFD_BQ257XX 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_TPS65219 is not set
# CONFIG_MFD_TPS6586X is not set
# CONFIG_MFD_TPS65910 is not set
# CONFIG_MFD_TPS65912_I2C is not set
# CONFIG_MFD_TPS65912_SPI is not set
# CONFIG_MFD_TPS6594_I2C is not set
# CONFIG_MFD_TPS6594_SPI is not set
CONFIG_TWL4030_CORE=y
# CONFIG_MFD_TWL4030_AUDIO is not set
# CONFIG_TWL6040_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_ARIZONA_I2C is not set
# CONFIG_MFD_ARIZONA_SPI is not set
# CONFIG_MFD_WM8400 is not set
# CONFIG_MFD_WM831X_I2C is not set
# CONFIG_MFD_WM831X_SPI 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_BD71828 is not set
# CONFIG_MFD_ROHM_BD957XMUF is not set
# CONFIG_MFD_ROHM_BD96801 is not set
# CONFIG_MFD_STPMIC1 is not set
# CONFIG_MFD_STMFX is not set
# CONFIG_MFD_ATC260X_I2C is not set
# CONFIG_MFD_QCOM_PM8008 is not set
# CONFIG_RAVE_SP_CORE is not set
# CONFIG_MFD_INTEL_M10_BMC_SPI is not set
# CONFIG_MFD_QNAP_MCU is not set
# CONFIG_MFD_RSMU_I2C is not set
# CONFIG_MFD_RSMU_SPI is not set
# CONFIG_MFD_UPBOARD_FPGA is not set
# CONFIG_MFD_MAX7360 is not set
# end of Multifunction device drivers

CONFIG_REGULATOR=y
# CONFIG_REGULATOR_DEBUG is not set
CONFIG_REGULATOR_FIXED_VOLTAGE=y
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
# CONFIG_REGULATOR_NETLINK_EVENTS is not set
# CONFIG_REGULATOR_88PG86X is not set
# CONFIG_REGULATOR_ACT8865 is not set
# CONFIG_REGULATOR_AD5398 is not set
# CONFIG_REGULATOR_ADP5055 is not set
# CONFIG_REGULATOR_AW37503 is not set
# CONFIG_REGULATOR_DA9121 is not set
# CONFIG_REGULATOR_DA9210 is not set
# CONFIG_REGULATOR_DA9211 is not set
# CONFIG_REGULATOR_FAN53555 is not set
# CONFIG_REGULATOR_FAN53880 is not set
# CONFIG_REGULATOR_GPIO is not set
# CONFIG_REGULATOR_ISL9305 is not set
# CONFIG_REGULATOR_ISL6271A is not set
# CONFIG_REGULATOR_FP9931 is not set
# CONFIG_REGULATOR_LP3971 is not set
# CONFIG_REGULATOR_LP3972 is not set
# CONFIG_REGULATOR_LP872X is not set
# CONFIG_REGULATOR_LP8755 is not set
# CONFIG_REGULATOR_LTC3589 is not set
# CONFIG_REGULATOR_LTC3676 is not set
# CONFIG_REGULATOR_MAX1586 is not set
# CONFIG_REGULATOR_MAX77503 is not set
# CONFIG_REGULATOR_MAX77675 is not set
# CONFIG_REGULATOR_MAX77857 is not set
# CONFIG_REGULATOR_MAX8649 is not set
# CONFIG_REGULATOR_MAX8660 is not set
# CONFIG_REGULATOR_MAX8893 is not set
# CONFIG_REGULATOR_MAX8952 is not set
# CONFIG_REGULATOR_MAX20086 is not set
# CONFIG_REGULATOR_MAX20411 is not set
# CONFIG_REGULATOR_MAX77826 is not set
# CONFIG_REGULATOR_MAX77838 is not set
# CONFIG_REGULATOR_MCP16502 is not set
# CONFIG_REGULATOR_MP5416 is not set
# CONFIG_REGULATOR_MP8859 is not set
# CONFIG_REGULATOR_MP886X is not set
# CONFIG_REGULATOR_MPQ7920 is not set
# CONFIG_REGULATOR_MT6311 is not set
# CONFIG_REGULATOR_MT6360 is not set
# CONFIG_REGULATOR_MT6370 is not set
# CONFIG_REGULATOR_PCA9450 is not set
# CONFIG_REGULATOR_PF9453 is not set
# CONFIG_REGULATOR_PF0900 is not set
# CONFIG_REGULATOR_PF530X is not set
# CONFIG_REGULATOR_PF8X00 is not set
# CONFIG_REGULATOR_PFUZE100 is not set
# CONFIG_REGULATOR_PV88060 is not set
# CONFIG_REGULATOR_PV88080 is not set
# CONFIG_REGULATOR_PV88090 is not set
# CONFIG_REGULATOR_RAA215300 is not set
# CONFIG_REGULATOR_RT4801 is not set
# CONFIG_REGULATOR_RT4803 is not set
# CONFIG_REGULATOR_RT5133 is not set
# CONFIG_REGULATOR_RT5190A is not set
# CONFIG_REGULATOR_RT5739 is not set
# CONFIG_REGULATOR_RT5759 is not set
# CONFIG_REGULATOR_RT6160 is not set
# CONFIG_REGULATOR_RT6190 is not set
# CONFIG_REGULATOR_RT6245 is not set
# CONFIG_REGULATOR_RT8092 is not set
# CONFIG_REGULATOR_RTQ2134 is not set
# CONFIG_REGULATOR_RTMV20 is not set
# CONFIG_REGULATOR_RTQ6752 is not set
# CONFIG_REGULATOR_RTQ2208 is not set
# CONFIG_REGULATOR_SLG51000 is not set
# CONFIG_REGULATOR_SY8106A is not set
# CONFIG_REGULATOR_SY8824X is not set
# CONFIG_REGULATOR_SY8827N is not set
# CONFIG_REGULATOR_TPS51632 is not set
# CONFIG_REGULATOR_TPS62360 is not set
# CONFIG_REGULATOR_TPS6286X is not set
# CONFIG_REGULATOR_TPS6287X is not set
# CONFIG_REGULATOR_TPS65023 is not set
# CONFIG_REGULATOR_TPS6507X is not set
# CONFIG_REGULATOR_TPS65132 is not set
# CONFIG_REGULATOR_TPS65185 is not set
# CONFIG_REGULATOR_TPS6524X is not set
CONFIG_REGULATOR_TWL4030=y
# CONFIG_REGULATOR_VCTRL is not set
CONFIG_RC_CORE=y
# CONFIG_LIRC is not set
# CONFIG_RC_MAP is not set
# CONFIG_RC_DECODERS is not set
CONFIG_RC_DEVICES=y
# CONFIG_IR_ENE is not set
# CONFIG_IR_FINTEK is not set
# CONFIG_IR_GPIO_CIR is not set
# CONFIG_IR_HIX5HD2 is not set
CONFIG_IR_IGORPLUGUSB=y
CONFIG_IR_IGUANA=y
CONFIG_IR_IMON=y
CONFIG_IR_IMON_RAW=y
# CONFIG_IR_ITE_CIR is not set
CONFIG_IR_MCEUSB=y
# CONFIG_IR_NUVOTON is not set
CONFIG_IR_REDRAT3=y
# CONFIG_IR_SERIAL is not set
CONFIG_IR_STREAMZAP=y
CONFIG_IR_TOY=y
CONFIG_IR_TTUSBIR=y
# CONFIG_IR_WINBOND_CIR is not set
CONFIG_RC_ATI_REMOTE=y
# CONFIG_RC_LOOPBACK is not set
CONFIG_RC_XBOX_DVD=y
CONFIG_CEC_CORE=y

#
# CEC support
#
# CONFIG_MEDIA_CEC_RC is not set
CONFIG_MEDIA_CEC_SUPPORT=y
# CONFIG_CEC_CH7322 is not set
# CONFIG_CEC_NXP_TDA9950 is not set
# CONFIG_CEC_GPIO is not set
# CONFIG_CEC_SECO is not set
# CONFIG_USB_EXTRON_DA_HD_4K_PLUS_CEC is not set
CONFIG_USB_PULSE8_CEC=y
CONFIG_USB_RAINSHADOW_CEC=y
# end of CEC support

CONFIG_MEDIA_SUPPORT=y
CONFIG_MEDIA_SUPPORT_FILTER=y
# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set

#
# Media device types
#
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
CONFIG_MEDIA_RADIO_SUPPORT=y
CONFIG_MEDIA_SDR_SUPPORT=y
CONFIG_MEDIA_PLATFORM_SUPPORT=y
CONFIG_MEDIA_TEST_SUPPORT=y
# end of Media device types

CONFIG_VIDEO_DEV=y
CONFIG_MEDIA_CONTROLLER=y
CONFIG_DVB_CORE=y

#
# Video4Linux options
#
CONFIG_VIDEO_V4L2_I2C=y
CONFIG_VIDEO_V4L2_SUBDEV_API=y
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
CONFIG_VIDEO_TUNER=y
CONFIG_V4L2_MEM2MEM_DEV=y
# end of Video4Linux options

#
# Media controller options
#
CONFIG_MEDIA_CONTROLLER_DVB=y
# end of Media controller options

#
# Digital TV options
#
# CONFIG_DVB_MMAP is not set
# CONFIG_DVB_NET is not set
CONFIG_DVB_MAX_ADAPTERS=16
# CONFIG_DVB_DYNAMIC_MINORS is not set
# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set
# CONFIG_DVB_ULE_DEBUG is not set
# end of Digital TV options

#
# Media drivers
#

#
# Drivers filtered as selected at 'Filter media drivers'
#

#
# Media drivers
#
CONFIG_MEDIA_USB_SUPPORT=y

#
# Webcam devices
#
CONFIG_USB_GSPCA=y
CONFIG_USB_GSPCA_BENQ=y
CONFIG_USB_GSPCA_CONEX=y
CONFIG_USB_GSPCA_CPIA1=y
CONFIG_USB_GSPCA_DTCS033=y
CONFIG_USB_GSPCA_ETOMS=y
CONFIG_USB_GSPCA_FINEPIX=y
CONFIG_USB_GSPCA_JEILINJ=y
CONFIG_USB_GSPCA_JL2005BCD=y
CONFIG_USB_GSPCA_KINECT=y
CONFIG_USB_GSPCA_KONICA=y
CONFIG_USB_GSPCA_MARS=y
CONFIG_USB_GSPCA_MR97310A=y
CONFIG_USB_GSPCA_NW80X=y
CONFIG_USB_GSPCA_OV519=y
CONFIG_USB_GSPCA_OV534=y
CONFIG_USB_GSPCA_OV534_9=y
CONFIG_USB_GSPCA_PAC207=y
CONFIG_USB_GSPCA_PAC7302=y
CONFIG_USB_GSPCA_PAC7311=y
CONFIG_USB_GSPCA_SE401=y
CONFIG_USB_GSPCA_SN9C2028=y
CONFIG_USB_GSPCA_SN9C20X=y
CONFIG_USB_GSPCA_SONIXB=y
CONFIG_USB_GSPCA_SONIXJ=y
CONFIG_USB_GSPCA_SPCA1528=y
CONFIG_USB_GSPCA_SPCA500=y
CONFIG_USB_GSPCA_SPCA501=y
CONFIG_USB_GSPCA_SPCA505=y
CONFIG_USB_GSPCA_SPCA506=y
CONFIG_USB_GSPCA_SPCA508=y
CONFIG_USB_GSPCA_SPCA561=y
CONFIG_USB_GSPCA_SQ905=y
CONFIG_USB_GSPCA_SQ905C=y
CONFIG_USB_GSPCA_SQ930X=y
CONFIG_USB_GSPCA_STK014=y
CONFIG_USB_GSPCA_STK1135=y
CONFIG_USB_GSPCA_STV0680=y
CONFIG_USB_GSPCA_SUNPLUS=y
CONFIG_USB_GSPCA_T613=y
CONFIG_USB_GSPCA_TOPRO=y
CONFIG_USB_GSPCA_TOUPTEK=y
CONFIG_USB_GSPCA_TV8532=y
CONFIG_USB_GSPCA_VC032X=y
CONFIG_USB_GSPCA_VICAM=y
CONFIG_USB_GSPCA_XIRLINK_CIT=y
CONFIG_USB_GSPCA_ZC3XX=y
CONFIG_USB_GL860=y
CONFIG_USB_M5602=y
CONFIG_USB_STV06XX=y
CONFIG_USB_PWC=y
# CONFIG_USB_PWC_DEBUG is not set
CONFIG_USB_PWC_INPUT_EVDEV=y
CONFIG_USB_S2255=y
CONFIG_VIDEO_USBTV=y
CONFIG_USB_VIDEO_CLASS=y
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y

#
# Analog TV USB devices
#
CONFIG_VIDEO_GO7007=y
CONFIG_VIDEO_GO7007_USB=y
CONFIG_VIDEO_GO7007_LOADER=y
CONFIG_VIDEO_GO7007_USB_S2250_BOARD=y
CONFIG_VIDEO_HDPVR=y
CONFIG_VIDEO_PVRUSB2=y
CONFIG_VIDEO_PVRUSB2_SYSFS=y
CONFIG_VIDEO_PVRUSB2_DVB=y
# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
CONFIG_VIDEO_STK1160=y

#
# Analog/digital TV USB devices
#
CONFIG_VIDEO_AU0828=y
CONFIG_VIDEO_AU0828_V4L2=y
CONFIG_VIDEO_AU0828_RC=y
CONFIG_VIDEO_CX231XX=y
CONFIG_VIDEO_CX231XX_RC=y
CONFIG_VIDEO_CX231XX_ALSA=y
CONFIG_VIDEO_CX231XX_DVB=y

#
# Digital TV USB devices
#
CONFIG_DVB_AS102=y
CONFIG_DVB_B2C2_FLEXCOP_USB=y
# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set
CONFIG_DVB_USB_V2=y
CONFIG_DVB_USB_AF9015=y
CONFIG_DVB_USB_AF9035=y
CONFIG_DVB_USB_ANYSEE=y
CONFIG_DVB_USB_AU6610=y
CONFIG_DVB_USB_AZ6007=y
CONFIG_DVB_USB_CE6230=y
CONFIG_DVB_USB_DVBSKY=y
CONFIG_DVB_USB_EC168=y
CONFIG_DVB_USB_GL861=y
CONFIG_DVB_USB_LME2510=y
CONFIG_DVB_USB_MXL111SF=y
CONFIG_DVB_USB_RTL28XXU=y
CONFIG_DVB_USB_ZD1301=y
CONFIG_DVB_USB=y
# CONFIG_DVB_USB_DEBUG is not set
CONFIG_DVB_USB_A800=y
CONFIG_DVB_USB_AF9005=y
CONFIG_DVB_USB_AF9005_REMOTE=y
CONFIG_DVB_USB_AZ6027=y
CONFIG_DVB_USB_CINERGY_T2=y
CONFIG_DVB_USB_CXUSB=y
CONFIG_DVB_USB_CXUSB_ANALOG=y
CONFIG_DVB_USB_DIB0700=y
CONFIG_DVB_USB_DIB3000MC=y
CONFIG_DVB_USB_DIBUSB_MB=y
# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
CONFIG_DVB_USB_DIBUSB_MC=y
CONFIG_DVB_USB_DIGITV=y
CONFIG_DVB_USB_DTT200U=y
CONFIG_DVB_USB_DTV5100=y
CONFIG_DVB_USB_DW2102=y
CONFIG_DVB_USB_GP8PSK=y
CONFIG_DVB_USB_M920X=y
CONFIG_DVB_USB_NOVA_T_USB2=y
CONFIG_DVB_USB_OPERA1=y
CONFIG_DVB_USB_PCTV452E=y
CONFIG_DVB_USB_TECHNISAT_USB2=y
CONFIG_DVB_USB_TTUSB2=y
CONFIG_DVB_USB_UMT_010=y
CONFIG_DVB_USB_VP702X=y
CONFIG_DVB_USB_VP7045=y
CONFIG_SMS_USB_DRV=y
CONFIG_DVB_TTUSB_BUDGET=y
CONFIG_DVB_TTUSB_DEC=y

#
# Webcam, TV (analog/digital) USB devices
#
CONFIG_VIDEO_EM28XX=y
CONFIG_VIDEO_EM28XX_V4L2=y
CONFIG_VIDEO_EM28XX_ALSA=y
CONFIG_VIDEO_EM28XX_DVB=y
CONFIG_VIDEO_EM28XX_RC=y

#
# Software defined radio USB devices
#
CONFIG_USB_AIRSPY=y
CONFIG_USB_HACKRF=y
CONFIG_USB_MSI2500=y
# CONFIG_MEDIA_PCI_SUPPORT is not set
CONFIG_RADIO_ADAPTERS=y
# CONFIG_RADIO_MAXIRADIO is not set
# CONFIG_RADIO_SAA7706H is not set
CONFIG_RADIO_SHARK=y
CONFIG_RADIO_SHARK2=y
CONFIG_RADIO_SI4713=y
CONFIG_RADIO_TEA575X=y
# CONFIG_RADIO_TEA5764 is not set
# CONFIG_RADIO_TEF6862 is not set
CONFIG_USB_DSBR=y
CONFIG_USB_KEENE=y
CONFIG_USB_MA901=y
CONFIG_USB_MR800=y
CONFIG_USB_RAREMONO=y
CONFIG_RADIO_SI470X=y
CONFIG_USB_SI470X=y
# CONFIG_I2C_SI470X is not set
CONFIG_USB_SI4713=y
# CONFIG_PLATFORM_SI4713 is not set
CONFIG_I2C_SI4713=y
# CONFIG_MEDIA_PLATFORM_DRIVERS is not set

#
# MMC/SDIO DVB adapters
#
CONFIG_SMS_SDIO_DRV=y
CONFIG_V4L_TEST_DRIVERS=y
CONFIG_VIDEO_VIM2M=y
CONFIG_VIDEO_VICODEC=y
CONFIG_VIDEO_VIMC=y
CONFIG_VIDEO_VIVID=y
CONFIG_VIDEO_VIVID_CEC=y
# CONFIG_VIDEO_VIVID_OSD is not set
CONFIG_VIDEO_VIVID_MAX_DEVS=64
# CONFIG_VIDEO_VISL is not set
CONFIG_DVB_TEST_DRIVERS=y
CONFIG_DVB_VIDTV=y

#
# FireWire (IEEE 1394) Adapters
#
# CONFIG_DVB_FIREDTV is not set
CONFIG_MEDIA_COMMON_OPTIONS=y

#
# common driver options
#
CONFIG_CYPRESS_FIRMWARE=y
CONFIG_TTPCI_EEPROM=y
CONFIG_UVC_COMMON=y
CONFIG_VIDEO_CX2341X=y
CONFIG_VIDEO_TVEEPROM=y
CONFIG_DVB_B2C2_FLEXCOP=y
CONFIG_SMS_SIANO_MDTV=y
CONFIG_SMS_SIANO_RC=y
CONFIG_SMS_SIANO_DEBUGFS=y
CONFIG_VIDEO_V4L2_TPG=y
CONFIG_VIDEOBUF2_CORE=y
CONFIG_VIDEOBUF2_V4L2=y
CONFIG_VIDEOBUF2_MEMOPS=y
CONFIG_VIDEOBUF2_DMA_CONTIG=y
CONFIG_VIDEOBUF2_VMALLOC=y
CONFIG_VIDEOBUF2_DMA_SG=y
# end of Media drivers

#
# Media ancillary drivers
#
CONFIG_MEDIA_ATTACH=y
# CONFIG_VIDEO_IR_I2C is not set
# CONFIG_VIDEO_CAMERA_SENSOR is not set

#
# Camera ISPs
#
# CONFIG_VIDEO_THP7312 is not set
# end of Camera ISPs

# CONFIG_VIDEO_CAMERA_LENS is not set

#
# Flash devices
#
# CONFIG_VIDEO_ADP1653 is not set
# CONFIG_VIDEO_LM3560 is not set
# CONFIG_VIDEO_LM3646 is not set
# end of Flash devices

#
# Audio decoders, processors and mixers
#
# CONFIG_VIDEO_CS3308 is not set
# CONFIG_VIDEO_CS5345 is not set
CONFIG_VIDEO_CS53L32A=y
CONFIG_VIDEO_MSP3400=y
# CONFIG_VIDEO_SONY_BTF_MPX is not set
# CONFIG_VIDEO_TDA1997X is not set
# CONFIG_VIDEO_TDA7432 is not set
# CONFIG_VIDEO_TDA9840 is not set
# CONFIG_VIDEO_TEA6415C is not set
# CONFIG_VIDEO_TEA6420 is not set
# CONFIG_VIDEO_TLV320AIC23B is not set
# CONFIG_VIDEO_TVAUDIO is not set
# CONFIG_VIDEO_UDA1342 is not set
# CONFIG_VIDEO_VP27SMPX is not set
# CONFIG_VIDEO_WM8739 is not set
CONFIG_VIDEO_WM8775=y
# end of Audio decoders, processors and mixers

#
# RDS decoders
#
# CONFIG_VIDEO_SAA6588 is not set
# end of RDS decoders

#
# Video decoders
#
# CONFIG_VIDEO_ADV7180 is not set
# CONFIG_VIDEO_ADV7183 is not set
# CONFIG_VIDEO_ADV748X is not set
# CONFIG_VIDEO_ADV7604 is not set
# CONFIG_VIDEO_ADV7842 is not set
# CONFIG_VIDEO_BT819 is not set
# CONFIG_VIDEO_BT856 is not set
# CONFIG_VIDEO_BT866 is not set
# CONFIG_VIDEO_ISL7998X is not set
# CONFIG_VIDEO_LT6911UXE is not set
# CONFIG_VIDEO_KS0127 is not set
# CONFIG_VIDEO_MAX9286 is not set
# CONFIG_VIDEO_ML86V7667 is not set
# CONFIG_VIDEO_SAA7110 is not set
CONFIG_VIDEO_SAA711X=y
# CONFIG_VIDEO_TC358743 is not set
# CONFIG_VIDEO_TC358746 is not set
# CONFIG_VIDEO_TVP514X is not set
# CONFIG_VIDEO_TVP5150 is not set
# CONFIG_VIDEO_TVP7002 is not set
# CONFIG_VIDEO_TW2804 is not set
# CONFIG_VIDEO_TW9900 is not set
# CONFIG_VIDEO_TW9903 is not set
# CONFIG_VIDEO_TW9906 is not set
# CONFIG_VIDEO_TW9910 is not set
# CONFIG_VIDEO_VPX3220 is not set

#
# Video and audio decoders
#
# CONFIG_VIDEO_SAA717X is not set
CONFIG_VIDEO_CX25840=y
# end of Video decoders

#
# Video encoders
#
# CONFIG_VIDEO_ADV7170 is not set
# CONFIG_VIDEO_ADV7175 is not set
# CONFIG_VIDEO_ADV7343 is not set
# CONFIG_VIDEO_ADV7393 is not set
# CONFIG_VIDEO_ADV7511 is not set
# CONFIG_VIDEO_AK881X is not set
# CONFIG_VIDEO_SAA7127 is not set
# CONFIG_VIDEO_SAA7185 is not set
# CONFIG_VIDEO_THS8200 is not set
# end of Video encoders

#
# Video improvement chips
#
# CONFIG_VIDEO_UPD64031A is not set
# CONFIG_VIDEO_UPD64083 is not set
# end of Video improvement chips

#
# Audio/Video compression chips
#
# CONFIG_VIDEO_SAA6752HS is not set
# end of Audio/Video compression chips

#
# SDR tuner chips
#
# CONFIG_SDR_MAX2175 is not set
# end of SDR tuner chips

#
# Miscellaneous helper chips
#
# CONFIG_VIDEO_I2C is not set
# CONFIG_VIDEO_M52790 is not set
# CONFIG_VIDEO_ST_MIPID02 is not set
# CONFIG_VIDEO_THS7303 is not set
# end of Miscellaneous helper chips

#
# Video serializers and deserializers
#
# CONFIG_VIDEO_DS90UB913 is not set
# CONFIG_VIDEO_DS90UB953 is not set
# CONFIG_VIDEO_DS90UB960 is not set
# CONFIG_VIDEO_MAX96714 is not set
# CONFIG_VIDEO_MAX96717 is not set
# end of Video serializers and deserializers

#
# Media SPI Adapters
#
# CONFIG_CXD2880_SPI_DRV is not set
# CONFIG_VIDEO_GS1662 is not set
# end of Media SPI Adapters

CONFIG_MEDIA_TUNER=y

#
# Customize TV tuners
#
# CONFIG_MEDIA_TUNER_E4000 is not set
# CONFIG_MEDIA_TUNER_FC0011 is not set
# CONFIG_MEDIA_TUNER_FC0012 is not set
# CONFIG_MEDIA_TUNER_FC0013 is not set
# CONFIG_MEDIA_TUNER_FC2580 is not set
# CONFIG_MEDIA_TUNER_IT913X is not set
# CONFIG_MEDIA_TUNER_M88RS6000T is not set
# CONFIG_MEDIA_TUNER_MAX2165 is not set
# CONFIG_MEDIA_TUNER_MC44S803 is not set
CONFIG_MEDIA_TUNER_MSI001=y
# CONFIG_MEDIA_TUNER_MT2060 is not set
# CONFIG_MEDIA_TUNER_MT2063 is not set
# CONFIG_MEDIA_TUNER_MT20XX is not set
# CONFIG_MEDIA_TUNER_MT2131 is not set
# CONFIG_MEDIA_TUNER_MT2266 is not set
# CONFIG_MEDIA_TUNER_MXL301RF is not set
# CONFIG_MEDIA_TUNER_MXL5005S is not set
# CONFIG_MEDIA_TUNER_MXL5007T is not set
# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set
# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set
# CONFIG_MEDIA_TUNER_QT1010 is not set
# CONFIG_MEDIA_TUNER_R820T is not set
# CONFIG_MEDIA_TUNER_SI2157 is not set
# CONFIG_MEDIA_TUNER_SIMPLE is not set
# CONFIG_MEDIA_TUNER_TDA18212 is not set
# CONFIG_MEDIA_TUNER_TDA18218 is not set
# CONFIG_MEDIA_TUNER_TDA18250 is not set
# CONFIG_MEDIA_TUNER_TDA18271 is not set
# CONFIG_MEDIA_TUNER_TDA827X is not set
# CONFIG_MEDIA_TUNER_TDA8290 is not set
# CONFIG_MEDIA_TUNER_TDA9887 is not set
# CONFIG_MEDIA_TUNER_TEA5761 is not set
# CONFIG_MEDIA_TUNER_TEA5767 is not set
# CONFIG_MEDIA_TUNER_TUA9001 is not set
# CONFIG_MEDIA_TUNER_XC2028 is not set
# CONFIG_MEDIA_TUNER_XC4000 is not set
# CONFIG_MEDIA_TUNER_XC5000 is not set
# end of Customize TV tuners

#
# Customise DVB Frontends
#

#
# Multistandard (satellite) frontends
#
# CONFIG_DVB_M88DS3103 is not set
# CONFIG_DVB_MXL5XX is not set
# CONFIG_DVB_STB0899 is not set
# CONFIG_DVB_STB6100 is not set
# CONFIG_DVB_STV090x is not set
# CONFIG_DVB_STV0910 is not set
# CONFIG_DVB_STV6110x is not set
# CONFIG_DVB_STV6111 is not set

#
# Multistandard (cable + terrestrial) frontends
#
# CONFIG_DVB_DRXK is not set
# CONFIG_DVB_MN88472 is not set
# CONFIG_DVB_MN88473 is not set
# CONFIG_DVB_SI2165 is not set
# CONFIG_DVB_TDA18271C2DD is not set

#
# DVB-S (satellite) frontends
#
# CONFIG_DVB_CX24110 is not set
# CONFIG_DVB_CX24116 is not set
# CONFIG_DVB_CX24117 is not set
# CONFIG_DVB_CX24120 is not set
# CONFIG_DVB_CX24123 is not set
# CONFIG_DVB_DS3000 is not set
# CONFIG_DVB_MB86A16 is not set
# CONFIG_DVB_MT312 is not set
# CONFIG_DVB_S5H1420 is not set
# CONFIG_DVB_SI21XX is not set
# CONFIG_DVB_STB6000 is not set
# CONFIG_DVB_STV0288 is not set
# CONFIG_DVB_STV0299 is not set
# CONFIG_DVB_STV0900 is not set
# CONFIG_DVB_STV6110 is not set
# CONFIG_DVB_TDA10071 is not set
# CONFIG_DVB_TDA10086 is not set
# CONFIG_DVB_TDA8083 is not set
# CONFIG_DVB_TDA8261 is not set
# CONFIG_DVB_TDA826X is not set
# CONFIG_DVB_TS2020 is not set
# CONFIG_DVB_TUA6100 is not set
# CONFIG_DVB_TUNER_CX24113 is not set
# CONFIG_DVB_TUNER_ITD1000 is not set
# CONFIG_DVB_VES1X93 is not set
# CONFIG_DVB_ZL10036 is not set
# CONFIG_DVB_ZL10039 is not set

#
# DVB-T (terrestrial) frontends
#
CONFIG_DVB_AF9013=y
CONFIG_DVB_AS102_FE=y
# CONFIG_DVB_CX22700 is not set
# CONFIG_DVB_CX22702 is not set
# CONFIG_DVB_CXD2820R is not set
# CONFIG_DVB_CXD2841ER is not set
CONFIG_DVB_DIB3000MB=y
CONFIG_DVB_DIB3000MC=y
# CONFIG_DVB_DIB7000M is not set
# CONFIG_DVB_DIB7000P is not set
# CONFIG_DVB_DIB9000 is not set
# CONFIG_DVB_DRXD is not set
CONFIG_DVB_EC100=y
CONFIG_DVB_GP8PSK_FE=y
# CONFIG_DVB_L64781 is not set
# CONFIG_DVB_MT352 is not set
# CONFIG_DVB_NXT6000 is not set
CONFIG_DVB_RTL2830=y
CONFIG_DVB_RTL2832=y
CONFIG_DVB_RTL2832_SDR=y
# CONFIG_DVB_S5H1432 is not set
# CONFIG_DVB_SI2168 is not set
# CONFIG_DVB_SP887X is not set
# CONFIG_DVB_STV0367 is not set
# CONFIG_DVB_TDA10048 is not set
# CONFIG_DVB_TDA1004X is not set
# CONFIG_DVB_ZD1301_DEMOD is not set
CONFIG_DVB_ZL10353=y
# CONFIG_DVB_CXD2880 is not set

#
# DVB-C (cable) frontends
#
# CONFIG_DVB_STV0297 is not set
# CONFIG_DVB_TDA10021 is not set
# CONFIG_DVB_TDA10023 is not set
# CONFIG_DVB_VES1820 is not set

#
# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
#
# CONFIG_DVB_AU8522_DTV is not set
# CONFIG_DVB_AU8522_V4L is not set
# CONFIG_DVB_BCM3510 is not set
# CONFIG_DVB_LG2160 is not set
# CONFIG_DVB_LGDT3305 is not set
# CONFIG_DVB_LGDT3306A is not set
# CONFIG_DVB_LGDT330X is not set
# CONFIG_DVB_MXL692 is not set
# CONFIG_DVB_NXT200X is not set
# CONFIG_DVB_OR51132 is not set
# CONFIG_DVB_OR51211 is not set
# CONFIG_DVB_S5H1409 is not set
# CONFIG_DVB_S5H1411 is not set

#
# ISDB-T (terrestrial) frontends
#
# CONFIG_DVB_DIB8000 is not set
# CONFIG_DVB_MB86A20S is not set
# CONFIG_DVB_S921 is not set

#
# ISDB-S (satellite) & ISDB-T (terrestrial) frontends
#
# CONFIG_DVB_MN88443X is not set
# CONFIG_DVB_TC90522 is not set

#
# Digital terrestrial only tuners/PLL
#
# CONFIG_DVB_PLL is not set
# CONFIG_DVB_TUNER_DIB0070 is not set
# CONFIG_DVB_TUNER_DIB0090 is not set

#
# SEC control devices for DVB-S
#
# CONFIG_DVB_A8293 is not set
CONFIG_DVB_AF9033=y
# CONFIG_DVB_ASCOT2E is not set
# CONFIG_DVB_ATBM8830 is not set
# CONFIG_DVB_HELENE is not set
# CONFIG_DVB_HORUS3A is not set
# CONFIG_DVB_ISL6405 is not set
# CONFIG_DVB_ISL6421 is not set
# CONFIG_DVB_ISL6423 is not set
# CONFIG_DVB_IX2505V is not set
# CONFIG_DVB_LGS8GL5 is not set
# CONFIG_DVB_LGS8GXX is not set
# CONFIG_DVB_LNBH25 is not set
# CONFIG_DVB_LNBH29 is not set
# CONFIG_DVB_LNBP21 is not set
# CONFIG_DVB_LNBP22 is not set
# CONFIG_DVB_M88RS2000 is not set
# CONFIG_DVB_TDA665x is not set
# CONFIG_DVB_DRX39XYJ is not set

#
# Common Interface (EN50221) controller drivers
#
# CONFIG_DVB_CXD2099 is not set
# CONFIG_DVB_SP2 is not set
# end of Customise DVB Frontends

#
# Tools to develop new frontends
#
# CONFIG_DVB_DUMMY_FE is not set
# end of Media ancillary drivers

#
# Graphics support
#
CONFIG_APERTURE_HELPERS=y
CONFIG_SCREEN_INFO=y
CONFIG_VIDEO=y
# CONFIG_AUXDISPLAY is not set
# CONFIG_PANEL is not set
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
CONFIG_AGP_INTEL=y
# CONFIG_AGP_SIS is not set
# CONFIG_AGP_VIA is not set
CONFIG_INTEL_GTT=y
# CONFIG_VGA_SWITCHEROO is not set
CONFIG_DRM=y

#
# DRM debugging options
#
# CONFIG_DRM_WERROR is not set
CONFIG_DRM_DEBUG_MM=y
# end of DRM debugging options

CONFIG_DRM_KMS_HELPER=y
# CONFIG_DRM_PANIC is not set
# CONFIG_DRM_RAS is not set
# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
CONFIG_DRM_CLIENT=y
CONFIG_DRM_CLIENT_LIB=y
CONFIG_DRM_CLIENT_SELECTION=y
CONFIG_DRM_CLIENT_SETUP=y

#
# Supported DRM clients
#
CONFIG_DRM_FBDEV_EMULATION=y
CONFIG_DRM_FBDEV_OVERALLOC=100
# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
# CONFIG_DRM_CLIENT_LOG is not set
CONFIG_DRM_CLIENT_DEFAULT_FBDEV=y
CONFIG_DRM_CLIENT_DEFAULT="fbdev"
# end of Supported DRM clients

# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
CONFIG_DRM_DISPLAY_DP_AUX_BUS=y
CONFIG_DRM_DISPLAY_HELPER=y
# CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set
# CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set
CONFIG_DRM_DISPLAY_DP_HELPER=y
CONFIG_DRM_TTM=y
CONFIG_DRM_TTM_HELPER=y
CONFIG_DRM_GEM_SHMEM_HELPER=y
# CONFIG_DRM_AMDGPU is not set

#
# ARM devices
#
# CONFIG_DRM_KOMEDA is not set
# end of ARM devices

# CONFIG_DRM_AST is not set
CONFIG_DRM_BRIDGE=y
CONFIG_DRM_PANEL_BRIDGE=y
CONFIG_DRM_AUX_BRIDGE=y
CONFIG_DRM_AUX_HPD_BRIDGE=y

#
# Display Interface Bridges
#
# CONFIG_DRM_CHIPONE_ICN6211 is not set
# CONFIG_DRM_CHRONTEL_CH7033 is not set
# CONFIG_DRM_DISPLAY_CONNECTOR is not set
# CONFIG_DRM_I2C_NXP_TDA998X is not set
# CONFIG_DRM_ITE_IT6263 is not set
# CONFIG_DRM_ITE_IT6505 is not set
# CONFIG_DRM_LONTIUM_LT8912B is not set
# CONFIG_DRM_LONTIUM_LT9211 is not set
# CONFIG_DRM_LONTIUM_LT9611 is not set
# CONFIG_DRM_LONTIUM_LT9611UXC is not set
# CONFIG_DRM_LONTIUM_LT8713SX is not set
# CONFIG_DRM_ITE_IT66121 is not set
# CONFIG_DRM_LVDS_CODEC is not set
# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set
# CONFIG_DRM_NWL_MIPI_DSI is not set
# CONFIG_DRM_NXP_PTN3460 is not set
# CONFIG_DRM_PARADE_PS8622 is not set
# CONFIG_DRM_PARADE_PS8640 is not set
# CONFIG_DRM_SAMSUNG_DSIM is not set
# CONFIG_DRM_SIL_SII8620 is not set
# CONFIG_DRM_SII902X is not set
# CONFIG_DRM_SII9234 is not set
# CONFIG_DRM_SIMPLE_BRIDGE is not set
# CONFIG_DRM_SOLOMON_SSD2825 is not set
# CONFIG_DRM_THINE_THC63LVD1024 is not set
# CONFIG_DRM_TOSHIBA_TC358762 is not set
# CONFIG_DRM_TOSHIBA_TC358764 is not set
# CONFIG_DRM_TOSHIBA_TC358767 is not set
# CONFIG_DRM_TOSHIBA_TC358768 is not set
# CONFIG_DRM_TOSHIBA_TC358775 is not set
# CONFIG_DRM_TI_DLPC3433 is not set
# CONFIG_DRM_TI_TDP158 is not set
# CONFIG_DRM_TI_TFP410 is not set
# CONFIG_DRM_TI_SN65DSI83 is not set
# CONFIG_DRM_TI_SN65DSI86 is not set
# CONFIG_DRM_TI_TPD12S015 is not set
# CONFIG_DRM_WAVESHARE_BRIDGE is not set
# CONFIG_DRM_ANALOGIX_ANX6345 is not set
# CONFIG_DRM_ANALOGIX_ANX78XX is not set
# CONFIG_DRM_ANALOGIX_ANX7625 is not set
# CONFIG_DRM_I2C_ADV7511 is not set
# CONFIG_DRM_CDNS_DSI is not set
# CONFIG_DRM_CDNS_MHDP8546 is not set
# end of Display Interface Bridges

# CONFIG_DRM_ETNAVIV is not set
# CONFIG_DRM_GMA500 is not set
CONFIG_DRM_GUD=y
# CONFIG_DRM_HISI_HIBMC is not set
# CONFIG_DRM_LOGICVC is not set
# CONFIG_DRM_MGAG200 is not set
# CONFIG_DRM_NOUVEAU is not set
CONFIG_DRM_PANEL=y

#
# Display Panels
#
# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set
# CONFIG_DRM_PANEL_ARM_VERSATILE is not set
# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set
# CONFIG_DRM_PANEL_LVDS is not set
# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set
# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set
# CONFIG_DRM_PANEL_ILITEK_ILI9806E_SPI is not set
# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set
# CONFIG_DRM_PANEL_LG_LB035Q02 is not set
# CONFIG_DRM_PANEL_LG_LG4573 is not set
# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set
# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set
# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set
# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set
# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set
# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set
# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set
# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E8FC0 is not set
# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set
# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set
# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set
# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set
# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set
CONFIG_DRM_PANEL_EDP=y
# CONFIG_DRM_PANEL_SIMPLE is not set
# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set
# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set
# CONFIG_DRM_PANEL_TPO_TPG110 is not set
# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set
# end of Display Panels

# CONFIG_DRM_QXL is not set
# CONFIG_DRM_RADEON is not set
# CONFIG_DRM_ST7571 is not set
# CONFIG_DRM_ST7586 is not set
# CONFIG_DRM_ST7735R is not set
# CONFIG_DRM_ST7920 is not set
# CONFIG_DRM_SSD130X is not set

#
# Drivers for system framebuffers
#
CONFIG_DRM_SYSFB_HELPER=y
CONFIG_DRM_SIMPLEDRM=y
# CONFIG_DRM_VESADRM is not set
# end of Drivers for system framebuffers

# CONFIG_DRM_APPLETBDRM is not set
# CONFIG_DRM_ARCPGU is not set
CONFIG_DRM_BOCHS=y
CONFIG_DRM_CIRRUS_QEMU=y
CONFIG_DRM_GM12U320=y
# CONFIG_DRM_PANEL_MIPI_DBI is not set
# CONFIG_DRM_PIXPAPER is not set
# CONFIG_TINYDRM_HX8357D is not set
# CONFIG_TINYDRM_ILI9163 is not set
# CONFIG_TINYDRM_ILI9225 is not set
# CONFIG_TINYDRM_ILI9341 is not set
# CONFIG_TINYDRM_ILI9486 is not set
# CONFIG_TINYDRM_MI0283QT is not set
# CONFIG_TINYDRM_REPAPER is not set
# CONFIG_TINYDRM_SHARP_MEMORY is not set
CONFIG_DRM_UDL=y
# CONFIG_DRM_VBOXVIDEO is not set
CONFIG_DRM_VGEM=y
CONFIG_DRM_VIRTIO_GPU=y
CONFIG_DRM_VIRTIO_GPU_KMS=y
CONFIG_DRM_VKMS=y
CONFIG_DRM_VMWGFX=y
# CONFIG_DRM_VMWGFX_MKSSTATS is not set
# CONFIG_DRM_XE is not set
CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y

#
# Frame buffer Devices
#
CONFIG_FB=y
# 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=y
# CONFIG_FB_UVESA is not set
CONFIG_FB_VESA=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_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_VIA 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=y
# CONFIG_FB_METRONOME is not set
# CONFIG_FB_MB862XX is not set
# CONFIG_FB_SSD1307 is not set
# CONFIG_FB_SM712 is not set
CONFIG_FB_CORE=y
CONFIG_FB_NOTIFY=y
CONFIG_FB_DEVICE=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_SYSMEM_FOPS=y
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_IOMEM_FOPS=y
CONFIG_FB_IOMEM_HELPERS=y
CONFIG_FB_SYSMEM_HELPERS=y
CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y
CONFIG_FB_TILEBLITTING=y
# end of Frame buffer Devices

#
# Backlight & LCD device support
#
CONFIG_LCD_CLASS_DEVICE=y
# CONFIG_LCD_L4F00242T03 is not set
# CONFIG_LCD_LMS283GF05 is not set
# CONFIG_LCD_LTV350QV is not set
# CONFIG_LCD_ILI922X is not set
# CONFIG_LCD_ILI9320 is not set
# CONFIG_LCD_TDO24M is not set
# CONFIG_LCD_VGG2432A4 is not set
# CONFIG_LCD_PLATFORM is not set
# CONFIG_LCD_AMS369FG06 is not set
# CONFIG_LCD_LMS501KF03 is not set
# CONFIG_LCD_HX8357 is not set
# CONFIG_LCD_OTM3225A is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_BACKLIGHT_AW99706 is not set
# CONFIG_BACKLIGHT_KTD253 is not set
# CONFIG_BACKLIGHT_KTD2801 is not set
# CONFIG_BACKLIGHT_KTZ8866 is not set
# CONFIG_BACKLIGHT_MT6370 is not set
# CONFIG_BACKLIGHT_APPLE is not set
# CONFIG_BACKLIGHT_QCOM_WLED is not set
# CONFIG_BACKLIGHT_SAHARA is not set
# CONFIG_BACKLIGHT_ADP8860 is not set
# CONFIG_BACKLIGHT_ADP8870 is not set
# CONFIG_BACKLIGHT_LM3509 is not set
# CONFIG_BACKLIGHT_LM3639 is not set
# CONFIG_BACKLIGHT_PANDORA is not set
# CONFIG_BACKLIGHT_GPIO is not set
# CONFIG_BACKLIGHT_LV5207LP is not set
# CONFIG_BACKLIGHT_BD6107 is not set
# CONFIG_BACKLIGHT_ARCXCNN is not set
# CONFIG_BACKLIGHT_LED is not set
# end of Backlight & LCD device support

CONFIG_VGASTATE=y
CONFIG_VIDEOMODE_HELPERS=y
CONFIG_HDMI=y
# CONFIG_FIRMWARE_EDID is not set

#
# 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_LEGACY_ACCELERATION is not set
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
# end of Console display driver support

CONFIG_LOGO=y
CONFIG_LOGO_LINUX_MONO=y
CONFIG_LOGO_LINUX_MONO_FILE="drivers/video/logo/logo_linux_mono.pbm"
CONFIG_LOGO_LINUX_VGA16=y
CONFIG_LOGO_LINUX_VGA16_FILE="drivers/video/logo/logo_linux_vga16.ppm"
# CONFIG_LOGO_LINUX_CLUT224 is not set
# CONFIG_TRACE_GPU_MEM is not set
# end of Graphics support

# CONFIG_DRM_ACCEL is not set
CONFIG_SOUND=y
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_HWDEP=y
CONFIG_SND_SEQ_DEVICE=y
CONFIG_SND_RAWMIDI=y
CONFIG_SND_UMP=y
CONFIG_SND_UMP_LEGACY_RAWMIDI=y
CONFIG_SND_JACK=y
CONFIG_SND_JACK_INPUT_DEV=y
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_PCM_TIMER=y
CONFIG_SND_HRTIMER=y
# CONFIG_SND_DYNAMIC_MINORS is not set
# CONFIG_SND_SUPPORT_OLD_API is not set
CONFIG_SND_PROC_FS=y
CONFIG_SND_VERBOSE_PROCFS=y
CONFIG_SND_CTL_FAST_LOOKUP=y
CONFIG_SND_DEBUG=y
# CONFIG_SND_DEBUG_VERBOSE is not set
CONFIG_SND_PCM_XRUN_DEBUG=y
# CONFIG_SND_CTL_INPUT_VALIDATION is not set
# CONFIG_SND_CTL_DEBUG is not set
# CONFIG_SND_JACK_INJECTION_DEBUG is not set
# CONFIG_SND_UTIMER is not set
CONFIG_SND_VMASTER=y
CONFIG_SND_DMA_SGBUF=y
CONFIG_SND_CTL_LED=y
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQ_DUMMY=y
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
CONFIG_SND_SEQ_MIDI_EVENT=y
CONFIG_SND_SEQ_MIDI=y
CONFIG_SND_SEQ_VIRMIDI=y
# CONFIG_SND_SEQ_UMP is not set
CONFIG_SND_DRIVERS=y
# CONFIG_SND_PCSP is not set
CONFIG_SND_DUMMY=y
CONFIG_SND_ALOOP=y
# CONFIG_SND_PCMTEST is not set
CONFIG_SND_VIRMIDI=y
# CONFIG_SND_MTPAV is not set
# CONFIG_SND_MTS64 is not set
# CONFIG_SND_SERIAL_U16550 is not set
# CONFIG_SND_SERIAL_GENERIC is not set
# CONFIG_SND_MPU401 is not set
# CONFIG_SND_PORTMAN2X4 is not set
CONFIG_SND_PCI=y
# CONFIG_SND_AD1889 is not set
# CONFIG_SND_ALS300 is not set
# CONFIG_SND_ALS4000 is not set
# CONFIG_SND_ALI5451 is not set
# CONFIG_SND_ASIHPI is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
# CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set
# CONFIG_SND_AW2 is not set
# CONFIG_SND_AZT3328 is not set
# CONFIG_SND_BT87X is not set
# CONFIG_SND_CA0106 is not set
# CONFIG_SND_CMIPCI is not set
# CONFIG_SND_OXYGEN is not set
# CONFIG_SND_CS4281 is not set
# CONFIG_SND_CS46XX is not set
# CONFIG_SND_CTXFI is not set
# CONFIG_SND_DARLA20 is not set
# CONFIG_SND_GINA20 is not set
# CONFIG_SND_LAYLA20 is not set
# CONFIG_SND_DARLA24 is not set
# CONFIG_SND_GINA24 is not set
# CONFIG_SND_LAYLA24 is not set
# CONFIG_SND_MONA is not set
# CONFIG_SND_MIA is not set
# CONFIG_SND_ECHO3G is not set
# CONFIG_SND_INDIGO is not set
# CONFIG_SND_INDIGOIO is not set
# CONFIG_SND_INDIGODJ is not set
# CONFIG_SND_INDIGOIOX is not set
# CONFIG_SND_INDIGODJX is not set
# CONFIG_SND_EMU10K1 is not set
# CONFIG_SND_EMU10K1X is not set
# CONFIG_SND_ENS1370 is not set
# CONFIG_SND_ENS1371 is not set
# CONFIG_SND_ES1938 is not set
# CONFIG_SND_ES1968 is not set
# CONFIG_SND_FM801 is not set
# CONFIG_SND_HDSP is not set
# CONFIG_SND_HDSPM is not set
# CONFIG_SND_ICE1712 is not set
# CONFIG_SND_ICE1724 is not set
# CONFIG_SND_INTEL8X0 is not set
# CONFIG_SND_INTEL8X0M is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_LOLA is not set
# CONFIG_SND_LX6464ES is not set
# CONFIG_SND_MAESTRO3 is not set
# CONFIG_SND_MIXART is not set
# CONFIG_SND_NM256 is not set
# CONFIG_SND_PCXHR is not set
# CONFIG_SND_RIPTIDE is not set
# CONFIG_SND_RME32 is not set
# CONFIG_SND_RME96 is not set
# CONFIG_SND_RME9652 is not set
# CONFIG_SND_SE6X is not set
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SND_TRIDENT is not set
# CONFIG_SND_VIA82XX is not set
# CONFIG_SND_VIA82XX_MODEM is not set
# CONFIG_SND_VIRTUOSO is not set
# CONFIG_SND_VX222 is not set
# CONFIG_SND_YMFPCI is not set

#
# HD-Audio
#
CONFIG_SND_HDA=y
CONFIG_SND_HDA_HWDEP=y
CONFIG_SND_HDA_RECONFIG=y
CONFIG_SND_HDA_INPUT_BEEP=y
CONFIG_SND_HDA_INPUT_BEEP_MODE=1
CONFIG_SND_HDA_PATCH_LOADER=y
CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
# CONFIG_SND_HDA_CTL_DEV_ID is not set
CONFIG_SND_HDA_PREALLOC_SIZE=0
CONFIG_SND_HDA_INTEL=y
# CONFIG_SND_HDA_ACPI is not set
CONFIG_SND_HDA_GENERIC_LEDS=y
CONFIG_SND_HDA_CODEC_ANALOG=y
CONFIG_SND_HDA_CODEC_SIGMATEL=y
CONFIG_SND_HDA_CODEC_VIA=y
CONFIG_SND_HDA_CODEC_CONEXANT=y
# CONFIG_SND_HDA_CODEC_SENARYTECH is not set
CONFIG_SND_HDA_CODEC_CA0110=y
CONFIG_SND_HDA_CODEC_CA0132=y
# CONFIG_SND_HDA_CODEC_CA0132_DSP is not set
CONFIG_SND_HDA_CODEC_CMEDIA=y
# CONFIG_SND_HDA_CODEC_CM9825 is not set
CONFIG_SND_HDA_CODEC_SI3054=y
CONFIG_SND_HDA_GENERIC=y
CONFIG_SND_HDA_CODEC_REALTEK=y
# CONFIG_SND_HDA_CODEC_ALC260 is not set
# CONFIG_SND_HDA_CODEC_ALC262 is not set
# CONFIG_SND_HDA_CODEC_ALC268 is not set
# CONFIG_SND_HDA_CODEC_ALC269 is not set
# CONFIG_SND_HDA_CODEC_ALC662 is not set
# CONFIG_SND_HDA_CODEC_ALC680 is not set
# CONFIG_SND_HDA_CODEC_ALC861 is not set
# CONFIG_SND_HDA_CODEC_ALC861VD is not set
# CONFIG_SND_HDA_CODEC_ALC880 is not set
# CONFIG_SND_HDA_CODEC_ALC882 is not set
CONFIG_SND_HDA_CODEC_CIRRUS=y
# CONFIG_SND_HDA_CODEC_CS420X is not set
# CONFIG_SND_HDA_CODEC_CS421X is not set
# CONFIG_SND_HDA_CODEC_CS8409 is not set
CONFIG_SND_HDA_CODEC_HDMI=y
# CONFIG_SND_HDA_CODEC_HDMI_GENERIC is not set
# CONFIG_SND_HDA_CODEC_HDMI_SIMPLE is not set
# CONFIG_SND_HDA_CODEC_HDMI_INTEL is not set
# CONFIG_SND_HDA_CODEC_HDMI_ATI is not set
# CONFIG_SND_HDA_CODEC_HDMI_NVIDIA is not set
# CONFIG_SND_HDA_CODEC_HDMI_NVIDIA_MCP is not set
# CONFIG_SND_HDA_CODEC_HDMI_TEGRA is not set
# CONFIG_SND_HDA_SCODEC_CS35L56_I2C is not set
# CONFIG_SND_HDA_SCODEC_CS35L56_SPI is not set
CONFIG_SND_HDA_CORE=y
CONFIG_SND_INTEL_NHLT=y
CONFIG_SND_INTEL_DSP_CONFIG=y
CONFIG_SND_INTEL_SOUNDWIRE_ACPI=y
# end of HD-Audio

# CONFIG_SND_SPI is not set
CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
CONFIG_SND_USB_AUDIO_MIDI_V2=y
CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y
CONFIG_SND_USB_UA101=y
CONFIG_SND_USB_USX2Y=y
CONFIG_SND_USB_CAIAQ=y
CONFIG_SND_USB_CAIAQ_INPUT=y
CONFIG_SND_USB_US122L=y
# CONFIG_SND_USB_US144MKII is not set
CONFIG_SND_USB_6FIRE=y
CONFIG_SND_USB_HIFACE=y
CONFIG_SND_BCD2000=y
CONFIG_SND_USB_LINE6=y
CONFIG_SND_USB_POD=y
CONFIG_SND_USB_PODHD=y
CONFIG_SND_USB_TONEPORT=y
CONFIG_SND_USB_VARIAX=y
# CONFIG_SND_FIREWIRE is not set
CONFIG_SND_PCMCIA=y
# CONFIG_SND_VXPOCKET is not set
# CONFIG_SND_PDAUDIOCF is not set
CONFIG_SND_SOC=y
# CONFIG_SND_SOC_USB is not set

#
# Analog Devices
#
# CONFIG_SND_SOC_ADI_AXI_I2S is not set
# CONFIG_SND_SOC_ADI_AXI_SPDIF is not set
# end of Analog Devices

#
# AMD
#
# CONFIG_SND_SOC_AMD_ACP is not set
# CONFIG_SND_SOC_AMD_ACP3x is not set
# CONFIG_SND_SOC_AMD_RENOIR is not set
# CONFIG_SND_SOC_AMD_ACP5x is not set
# CONFIG_SND_SOC_AMD_ACP6x is not set
# CONFIG_SND_AMD_ACP_CONFIG is not set
# CONFIG_SND_SOC_AMD_ACP_COMMON is not set
# end of AMD

#
# Apple
#
# end of Apple

#
# Atmel
#
# CONFIG_SND_SOC_MIKROE_PROTO is not set
# end of Atmel

#
# Au1x
#
# end of Au1x

#
# Broadcom
#
# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set
# end of Broadcom

#
# Cirrus Logic
#
# end of Cirrus Logic

#
# DesignWare
#
# CONFIG_SND_DESIGNWARE_I2S is not set
# end of DesignWare

#
# Freescale
#

#
# Common SoC Audio options for Freescale CPUs:
#
# CONFIG_SND_SOC_FSL_ASRC is not set
# CONFIG_SND_SOC_FSL_SAI is not set
# CONFIG_SND_SOC_FSL_AUDMIX is not set
# CONFIG_SND_SOC_FSL_SSI is not set
# CONFIG_SND_SOC_FSL_SPDIF is not set
# CONFIG_SND_SOC_FSL_ESAI is not set
# CONFIG_SND_SOC_FSL_MICFIL is not set
# CONFIG_SND_SOC_FSL_XCVR is not set
# CONFIG_SND_SOC_IMX_AUDMUX is not set
# end of Freescale

#
# Google
#
# CONFIG_SND_SOC_CHV3_I2S is not set
# end of Google

#
# Hisilicon
#
# CONFIG_SND_I2S_HI6210_I2S is not set
# end of Hisilicon

#
# JZ4740
#
# end of JZ4740

#
# Kirkwood
#
# end of Kirkwood

#
# Loongson
#
# end of Loongson

#
# Intel
#
# CONFIG_SND_SOC_INTEL_SST_TOPLEVEL is not set
# CONFIG_SND_SOC_INTEL_AVS is not set
# end of Intel

#
# Mediatek
#
# CONFIG_SND_SOC_MTK_BTCVSD is not set
# end of Mediatek

#
# PXA
#
# end of PXA

#
# SoundWire (SDCA)
#
CONFIG_SND_SOC_SDCA_OPTIONAL=y
# end of SoundWire (SDCA)

#
# ST SPEAr
#
# end of ST SPEAr

#
# Spreadtrum
#
# end of Spreadtrum

#
# STMicroelectronics STM32
#
# end of STMicroelectronics STM32

#
# Tegra
#
# end of Tegra

#
# Xilinx
#
# CONFIG_SND_SOC_XILINX_I2S is not set
# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set
# CONFIG_SND_SOC_XILINX_SPDIF is not set
# end of Xilinx

#
# Xtensa
#
# CONFIG_SND_SOC_XTFPGA_I2S is not set
# end of Xtensa

# CONFIG_SND_SOC_SOF_TOPLEVEL is not set
CONFIG_SND_SOC_I2C_AND_SPI=y

#
# CODEC drivers
#
# CONFIG_SND_SOC_AC97_CODEC is not set
# CONFIG_SND_SOC_ADAU1372_I2C is not set
# CONFIG_SND_SOC_ADAU1372_SPI is not set
# CONFIG_SND_SOC_ADAU1373 is not set
# CONFIG_SND_SOC_ADAU1701 is not set
# CONFIG_SND_SOC_ADAU1761_I2C is not set
# CONFIG_SND_SOC_ADAU1761_SPI is not set
# CONFIG_SND_SOC_ADAU7002 is not set
# CONFIG_SND_SOC_ADAU7118_HW is not set
# CONFIG_SND_SOC_ADAU7118_I2C is not set
# CONFIG_SND_SOC_AK4104 is not set
# CONFIG_SND_SOC_AK4118 is not set
# CONFIG_SND_SOC_AK4375 is not set
# CONFIG_SND_SOC_AK4458 is not set
# CONFIG_SND_SOC_AK4554 is not set
# CONFIG_SND_SOC_AK4613 is not set
# CONFIG_SND_SOC_AK4619 is not set
# CONFIG_SND_SOC_AK4642 is not set
# CONFIG_SND_SOC_AK5386 is not set
# CONFIG_SND_SOC_AK5558 is not set
# CONFIG_SND_SOC_ALC5623 is not set
# CONFIG_SND_SOC_AUDIO_IIO_AUX is not set
# CONFIG_SND_SOC_AW8738 is not set
# CONFIG_SND_SOC_AW88395 is not set
# CONFIG_SND_SOC_AW88166 is not set
# CONFIG_SND_SOC_AW88261 is not set
# CONFIG_SND_SOC_AW88081 is not set
# CONFIG_SND_SOC_AW87390 is not set
# CONFIG_SND_SOC_AW88399 is not set
# CONFIG_SND_SOC_BD28623 is not set
# CONFIG_SND_SOC_BT_SCO is not set
# CONFIG_SND_SOC_CHV3_CODEC is not set
# CONFIG_SND_SOC_CS35L32 is not set
# CONFIG_SND_SOC_CS35L33 is not set
# CONFIG_SND_SOC_CS35L34 is not set
# CONFIG_SND_SOC_CS35L35 is not set
# CONFIG_SND_SOC_CS35L36 is not set
# CONFIG_SND_SOC_CS35L41_SPI is not set
# CONFIG_SND_SOC_CS35L41_I2C is not set
# CONFIG_SND_SOC_CS35L45_SPI is not set
# CONFIG_SND_SOC_CS35L45_I2C is not set
# CONFIG_SND_SOC_CS35L56_I2C is not set
# CONFIG_SND_SOC_CS35L56_SPI is not set
# CONFIG_SND_SOC_CS35L56_SDW is not set
# CONFIG_SND_SOC_CS42L42 is not set
# CONFIG_SND_SOC_CS42L42_SDW is not set
# CONFIG_SND_SOC_CS42L51_I2C is not set
# CONFIG_SND_SOC_CS42L52 is not set
# CONFIG_SND_SOC_CS42L56 is not set
# CONFIG_SND_SOC_CS42L73 is not set
# CONFIG_SND_SOC_CS42L83 is not set
# CONFIG_SND_SOC_CS42L84 is not set
# CONFIG_SND_SOC_CS4234 is not set
# CONFIG_SND_SOC_CS4265 is not set
# CONFIG_SND_SOC_CS4270 is not set
# CONFIG_SND_SOC_CS4271_I2C is not set
# CONFIG_SND_SOC_CS4271_SPI is not set
# CONFIG_SND_SOC_CS42XX8_I2C is not set
# CONFIG_SND_SOC_CS43130 is not set
# CONFIG_SND_SOC_CS4341 is not set
# CONFIG_SND_SOC_CS4349 is not set
# CONFIG_SND_SOC_CS48L32 is not set
# CONFIG_SND_SOC_CS53L30 is not set
# CONFIG_SND_SOC_CS530X_I2C is not set
# CONFIG_SND_SOC_CS530X_SPI is not set
# CONFIG_SND_SOC_CX2072X is not set
# CONFIG_SND_SOC_DA7213 is not set
# CONFIG_SND_SOC_DMIC is not set
# CONFIG_SND_SOC_ES7134 is not set
# CONFIG_SND_SOC_ES7241 is not set
# CONFIG_SND_SOC_ES8311 is not set
# CONFIG_SND_SOC_ES8316 is not set
# CONFIG_SND_SOC_ES8323 is not set
# CONFIG_SND_SOC_ES8326 is not set
# CONFIG_SND_SOC_ES8328_I2C is not set
# CONFIG_SND_SOC_ES8328_SPI is not set
# CONFIG_SND_SOC_ES8375 is not set
# CONFIG_SND_SOC_ES8389 is not set
# CONFIG_SND_SOC_FS210X is not set
# CONFIG_SND_SOC_GTM601 is not set
# CONFIG_SND_SOC_HDA is not set
# CONFIG_SND_SOC_ICS43432 is not set
# CONFIG_SND_SOC_IDT821034 is not set
# CONFIG_SND_SOC_MAX98088 is not set
# CONFIG_SND_SOC_MAX98090 is not set
# CONFIG_SND_SOC_MAX98357A is not set
# CONFIG_SND_SOC_MAX98504 is not set
# CONFIG_SND_SOC_MAX9867 is not set
# CONFIG_SND_SOC_MAX98927 is not set
# CONFIG_SND_SOC_MAX98520 is not set
# CONFIG_SND_SOC_MAX98363 is not set
# CONFIG_SND_SOC_MAX98373_I2C is not set
# CONFIG_SND_SOC_MAX98373_SDW is not set
# CONFIG_SND_SOC_MAX98388 is not set
# CONFIG_SND_SOC_MAX98390 is not set
# CONFIG_SND_SOC_MAX98396 is not set
# CONFIG_SND_SOC_MAX9860 is not set
# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set
# CONFIG_SND_SOC_PCM1681 is not set
# CONFIG_SND_SOC_PCM1754 is not set
# CONFIG_SND_SOC_PCM1789_I2C is not set
# CONFIG_SND_SOC_PCM179X_I2C is not set
# CONFIG_SND_SOC_PCM179X_SPI is not set
# CONFIG_SND_SOC_PCM186X_I2C is not set
# CONFIG_SND_SOC_PCM186X_SPI is not set
# CONFIG_SND_SOC_PCM3060_I2C is not set
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
# CONFIG_SND_SOC_PCM5102A is not set
# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_PCM512x_SPI is not set
# CONFIG_SND_SOC_PCM6240 is not set
# CONFIG_SND_SOC_PEB2466 is not set
# CONFIG_SND_SOC_PM4125_SDW is not set
# CONFIG_SND_SOC_RT1017_SDCA_SDW is not set
# CONFIG_SND_SOC_RT1308_SDW is not set
# CONFIG_SND_SOC_RT1316_SDW is not set
# CONFIG_SND_SOC_RT1318_SDW is not set
# CONFIG_SND_SOC_RT1320_SDW is not set
# CONFIG_SND_SOC_RT5575 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
# CONFIG_SND_SOC_RT5640 is not set
# CONFIG_SND_SOC_RT5659 is not set
# CONFIG_SND_SOC_RT5682_SDW is not set
# CONFIG_SND_SOC_RT700_SDW is not set
# CONFIG_SND_SOC_RT711_SDW is not set
# CONFIG_SND_SOC_RT711_SDCA_SDW is not set
# CONFIG_SND_SOC_RT712_SDCA_SDW is not set
# CONFIG_SND_SOC_RT712_SDCA_DMIC_SDW is not set
# CONFIG_SND_SOC_RT721_SDCA_SDW is not set
# CONFIG_SND_SOC_RT722_SDCA_SDW is not set
# CONFIG_SND_SOC_RT715_SDW is not set
# CONFIG_SND_SOC_RT715_SDCA_SDW is not set
# CONFIG_SND_SOC_RT9120 is not set
# CONFIG_SND_SOC_RT9123 is not set
# CONFIG_SND_SOC_RT9123P is not set
# CONFIG_SND_SOC_RTQ9124 is not set
# CONFIG_SND_SOC_RTQ9128 is not set
# CONFIG_SND_SOC_SDW_MOCKUP is not set
# CONFIG_SND_SOC_SGTL5000 is not set
# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set
# CONFIG_SND_SOC_SIMPLE_MUX is not set
# CONFIG_SND_SOC_SMA1303 is not set
# CONFIG_SND_SOC_SMA1307 is not set
# CONFIG_SND_SOC_SPDIF is not set
# CONFIG_SND_SOC_SRC4XXX_I2C is not set
# CONFIG_SND_SOC_SSM2305 is not set
# CONFIG_SND_SOC_SSM2518 is not set
# CONFIG_SND_SOC_SSM2602_SPI is not set
# CONFIG_SND_SOC_SSM2602_I2C is not set
# CONFIG_SND_SOC_SSM3515 is not set
# CONFIG_SND_SOC_SSM4567 is not set
# CONFIG_SND_SOC_STA32X is not set
# CONFIG_SND_SOC_STA350 is not set
# CONFIG_SND_SOC_STI_SAS is not set
# CONFIG_SND_SOC_TAS2552 is not set
# CONFIG_SND_SOC_TAS2562 is not set
# CONFIG_SND_SOC_TAS2764 is not set
# CONFIG_SND_SOC_TAS2770 is not set
# CONFIG_SND_SOC_TAS2780 is not set
# CONFIG_SND_SOC_TAS2781_I2C is not set
# CONFIG_SND_SOC_TAS5086 is not set
# CONFIG_SND_SOC_TAS571X is not set
# CONFIG_SND_SOC_TAS5720 is not set
# CONFIG_SND_SOC_TAS5805M is not set
# CONFIG_SND_SOC_TAS6424 is not set
# CONFIG_SND_SOC_TDA7419 is not set
# CONFIG_SND_SOC_TFA9879 is not set
# CONFIG_SND_SOC_TFA989X is not set
# CONFIG_SND_SOC_TLV320ADC3XXX is not set
# CONFIG_SND_SOC_TLV320AIC23_I2C is not set
# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
# CONFIG_SND_SOC_TLV320AIC31XX is not set
# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set
# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set
# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set
# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set
# CONFIG_SND_SOC_TLV320ADCX140 is not set
# CONFIG_SND_SOC_TS3A227E is not set
# CONFIG_SND_SOC_TSCS42XX is not set
# CONFIG_SND_SOC_TSCS454 is not set
# CONFIG_SND_SOC_UDA1334 is not set
# CONFIG_SND_SOC_UDA1342 is not set
# CONFIG_SND_SOC_UDA1380 is not set
# CONFIG_SND_SOC_WCD937X_SDW is not set
# CONFIG_SND_SOC_WCD938X_SDW is not set
# CONFIG_SND_SOC_WCD939X_SDW is not set
# CONFIG_SND_SOC_WM8510 is not set
# CONFIG_SND_SOC_WM8523 is not set
# CONFIG_SND_SOC_WM8524 is not set
# CONFIG_SND_SOC_WM8580 is not set
# CONFIG_SND_SOC_WM8711 is not set
# CONFIG_SND_SOC_WM8728 is not set
# CONFIG_SND_SOC_WM8731_I2C is not set
# CONFIG_SND_SOC_WM8731_SPI is not set
# CONFIG_SND_SOC_WM8737 is not set
# CONFIG_SND_SOC_WM8741 is not set
# CONFIG_SND_SOC_WM8750 is not set
# CONFIG_SND_SOC_WM8753 is not set
# CONFIG_SND_SOC_WM8770 is not set
# CONFIG_SND_SOC_WM8776 is not set
# CONFIG_SND_SOC_WM8782 is not set
# CONFIG_SND_SOC_WM8804_I2C is not set
# CONFIG_SND_SOC_WM8804_SPI is not set
# CONFIG_SND_SOC_WM8903 is not set
# CONFIG_SND_SOC_WM8904 is not set
# CONFIG_SND_SOC_WM8940 is not set
# CONFIG_SND_SOC_WM8960 is not set
# CONFIG_SND_SOC_WM8961 is not set
# CONFIG_SND_SOC_WM8962 is not set
# CONFIG_SND_SOC_WM8974 is not set
# CONFIG_SND_SOC_WM8978 is not set
# CONFIG_SND_SOC_WM8985 is not set
# CONFIG_SND_SOC_WSA881X is not set
# CONFIG_SND_SOC_WSA883X is not set
# CONFIG_SND_SOC_WSA884X is not set
# CONFIG_SND_SOC_ZL38060 is not set
# CONFIG_SND_SOC_MAX9759 is not set
# CONFIG_SND_SOC_MT6351 is not set
# CONFIG_SND_SOC_MT6357 is not set
# CONFIG_SND_SOC_MT6358 is not set
# CONFIG_SND_SOC_MT6660 is not set
# CONFIG_SND_SOC_NAU8315 is not set
# CONFIG_SND_SOC_NAU8325 is not set
# CONFIG_SND_SOC_NAU8540 is not set
# CONFIG_SND_SOC_NAU8810 is not set
# CONFIG_SND_SOC_NAU8821 is not set
# CONFIG_SND_SOC_NAU8822 is not set
# CONFIG_SND_SOC_NAU8824 is not set
# CONFIG_SND_SOC_NTP8918 is not set
# CONFIG_SND_SOC_NTP8835 is not set
# CONFIG_SND_SOC_TPA6130A2 is not set
# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set
# CONFIG_SND_SOC_LPASS_VA_MACRO is not set
# CONFIG_SND_SOC_LPASS_RX_MACRO is not set
# CONFIG_SND_SOC_LPASS_TX_MACRO is not set
# end of CODEC drivers

#
# Generic drivers
#
# CONFIG_SND_SIMPLE_CARD is not set
# CONFIG_SND_AUDIO_GRAPH_CARD is not set
# CONFIG_SND_AUDIO_GRAPH_CARD2 is not set
# CONFIG_SND_TEST_COMPONENT is not set
# end of Generic drivers

CONFIG_SND_X86=y
CONFIG_SND_VIRTIO=y
CONFIG_HID_SUPPORT=y
CONFIG_HID=y
CONFIG_HID_BATTERY_STRENGTH=y
CONFIG_HIDRAW=y
CONFIG_UHID=y
CONFIG_HID_GENERIC=y
CONFIG_HID_HAPTIC=y

#
# Special HID drivers
#
CONFIG_HID_A4TECH=y
CONFIG_HID_ACCUTOUCH=y
CONFIG_HID_ACRUX=y
CONFIG_HID_ACRUX_FF=y
CONFIG_HID_APPLE=y
CONFIG_HID_APPLEIR=y
# CONFIG_HID_APPLETB_BL is not set
# CONFIG_HID_APPLETB_KBD is not set
CONFIG_HID_ASUS=y
CONFIG_HID_AUREAL=y
CONFIG_HID_BELKIN=y
CONFIG_HID_BETOP_FF=y
CONFIG_HID_BIGBEN_FF=y
CONFIG_HID_CHERRY=y
CONFIG_HID_CHICONY=y
CONFIG_HID_CORSAIR=y
CONFIG_HID_COUGAR=y
CONFIG_HID_MACALLY=y
CONFIG_HID_PRODIKEYS=y
CONFIG_HID_CMEDIA=y
CONFIG_HID_CP2112=y
CONFIG_HID_CREATIVE_SB0540=y
CONFIG_HID_CYPRESS=y
CONFIG_HID_DRAGONRISE=y
CONFIG_DRAGONRISE_FF=y
CONFIG_HID_EMS_FF=y
CONFIG_HID_ELAN=y
CONFIG_HID_ELECOM=y
CONFIG_HID_ELO=y
CONFIG_HID_EVISION=y
CONFIG_HID_EZKEY=y
CONFIG_HID_FT260=y
CONFIG_HID_GEMBIRD=y
CONFIG_HID_GFRM=y
CONFIG_HID_GLORIOUS=y
CONFIG_HID_HOLTEK=y
CONFIG_HOLTEK_FF=y
CONFIG_HID_VIVALDI_COMMON=y
# CONFIG_HID_GOODIX_SPI is not set
CONFIG_HID_GOOGLE_STADIA_FF=y
CONFIG_HID_VIVALDI=y
CONFIG_HID_GT683R=y
CONFIG_HID_KEYTOUCH=y
CONFIG_HID_KYE=y
# CONFIG_HID_KYSONA is not set
CONFIG_HID_UCLOGIC=y
CONFIG_HID_WALTOP=y
CONFIG_HID_VIEWSONIC=y
CONFIG_HID_VRC2=y
CONFIG_HID_XIAOMI=y
CONFIG_HID_GYRATION=y
CONFIG_HID_ICADE=y
CONFIG_HID_ITE=y
CONFIG_HID_JABRA=y
CONFIG_HID_TWINHAN=y
CONFIG_HID_KENSINGTON=y
CONFIG_HID_LCPOWER=y
CONFIG_HID_LED=y
CONFIG_HID_LENOVO=y
# CONFIG_HID_LENOVO_GO is not set
# CONFIG_HID_LENOVO_GO_S is not set
CONFIG_HID_LETSKETCH=y
CONFIG_HID_LOGITECH=y
CONFIG_HID_LOGITECH_DJ=y
CONFIG_HID_LOGITECH_HIDPP=y
CONFIG_LOGITECH_FF=y
CONFIG_LOGIRUMBLEPAD2_FF=y
CONFIG_LOGIG940_FF=y
CONFIG_LOGIWHEELS_FF=y
CONFIG_HID_MAGICMOUSE=y
CONFIG_HID_MALTRON=y
CONFIG_HID_MAYFLASH=y
CONFIG_HID_MEGAWORLD_FF=y
CONFIG_HID_REDRAGON=y
CONFIG_HID_MICROSOFT=y
CONFIG_HID_MONTEREY=y
CONFIG_HID_MULTITOUCH=y
CONFIG_HID_NINTENDO=y
CONFIG_NINTENDO_FF=y
CONFIG_HID_NTI=y
CONFIG_HID_NTRIG=y
CONFIG_HID_NVIDIA_SHIELD=y
CONFIG_NVIDIA_SHIELD_FF=y
CONFIG_HID_ORTEK=y
CONFIG_HID_PANTHERLORD=y
CONFIG_PANTHERLORD_FF=y
CONFIG_HID_PENMOUNT=y
CONFIG_HID_PETALYNX=y
CONFIG_HID_PICOLCD=y
CONFIG_HID_PICOLCD_FB=y
CONFIG_HID_PICOLCD_BACKLIGHT=y
CONFIG_HID_PICOLCD_LCD=y
CONFIG_HID_PICOLCD_LEDS=y
CONFIG_HID_PICOLCD_CIR=y
CONFIG_HID_PLANTRONICS=y
CONFIG_HID_PLAYSTATION=y
CONFIG_PLAYSTATION_FF=y
CONFIG_HID_PXRC=y
# CONFIG_HID_RAPOO is not set
CONFIG_HID_RAZER=y
CONFIG_HID_PRIMAX=y
CONFIG_HID_RETRODE=y
CONFIG_HID_ROCCAT=y
CONFIG_HID_SAITEK=y
CONFIG_HID_SAMSUNG=y
CONFIG_HID_SEMITEK=y
CONFIG_HID_SIGMAMICRO=y
CONFIG_HID_SONY=y
CONFIG_SONY_FF=y
CONFIG_HID_SPEEDLINK=y
CONFIG_HID_STEAM=y
CONFIG_STEAM_FF=y
CONFIG_HID_STEELSERIES=y
CONFIG_HID_SUNPLUS=y
CONFIG_HID_RMI=y
CONFIG_HID_GREENASIA=y
CONFIG_GREENASIA_FF=y
CONFIG_HID_SMARTJOYPLUS=y
CONFIG_SMARTJOYPLUS_FF=y
CONFIG_HID_TIVO=y
CONFIG_HID_TOPSEED=y
CONFIG_HID_TOPRE=y
CONFIG_HID_THINGM=y
CONFIG_HID_THRUSTMASTER=y
CONFIG_THRUSTMASTER_FF=y
CONFIG_HID_UDRAW_PS3=y
CONFIG_HID_U2FZERO=y
# CONFIG_HID_UNIVERSAL_PIDFF is not set
CONFIG_HID_WACOM=y
CONFIG_HID_WIIMOTE=y
# CONFIG_HID_WINWING is not set
CONFIG_HID_XINMO=y
CONFIG_HID_ZEROPLUS=y
CONFIG_ZEROPLUS_FF=y
CONFIG_HID_ZYDACRON=y
CONFIG_HID_SENSOR_HUB=y
CONFIG_HID_SENSOR_CUSTOM_SENSOR=y
CONFIG_HID_ALPS=y
CONFIG_HID_MCP2200=y
CONFIG_HID_MCP2221=y
# CONFIG_HID_HUAWEI is not set
# end of Special HID drivers

#
# HID-BPF support
#
# end of HID-BPF support

CONFIG_I2C_HID=y
CONFIG_I2C_HID_ACPI=y
CONFIG_I2C_HID_OF=y
# CONFIG_I2C_HID_OF_ELAN is not set
# CONFIG_I2C_HID_OF_GOODIX is not set
CONFIG_I2C_HID_CORE=y

#
# Intel ISH HID support
#
CONFIG_INTEL_ISH_HID=y
CONFIG_INTEL_ISH_FIRMWARE_DOWNLOADER=y
# end of Intel ISH HID support

#
# AMD SFH HID Support
#
CONFIG_AMD_SFH_HID=y
# end of AMD SFH HID Support

#
# Surface System Aggregator Module HID support
#
CONFIG_SURFACE_HID=y
CONFIG_SURFACE_KBD=y
# end of Surface System Aggregator Module HID support

CONFIG_SURFACE_HID_CORE=y

#
# Intel THC HID Support
#
# CONFIG_INTEL_THC_HID is not set
# end of Intel THC HID Support

#
# USB HID support
#
CONFIG_USB_HID=y
CONFIG_HID_PID=y
CONFIG_USB_HIDDEV=y
# end of USB HID support

CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
CONFIG_USB_LED_TRIG=y
CONFIG_USB_ULPI_BUS=y
CONFIG_USB_CONN_GPIO=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
CONFIG_USB_PCI=y
CONFIG_USB_PCI_AMD=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y

#
# Miscellaneous USB options
#
CONFIG_USB_DEFAULT_PERSIST=y
CONFIG_USB_FEW_INIT_RETRIES=y
CONFIG_USB_DYNAMIC_MINORS=y
CONFIG_USB_OTG=y
# CONFIG_USB_OTG_PRODUCTLIST is not set
# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set
CONFIG_USB_OTG_FSM=y
CONFIG_USB_LEDS_TRIGGER_USBPORT=y
CONFIG_USB_AUTOSUSPEND_DELAY=2
CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1
CONFIG_USB_MON=y

#
# USB Host Controller Drivers
#
CONFIG_USB_C67X00_HCD=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_DBGCAP=y
CONFIG_USB_XHCI_PCI=y
CONFIG_USB_XHCI_PCI_RENESAS=y
CONFIG_USB_XHCI_PLATFORM=y
# CONFIG_USB_XHCI_SIDEBAND is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_PCI=y
CONFIG_USB_EHCI_FSL=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OXU210HP_HCD=y
CONFIG_USB_ISP116X_HCD=y
CONFIG_USB_MAX3421_HCD=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PCI=y
# CONFIG_USB_OHCI_HCD_SSB is not set
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_UHCI_HCD=y
CONFIG_USB_SL811_HCD=y
CONFIG_USB_SL811_HCD_ISO=y
CONFIG_USB_SL811_CS=y
CONFIG_USB_R8A66597_HCD=y
CONFIG_USB_HCD_BCMA=y
CONFIG_USB_HCD_SSB=y
# CONFIG_USB_HCD_TEST_MODE is not set

#
# USB Device Class drivers
#
CONFIG_USB_ACM=y
CONFIG_USB_PRINTER=y
CONFIG_USB_WDM=y
CONFIG_USB_TMC=y

#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; see USB_STORAGE Help for more info
#
CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_DEBUG is not set
CONFIG_USB_STORAGE_REALTEK=y
CONFIG_REALTEK_AUTOPM=y
CONFIG_USB_STORAGE_DATAFAB=y
CONFIG_USB_STORAGE_FREECOM=y
CONFIG_USB_STORAGE_ISD200=y
CONFIG_USB_STORAGE_USBAT=y
CONFIG_USB_STORAGE_SDDR09=y
CONFIG_USB_STORAGE_SDDR55=y
CONFIG_USB_STORAGE_JUMPSHOT=y
CONFIG_USB_STORAGE_ALAUDA=y
CONFIG_USB_STORAGE_ONETOUCH=y
CONFIG_USB_STORAGE_KARMA=y
CONFIG_USB_STORAGE_CYPRESS_ATACB=y
CONFIG_USB_STORAGE_ENE_UB6250=y
CONFIG_USB_UAS=y

#
# USB Imaging devices
#
CONFIG_USB_MDC800=y
CONFIG_USB_MICROTEK=y
CONFIG_USBIP_CORE=y
CONFIG_USBIP_VHCI_HCD=y
CONFIG_USBIP_VHCI_HC_PORTS=8
CONFIG_USBIP_VHCI_NR_HCS=16
CONFIG_USBIP_HOST=y
CONFIG_USBIP_VUDC=y
# CONFIG_USBIP_DEBUG is not set

#
# USB dual-mode controller drivers
#
CONFIG_USB_CDNS_SUPPORT=y
CONFIG_USB_CDNS_HOST=y
CONFIG_USB_CDNS3=y
CONFIG_USB_CDNS3_GADGET=y
CONFIG_USB_CDNS3_HOST=y
CONFIG_USB_CDNS3_PCI_WRAP=y
CONFIG_USB_CDNSP_PCI=y
CONFIG_USB_CDNSP_GADGET=y
CONFIG_USB_CDNSP_HOST=y
CONFIG_USB_MUSB_HDRC=y
# CONFIG_USB_MUSB_HOST is not set
# CONFIG_USB_MUSB_GADGET is not set
CONFIG_USB_MUSB_DUAL_ROLE=y

#
# Platform Glue Layer
#

#
# MUSB DMA mode
#
CONFIG_MUSB_PIO_ONLY=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_ULPI=y
# CONFIG_USB_DWC3_HOST is not set
CONFIG_USB_DWC3_GADGET=y
# CONFIG_USB_DWC3_DUAL_ROLE is not set

#
# Platform Glue Driver Support
#
CONFIG_USB_DWC3_PCI=y
CONFIG_USB_DWC3_HAPS=y
CONFIG_USB_DWC3_OF_SIMPLE=y
CONFIG_USB_DWC3_GENERIC_PLAT=y
# CONFIG_USB_DWC3_GOOGLE is not set
CONFIG_USB_DWC2=y
CONFIG_USB_DWC2_HOST=y

#
# Gadget/Dual-role mode requires USB Gadget support to be enabled
#
# CONFIG_USB_DWC2_PERIPHERAL is not set
# CONFIG_USB_DWC2_DUAL_ROLE is not set
CONFIG_USB_DWC2_PCI=y
# CONFIG_USB_DWC2_DEBUG is not set
# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set
CONFIG_USB_CHIPIDEA=y
CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_USB_CHIPIDEA_PCI=y
CONFIG_USB_CHIPIDEA_MSM=y
CONFIG_USB_CHIPIDEA_NPCM=y
# CONFIG_USB_CHIPIDEA_IMX is not set
CONFIG_USB_CHIPIDEA_GENERIC=y
# CONFIG_USB_CHIPIDEA_TEGRA is not set
CONFIG_USB_ISP1760=y
CONFIG_USB_ISP1760_HCD=y
CONFIG_USB_ISP1761_UDC=y
# CONFIG_USB_ISP1760_HOST_ROLE is not set
# CONFIG_USB_ISP1760_GADGET_ROLE is not set
CONFIG_USB_ISP1760_DUAL_ROLE=y

#
# USB port drivers
#
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_CONSOLE=y
CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_SIMPLE=y
CONFIG_USB_SERIAL_AIRCABLE=y
CONFIG_USB_SERIAL_ARK3116=y
CONFIG_USB_SERIAL_BELKIN=y
CONFIG_USB_SERIAL_CH341=y
CONFIG_USB_SERIAL_WHITEHEAT=y
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=y
CONFIG_USB_SERIAL_CP210X=y
CONFIG_USB_SERIAL_CYPRESS_M8=y
CONFIG_USB_SERIAL_EMPEG=y
CONFIG_USB_SERIAL_FTDI_SIO=y
CONFIG_USB_SERIAL_VISOR=y
CONFIG_USB_SERIAL_IPAQ=y
CONFIG_USB_SERIAL_IR=y
CONFIG_USB_SERIAL_EDGEPORT=y
CONFIG_USB_SERIAL_EDGEPORT_TI=y
CONFIG_USB_SERIAL_F81232=y
CONFIG_USB_SERIAL_F8153X=y
CONFIG_USB_SERIAL_GARMIN=y
CONFIG_USB_SERIAL_IPW=y
CONFIG_USB_SERIAL_IUU=y
CONFIG_USB_SERIAL_KEYSPAN_PDA=y
CONFIG_USB_SERIAL_KEYSPAN=y
CONFIG_USB_SERIAL_KLSI=y
CONFIG_USB_SERIAL_KOBIL_SCT=y
CONFIG_USB_SERIAL_MCT_U232=y
CONFIG_USB_SERIAL_METRO=y
CONFIG_USB_SERIAL_MOS7720=y
CONFIG_USB_SERIAL_MOS7715_PARPORT=y
CONFIG_USB_SERIAL_MOS7840=y
CONFIG_USB_SERIAL_MXUPORT=y
CONFIG_USB_SERIAL_NAVMAN=y
CONFIG_USB_SERIAL_PL2303=y
CONFIG_USB_SERIAL_OTI6858=y
CONFIG_USB_SERIAL_QCAUX=y
CONFIG_USB_SERIAL_QUALCOMM=y
CONFIG_USB_SERIAL_SPCP8X5=y
CONFIG_USB_SERIAL_SAFE=y
# CONFIG_USB_SERIAL_SAFE_PADDED is not set
CONFIG_USB_SERIAL_SIERRAWIRELESS=y
CONFIG_USB_SERIAL_SYMBOL=y
CONFIG_USB_SERIAL_TI=y
CONFIG_USB_SERIAL_CYBERJACK=y
CONFIG_USB_SERIAL_WWAN=y
CONFIG_USB_SERIAL_OPTION=y
CONFIG_USB_SERIAL_OMNINET=y
CONFIG_USB_SERIAL_OPTICON=y
CONFIG_USB_SERIAL_XSENS_MT=y
CONFIG_USB_SERIAL_WISHBONE=y
CONFIG_USB_SERIAL_SSU100=y
CONFIG_USB_SERIAL_QT2=y
CONFIG_USB_SERIAL_UPD78F0730=y
CONFIG_USB_SERIAL_XR=y
CONFIG_USB_SERIAL_DEBUG=y

#
# USB Miscellaneous drivers
#
CONFIG_USB_USS720=y
CONFIG_USB_EMI62=y
CONFIG_USB_EMI26=y
CONFIG_USB_ADUTUX=y
CONFIG_USB_SEVSEG=y
CONFIG_USB_LEGOTOWER=y
CONFIG_USB_LCD=y
CONFIG_USB_CYPRESS_CY7C63=y
CONFIG_USB_CYTHERM=y
CONFIG_USB_IDMOUSE=y
CONFIG_USB_APPLEDISPLAY=y
CONFIG_APPLE_MFI_FASTCHARGE=y
CONFIG_USB_LJCA=y
# CONFIG_USB_USBIO is not set
CONFIG_USB_SISUSBVGA=y
CONFIG_USB_LD=y
CONFIG_USB_TRANCEVIBRATOR=y
CONFIG_USB_IOWARRIOR=y
CONFIG_USB_TEST=y
CONFIG_USB_EHSET_TEST_FIXTURE=y
CONFIG_USB_ISIGHTFW=y
CONFIG_USB_YUREX=y
CONFIG_USB_EZUSB_FX2=y
CONFIG_USB_HUB_USB251XB=y
CONFIG_USB_HSIC_USB3503=y
CONFIG_USB_HSIC_USB4604=y
CONFIG_USB_LINK_LAYER_TEST=y
CONFIG_USB_CHAOSKEY=y
# CONFIG_USB_ONBOARD_DEV is not set
CONFIG_USB_ATM=y
CONFIG_USB_SPEEDTOUCH=y
CONFIG_USB_CXACRU=y
CONFIG_USB_UEAGLEATM=y
CONFIG_USB_XUSBATM=y

#
# USB Physical Layer drivers
#
CONFIG_USB_PHY=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_TAHVO_USB=y
CONFIG_TAHVO_USB_HOST_BY_DEFAULT=y
CONFIG_USB_ISP1301=y
# end of USB Physical Layer drivers

CONFIG_USB_GADGET=y
# CONFIG_USB_GADGET_DEBUG is not set
CONFIG_USB_GADGET_DEBUG_FILES=y
CONFIG_USB_GADGET_DEBUG_FS=y
CONFIG_USB_GADGET_VBUS_DRAW=2
CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
CONFIG_U_SERIAL_CONSOLE=y

#
# USB Peripheral Controller
#
CONFIG_USB_GR_UDC=y
CONFIG_USB_R8A66597=y
CONFIG_USB_PXA27X=y
CONFIG_USB_SNP_CORE=y
# CONFIG_USB_SNP_UDC_PLAT is not set
# CONFIG_USB_M66592 is not set
CONFIG_USB_BDC_UDC=y
CONFIG_USB_AMD5536UDC=y
CONFIG_USB_NET2280=y
CONFIG_USB_GOKU=y
CONFIG_USB_EG20T=y
# CONFIG_USB_GADGET_XILINX is not set
CONFIG_USB_MAX3420_UDC=y
CONFIG_USB_CDNS2_UDC=y
CONFIG_USB_DUMMY_HCD=y
# end of USB Peripheral Controller

CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_F_ACM=y
CONFIG_USB_F_SS_LB=y
CONFIG_USB_U_SERIAL=y
CONFIG_USB_U_ETHER=y
CONFIG_USB_U_AUDIO=y
CONFIG_USB_F_SERIAL=y
CONFIG_USB_F_OBEX=y
CONFIG_USB_F_NCM=y
CONFIG_USB_F_ECM=y
CONFIG_USB_F_PHONET=y
CONFIG_USB_F_EEM=y
CONFIG_USB_F_SUBSET=y
CONFIG_USB_F_RNDIS=y
CONFIG_USB_F_MASS_STORAGE=y
CONFIG_USB_F_FS=y
CONFIG_USB_F_UAC1=y
CONFIG_USB_F_UAC1_LEGACY=y
CONFIG_USB_F_UAC2=y
CONFIG_USB_F_UVC=y
CONFIG_USB_F_MIDI=y
CONFIG_USB_F_MIDI2=y
CONFIG_USB_F_HID=y
CONFIG_USB_F_PRINTER=y
CONFIG_USB_F_TCM=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_OBEX=y
CONFIG_USB_CONFIGFS_NCM=y
CONFIG_USB_CONFIGFS_ECM=y
CONFIG_USB_CONFIGFS_ECM_SUBSET=y
CONFIG_USB_CONFIGFS_RNDIS=y
CONFIG_USB_CONFIGFS_EEM=y
CONFIG_USB_CONFIGFS_PHONET=y
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
CONFIG_USB_CONFIGFS_F_LB_SS=y
CONFIG_USB_CONFIGFS_F_FS=y
CONFIG_USB_CONFIGFS_F_UAC1=y
CONFIG_USB_CONFIGFS_F_UAC1_LEGACY=y
CONFIG_USB_CONFIGFS_F_UAC2=y
CONFIG_USB_CONFIGFS_F_MIDI=y
CONFIG_USB_CONFIGFS_F_MIDI2=y
CONFIG_USB_CONFIGFS_F_HID=y
CONFIG_USB_CONFIGFS_F_UVC=y
CONFIG_USB_CONFIGFS_F_PRINTER=y
CONFIG_USB_CONFIGFS_F_TCM=y

#
# USB Gadget precomposed configurations
#
# CONFIG_USB_ZERO is not set
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_ETH is not set
# CONFIG_USB_G_NCM is not set
CONFIG_USB_GADGETFS=y
# CONFIG_USB_FUNCTIONFS is not set
# CONFIG_USB_MASS_STORAGE is not set
# CONFIG_USB_GADGET_TARGET is not set
# CONFIG_USB_G_SERIAL is not set
# CONFIG_USB_MIDI_GADGET is not set
# CONFIG_USB_G_PRINTER is not set
# CONFIG_USB_CDC_COMPOSITE is not set
# CONFIG_USB_G_NOKIA is not set
# CONFIG_USB_G_ACM_MS is not set
# CONFIG_USB_G_MULTI is not set
# CONFIG_USB_G_HID is not set
# CONFIG_USB_G_DBGP is not set
# CONFIG_USB_G_WEBCAM is not set
CONFIG_USB_RAW_GADGET=y
# end of USB Gadget precomposed configurations

CONFIG_TYPEC=y
CONFIG_TYPEC_TCPM=y
CONFIG_TYPEC_TCPCI=y
CONFIG_TYPEC_RT1711H=y
CONFIG_TYPEC_MT6360=y
CONFIG_TYPEC_TCPCI_MT6370=y
CONFIG_TYPEC_TCPCI_MAXIM=y
CONFIG_TYPEC_FUSB302=y
CONFIG_TYPEC_WCOVE=y
CONFIG_TYPEC_UCSI=y
CONFIG_UCSI_CCG=y
CONFIG_UCSI_ACPI=y
CONFIG_UCSI_STM32G0=y
CONFIG_TYPEC_TPS6598X=y
CONFIG_TYPEC_ANX7411=y
CONFIG_TYPEC_RT1719=y
CONFIG_TYPEC_HD3SS3220=y
CONFIG_TYPEC_STUSB160X=y
CONFIG_TYPEC_WUSB3801=y

#
# USB Type-C Multiplexer/DeMultiplexer Switch support
#
CONFIG_TYPEC_MUX_FSA4480=y
CONFIG_TYPEC_MUX_GPIO_SBU=y
CONFIG_TYPEC_MUX_PI3USB30532=y
CONFIG_TYPEC_MUX_INTEL_PMC=y
# CONFIG_TYPEC_MUX_IT5205 is not set
CONFIG_TYPEC_MUX_NB7VPQ904M=y
# CONFIG_TYPEC_MUX_PS883X is not set
CONFIG_TYPEC_MUX_PTN36502=y
# CONFIG_TYPEC_MUX_TUSB1046 is not set
CONFIG_TYPEC_MUX_WCD939X_USBSS=y
# end of USB Type-C Multiplexer/DeMultiplexer Switch support

#
# USB Type-C Alternate Mode drivers
#
CONFIG_TYPEC_DP_ALTMODE=y
CONFIG_TYPEC_NVIDIA_ALTMODE=y
# CONFIG_TYPEC_TBT_ALTMODE is not set
# end of USB Type-C Alternate Mode drivers

CONFIG_USB_ROLE_SWITCH=y
CONFIG_USB_ROLES_INTEL_XHCI=y
CONFIG_MMC=y
# CONFIG_PWRSEQ_EMMC is not set
# CONFIG_PWRSEQ_SD8787 is not set
# CONFIG_PWRSEQ_SIMPLE is not set
# CONFIG_MMC_BLOCK is not set
# CONFIG_SDIO_UART is not set
# CONFIG_MMC_TEST is not set
# CONFIG_MMC_CRYPTO is not set

#
# MMC/SD/SDIO Host Controller Drivers
#
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_SDHCI is not set
# CONFIG_MMC_WBSD is not set
# CONFIG_MMC_TIFM_SD is not set
# CONFIG_MMC_SPI is not set
# CONFIG_MMC_SDRICOH_CS is not set
# CONFIG_MMC_CB710 is not set
# CONFIG_MMC_VIA_SDMMC is not set
CONFIG_MMC_VUB300=y
CONFIG_MMC_USHC=y
# CONFIG_MMC_USDHI6ROL0 is not set
CONFIG_MMC_REALTEK_USB=y
# CONFIG_MMC_CQHCI is not set
# CONFIG_MMC_HSQ is not set
# CONFIG_MMC_TOSHIBA_PCI is not set
# CONFIG_MMC_MTK is not set
# CONFIG_SCSI_UFSHCD is not set
CONFIG_MEMSTICK=y
# CONFIG_MEMSTICK_DEBUG is not set

#
# MemoryStick drivers
#
# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
# CONFIG_MSPRO_BLOCK is not set
# CONFIG_MS_BLOCK is not set

#
# MemoryStick Host Controller Drivers
#
# CONFIG_MEMSTICK_TIFM_MS is not set
# CONFIG_MEMSTICK_JMICRON_38X is not set
# CONFIG_MEMSTICK_R592 is not set
CONFIG_MEMSTICK_REALTEK_USB=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
# CONFIG_LEDS_CLASS_FLASH is not set
CONFIG_LEDS_CLASS_MULTICOLOR=y
# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set

#
# LED drivers
#
# CONFIG_LEDS_AN30259A is not set
# CONFIG_LEDS_APU is not set
# CONFIG_LEDS_OSRAM_AMS_AS3668 is not set
# CONFIG_LEDS_AW200XX is not set
# CONFIG_LEDS_AW2013 is not set
# CONFIG_LEDS_BCM6328 is not set
# CONFIG_LEDS_BCM6358 is not set
# CONFIG_LEDS_CHT_WCOVE is not set
# CONFIG_LEDS_CR0014114 is not set
# CONFIG_LEDS_EL15203000 is not set
# CONFIG_LEDS_LM3530 is not set
# CONFIG_LEDS_LM3532 is not set
# CONFIG_LEDS_LM3642 is not set
# CONFIG_LEDS_LM3692X is not set
# CONFIG_LEDS_PCA9532 is not set
# CONFIG_LEDS_GPIO is not set
# CONFIG_LEDS_LP3944 is not set
# CONFIG_LEDS_LP3952 is not set
# CONFIG_LEDS_LP50XX is not set
# CONFIG_LEDS_LP55XX_COMMON is not set
# CONFIG_LEDS_LP8860 is not set
# CONFIG_LEDS_LP8864 is not set
# CONFIG_LEDS_PCA955X is not set
# CONFIG_LEDS_PCA963X is not set
# CONFIG_LEDS_PCA995X is not set
# CONFIG_LEDS_DAC124S085 is not set
# CONFIG_LEDS_REGULATOR is not set
# CONFIG_LEDS_BD2606MVV is not set
# CONFIG_LEDS_BD2802 is not set
# CONFIG_LEDS_INTEL_SS4200 is not set
# CONFIG_LEDS_LT3593 is not set
# CONFIG_LEDS_TCA6507 is not set
# CONFIG_LEDS_TLC591XX is not set
# CONFIG_LEDS_LM355x is not set
# CONFIG_LEDS_IS31FL319X is not set
# CONFIG_LEDS_IS31FL32XX is not set

#
# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
#
# CONFIG_LEDS_BLINKM is not set
# CONFIG_LEDS_SYSCON is not set
# CONFIG_LEDS_MLXCPLD is not set
# CONFIG_LEDS_MLXREG is not set
# CONFIG_LEDS_USER is not set
# CONFIG_LEDS_NIC78BX is not set
# CONFIG_LEDS_SPI_BYTE is not set
# CONFIG_LEDS_LM3697 is not set
# CONFIG_LEDS_ST1202 is not set
# CONFIG_LEDS_LGM is not set

#
# Flash and Torch LED drivers
#

#
# RGB LED drivers
#
# CONFIG_LEDS_GROUP_MULTICOLOR is not set
# CONFIG_LEDS_KTD202X is not set
# CONFIG_LEDS_LP5812 is not set
# CONFIG_LEDS_NCP5623 is not set
# CONFIG_LEDS_MT6370_RGB is not set

#
# LED Triggers
#
CONFIG_LEDS_TRIGGERS=y
# CONFIG_LEDS_TRIGGER_TIMER is not set
# CONFIG_LEDS_TRIGGER_ONESHOT is not set
# CONFIG_LEDS_TRIGGER_DISK is not set
# CONFIG_LEDS_TRIGGER_MTD is not set
# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
# CONFIG_LEDS_TRIGGER_ACTIVITY is not set
# CONFIG_LEDS_TRIGGER_GPIO is not set
# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set

#
# iptables trigger is under Netfilter config (LED target)
#
# CONFIG_LEDS_TRIGGER_TRANSIENT is not set
# CONFIG_LEDS_TRIGGER_CAMERA is not set
# CONFIG_LEDS_TRIGGER_PANIC is not set
# CONFIG_LEDS_TRIGGER_NETDEV is not set
# CONFIG_LEDS_TRIGGER_PATTERN is not set
# CONFIG_LEDS_TRIGGER_TTY is not set
# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set

#
# Simatic LED drivers
#
# CONFIG_ACCESSIBILITY is not set
CONFIG_INFINIBAND=y
CONFIG_INFINIBAND_USER_MAD=y
CONFIG_INFINIBAND_USER_ACCESS=y
CONFIG_INFINIBAND_USER_MEM=y
CONFIG_INFINIBAND_ON_DEMAND_PAGING=y
CONFIG_INFINIBAND_ADDR_TRANS=y
CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y
CONFIG_INFINIBAND_VIRT_DMA=y
# CONFIG_INFINIBAND_EFA is not set
# CONFIG_INFINIBAND_ERDMA is not set
CONFIG_MLX4_INFINIBAND=y
# CONFIG_INFINIBAND_MTHCA is not set
# CONFIG_INFINIBAND_OCRDMA is not set
# CONFIG_INFINIBAND_USNIC is not set
# CONFIG_INFINIBAND_VMWARE_PVRDMA is not set
# CONFIG_INFINIBAND_RDMAVT is not set
CONFIG_RDMA_RXE=y
CONFIG_RDMA_SIW=y
CONFIG_INFINIBAND_IPOIB=y
CONFIG_INFINIBAND_IPOIB_CM=y
CONFIG_INFINIBAND_IPOIB_DEBUG=y
# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
CONFIG_INFINIBAND_SRP=y
# CONFIG_INFINIBAND_SRPT is not set
CONFIG_INFINIBAND_ISER=y
CONFIG_INFINIBAND_RTRS=y
CONFIG_INFINIBAND_RTRS_CLIENT=y
# CONFIG_INFINIBAND_RTRS_SERVER is not set
CONFIG_EDAC_ATOMIC_SCRUB=y
CONFIG_EDAC_SUPPORT=y
CONFIG_EDAC=y
# CONFIG_EDAC_DEBUG is not set
# CONFIG_EDAC_DECODE_MCE is not set
# CONFIG_EDAC_SCRUB is not set
# CONFIG_EDAC_ECS is not set
# CONFIG_EDAC_MEM_REPAIR is not set
# CONFIG_EDAC_E752X is not set
# CONFIG_EDAC_I82975X is not set
# CONFIG_EDAC_I3000 is not set
# CONFIG_EDAC_I3200 is not set
# CONFIG_EDAC_IE31200 is not set
# CONFIG_EDAC_X38 is not set
# CONFIG_EDAC_I5400 is not set
# CONFIG_EDAC_I7CORE is not set
# CONFIG_EDAC_I5100 is not set
# CONFIG_EDAC_I7300 is not set
# CONFIG_EDAC_SBRIDGE is not set
# CONFIG_EDAC_SKX is not set
# CONFIG_EDAC_I10NM is not set
# CONFIG_EDAC_IMH is not set
# CONFIG_EDAC_PND2 is not set
# CONFIG_EDAC_IGEN6 is not set
CONFIG_RTC_LIB=y
CONFIG_RTC_MC146818_LIB=y
CONFIG_RTC_CLASS=y
# CONFIG_RTC_HCTOSYS is not set
CONFIG_RTC_SYSTOHC=y
CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
# CONFIG_RTC_DEBUG is not set
# CONFIG_RTC_NVMEM is not set

#
# 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_MAX31335 is not set
# CONFIG_RTC_DRV_NCT3018Y 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_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_TWL4030 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_RX8111 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_SD2405AL is not set
# CONFIG_RTC_DRV_SD3078 is not set

#
# SPI RTC drivers
#
# CONFIG_RTC_DRV_M41T93 is not set
# CONFIG_RTC_DRV_M41T94 is not set
# CONFIG_RTC_DRV_DS1302 is not set
# CONFIG_RTC_DRV_DS1305 is not set
# CONFIG_RTC_DRV_DS1343 is not set
# CONFIG_RTC_DRV_DS1347 is not set
# CONFIG_RTC_DRV_DS1390 is not set
# CONFIG_RTC_DRV_MAX6916 is not set
# CONFIG_RTC_DRV_R9701 is not set
# CONFIG_RTC_DRV_RX4581 is not set
# CONFIG_RTC_DRV_RS5C348 is not set
# CONFIG_RTC_DRV_MAX6902 is not set
# CONFIG_RTC_DRV_PCF2123 is not set
# CONFIG_RTC_DRV_MCP795 is not set
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_PCF85063 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_RP5C01 is not set
# CONFIG_RTC_DRV_ZYNQMP is not set

#
# on-CPU RTC drivers
#
# CONFIG_RTC_DRV_CADENCE is not set
# CONFIG_RTC_DRV_FTRTC010 is not set
# CONFIG_RTC_DRV_R7301 is not set
# CONFIG_RTC_DRV_GOLDFISH is not set

#
# HID Sensor RTC drivers
#
CONFIG_RTC_DRV_HID_SENSOR_TIME=y
CONFIG_DMADEVICES=y
# CONFIG_DMADEVICES_DEBUG is not set

#
# DMA Devices
#
CONFIG_DMA_ENGINE=y
CONFIG_DMA_VIRTUAL_CHANNELS=y
CONFIG_DMA_ACPI=y
CONFIG_DMA_OF=y
# CONFIG_ALTERA_MSGDMA is not set
# CONFIG_DW_AXI_DMAC is not set
# CONFIG_FSL_EDMA is not set
CONFIG_INTEL_IDMA64=y
# CONFIG_INTEL_IDXD is not set
# CONFIG_INTEL_IDXD_COMPAT is not set
CONFIG_INTEL_IOATDMA=y
# CONFIG_PLX_DMA is not set
# CONFIG_SWITCHTEC_DMA is not set
# CONFIG_XILINX_DMA is not set
# CONFIG_XILINX_XDMA is not set
# CONFIG_XILINX_ZYNQMP_DPDMA is not set
# CONFIG_AMD_PTDMA is not set
# CONFIG_AMD_QDMA is not set
# CONFIG_QCOM_HIDMA_MGMT is not set
# CONFIG_QCOM_HIDMA is not set
CONFIG_DW_DMAC_CORE=y
# CONFIG_DW_DMAC is not set
# CONFIG_DW_DMAC_PCI is not set
# CONFIG_DW_EDMA is not set
CONFIG_HSU_DMA=y
# CONFIG_SF_PDMA is not set
# CONFIG_INTEL_LDMA is not set

#
# DMA Clients
#
CONFIG_ASYNC_TX_DMA=y
# CONFIG_DMATEST is not set
CONFIG_DMA_ENGINE_RAID=y

#
# DMABUF options
#
CONFIG_SYNC_FILE=y
CONFIG_SW_SYNC=y
CONFIG_UDMABUF=y
# CONFIG_DMABUF_DEBUG is not set
# CONFIG_DMABUF_SELFTESTS is not set
CONFIG_DMABUF_HEAPS=y
CONFIG_DMABUF_HEAPS_SYSTEM=y
CONFIG_DMABUF_HEAPS_CMA=y
# end of DMABUF options

CONFIG_DCA=y
# CONFIG_UIO is not set
CONFIG_VFIO=y
CONFIG_VFIO_DEVICE_CDEV=y
# CONFIG_VFIO_GROUP is not set
CONFIG_VFIO_VIRQFD=y
# CONFIG_VFIO_DEBUGFS is not set

#
# VFIO support for PCI devices
#
CONFIG_VFIO_PCI_CORE=y
CONFIG_VFIO_PCI_INTX=y
CONFIG_VFIO_PCI=y
# CONFIG_VFIO_PCI_VGA is not set
# CONFIG_VFIO_PCI_IGD is not set
# CONFIG_VIRTIO_VFIO_PCI is not set
# end of VFIO support for PCI devices

CONFIG_IRQ_BYPASS_MANAGER=y
# CONFIG_VIRT_DRIVERS is not set
CONFIG_VIRTIO_ANCHOR=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI_LIB=y
CONFIG_VIRTIO_PCI_LIB_LEGACY=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_PCI_ADMIN_LEGACY=y
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_VDPA=y
CONFIG_VIRTIO_PMEM=y
CONFIG_VIRTIO_BALLOON=y
CONFIG_VIRTIO_MEM=y
CONFIG_VIRTIO_INPUT=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
CONFIG_VIRTIO_DMA_SHARED_BUFFER=y
# CONFIG_VIRTIO_DEBUG is not set
# CONFIG_VIRTIO_RTC is not set
CONFIG_VDPA=y
CONFIG_VDPA_SIM=y
CONFIG_VDPA_SIM_NET=y
CONFIG_VDPA_SIM_BLOCK=y
# CONFIG_VDPA_USER is not set
# CONFIG_IFCVF is not set
# CONFIG_MLX5_VDPA_STEERING_DEBUG is not set
CONFIG_VP_VDPA=y
# CONFIG_ALIBABA_ENI_VDPA is not set
# CONFIG_SNET_VDPA is not set
# CONFIG_OCTEONEP_VDPA is not set
CONFIG_VHOST_IOTLB=y
CONFIG_VHOST_RING=y
CONFIG_VHOST_TASK=y
CONFIG_VHOST=y
CONFIG_VHOST_MENU=y
CONFIG_VHOST_NET=y
# CONFIG_VHOST_SCSI is not set
CONFIG_VHOST_VSOCK=y
CONFIG_VHOST_VDPA=y
CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y
CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y

#
# Microsoft Hyper-V guest support
#
# CONFIG_HYPERV is not set
# end of Microsoft Hyper-V guest support

CONFIG_GREYBUS=y
# CONFIG_GREYBUS_BEAGLEPLAY is not set
CONFIG_GREYBUS_ES2=y
CONFIG_COMEDI=y
# CONFIG_COMEDI_DEBUG is not set
CONFIG_COMEDI_DEFAULT_BUF_SIZE_KB=2048
CONFIG_COMEDI_DEFAULT_BUF_MAXSIZE_KB=20480
CONFIG_COMEDI_MISC_DRIVERS=y
CONFIG_COMEDI_BOND=y
CONFIG_COMEDI_TEST=y
CONFIG_COMEDI_PARPORT=y
CONFIG_COMEDI_ISA_DRIVERS=y
CONFIG_COMEDI_PCL711=y
CONFIG_COMEDI_PCL724=y
CONFIG_COMEDI_PCL726=y
CONFIG_COMEDI_PCL730=y
CONFIG_COMEDI_PCL812=y
CONFIG_COMEDI_PCL816=y
CONFIG_COMEDI_PCL818=y
CONFIG_COMEDI_PCM3724=y
CONFIG_COMEDI_AMPLC_DIO200_ISA=y
CONFIG_COMEDI_AMPLC_PC236_ISA=y
CONFIG_COMEDI_AMPLC_PC263_ISA=y
CONFIG_COMEDI_RTI800=y
CONFIG_COMEDI_RTI802=y
CONFIG_COMEDI_DAC02=y
CONFIG_COMEDI_DAS16M1=y
CONFIG_COMEDI_DAS08_ISA=y
# CONFIG_COMEDI_DAS16 is not set
CONFIG_COMEDI_DAS800=y
CONFIG_COMEDI_DAS1800=y
CONFIG_COMEDI_DAS6402=y
CONFIG_COMEDI_DT2801=y
CONFIG_COMEDI_DT2811=y
CONFIG_COMEDI_DT2814=y
CONFIG_COMEDI_DT2815=y
CONFIG_COMEDI_DT2817=y
CONFIG_COMEDI_DT282X=y
CONFIG_COMEDI_DMM32AT=y
CONFIG_COMEDI_FL512=y
CONFIG_COMEDI_AIO_AIO12_8=y
CONFIG_COMEDI_AIO_IIRO_16=y
# CONFIG_COMEDI_II_PCI20KC is not set
CONFIG_COMEDI_C6XDIGIO=y
CONFIG_COMEDI_MPC624=y
CONFIG_COMEDI_ADQ12B=y
CONFIG_COMEDI_NI_AT_A2150=y
CONFIG_COMEDI_NI_AT_AO=y
# CONFIG_COMEDI_NI_ATMIO is not set
CONFIG_COMEDI_NI_ATMIO16D=y
CONFIG_COMEDI_NI_LABPC_ISA=y
CONFIG_COMEDI_PCMAD=y
CONFIG_COMEDI_PCMDA12=y
CONFIG_COMEDI_PCMMIO=y
CONFIG_COMEDI_PCMUIO=y
CONFIG_COMEDI_MULTIQ3=y
CONFIG_COMEDI_S526=y
CONFIG_COMEDI_PCI_DRIVERS=y
CONFIG_COMEDI_8255_PCI=y
# CONFIG_COMEDI_ADDI_APCI_1032 is not set
# CONFIG_COMEDI_ADDI_APCI_1500 is not set
# CONFIG_COMEDI_ADDI_APCI_1516 is not set
# CONFIG_COMEDI_ADDI_APCI_1564 is not set
# CONFIG_COMEDI_ADDI_APCI_16XX is not set
# CONFIG_COMEDI_ADDI_APCI_2032 is not set
# CONFIG_COMEDI_ADDI_APCI_2200 is not set
# CONFIG_COMEDI_ADDI_APCI_3120 is not set
# CONFIG_COMEDI_ADDI_APCI_3501 is not set
# CONFIG_COMEDI_ADDI_APCI_3XXX is not set
# CONFIG_COMEDI_ADL_PCI6208 is not set
# CONFIG_COMEDI_ADL_PCI7250 is not set
# CONFIG_COMEDI_ADL_PCI7X3X is not set
# CONFIG_COMEDI_ADL_PCI8164 is not set
# CONFIG_COMEDI_ADL_PCI9111 is not set
CONFIG_COMEDI_ADL_PCI9118=y
# CONFIG_COMEDI_ADV_PCI1710 is not set
# CONFIG_COMEDI_ADV_PCI1720 is not set
# CONFIG_COMEDI_ADV_PCI1723 is not set
# CONFIG_COMEDI_ADV_PCI1724 is not set
# CONFIG_COMEDI_ADV_PCI1760 is not set
# CONFIG_COMEDI_ADV_PCI_DIO is not set
# CONFIG_COMEDI_AMPLC_DIO200_PCI is not set
# CONFIG_COMEDI_AMPLC_PC236_PCI is not set
# CONFIG_COMEDI_AMPLC_PC263_PCI is not set
# CONFIG_COMEDI_AMPLC_PCI224 is not set
# CONFIG_COMEDI_AMPLC_PCI230 is not set
# CONFIG_COMEDI_CONTEC_PCI_DIO is not set
# CONFIG_COMEDI_DAS08_PCI is not set
# CONFIG_COMEDI_DT3000 is not set
# CONFIG_COMEDI_DYNA_PCI10XX is not set
# CONFIG_COMEDI_GSC_HPDI is not set
# CONFIG_COMEDI_MF6X4 is not set
# CONFIG_COMEDI_ICP_MULTI is not set
# CONFIG_COMEDI_DAQBOARD2000 is not set
# CONFIG_COMEDI_JR3_PCI is not set
# CONFIG_COMEDI_KE_COUNTER is not set
# CONFIG_COMEDI_CB_PCIDAS64 is not set
# CONFIG_COMEDI_CB_PCIDAS is not set
# CONFIG_COMEDI_CB_PCIDDA is not set
# CONFIG_COMEDI_CB_PCIMDAS is not set
# CONFIG_COMEDI_CB_PCIMDDA is not set
# CONFIG_COMEDI_ME4000 is not set
# CONFIG_COMEDI_ME_DAQ is not set
# CONFIG_COMEDI_NI_6527 is not set
# CONFIG_COMEDI_NI_65XX is not set
# CONFIG_COMEDI_NI_660X is not set
# CONFIG_COMEDI_NI_670X is not set
CONFIG_COMEDI_NI_LABPC_PCI=y
# CONFIG_COMEDI_NI_PCIDIO is not set
# CONFIG_COMEDI_NI_PCIMIO is not set
# CONFIG_COMEDI_RTD520 is not set
# CONFIG_COMEDI_S626 is not set
CONFIG_COMEDI_PCMCIA_DRIVERS=y
# CONFIG_COMEDI_CB_DAS16_CS is not set
# CONFIG_COMEDI_DAS08_CS is not set
CONFIG_COMEDI_NI_DAQ_700_CS=y
# CONFIG_COMEDI_NI_DAQ_DIO24_CS is not set
CONFIG_COMEDI_NI_LABPC_CS=y
# CONFIG_COMEDI_NI_MIO_CS is not set
# CONFIG_COMEDI_QUATECH_DAQP_CS is not set
CONFIG_COMEDI_USB_DRIVERS=y
CONFIG_COMEDI_DT9812=y
CONFIG_COMEDI_NI_USB6501=y
CONFIG_COMEDI_USBDUX=y
CONFIG_COMEDI_USBDUXFAST=y
CONFIG_COMEDI_USBDUXSIGMA=y
CONFIG_COMEDI_VMK80XX=y
CONFIG_COMEDI_8254=y
CONFIG_COMEDI_8255=y
CONFIG_COMEDI_8255_SA=y
CONFIG_COMEDI_KCOMEDILIB=y
CONFIG_COMEDI_AMPLC_DIO200=y
CONFIG_COMEDI_AMPLC_PC236=y
CONFIG_COMEDI_DAS08=y
CONFIG_COMEDI_ISADMA=y
CONFIG_COMEDI_NI_LABPC=y
CONFIG_COMEDI_NI_LABPC_ISADMA=y
# CONFIG_COMEDI_TESTS is not set
# CONFIG_GPIB is not set
CONFIG_STAGING=y
# CONFIG_RTL8723BS is not set

#
# IIO staging drivers
#

#
# Accelerometers
#
# CONFIG_ADIS16203 is not set
# end of Accelerometers

#
# Analog to digital converters
#
# CONFIG_AD7816 is not set
# end of Analog to digital converters

#
# Analog digital bi-direction converters
#
# CONFIG_ADT7316 is not set
# end of Analog digital bi-direction converters

#
# Direct Digital Synthesis
#
# CONFIG_AD9832 is not set
# CONFIG_AD9834 is not set
# end of Direct Digital Synthesis

#
# Network Analyzer, Impedance Converters
#
# CONFIG_AD5933 is not set
# end of Network Analyzer, Impedance Converters
# end of IIO staging drivers

# CONFIG_FB_SM750 is not set
# CONFIG_STAGING_MEDIA is not set
# CONFIG_FB_TFT is not set
# CONFIG_MOST_COMPONENTS is not set
# CONFIG_GREYBUS_AUDIO is not set
# CONFIG_GREYBUS_BOOTROM is not set
# CONFIG_GREYBUS_FIRMWARE is not set
CONFIG_GREYBUS_HID=y
# CONFIG_GREYBUS_LOG is not set
# CONFIG_GREYBUS_LOOPBACK is not set
# CONFIG_GREYBUS_POWER is not set
# CONFIG_GREYBUS_RAW is not set
# CONFIG_GREYBUS_VIBRATOR is not set
CONFIG_GREYBUS_BRIDGED_PHY=y
# CONFIG_GREYBUS_GPIO is not set
# CONFIG_GREYBUS_I2C is not set
# CONFIG_GREYBUS_SDIO is not set
# CONFIG_GREYBUS_SPI is not set
# CONFIG_GREYBUS_UART is not set
CONFIG_GREYBUS_USB=y
# CONFIG_XIL_AXIS_FIFO is not set
# CONFIG_VME_BUS is not set
# CONFIG_GOLDFISH is not set
# CONFIG_CHROME_PLATFORMS is not set
# CONFIG_MELLANOX_PLATFORM is not set
CONFIG_SURFACE_PLATFORMS=y
# CONFIG_SURFACE3_WMI is not set
# CONFIG_SURFACE_3_POWER_OPREGION is not set
# CONFIG_SURFACE_ACPI_NOTIFY is not set
# CONFIG_SURFACE_AGGREGATOR_CDEV is not set
# CONFIG_SURFACE_AGGREGATOR_HUB is not set
CONFIG_SURFACE_AGGREGATOR_REGISTRY=y
# CONFIG_SURFACE_AGGREGATOR_TABLET_SWITCH is not set
# CONFIG_SURFACE_DTX is not set
# CONFIG_SURFACE_GPE is not set
# CONFIG_SURFACE_HOTPLUG is not set
# CONFIG_SURFACE_PLATFORM_PROFILE is not set
# CONFIG_SURFACE_PRO3_BUTTON is not set
CONFIG_SURFACE_AGGREGATOR=y
CONFIG_SURFACE_AGGREGATOR_BUS=y
CONFIG_X86_PLATFORM_DEVICES=y
CONFIG_WMI_BMOF=y
# CONFIG_HUAWEI_WMI is not set
# CONFIG_X86_PLATFORM_DRIVERS_UNIWILL is not set
# CONFIG_MXM_WMI is not set
# CONFIG_NVIDIA_WMI_EC_BACKLIGHT is not set
# CONFIG_XIAOMI_WMI is not set
# CONFIG_REDMI_WMI is not set
# CONFIG_GIGABYTE_WMI is not set
# CONFIG_BITLAND_MIFS_WMI is not set
# CONFIG_ACERHDF is not set
# CONFIG_ACER_WIRELESS is not set
# CONFIG_ACER_WMI is not set

#
# AMD HSMP Driver
#
# CONFIG_AMD_HSMP_ACPI is not set
# CONFIG_AMD_HSMP_PLAT is not set
# end of AMD HSMP Driver

# CONFIG_AMD_PMC is not set
# CONFIG_AMD_HFI is not set
# CONFIG_AMD_3D_VCACHE is not set
# CONFIG_AMD_WBRF is not set
# CONFIG_AMD_ISP_PLATFORM is not set
# CONFIG_ADV_SWBUTTON is not set
# CONFIG_APPLE_GMUX is not set
# CONFIG_ASUS_LAPTOP is not set
# CONFIG_ASUS_WIRELESS is not set
# CONFIG_ASUS_ARMOURY is not set
CONFIG_ASUS_WMI=y
# CONFIG_ASUS_WMI_DEPRECATED_ATTRS is not set
# CONFIG_ASUS_NB_WMI is not set
CONFIG_ASUS_TF103C_DOCK=y
# CONFIG_AYANEO_EC is not set
CONFIG_EEEPC_LAPTOP=y
# CONFIG_EEEPC_WMI is not set
# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set
# CONFIG_AMILO_RFKILL is not set
# CONFIG_FUJITSU_LAPTOP is not set
# CONFIG_FUJITSU_TABLET is not set
# CONFIG_GPD_POCKET_FAN is not set
# CONFIG_X86_PLATFORM_DRIVERS_HP is not set
# CONFIG_WIRELESS_HOTKEY is not set
# CONFIG_IBM_RTL is not set
# CONFIG_SENSORS_HDAPS is not set
# CONFIG_INTEL_ATOMISP2_PM is not set
# CONFIG_INTEL_IFS is not set
# CONFIG_INTEL_SAR_INT1092 is not set
# CONFIG_INTEL_SKL_INT3472 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_WMI_SBL_FW_UPDATE is not set
# CONFIG_INTEL_WMI_THUNDERBOLT is not set

#
# Intel Uncore Frequency Control
#
# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set
# end of Intel Uncore Frequency Control

# CONFIG_INTEL_HID_EVENT is not set
# CONFIG_INTEL_VBTN is not set
# CONFIG_INTEL_EHL_PSE_IO is not set
# CONFIG_INTEL_INT0002_VGPIO is not set
# CONFIG_INTEL_OAKTRAIL is not set
# CONFIG_INTEL_BXTWC_PMIC_TMU is not set
CONFIG_INTEL_CHTWC_INT33FE=y
CONFIG_INTEL_ISHTP_ECLITE=y
# CONFIG_INTEL_PUNIT_IPC is not set
# CONFIG_INTEL_RST is not set
# CONFIG_INTEL_SMARTCONNECT is not set
# CONFIG_INTEL_TURBO_MAX_3 is not set
# CONFIG_INTEL_VSEC is not set
# CONFIG_IDEAPAD_LAPTOP is not set
# CONFIG_LENOVO_WMI_HOTKEY_UTILITIES is not set
# CONFIG_LENOVO_WMI_CAMERA is not set
# CONFIG_THINKPAD_ACPI is not set
# CONFIG_THINKPAD_LMI is not set
# CONFIG_YOGABOOK is not set
# CONFIG_YT2_1380 is not set
# CONFIG_LENOVO_WMI_GAMEZONE is not set
# CONFIG_LENOVO_WMI_TUNING is not set
# CONFIG_ACPI_QUICKSTART is not set
# CONFIG_MEEGOPAD_ANX7428 is not set
# CONFIG_MSI_EC is not set
# CONFIG_MSI_LAPTOP is not set
# CONFIG_MSI_WMI is not set
# CONFIG_MSI_WMI_PLATFORM is not set
# CONFIG_PCENGINES_APU2 is not set
# CONFIG_PORTWELL_EC is not set
# CONFIG_BARCO_P50_GPIO is not set
# CONFIG_SAMSUNG_GALAXYBOOK is not set
# CONFIG_SAMSUNG_LAPTOP is not set
# CONFIG_SAMSUNG_Q10 is not set
# CONFIG_ACPI_TOSHIBA is not set
# CONFIG_TOSHIBA_BT_RFKILL is not set
# CONFIG_TOSHIBA_HAPS is not set
# CONFIG_TOSHIBA_WMI is not set
# CONFIG_ACPI_CMPC is not set
# CONFIG_COMPAL_LAPTOP is not set
# CONFIG_LG_LAPTOP is not set
# CONFIG_PANASONIC_LAPTOP is not set
# CONFIG_SONY_LAPTOP is not set
# CONFIG_SYSTEM76_ACPI is not set
# CONFIG_TOPSTAR_LAPTOP is not set
# CONFIG_SERIAL_MULTI_INSTANTIATE is not set
# CONFIG_INSPUR_PLATFORM_PROFILE is not set
# CONFIG_DASHARO_ACPI is not set
# CONFIG_INTEL_IPS is not set
CONFIG_INTEL_SCU_IPC=y
# CONFIG_INTEL_SCU_PCI is not set
# CONFIG_INTEL_SCU_PLATFORM is not set
# CONFIG_SIEMENS_SIMATIC_IPC is not set
# CONFIG_SILICOM_PLATFORM is not set
# CONFIG_WINMATE_FM07_KEYS is not set
# CONFIG_OXP_EC is not set
# CONFIG_TUXEDO_NB04_WMI_AB is not set
CONFIG_P2SB=y
CONFIG_ACPI_WMI=y
# CONFIG_ACPI_WMI_LEGACY_DEVICE_NAMES is not set
CONFIG_HAVE_CLK=y
CONFIG_HAVE_CLK_PREPARE=y
CONFIG_COMMON_CLK=y
# CONFIG_LMK04832 is not set
# 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_CLK_TWL is not set
# CONFIG_COMMON_CLK_AXI_CLKGEN is not set
# CONFIG_COMMON_CLK_RS9_PCIE is not set
# CONFIG_COMMON_CLK_SI521XX is not set
# CONFIG_COMMON_CLK_VC3 is not set
# CONFIG_COMMON_CLK_VC5 is not set
# CONFIG_COMMON_CLK_VC7 is not set
# CONFIG_COMMON_CLK_FIXED_MMIO is not set
# CONFIG_CLK_LGM_CGU is not set
# CONFIG_XILINX_VCU is not set
# CONFIG_COMMON_CLK_XLNX_CLKWZRD 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_PLATFORM_MHU is not set
CONFIG_PCC=y
# CONFIG_ALTERA_MBOX is not set
# CONFIG_MAILBOX_TEST is not set
CONFIG_IOMMU_IOVA=y
CONFIG_IOMMU_API=y
CONFIG_IOMMUFD_DRIVER=y
CONFIG_IOMMU_SUPPORT=y

#
# Generic IOMMU Pagetable Support
#
# end of Generic IOMMU Pagetable Support

# CONFIG_IOMMU_DEBUGFS is not set
# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set
CONFIG_IOMMU_DEFAULT_DMA_LAZY=y
# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
CONFIG_OF_IOMMU=y
CONFIG_IOMMU_DMA=y
CONFIG_IOMMU_SVA=y
CONFIG_IOMMU_IOPF=y
CONFIG_AMD_IOMMU=y
# CONFIG_AMD_IOMMU_IOMMUFD is not set
CONFIG_DMAR_TABLE=y
CONFIG_INTEL_IOMMU=y
CONFIG_INTEL_IOMMU_SVM=y
CONFIG_INTEL_IOMMU_DEFAULT_ON=y
CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON=y
CONFIG_INTEL_IOMMU_PERF_EVENTS=y
CONFIG_IOMMUFD_DRIVER_CORE=y
CONFIG_IOMMUFD=y
CONFIG_IOMMUFD_TEST=y
CONFIG_IRQ_REMAP=y
# CONFIG_VIRTIO_IOMMU is not set
CONFIG_GENERIC_PT=y
CONFIG_DEBUG_GENERIC_PT=y
CONFIG_IOMMU_PT=y
CONFIG_IOMMU_PT_AMDV1=y
CONFIG_IOMMU_PT_VTDSS=y
# CONFIG_IOMMU_PT_RISCV64 is not set
CONFIG_IOMMU_PT_X86_64=y

#
# 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=y

#
# SoundWire Devices
#
# CONFIG_SOUNDWIRE_AMD is not set
# CONFIG_SOUNDWIRE_INTEL is not set
# CONFIG_SOUNDWIRE_QCOM 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

#
# fujitsu SoC drivers
#
# end of fujitsu 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

# CONFIG_WPCM450_SOC is not set

#
# Qualcomm SoC drivers
#
CONFIG_QCOM_QMI_HELPERS=y
# end of Qualcomm SoC drivers

# CONFIG_SOC_TI is not set

#
# Xilinx SoC drivers
#
# end of Xilinx SoC drivers
# end of SOC (System On Chip) specific Drivers

#
# PM Domains
#

#
# Amlogic PM Domains
#
# end of Amlogic PM Domains

#
# Broadcom PM Domains
#
# end of Broadcom PM Domains

#
# i.MX PM Domains
#
# end of i.MX PM Domains

#
# Qualcomm PM Domains
#
# end of Qualcomm PM Domains
# end of PM Domains

# CONFIG_PM_DEVFREQ is not set
CONFIG_EXTCON=y

#
# Extcon Device Drivers
#
# CONFIG_EXTCON_ADC_JACK is not set
# CONFIG_EXTCON_FSA9480 is not set
# CONFIG_EXTCON_GPIO is not set
# CONFIG_EXTCON_INTEL_INT3496 is not set
CONFIG_EXTCON_INTEL_CHT_WC=y
# CONFIG_EXTCON_LC824206XA is not set
# CONFIG_EXTCON_MAX3355 is not set
# CONFIG_EXTCON_MAX14526 is not set
CONFIG_EXTCON_PTN5150=y
# CONFIG_EXTCON_RT8973A is not set
# CONFIG_EXTCON_SM5502 is not set
# CONFIG_EXTCON_USB_GPIO is not set
CONFIG_EXTCON_USBC_TUSB320=y
# CONFIG_MEMORY is not set
CONFIG_IIO=y
CONFIG_IIO_BUFFER=y
# CONFIG_IIO_BUFFER_CB is not set
# CONFIG_IIO_BUFFER_DMA is not set
# CONFIG_IIO_BUFFER_DMAENGINE is not set
# CONFIG_IIO_BUFFER_HW_CONSUMER is not set
CONFIG_IIO_KFIFO_BUF=y
CONFIG_IIO_TRIGGERED_BUFFER=y
# CONFIG_IIO_CONFIGFS is not set
CONFIG_IIO_TRIGGER=y
CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
# CONFIG_IIO_SW_DEVICE is not set
# CONFIG_IIO_SW_TRIGGER is not set
# CONFIG_IIO_TRIGGERED_EVENT is not set

#
# Accelerometers
#
# CONFIG_ADIS16201 is not set
# CONFIG_ADIS16209 is not set
# CONFIG_ADXL313_I2C is not set
# CONFIG_ADXL313_SPI is not set
# CONFIG_ADXL345_I2C is not set
# CONFIG_ADXL345_SPI is not set
# CONFIG_ADXL355_I2C is not set
# CONFIG_ADXL355_SPI is not set
# CONFIG_ADXL367_SPI is not set
# CONFIG_ADXL367_I2C is not set
# CONFIG_ADXL372_SPI is not set
# CONFIG_ADXL372_I2C is not set
# CONFIG_ADXL380_SPI is not set
# CONFIG_ADXL380_I2C is not set
# CONFIG_BMA180 is not set
# CONFIG_BMA220 is not set
# CONFIG_BMA400 is not set
# CONFIG_BMC150_ACCEL is not set
# CONFIG_BMI088_ACCEL is not set
# CONFIG_DA280 is not set
# CONFIG_DA311 is not set
# CONFIG_DMARD06 is not set
# CONFIG_DMARD09 is not set
# CONFIG_DMARD10 is not set
# CONFIG_FXLS8962AF_I2C is not set
# CONFIG_FXLS8962AF_SPI is not set
CONFIG_HID_SENSOR_ACCEL_3D=y
# CONFIG_IIO_ST_ACCEL_3AXIS is not set
# CONFIG_IIO_KX022A_SPI is not set
# CONFIG_IIO_KX022A_I2C is not set
# CONFIG_KXSD9 is not set
# CONFIG_KXCJK1013 is not set
# CONFIG_MC3230 is not set
# CONFIG_MMA7455_I2C is not set
# CONFIG_MMA7455_SPI is not set
# CONFIG_MMA7660 is not set
# CONFIG_MMA8452 is not set
# CONFIG_MMA9551 is not set
# CONFIG_MMA9553 is not set
# CONFIG_MSA311 is not set
# CONFIG_MXC4005 is not set
# CONFIG_MXC6255 is not set
# CONFIG_SCA3000 is not set
# CONFIG_SCA3300 is not set
# CONFIG_STK8312 is not set
# CONFIG_STK8BA50 is not set
# end of Accelerometers

#
# Analog to digital converters
#
# CONFIG_AD4000 is not set
# CONFIG_AD4030 is not set
# CONFIG_AD4080 is not set
# CONFIG_AD4130 is not set
# CONFIG_AD4134 is not set
# CONFIG_AD4170_4 is not set
# CONFIG_AD4695 is not set
# CONFIG_AD7091R5 is not set
# CONFIG_AD7091R8 is not set
# CONFIG_AD7124 is not set
# CONFIG_AD7173 is not set
# CONFIG_AD7191 is not set
# CONFIG_AD7192 is not set
# CONFIG_AD7266 is not set
# CONFIG_AD7280 is not set
# CONFIG_AD7291 is not set
# CONFIG_AD7292 is not set
# CONFIG_AD7298 is not set
# CONFIG_AD7380 is not set
# CONFIG_AD7476 is not set
# CONFIG_AD7606_IFACE_PARALLEL is not set
# CONFIG_AD7606_IFACE_SPI is not set
# CONFIG_AD7766 is not set
# CONFIG_AD7768_1 is not set
# CONFIG_AD7779 is not set
# CONFIG_AD7780 is not set
# CONFIG_AD7791 is not set
# CONFIG_AD7793 is not set
# CONFIG_AD7887 is not set
# CONFIG_AD7923 is not set
# CONFIG_AD7944 is not set
# CONFIG_AD7949 is not set
# CONFIG_AD799X is not set
# CONFIG_AD9467 is not set
# CONFIG_ADE9000 is not set
# CONFIG_CC10001_ADC is not set
CONFIG_DLN2_ADC=y
# CONFIG_ENVELOPE_DETECTOR is not set
# CONFIG_GEHC_PMC_ADC is not set
# CONFIG_HI8435 is not set
# CONFIG_HX711 is not set
# CONFIG_INA2XX_ADC is not set
# CONFIG_LTC2309 is not set
# CONFIG_LTC2471 is not set
# CONFIG_LTC2485 is not set
# CONFIG_LTC2496 is not set
# CONFIG_LTC2497 is not set
# CONFIG_MAX1027 is not set
# CONFIG_MAX11100 is not set
# CONFIG_MAX1118 is not set
# CONFIG_MAX11205 is not set
# CONFIG_MAX11410 is not set
# CONFIG_MAX1241 is not set
# CONFIG_MAX1363 is not set
# CONFIG_MAX14001 is not set
# CONFIG_MAX34408 is not set
# CONFIG_MAX9611 is not set
# CONFIG_MCP320X is not set
# CONFIG_MCP3422 is not set
# CONFIG_MCP3564 is not set
# CONFIG_MCP3911 is not set
# CONFIG_MEDIATEK_MT6360_ADC is not set
# CONFIG_MEDIATEK_MT6370_ADC is not set
# CONFIG_NAU7802 is not set
# CONFIG_NCT7201 is not set
# CONFIG_PAC1921 is not set
# CONFIG_PAC1934 is not set
# CONFIG_ROHM_BD79112 is not set
# CONFIG_ROHM_BD79124 is not set
# CONFIG_RICHTEK_RTQ6056 is not set
# CONFIG_SD_ADC_MODULATOR is not set
# CONFIG_TI_ADC081C is not set
# CONFIG_TI_ADC0832 is not set
# CONFIG_TI_ADC084S021 is not set
# CONFIG_TI_ADC108S102 is not set
# CONFIG_TI_ADC12138 is not set
# CONFIG_TI_ADC128S052 is not set
# CONFIG_TI_ADC161S626 is not set
# CONFIG_TI_ADS1015 is not set
# CONFIG_TI_ADS1018 is not set
# CONFIG_TI_ADS1100 is not set
# CONFIG_TI_ADS1119 is not set
# CONFIG_TI_ADS124S08 is not set
# CONFIG_TI_ADS1298 is not set
# CONFIG_TI_ADS131E08 is not set
# CONFIG_TI_ADS131M02 is not set
# CONFIG_TI_ADS7138 is not set
# CONFIG_TI_ADS7924 is not set
# CONFIG_TI_ADS7950 is not set
# CONFIG_TI_ADS8344 is not set
# CONFIG_TI_ADS8688 is not set
# CONFIG_TI_LMP92064 is not set
# CONFIG_TI_TLC4541 is not set
# CONFIG_TI_TSC2046 is not set
# CONFIG_TWL4030_MADC is not set
# CONFIG_TWL6030_GPADC is not set
# CONFIG_VF610_ADC is not set
CONFIG_VIPERBOARD_ADC=y
# CONFIG_XILINX_XADC is not set
# end of Analog to digital converters

#
# Analog to digital and digital to analog converters
#
# CONFIG_AD74115 is not set
# CONFIG_AD74413R is not set
# end of Analog to digital and digital to analog converters

#
# Analog Front Ends
#
# CONFIG_IIO_RESCALE is not set
# end of Analog Front Ends

#
# Amplifiers
#
# CONFIG_AD8366 is not set
# CONFIG_ADA4250 is not set
# CONFIG_ADL8113 is not set
# CONFIG_HMC425 is not set
# end of Amplifiers

#
# Capacitance to digital converters
#
# CONFIG_AD7150 is not set
# CONFIG_AD7746 is not set
# end of Capacitance to digital converters

#
# Chemical Sensors
#
# CONFIG_AOSONG_AGS02MA is not set
# CONFIG_ATLAS_PH_SENSOR is not set
# CONFIG_ATLAS_EZO_SENSOR is not set
# CONFIG_BME680 is not set
# CONFIG_CCS811 is not set
# CONFIG_ENS160 is not set
# CONFIG_IAQCORE is not set
# CONFIG_MHZ19B is not set
# CONFIG_PMS7003 is not set
# CONFIG_SCD30_CORE is not set
# CONFIG_SCD4X is not set
# CONFIG_SEN0322 is not set
# CONFIG_SENSIRION_SGP30 is not set
# CONFIG_SENSIRION_SGP40 is not set
# CONFIG_SPS30_I2C is not set
# CONFIG_SPS30_SERIAL is not set
# CONFIG_SENSEAIR_SUNRISE_CO2 is not set
# CONFIG_VZ89X is not set
# end of Chemical Sensors

#
# Hid Sensor IIO Common
#
CONFIG_HID_SENSOR_IIO_COMMON=y
CONFIG_HID_SENSOR_IIO_TRIGGER=y
# end of Hid Sensor IIO Common

#
# IIO SCMI Sensors
#
# end of IIO SCMI Sensors

#
# SSP Sensor Common
#
# CONFIG_IIO_SSP_SENSORHUB is not set
# end of SSP Sensor Common

#
# Digital to analog converters
#
# CONFIG_AD3530R is not set
# CONFIG_AD3552R_HS is not set
# CONFIG_AD3552R is not set
# CONFIG_AD5064 is not set
# CONFIG_AD5360 is not set
# CONFIG_AD5380 is not set
# CONFIG_AD5421 is not set
# CONFIG_AD5446_SPI is not set
# CONFIG_AD5446_I2C is not set
# CONFIG_AD5449 is not set
# CONFIG_AD5592R is not set
# CONFIG_AD5593R is not set
# CONFIG_AD5504 is not set
# CONFIG_AD5624R_SPI is not set
# CONFIG_AD9739A is not set
# CONFIG_LTC2688 is not set
# CONFIG_AD5686_SPI is not set
# CONFIG_AD5696_I2C is not set
# CONFIG_AD5755 is not set
# CONFIG_AD5758 is not set
# CONFIG_AD5761 is not set
# CONFIG_AD5764 is not set
# CONFIG_AD5766 is not set
# CONFIG_AD5770R is not set
# CONFIG_AD5791 is not set
# CONFIG_AD7293 is not set
# CONFIG_AD7303 is not set
# CONFIG_AD8460 is not set
# CONFIG_AD8801 is not set
# CONFIG_BD79703 is not set
# CONFIG_CIO_DAC is not set
# CONFIG_DPOT_DAC is not set
# CONFIG_DS4424 is not set
# CONFIG_LTC1660 is not set
# CONFIG_LTC2632 is not set
# CONFIG_LTC2664 is not set
# CONFIG_M62332 is not set
# CONFIG_MAX517 is not set
# CONFIG_MAX22007 is not set
# CONFIG_MAX5522 is not set
# CONFIG_MAX5821 is not set
# CONFIG_MCP4725 is not set
# CONFIG_MCP4728 is not set
# CONFIG_MCP47FEB02 is not set
# CONFIG_MCP4821 is not set
# CONFIG_MCP4922 is not set
# CONFIG_TI_DAC082S085 is not set
# CONFIG_TI_DAC5571 is not set
# CONFIG_TI_DAC7311 is not set
# CONFIG_TI_DAC7612 is not set
# CONFIG_VF610_DAC is not set
# end of Digital to analog converters

#
# IIO dummy driver
#
# end of IIO dummy driver

#
# Filters
#
# CONFIG_ADMV8818 is not set
# end of Filters

#
# Frequency Synthesizers DDS/PLL
#

#
# Clock Generator/Distribution
#
# CONFIG_AD9523 is not set
# end of Clock Generator/Distribution

#
# Phase-Locked Loop (PLL) frequency synthesizers
#
# CONFIG_ADF4350 is not set
# CONFIG_ADF4371 is not set
# CONFIG_ADF4377 is not set
# CONFIG_ADMFM2000 is not set
# CONFIG_ADMV1013 is not set
# CONFIG_ADMV1014 is not set
# CONFIG_ADMV4420 is not set
# CONFIG_ADRF6780 is not set
# end of Phase-Locked Loop (PLL) frequency synthesizers
# end of Frequency Synthesizers DDS/PLL

#
# Digital gyroscope sensors
#
# CONFIG_ADIS16080 is not set
# CONFIG_ADIS16130 is not set
# CONFIG_ADIS16136 is not set
# CONFIG_ADIS16260 is not set
# CONFIG_ADXRS290 is not set
# CONFIG_ADXRS450 is not set
# CONFIG_BMG160 is not set
# CONFIG_FXAS21002C is not set
CONFIG_HID_SENSOR_GYRO_3D=y
# CONFIG_MPU3050_I2C is not set
# CONFIG_IIO_ST_GYRO_3AXIS is not set
# CONFIG_ITG3200 is not set
# end of Digital gyroscope sensors

#
# Health Sensors
#

#
# Heart Rate Monitors
#
# CONFIG_AFE4403 is not set
# CONFIG_AFE4404 is not set
# CONFIG_MAX30100 is not set
# CONFIG_MAX30102 is not set
# end of Heart Rate Monitors
# end of Health Sensors

#
# Humidity sensors
#
# CONFIG_AM2315 is not set
# CONFIG_DHT11 is not set
# CONFIG_ENS210 is not set
# CONFIG_HDC100X is not set
# CONFIG_HDC2010 is not set
# CONFIG_HDC3020 is not set
CONFIG_HID_SENSOR_HUMIDITY=y
# CONFIG_HTS221 is not set
# CONFIG_HTU21 is not set
# CONFIG_SI7005 is not set
# CONFIG_SI7020 is not set
# end of Humidity sensors

#
# Inertial measurement units
#
# CONFIG_ADIS16400 is not set
# CONFIG_ADIS16460 is not set
# CONFIG_ADIS16475 is not set
# CONFIG_ADIS16480 is not set
# CONFIG_ADIS16550 is not set
# CONFIG_BMI160_I2C is not set
# CONFIG_BMI160_SPI is not set
# CONFIG_BMI270_I2C is not set
# CONFIG_BMI270_SPI is not set
# CONFIG_BMI323_I2C is not set
# CONFIG_BMI323_SPI is not set
# CONFIG_BOSCH_BNO055_SERIAL is not set
# CONFIG_BOSCH_BNO055_I2C is not set
# CONFIG_FXOS8700_I2C is not set
# CONFIG_FXOS8700_SPI is not set
# CONFIG_KMX61 is not set
# CONFIG_INV_ICM42600_I2C is not set
# CONFIG_INV_ICM42600_SPI is not set
# CONFIG_INV_ICM45600_I2C is not set
# CONFIG_INV_ICM45600_SPI is not set
# CONFIG_INV_MPU6050_I2C is not set
# CONFIG_INV_MPU6050_SPI is not set
# CONFIG_SMI240 is not set
# CONFIG_SMI330_I2C is not set
# CONFIG_SMI330_SPI is not set
# CONFIG_IIO_ST_LSM6DSX is not set
# CONFIG_IIO_ST_LSM9DS0 is not set
# end of Inertial measurement units

#
# Light sensors
#
# CONFIG_ACPI_ALS is not set
# CONFIG_ADJD_S311 is not set
# CONFIG_ADUX1020 is not set
# CONFIG_AL3000A is not set
# CONFIG_AL3010 is not set
# CONFIG_AL3320A is not set
# CONFIG_APDS9160 is not set
# CONFIG_APDS9300 is not set
# CONFIG_APDS9306 is not set
# CONFIG_APDS9960 is not set
# CONFIG_AS73211 is not set
# CONFIG_BH1745 is not set
# CONFIG_BH1750 is not set
# CONFIG_BH1780 is not set
# CONFIG_CM32181 is not set
# CONFIG_CM3232 is not set
# CONFIG_CM3323 is not set
# CONFIG_CM3605 is not set
# CONFIG_CM36651 is not set
# CONFIG_GP2AP002 is not set
# CONFIG_GP2AP020A00F is not set
# CONFIG_SENSORS_ISL29018 is not set
# CONFIG_SENSORS_ISL29028 is not set
# CONFIG_ISL29125 is not set
# CONFIG_ISL76682 is not set
CONFIG_HID_SENSOR_ALS=y
CONFIG_HID_SENSOR_PROX=y
# CONFIG_JSA1212 is not set
# CONFIG_ROHM_BU27034 is not set
# CONFIG_RPR0521 is not set
# CONFIG_LTR390 is not set
# CONFIG_LTR501 is not set
# CONFIG_LTRF216A is not set
# CONFIG_LV0104CS is not set
# CONFIG_MAX44000 is not set
# CONFIG_MAX44009 is not set
# CONFIG_NOA1305 is not set
# CONFIG_OPT3001 is not set
# CONFIG_OPT4001 is not set
# CONFIG_OPT4060 is not set
# CONFIG_PA12203001 is not set
# CONFIG_SI1133 is not set
# CONFIG_SI1145 is not set
# CONFIG_STK3310 is not set
# CONFIG_ST_UVIS25 is not set
# CONFIG_TCS3414 is not set
# CONFIG_TCS3472 is not set
# CONFIG_SENSORS_TSL2563 is not set
# CONFIG_TSL2583 is not set
# CONFIG_TSL2591 is not set
# CONFIG_TSL2772 is not set
# CONFIG_TSL4531 is not set
# CONFIG_US5182D is not set
# CONFIG_VCNL4000 is not set
# CONFIG_VCNL4035 is not set
# CONFIG_VEML3235 is not set
# CONFIG_VEML6030 is not set
# CONFIG_VEML6040 is not set
# CONFIG_VEML6046X00 is not set
# CONFIG_VEML6070 is not set
# CONFIG_VEML6075 is not set
# CONFIG_VL6180 is not set
# CONFIG_ZOPT2201 is not set
# end of Light sensors

#
# Magnetometer sensors
#
# CONFIG_AF8133J is not set
# CONFIG_AK8974 is not set
# CONFIG_AK8975 is not set
# CONFIG_AK09911 is not set
# CONFIG_ALS31300 is not set
# CONFIG_BMC150_MAGN_I2C is not set
# CONFIG_BMC150_MAGN_SPI is not set
# CONFIG_MAG3110 is not set
CONFIG_HID_SENSOR_MAGNETOMETER_3D=y
# CONFIG_MMC35240 is not set
# CONFIG_MMC5633 is not set
# CONFIG_IIO_ST_MAGN_3AXIS is not set
# CONFIG_INFINEON_TLV493D is not set
# CONFIG_SENSORS_HMC5843_I2C is not set
# CONFIG_SENSORS_HMC5843_SPI is not set
# CONFIG_SENSORS_RM3100_I2C is not set
# CONFIG_SENSORS_RM3100_SPI is not set
# CONFIG_SI7210 is not set
# CONFIG_TI_TMAG5273 is not set
# CONFIG_YAMAHA_YAS530 is not set
# end of Magnetometer sensors

#
# Multiplexers
#
# CONFIG_IIO_MUX is not set
# end of Multiplexers

#
# Inclinometer sensors
#
CONFIG_HID_SENSOR_INCLINOMETER_3D=y
CONFIG_HID_SENSOR_DEVICE_ROTATION=y
# end of Inclinometer sensors

#
# Triggers - standalone
#
# CONFIG_IIO_INTERRUPT_TRIGGER is not set
# CONFIG_IIO_SYSFS_TRIGGER is not set
# end of Triggers - standalone

#
# Linear and angular position sensors
#
CONFIG_HID_SENSOR_CUSTOM_INTEL_HINGE=y
# end of Linear and angular position sensors

#
# Digital potentiometers
#
# CONFIG_AD5110 is not set
# CONFIG_AD5272 is not set
# CONFIG_DS1803 is not set
# CONFIG_MAX5432 is not set
# CONFIG_MAX5481 is not set
# CONFIG_MAX5487 is not set
# CONFIG_MCP4018 is not set
# CONFIG_MCP4131 is not set
# CONFIG_MCP4531 is not set
# CONFIG_MCP41010 is not set
# CONFIG_TPL0102 is not set
# CONFIG_X9250 is not set
# end of Digital potentiometers

#
# Digital potentiostats
#
# CONFIG_LMP91000 is not set
# end of Digital potentiostats

#
# Pressure sensors
#
# CONFIG_ABP060MG is not set
# CONFIG_ABP2030PA_I2C is not set
# CONFIG_ABP2030PA_SPI is not set
# CONFIG_ROHM_BM1390 is not set
# CONFIG_BMP280 is not set
# CONFIG_DLHL60D is not set
# CONFIG_DPS310 is not set
CONFIG_HID_SENSOR_PRESS=y
# CONFIG_HP03 is not set
# CONFIG_HSC030PA is not set
# CONFIG_ICP10100 is not set
# CONFIG_MPL115_I2C is not set
# CONFIG_MPL115_SPI is not set
# CONFIG_MPL3115 is not set
# CONFIG_MPRLS0025PA_I2C is not set
# CONFIG_MPRLS0025PA_SPI is not set
# CONFIG_MS5611 is not set
# CONFIG_MS5637 is not set
# CONFIG_SDP500 is not set
# CONFIG_IIO_ST_PRESS is not set
# CONFIG_T5403 is not set
# CONFIG_HP206C is not set
# CONFIG_ZPA2326 is not set
# CONFIG_ADP810 is not set
# end of Pressure sensors

#
# Lightning sensors
#
# CONFIG_AS3935 is not set
# end of Lightning sensors

#
# Proximity and distance sensors
#
# CONFIG_D3323AA is not set
# CONFIG_HX9023S is not set
# CONFIG_IRSD200 is not set
# CONFIG_ISL29501 is not set
# CONFIG_LIDAR_LITE_V2 is not set
# CONFIG_MB1232 is not set
# CONFIG_PING is not set
# CONFIG_RFD77402 is not set
# CONFIG_SRF04 is not set
# CONFIG_SX9310 is not set
# CONFIG_SX9324 is not set
# CONFIG_SX9360 is not set
# CONFIG_SX9500 is not set
# CONFIG_SRF08 is not set
# CONFIG_VCNL3020 is not set
# CONFIG_VL53L0X_I2C is not set
# CONFIG_AW96103 is not set
# end of Proximity and distance sensors

#
# Resolver to digital converters
#
# CONFIG_AD2S90 is not set
# CONFIG_AD2S1200 is not set
# CONFIG_AD2S1210 is not set
# end of Resolver to digital converters

#
# Temperature sensors
#
# CONFIG_LTC2983 is not set
# CONFIG_MAXIM_THERMOCOUPLE is not set
CONFIG_HID_SENSOR_TEMP=y
# CONFIG_MLX90614 is not set
# CONFIG_MLX90632 is not set
# CONFIG_MLX90635 is not set
# CONFIG_TMP006 is not set
# CONFIG_TMP007 is not set
# CONFIG_TMP117 is not set
# CONFIG_TSYS01 is not set
# CONFIG_TSYS02D is not set
# CONFIG_MAX30208 is not set
# CONFIG_MAX31856 is not set
# CONFIG_MAX31865 is not set
# CONFIG_MCP9600 is not set
# end of Temperature sensors

# CONFIG_NTB is not set
# CONFIG_PWM is not set

#
# IRQ chip support
#
CONFIG_IRQCHIP=y
CONFIG_IRQ_MSI_LIB=y
# CONFIG_AL_FIC is not set
# CONFIG_XILINX_INTC is not set
# end of IRQ chip support

# CONFIG_IPACK_BUS is not set
CONFIG_RESET_CONTROLLER=y
# CONFIG_RESET_GPIO is not set
# CONFIG_RESET_INTEL_GW is not set
# CONFIG_RESET_SIMPLE is not set
# CONFIG_RESET_TI_SYSCON is not set
# CONFIG_RESET_TI_TPS380X is not set

#
# PHY Subsystem
#
CONFIG_GENERIC_PHY=y
# CONFIG_PHY_CAN_TRANSCEIVER is not set
# CONFIG_PHY_GOOGLE_USB is not set
CONFIG_USB_LGM_PHY=y
# CONFIG_PHY_NXP_PTN3222 is not set

#
# PHY drivers for Broadcom platforms
#
# CONFIG_BCM_KONA_USB2_PHY is not set
# end of PHY drivers for Broadcom platforms

# CONFIG_PHY_CADENCE_TORRENT is not set
# CONFIG_PHY_CADENCE_DPHY is not set
# CONFIG_PHY_CADENCE_DPHY_RX is not set
# CONFIG_PHY_CADENCE_SIERRA is not set
# CONFIG_PHY_CADENCE_SALVO is not set
# CONFIG_PHY_INTEL_LGM_COMBO is not set
# CONFIG_PHY_INTEL_LGM_EMMC is not set
# CONFIG_PHY_PXA_28NM_HSIC is not set
# CONFIG_PHY_PXA_28NM_USB2 is not set
CONFIG_PHY_CPCAP_USB=y
# CONFIG_PHY_MAPPHONE_MDM6600 is not set
# CONFIG_PHY_OCELOT_SERDES is not set
CONFIG_PHY_QCOM_USB_HS=y
CONFIG_PHY_QCOM_USB_HSIC=y
CONFIG_PHY_SAMSUNG_USB2=y
CONFIG_PHY_TUSB1210=y
# end of PHY Subsystem

# CONFIG_POWERCAP is not set
# CONFIG_MCB is not set

#
# Performance monitor support
#
# CONFIG_DWC_PCIE_PMU is not set
# end of Performance monitor support

CONFIG_RAS=y
CONFIG_USB4=y
# CONFIG_USB4_DEBUGFS_WRITE is not set
# CONFIG_USB4_DMA_TEST is not set

#
# Android
#
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder0,binder1"
# end of Android

CONFIG_LIBNVDIMM=y
CONFIG_BLK_DEV_PMEM=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_OF_PMEM=y
# CONFIG_RAMDAX is not set
CONFIG_NVDIMM_KEYS=y
# CONFIG_NVDIMM_SECURITY_TEST is not set
CONFIG_DAX=y
CONFIG_NVMEM=y
CONFIG_NVMEM_SYSFS=y
CONFIG_NVMEM_LAYOUTS=y

#
# Layout Types
#
# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set
# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set
# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set
# end of Layout Types

# CONFIG_NVMEM_RMEM is not set
# CONFIG_NVMEM_U_BOOT_ENV 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=y
CONFIG_TEE_DMABUF_HEAPS=y
CONFIG_OPTEE_STATIC_PROTMEM_POOL=y
# CONFIG_MUX_CORE is not set
# CONFIG_SIOX is not set
# CONFIG_SLIMBUS is not set
# CONFIG_INTERCONNECT is not set
CONFIG_COUNTER=y
# CONFIG_INTEL_QEP is not set
# CONFIG_INTERRUPT_CNT is not set
CONFIG_MOST=y
CONFIG_MOST_USB_HDM=y
# CONFIG_MOST_CDEV is not set
# CONFIG_MOST_SND is not set
# CONFIG_PECI is not set
# CONFIG_HTE is not set
# end of Device Drivers

#
# File systems
#
CONFIG_DCACHE_WORD_ACCESS=y
CONFIG_VALIDATE_FS_PARSER=y
CONFIG_FS_IOMAP=y
CONFIG_FS_STACK=y
CONFIG_BUFFER_HEAD=y
CONFIG_LEGACY_DIRECT_IO=y
# CONFIG_EXT2_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_JFS_FS=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_JFS_SECURITY=y
CONFIG_JFS_DEBUG=y
# CONFIG_JFS_STATISTICS is not set
CONFIG_XFS_FS=y
# CONFIG_XFS_SUPPORT_V4 is not set
# CONFIG_XFS_SUPPORT_ASCII_CI is not set
CONFIG_XFS_QUOTA=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_XFS_RT=y
# CONFIG_XFS_ONLINE_SCRUB is not set
# CONFIG_XFS_WARN is not set
# CONFIG_XFS_DEBUG is not set
CONFIG_GFS2_FS=y
CONFIG_GFS2_FS_LOCKING_DLM=y
CONFIG_OCFS2_FS=y
CONFIG_OCFS2_FS_O2CB=y
CONFIG_OCFS2_FS_USERSPACE_CLUSTER=y
CONFIG_OCFS2_FS_STATS=y
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
CONFIG_OCFS2_DEBUG_FS=y
CONFIG_BTRFS_FS=y
CONFIG_BTRFS_FS_POSIX_ACL=y
# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
# CONFIG_BTRFS_DEBUG is not set
CONFIG_BTRFS_ASSERT=y
# CONFIG_BTRFS_EXPERIMENTAL is not set
CONFIG_NILFS2_FS=y
CONFIG_F2FS_FS=y
CONFIG_F2FS_STAT_FS=y
CONFIG_F2FS_FS_XATTR=y
CONFIG_F2FS_FS_POSIX_ACL=y
CONFIG_F2FS_FS_SECURITY=y
CONFIG_F2FS_CHECK_FS=y
CONFIG_F2FS_FAULT_INJECTION=y
CONFIG_F2FS_FS_COMPRESSION=y
CONFIG_F2FS_FS_LZO=y
CONFIG_F2FS_FS_LZORLE=y
CONFIG_F2FS_FS_LZ4=y
CONFIG_F2FS_FS_LZ4HC=y
CONFIG_F2FS_FS_ZSTD=y
# CONFIG_F2FS_IOSTAT is not set
# CONFIG_F2FS_UNFAIR_RWSEM is not set
CONFIG_ZONEFS_FS=y
CONFIG_FS_DAX=y
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=y
CONFIG_EXPORTFS_BLOCK_OPS=y
CONFIG_FILE_LOCKING=y
CONFIG_FS_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_ALGS=y
# CONFIG_FS_ENCRYPTION_INLINE_CRYPT is not set
CONFIG_FS_VERITY=y
CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=y
# CONFIG_QFMT_V1 is not set
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
CONFIG_AUTOFS_FS=y
CONFIG_FUSE_FS=y
CONFIG_CUSE=y
CONFIG_VIRTIO_FS=y
CONFIG_FUSE_DAX=y
# CONFIG_FUSE_PASSTHROUGH is not set
# CONFIG_FUSE_IO_URING is not set
CONFIG_OVERLAY_FS=y
CONFIG_OVERLAY_FS_REDIRECT_DIR=y
CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
CONFIG_OVERLAY_FS_INDEX=y
# CONFIG_OVERLAY_FS_NFS_EXPORT is not set
# CONFIG_OVERLAY_FS_XINO_AUTO is not set
# CONFIG_OVERLAY_FS_METACOPY is not set
CONFIG_OVERLAY_FS_DEBUG=y

#
# Caches
#
CONFIG_NETFS_SUPPORT=y
# CONFIG_NETFS_STATS is not set
# CONFIG_NETFS_DEBUG is not set
CONFIG_FSCACHE=y
# CONFIG_FSCACHE_STATS is not set
CONFIG_CACHEFILES=y
# CONFIG_CACHEFILES_DEBUG is not set
# CONFIG_CACHEFILES_ERROR_INJECTION is not set
# CONFIG_CACHEFILES_ONDEMAND 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="iso8859-1"
# CONFIG_FAT_DEFAULT_UTF8 is not set
CONFIG_EXFAT_FS=y
CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8"
# CONFIG_NTFS_FS is not set
CONFIG_NTFS3_FS=y
# CONFIG_NTFS3_64BIT_CLUSTER is not set
CONFIG_NTFS3_LZX_XPRESS=y
CONFIG_NTFS3_FS_POSIX_ACL=y
# end of DOS/FAT/EXFAT/NT Filesystems

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set
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=y
CONFIG_TMPFS_XATTR=y
# CONFIG_TMPFS_INODE64 is not set
CONFIG_TMPFS_QUOTA=y
CONFIG_ARCH_SUPPORTS_HUGETLBFS=y
CONFIG_HUGETLBFS=y
# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set
CONFIG_HUGETLB_PAGE=y
CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING=y
CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
CONFIG_CONFIGFS_FS=y
# end of Pseudo filesystems

CONFIG_MISC_FILESYSTEMS=y
CONFIG_ORANGEFS_FS=y
CONFIG_ADFS_FS=y
# CONFIG_ADFS_FS_RW is not set
CONFIG_AFFS_FS=y
CONFIG_ECRYPT_FS=y
CONFIG_ECRYPT_FS_MESSAGING=y
CONFIG_HFS_FS=y
CONFIG_HFSPLUS_FS=y
CONFIG_BEFS_FS=y
# CONFIG_BEFS_DEBUG is not set
CONFIG_BFS_FS=y
CONFIG_EFS_FS=y
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
CONFIG_JFFS2_FS_WRITEBUFFER=y
# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
CONFIG_JFFS2_SUMMARY=y
CONFIG_JFFS2_FS_XATTR=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_JFFS2_FS_SECURITY=y
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
CONFIG_JFFS2_ZLIB=y
CONFIG_JFFS2_LZO=y
CONFIG_JFFS2_RTIME=y
CONFIG_JFFS2_RUBIN=y
# CONFIG_JFFS2_CMODE_NONE is not set
CONFIG_JFFS2_CMODE_PRIORITY=y
# CONFIG_JFFS2_CMODE_SIZE is not set
# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
CONFIG_UBIFS_FS=y
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_UBIFS_FS_ZSTD=y
CONFIG_UBIFS_ATIME_SUPPORT=y
CONFIG_UBIFS_FS_XATTR=y
CONFIG_UBIFS_FS_SECURITY=y
# CONFIG_UBIFS_FS_AUTHENTICATION is not set
CONFIG_CRAMFS=y
CONFIG_CRAMFS_BLOCKDEV=y
CONFIG_CRAMFS_MTD=y
CONFIG_SQUASHFS=y
# CONFIG_SQUASHFS_FILE_CACHE is not set
CONFIG_SQUASHFS_FILE_DIRECT=y
CONFIG_SQUASHFS_DECOMP_MULTI=y
# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set
# CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE is not set
CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI=y
# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU is not set
# CONFIG_SQUASHFS_MOUNT_DECOMP_THREADS is not set
CONFIG_SQUASHFS_XATTR=y
# CONFIG_SQUASHFS_COMP_CACHE_FULL is not set
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=y
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
CONFIG_VXFS_FS=y
CONFIG_MINIX_FS=y
CONFIG_OMFS_FS=y
CONFIG_HPFS_FS=y
CONFIG_QNX4FS_FS=y
CONFIG_QNX6FS_FS=y
# CONFIG_QNX6FS_DEBUG is not set
CONFIG_ROMFS_FS=y
# CONFIG_ROMFS_BACKED_BY_BLOCK is not set
# CONFIG_ROMFS_BACKED_BY_MTD is not set
CONFIG_ROMFS_BACKED_BY_BOTH=y
CONFIG_ROMFS_ON_BLOCK=y
CONFIG_ROMFS_ON_MTD=y
CONFIG_PSTORE=y
CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240
CONFIG_PSTORE_COMPRESS=y
# CONFIG_PSTORE_CONSOLE is not set
# CONFIG_PSTORE_PMSG is not set
# CONFIG_PSTORE_RAM is not set
# CONFIG_PSTORE_BLK is not set
CONFIG_UFS_FS=y
CONFIG_UFS_FS_WRITE=y
# CONFIG_UFS_DEBUG is not set
CONFIG_EROFS_FS=y
# CONFIG_EROFS_FS_DEBUG is not set
CONFIG_EROFS_FS_XATTR=y
CONFIG_EROFS_FS_POSIX_ACL=y
CONFIG_EROFS_FS_SECURITY=y
# CONFIG_EROFS_FS_BACKED_BY_FILE is not set
CONFIG_EROFS_FS_ZIP=y
# CONFIG_EROFS_FS_ZIP_LZMA is not set
# CONFIG_EROFS_FS_ZIP_DEFLATE is not set
# CONFIG_EROFS_FS_ZIP_ZSTD is not set
# CONFIG_EROFS_FS_ZIP_ACCEL is not set
# CONFIG_EROFS_FS_ONDEMAND is not set
# CONFIG_EROFS_FS_PCPU_KTHREAD is not set
# CONFIG_EROFS_FS_PAGE_CACHE_SHARE is not set
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
# CONFIG_NFS_V2 is not set
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
# CONFIG_NFS_SWAP is not set
CONFIG_NFS_V4_0=y
CONFIG_NFS_V4_2=y
CONFIG_PNFS_FILE_LAYOUT=y
CONFIG_PNFS_BLOCK=y
CONFIG_PNFS_FLEXFILE_LAYOUT=y
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
# CONFIG_NFS_V4_1_MIGRATION is not set
CONFIG_NFS_V4_SECURITY_LABEL=y
CONFIG_ROOT_NFS=y
CONFIG_NFS_FSCACHE=y
# CONFIG_NFS_USE_LEGACY_DNS is not set
CONFIG_NFS_USE_KERNEL_DNS=y
# CONFIG_NFS_DISABLE_UDP_SUPPORT is not set
CONFIG_NFS_V4_2_READ_PLUS=y
CONFIG_NFSD=y
# CONFIG_NFSD_V2 is not set
CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y
CONFIG_NFSD_PNFS=y
CONFIG_NFSD_BLOCKLAYOUT=y
CONFIG_NFSD_SCSILAYOUT=y
CONFIG_NFSD_FLEXFILELAYOUT=y
CONFIG_NFSD_V4_2_INTER_SSC=y
CONFIG_NFSD_V4_SECURITY_LABEL=y
# CONFIG_NFSD_LEGACY_CLIENT_TRACKING is not set
# CONFIG_NFSD_V4_POSIX_ACLS is not set
CONFIG_GRACE_PERIOD=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_NFS_ACL_SUPPORT=y
CONFIG_NFS_COMMON=y
# CONFIG_NFS_LOCALIO is not set
CONFIG_NFS_V4_2_SSC_HELPER=y
CONFIG_SUNRPC=y
CONFIG_SUNRPC_GSS=y
CONFIG_SUNRPC_BACKCHANNEL=y
CONFIG_RPCSEC_GSS_KRB5=y
# CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA1 is not set
# CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_CAMELLIA is not set
# CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA2 is not set
# CONFIG_SUNRPC_DEBUG is not set
# CONFIG_SUNRPC_XPRT_RDMA is not set
CONFIG_CEPH_FS=y
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=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=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=y
CONFIG_CIFS_SMB_DIRECT=y
CONFIG_CIFS_FSCACHE=y
# CONFIG_CIFS_ROOT is not set
# CONFIG_CIFS_COMPRESSION is not set
CONFIG_SMB_SERVER=y
# CONFIG_SMB_SERVER_SMBDIRECT is not set
# CONFIG_SMB_SERVER_CHECK_CAP_NET_ADMIN is not set
# CONFIG_SMB_SERVER_KERBEROS5 is not set
CONFIG_SMB_COMMON_SMBDIRECT=y
CONFIG_SMBFS=y
# CONFIG_CODA_FS is not set
CONFIG_AFS_FS=y
# CONFIG_AFS_DEBUG is not set
CONFIG_AFS_FSCACHE=y
# CONFIG_AFS_DEBUG_CURSOR 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="utf8"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_CODEPAGE_737=y
CONFIG_NLS_CODEPAGE_775=y
CONFIG_NLS_CODEPAGE_850=y
CONFIG_NLS_CODEPAGE_852=y
CONFIG_NLS_CODEPAGE_855=y
CONFIG_NLS_CODEPAGE_857=y
CONFIG_NLS_CODEPAGE_860=y
CONFIG_NLS_CODEPAGE_861=y
CONFIG_NLS_CODEPAGE_862=y
CONFIG_NLS_CODEPAGE_863=y
CONFIG_NLS_CODEPAGE_864=y
CONFIG_NLS_CODEPAGE_865=y
CONFIG_NLS_CODEPAGE_866=y
CONFIG_NLS_CODEPAGE_869=y
CONFIG_NLS_CODEPAGE_936=y
CONFIG_NLS_CODEPAGE_950=y
CONFIG_NLS_CODEPAGE_932=y
CONFIG_NLS_CODEPAGE_949=y
CONFIG_NLS_CODEPAGE_874=y
CONFIG_NLS_ISO8859_8=y
CONFIG_NLS_CODEPAGE_1250=y
CONFIG_NLS_CODEPAGE_1251=y
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_2=y
CONFIG_NLS_ISO8859_3=y
CONFIG_NLS_ISO8859_4=y
CONFIG_NLS_ISO8859_5=y
CONFIG_NLS_ISO8859_6=y
CONFIG_NLS_ISO8859_7=y
CONFIG_NLS_ISO8859_9=y
CONFIG_NLS_ISO8859_13=y
CONFIG_NLS_ISO8859_14=y
CONFIG_NLS_ISO8859_15=y
CONFIG_NLS_KOI8_R=y
CONFIG_NLS_KOI8_U=y
CONFIG_NLS_MAC_ROMAN=y
CONFIG_NLS_MAC_CELTIC=y
CONFIG_NLS_MAC_CENTEURO=y
CONFIG_NLS_MAC_CROATIAN=y
CONFIG_NLS_MAC_CYRILLIC=y
CONFIG_NLS_MAC_GAELIC=y
CONFIG_NLS_MAC_GREEK=y
CONFIG_NLS_MAC_ICELAND=y
CONFIG_NLS_MAC_INUIT=y
CONFIG_NLS_MAC_ROMANIAN=y
CONFIG_NLS_MAC_TURKISH=y
CONFIG_NLS_UTF8=y
CONFIG_NLS_UCS2_UTILS=y
CONFIG_DLM=y
# CONFIG_DLM_DEBUG is not set
CONFIG_UNICODE=y
CONFIG_IO_WQ=y
# end of File systems

#
# Security options
#
CONFIG_KEYS=y
CONFIG_KEYS_REQUEST_CACHE=y
CONFIG_PERSISTENT_KEYRINGS=y
CONFIG_BIG_KEYS=y
CONFIG_TRUSTED_KEYS=y
# CONFIG_TRUSTED_KEYS_TPM is not set
# CONFIG_TRUSTED_KEYS_TEE is not set

#
# No trust source selected!
#
CONFIG_ENCRYPTED_KEYS=y
# CONFIG_USER_DECRYPTED_DATA is not set
CONFIG_KEY_DH_OPERATIONS=y
CONFIG_KEY_NOTIFICATIONS=y
# CONFIG_SECURITY_DMESG_RESTRICT is not set
CONFIG_PROC_MEM_ALWAYS_FORCE=y
# CONFIG_PROC_MEM_FORCE_PTRACE is not set
# CONFIG_PROC_MEM_NO_FORCE is not set
CONFIG_SECURITY=y
CONFIG_HAS_SECURITY_AUDIT=y
CONFIG_SECURITYFS=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_INFINIBAND=y
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_SECURITY_PATH=y
# CONFIG_INTEL_TXT is not set
# CONFIG_STATIC_USERMODEHELPER is not set
# CONFIG_SECURITY_SELINUX is not set
CONFIG_SECURITY_SMACK=y
# CONFIG_SECURITY_SMACK_BRINGUP is not set
CONFIG_SECURITY_SMACK_NETFILTER=y
# CONFIG_SECURITY_SMACK_APPEND_SIGNALS is not set
CONFIG_SECURITY_TOMOYO=y
CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=64
CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=32
CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER=y
CONFIG_SECURITY_TOMOYO_INSECURE_BUILTIN_SETTING=y
# CONFIG_SECURITY_APPARMOR is not set
# CONFIG_SECURITY_LOADPIN is not set
CONFIG_SECURITY_YAMA=y
CONFIG_SECURITY_SAFESETID=y
CONFIG_SECURITY_LOCKDOWN_LSM=y
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE=y
# CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY is not set
# CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY is not set
CONFIG_SECURITY_LANDLOCK=y
# CONFIG_SECURITY_IPE is not set
CONFIG_INTEGRITY=y
CONFIG_INTEGRITY_SIGNATURE=y
CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y
CONFIG_INTEGRITY_TRUSTED_KEYRING=y
CONFIG_INTEGRITY_AUDIT=y
CONFIG_IMA=y
CONFIG_IMA_MEASURE_PCR_IDX=10
CONFIG_IMA_LSM_RULES=y
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=y
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 is not set
CONFIG_IMA_APPRAISE_MODSIG=y
# CONFIG_IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is not set
# CONFIG_IMA_BLACKLIST_KEYRING is not set
# CONFIG_IMA_LOAD_X509 is not set
CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS=y
CONFIG_IMA_QUEUE_EARLY_BOOT_KEYS=y
# CONFIG_IMA_DISABLE_HTABLE is not set
CONFIG_EVM=y
CONFIG_EVM_ATTR_FSUUID=y
CONFIG_EVM_EXTRA_SMACK_XATTRS=y
CONFIG_EVM_ADD_XATTRS=y
# CONFIG_EVM_LOAD_X509 is not set
CONFIG_DEFAULT_SECURITY_SMACK=y
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
# CONFIG_DEFAULT_SECURITY_DAC is not set
CONFIG_LSM="landlock,lockdown,yama,safesetid,integrity,tomoyo,smack,bpf"

#
# Kernel hardening options
#

#
# Memory initialization
#
CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y
CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y
CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y
# CONFIG_INIT_STACK_NONE is not set
# CONFIG_INIT_STACK_ALL_PATTERN is not set
CONFIG_INIT_STACK_ALL_ZERO=y
CONFIG_CC_HAS_SANCOV_STACK_DEPTH_CALLBACK=y
# CONFIG_KSTACK_ERASE is not set
CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y
# CONFIG_ZERO_CALL_USED_REGS is not set
# end of Memory initialization

#
# Bounds checking
#
CONFIG_FORTIFY_SOURCE=y
CONFIG_HARDENED_USERCOPY=y
# CONFIG_HARDENED_USERCOPY_DEFAULT_ON is not set
# end of Bounds checking

#
# Hardening of kernel data structures
#
CONFIG_LIST_HARDENED=y
CONFIG_BUG_ON_DATA_CORRUPTION=y
# end of Hardening of kernel data structures

CONFIG_CC_HAS_RANDSTRUCT=y
CONFIG_RANDSTRUCT_NONE=y
# CONFIG_RANDSTRUCT_FULL is not set
# end of Kernel hardening options
# end of Security options

CONFIG_ASYNC_CORE=y
CONFIG_ASYNC_MEMCPY=y
CONFIG_ASYNC_XOR=y
CONFIG_ASYNC_PQ=y
CONFIG_ASYNC_RAID6_RECOV=y
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_SIG=y
CONFIG_CRYPTO_SIG2=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_AKCIPHER2=y
CONFIG_CRYPTO_AKCIPHER=y
CONFIG_CRYPTO_KPP2=y
CONFIG_CRYPTO_KPP=y
CONFIG_CRYPTO_ACOMP2=y
CONFIG_CRYPTO_ACOMP=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
CONFIG_CRYPTO_USER=y
# CONFIG_CRYPTO_SELFTESTS is not set
# CONFIG_CRYPTO_NULL is not set
CONFIG_CRYPTO_PCRYPT=y
CONFIG_CRYPTO_CRYPTD=y
CONFIG_CRYPTO_AUTHENC=y
CONFIG_CRYPTO_KRB5ENC=y
# CONFIG_CRYPTO_BENCHMARK is not set
CONFIG_CRYPTO_ENGINE=y
# end of Crypto core or helper

#
# Public-key cryptography
#
CONFIG_CRYPTO_RSA=y
CONFIG_CRYPTO_DH=y
# CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set
CONFIG_CRYPTO_ECC=y
CONFIG_CRYPTO_ECDH=y
# CONFIG_CRYPTO_ECDSA is not set
CONFIG_CRYPTO_ECRDSA=y
# CONFIG_CRYPTO_MLDSA is not set
# end of Public-key cryptography

#
# Block ciphers
#
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_ANUBIS=y
CONFIG_CRYPTO_ARIA=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_SEED=y
CONFIG_CRYPTO_SERPENT=y
CONFIG_CRYPTO_SM4=y
CONFIG_CRYPTO_SM4_GENERIC=y
CONFIG_CRYPTO_TEA=y
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_TWOFISH_COMMON=y
# end of Block ciphers

#
# Length-preserving ciphers and modes
#
CONFIG_CRYPTO_ADIANTUM=y
CONFIG_CRYPTO_ARC4=y
CONFIG_CRYPTO_CHACHA20=y
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_CTR=y
CONFIG_CRYPTO_CTS=y
CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_HCTR2=y
CONFIG_CRYPTO_LRW=y
CONFIG_CRYPTO_PCBC=y
CONFIG_CRYPTO_XCTR=y
CONFIG_CRYPTO_XTS=y
# end of Length-preserving ciphers and modes

#
# AEAD (authenticated encryption with associated data) ciphers
#
CONFIG_CRYPTO_AEGIS128=y
CONFIG_CRYPTO_CHACHA20POLY1305=y
CONFIG_CRYPTO_CCM=y
CONFIG_CRYPTO_GCM=y
CONFIG_CRYPTO_GENIV=y
CONFIG_CRYPTO_SEQIV=y
CONFIG_CRYPTO_ECHAINIV=y
CONFIG_CRYPTO_ESSIV=y
# end of AEAD (authenticated encryption with associated data) ciphers

#
# Hashes, digests, and MACs
#
# CONFIG_CRYPTO_BLAKE2B is not set
CONFIG_CRYPTO_CMAC=y
CONFIG_CRYPTO_HMAC=y
# CONFIG_CRYPTO_MD4 is not set
# CONFIG_CRYPTO_MD5 is not set
CONFIG_CRYPTO_RMD160=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA256=y
CONFIG_CRYPTO_SHA512=y
CONFIG_CRYPTO_SHA3=y
# CONFIG_CRYPTO_SM3 is not set
CONFIG_CRYPTO_STREEBOG=y
CONFIG_CRYPTO_WP512=y
CONFIG_CRYPTO_XCBC=y
# CONFIG_CRYPTO_XXHASH is not set
# end of Hashes, digests, and MACs

#
# CRCs (cyclic redundancy checks)
#
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_CRC32 is not set
# end of CRCs (cyclic redundancy checks)

#
# Compression
#
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_LZO=y
CONFIG_CRYPTO_842=y
CONFIG_CRYPTO_LZ4=y
CONFIG_CRYPTO_LZ4HC=y
CONFIG_CRYPTO_ZSTD=y
# end of Compression

#
# Random number generation
#
CONFIG_CRYPTO_DRBG_MENU=y
CONFIG_CRYPTO_DRBG_HMAC=y
CONFIG_CRYPTO_DRBG_HASH=y
CONFIG_CRYPTO_DRBG_CTR=y
CONFIG_CRYPTO_DRBG=y
CONFIG_CRYPTO_JITTERENTROPY=y
CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64
CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32
CONFIG_CRYPTO_JITTERENTROPY_OSR=1
CONFIG_CRYPTO_KDF800108_CTR=y
CONFIG_CRYPTO_DF80090A=y
# end of Random number generation

#
# Userspace interface
#
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
# end of Userspace interface

#
# Accelerated Cryptographic Algorithms for CPU (x86)
#
CONFIG_CRYPTO_AES_NI_INTEL=y
CONFIG_CRYPTO_BLOWFISH_X86_64=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_CAST5_AVX_X86_64=y
CONFIG_CRYPTO_CAST6_AVX_X86_64=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_AESNI_AVX_X86_64=y
CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64=y
CONFIG_CRYPTO_TWOFISH_X86_64=y
CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=y
CONFIG_CRYPTO_TWOFISH_AVX_X86_64=y
CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64=y
# CONFIG_CRYPTO_ARIA_AESNI_AVX2_X86_64 is not set
# CONFIG_CRYPTO_ARIA_GFNI_AVX512_X86_64 is not set
CONFIG_CRYPTO_AEGIS128_AESNI_SSE2=y
# end of Accelerated Cryptographic Algorithms for CPU (x86)

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=y
CONFIG_CRYPTO_DEV_CCP_DD=y
# CONFIG_CRYPTO_DEV_SP_CCP is not set
# CONFIG_CRYPTO_DEV_SP_PSP is not set
# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set
CONFIG_CRYPTO_DEV_QAT=y
CONFIG_CRYPTO_DEV_QAT_DH895xCC=y
CONFIG_CRYPTO_DEV_QAT_C3XXX=y
CONFIG_CRYPTO_DEV_QAT_C62X=y
# CONFIG_CRYPTO_DEV_QAT_4XXX is not set
# CONFIG_CRYPTO_DEV_QAT_420XX is not set
# CONFIG_CRYPTO_DEV_QAT_6XXX is not set
CONFIG_CRYPTO_DEV_QAT_DH895xCCVF=y
CONFIG_CRYPTO_DEV_QAT_C3XXXVF=y
CONFIG_CRYPTO_DEV_QAT_C62XVF=y
# CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION is not set
CONFIG_CRYPTO_DEV_VIRTIO=y
# CONFIG_CRYPTO_DEV_SAFEXCEL is not set
# CONFIG_CRYPTO_DEV_CCREE is not set
# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set
CONFIG_ASYMMETRIC_KEY_TYPE=y
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
CONFIG_X509_CERTIFICATE_PARSER=y
CONFIG_PKCS8_PRIVATE_KEY_PARSER=y
CONFIG_PKCS7_MESSAGE_PARSER=y
CONFIG_PKCS7_TEST_KEY=y
CONFIG_SIGNED_PE_FILE_VERIFICATION=y
# CONFIG_FIPS_SIGNATURE_SELFTEST is not set

#
# Certificates for signature checking
#
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
# CONFIG_MODULE_SIG_KEY_TYPE_MLDSA_44 is not set
# CONFIG_MODULE_SIG_KEY_TYPE_MLDSA_65 is not set
# CONFIG_MODULE_SIG_KEY_TYPE_MLDSA_87 is not set
CONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_SYSTEM_TRUSTED_KEYS=""
# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
CONFIG_SECONDARY_TRUSTED_KEYRING=y
# CONFIG_SECONDARY_TRUSTED_KEYRING_SIGNED_BY_BUILTIN is not set
# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
CONFIG_OPENSSL_SUPPORTS_ML_DSA=y
# end of Certificates for signature checking

CONFIG_CRYPTO_KRB5=y
# CONFIG_CRYPTO_KRB5_SELFTESTS is not set
CONFIG_BINARY_PRINTF=y

#
# Library routines
#
CONFIG_RAID6_PQ=y
# CONFIG_RAID6_PQ_BENCHMARK is not set
CONFIG_LINEAR_RANGES=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_CORDIC is not set
# CONFIG_PRIME_NUMBERS is not set
CONFIG_RATIONAL=y
CONFIG_GENERIC_IOMAP=y
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
CONFIG_ARCH_USE_SYM_ANNOTATIONS=y
CONFIG_CRC8=y
CONFIG_CRC16=y
CONFIG_CRC_CCITT=y
CONFIG_CRC_ITU_T=y
CONFIG_CRC_T10DIF=y
CONFIG_CRC_T10DIF_ARCH=y
CONFIG_CRC32=y
CONFIG_CRC32_ARCH=y
CONFIG_CRC64=y
CONFIG_CRC64_ARCH=y
CONFIG_CRC_OPTIMIZATIONS=y
CONFIG_CRYPTO_HASH_INFO=y
CONFIG_CRYPTO_LIB_UTILS=y
CONFIG_CRYPTO_LIB_AES=y
CONFIG_CRYPTO_LIB_AES_ARCH=y
CONFIG_CRYPTO_LIB_AES_CBC_MACS=y
CONFIG_CRYPTO_LIB_ARC4=y
CONFIG_CRYPTO_LIB_GF128MUL=y
CONFIG_CRYPTO_LIB_BLAKE2B=y
CONFIG_CRYPTO_LIB_BLAKE2S_ARCH=y
CONFIG_CRYPTO_LIB_CHACHA=y
CONFIG_CRYPTO_LIB_CHACHA_ARCH=y
CONFIG_CRYPTO_LIB_CURVE25519=y
CONFIG_CRYPTO_LIB_CURVE25519_ARCH=y
CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y
CONFIG_CRYPTO_LIB_DES=y
CONFIG_CRYPTO_LIB_GF128HASH=y
CONFIG_CRYPTO_LIB_GF128HASH_ARCH=y
CONFIG_CRYPTO_LIB_MD5=y
CONFIG_CRYPTO_LIB_NH=y
CONFIG_CRYPTO_LIB_NH_ARCH=y
CONFIG_CRYPTO_LIB_POLY1305=y
CONFIG_CRYPTO_LIB_POLY1305_ARCH=y
CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y
CONFIG_CRYPTO_LIB_SHA1=y
CONFIG_CRYPTO_LIB_SHA1_ARCH=y
CONFIG_CRYPTO_LIB_SHA256=y
CONFIG_CRYPTO_LIB_SHA256_ARCH=y
CONFIG_CRYPTO_LIB_SHA512=y
CONFIG_CRYPTO_LIB_SHA512_ARCH=y
CONFIG_CRYPTO_LIB_SHA3=y
CONFIG_XOR_BLOCKS=y
CONFIG_XOR_BLOCKS_ARCH=y
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_COMMON=y
CONFIG_ZSTD_COMPRESS=y
CONFIG_ZSTD_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
CONFIG_XZ_DEC_POWERPC=y
CONFIG_XZ_DEC_ARM=y
CONFIG_XZ_DEC_ARMTHUMB=y
CONFIG_XZ_DEC_ARM64=y
CONFIG_XZ_DEC_SPARC=y
CONFIG_XZ_DEC_RISCV=y
# CONFIG_XZ_DEC_MICROLZMA is not set
CONFIG_XZ_DEC_BCJ=y
# CONFIG_XZ_DEC_TEST is not set
CONFIG_DECOMPRESS_GZIP=y
CONFIG_DECOMPRESS_BZIP2=y
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DECOMPRESS_XZ=y
CONFIG_DECOMPRESS_LZO=y
CONFIG_DECOMPRESS_LZ4=y
CONFIG_DECOMPRESS_ZSTD=y
CONFIG_GENERIC_ALLOCATOR=y
CONFIG_REED_SOLOMON=y
CONFIG_REED_SOLOMON_DEC8=y
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=y
CONFIG_TEXTSEARCH_BM=y
CONFIG_TEXTSEARCH_FSM=y
CONFIG_INTERVAL_TREE=y
CONFIG_INTERVAL_TREE_SPAN_ITER=y
CONFIG_XARRAY_MULTI=y
CONFIG_ASSOCIATIVE_ARRAY=y
CONFIG_CLOSURES=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_IOPORT_MAP=y
CONFIG_HAS_DMA=y
CONFIG_DMA_OPS_HELPERS=y
CONFIG_NEED_SG_DMA_FLAGS=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_SWIOTLB=y
# CONFIG_SWIOTLB_DYNAMIC is not set
CONFIG_DMA_NEED_SYNC=y
# CONFIG_DMA_RESTRICTED_POOL is not set
CONFIG_DMA_CMA=y
# CONFIG_DMA_NUMA_CMA is not set

#
# Default contiguous memory area size:
#
CONFIG_CMA_SIZE_MBYTES=0
CONFIG_CMA_SIZE_PERCENTAGE=0
# CONFIG_CMA_SIZE_SEL_MBYTES is not set
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
# CONFIG_CMA_SIZE_SEL_MIN is not set
CONFIG_CMA_SIZE_SEL_MAX=y
CONFIG_CMA_ALIGNMENT=8
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_DMA_MAP_BENCHMARK is not set
CONFIG_SGL_ALLOC=y
CONFIG_CHECK_SIGNATURE=y
# CONFIG_CPUMASK_OFFSTACK is not set
CONFIG_CPU_RMAP=y
CONFIG_DQL=y
CONFIG_GLOB=y
CONFIG_NLATTR=y
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_HAVE_GENERIC_VDSO=y
CONFIG_GENERIC_GETTIMEOFDAY=y
CONFIG_GENERIC_VDSO_OVERFLOW_PROTECT=y
CONFIG_VDSO_GETRANDOM=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_CPU_CACHE_INVALIDATE_MEMREGION=y
CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y
CONFIG_ARCH_HAS_COPY_MC=y
CONFIG_ARCH_STACKWALK=y
CONFIG_STACKDEPOT=y
CONFIG_STACKDEPOT_ALWAYS_INIT=y
CONFIG_STACKDEPOT_MAX_FRAMES=64
CONFIG_REF_TRACKER=y
CONFIG_SBITMAP=y
# CONFIG_LWQ_TEST is not set
# end of Library routines

CONFIG_FIRMWARE_TABLE=y
CONFIG_UNION_FIND=y

#
# Kernel hacking
#

#
# printk and dmesg options
#
CONFIG_PRINTK_TIME=y
CONFIG_PRINTK_CALLER=y
# CONFIG_STACKTRACE_BUILD_ID 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=y
CONFIG_DYNAMIC_DEBUG_CORE=y
CONFIG_SYMBOLIC_ERRNAME=y
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_BUGVERBOSE_DETAILED=y
# end of printk and dmesg options

CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_MISC=y

#
# Compile-time checks and compiler options
#
CONFIG_DEBUG_INFO=y
CONFIG_AS_HAS_NON_CONST_ULEB128=y
# CONFIG_DEBUG_INFO_NONE is not set
# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set
CONFIG_DEBUG_INFO_DWARF4=y
# CONFIG_DEBUG_INFO_DWARF5 is not set
# CONFIG_DEBUG_INFO_REDUCED is not set
CONFIG_DEBUG_INFO_COMPRESSED_NONE=y
# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set
# CONFIG_DEBUG_INFO_COMPRESSED_ZSTD is not set
# CONFIG_DEBUG_INFO_SPLIT is not set
# CONFIG_DEBUG_INFO_BTF is not set
CONFIG_PAHOLE_HAS_BTF_TAG=y
CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y
# CONFIG_GDB_SCRIPTS is not set
CONFIG_FRAME_WARN=2048
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_HEADERS_INSTALL is not set
CONFIG_SECTION_MISMATCH_WARN_ONLY=y
# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set
CONFIG_OBJTOOL=y
# CONFIG_OBJTOOL_WERROR is not set
CONFIG_NOINSTR_VALIDATION=y
# CONFIG_VMLINUX_MAP is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# end of Compile-time checks and compiler options

#
# Generic Kernel Debugging Instruments
#
# CONFIG_MAGIC_SYSRQ is not set
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_FS_ALLOW_ALL=y
# CONFIG_DEBUG_FS_ALLOW_NONE is not set
CONFIG_HAVE_ARCH_KGDB=y
# CONFIG_KGDB is not set
CONFIG_ARCH_HAS_UBSAN=y
CONFIG_UBSAN=y
# CONFIG_UBSAN_TRAP is not set
CONFIG_CC_HAS_UBSAN_ARRAY_BOUNDS=y
CONFIG_UBSAN_BOUNDS=y
CONFIG_UBSAN_ARRAY_BOUNDS=y
CONFIG_UBSAN_SHIFT=y
# CONFIG_UBSAN_BOOL is not set
# CONFIG_UBSAN_ENUM is not set
# CONFIG_UBSAN_ALIGNMENT is not set
# CONFIG_TEST_UBSAN is not set
CONFIG_HAVE_ARCH_KCSAN=y
CONFIG_HAVE_KCSAN_COMPILER=y
# end of Generic Kernel Debugging Instruments

#
# Networking Debugging
#
CONFIG_NET_DEV_REFCNT_TRACKER=y
CONFIG_NET_NS_REFCNT_TRACKER=y
CONFIG_DEBUG_NET=y
# CONFIG_DEBUG_NET_SMALL_RTNL is not set
# end of Networking Debugging

#
# Memory Debugging
#
CONFIG_PAGE_EXTENSION=y
# CONFIG_DEBUG_PAGEALLOC is not set
CONFIG_SLUB_DEBUG=y
# CONFIG_SLUB_DEBUG_ON is not set
CONFIG_SLUB_RCU_DEBUG=y
CONFIG_PAGE_OWNER=y
CONFIG_PAGE_TABLE_CHECK=y
CONFIG_PAGE_TABLE_CHECK_ENFORCED=y
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=y
CONFIG_ARCH_HAS_PTDUMP=y
CONFIG_PTDUMP=y
CONFIG_PTDUMP_DEBUGFS=y
CONFIG_HAVE_DEBUG_KMEMLEAK=y
# CONFIG_DEBUG_KMEMLEAK is not set
# CONFIG_PER_VMA_LOCK_STATS is not set
CONFIG_DEBUG_OBJECTS=y
# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
CONFIG_DEBUG_OBJECTS_FREE=y
CONFIG_DEBUG_OBJECTS_TIMERS=y
CONFIG_DEBUG_OBJECTS_WORK=y
CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
# CONFIG_SHRINKER_DEBUG is not set
CONFIG_DEBUG_STACK_USAGE=y
CONFIG_SCHED_STACK_END_CHECK=y
CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
CONFIG_DEBUG_VFS=y
CONFIG_DEBUG_VM=y
CONFIG_DEBUG_VM_MAPLE_TREE=y
CONFIG_DEBUG_VM_RB=y
CONFIG_DEBUG_VM_PGFLAGS=y
CONFIG_DEBUG_VM_PGTABLE=y
CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
CONFIG_DEBUG_VIRTUAL=y
CONFIG_DEBUG_MEMORY_INIT=y
CONFIG_DEBUG_PER_CPU_MAPS=y
CONFIG_DEBUG_KMAP_LOCAL=y
CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y
CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP=y
# CONFIG_MEM_ALLOC_PROFILING is not set
CONFIG_HAVE_ARCH_KASAN=y
CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
CONFIG_CC_HAS_KASAN_GENERIC=y
CONFIG_CC_HAS_KASAN_SW_TAGS=y
CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
CONFIG_KASAN=y
CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX=y
CONFIG_KASAN_GENERIC=y
# CONFIG_KASAN_OUTLINE is not set
CONFIG_KASAN_INLINE=y
CONFIG_KASAN_STACK=y
CONFIG_KASAN_VMALLOC=y
# CONFIG_KASAN_EXTRA_INFO is not set
CONFIG_HAVE_ARCH_KFENCE=y
CONFIG_KFENCE=y
CONFIG_KFENCE_SAMPLE_INTERVAL=100
CONFIG_KFENCE_NUM_OBJECTS=255
# CONFIG_KFENCE_DEFERRABLE is not set
CONFIG_KFENCE_STATIC_KEYS=y
CONFIG_KFENCE_STRESS_TEST_FAULTS=0
CONFIG_HAVE_ARCH_KMSAN=y
CONFIG_HAVE_KMSAN_COMPILER=y
# end of Memory Debugging

# CONFIG_DEBUG_SHIRQ is not set

#
# Debug Oops, Lockups and Hangs
#
CONFIG_PANIC_ON_OOPS=y
CONFIG_PANIC_TIMEOUT=86400
CONFIG_LOCKUP_DETECTOR=y
CONFIG_SOFTLOCKUP_DETECTOR=y
# CONFIG_SOFTLOCKUP_DETECTOR_INTR_STORM is not set
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=1
CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y
CONFIG_HARDLOCKUP_DETECTOR=y
# CONFIG_HARDLOCKUP_DETECTOR_PREFER_BUDDY is not set
CONFIG_HARDLOCKUP_DETECTOR_PERF=y
# CONFIG_HARDLOCKUP_DETECTOR_BUDDY is not set
# CONFIG_HARDLOCKUP_DETECTOR_ARCH is not set
CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER=y
CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=140
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=1
CONFIG_WQ_WATCHDOG=y
CONFIG_BOOTPARAM_WQ_STALL_PANIC=0
# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set
# CONFIG_TEST_LOCKUP is not set
# end of Debug Oops, Lockups and Hangs

#
# Scheduler Debugging
#
CONFIG_SCHED_INFO=y
CONFIG_SCHEDSTATS=y
# end of Scheduler Debugging

CONFIG_DEBUG_PREEMPT=y
# CONFIG_DEBUG_ATOMIC is not set

#
# Lock Debugging (spinlocks, mutexes, etc...)
#
CONFIG_LOCK_DEBUGGING_SUPPORT=y
CONFIG_PROVE_LOCKING=y
CONFIG_PROVE_RAW_LOCK_NESTING=y
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_RT_MUTEXES=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_LOCKDEP=y
CONFIG_LOCKDEP_BITS=20
CONFIG_LOCKDEP_CHAINS_BITS=20
CONFIG_LOCKDEP_STACK_TRACE_BITS=20
CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14
CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12
# CONFIG_DEBUG_LOCKDEP is not set
CONFIG_DEBUG_ATOMIC_SLEEP=y
# 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=y
# CONFIG_CSD_LOCK_WAIT_DEBUG_DEFAULT is not set
# end of Lock Debugging (spinlocks, mutexes, etc...)

CONFIG_TRACE_IRQFLAGS=y
CONFIG_TRACE_IRQFLAGS_NMI=y
CONFIG_NMI_CHECK_CPU=y
CONFIG_DEBUG_IRQFLAGS=y
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_KOBJECT_RELEASE is not set

#
# Debug kernel data structures
#
CONFIG_DEBUG_LIST=y
CONFIG_DEBUG_PLIST=y
CONFIG_DEBUG_SG=y
CONFIG_DEBUG_NOTIFIERS=y
# CONFIG_DEBUG_CLOSURES is not set
CONFIG_DEBUG_MAPLE_TREE=y
# end of Debug kernel data structures

#
# RCU Debugging
#
CONFIG_PROVE_RCU=y
# 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=100
CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0
# CONFIG_RCU_CPU_STALL_CPUTIME is not set
# CONFIG_RCU_TRACE is not set
CONFIG_RCU_EQS_DEBUG=y
# end of RCU Debugging

# CONFIG_DEBUG_WQ_FORCE_RR_CPU 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_RETHOOK=y
CONFIG_HAVE_FUNCTION_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_REGS_HAVING_PT_REGS=y
CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_JMP=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_FENTRY=y
CONFIG_HAVE_OBJTOOL_MCOUNT=y
CONFIG_HAVE_OBJTOOL_NOP_MCOUNT=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y
CONFIG_TRACE_CLOCK=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_PREEMPTIRQ_TRACEPOINTS=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_TRACEFS_AUTOMOUNT_DEPRECATED=y
# CONFIG_BOOTTIME_TRACING is not set
# CONFIG_FUNCTION_TRACER is not set
# CONFIG_STACK_TRACER is not set
# 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_OSNOISE_TRACER is not set
# CONFIG_TIMERLAT_TRACER is not set
# CONFIG_MMIOTRACE is not set
# CONFIG_FTRACE_SYSCALLS is not set
# 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_UPROBE_EVENTS=y
CONFIG_EPROBE_EVENTS=y
CONFIG_BPF_EVENTS=y
CONFIG_DYNAMIC_EVENTS=y
CONFIG_PROBE_EVENTS=y
# CONFIG_SYNTH_EVENTS is not set
# CONFIG_USER_EVENTS is not set
# CONFIG_HIST_TRIGGERS is not set
CONFIG_TRACE_EVENT_INJECT=y
# CONFIG_TRACEPOINT_BENCHMARK is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
# CONFIG_TRACE_EVAL_MAP_FILE is not set
# CONFIG_FTRACE_STARTUP_TEST is not set
# CONFIG_RING_BUFFER_STARTUP_TEST is not set
CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS=y
# CONFIG_PREEMPTIRQ_DELAY_TEST is not set
# CONFIG_RV is not set
# CONFIG_TRACE_REMOTE_TEST is not set
CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
# CONFIG_SAMPLES is not set
CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y
CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y
CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
# CONFIG_STRICT_DEVMEM is not set

#
# x86 Debugging
#
CONFIG_EARLY_PRINTK_USB=y
CONFIG_X86_VERBOSE_BOOTUP=y
CONFIG_EARLY_PRINTK=y
CONFIG_EARLY_PRINTK_DBGP=y
# CONFIG_EARLY_PRINTK_USB_XDBC 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=y
# CONFIG_CPA_DEBUG is not set
CONFIG_DEBUG_ENTRY=y
# 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
# end of x86 Debugging

#
# Kernel Testing and Coverage
#
# CONFIG_KUNIT is not set
# CONFIG_NOTIFIER_ERROR_INJECTION is not set
CONFIG_FAULT_INJECTION=y
CONFIG_FAILSLAB=y
CONFIG_FAIL_PAGE_ALLOC=y
CONFIG_FAULT_INJECTION_USERCOPY=y
CONFIG_FAIL_MAKE_REQUEST=y
CONFIG_FAIL_IO_TIMEOUT=y
CONFIG_FAIL_FUTEX=y
CONFIG_FAULT_INJECTION_DEBUG_FS=y
# CONFIG_FAIL_MMC_REQUEST is not set
# CONFIG_FAIL_SKB_REALLOC is not set
CONFIG_FAULT_INJECTION_CONFIGFS=y
# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set
CONFIG_ARCH_HAS_KCOV=y
CONFIG_KCOV=y
CONFIG_KCOV_ENABLE_COMPARISONS=y
CONFIG_KCOV_INSTRUMENT_ALL=y
CONFIG_KCOV_IRQ_AREA_SIZE=0x40000
# CONFIG_KCOV_SELFTEST is not set
CONFIG_RUNTIME_TESTING_MENU=y
# CONFIG_TEST_DHRY is not set
# CONFIG_LKDTM is not set
# CONFIG_TEST_DIV64 is not set
# CONFIG_TEST_MULDIV64 is not set
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_TEST_REF_TRACKER 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_ASYNC_RAID6_TEST is not set
# CONFIG_TEST_HEXDUMP is not set
# CONFIG_TEST_KSTRTOX is not set
# CONFIG_TEST_BITMAP is not set
# CONFIG_TEST_XARRAY is not set
# CONFIG_TEST_MAPLE_TREE is not set
# CONFIG_TEST_RHASHTABLE 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_WORKQUEUE is not set
# CONFIG_TEST_BPF is not set
# CONFIG_FIND_BIT_BENCHMARK is not set
# CONFIG_TEST_FIRMWARE is not set
# CONFIG_TEST_SYSCTL is not set
# CONFIG_CONTEXT_ANALYSIS_TEST is not set
# CONFIG_TEST_UDELAY is not set
# CONFIG_TEST_STATIC_KEYS is not set
# CONFIG_TEST_DYNAMIC_DEBUG is not set
# CONFIG_TEST_KMOD is not set
# CONFIG_TEST_KALLSYMS is not set
# CONFIG_TEST_DEBUG_VIRTUAL is not set
# CONFIG_TEST_MEMCAT_P is not set
# CONFIG_TEST_MEMINIT is not set
# CONFIG_TEST_FREE_PAGES is not set
# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set
# CONFIG_TEST_OBJPOOL is not set
CONFIG_ARCH_USE_MEMTEST=y
# CONFIG_MEMTEST is not set
# end of Kernel Testing and Coverage

#
# Rust hacking
#
# end of Rust hacking
# end of Kernel hacking

CONFIG_IO_URING_BPF=y
KernelRepo git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
ReproCID 0
ReproOpts
ReproSyzID 0
SyzkallerCommit 4595e35325904a096977cf0d3f9e7648e3198280
TargetArch amd64
TargetOS linux

Outputs:
DenialOfService ✅
Exploitable ❌
FilesystemTrigger ❌
NetworkTrigger ❌
PeripheralTrigger ❌
RemoteTrigger ❌
Unprivileged ✅
UserNamespace ❌
VMGuestTrigger ❌
VMHostTrigger ❌
Explanation
**Analysis of the Bug**

**1. Root Cause Analysis:**
The bug is a `BUG: sleeping function called from invalid context` triggered at
`fs/jbd2/commit.c:1071` inside `cond_resched_lock(&journal->j_list_lock)`. This
occurs specifically on `PREEMPT_RT` kernels.

In `PREEMPT_RT`, spinlocks are substituted with RT-mutexes. Acquiring a spinlock
(`rt_spin_lock`) internally calls `rcu_read_lock()`, which increments the RCU
nesting depth. Releasing a spinlock (`rt_spin_unlock`) calls
`rcu_read_unlock()`, which decrements it.

The issue stems from a strict **LIFO (Last-In, First-Out) unlock order
violation** in `jbd2_journal_commit_transaction`:
1. `spin_lock(&jh->b_state_lock)` is acquired (RCU depth becomes 1).
2. `spin_lock(&journal->j_list_lock)` is acquired (RCU depth becomes 2).
3. `spin_unlock(&jh->b_state_lock)` is released (Out of order! RCU depth becomes
1).
4. `cond_resched_lock(&journal->j_list_lock)` is called.

`cond_resched_lock` invokes `__might_resched()`, which expects the RCU nesting
depth to be exactly `1` (since only `j_list_lock` should be held). However, due
to the LIFO violation, the PREEMPT_RT lockdep and RCU nesting state tracking
gets desynchronized. Lockdep's `rcu_read_unlock()` removes the *most recently*
acquired `rcu_read_lock` (which belonged to `j_list_lock`), leaving the older
one dangling. This state corruption leads `__might_resched()` to observe an RCU
nest depth of `2` instead of the expected `1`, triggering the `BUG` and the
subsequent `Voluntary context switch within RCU read-side critical section!`
warning.

**2. Security Impact:**
- **Exploitable:** **No**. This is a state-tracking desynchronization and
scheduling-in-atomic-context bug specific to `PREEMPT_RT`. It does not cause
memory corruption (like use-after-free or out-of-bounds accesses) or allow
control-flow hijacking. It cannot be used for privilege escalation.
- **Denial of Service (DoS):** **Yes**. The `BUG` macro and subsequent warnings
can halt the kernel or cause a kernel panic (especially if `panic_on_warn` or
`panic_on_oops` is enabled), leading to a local denial of service.
- **Accessible From Unprivileged Processes:** **Yes**. The vulnerable code path
is part of the core `jbd2` journaling commit loop used by `ext4`. An
unprivileged user can easily trigger this by performing standard filesystem
operations (e.g., creating, modifying, or syncing files) on an `ext4`
filesystem, which forces the `kjournald2` thread to commit transactions.

**Conclusion:**
This is a local Denial of Service (DoS) vulnerability specific to `PREEMPT_RT`
kernels, caused by a spinlock LIFO unlock order violation. It is reachable by
unprivileged users through normal filesystem interactions but is not exploitable
for privilege escalation.

Crash report:
BUG: sleeping function ca[   92.150581][ T5155] BUG: sleeping function called from invalid context at fs/jbd2/commit.c:1071
in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 5155, name: jbd2/sda1-8
preempt_count: 0, expected: 0
RCU nest depth: 2, expected: 1
3 locks held by jbd2/sda1-8/5155:
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
 #1: ffff888036ea4920 (&journal->j_list_lock){+.+.}-{3:3}, at: spin_lock include/linux/spinlock_rt.h:45 [inline]
 #1: ffff888036ea4920 (&journal->j_list_lock){+.+.}-{3:3}, at: jbd2_journal_commit_transaction+0x3ad1/0x5b20 fs/jbd2/commit.c:993
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
CPU: 0 UID: 0 PID: 5155 Comm: jbd2/sda1-8 Not tainted syzkaller #0 PREEMPT_{RT,(full)} 
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/18/2026
Call Trace:
 <TASK>
 dump_stack_lvl+0xe8/0x150 lib/dump_stack.c:120
 __might_resched+0x329/0x480 kernel/sched/core.c:9162
 jbd2_journal_commit_transaction+0x3f59/0x5b20 fs/jbd2/commit.c:1071
 kjournald2+0x3e0/0x760 fs/jbd2/journal.c:201
 kthread+0x388/0x470 kernel/kthread.c:436
 ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158
 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
 </TASK>
------------[ cut here ]------------
Voluntary context switch within RCU read-side critical section!
WARNING: kernel/rcu/tree_plugin.h:332 at rcu_note_context_switch+0xcac/0xf40 kernel/rcu/tree_plugin.h:332, CPU#0: jbd2/sda1-8/5155
Modules linked in:
CPU: 0 UID: 0 PID: 5155 Comm: jbd2/sda1-8 Tainted: G        W           syzkaller #0 PREEMPT_{RT,(full)} 
Tainted: [W]=WARN
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/18/2026
RIP: 0010:rcu_note_context_switch+0xcac/0xf40 kernel/rcu/tree_plugin.h:332
Code: 00 41 c6 45 00 00 48 8b 3d a1 20 e1 0d 48 81 c4 b8 00 00 00 5b 41 5c 41 5d 41 5e 41 5f 5d e9 bb 5f ff ff 48 8d 3d a4 e2 e4 0d <67> 48 0f b9 3a e9 1b f4 ff ff 90 0f 0b 90 45 84 e4 0f 84 ea f3 ff
RSP: 0018:ffffc90010177930 EFLAGS: 00010002
RAX: 0000000000000000 RBX: ffff888036ec5c40 RCX: 0000000080000002
RDX: 0000000000000000 RSI: ffffffff8ba74040 RDI: ffffffff8f8f3dd0
RBP: dffffc0000000000 R08: ffffffff8f8bcef7 R09: 1ffffffff1f179de
R10: dffffc0000000000 R11: fffffbfff1f179df R12: 0000000000000000
R13: dffffc0000000000 R14: ffff8880b883c800 R15: ffff888036ec6104
FS:  0000000000000000(0000) GS:ffff8881260fb000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000055557df50340 CR3: 0000000011b24000 CR4: 00000000003526f0
Call Trace:
 <TASK>
 __schedule+0x291/0x54c0 kernel/sched/core.c:7043
 __schedule_loop kernel/sched/core.c:7267 [inline]
 schedule+0x164/0x360 kernel/sched/core.c:7282
 kjournald2+0x410/0x760 fs/jbd2/journal.c:230
 kthread+0x388/0x470 kernel/kthread.c:436
 ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158
 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
 </TASK>
----------------
Code disassembly (best guess):
   0:	00 41 c6             	add    %al,-0x3a(%rcx)
   3:	45 00 00             	add    %r8b,(%r8)
   6:	48 8b 3d a1 20 e1 0d 	mov    0xde120a1(%rip),%rdi        # 0xde120ae
   d:	48 81 c4 b8 00 00 00 	add    $0xb8,%rsp
  14:	5b                   	pop    %rbx
  15:	41 5c                	pop    %r12
  17:	41 5d                	pop    %r13
  19:	41 5e                	pop    %r14
  1b:	41 5f                	pop    %r15
  1d:	5d                   	pop    %rbp
  1e:	e9 bb 5f ff ff       	jmp    0xffff5fde
  23:	48 8d 3d a4 e2 e4 0d 	lea    0xde4e2a4(%rip),%rdi        # 0xde4e2ce
* 2a:	67 48 0f b9 3a       	ud1    (%edx),%rdi <-- trapping instruction
  2f:	e9 1b f4 ff ff       	jmp    0xfffff44f
  34:	90                   	nop
  35:	0f 0b                	ud2
  37:	90                   	nop
  38:	45 84 e4             	test   %r12b,%r12b
  3b:	0f                   	.byte 0xf
  3c:	84 ea                	test   %ch,%dl
  3e:	f3                   	repz
  3f:	ff                   	.byte 0xff

Trajectory: (Expand/Collapse All)
Seq Timestamp Type Name Duration
0/0 2026/05/31 22:02 flow assessment-security
1h25m Results:
map[DenialOfService:true Explanation:**Analysis of the Bug**

**1. Root Cause Analysis:**
The bug is a `BUG: sleeping function called from invalid context` triggered at
`fs/jbd2/commit.c:1071` inside `cond_resched_lock(&journal->j_list_lock)`. This
occurs specifically on `PREEMPT_RT` kernels.

In `PREEMPT_RT`, spinlocks are substituted with RT-mutexes. Acquiring a spinlock
(`rt_spin_lock`) internally calls `rcu_read_lock()`, which increments the RCU
nesting depth. Releasing a spinlock (`rt_spin_unlock`) calls
`rcu_read_unlock()`, which decrements it.

The issue stems from a strict **LIFO (Last-In, First-Out) unlock order
violation** in `jbd2_journal_commit_transaction`:
1. `spin_lock(&jh->b_state_lock)` is acquired (RCU depth becomes 1).
2. `spin_lock(&journal->j_list_lock)` is acquired (RCU depth becomes 2).
3. `spin_unlock(&jh->b_state_lock)` is released (Out of order! RCU depth becomes
1).
4. `cond_resched_lock(&journal->j_list_lock)` is called.

`cond_resched_lock` invokes `__might_resched()`, which expects the RCU nesting
depth to be exactly `1` (since only `j_list_lock` should be held). However, due
to the LIFO violation, the PREEMPT_RT lockdep and RCU nesting state tracking
gets desynchronized. Lockdep's `rcu_read_unlock()` removes the *most recently*
acquired `rcu_read_lock` (which belonged to `j_list_lock`), leaving the older
one dangling. This state corruption leads `__might_resched()` to observe an RCU
nest depth of `2` instead of the expected `1`, triggering the `BUG` and the
subsequent `Voluntary context switch within RCU read-side critical section!`
warning.

**2. Security Impact:**
- **Exploitable:** **No**. This is a state-tracking desynchronization and
scheduling-in-atomic-context bug specific to `PREEMPT_RT`. It does not cause
memory corruption (like use-after-free or out-of-bounds accesses) or allow
control-flow hijacking. It cannot be used for privilege escalation.
- **Denial of Service (DoS):** **Yes**. The `BUG` macro and subsequent warnings
can halt the kernel or cause a kernel panic (especially if `panic_on_warn` or
`panic_on_oops` is enabled), leading to a local denial of service.
- **Accessible From Unprivileged Processes:** **Yes**. The vulnerable code path
is part of the core `jbd2` journaling commit loop used by `ext4`. An
unprivileged user can easily trigger this by performing standard filesystem
operations (e.g., creating, modifying, or syncing files) on an `ext4`
filesystem, which forces the `kjournald2` thread to commit transactions.

**Conclusion:**
This is a local Denial of Service (DoS) vulnerability specific to `PREEMPT_RT`
kernels, caused by a spinlock LIFO unlock order violation. It is reachable by
unprivileged users through normal filesystem interactions but is not exploitable
for privilege escalation. Exploitable:false FilesystemTrigger:false NetworkTrigger:false PeripheralTrigger:false RemoteTrigger:false Unprivileged:true UserNamespace:false VMGuestTrigger:false VMHostTrigger:false]

1/1 2026/05/31 22:02 action syz-repro-to-c-repro
0m Results:
map[SimplifiedCRepro:]

2/1 2026/05/31 22:02 action kernel-checkouter
0m Results:
map[KernelSrc:/app/workdir/cache/src/0b0e52777adb5bfc20af913fa8a490c570415d78]

3/1 2026/05/31 22:02 action kernel-builder
29m Results:
map[KernelObj:/app/workdir/cache/build/5e60041a104effdc248dc7405959ee8baa1153cf]

4/1 2026/05/31 22:31 action codesearch-prepare
19m Results:
map[Index:codesearch-index]

5/1 2026/05/31 22:51 agent expert
36m Model:
gemini-3.1-pro-preview

Results:
map[DenialOfService:true Exploitable:false FilesystemTrigger:false NetworkTrigger:false PeripheralTrigger:false RemoteTrigger:false Unprivileged:true UserNamespace:false VMGuestTrigger:false VMHostTrigger:false]

Instruction:
You are an experienced Linux kernel security engineer. Your task is to analyze given kernel bug report
and determine its security impact based on the following dimensions.

Use the provided tools to examine the source code, check for capability checks (e.g., capable(), ns_capable()),
and understand the nature of the bug. Analyze the given kernel build and configuration.
You can check the kernel config by grepping ".config" file; you can check kernel cmdline by grepping
".config" file for "CONFIG_CMDLINE=". Assume sysctl parameters have default values.
But analyze for the corresponding production build w/o debugging tools enabled (like KASAN, KMSAN, UBSAN).

Try different strategies when analyzing the bug:
 - think of ways in which the vulnerable code is unreachable
 - or the other way around: try to come up with different ideas of how an unprivileged user can reach the bug
If still unsure err on the side of the bug being non-exploitable/not-accessible.
In the final reply, provide a reasoning for your assessment.

Analysis dimensions:

* Exploitable:
Determine if the bug can result in memory corruption or elevated privileges.
Memory safety issues are almost always exploitable (KASAN or UBSAN reports for use-after-free, out-of-bounds;
refcounting issues, corrupted lists, etc). When kernel is crashing on a completely wild pointer access
(e.g. user-space address, or non-canonical address, but not on NULL or address corresponding to KASAN shadow
for NULL address), including both data accesses and control transfers, that also usually implies possibility
of exploitation. Such reports usually say "unable to handle kernel paging request".
Uses of uninitialized values detected by KMSAN may be exploitable b/c attacker frequently can affect uninit
values with spraying techniques. However, for these exploitability depends on how exactly the uninit value
is used in the code, and what it affects.

Think of what happens after the bug is triggered. Some bugs cause kernel panic and halt execution,
they are harder to exploit. For example, BUG reports halts the kernel. However, WARNING reports don't halt
execution in production builds. Debug bug detection tools (like KASAN, KMSAN, KCSAN, UBSAN) are also not enabled
in production builds, so attacker can freely exploit these bugs w/o being detected by these tools.
If you see an integer overflow, think how the overflowed value used later (if it's used as allocation size,
or an array index). If you see an out-of-bounds read, think if it's followed by an out-of-bounds write as well.
Some KCSAN data-races may be exploitable by skilled attackers as well. Think what data structures got corrupted
as the result of data races and how. However, note that kernel has lots of "benign" data races that don't lead
to any runtime misbehavior at all.

* Denial Of Service:
Determine if the bug can result in denial-of-service. Most bugs can, since they cause system crash,
hangs, deadlocks, or resource leaks. This is mostly applicable to WARNING bugs that won't cause system crash
in production. For these think what will be consequences of the violation of the kernel assumptions flagged
by the WARNING. In some cases the unexpected condition is also properly handled by the normal control flow
(e.g. with "if (WARN_ON(...))"), these won't cause denial-of-service. If the condition is not handled,
then it may or may not cause denial-of-service.

* Accessible From Unprivileged Processes:
Determine if the bug can be reached from a typical (non-root) user process that does NOT have any special capabilities
(like CAP_SYS_ADMIN, CAP_NET_ADMIN, CAP_NET_RAW, CAP_PERFMON) or access to device nodes restricted to root.
Assume that unprivileged_bpf_disabled=1, that is eBPF loading is not accessible. However, cBPF (classical BPF)
is still accessible to non-root processes.
Assume that user namespaces are not accessible, that is, the process cannot get the mentioned capabilities even
within a new user namespace (checked by ns_capable() function in the kernel sources).

* Accessible From User Namespaces:
Determine if the bug can be reached within a user-namespace where the process has all capabilities
(including CAP_SYS_ADMIN, CAP_NET_ADMIN, CAP_NET_RAW, CAP_PERFMON). Such capabilities are checked with ns_capable()
function in the kernel sources.

* VM Guest Trigger:
Determine if the bug can be triggered from the context of a typical KVM guest (e.g., set up by a QEMU VMM).
Consider accesses to standard Linux host paravirtualized features (virtio-blk, virtio-net, etc.),
and handling of VM exits in the KVM code.

* VM Host Trigger in The Confidential Computing Context:
Determine if the bug can be triggered in a confidential computing guest kernel from the context of a KVM host.
Consider access to standard Linux guest paravirtualized features (virtio-blk, virtio-net, etc.).

* Ethernet Network Trigger:
Determine if the bug can be triggered by processing ingress network Ethernet traffic, either directly (network stack)
or via drivers exposed to network data.

* Other Remote Trigger:
Determine if the bug can be triggered by processing remote traffic other than Ethernet (Wifi, Bluetooth, NFC, etc).

* Peripheral Trigger:
Determine if the bug can be triggered via an untrusted peripheral device that can be physically plugged
into a system, such as a USB device or a niche hardware driver handling external hardware inputs.
This is particularly important for mobile and desktop environments where users can plug in unknown devices.

* Malicious Filesystem Trigger:
Determine if the bug can be triggered by the kernel mounting and parsing a malicious filesystem image.
This is highly critical for Desktop and Mobile environments where external media or downloaded images
might be auto-mounted.

Don't make assumptions about the kernel source code (it may be different from what you assume it is).
Extensively use the provided code access tools (codesearch-*, git-*, grepper, etc)
to examine the actual source code, and confirm any assumptions.
Prefer calling several tools at the same time to save round-trips.


Use set-results tool to provide results of the analysis.
It must be called exactly once before the final reply.
Ignore results of this tool.

Prompt:
The kernel bug report is:

BUG: sleeping function ca[   92.150581][ T5155] BUG: sleeping function called from invalid context at fs/jbd2/commit.c:1071
in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 5155, name: jbd2/sda1-8
preempt_count: 0, expected: 0
RCU nest depth: 2, expected: 1
3 locks held by jbd2/sda1-8/5155:
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
 #1: ffff888036ea4920 (&journal->j_list_lock){+.+.}-{3:3}, at: spin_lock include/linux/spinlock_rt.h:45 [inline]
 #1: ffff888036ea4920 (&journal->j_list_lock){+.+.}-{3:3}, at: jbd2_journal_commit_transaction+0x3ad1/0x5b20 fs/jbd2/commit.c:993
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
CPU: 0 UID: 0 PID: 5155 Comm: jbd2/sda1-8 Not tainted syzkaller #0 PREEMPT_{RT,(full)} 
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/18/2026
Call Trace:
 <TASK>
 dump_stack_lvl+0xe8/0x150 lib/dump_stack.c:120
 __might_resched+0x329/0x480 kernel/sched/core.c:9162
 jbd2_journal_commit_transaction+0x3f59/0x5b20 fs/jbd2/commit.c:1071
 kjournald2+0x3e0/0x760 fs/jbd2/journal.c:201
 kthread+0x388/0x470 kernel/kthread.c:436
 ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158
 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
 </TASK>
------------[ cut here ]------------
Voluntary context switch within RCU read-side critical section!
WARNING: kernel/rcu/tree_plugin.h:332 at rcu_note_context_switch+0xcac/0xf40 kernel/rcu/tree_plugin.h:332, CPU#0: jbd2/sda1-8/5155
Modules linked in:
CPU: 0 UID: 0 PID: 5155 Comm: jbd2/sda1-8 Tainted: G        W           syzkaller #0 PREEMPT_{RT,(full)} 
Tainted: [W]=WARN
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/18/2026
RIP: 0010:rcu_note_context_switch+0xcac/0xf40 kernel/rcu/tree_plugin.h:332
Code: 00 41 c6 45 00 00 48 8b 3d a1 20 e1 0d 48 81 c4 b8 00 00 00 5b 41 5c 41 5d 41 5e 41 5f 5d e9 bb 5f ff ff 48 8d 3d a4 e2 e4 0d <67> 48 0f b9 3a e9 1b f4 ff ff 90 0f 0b 90 45 84 e4 0f 84 ea f3 ff
RSP: 0018:ffffc90010177930 EFLAGS: 00010002
RAX: 0000000000000000 RBX: ffff888036ec5c40 RCX: 0000000080000002
RDX: 0000000000000000 RSI: ffffffff8ba74040 RDI: ffffffff8f8f3dd0
RBP: dffffc0000000000 R08: ffffffff8f8bcef7 R09: 1ffffffff1f179de
R10: dffffc0000000000 R11: fffffbfff1f179df R12: 0000000000000000
R13: dffffc0000000000 R14: ffff8880b883c800 R15: ffff888036ec6104
FS:  0000000000000000(0000) GS:ffff8881260fb000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000055557df50340 CR3: 0000000011b24000 CR4: 00000000003526f0
Call Trace:
 <TASK>
 __schedule+0x291/0x54c0 kernel/sched/core.c:7043
 __schedule_loop kernel/sched/core.c:7267 [inline]
 schedule+0x164/0x360 kernel/sched/core.c:7282
 kjournald2+0x410/0x760 fs/jbd2/journal.c:230
 kthread+0x388/0x470 kernel/kthread.c:436
 ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158
 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
 </TASK>
----------------
Code disassembly (best guess):
   0:	00 41 c6             	add    %al,-0x3a(%rcx)
   3:	45 00 00             	add    %r8b,(%r8)
   6:	48 8b 3d a1 20 e1 0d 	mov    0xde120a1(%rip),%rdi        # 0xde120ae
   d:	48 81 c4 b8 00 00 00 	add    $0xb8,%rsp
  14:	5b                   	pop    %rbx
  15:	41 5c                	pop    %r12
  17:	41 5d                	pop    %r13
  19:	41 5e                	pop    %r14
  1b:	41 5f                	pop    %r15
  1d:	5d                   	pop    %rbp
  1e:	e9 bb 5f ff ff       	jmp    0xffff5fde
  23:	48 8d 3d a4 e2 e4 0d 	lea    0xde4e2a4(%rip),%rdi        # 0xde4e2ce
* 2a:	67 48 0f b9 3a       	ud1    (%edx),%rdi <-- trapping instruction
  2f:	e9 1b f4 ff ff       	jmp    0xfffff44f
  34:	90                   	nop
  35:	0f 0b                	ud2
  37:	90                   	nop
  38:	45 84 e4             	test   %r12b,%r12b
  3b:	0f                   	.byte 0xf
  3c:	84 ea                	test   %ch,%dl
  3e:	f3                   	repz
  3f:	ff                   	.byte 0xff




Reply:
**Analysis of the Bug**

**1. Root Cause Analysis:**
The bug is a `BUG: sleeping function called from invalid context` triggered at `fs/jbd2/commit.c:1071` inside `cond_resched_lock(&journal->j_list_lock)`. This occurs specifically on `PREEMPT_RT` kernels.

In `PREEMPT_RT`, spinlocks are substituted with RT-mutexes. Acquiring a spinlock (`rt_spin_lock`) internally calls `rcu_read_lock()`, which increments the RCU nesting depth. Releasing a spinlock (`rt_spin_unlock`) calls `rcu_read_unlock()`, which decrements it.

The issue stems from a strict **LIFO (Last-In, First-Out) unlock order violation** in `jbd2_journal_commit_transaction`:
1. `spin_lock(&jh->b_state_lock)` is acquired (RCU depth becomes 1).
2. `spin_lock(&journal->j_list_lock)` is acquired (RCU depth becomes 2).
3. `spin_unlock(&jh->b_state_lock)` is released (Out of order! RCU depth becomes 1).
4. `cond_resched_lock(&journal->j_list_lock)` is called.

`cond_resched_lock` invokes `__might_resched()`, which expects the RCU nesting depth to be exactly `1` (since only `j_list_lock` should be held). However, due to the LIFO violation, the PREEMPT_RT lockdep and RCU nesting state tracking gets desynchronized. Lockdep's `rcu_read_unlock()` removes the *most recently* acquired `rcu_read_lock` (which belonged to `j_list_lock`), leaving the older one dangling. This state corruption leads `__might_resched()` to observe an RCU nest depth of `2` instead of the expected `1`, triggering the `BUG` and the subsequent `Voluntary context switch within RCU read-side critical section!` warning.

**2. Security Impact:**
- **Exploitable:** **No**. This is a state-tracking desynchronization and scheduling-in-atomic-context bug specific to `PREEMPT_RT`. It does not cause memory corruption (like use-after-free or out-of-bounds accesses) or allow control-flow hijacking. It cannot be used for privilege escalation.
- **Denial of Service (DoS):** **Yes**. The `BUG` macro and subsequent warnings can halt the kernel or cause a kernel panic (especially if `panic_on_warn` or `panic_on_oops` is enabled), leading to a local denial of service.
- **Accessible From Unprivileged Processes:** **Yes**. The vulnerable code path is part of the core `jbd2` journaling commit loop used by `ext4`. An unprivileged user can easily trigger this by performing standard filesystem operations (e.g., creating, modifying, or syncing files) on an `ext4` filesystem, which forces the `kjournald2` thread to commit transactions.

**Conclusion:**
This is a local Denial of Service (DoS) vulnerability specific to `PREEMPT_RT` kernels, caused by a spinlock LIFO unlock order violation. It is reachable by unprivileged users through normal filesystem interactions but is not exploitable for privilege escalation.

6/2 2026/05/31 22:51 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 7979
							output: 38
							thoughts: 887
						

Thoughts:
**Analyzing a PREEMPT_RT Kernel Bug in JBD2 Journal Commit**

Okay, so I've got a bug report here, and the core issue immediately jumps out: "sleeping function called from invalid context" within the `jbd2_journal_commit_transaction` function at `fs/jbd2/commit.c:1071`. This is classic PREEMPT_RT territory. The error context data tells me a few critical things. We are definitely *not* in atomic context (`in_atomic(): 0`), interrupts are enabled (`irqs_disabled(): 0`), and we're not non-blocking (`non_block: 0`). The culprit process ID is `5155`, and it's running as `jbd2/sda1-8`.

The debug info is really telling. `preempt_count` is 0, which suggests we are not nested in a preemption critical section, however RCU nest depth is 2, and expecting 1. This difference of 1 here is important and indicative.
And, there are some locks being held. Three specifically. The report shows:

1.  We have the `rcu_read_lock`, held three times. This is probably due to RT kernel and nested locking.
2.  `&journal->j_list_lock`, which is a `spin_lock`. This is being held during `jbd2_journal_commit_transaction`.
3.  Again, `rcu_read_lock` being held 3 times.

Now I need to examine the call trace to see *why* the function is being called in an invalid context. The call stack gives me some clues, but I need to dive deeper into the code. Looking at the call trace, `jbd2_journal_commit_transaction` is called from `kjournald2`, which runs in a kernel thread, so preemption is definitely possible. The issue must be within this function, as indicated by the line number mentioned in the bug.

My immediate plan is to open `fs/jbd2/commit.c` and zero in around line 1071, which is the point where the bug has been reported. I'll need to look at the surrounding code to understand what is happening just before that call, and what that 'sleeping function' actually is and what it is trying to do. I need to understand if the spinlock is being used correctly, and if something else is going on with the RCU locks too. This is almost certainly going to involve a subtle interaction with preemption and locking that I need to pinpoint to resolve this, which is the problem with these RT bugs.



7/2 2026/05/31 22:51 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1050 LineCount:50]

Results:
map[Contents:1050:				/*
1051:				 * The buffer on BJ_Forget list and not jbddirty means
1052:				 * it has been freed by this transaction and hence it
1053:				 * could not have been reallocated until this
1054:				 * transaction has committed. *BUT* it could be
1055:				 * reallocated once we have written all the data to
1056:				 * disk and before we process the buffer on BJ_Forget
1057:				 * list.
1058:				 */
1059:				if (!jh->b_next_transaction)
1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
1070:				__brelse(bh);
1071:			cond_resched_lock(&journal->j_list_lock);
1072:		}
1073:		spin_unlock(&journal->j_list_lock);
1074:		/*
1075:		 * This is a bit sleazy.  We use j_list_lock to protect transition
1076:		 * of a transaction into T_FINISHED state and calling
1077:		 * __jbd2_journal_drop_transaction(). Otherwise we could race with
1078:		 * other checkpointing code processing the transaction...
1079:		 */
1080:		write_lock(&journal->j_state_lock);
1081:		spin_lock(&journal->j_list_lock);
1082:		/*
1083:		 * Now recheck if some buffers did not get attached to the transaction
1084:		 * while the lock was dropped...
1085:		 */
1086:		if (commit_transaction->t_forget) {
1087:			spin_unlock(&journal->j_list_lock);
1088:			write_unlock(&journal->j_state_lock);
1089:			goto restart_loop;
1090:		}
1091:	
1092:		/* Add the transaction to the checkpoint list
1093:		 * __journal_remove_checkpoint() can not destroy transaction
1094:		 * under us because it is not marked as T_FINISHED yet */
1095:		if (journal->j_checkpoint_transactions == NULL) {
1096:			journal->j_checkpoint_transactions = commit_transaction;
1097:			commit_transaction->t_cpnext = commit_transaction;
1098:			commit_transaction->t_cpprev = commit_transaction;
1099:		} else {
]

8/2 2026/05/31 22:51 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 10285
							output: 36
							thoughts: 737
						

Thoughts:
**Debugging a Spinlock Issue in JBD2**

Okay, so I'm looking at this bug report, and it immediately points to `cond_resched_lock(&journal->j_list_lock);` at line 1071 as the culprit. The lock `journal->j_list_lock` is held when the error occurs. The error message is clear: "RCU nest depth: 2, expected: 1". This indicates an incorrect nesting of RCU read locks.

The stack trace provided is crucial. It shows that the process, jbd2/sda1-8 with PID 5155, holds three locks. Lock #1 is the `journal->j_list_lock`, which is expected. However, locks #0 and #2 are also `rcu_read_lock` acquired at the `rt_spin_lock` call.

Now, `cond_resched_lock` is designed to be called when a spinlock is *already* held. It drops the lock, potentially reschedules the process, and then reacquires the lock. The problem here is the RCU nesting, meaning that it seems there is a RCU read lock *already* held on two different levels. It appears that `rt_spin_lock` acquires an RCU read lock in its own right, which is unexpected, so let's look at `kernel/locking/spinlock_rt.c`. I need to understand why `rt_spin_lock` is nested with RCU in this context. Perhaps there's an incorrect assumption about the ordering or usage of these locks within that function.



9/2 2026/05/31 22:51 tool read-file
0m Args:
map[File:kernel/locking/spinlock_rt.c FirstLine:40 LineCount:30]

Results:
map[Contents:  40:		lockdep_assert(!current->pi_blocked_on);
  41:	
  42:		if (unlikely(!rt_mutex_cmpxchg_acquire(rtm, NULL, current)))
  43:			rtlock_slowlock(rtm);
  44:	}
  45:	
  46:	static __always_inline void __rt_spin_lock(spinlock_t *lock)
  47:	{
  48:		rtlock_might_resched();
  49:		rtlock_lock(&lock->lock);
  50:		rcu_read_lock();
  51:		migrate_disable();
  52:	}
  53:	
  54:	void __sched rt_spin_lock(spinlock_t *lock) __acquires(RCU)
  55:	{
  56:		spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
  57:		__rt_spin_lock(lock);
  58:	}
  59:	EXPORT_SYMBOL(rt_spin_lock);
  60:	
  61:	#ifdef CONFIG_DEBUG_LOCK_ALLOC
  62:	void __sched rt_spin_lock_nested(spinlock_t *lock, int subclass)
  63:	{
  64:		spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
  65:		__rt_spin_lock(lock);
  66:	}
  67:	EXPORT_SYMBOL(rt_spin_lock_nested);
  68:	
  69:	void __sched rt_spin_lock_nest_lock(spinlock_t *lock,
]

10/2 2026/05/31 22:51 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 11846
							output: 39
							thoughts: 79
						

Thoughts:
Okay, let me break this down.

**Locking and Scheduling within the Journaling Context**

Alright, so I see that the `rt_spin_lock` call implicitly acquires an `rcu_read_lock`. That's interesting, as `rcu` synchronization is a common pattern in the kernel. This also means that `spin_lock(&journal->j_list_lock)` is also acquiring an `rcu_read_lock`. My immediate thought is, what are the implications of this layering? We're using a spinlock, which implies we're anticipating contention but we're also under an RCU read critical section. This seems like it should work fine, as spinlocks don't prevent read-side access by default.

Then, there's a call to `cond_resched_lock` with `journal->j_list_lock`. I need to refresh my memory on the exact behavior of `cond_resched_lock` within this context. That function call is particularly interesting. I need to understand if this introduces any new scheduling points or if it's merely a wrapper around another call. What is the interplay between the lock itself and this `cond_resched_lock` wrapper? I need to analyze this further. Let's delve into what `cond_resched_lock` actually does in this scenario and what the scheduler behavior might be.



11/2 2026/05/31 22:51 tool codesearch-definition-source
0m Error:
log-in to see details

Args:
map[ContextFile:fs/jbd2/commit.c Name:cond_resched_lock]

Results:
map[SourceCode: SourceFile:]

12/2 2026/05/31 22:51 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 12278
							output: 21
							thoughts: 13
						

Thoughts:
Okay, here's my interpretation of that thought process, tailored for an expert audience, and written in the first person:

**Analyzing Potential Concurrency Bottlenecks**

Alright, my brain just kicked in and said, "Let's investigate potential concurrency contention." My immediate thought is to zero in on a likely suspect: `cond_resched_lock`. This isn't just a random guess; it's based on experience and the nature of the systems I usually deal with. Whenever I'm troubleshooting performance issues related to thread scheduling or context switching, especially under load, lock contention within the scheduler is often a prime candidate. `cond_resched_lock`, with its inherent implications for conditional rescheduling, is likely at the heart of some serious performance bottlenecks. I need to understand its behavior, who's taking it, and how often it's causing delays. From there, I can decide on the best strategy for solving the problem.



13/2 2026/05/31 22:51 tool grepper
0m Args:
map[Expression:define cond_resched_lock]

Results:
map[Output:include/linux/sched.h=2147=extern int __cond_resched_rwlock_write(rwlock_t *lock) __must_hold(lock);
--
include/linux/sched.h-2167-
include/linux/sched.h:2168:#define cond_resched_lock(lock) ({						\
include/linux/sched.h-2169-	__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
]

14/2 2026/05/31 22:51 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 12644
							output: 36
							thoughts: 21
						

Thoughts:
Here's a summary of my mental process:

**Diving into the Kernel Scheduler**

Okay, time to get my hands dirty. I'm thinking I need to refresh my understanding of the scheduler internals. Let's start with a foundational element: `include/linux/sched.h`. I recall that's where a lot of the core data structures and function prototypes are defined. Specifically, I'm thinking that line 2168, give or take a few lines, is a good starting point. This should give me a solid view of how tasks are represented or how the scheduling policies are exposed. I'm expecting to find either a critical data structure definition or possibly a significant function prototype related to task management or context switching around that area. Let's see what's there!



15/2 2026/05/31 22:51 tool read-file
0m Args:
map[File:include/linux/sched.h FirstLine:2160 LineCount:20]

Results:
map[Contents:2160:	 * spin/rw_lock() on RT implies rcu_read_lock(). The might_sleep() check in
2161:	 * cond_resched*lock() has to take that into account because it checks for
2162:	 * preempt_count() and rcu_preempt_depth().
2163:	 */
2164:	# define PREEMPT_LOCK_RESCHED_OFFSETS	\
2165:		(PREEMPT_LOCK_OFFSET + (1U << MIGHT_RESCHED_RCU_SHIFT))
2166:	#endif
2167:	
2168:	#define cond_resched_lock(lock) ({						\
2169:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
2170:		__cond_resched_lock(lock);						\
2171:	})
2172:	
2173:	#define cond_resched_rwlock_read(lock) ({					\
2174:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
2175:		__cond_resched_rwlock_read(lock);					\
2176:	})
2177:	
2178:	#define cond_resched_rwlock_write(lock) ({					\
2179:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
]

16/2 2026/05/31 22:51 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 13271
							output: 37
							thoughts: 96
						

Thoughts:
**Debugging a Preemption Lock Issue**

Okay, let's break this down. First, I need to remind myself that `PREEMPT_LOCK_RESCHED_OFFSETS` is calculated as `PREEMPT_LOCK_OFFSET + (1U << MIGHT_RESCHED_RCU_SHIFT)`. Good, got it. Now, the bug report... it's screaming about an RCU nest depth of 2 when it expects 1. Hmm, that's the core of the problem. Why is that RCU nesting depth off? Time to go hunting. My instinct says this is likely related to the journal, so I'll zero in on `fs/jbd2/commit.c` near line 993. That feels like a logical starting point. Let's see what's happening there and try to trace the call paths that might be the culprit.



17/2 2026/05/31 22:51 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:980 LineCount:50]

Results:
map[Contents: 980:				jbd2_free(jh->b_committed_data, bh->b_size);
 981:				jh->b_committed_data = NULL;
 982:				if (jh->b_frozen_data) {
 983:					jh->b_committed_data = jh->b_frozen_data;
 984:					jh->b_frozen_data = NULL;
 985:					jh->b_frozen_triggers = NULL;
 986:				}
 987:			} else if (jh->b_frozen_data) {
 988:				jbd2_free(jh->b_frozen_data, bh->b_size);
 989:				jh->b_frozen_data = NULL;
 990:				jh->b_frozen_triggers = NULL;
 991:			}
 992:	
 993:			spin_lock(&journal->j_list_lock);
 994:			cp_transaction = jh->b_cp_transaction;
 995:			if (cp_transaction) {
 996:				JBUFFER_TRACE(jh, "remove from old cp transaction");
 997:				cp_transaction->t_chp_stats.cs_dropped++;
 998:				__jbd2_journal_remove_checkpoint(jh);
 999:			}
1000:	
1001:			/* Only re-checkpoint the buffer_head if it is marked
1002:			 * dirty.  If the buffer was added to the BJ_Forget list
1003:			 * by jbd2_journal_forget, it may no longer be dirty and
1004:			 * there's no point in keeping a checkpoint record for
1005:			 * it. */
1006:	
1007:			/*
1008:			 * A buffer which has been freed while still being journaled
1009:			 * by a previous transaction, refile the buffer to BJ_Forget of
1010:			 * the running transaction. If the just committed transaction
1011:			 * contains "add to orphan" operation, we can completely
1012:			 * invalidate the buffer now. We are rather through in that
1013:			 * since the buffer may be still accessible when blocksize <
1014:			 * pagesize and it is attached to the last partial page.
1015:			 */
1016:			if (buffer_freed(bh) && !jh->b_next_transaction) {
1017:				struct address_space *mapping;
1018:	
1019:				clear_buffer_freed(bh);
1020:				clear_buffer_jbddirty(bh);
1021:	
1022:				/*
1023:				 * Block device buffers need to stay mapped all the
1024:				 * time, so it is enough to clear buffer_jbddirty and
1025:				 * buffer_freed bits. For the file mapping buffers (i.e.
1026:				 * journalled data) we need to unmap buffer and clear
1027:				 * more bits. We also need to be careful about the check
1028:				 * because the data page mapping can get cleared under
1029:				 * our hands. Note that if mapping == NULL, we don't
]

18/2 2026/05/31 22:51 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 14451
							output: 37
							thoughts: 765
						

Thoughts:
**Analyzing the Lock Acquisition Sequence**

Okay, here's what I'm seeing: the report flags a potential issue, specifically with `spin_lock(&journal->j_list_lock)` at line 993 in `fs/jbd2/commit.c`. My immediate concern is whether another lock is already held at that point. The trace provides a snapshot of the lock state for `jbd2/sda1-8/5155`, and it's definitely interesting.

The report details three locks held simultaneously. I see `journal->j_list_lock` at #1, at line 993, as expected. But the other two entries for `rcu_read_lock` at #0 and #2 are what is grabbing my attention. Both `rcu_read_lock` instances are acquired within `rt_spin_lock`. I need to figure out the relationship here. `rt_spin_lock` is acquiring `rcu_read_lock`, so it is the "inner" lock, and the journal list lock is then probably acquiring this lock, but... lock #0 is also `rcu_read_lock`.

So, it looks like there's another spinlock acquired by `rt_spin_lock` before 993.  I need to examine the code leading up to line 993 to understand what this second `rt_spin_lock` might be, and, more importantly, whether there's a problem in the lock ordering or potential for deadlock. This is the key.



19/2 2026/05/31 22:52 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:950 LineCount:50]

Results:
map[Contents: 950:			transaction_t *cp_transaction;
 951:			struct buffer_head *bh;
 952:			int try_to_free = 0;
 953:			bool drop_ref;
 954:	
 955:			jh = commit_transaction->t_forget;
 956:			spin_unlock(&journal->j_list_lock);
 957:			bh = jh2bh(jh);
 958:			/*
 959:			 * Get a reference so that bh cannot be freed before we are
 960:			 * done with it.
 961:			 */
 962:			get_bh(bh);
 963:			spin_lock(&jh->b_state_lock);
 964:			J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
 965:	
 966:			/*
 967:			 * If there is undo-protected committed data against
 968:			 * this buffer, then we can remove it now.  If it is a
 969:			 * buffer needing such protection, the old frozen_data
 970:			 * field now points to a committed version of the
 971:			 * buffer, so rotate that field to the new committed
 972:			 * data.
 973:			 *
 974:			 * Otherwise, we can just throw away the frozen data now.
 975:			 *
 976:			 * We also know that the frozen data has already fired
 977:			 * its triggers if they exist, so we can clear that too.
 978:			 */
 979:			if (jh->b_committed_data) {
 980:				jbd2_free(jh->b_committed_data, bh->b_size);
 981:				jh->b_committed_data = NULL;
 982:				if (jh->b_frozen_data) {
 983:					jh->b_committed_data = jh->b_frozen_data;
 984:					jh->b_frozen_data = NULL;
 985:					jh->b_frozen_triggers = NULL;
 986:				}
 987:			} else if (jh->b_frozen_data) {
 988:				jbd2_free(jh->b_frozen_data, bh->b_size);
 989:				jh->b_frozen_data = NULL;
 990:				jh->b_frozen_triggers = NULL;
 991:			}
 992:	
 993:			spin_lock(&journal->j_list_lock);
 994:			cp_transaction = jh->b_cp_transaction;
 995:			if (cp_transaction) {
 996:				JBUFFER_TRACE(jh, "remove from old cp transaction");
 997:				cp_transaction->t_chp_stats.cs_dropped++;
 998:				__jbd2_journal_remove_checkpoint(jh);
 999:			}
]

20/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 16384
							output: 38
							thoughts: 116
						

Thoughts:
Okay, let's break this down.

**Lock Ordering Conundrum**

Right, so I'm looking at this code and, at line 963, I see `spin_lock(&jh->b_state_lock);` being acquired. Okay, standard practice, grabbing the `b_state_lock`. But then, at line 993, while *still holding* that lock, the code attempts to acquire `spin_lock(&journal->j_list_lock);`. Classic potential deadlock scenario if there's a reverse locking order somewhere else in the system!

Hang on, this is where it gets interesting... Line 1071 has a `cond_resched_lock(&journal->j_list_lock);`. That's not the same as a spinlock, of course, and introduces a different set of considerations in terms of priority inversion and potential livelocks.

*But*... at line 1064, there's a `spin_unlock(&jh->b_state_lock);`. We are unlocking the first lock before the second is acquired at 1071. This sequence seems safe. The original lock order wasn't held. But, let's just make sure there isn't a race condition. Let me take a second look at 1064, to be completely certain.



21/2 2026/05/31 22:52 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1060 LineCount:20]

Results:
map[Contents:1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
1070:				__brelse(bh);
1071:			cond_resched_lock(&journal->j_list_lock);
1072:		}
1073:		spin_unlock(&journal->j_list_lock);
1074:		/*
1075:		 * This is a bit sleazy.  We use j_list_lock to protect transition
1076:		 * of a transaction into T_FINISHED state and calling
1077:		 * __jbd2_journal_drop_transaction(). Otherwise we could race with
1078:		 * other checkpointing code processing the transaction...
1079:		 */
]

22/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 17173
							output: 36
							thoughts: 720
						

Thoughts:
**Analyzing a Potential Lock Ordering Issue**

Okay, so I'm looking at this code and something's not quite right. Line 1064, we have `spin_unlock(&jh->b_state_lock);`. That *should* mean that by line 1071, `jh->b_state_lock` is definitely *not* held. But the lockdep trace is telling a different story: it shows three locks held, and critically, the first lock listed is an `rcu_read_lock` acquired through `rt_spin_lock`. I see this and immediately think something is wrong.

Now, this `rcu_read_lock` is acquired by `rt_spin_lock`, but *which* `rt_spin_lock`? If `jh->b_state_lock` was truly unlocked, then the associated `rcu_read_lock` should have been released. That's the expected behavior. This inconsistency screams potential lock ordering issue or some deeper problem with how these locks interact.

The immediate question that pops into my head is: does a `spin_unlock` *actually* release an `rcu_read_lock` in a PREEMPT_RT kernel? I'm pretty sure in a standard kernel, it would. But PREEMPT_RT introduces some different locking semantics, and I need to confirm that this behavior is preserved. Time to dive into `kernel/locking/spinlock_rt.c` and see what's really going on under the hood with those spinlocks in this specific context. This feels like it could be a subtle but significant bug.



23/2 2026/05/31 22:52 tool read-file
0m Args:
map[File:kernel/locking/spinlock_rt.c FirstLine:70 LineCount:30]

Results:
map[Contents:  70:					    struct lockdep_map *nest_lock)
  71:	{
  72:		spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_);
  73:		__rt_spin_lock(lock);
  74:	}
  75:	EXPORT_SYMBOL(rt_spin_lock_nest_lock);
  76:	#endif
  77:	
  78:	void __sched rt_spin_unlock(spinlock_t *lock) __releases(RCU)
  79:	{
  80:		spin_release(&lock->dep_map, _RET_IP_);
  81:		migrate_enable();
  82:		rcu_read_unlock();
  83:	
  84:		if (unlikely(!rt_mutex_cmpxchg_release(&lock->lock, current, NULL)))
  85:			rt_mutex_slowunlock(&lock->lock);
  86:	}
  87:	EXPORT_SYMBOL(rt_spin_unlock);
  88:	
  89:	/*
  90:	 * Wait for the lock to get unlocked: instead of polling for an unlock
  91:	 * (like raw spinlocks do), lock and unlock, to force the kernel to
  92:	 * schedule if there's contention:
  93:	 */
  94:	void __sched rt_spin_lock_unlock(spinlock_t *lock)
  95:	{
  96:		spin_lock(lock);
  97:		spin_unlock(lock);
  98:	}
  99:	EXPORT_SYMBOL(rt_spin_lock_unlock);
]

24/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 18709
							output: 37
							thoughts: 80
						

Thoughts:
Okay, let me think this through.

**Analyzing the Concurrency in jbd2 Commit Process**

Right, so `rt_spin_unlock` is definitely calling `rcu_read_unlock()`. That confirms that if the `jh->b_state_lock` was already unlocked, the corresponding `rcu_read_lock` that was paired with it *should* have been released. That seems straightforward... but wait, am I overlooking something? Is there potentially another lock held, creating a hidden dependency? I need to be absolutely certain.

Alright, let's step back and take a look at the commit process, specifically the loop defined in `fs/jbd2/commit.c`. I need to review the code path to ensure I haven't missed a critical detail about the locking sequence. It's time to refresh my memory and pinpoint the exact point where these locks come into play to rule out this possibility. Time to dive into the code.



25/2 2026/05/31 22:52 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:930 LineCount:50]

Results:
map[Contents: 930:	
 931:		/* End of a transaction!  Finally, we can do checkpoint
 932:	           processing: any buffers committed as a result of this
 933:	           transaction can be removed from any checkpoint list it was on
 934:	           before. */
 935:	
 936:		jbd2_debug(3, "JBD2: commit phase 6\n");
 937:	
 938:		J_ASSERT(list_empty(&commit_transaction->t_inode_list));
 939:		J_ASSERT(commit_transaction->t_buffers == NULL);
 940:		J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
 941:		J_ASSERT(commit_transaction->t_shadow_list == NULL);
 942:	
 943:	restart_loop:
 944:		/*
 945:		 * As there are other places (journal_unmap_buffer()) adding buffers
 946:		 * to this list we have to be careful and hold the j_list_lock.
 947:		 */
 948:		spin_lock(&journal->j_list_lock);
 949:		while (commit_transaction->t_forget) {
 950:			transaction_t *cp_transaction;
 951:			struct buffer_head *bh;
 952:			int try_to_free = 0;
 953:			bool drop_ref;
 954:	
 955:			jh = commit_transaction->t_forget;
 956:			spin_unlock(&journal->j_list_lock);
 957:			bh = jh2bh(jh);
 958:			/*
 959:			 * Get a reference so that bh cannot be freed before we are
 960:			 * done with it.
 961:			 */
 962:			get_bh(bh);
 963:			spin_lock(&jh->b_state_lock);
 964:			J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
 965:	
 966:			/*
 967:			 * If there is undo-protected committed data against
 968:			 * this buffer, then we can remove it now.  If it is a
 969:			 * buffer needing such protection, the old frozen_data
 970:			 * field now points to a committed version of the
 971:			 * buffer, so rotate that field to the new committed
 972:			 * data.
 973:			 *
 974:			 * Otherwise, we can just throw away the frozen data now.
 975:			 *
 976:			 * We also know that the frozen data has already fired
 977:			 * its triggers if they exist, so we can clear that too.
 978:			 */
 979:			if (jh->b_committed_data) {
]

26/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 19810
							output: 37
							thoughts: 527
						

Thoughts:
**Debugging a Potential RCU Nesting Issue**

Okay, let's break this down. I see a sequence of lock acquisitions and releases involving the journal's list lock (`journal->j_list_lock`) and the buffer state lock (`jh->b_state_lock`). The initial sequence seems straightforward: I acquire the list lock, release it, then acquire the buffer state lock, and then, at line 993, acquire the list lock again, followed by its release. The problem is with the `cond_resched_lock` call at line 1071. Based on the locking sequence, I'd expect the RCU nesting depth to be 1, because, at this point, the code appears only to hold the `journal->j_list_lock`.

However, the report indicates an RCU nesting depth of 2, which is unexpected. This means I've got an RCU read lock active somewhere that I don't account for. The first thing I need to do is confirm that no other lock is being held. Looking at the lockdep trace, it's reporting that three locks are held. Notably, there are a couple of `rcu_read_lock` entries, which gives me pause.

It looks like the trace is saying that the `rcu_read_lock` isn't associated with the locks I've been tracing so far. This implies that there's a separate acquisition of an `rcu_read_lock` that I haven't accounted for in my current analysis. To understand where this additional lock is being acquired, I need to look closer at the kernel's `kjournald2` process and the jbd2 journal code itself, focusing on `fs/jbd2/journal.c`. I need to figure out where that `rcu_read_lock` is being held, and then determine why the nesting depth is being reported as 2.



27/2 2026/05/31 22:52 tool read-file
0m Args:
map[File:fs/jbd2/journal.c FirstLine:180 LineCount:50]

Results:
map[Contents: 180:		 * transaction commit and any fs involvement might get stuck waiting for
 181:		 * the trasn. commit.
 182:		 */
 183:		memalloc_nofs_save();
 184:	
 185:		/*
 186:		 * And now, wait forever for commit wakeup events.
 187:		 */
 188:		write_lock(&journal->j_state_lock);
 189:	
 190:	loop:
 191:		if (journal->j_flags & JBD2_UNMOUNT)
 192:			goto end_loop;
 193:	
 194:		jbd2_debug(1, "commit_sequence=%u, commit_request=%u\n",
 195:			journal->j_commit_sequence, journal->j_commit_request);
 196:	
 197:		if (journal->j_commit_sequence != journal->j_commit_request) {
 198:			jbd2_debug(1, "OK, requests differ\n");
 199:			write_unlock(&journal->j_state_lock);
 200:			timer_delete_sync(&journal->j_commit_timer);
 201:			jbd2_journal_commit_transaction(journal);
 202:			write_lock(&journal->j_state_lock);
 203:			goto loop;
 204:		}
 205:	
 206:		wake_up(&journal->j_wait_done_commit);
 207:		if (freezing(current)) {
 208:			/*
 209:			 * The simpler the better. Flushing journal isn't a
 210:			 * good idea, because that depends on threads that may
 211:			 * be already stopped.
 212:			 */
 213:			jbd2_debug(1, "Now suspending kjournald2\n");
 214:			write_unlock(&journal->j_state_lock);
 215:			try_to_freeze();
 216:			write_lock(&journal->j_state_lock);
 217:		} else {
 218:			/*
 219:			 * We assume on resume that commits are already there,
 220:			 * so we don't sleep
 221:			 */
 222:			DEFINE_WAIT(wait);
 223:	
 224:			prepare_to_wait(&journal->j_wait_commit, &wait,
 225:					TASK_INTERRUPTIBLE);
 226:			transaction = journal->j_running_transaction;
 227:			if (transaction == NULL ||
 228:			    time_before(jiffies, transaction->t_expires)) {
 229:				write_unlock(&journal->j_state_lock);
]

28/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 21547
							output: 37
							thoughts: 91
						

Thoughts:
Okay, here's my thought process on this, distilled into a first-person summary as you requested, geared towards someone who's already fluent in this area:

**Analyzing the Transaction Commit Sequence**

Alright, let's break this down. Line 188, we have `write_lock(&journal->j_state_lock)`. Okay, standard procedure. We're getting exclusive access to `j_state_lock`. Then, at line 199, we immediately release that lock with `write_unlock(&journal->j_state_lock)`. So far, so good, a quick lock and unlock. The interesting part is what follows: `jbd2_journal_commit_transaction(journal)` is called *after* we've released the `j_state_lock`.

That's the key. This tells me that the commit transaction function does *not* expect `j_state_lock` to be held during its execution. It might acquire its own internal locks, sure, but it's not relying on this specific one. I need to confirm that. Let's dig into the source code for `jbd2_journal_commit_transaction` and see how it handles concurrency and what state it expects the journal to be in when it's called. This is a crucial observation, especially when debugging potential race conditions or lock contention issues within the journaling layer. Let's see how they orchestrate it.



29/2 2026/05/31 22:52 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:380 LineCount:50]

Results:
map[Contents: 380:		transaction_t *commit_transaction;
 381:		struct journal_head *jh;
 382:		struct buffer_head *descriptor;
 383:		struct buffer_head **wbuf = journal->j_wbuf;
 384:		int bufs;
 385:		int escape;
 386:		int err;
 387:		unsigned long long blocknr;
 388:		ktime_t start_time;
 389:		u64 commit_time;
 390:		char *tagp = NULL;
 391:		journal_block_tag_t *tag = NULL;
 392:		int space_left = 0;
 393:		int first_tag = 0;
 394:		int tag_flag;
 395:		int i;
 396:		int tag_bytes = journal_tag_bytes(journal);
 397:		struct buffer_head *cbh = NULL; /* For transactional checksums */
 398:		__u32 crc32_sum = ~0;
 399:		struct blk_plug plug;
 400:		/* Tail of the journal */
 401:		unsigned long first_block;
 402:		tid_t first_tid;
 403:		int update_tail;
 404:		int csum_size = 0;
 405:		LIST_HEAD(io_bufs);
 406:		LIST_HEAD(log_bufs);
 407:	
 408:		if (jbd2_journal_has_csum_v2or3(journal))
 409:			csum_size = sizeof(struct jbd2_journal_block_tail);
 410:	
 411:		/*
 412:		 * First job: lock down the current transaction and wait for
 413:		 * all outstanding updates to complete.
 414:		 */
 415:	
 416:		/* Do we need to erase the effects of a prior jbd2_journal_flush? */
 417:		if (journal->j_flags & JBD2_FLUSHED) {
 418:			jbd2_debug(3, "super block updated\n");
 419:			mutex_lock_io(&journal->j_checkpoint_mutex);
 420:			/*
 421:			 * We hold j_checkpoint_mutex so tail cannot change under us.
 422:			 * We don't need any special data guarantees for writing sb
 423:			 * since journal is empty and it is ok for write to be
 424:			 * flushed only with transaction commit.
 425:			 */
 426:			jbd2_journal_update_sb_log_tail(journal,
 427:							journal->j_tail_sequence,
 428:							journal->j_tail, 0);
 429:			mutex_unlock(&journal->j_checkpoint_mutex);
]

30/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 22773
							output: 44
							thoughts: 817
						

Thoughts:
**Analyzing the Lockdep Trace**

Okay, this `jbd2_journal_commit_transaction` is really consuming some resources. Let's dive back into this lockdep trace to understand what's happening. I see that this process, `jbd2/sda1-8/5155`, is holding three locks. The first, and surprisingly, is an `rcu_read_lock` acquired through `rt_spin_lock`. Then there's `journal->j_list_lock`, acquired during the commit transaction at `fs/jbd2/commit.c:993`. Finally, there's *another* `rcu_read_lock`, again acquired via `rt_spin_lock`.

That's curious, isn't it? If the second `rcu_read_lock` is part of the `rt_spin_lock` call and we know that the spin lock in the middle is `journal->j_list_lock`, then that means the initial `rcu_read_lock` is also part of that call.

Now, what's really bothering me is this initial `rcu_read_lock` in conjunction with `rt_spin_lock`. Could it be that we're failing to unlock the `spin_lock(&jh->b_state_lock)`? We need to verify that `spin_unlock(&jh->b_state_lock)` is indeed being called where we expect it to be. Let me check the code; it looks like the unlock should be at line 1064. Okay, time to check `__jbd2_journal_refile_buffer(jh)`.



31/2 2026/05/31 22:52 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/commit.c Name:__jbd2_journal_refile_buffer]

Results:
map[SourceCode:2607:	/*
2608:	 * Remove a buffer from its current buffer list in preparation for
2609:	 * dropping it from its current transaction entirely.  If the buffer has
2610:	 * already started to be used by a subsequent transaction, refile the
2611:	 * buffer on that transaction's metadata list.
2612:	 *
2613:	 * Called under j_list_lock
2614:	 * Called under jh->b_state_lock
2615:	 *
2616:	 * When this function returns true, there's no next transaction to refile to
2617:	 * and the caller has to drop jh reference through
2618:	 * jbd2_journal_put_journal_head().
2619:	 */
2620:	bool __jbd2_journal_refile_buffer(struct journal_head *jh)
2621:	{
2622:		int was_dirty, jlist;
2623:		struct buffer_head *bh = jh2bh(jh);
2624:	
2625:		lockdep_assert_held(&jh->b_state_lock);
2626:		if (jh->b_transaction)
2627:			assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock);
2628:	
2629:		/* If the buffer is now unused, just drop it. */
2630:		if (jh->b_next_transaction == NULL) {
2631:			__jbd2_journal_unfile_buffer(jh);
2632:			return true;
2633:		}
2634:	
2635:		/*
2636:		 * It has been modified by a later transaction: add it to the new
2637:		 * transaction's metadata list.
2638:		 */
2639:	
2640:		was_dirty = test_clear_buffer_jbddirty(bh);
2641:		__jbd2_journal_temp_unlink_buffer(jh);
2642:	
2643:		/*
2644:		 * b_transaction must be set, otherwise the new b_transaction won't
2645:		 * be holding jh reference
2646:		 */
2647:		J_ASSERT_JH(jh, jh->b_transaction != NULL);
2648:	
2649:		/*
2650:		 * We set b_transaction here because b_next_transaction will inherit
2651:		 * our jh reference and thus __jbd2_journal_file_buffer() must not
2652:		 * take a new one.
2653:		 */
2654:		WRITE_ONCE(jh->b_transaction, jh->b_next_transaction);
2655:		WRITE_ONCE(jh->b_next_transaction, NULL);
2656:		if (buffer_freed(bh))
2657:			jlist = BJ_Forget;
2658:		else if (jh->b_modified)
2659:			jlist = BJ_Metadata;
2660:		else
2661:			jlist = BJ_Reserved;
2662:		__jbd2_journal_file_buffer(jh, jh->b_transaction, jlist);
2663:		J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING);
2664:	
2665:		if (was_dirty)
2666:			set_buffer_jbddirty(bh);
2667:		return false;
2668:	}
 SourceFile:fs/jbd2/transaction.c]

32/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 24976
							output: 38
							thoughts: 53
						

Thoughts:
Here's my analysis of the provided thought process:

**Diving Deep into jbd2_journal_refile_buffer**

Okay, so I was looking at `__jbd2_journal_refile_buffer` and had a quick flash of concern. Something felt off. I'm thinking, "Hang on... does this function actually *release* that `jh->b_state_lock`?" That's a crucial point for concurrency, especially within the journaling system.

My mind immediately jumps to `fs/jbd2/commit.c`. I've been in there before, and I recall some critical locking logic around line 1064, so let's revisit that section and make sure my intuition is correct. The goal is to verify that the locking is correctly handled at the commit stage and that no resource is held longer than needed.



33/2 2026/05/31 22:52 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1060 LineCount:20]

Results:
map[Contents:1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
1070:				__brelse(bh);
1071:			cond_resched_lock(&journal->j_list_lock);
1072:		}
1073:		spin_unlock(&journal->j_list_lock);
1074:		/*
1075:		 * This is a bit sleazy.  We use j_list_lock to protect transition
1076:		 * of a transaction into T_FINISHED state and calling
1077:		 * __jbd2_journal_drop_transaction(). Otherwise we could race with
1078:		 * other checkpointing code processing the transaction...
1079:		 */
]

34/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 25595
							output: 44
							thoughts: 77
						

Thoughts:
**Debugging a Lockdep Conflict**

Okay, hold on a second. Line 1064, that's where I see the `spin_unlock(&jh->b_state_lock)`. That *should* mean `jh->b_state_lock` is unlocked. But the lockdep report is screaming that an `rcu_read_lock` is still being held. That's not right at all. What gives? Something's definitely off with the lock ordering here, or maybe I'm misinterpreting something... Let's check `jbd2_journal_put_journal_head(jh)` again to make sure I didn't miss something fundamental in the unlock and release process. Time to dive back in and trace through that function carefully.



35/2 2026/05/31 22:52 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/commit.c Name:jbd2_journal_put_journal_head]

Results:
map[SourceCode:2990:	/*
2991:	 * Drop a reference on the passed journal_head.  If it fell to zero then
2992:	 * release the journal_head from the buffer_head.
2993:	 */
2994:	void jbd2_journal_put_journal_head(struct journal_head *jh)
2995:	{
2996:		struct buffer_head *bh = jh2bh(jh);
2997:	
2998:		jbd_lock_bh_journal_head(bh);
2999:		J_ASSERT_JH(jh, jh->b_jcount > 0);
3000:		--jh->b_jcount;
3001:		if (!jh->b_jcount) {
3002:			__journal_remove_journal_head(bh);
3003:			jbd_unlock_bh_journal_head(bh);
3004:			journal_release_journal_head(jh, bh->b_size);
3005:			__brelse(bh);
3006:		} else {
3007:			jbd_unlock_bh_journal_head(bh);
3008:		}
3009:	}
 SourceFile:fs/jbd2/journal.c]

36/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 26232
							output: 43
							thoughts: 73
						

Thoughts:
Here's my summary, as the expert:

**Investigating a Potential Locking Interaction**

Okay, so I'm digging into this locking mechanism and something just clicked. I see `jbd_lock_bh_journal_head(bh)` is using `bit_spin_lock(BH_JournalHead, &bh->b_state)`. That's interesting, because I know `bit_spin_lock` is a fairly low-level primitive, but I need to understand if it's interacting with other locking schemes. Specifically, I'm trying to remember if `bit_spin_lock` includes an `rcu_read_lock` call internally. I need to be *absolutely* sure about that interaction to understand the full locking context. Time to pull up the definition of `jbd_lock_bh_journal_head` and refresh my memory, this is the crux of the issue.



37/2 2026/05/31 22:52 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/journal.c Name:jbd_lock_bh_journal_head]

Results:
map[SourceCode: 341:	static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
 342:	{
 343:		bit_spin_lock(BH_JournalHead, &bh->b_state);
 344:	}
 SourceFile:include/linux/jbd2.h]

38/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 26641
							output: 38
							thoughts: 11
						

Thoughts:
Okay, here's my attempt at summarizing that thought process, keeping in mind I'm speaking to a fellow expert:

**Investigating `bit_spin_lock`**

Alright, time to dive into `bit_spin_lock`. Let's just make sure we're on the same page and fully grasp this crucial aspect. I need to refresh my understanding of how this particular spin lock is architected and deployed. A quick review could reveal underlying logic or potential points of concern. Now, let's analyze its implications for the overall system's performance and behavior. Is it as efficient as it could be? Does it introduce any subtle bottlenecks I might have missed during initial reviews? Is the implementation robust and avoiding common pitfalls like livelock or excessive spinning under contention? It's always worthwhile to double-check these things, especially in concurrent systems where these kinds of low-level primitives can have significant repercussions. Let's see what we can find.



39/2 2026/05/31 22:52 tool codesearch-definition-source
0m Args:
map[ContextFile:include/linux/jbd2.h Name:bit_spin_lock]

Results:
map[SourceCode:  22:	/*
  23:	 *  bit-based spin_lock()
  24:	 *
  25:	 * Don't use this unless you really need to: spin_lock() and spin_unlock()
  26:	 * are significantly faster.
  27:	 */
  28:	static __always_inline void bit_spin_lock(int bitnum, unsigned long *addr)
  29:		__acquires(__bitlock(bitnum, addr))
  30:	{
  31:		/*
  32:		 * Assuming the lock is uncontended, this never enters
  33:		 * the body of the outer loop. If it is contended, then
  34:		 * within the inner loop a non-atomic test is used to
  35:		 * busywait with less bus contention for a good time to
  36:		 * attempt to acquire the lock bit.
  37:		 */
  38:		preempt_disable();
  39:	#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  40:		while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
  41:			preempt_enable();
  42:			do {
  43:				cpu_relax();
  44:			} while (test_bit(bitnum, addr));
  45:			preempt_disable();
  46:		}
  47:	#endif
  48:		__acquire(__bitlock(bitnum, addr));
  49:	}
 SourceFile:include/linux/bit_spinlock.h]

40/2 2026/05/31 22:52 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 27310
							output: 20
							thoughts: 56
						

Thoughts:
**Examining the Impact of `bit_spin_lock` in a PREEMPT_RT Context**

Okay, hold on a second. I need to make sure I'm thinking about this correctly. My initial understanding is that the `bit_spin_lock` function includes a call to `preempt_disable()`, which, as a rule, should disable preemption, right? That's the baseline behavior. But, I'm working with a PREEMPT_RT kernel, and that alters *everything*. So, my gut feeling says I need to *immediately* check if `bit_spin_lock` is implemented differently within the PREEMPT_RT environment. My intuition is telling me that function might have a unique implementation given the real-time constraints, I have to be sure. I'm going to dig into the PREEMPT_RT code to get some clarity on exactly how `bit_spin_lock` handles preemption in this real-time context. This is something that has the potential to bite me.



41/2 2026/05/31 22:52 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:define bit_spin_lock]

Results:
map[Output:]

42/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 27613
							output: 35
							thoughts: 24
						

Thoughts:
Okay, here's my take on those thoughts, tailored for an expert audience:

**Diving into Bit Spinlocks**

Alright, time to get my hands dirty. I need to refresh my memory on the intricacies of `bit_spin_lock`. My first instinct, as always, is to go straight to the source. Let's see... I'll quickly `grep` for `bit_spin_lock` within the `include/linux/bit_spinlock.h` header file. That should give me a concise overview of its declaration, any inline functions, and the core data structures involved. That's usually the quickest way to ground myself in the specifics before I start digging into where it's actually *used* in the kernel. This will immediately show me how it's defined and what context that definition is in. I'm hoping I can refresh this quickly and jump on with my next investigation.



43/2 2026/05/31 22:53 tool read-file
0m Args:
map[File:include/linux/bit_spinlock.h FirstLine:1 LineCount:50]

Results:
map[Contents:   1:	/* SPDX-License-Identifier: GPL-2.0 */
   2:	#ifndef __LINUX_BIT_SPINLOCK_H
   3:	#define __LINUX_BIT_SPINLOCK_H
   4:	
   5:	#include <linux/kernel.h>
   6:	#include <linux/preempt.h>
   7:	#include <linux/atomic.h>
   8:	#include <linux/bug.h>
   9:	
  10:	#include <asm/processor.h>  /* for cpu_relax() */
  11:	
  12:	/*
  13:	 * For static context analysis, we need a unique token for each possible bit
  14:	 * that can be used as a bit_spinlock. The easiest way to do that is to create a
  15:	 * fake context that we can cast to with the __bitlock(bitnum, addr) macro
  16:	 * below, which will give us unique instances for each (bit, addr) pair that the
  17:	 * static analysis can use.
  18:	 */
  19:	context_lock_struct(__context_bitlock) { };
  20:	#define __bitlock(bitnum, addr) (struct __context_bitlock *)(bitnum + (addr))
  21:	
  22:	/*
  23:	 *  bit-based spin_lock()
  24:	 *
  25:	 * Don't use this unless you really need to: spin_lock() and spin_unlock()
  26:	 * are significantly faster.
  27:	 */
  28:	static __always_inline void bit_spin_lock(int bitnum, unsigned long *addr)
  29:		__acquires(__bitlock(bitnum, addr))
  30:	{
  31:		/*
  32:		 * Assuming the lock is uncontended, this never enters
  33:		 * the body of the outer loop. If it is contended, then
  34:		 * within the inner loop a non-atomic test is used to
  35:		 * busywait with less bus contention for a good time to
  36:		 * attempt to acquire the lock bit.
  37:		 */
  38:		preempt_disable();
  39:	#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  40:		while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
  41:			preempt_enable();
  42:			do {
  43:				cpu_relax();
  44:			} while (test_bit(bitnum, addr));
  45:			preempt_disable();
  46:		}
  47:	#endif
  48:		__acquire(__bitlock(bitnum, addr));
  49:	}
  50:	
]

44/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 28602
							output: 41
							thoughts: 125
						

Thoughts:
**Analyzing the Bug Report and Preemption**

Okay, let me think this through. The `bit_spin_lock` call, that's supposed to *disable* preemption, right? But the bug report... it's saying `preempt_count: 0, expected: 0`. That's a huge clue! It means preemption *isn't* disabled at the critical point where `cond_resched_lock` is being called. That's not what I expected.

Alright, let's trace the logic. `jbd_unlock_bh_journal_head(bh)` is involved here, and that gets called within `jbd2_journal_put_journal_head(jh)`. So, the `bit_spin_lock` *must* be getting unlocked before that `cond_resched_lock` is invoked. It's a key unlock operation in this flow. That's good, but raises further questions.

I need to dig into the `jbd_lock_bh_state` function now. That's likely where the error lies.



45/2 2026/05/31 22:53 tool codesearch-definition-source
0m Error:
log-in to see details

Args:
map[ContextFile:fs/jbd2/journal.c Name:jbd_lock_bh_state]

Results:
map[SourceCode: SourceFile:]

46/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 29024
							output: 44
							thoughts: 139
						

Thoughts:
**Investigating Unexpected RCU Nesting**

Okay, hold on a second. I'm seeing `spin_lock(&jh->b_state_lock)` here, and that should be a regular spinlock, right? In a PREEMPT_RT kernel, a standard `spin_lock` would map to an `rt_spin_lock`, which inherently grabs an `rcu_read_lock`. The problem is that I'm seeing an RCU nest depth of 2, and that doesn't make sense if a simple unlock is used.

If `spin_unlock(&jh->b_state_lock)` is supposed to release that `rcu_read_lock`, then why this nesting? Something's not lining up. I need to dig deeper. Let's trace this and see what's happening. I need to check the `__jbd2_journal_refile_buffer(jh)` function.

Wait a minute... It's looking like `__jbd2_journal_refile_buffer` calls `__jbd2_journal_unfile_buffer(jh)`. Interesting. That might be the key to understanding the nesting. I'll need to examine that function's implementation closely.



47/2 2026/05/31 22:53 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:__jbd2_journal_unfile_buffer]

Results:
map[SourceCode:2126:	/*
2127:	 * Remove buffer from all transactions. The caller is responsible for dropping
2128:	 * the jh reference that belonged to the transaction.
2129:	 *
2130:	 * Called with bh_state lock and j_list_lock
2131:	 */
2132:	static void __jbd2_journal_unfile_buffer(struct journal_head *jh)
2133:	{
2134:		J_ASSERT_JH(jh, jh->b_transaction != NULL);
2135:		J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
2136:	
2137:		__jbd2_journal_temp_unlink_buffer(jh);
2138:		jh->b_transaction = NULL;
2139:	}
 SourceFile:fs/jbd2/transaction.c]

48/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 29718
							output: 36
							thoughts: 228
						

Thoughts:
**Analyzing the `__jbd2_journal_refile_buffer` Function**

Okay, let's break this down. My initial thought is focused on how `__jbd2_journal_refile_buffer` handles the `journal_head` (jh). Specifically, the return value: it's returning `true` if `jh->b_next_transaction` is `NULL`. That implies a scenario where we're dropping a reference, indicated by `drop_ref = true`. The next call, `spin_unlock(&jh->b_state_lock)`, is crucial. Then there's the conditional `if (drop_ref) jbd2_journal_put_journal_head(jh);` followed by either `release_buffer_page(bh)` or `__brelse(bh)`. Finally, there is the call to `cond_resched_lock(&journal->j_list_lock);`

My first instinct is to confirm that the `spin_unlock` *actually* releases the `rcu_read_lock`. I know from experience that this can be a subtle point. But `rt_spin_unlock` definitely *does* release the RCU lock, so that's the expected behavior. Now, I have to think about this differently; it's possible this `jh->b_state_lock` isn't an `rt_spin_lock`, right? That's the real question. I need to check the definition of `b_state_lock` within the `struct journal_head` structure to clarify its type. Then I'll have a definitive answer regarding RCU lock release.



49/2 2026/05/31 22:53 tool codesearch-definition-source
0m Args:
map[ContextFile:include/linux/jbd2.h Name:journal_head]

Results:
map[SourceCode:  22:	struct journal_head {
  23:		/*
  24:		 * Points back to our buffer_head. [jbd_lock_bh_journal_head()]
  25:		 */
  26:		struct buffer_head *b_bh;
  27:	
  28:		/*
  29:		 * Protect the buffer head state
  30:		 */
  31:		spinlock_t b_state_lock;
  32:	
  33:		/*
  34:		 * Reference count - see description in journal.c
  35:		 * [jbd_lock_bh_journal_head()]
  36:		 */
  37:		int b_jcount;
  38:	
  39:		/*
  40:		 * Journalling list for this buffer [b_state_lock]
  41:		 * NOTE: We *cannot* combine this with b_modified into a bitfield
  42:		 * as gcc would then (which the C standard allows but which is
  43:		 * very unuseful) make 64-bit accesses to the bitfield and clobber
  44:		 * b_jcount if its update races with bitfield modification.
  45:		 */
  46:		unsigned b_jlist;
  47:	
  48:		/*
  49:		 * This flag signals the buffer has been modified by
  50:		 * the currently running transaction
  51:		 * [b_state_lock]
  52:		 */
  53:		unsigned b_modified;
  54:	
  55:		/*
  56:		 * Copy of the buffer data frozen for writing to the log.
  57:		 * [b_state_lock]
  58:		 */
  59:		char *b_frozen_data;
  60:	
  61:		/*
  62:		 * Pointer to a saved copy of the buffer containing no uncommitted
  63:		 * deallocation references, so that allocations can avoid overwriting
  64:		 * uncommitted deletes. [b_state_lock]
  65:		 */
  66:		char *b_committed_data;
  67:	
  68:		/*
  69:		 * Pointer to the compound transaction which owns this buffer's
  70:		 * metadata: either the running transaction or the committing
  71:		 * transaction (if there is one).  Only applies to buffers on a
  72:		 * transaction's data or metadata journaling list.
  73:		 * [j_list_lock] [b_state_lock]
  74:		 * Either of these locks is enough for reading, both are needed for
  75:		 * changes.
  76:		 */
  77:		transaction_t *b_transaction;
  78:	
  79:		/*
  80:		 * Pointer to the running compound transaction which is currently
  81:		 * modifying the buffer's metadata, if there was already a transaction
  82:		 * committing it when the new transaction touched it.
  83:		 * [t_list_lock] [b_state_lock]
  84:		 */
  85:		transaction_t *b_next_transaction;
  86:	
  87:		/*
  88:		 * Doubly-linked list of buffers on a transaction's data, metadata or
  89:		 * forget queue. [t_list_lock] [b_state_lock]
  90:		 */
  91:		struct journal_head *b_tnext, *b_tprev;
  92:	
  93:		/*
  94:		 * Pointer to the compound transaction against which this buffer
  95:		 * is checkpointed.  Only dirty buffers can be checkpointed.
  96:		 * [j_list_lock]
  97:		 */
  98:		transaction_t *b_cp_transaction;
  99:	
 100:		/*
 101:		 * Doubly-linked list of buffers still remaining to be flushed
 102:		 * before an old transaction can be checkpointed.
 103:		 * [j_list_lock]
 104:		 */
 105:		struct journal_head *b_cpnext, *b_cpprev;
 106:	
 107:		/* Trigger type */
 108:		struct jbd2_buffer_trigger_type *b_triggers;
 109:	
 110:		/* Trigger type for the committing transaction's frozen data */
 111:		struct jbd2_buffer_trigger_type *b_frozen_triggers;
 112:	};
 SourceFile:include/linux/journal-head.h]

50/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 31550
							output: 36
							thoughts: 1279
						

Thoughts:
**Analyzing a Lockdep Trace in PREEMPT_RT**

Okay, so I'm looking at this lockdep trace, and the first thing I see is a `spinlock_t`, which in PREEMPT_RT means it's an `rt_spin_lock`. Let's dig into the trace itself to understand what's going on.

The trace shows three locks held by the `jbd2/sda1-8/5155` task. Lock #1 is `journal->j_list_lock` acquired during `jbd2_journal_commit_transaction`. Lock #2 and Lock #0 are both `rcu_read_lock` acquired at `rt_spin_lock`, however, if Lock #2 and Lock #0 are acquired by the same `rt_spin_lock` (Lock #1), then why is there two of them?

I'm trying to figure out which `rt_spin_lock` those `rcu_read_lock` calls are associated with. If it was `jh->b_state_lock`, I'd expect it to be explicitly listed, but it's not. I'm wondering if a `spin_unlock` for `jh->b_state_lock` didn't release the `rcu_read_lock` correctly. That doesn't make sense since `rt_spin_unlock` *should* release it.

It's definitely the `__rt_spin_lock` function acquiring the locks, not an explicit `rcu_read_lock()` call as indicated by the trace. So there *is* a spinlock being held. But why isn't the spinlock itself showing up in the lockdep trace, while its associated `rcu_read_lock` is present? This is confusing.

I need to remember how RCU and spinlocks interact in PREEMPT_RT.  If a spinlock is acquired, it calls `rcu_read_lock()`. If released, it calls `rcu_read_unlock()`. So why is the spinlock *itself* not showing up?

Could `rcu_read_lock` have been called from something like `bit_spin_lock`?  But wait, that function uses `preempt_disable()`, not `rcu_read_lock()`, so that's not it. `jbd_lock_bh_journal_head` calls `bit_spin_lock` but the trace is from `__rt_spin_lock`.

The trace says the `rcu_read_lock` was acquired by `__rt_spin_lock`, meaning there *is* a spinlock acquired, but it's missing from the lockdep trace. Could the missing spinlock be `journal->j_state_lock`? But that's an `rwlock_t`. Does `read_lock` or `write_lock` acquire `rcu_read_lock` in PREEMPT_RT? That is the next question.



51/2 2026/05/31 22:53 tool read-file
0m Error:
log-in to see details

Args:
map[File:kernel/locking/rwlock_rt.c FirstLine:1 LineCount:50]

Results:
map[Contents:]

52/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 33525
							output: 18
							thoughts: 12
						

Thoughts:
Here's my thought process, summarized as you requested:

**Investigating a Potential Race Condition**

Okay, so I need to track down a potential concurrency issue. The first thing that comes to mind is to use `grep` to quickly search the codebase. Specifically, I'm thinking about searching for instances of `rt_read_lock`. This function, or a similar construct, is a clear indicator that we're dealing with a read lock, and those are often a source of contention and can sometimes mask or reveal subtle concurrency bugs. By searching for this specific function, I can immediately identify all the places where read locks are being taken. This gives me a good starting point to further investigate read and write locking patterns in the area of concern, and, as an expert, I know that even the simplest read lock interactions can sometimes lead to very complicated issues.



53/2 2026/05/31 22:53 tool grepper
0m Args:
map[Expression:define read_lock]

Results:
map[Output:include/linux/lockdep.h=491=extern bool read_lock_is_recursive(void);
--
include/linux/lockdep.h-493-/* If !LOCKDEP, the value is meaningless */
include/linux/lockdep.h:494:#define read_lock_is_recursive() 0
include/linux/lockdep.h-495-#endif
--
include/linux/rwlock.h=48=static inline int do_raw_write_trylock(rwlock_t *rwlock)
--
include/linux/rwlock.h-65-#define write_lock(lock)	_raw_write_lock(lock)
include/linux/rwlock.h:66:#define read_lock(lock)		_raw_read_lock(lock)
include/linux/rwlock.h-67-
--
include/linux/rwlock.h-75-
include/linux/rwlock.h:76:#define read_lock_irqsave(lock, flags)			\
include/linux/rwlock.h-77-	do {						\
--
include/linux/rwlock.h-88-
include/linux/rwlock.h:89:#define read_lock_irqsave(lock, flags)			\
include/linux/rwlock.h-90-	do {						\
--
include/linux/rwlock.h-101-
include/linux/rwlock.h:102:#define read_lock_irq(lock)		_raw_read_lock_irq(lock)
include/linux/rwlock.h:103:#define read_lock_bh(lock)		_raw_read_lock_bh(lock)
include/linux/rwlock.h-104-#define write_lock_irq(lock)		_raw_write_lock_irq(lock)
--
include/linux/rwlock_rt.h=48=static __always_inline void read_lock_irq(rwlock_t *rwlock)
--
include/linux/rwlock_rt.h-53-
include/linux/rwlock_rt.h:54:#define read_lock_irqsave(lock, flags)			\
include/linux/rwlock_rt.h-55-	do {						\
]

54/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 34300
							output: 36
							thoughts: 16
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Diving into the Real-Time Read-Write Lock Implementation**

Okay, time to dig into the details. I need to understand how the real-time read-write locks (`rwlock_rt`) are implemented in the kernel. First stop: `include/linux/rwlock_rt.h`. This header file will likely lay out the core data structures and function prototypes. I expect to see the definition of the `rwlock_rt` structure itself – what fields are used for read/write tracking, potential contention handling, and maybe any real-time specific optimizations like priority inheritance or ceiling locks. I'll be looking to see if it uses the standard kernel spinlocks internally for mutual exclusion, or if it leverages more specialized atomic operations designed for the real-time context. The header should also detail the APIs: how the read and write locks are acquired and released, any try-lock variants, and perhaps even some debugging aids or state inspection functions. I'm keen to understand the lock's characteristics, especially its behavior under contention and whether it's designed to prevent priority inversions effectively. I'm expecting this file to be a central piece of the puzzle to understand how the locking primitives work in the RT environment.



55/2 2026/05/31 22:53 tool read-file
0m Args:
map[File:include/linux/rwlock_rt.h FirstLine:1 LineCount:50]

Results:
map[Contents:   1:	// SPDX-License-Identifier: GPL-2.0-only
   2:	#ifndef __LINUX_RWLOCK_RT_H
   3:	#define __LINUX_RWLOCK_RT_H
   4:	
   5:	#ifndef __LINUX_SPINLOCK_RT_H
   6:	#error Do not #include directly. Use <linux/spinlock.h>.
   7:	#endif
   8:	
   9:	#ifdef CONFIG_DEBUG_LOCK_ALLOC
  10:	extern void __rt_rwlock_init(rwlock_t *rwlock, const char *name,
  11:				     struct lock_class_key *key);
  12:	#else
  13:	static inline void __rt_rwlock_init(rwlock_t *rwlock, char *name,
  14:					    struct lock_class_key *key)
  15:	{
  16:	}
  17:	#endif
  18:	
  19:	#define rwlock_init(rwl)				\
  20:	do {							\
  21:		static struct lock_class_key __key;		\
  22:								\
  23:		init_rwbase_rt(&(rwl)->rwbase);			\
  24:		__rt_rwlock_init(rwl, #rwl, &__key);		\
  25:	} while (0)
  26:	
  27:	extern void rt_read_lock(rwlock_t *rwlock)	__acquires_shared(rwlock);
  28:	extern int rt_read_trylock(rwlock_t *rwlock)	__cond_acquires_shared(true, rwlock);
  29:	extern void rt_read_unlock(rwlock_t *rwlock)	__releases_shared(rwlock);
  30:	extern void rt_write_lock(rwlock_t *rwlock)	__acquires(rwlock);
  31:	extern void rt_write_lock_nested(rwlock_t *rwlock, int subclass)	__acquires(rwlock);
  32:	extern int rt_write_trylock(rwlock_t *rwlock)	__cond_acquires(true, rwlock);
  33:	extern void rt_write_unlock(rwlock_t *rwlock)	__releases(rwlock);
  34:	
  35:	static __always_inline void read_lock(rwlock_t *rwlock)
  36:		__acquires_shared(rwlock)
  37:	{
  38:		rt_read_lock(rwlock);
  39:	}
  40:	
  41:	static __always_inline void read_lock_bh(rwlock_t *rwlock)
  42:		__acquires_shared(rwlock)
  43:	{
  44:		local_bh_disable();
  45:		rt_read_lock(rwlock);
  46:	}
  47:	
  48:	static __always_inline void read_lock_irq(rwlock_t *rwlock)
  49:		__acquires_shared(rwlock)
  50:	{
]

56/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 35449
							output: 36
							thoughts: 23
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience and written in the first person:

**Kernel Locking Location Clarification**

Okay, a quick mental check... I need to find the definition or implementation of `rt_read_lock`. My immediate instinct is that this should be in the real-time locking code. Right, where does that typically reside? A quick mental parse of the file structure… yes, that makes sense. The real-time rwlock implementation *should* be in `kernel/locking/`. And *aha!* Memory jogs! It's indeed within `rwlock-rt.c`. So I can save myself some fruitless searching in other areas; I've got a specific file to check.



57/2 2026/05/31 22:53 tool read-file
0m Error:
log-in to see details

Args:
map[File:kernel/locking/rwlock-rt.c FirstLine:1 LineCount:50]

Results:
map[Contents:]

58/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 35682
							output: 20
							thoughts: 12
						

Thoughts:
Here's my thought process, summarized as you requested:

**Investigating a Potential Race Condition**

Okay, so I need to track down a potential concurrency issue. The first thing that comes to mind is to use `grep` to quickly search the codebase. Specifically, I'm thinking about searching for instances of `rt_read_lock`. This function, or a similar construct, is a clear indicator that we're dealing with a read lock, and those are often a source of contention and can sometimes mask or reveal subtle concurrency bugs. By searching for this specific function, I can immediately identify all the places where read locks are being taken. This gives me a good starting point to further investigate read and write locking patterns in the area of concern, and, as an expert, I know that even the simplest read lock interactions can sometimes lead to very complicated issues.



59/2 2026/05/31 22:53 tool grepper
0m Args:
map[Expression:void rt_read_lock]

Results:
map[Output:include/linux/rwlock_rt.h=20=do {							\
--
include/linux/rwlock_rt.h-26-
include/linux/rwlock_rt.h:27:extern void rt_read_lock(rwlock_t *rwlock)	__acquires_shared(rwlock);
include/linux/rwlock_rt.h-28-extern int rt_read_trylock(rwlock_t *rwlock)	__cond_acquires_shared(true, rwlock);
]

60/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 36027
							output: 22
							thoughts: 14
						

Thoughts:
Okay, here's my take on those thoughts, tailored for an expert audience:

**Analyzing the `rt_read_lock` Definition**

Alright, so my mental gears are already spinning. I'm immediately thinking, "Where's the definition of `rt_read_lock`?" This isn't just about finding the code, it's about the *implementation*. I need to see what's *actually* happening under the hood. Is it a spinlock? A mutex? Some more sophisticated read-write lock mechanism tailored for the real-time context? I need the low-level details, and the best way to get that quick is a `grep`. That should point me directly to the source file where it's defined, or at least to a header that includes its declaration. This gives me the fundamental building blocks of how this lock operates. From there, I can begin to assess its suitability for the particular requirements I am evaluating. I'm already envisioning the potential use cases and performance implications based on the underlying lock primitive, so let's get that definition and then drill down further.



61/2 2026/05/31 22:53 tool grepper
0m Args:
map[Expression:void __sched rt_read_lock]

Results:
map[Output:kernel/locking/spinlock_rt.c=227=EXPORT_SYMBOL(rt_write_trylock);
kernel/locking/spinlock_rt.c-228-
kernel/locking/spinlock_rt.c:229:void __sched rt_read_lock(rwlock_t *rwlock) __acquires(RCU)
kernel/locking/spinlock_rt.c-230-{
]

62/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 36402
							output: 38
							thoughts: 37
						

Thoughts:
Okay, here's my take on those thoughts, tailored for an expert audience:

**Examining a JBD2 Commit Process within an RCU Context**

Right, `rt_read_lock` indicates we're diving into an RCU protected region. Time to revisit `fs/jbd2/commit.c`, specifically around line 1071. I need to refresh my memory on how this part of the journaling code interacts with the read-copy-update mechanisms. I'm probably looking at a critical section where data is being read that might be concurrently updated by other threads, so RCU's quiescent state logic is crucial to maintaining data consistency during commit. I need to identify where the read side begins and ends so that I can figure out which data must be RCU protected.



63/2 2026/05/31 22:53 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1060 LineCount:50]

Results:
map[Contents:1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
1070:				__brelse(bh);
1071:			cond_resched_lock(&journal->j_list_lock);
1072:		}
1073:		spin_unlock(&journal->j_list_lock);
1074:		/*
1075:		 * This is a bit sleazy.  We use j_list_lock to protect transition
1076:		 * of a transaction into T_FINISHED state and calling
1077:		 * __jbd2_journal_drop_transaction(). Otherwise we could race with
1078:		 * other checkpointing code processing the transaction...
1079:		 */
1080:		write_lock(&journal->j_state_lock);
1081:		spin_lock(&journal->j_list_lock);
1082:		/*
1083:		 * Now recheck if some buffers did not get attached to the transaction
1084:		 * while the lock was dropped...
1085:		 */
1086:		if (commit_transaction->t_forget) {
1087:			spin_unlock(&journal->j_list_lock);
1088:			write_unlock(&journal->j_state_lock);
1089:			goto restart_loop;
1090:		}
1091:	
1092:		/* Add the transaction to the checkpoint list
1093:		 * __journal_remove_checkpoint() can not destroy transaction
1094:		 * under us because it is not marked as T_FINISHED yet */
1095:		if (journal->j_checkpoint_transactions == NULL) {
1096:			journal->j_checkpoint_transactions = commit_transaction;
1097:			commit_transaction->t_cpnext = commit_transaction;
1098:			commit_transaction->t_cpprev = commit_transaction;
1099:		} else {
1100:			commit_transaction->t_cpnext =
1101:				journal->j_checkpoint_transactions;
1102:			commit_transaction->t_cpprev =
1103:				commit_transaction->t_cpnext->t_cpprev;
1104:			commit_transaction->t_cpnext->t_cpprev =
1105:				commit_transaction;
1106:			commit_transaction->t_cpprev->t_cpnext =
1107:					commit_transaction;
1108:		}
1109:		spin_unlock(&journal->j_list_lock);
]

64/2 2026/05/31 22:53 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 37464
							output: 37
							thoughts: 79
						

Thoughts:
Okay, let me think this through.

**Analyzing Potential Lock Ordering Issues in `jbd2_journal_commit_transaction`**

Alright, I'm tracing through this code, and I've hit a potential point of contention. I see `write_lock(&journal->j_state_lock)` called at line 1080. My immediate concern is with the potential for lock order inversion or deadlock. Further back, on line 1071, `cond_resched_lock` is invoked. The question I need to answer, *immediately*, is whether or not `journal->j_state_lock` is held *at* that call on line 1071. This is crucial; if that lock is already held when `cond_resched_lock` is acquired, and it *isn't* acquired *before* `cond_resched_lock`, we've got a problem. To be absolutely sure, I'm going to jump back to the beginning of the `jbd2_journal_commit_transaction` function and meticulously review the lock acquisition sequence. I need to understand the full context of these lock operations to be confident in the code's integrity.



65/2 2026/05/31 22:54 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:430 LineCount:50]

Results:
map[Contents: 430:		} else {
 431:			jbd2_debug(3, "superblock not updated\n");
 432:		}
 433:	
 434:		J_ASSERT(journal->j_running_transaction != NULL);
 435:		J_ASSERT(journal->j_committing_transaction == NULL);
 436:	
 437:		write_lock(&journal->j_state_lock);
 438:		journal->j_flags |= JBD2_FULL_COMMIT_ONGOING;
 439:		while (journal->j_flags & JBD2_FAST_COMMIT_ONGOING) {
 440:			DEFINE_WAIT(wait);
 441:	
 442:			prepare_to_wait(&journal->j_fc_wait, &wait,
 443:					TASK_UNINTERRUPTIBLE);
 444:			write_unlock(&journal->j_state_lock);
 445:			schedule();
 446:			write_lock(&journal->j_state_lock);
 447:			finish_wait(&journal->j_fc_wait, &wait);
 448:			/*
 449:			 * TODO: by blocking fast commits here, we are increasing
 450:			 * fsync() latency slightly. Strictly speaking, we don't need
 451:			 * to block fast commits until the transaction enters T_FLUSH
 452:			 * state. So an optimization is possible where we block new fast
 453:			 * commits here and wait for existing ones to complete
 454:			 * just before we enter T_FLUSH. That way, the existing fast
 455:			 * commits and this full commit can proceed parallely.
 456:			 */
 457:		}
 458:		write_unlock(&journal->j_state_lock);
 459:	
 460:		commit_transaction = journal->j_running_transaction;
 461:	
 462:		trace_jbd2_start_commit(journal, commit_transaction);
 463:		jbd2_debug(1, "JBD2: starting commit of transaction %d\n",
 464:				commit_transaction->t_tid);
 465:	
 466:		write_lock(&journal->j_state_lock);
 467:		journal->j_fc_off = 0;
 468:		J_ASSERT(commit_transaction->t_state == T_RUNNING);
 469:		commit_transaction->t_state = T_LOCKED;
 470:	
 471:		trace_jbd2_commit_locking(journal, commit_transaction);
 472:		stats.run.rs_wait = commit_transaction->t_max_wait;
 473:		stats.run.rs_request_delay = 0;
 474:		stats.run.rs_locked = jiffies;
 475:		if (commit_transaction->t_requested)
 476:			stats.run.rs_request_delay =
 477:				jbd2_time_diff(commit_transaction->t_requested,
 478:					       stats.run.rs_locked);
 479:		stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
]

66/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 38711
							output: 37
							thoughts: 33
						

Thoughts:
Okay, here's my take on those thoughts, framed as an expert's internal monologue:

**Checking Write Lock Scope**

Alright, let's see... I'm looking at this journal code, and my spidey-sense is tingling. Line 466, I see `write_lock(&journal->j_state_lock)` called. Good, good, we're taking the necessary precautions. My immediate concern, though, is how long that lock is held. Specifically, is it definitively released *before* we hit line 948? The implications are pretty clear, if the lock isn't handled correctly the system will grind to a halt. We're obviously in a critical section, and I need to make sure this lock's duration is scoped precisely. Time to dive deeper and trace the code's execution flow. No room for sloppy locking around here. I need to confirm the unlocking operation, and the conditions under which it occurs, before I can breathe easy.



67/2 2026/05/31 22:54 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:480 LineCount:50]

Results:
map[Contents: 480:						      stats.run.rs_locked);
 481:	
 482:		// waits for any t_updates to finish
 483:		jbd2_journal_wait_updates(journal);
 484:	
 485:		commit_transaction->t_state = T_SWITCH;
 486:	
 487:		J_ASSERT (atomic_read(&commit_transaction->t_outstanding_credits) <=
 488:				journal->j_max_transaction_buffers);
 489:	
 490:		/*
 491:		 * First thing we are allowed to do is to discard any remaining
 492:		 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
 493:		 * that there are no such buffers: if a large filesystem
 494:		 * operation like a truncate needs to split itself over multiple
 495:		 * transactions, then it may try to do a jbd2_journal_restart() while
 496:		 * there are still BJ_Reserved buffers outstanding.  These must
 497:		 * be released cleanly from the current transaction.
 498:		 *
 499:		 * In this case, the filesystem must still reserve write access
 500:		 * again before modifying the buffer in the new transaction, but
 501:		 * we do not require it to remember exactly which old buffers it
 502:		 * has reserved.  This is consistent with the existing behaviour
 503:		 * that multiple jbd2_journal_get_write_access() calls to the same
 504:		 * buffer are perfectly permissible.
 505:		 * We use journal->j_state_lock here to serialize processing of
 506:		 * t_reserved_list with eviction of buffers from journal_unmap_buffer().
 507:		 */
 508:		while (commit_transaction->t_reserved_list) {
 509:			jh = commit_transaction->t_reserved_list;
 510:			JBUFFER_TRACE(jh, "reserved, unused: refile");
 511:			/*
 512:			 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
 513:			 * leave undo-committed data.
 514:			 */
 515:			if (jh->b_committed_data) {
 516:				struct buffer_head *bh = jh2bh(jh);
 517:	
 518:				spin_lock(&jh->b_state_lock);
 519:				jbd2_free(jh->b_committed_data, bh->b_size);
 520:				jh->b_committed_data = NULL;
 521:				spin_unlock(&jh->b_state_lock);
 522:			}
 523:			jbd2_journal_refile_buffer(journal, jh);
 524:		}
 525:	
 526:		write_unlock(&journal->j_state_lock);
 527:		/*
 528:		 * Now try to drop any written-back buffers from the journal's
 529:		 * checkpoint lists.  We do this *before* commit because it potentially
]

68/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 39840
							output: 37
							thoughts: 1088
						

Thoughts:
**Analyzing a Lockdep Trace in JBD2**

Okay, so I'm looking at this trace. I see `write_unlock(&journal->j_state_lock)` at line 526, so `j_state_lock` isn't currently held. Let me re-examine the lockdep trace. Hmm, it shows three locks held by the `jbd2/sda1-8/5155` process. There's an `rcu_read_lock`, then `&journal->j_list_lock`, and finally another `rcu_read_lock`.

I'm puzzled. Lockdep shows the `rcu_read_lock` being held *before* and *after* `&journal->j_list_lock`. Could the first `rcu_read_lock` be associated with `spin_lock(&jh->b_state_lock)`? But hang on, `jh->b_state_lock` was supposedly unlocked at line 1064! If it was truly unlocked then why is `rcu_read_lock` still active?

Let's look at how `spin_unlock(&jh->b_state_lock)` is implemented. In PREEMPT_RT, that resolves to `rt_spin_unlock`. Is `jh->b_state_lock` even a spinlock? Yes, I see the definition `spinlock_t b_state_lock;`. So, `spin_unlock` *does* map to `rt_spin_unlock` in this configuration. And, as I recall, `rt_spin_unlock` *should* call `rcu_read_unlock()`.

But wait. `rcu_read_lock` is recursive. If it was acquired twice, it *must* be released twice. We know that `spin_lock(&jh->b_state_lock)` acquires `rcu_read_lock` and then `spin_unlock(&jh->b_state_lock)` should release it. So, the nesting depth should be zero.

Ah, but here's a thought: what if the *first* `rcu_read_lock` wasn't acquired by `spin_lock(&jh->b_state_lock)` at all? What if something *else* acquired lock #0 before the `spin_lock` call? I need to look closer at the code in `fs/jbd2/commit.c`, specifically around line 948. That might shed some light on the order of operations and where the `rcu_read_lock` is actually coming from.



69/2 2026/05/31 22:54 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:940 LineCount:50]

Results:
map[Contents: 940:		J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
 941:		J_ASSERT(commit_transaction->t_shadow_list == NULL);
 942:	
 943:	restart_loop:
 944:		/*
 945:		 * As there are other places (journal_unmap_buffer()) adding buffers
 946:		 * to this list we have to be careful and hold the j_list_lock.
 947:		 */
 948:		spin_lock(&journal->j_list_lock);
 949:		while (commit_transaction->t_forget) {
 950:			transaction_t *cp_transaction;
 951:			struct buffer_head *bh;
 952:			int try_to_free = 0;
 953:			bool drop_ref;
 954:	
 955:			jh = commit_transaction->t_forget;
 956:			spin_unlock(&journal->j_list_lock);
 957:			bh = jh2bh(jh);
 958:			/*
 959:			 * Get a reference so that bh cannot be freed before we are
 960:			 * done with it.
 961:			 */
 962:			get_bh(bh);
 963:			spin_lock(&jh->b_state_lock);
 964:			J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
 965:	
 966:			/*
 967:			 * If there is undo-protected committed data against
 968:			 * this buffer, then we can remove it now.  If it is a
 969:			 * buffer needing such protection, the old frozen_data
 970:			 * field now points to a committed version of the
 971:			 * buffer, so rotate that field to the new committed
 972:			 * data.
 973:			 *
 974:			 * Otherwise, we can just throw away the frozen data now.
 975:			 *
 976:			 * We also know that the frozen data has already fired
 977:			 * its triggers if they exist, so we can clear that too.
 978:			 */
 979:			if (jh->b_committed_data) {
 980:				jbd2_free(jh->b_committed_data, bh->b_size);
 981:				jh->b_committed_data = NULL;
 982:				if (jh->b_frozen_data) {
 983:					jh->b_committed_data = jh->b_frozen_data;
 984:					jh->b_frozen_data = NULL;
 985:					jh->b_frozen_triggers = NULL;
 986:				}
 987:			} else if (jh->b_frozen_data) {
 988:				jbd2_free(jh->b_frozen_data, bh->b_size);
 989:				jh->b_frozen_data = NULL;
]

70/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 42333
							output: 44
							thoughts: 230
						

Thoughts:
**Analyzing a Potential Lock Ordering Issue**

Okay, let's break this down. Line 948, I see a `spin_lock(&journal->j_list_lock)`. Then, at 956, that lock is released with `spin_unlock(&journal->j_list_lock)`. So far, so good. Now, on line 963, we've got `spin_lock(&jh->b_state_lock)`. That's new, and I need to keep track of this.

Line 993, we reacquire the `spin_lock(&journal->j_list_lock)`. That's... interesting. We're nesting locks here, so I need to be careful with the ordering.

The `spin_unlock(&jh->b_state_lock)` is happening at 1064. That's good; it means we're releasing the `b_state_lock` that was acquired on 963. Now, if I understand the typical lock acquisition pattern, that *should* mean we've released any potential `rcu_read_lock` acquired alongside that.

But, hang on, there's a function call directly after releasing that `b_state_lock` - `jbd2_journal_put_journal_head(jh)` at line 1066. Is this where the problem could arise? Is this function going to re-acquire the `rcu_read_lock`? I need to check how `jbd2_journal_put_journal_head(jh)` handles locks. It could be grabbing another lock here, which might violate the ordering. Time to dig into the source for `jbd2_journal_put_journal_head(jh)`.



71/2 2026/05/31 22:54 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/journal.c Name:jbd2_journal_put_journal_head]

Results:
map[SourceCode:2990:	/*
2991:	 * Drop a reference on the passed journal_head.  If it fell to zero then
2992:	 * release the journal_head from the buffer_head.
2993:	 */
2994:	void jbd2_journal_put_journal_head(struct journal_head *jh)
2995:	{
2996:		struct buffer_head *bh = jh2bh(jh);
2997:	
2998:		jbd_lock_bh_journal_head(bh);
2999:		J_ASSERT_JH(jh, jh->b_jcount > 0);
3000:		--jh->b_jcount;
3001:		if (!jh->b_jcount) {
3002:			__journal_remove_journal_head(bh);
3003:			jbd_unlock_bh_journal_head(bh);
3004:			journal_release_journal_head(jh, bh->b_size);
3005:			__brelse(bh);
3006:		} else {
3007:			jbd_unlock_bh_journal_head(bh);
3008:		}
3009:	}
 SourceFile:fs/jbd2/journal.c]

72/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 43342
							output: 36
							thoughts: 68
						

Thoughts:
Here's my summary, as the expert:

**Investigating a Potential Concurrency Issue in Journaling**

Alright, let's break this down. I'm looking at `jbd_lock_bh_journal_head`, and it's calling `bit_spin_lock(BH_JournalHead, &bh->b_state)`. My immediate thought is, "Wait a second, is `bit_spin_lock` somehow interacting with Read-Copy-Update (RCU) operations?" I know how sensitive journaling can be, and race conditions are always a concern in this area, especially at the block level. RCU is prevalent in a lot of kernel subsystems, so it's a valid thing to think about.

I need to confirm if `bit_spin_lock` uses `rcu_read_lock` internally. Given the context, this could introduce some subtle and potentially nasty concurrency problems if not handled correctly. I'll need to go back and examine the implementation of `bit_spin_lock` very carefully, looking for any signs of RCU involvement. Need to make sure the lock is the *right* kind of lock for this use case. Let's dig in.



73/2 2026/05/31 22:54 tool read-file
0m Args:
map[File:include/linux/bit_spinlock.h FirstLine:20 LineCount:30]

Results:
map[Contents:  20:	#define __bitlock(bitnum, addr) (struct __context_bitlock *)(bitnum + (addr))
  21:	
  22:	/*
  23:	 *  bit-based spin_lock()
  24:	 *
  25:	 * Don't use this unless you really need to: spin_lock() and spin_unlock()
  26:	 * are significantly faster.
  27:	 */
  28:	static __always_inline void bit_spin_lock(int bitnum, unsigned long *addr)
  29:		__acquires(__bitlock(bitnum, addr))
  30:	{
  31:		/*
  32:		 * Assuming the lock is uncontended, this never enters
  33:		 * the body of the outer loop. If it is contended, then
  34:		 * within the inner loop a non-atomic test is used to
  35:		 * busywait with less bus contention for a good time to
  36:		 * attempt to acquire the lock bit.
  37:		 */
  38:		preempt_disable();
  39:	#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  40:		while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
  41:			preempt_enable();
  42:			do {
  43:				cpu_relax();
  44:			} while (test_bit(bitnum, addr));
  45:			preempt_disable();
  46:		}
  47:	#endif
  48:		__acquire(__bitlock(bitnum, addr));
  49:	}
]

74/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 44138
							output: 41
							thoughts: 165
						

Thoughts:
**Debugging a Concurrency Issue**

Okay, so I'm looking into this `bit_spin_lock` call and trying to figure out what's going wrong. My initial thought was that it was failing to properly disable preemption. I saw that it calls `preempt_disable()`, but then I had a nagging doubt because of PREEMPT_RT and remembered that under `migrate_disable()` it *doesn't* actually disable preemption. But then I quickly corrected myself; no, `preempt_disable()` *does* disable preemption. The problem is that the bug report is saying the `preempt_count` is 0 when it should be. So preemption *isn't* disabled at `cond_resched_lock` . That means that `bit_spin_unlock` *must* have been called and thus must call `preempt_enable()`. So, the problem isn't with `bit_spin_lock` itself. Where else could it be going wrong? Perhaps the call from `jbd2_journal_put_journal_head` to `__journal_remove_journal_head(bh)`? I'll need to investigate that further.



75/2 2026/05/31 22:54 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/journal.c Name:__journal_remove_journal_head]

Results:
map[SourceCode:2959:	static void __journal_remove_journal_head(struct buffer_head *bh)
2960:	{
2961:		struct journal_head *jh = bh2jh(bh);
2962:	
2963:		J_ASSERT_JH(jh, jh->b_transaction == NULL);
2964:		J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
2965:		J_ASSERT_JH(jh, jh->b_cp_transaction == NULL);
2966:		J_ASSERT_JH(jh, jh->b_jlist == BJ_None);
2967:		J_ASSERT_BH(bh, buffer_jbd(bh));
2968:		J_ASSERT_BH(bh, jh2bh(jh) == bh);
2969:		BUFFER_TRACE(bh, "remove journal_head");
2970:	
2971:		/* Unlink before dropping the lock */
2972:		bh->b_private = NULL;
2973:		jh->b_bh = NULL;	/* debug, really */
2974:		clear_buffer_jbd(bh);
2975:	}
 SourceFile:fs/jbd2/journal.c]

76/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 44935
							output: 40
							thoughts: 24
						

Thoughts:
Okay, here's my interpretation of those thoughts, crafted with the understanding that I'm talking to a fellow expert:

**Empty Canvas, Initial Probe**

...Hmm, absolutely nothing. That's a bit of a blank slate, isn't it? Just staring into the void, trying to get the mental gears turning. Okay, let's try to focus. Ah, yes, what about that `journal_release_journal_head(jh, bh->b_size)` call? That feels like it could be a crucial function to consider next.



77/2 2026/05/31 22:54 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/journal.c Name:journal_release_journal_head]

Results:
map[SourceCode:2977:	static void journal_release_journal_head(struct journal_head *jh, size_t b_size)
2978:	{
2979:		if (jh->b_frozen_data) {
2980:			printk(KERN_WARNING "%s: freeing b_frozen_data\n", __func__);
2981:			jbd2_free(jh->b_frozen_data, b_size);
2982:		}
2983:		if (jh->b_committed_data) {
2984:			printk(KERN_WARNING "%s: freeing b_committed_data\n", __func__);
2985:			jbd2_free(jh->b_committed_data, b_size);
2986:		}
2987:		journal_free_journal_head(jh);
2988:	}
 SourceFile:fs/jbd2/journal.c]

78/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 45369
							output: 37
							thoughts: 15
						

Thoughts:
Okay, here's my summary, presented as a stream of thought:

**Empty Canvas, Tiny Clue**

Hmm, there's just... *nothing* here. No context, no preceding problem. It's like staring at a blank slate. Okay, well, given the context I'm in, which is probably related to operating systems or low-level memory management, I'm going to take a shot in the dark. *What about* that function call? What was it again? Ah, yes, `__brelse(bh)`. I suspect the missing context is unimportant. Let's see if this small piece of data is enough to get me started.



79/2 2026/05/31 22:54 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/journal.c Name:__brelse]

Results:
map[SourceCode:1122:	/**
1123:	 * __brelse - Release a buffer.
1124:	 * @bh: The buffer to release.
1125:	 *
1126:	 * This variant of brelse() can be called if @bh is guaranteed to not be NULL.
1127:	 */
1128:	void __brelse(struct buffer_head *bh)
1129:	{
1130:		if (atomic_read(&bh->b_count)) {
1131:			put_bh(bh);
1132:			return;
1133:		}
1134:		WARN(1, KERN_ERR "VFS: brelse: Trying to free free buffer\n");
1135:	}
 SourceFile:fs/buffer.c]

80/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 45795
							output: 18
							thoughts: 45
						

Thoughts:
**A Momentary Puzzle**

Hmm, I'm drawing a blank. There's just...nothing obvious springing to mind here. Hold on a second, something just twinged. What if `spin_unlock(&jh->b_state_lock)` *doesn't* actually release the `rcu_read_lock`? That could be a nasty little bug waiting to happen. It's not something I'd normally assume, but I've learned to be skeptical of anything that seems too simple. Time to go digging. I'm going to look at the definition of `spin_unlock` and make sure my intuition is correct... or not! I'll quickly check the source code and confirm exactly what that function is doing.



81/2 2026/05/31 22:54 tool grepper
0m Args:
map[Expression:define spin_unlock]

Results:
map[Output:arch/parisc/kernel/firmware.c-71-# undef  spin_unlock_irqrestore
arch/parisc/kernel/firmware.c:72:# define spin_unlock_irqrestore(a, b)
arch/parisc/kernel/firmware.c-73-#else
--
tools/include/linux/spinlock.h-14-#define spin_lock_nested(x, subclass)	pthread_mutex_lock(x)
tools/include/linux/spinlock.h:15:#define spin_unlock(x)			pthread_mutex_unlock(x)
tools/include/linux/spinlock.h-16-#define spin_lock_bh(x)			pthread_mutex_lock(x)
tools/include/linux/spinlock.h:17:#define spin_unlock_bh(x)		pthread_mutex_unlock(x)
tools/include/linux/spinlock.h-18-#define spin_lock_irq(x)		pthread_mutex_lock(x)
tools/include/linux/spinlock.h:19:#define spin_unlock_irq(x)		pthread_mutex_unlock(x)
tools/include/linux/spinlock.h-20-#define spin_lock_irqsave(x, f)		(void)f, pthread_mutex_lock(x)
tools/include/linux/spinlock.h:21:#define spin_unlock_irqrestore(x, f)	(void)f, pthread_mutex_unlock(x)
tools/include/linux/spinlock.h-22-
]

82/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 46390
							output: 35
							thoughts: 15
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Diving into Spinlock Internals**

Okay, so I need to understand something about the real-time spinlock implementation, probably to debug a performance issue or understand a kernel patch. First, I'm going straight to the source. `include/linux/spinlock_rt.h` is where I'd expect to find the core definitions and structures for the real-time spinlock variant. That's the logical starting point. I want to see how the RT spinlock differs from the standard one, what synchronization primitives it uses, if any interrupt masking is involved, and how priority inheritance is handled. From there, I can start to piece together how it affects the system's schedulability and real-time guarantees. This header will likely be my foundation to follow the call path and understand the full implications. Let's see what's in there...



83/2 2026/05/31 22:54 tool read-file
0m Args:
map[File:include/linux/spinlock_rt.h FirstLine:1 LineCount:50]

Results:
map[Contents:   1:	// SPDX-License-Identifier: GPL-2.0-only
   2:	#ifndef __LINUX_SPINLOCK_RT_H
   3:	#define __LINUX_SPINLOCK_RT_H
   4:	
   5:	#ifndef __LINUX_INSIDE_SPINLOCK_H
   6:	#error Do not include directly. Use spinlock.h
   7:	#endif
   8:	
   9:	#ifdef CONFIG_DEBUG_LOCK_ALLOC
  10:	extern void __rt_spin_lock_init(spinlock_t *lock, const char *name,
  11:					struct lock_class_key *key, bool percpu);
  12:	#else
  13:	static inline void __rt_spin_lock_init(spinlock_t *lock, const char *name,
  14:					struct lock_class_key *key, bool percpu)
  15:	{
  16:	}
  17:	#endif
  18:	
  19:	#define __spin_lock_init(slock, name, key, percpu)		\
  20:	do {								\
  21:		rt_mutex_base_init(&(slock)->lock);			\
  22:		__rt_spin_lock_init(slock, name, key, percpu);		\
  23:	} while (0)
  24:	
  25:	#define _spin_lock_init(slock, percpu)				\
  26:	do {								\
  27:		static struct lock_class_key __key;			\
  28:		__spin_lock_init(slock, #slock, &__key, percpu);	\
  29:	} while (0)
  30:	
  31:	#define spin_lock_init(slock)		_spin_lock_init(slock, false)
  32:	#define local_spin_lock_init(slock)	_spin_lock_init(slock, true)
  33:	
  34:	extern void rt_spin_lock(spinlock_t *lock) __acquires(lock);
  35:	extern void rt_spin_lock_nested(spinlock_t *lock, int subclass)	__acquires(lock);
  36:	extern void rt_spin_lock_nest_lock(spinlock_t *lock, struct lockdep_map *nest_lock) __acquires(lock);
  37:	extern void rt_spin_unlock(spinlock_t *lock)	__releases(lock);
  38:	extern void rt_spin_lock_unlock(spinlock_t *lock);
  39:	extern int rt_spin_trylock_bh(spinlock_t *lock) __cond_acquires(true, lock);
  40:	extern int rt_spin_trylock(spinlock_t *lock) __cond_acquires(true, lock);
  41:	
  42:	static __always_inline void spin_lock(spinlock_t *lock)
  43:		__acquires(lock)
  44:	{
  45:		rt_spin_lock(lock);
  46:	}
  47:	
  48:	#ifdef CONFIG_LOCKDEP
  49:	# define __spin_lock_nested(lock, subclass)				\
  50:		rt_spin_lock_nested(lock, subclass)
]

84/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 47505
							output: 36
							thoughts: 17
						

Thoughts:
Here's my take on those thoughts:

**Unpacking the Kernel Spinlock Definition**

Okay, so I'm looking at this code and something's jumped out at me. I'm seeing `spin_unlock` and it's *defined* as `rt_spin_unlock`. That's interesting, but not necessarily alarming. It suggests there's some level of abstraction or a redirection happening. Most likely this is related to the real-time aspects of the kernel; this spinlock unlock is likely being intercepted and handled by the RTOS to maintain the real-time guarantees, or at least a real-time aware version of the locking primitives. I need to dig deeper into `rt_spin_unlock` now to understand exactly what's different about this implementation. Is it doing things like interrupt masking, priority inheritance, or other mechanisms that are typical for real-time systems? Is it using a different underlying lock implementation altogether? This is where the real nuance lies, but at least this definition gives me the starting point for my investigation.



85/2 2026/05/31 22:54 tool read-file
0m Args:
map[File:include/linux/spinlock_rt.h FirstLine:50 LineCount:50]

Results:
map[Contents:  50:		rt_spin_lock_nested(lock, subclass)
  51:	
  52:	# define __spin_lock_nest_lock(lock, nest_lock)				\
  53:		do {								\
  54:			typecheck(struct lockdep_map *, &(nest_lock)->dep_map);	\
  55:			rt_spin_lock_nest_lock(lock, &(nest_lock)->dep_map);	\
  56:		} while (0)
  57:	# define __spin_lock_irqsave_nested(lock, flags, subclass)	\
  58:		do {							\
  59:			typecheck(unsigned long, flags);		\
  60:			flags = 0;					\
  61:			__spin_lock_nested(lock, subclass);		\
  62:		} while (0)
  63:	
  64:	#else
  65:	 /*
  66:	  * Always evaluate the 'subclass' argument to avoid that the compiler
  67:	  * warns about set-but-not-used variables when building with
  68:	  * CONFIG_DEBUG_LOCK_ALLOC=n and with W=1.
  69:	  */
  70:	# define __spin_lock_nested(lock, subclass)	spin_lock(((void)(subclass), (lock)))
  71:	# define __spin_lock_nest_lock(lock, subclass)	spin_lock(((void)(subclass), (lock)))
  72:	# define __spin_lock_irqsave_nested(lock, flags, subclass)	\
  73:		spin_lock_irqsave(((void)(subclass), (lock)), flags)
  74:	#endif
  75:	
  76:	#define spin_lock_nested(lock, subclass)		\
  77:		__spin_lock_nested(lock, subclass)
  78:	
  79:	#define spin_lock_nest_lock(lock, nest_lock)		\
  80:		__spin_lock_nest_lock(lock, nest_lock)
  81:	
  82:	#define spin_lock_irqsave_nested(lock, flags, subclass)	\
  83:		__spin_lock_irqsave_nested(lock, flags, subclass)
  84:	
  85:	static __always_inline void spin_lock_bh(spinlock_t *lock)
  86:		__acquires(lock)
  87:	{
  88:		/* Investigate: Drop bh when blocking ? */
  89:		local_bh_disable();
  90:		rt_spin_lock(lock);
  91:	}
  92:	
  93:	static __always_inline void spin_lock_irq(spinlock_t *lock)
  94:		__acquires(lock)
  95:	{
  96:		rt_spin_lock(lock);
  97:	}
  98:	
  99:	#define spin_lock_irqsave(lock, flags)			 \
]

86/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 48576
							output: 37
							thoughts: 16
						

Thoughts:
Here's my take on the contents of `include/linux/spinlock_rt.h`, assuming I'm already pretty familiar with the Linux kernel and real-time systems:

**Spinlock RT Header Deep Dive**

Okay, so we're diving into `spinlock_rt.h`. This is where the real-time spinlock magic happens, or at least, the crucial definitions that underpin it. I'm expecting to see the core data structures and macros that ensure these locks behave predictably under real-time constraints, hopefully minimizing priority inversion issues. Let's see what's actually under the hood. I'm especially keen to see how they've handled the typical challenges: preemptible code, interrupt handling, and the need for both spinlocks and mutexes in the same environment.

I'm betting there's a good amount of code devoted to preventing or mitigating the problems of standard spinlocks in a hard real-time context. I'll be looking for things like priority inheritance mechanisms, perhaps some sort of "wait-free" strategy when possible, or at least a way to bound the worst-case blocking time. I'll also be carefully checking any preemption disabling macros or potential sources of high latency. The real-time spinlock is really the bedrock for many real-time kernel modules, so this is critical. I'm expecting to see atomic operations heavily utilized, and a good balance between speed and predictability. Let's dig in and see the details.



87/2 2026/05/31 22:54 tool read-file
0m Args:
map[File:include/linux/spinlock_rt.h FirstLine:100 LineCount:50]

Results:
map[Contents: 100:		do {						 \
 101:			typecheck(unsigned long, flags);	 \
 102:			flags = 0;				 \
 103:			spin_lock(lock);			 \
 104:		} while (0)
 105:	
 106:	static __always_inline void spin_unlock(spinlock_t *lock)
 107:		__releases(lock)
 108:	{
 109:		rt_spin_unlock(lock);
 110:	}
 111:	
 112:	static __always_inline void spin_unlock_bh(spinlock_t *lock)
 113:		__releases(lock)
 114:	{
 115:		rt_spin_unlock(lock);
 116:		local_bh_enable();
 117:	}
 118:	
 119:	static __always_inline void spin_unlock_irq(spinlock_t *lock)
 120:		__releases(lock)
 121:	{
 122:		rt_spin_unlock(lock);
 123:	}
 124:	
 125:	static __always_inline void spin_unlock_irqrestore(spinlock_t *lock,
 126:							   unsigned long flags)
 127:		__releases(lock)
 128:	{
 129:		rt_spin_unlock(lock);
 130:	}
 131:	
 132:	#define spin_trylock(lock)	rt_spin_trylock(lock)
 133:	
 134:	#define spin_trylock_bh(lock)	rt_spin_trylock_bh(lock)
 135:	
 136:	#define spin_trylock_irq(lock)	rt_spin_trylock(lock)
 137:	
 138:	static __always_inline bool _spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags)
 139:		__cond_acquires(true, lock)
 140:	{
 141:		*flags = 0;
 142:		return rt_spin_trylock(lock);
 143:	}
 144:	#define spin_trylock_irqsave(lock, flags) _spin_trylock_irqsave(lock, &(flags))
 145:	
 146:	#define spin_is_contended(lock)		(((void)(lock), 0))
 147:	
 148:	static inline int spin_is_locked(spinlock_t *lock)
 149:	{
]

88/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 49664
							output: 38
							thoughts: 211
						

Thoughts:
**Analyzing the Buffer State Lock in the JBD2 Journal**

Okay, so `spin_unlock` is definitely calling `rt_spin_unlock` – that much is clear. But I'm starting to see a potential issue. What if the `jh->b_state_lock` *wasn't* unlocked before this point? Let's trace it back through `__jbd2_journal_refile_buffer(jh)`.

Right, it returns `true` if `jh->b_next_transaction` is `NULL`. If it returns `true`, we set `drop_ref` to `true`. Then, and this is the important bit, `spin_unlock(&jh->b_state_lock)` gets called *afterward*. So, the lock is released in the "good" scenario, when the buffer has no further transactions.

But hang on… What happens if `__jbd2_journal_refile_buffer` returns `false`? In this scenario, `drop_ref` is `false`. And... `spin_unlock(&jh->b_state_lock)` is *still* called! That `spin_unlock` is unconditional, right there at line 1064!

I need to confirm this. Let's head back to `fs/jbd2/commit.c` around line 1064 and make absolutely certain I'm not missing something in the control flow. It seems we are unconditionally calling `spin_unlock(&jh->b_state_lock)`.



89/2 2026/05/31 22:54 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1060 LineCount:20]

Results:
map[Contents:1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
1070:				__brelse(bh);
1071:			cond_resched_lock(&journal->j_list_lock);
1072:		}
1073:		spin_unlock(&journal->j_list_lock);
1074:		/*
1075:		 * This is a bit sleazy.  We use j_list_lock to protect transition
1076:		 * of a transaction into T_FINISHED state and calling
1077:		 * __jbd2_journal_drop_transaction(). Otherwise we could race with
1078:		 * other checkpointing code processing the transaction...
1079:		 */
]

90/2 2026/05/31 22:54 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 50586
							output: 38
							thoughts: 1212
						

Thoughts:
**Analyzing RCU Lock Nesting in jbd2 Commit Transaction**

Okay, so I'm looking at this code and I'm puzzled. I see `spin_unlock(&jh->b_state_lock)` is definitely called unconditionally.  Therefore, `jh->b_state_lock` *should* be unlocked. Yet, the lockdep trace shows an `rcu_read_lock` is still held.  That doesn't make sense.

Let's look at the trace: The trace says `rcu_read_lock` is held twice, plus the `journal->j_list_lock`, which is a spinlock. It looks like it's nested. The trace shows that both spinlocks acquire `rcu_read_lock`.

I see that lock #1 is the `journal->j_list_lock`.  Lock #2 is an `rcu_read_lock` acquired by `rt_spin_lock(&journal->j_list_lock)`.  And lock #0 is a *second* `rcu_read_lock` that is somehow also held. I think I see it. Could the lock #0 be the rcu from the first spinlock on j_list_lock at the start of the loop?

Let's trace the loop to confirm my suspicion. The code looks like this:

```c
	restart_loop:
		spin_lock(&journal->j_list_lock); // acquires j_list_lock and rcu_read_lock
		while (commit_transaction->t_forget) {
			jh = commit_transaction->t_forget;
			spin_unlock(&journal->j_list_lock); // releases j_list_lock and rcu_read_lock
			bh = jh2bh(jh);
			get_bh(bh);
			spin_lock(&jh->b_state_lock); // acquires b_state_lock and rcu_read_lock
			// ...
			spin_lock(&journal->j_list_lock); // acquires j_list_lock and rcu_read_lock
			// ...
			spin_unlock(&jh->b_state_lock); // releases b_state_lock and rcu_read_lock
			// ...
			cond_resched_lock(&journal->j_list_lock); // drops j_list_lock and rcu_read_lock, then re-acquires
		}
```

Okay, so `spin_unlock(&journal->j_list_lock)` at line 956 *should* release `j_list_lock` and *its* associated `rcu_read_lock`. Then, `spin_lock(&jh->b_state_lock)` acquires `b_state_lock` and *another* `rcu_read_lock`. Next, `spin_lock(&journal->j_list_lock)` *should* acquire `j_list_lock` and *another* `rcu_read_lock`. Finally, `spin_unlock(&jh->b_state_lock)` releases `b_state_lock` and its `rcu_read_lock`.  At this point, only `j_list_lock` and *its* `rcu_read_lock` *should* be held, so RCU nest depth *should* be 1.  But the trace says it's 2!

So, the mystery deepens. The only part left to check is the `cond_resched_lock` function. What if `cond_resched_lock` *doesn't* actually drop the `rcu_read_lock`? I need to check the implementation of that function to see. Let's see...



91/2 2026/05/31 22:55 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/sched/core.c Name:__cond_resched_lock]

Results:
map[SourceCode:7752:	/*
7753:	 * __cond_resched_lock() - if a reschedule is pending, drop the given lock,
7754:	 * call schedule, and on return reacquire the lock.
7755:	 *
7756:	 * This works OK both with and without CONFIG_PREEMPTION. We do strange low-level
7757:	 * operations here to prevent schedule() from being called twice (once via
7758:	 * spin_unlock(), once by hand).
7759:	 */
7760:	int __cond_resched_lock(spinlock_t *lock)
7761:	{
7762:		int resched = should_resched(PREEMPT_LOCK_OFFSET);
7763:		int ret = 0;
7764:	
7765:		lockdep_assert_held(lock);
7766:	
7767:		if (spin_needbreak(lock) || resched) {
7768:			spin_unlock(lock);
7769:			if (!_cond_resched())
7770:				cpu_relax();
7771:			ret = 1;
7772:			spin_lock(lock);
7773:		}
7774:		return ret;
7775:	}
 SourceFile:kernel/sched/core.c]

92/2 2026/05/31 22:55 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 53018
							output: 36
							thoughts: 63
						

Thoughts:
Here's my take on the thought process, as requested:

**Digging into the Rescheduling Lock**

Okay, hold on a second. I need to retrace my steps here. I was just looking at `cond_resched_lock` and something jumped out at me. I'm seeing that it calls `__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);` *before* it calls `__cond_resched_lock`. That's not quite what I expected. Usually, the "might reschedule" checks come *after* the potentially blocking operation, not before.

Right, time to go back to the source. I need to refresh my understanding of how this is supposed to work. Let's get that `include/linux/sched.h` file open again. I'm going to carefully re-examine the definitions and inline functions related to preemption, scheduling, and, crucially, how `cond_resched_lock` is implemented in that context. Need to make sure I haven't missed anything subtle. I know the PREEMPT_LOCK_RESCHED_OFFSETS are important, but now I'm thinking they're being used a bit differently than I initially assumed. This warrants a closer look at the interaction of these primitives.



93/2 2026/05/31 22:55 tool read-file
0m Args:
map[File:include/linux/sched.h FirstLine:2160 LineCount:20]

Results:
map[Contents:2160:	 * spin/rw_lock() on RT implies rcu_read_lock(). The might_sleep() check in
2161:	 * cond_resched*lock() has to take that into account because it checks for
2162:	 * preempt_count() and rcu_preempt_depth().
2163:	 */
2164:	# define PREEMPT_LOCK_RESCHED_OFFSETS	\
2165:		(PREEMPT_LOCK_OFFSET + (1U << MIGHT_RESCHED_RCU_SHIFT))
2166:	#endif
2167:	
2168:	#define cond_resched_lock(lock) ({						\
2169:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
2170:		__cond_resched_lock(lock);						\
2171:	})
2172:	
2173:	#define cond_resched_rwlock_read(lock) ({					\
2174:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
2175:		__cond_resched_rwlock_read(lock);					\
2176:	})
2177:	
2178:	#define cond_resched_rwlock_write(lock) ({					\
2179:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
]

94/2 2026/05/31 22:55 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 53799
							output: 36
							thoughts: 119
						

Thoughts:
**Analyzing the `__might_resched` Call and Context**

Okay, so I'm digging into this code and a key observation just hit me: `__might_resched` is actually called *before* `__cond_resched_lock`! That's crucial. This means that when `__might_resched` is triggered, the `journal->j_list_lock` is still held! That's unexpected, and potentially problematic if not handled correctly.

Now, remember that `__might_resched` is designed to determine if we're in a safe context to yield or sleep. The interesting part here is that we pass `PREEMPT_LOCK_RESCHED_OFFSETS` to `__might_resched`. This suggests we're dealing with preemption and locking offsets somehow. I need to be sure I understand this connection, so I should examine `__might_resched` itself in `kernel/sched/core.c`. Let's go check the code.



95/2 2026/05/31 22:55 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/sched/core.c Name:__might_resched]

Results:
map[SourceCode:9116:	void __might_resched(const char *file, int line, unsigned int offsets)
9117:	{
9118:		/* Ratelimiting timestamp: */
9119:		static unsigned long prev_jiffy;
9120:	
9121:		unsigned long preempt_disable_ip;
9122:	
9123:		/* WARN_ON_ONCE() by default, no rate limit required: */
9124:		rcu_sleep_check();
9125:	
9126:		if ((resched_offsets_ok(offsets) && !irqs_disabled() &&
9127:		     !is_idle_task(current) && !current->non_block_count) ||
9128:		    system_state == SYSTEM_BOOTING || system_state > SYSTEM_RUNNING ||
9129:		    oops_in_progress)
9130:			return;
9131:	
9132:		if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)
9133:			return;
9134:		prev_jiffy = jiffies;
9135:	
9136:		/* Save this before calling printk(), since that will clobber it: */
9137:		preempt_disable_ip = get_preempt_disable_ip(current);
9138:	
9139:		pr_err("BUG: sleeping function called from invalid context at %s:%d\n",
9140:		       file, line);
9141:		pr_err("in_atomic(): %d, irqs_disabled(): %d, non_block: %d, pid: %d, name: %s\n",
9142:		       in_atomic(), irqs_disabled(), current->non_block_count,
9143:		       current->pid, current->comm);
9144:		pr_err("preempt_count: %x, expected: %x\n", preempt_count(),
9145:		       offsets & MIGHT_RESCHED_PREEMPT_MASK);
9146:	
9147:		if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
9148:			pr_err("RCU nest depth: %d, expected: %u\n",
9149:			       rcu_preempt_depth(), offsets >> MIGHT_RESCHED_RCU_SHIFT);
9150:		}
9151:	
9152:		if (task_stack_end_corrupted(current))
9153:			pr_emerg("Thread overran stack, or stack corrupted\n");
9154:	
9155:		debug_show_held_locks(current);
9156:		if (irqs_disabled())
9157:			print_irqtrace_events(current);
9158:	
9159:		print_preempt_disable_ip(offsets & MIGHT_RESCHED_PREEMPT_MASK,
9160:					 preempt_disable_ip);
9161:	
9162:		dump_stack();
9163:		add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
9164:	}
 SourceFile:kernel/sched/core.c]

96/2 2026/05/31 22:55 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 55042
							output: 37
							thoughts: 37
						

Thoughts:
Okay, let's see what's going on here.

**Deconstructing the Rescheduling Logic**

Right, so `__might_resched`... that's the key. I need to understand when the scheduler might kick in. And I see it immediately relies on this `resched_offsets_ok(offsets)` call. Okay, excellent, let's dive into that function and figure out what the condition for rescheduling is based on those `offsets`. I need to figure out how these offsets are used in this rescheduling decision. What are they representing? Are they related to cache lines, memory pages, or something else entirely? Understanding the parameters going into the `resched_offsets_ok` function is the crucial first step. Once I have the context of those offsets, I can analyze their role in making the rescheduling decision.



97/2 2026/05/31 22:55 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/sched/core.c Name:resched_offsets_ok]

Results:
map[SourceCode:9107:	static inline bool resched_offsets_ok(unsigned int offsets)
9108:	{
9109:		unsigned int nested = preempt_count();
9110:	
9111:		nested += rcu_preempt_depth() << MIGHT_RESCHED_RCU_SHIFT;
9112:	
9113:		return nested == offsets;
9114:	}
 SourceFile:kernel/sched/core.c]

98/2 2026/05/31 22:55 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 55428
							output: 40
							thoughts: 1306
						

Thoughts:
**Debugging a Double RCU Read Lock in JBD2**

Okay, let's break this down. I'm looking at this nested value, which is derived from `preempt_count()` and `rcu_preempt_depth()`.  The `offsets` value is linked to the `PREEMPT_LOCK_RESCHED_OFFSETS` macro, which anticipates a scenario where `preempt_count()` is zero and `rcu_preempt_depth()` is one. The bug report is throwing a wrench in this, stating that the RCU nest depth is actually two, not one.

So, `rcu_preempt_depth()` is unexpectedly 2. That means `rcu_read_lock` has been acquired twice. Once for `journal->j_list_lock`, which makes sense. But what's the second acquisition? Let's check the lockdep trace. Okay, the trace lists three locks. Lock #1 is definitely `journal->j_list_lock` as expected. Lock #2 also appears to be an RCU read lock from `rt_spin_lock(&journal->j_list_lock)`.

Here's the rub, lock #0 in the trace appears to be another `rcu_read_lock`, also linked to `rt_spin_lock`. But... the associated spinlock itself isn't listed as being held! That's odd. Why would the RCU read lock be held if the spinlock it protects isn't?  It can't be because `rt_spin_unlock` was called without releasing the RCU lock, because it *does* call `rcu_read_unlock()`.

Could the spinlock have been freed while still held? No, that shouldn't happen, and if it did, the held lock list should reflect it. So, there is something I'm missing. Hmm, is it possible that `rcu_read_lock()` was called directly somehow, but lockdep is misinterpreting the IP as being called from `rt_spin_lock`? No, the IP in the trace is very specific: `rt_spin_lock+0x1e0/0x400`. So it *was* from `rt_spin_lock`.

If it's from `rt_spin_lock`, it means a spinlock *was* acquired, right? But it's not in the held lock list. Is it possible that the spinlock isn't tracked by lockdep? Perhaps because it's set with `lockdep_set_novalidate_class` or improperly initialized? But, even if lockdep isn't tracking the spinlock directly, the call to `rcu_read_lock()` within `rt_spin_lock` *should* still be tracked!  It's the `rcu_read_lock` that's the issue here.

Let's investigate: is the spinlock `jh->b_state_lock` tracked? Ah, `jh->b_state_lock` is initialized in `journal_init_journal_head`, so I should find it is.



99/2 2026/05/31 22:55 tool codesearch-definition-source
0m Error:
log-in to see details

Args:
map[ContextFile:fs/jbd2/journal.c Name:journal_init_journal_head]

Results:
map[SourceCode: SourceFile:]

100/2 2026/05/31 22:55 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 57466
							output: 19
							thoughts: 12
						

Thoughts:
Here's my thought process, summarized as you requested:

**Investigating a Potential Lock Contention Issue**

Alright, let's dive into this. The first thing that jumps out at me is the need to investigate instances of `b_state_lock`. Given my experience, I'm immediately thinking this indicates a likely mutex or critical section related to block device state. This could be a hot spot for contention, especially in high-I/O environments. My primary focus right now will be to identify where this lock is used, the code paths that acquire and release it, and any potential for prolonged holding of the lock or nested locking scenarios. I need to understand the *context* around this lock - what is it protecting? Which data structures? Are there any obvious areas for optimization, such as lock-free data structures or finer-grained locking? I'll probably start with a `grep` to quickly find all occurrences in the codebase. From there, I'll need to dig into the surrounding code to understand the flow. My goal is to quickly pinpoint any potential bottlenecks or race conditions that could be impacting performance or causing unexpected behavior. Let's get to it!



101/2 2026/05/31 22:55 tool grepper
0m Args:
map[Expression:b_state_lock]

Results:
map[Output:fs/jbd2/commit.c=377=void jbd2_journal_commit_transaction(journal_t *journal)
--
fs/jbd2/commit.c-517-
fs/jbd2/commit.c:518:			spin_lock(&jh->b_state_lock);
fs/jbd2/commit.c-519-			jbd2_free(jh->b_committed_data, bh->b_size);
fs/jbd2/commit.c-520-			jh->b_committed_data = NULL;
fs/jbd2/commit.c:521:			spin_unlock(&jh->b_state_lock);
fs/jbd2/commit.c-522-		}
--
fs/jbd2/commit.c-962-		get_bh(bh);
fs/jbd2/commit.c:963:		spin_lock(&jh->b_state_lock);
fs/jbd2/commit.c-964-		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
--
fs/jbd2/commit.c-1063-		drop_ref = __jbd2_journal_refile_buffer(jh);
fs/jbd2/commit.c:1064:		spin_unlock(&jh->b_state_lock);
fs/jbd2/commit.c-1065-		if (drop_ref)
--
fs/jbd2/journal.c=325=int jbd2_journal_write_metadata_buffer(transaction_t *transaction,
--
fs/jbd2/journal.c-352-
fs/jbd2/journal.c:353:	spin_lock(&jh_in->b_state_lock);
fs/jbd2/journal.c-354-	/*
--
fs/jbd2/journal.c-386-
fs/jbd2/journal.c:387:		spin_unlock(&jh_in->b_state_lock);
fs/jbd2/journal.c-388-		tmp = jbd2_alloc(bh_in->b_size, GFP_NOFS | __GFP_NOFAIL);
fs/jbd2/journal.c:389:		spin_lock(&jh_in->b_state_lock);
fs/jbd2/journal.c-390-		if (jh_in->b_frozen_data) {
--
fs/jbd2/journal.c-430-	set_buffer_shadow(bh_in);
fs/jbd2/journal.c:431:	spin_unlock(&jh_in->b_state_lock);
fs/jbd2/journal.c-432-
--
fs/jbd2/journal.c=2836=static struct journal_head *journal_alloc_journal_head(void)
--
fs/jbd2/journal.c-2849-	}
fs/jbd2/journal.c:2850:	spin_lock_init(&ret->b_state_lock);
fs/jbd2/journal.c-2851-	return ret;
--
fs/jbd2/transaction.c=948=do_get_write_access(handle_t *handle, struct journal_head *jh,
--
fs/jbd2/transaction.c-969-	lock_buffer(bh);
fs/jbd2/transaction.c:970:	spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-971-
--
fs/jbd2/transaction.c-1010-	if (is_handle_aborted(handle)) {
fs/jbd2/transaction.c:1011:		spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1012-		unlock_buffer(bh);
--
fs/jbd2/transaction.c-1040-		if (WARN_ON_ONCE(jh->b_next_transaction)) {
fs/jbd2/transaction.c:1041:			spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1042-			unlock_buffer(bh);
--
fs/jbd2/transaction.c-1079-		if (WARN_ON_ONCE(jh->b_next_transaction)) {
fs/jbd2/transaction.c:1080:			spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1081-			error = -EINVAL;
--
fs/jbd2/transaction.c-1094-		       jh->b_transaction, journal->j_committing_transaction);
fs/jbd2/transaction.c:1095:		spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1096-		error = -EINVAL;
--
fs/jbd2/transaction.c-1111-		JBUFFER_TRACE(jh, "on shadow: sleep");
fs/jbd2/transaction.c:1112:		spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1113-		wait_on_bit_io(&bh->b_state, BH_Shadow, TASK_UNINTERRUPTIBLE);
--
fs/jbd2/transaction.c-1132-			JBUFFER_TRACE(jh, "allocate memory for buffer");
fs/jbd2/transaction.c:1133:			spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1134-			frozen_buffer = jbd2_alloc(jh2bh(jh)->b_size,
--
fs/jbd2/transaction.c-1151-done:
fs/jbd2/transaction.c:1152:	spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1153-
--
fs/jbd2/transaction.c=1288=int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh)
--
fs/jbd2/transaction.c-1315-	 */
fs/jbd2/transaction.c:1316:	spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-1317-	if (!(jh->b_transaction == transaction || jh->b_transaction == NULL ||
--
fs/jbd2/transaction.c-1320-		err = -EROFS;
fs/jbd2/transaction.c:1321:		spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1322-		jbd2_journal_abort(journal, err);
--
fs/jbd2/transaction.c-1327-		err = -EINVAL;
fs/jbd2/transaction.c:1328:		spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1329-		jbd2_journal_abort(journal, err);
--
fs/jbd2/transaction.c-1358-	}
fs/jbd2/transaction.c:1359:	spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1360-
--
fs/jbd2/transaction.c=1401=int jbd2_journal_get_undo_access(handle_t *handle, struct buffer_head *bh)
--
fs/jbd2/transaction.c-1429-
fs/jbd2/transaction.c:1430:	spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-1431-	if (!jh->b_committed_data) {
--
fs/jbd2/transaction.c-1435-		if (!committed_data) {
fs/jbd2/transaction.c:1436:			spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1437-			goto repeat;
--
fs/jbd2/transaction.c-1443-	}
fs/jbd2/transaction.c:1444:	spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1445-out:
--
fs/jbd2/transaction.c=1517=int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh)
--
fs/jbd2/transaction.c-1542-	    jh->b_next_transaction != transaction)) {
fs/jbd2/transaction.c:1543:		spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-1544-		if (WARN_ON_ONCE(jh->b_transaction != transaction &&
--
fs/jbd2/transaction.c-1551-		}
fs/jbd2/transaction.c:1552:		spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1553-	}
--
fs/jbd2/transaction.c-1557-		    jh->b_jlist != BJ_Metadata)) {
fs/jbd2/transaction.c:1558:			spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-1559-			if (WARN_ON_ONCE(jh->b_transaction == transaction &&
--
fs/jbd2/transaction.c-1567-			}
fs/jbd2/transaction.c:1568:			spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1569-		}
--
fs/jbd2/transaction.c-1572-
fs/jbd2/transaction.c:1573:	spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-1574-
--
fs/jbd2/transaction.c-1576-		/*
fs/jbd2/transaction.c:1577:		 * Check journal aborting with @jh->b_state_lock locked,
fs/jbd2/transaction.c-1578-		 * since 'jh->b_transaction' could be replaced with
--
fs/jbd2/transaction.c-1673-out_unlock_bh:
fs/jbd2/transaction.c:1674:	spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1675-out:
--
fs/jbd2/transaction.c=1697=int jbd2_journal_forget(handle_t *handle, struct buffer_head *bh)
--
fs/jbd2/transaction.c-1719-
fs/jbd2/transaction.c:1720:	spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-1721-
--
fs/jbd2/transaction.c-1853-	__brelse(bh);
fs/jbd2/transaction.c:1854:	spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-1855-	if (abort_journal)
--
fs/jbd2/transaction.c=1883=int jbd2_journal_stop(handle_t *handle)
--
fs/jbd2/transaction.c-2033- *
fs/jbd2/transaction.c:2034: * jh->b_state_lock is held.
fs/jbd2/transaction.c-2035- */
--
fs/jbd2/transaction.c=2038=__blist_add_buffer(struct journal_head **list, struct journal_head *jh)
--
fs/jbd2/transaction.c-2057- *
fs/jbd2/transaction.c:2058: * jh->b_state_lock is held.
fs/jbd2/transaction.c-2059- */
--
fs/jbd2/transaction.c=2084=static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh)
--
fs/jbd2/transaction.c-2089-
fs/jbd2/transaction.c:2090:	lockdep_assert_held(&jh->b_state_lock);
fs/jbd2/transaction.c-2091-	transaction = jh->b_transaction;
--
fs/jbd2/transaction.c=2175=bool jbd2_journal_try_to_free_buffers(journal_t *journal, struct folio *folio)
--
fs/jbd2/transaction.c-2197-
fs/jbd2/transaction.c:2198:		spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-2199-		if (!jh->b_transaction && !jh->b_next_transaction) {
--
fs/jbd2/transaction.c-2205-		}
fs/jbd2/transaction.c:2206:		spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-2207-		jbd2_journal_put_journal_head(jh);
--
fs/jbd2/transaction.c-2226- *
fs/jbd2/transaction.c:2227: * Called under jh->b_state_lock.
fs/jbd2/transaction.c-2228- */
--
fs/jbd2/transaction.c=2300=static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh,
--
fs/jbd2/transaction.c-2320-	write_lock(&journal->j_state_lock);
fs/jbd2/transaction.c:2321:	spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-2322-	spin_lock(&journal->j_list_lock);
--
fs/jbd2/transaction.c-2402-			spin_unlock(&journal->j_list_lock);
fs/jbd2/transaction.c:2403:			spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-2404-			write_unlock(&journal->j_state_lock);
--
fs/jbd2/transaction.c-2422-		spin_unlock(&journal->j_list_lock);
fs/jbd2/transaction.c:2423:		spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-2424-		write_unlock(&journal->j_state_lock);
--
fs/jbd2/transaction.c-2449-	spin_unlock(&journal->j_list_lock);
fs/jbd2/transaction.c:2450:	spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-2451-	write_unlock(&journal->j_state_lock);
--
fs/jbd2/transaction.c=2531=void __jbd2_journal_file_buffer(struct journal_head *jh,
--
fs/jbd2/transaction.c-2537-
fs/jbd2/transaction.c:2538:	lockdep_assert_held(&jh->b_state_lock);
fs/jbd2/transaction.c-2539-	assert_spin_locked(&transaction->t_journal->j_list_lock);
--
fs/jbd2/transaction.c=2597=void jbd2_journal_file_buffer(struct journal_head *jh,
--
fs/jbd2/transaction.c-2599-{
fs/jbd2/transaction.c:2600:	spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-2601-	spin_lock(&transaction->t_journal->j_list_lock);
--
fs/jbd2/transaction.c-2603-	spin_unlock(&transaction->t_journal->j_list_lock);
fs/jbd2/transaction.c:2604:	spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-2605-}
--
fs/jbd2/transaction.c-2613- * Called under j_list_lock
fs/jbd2/transaction.c:2614: * Called under jh->b_state_lock
fs/jbd2/transaction.c-2615- *
--
fs/jbd2/transaction.c=2620=bool __jbd2_journal_refile_buffer(struct journal_head *jh)
--
fs/jbd2/transaction.c-2624-
fs/jbd2/transaction.c:2625:	lockdep_assert_held(&jh->b_state_lock);
fs/jbd2/transaction.c-2626-	if (jh->b_transaction)
--
fs/jbd2/transaction.c=2676=void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh)
--
fs/jbd2/transaction.c-2679-
fs/jbd2/transaction.c:2680:	spin_lock(&jh->b_state_lock);
fs/jbd2/transaction.c-2681-	spin_lock(&journal->j_list_lock);
fs/jbd2/transaction.c-2682-	drop = __jbd2_journal_refile_buffer(jh);
fs/jbd2/transaction.c:2683:	spin_unlock(&jh->b_state_lock);
fs/jbd2/transaction.c-2684-	spin_unlock(&journal->j_list_lock);
--
fs/ocfs2/suballoc.c=1349=static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh,
--
fs/ocfs2/suballoc.c-1362-
fs/ocfs2/suballoc.c:1363:	spin_lock(&jh->b_state_lock);
fs/ocfs2/suballoc.c-1364-	bg = (struct ocfs2_group_desc *) jh->b_committed_data;
--
fs/ocfs2/suballoc.c-1368-		ret = 1;
fs/ocfs2/suballoc.c:1369:	spin_unlock(&jh->b_state_lock);
fs/ocfs2/suballoc.c-1370-	jbd2_journal_put_journal_head(jh);
--
fs/ocfs2/suballoc.c=2581=static int ocfs2_block_group_clear_bits(handle_t *handle,
--
fs/ocfs2/suballoc.c-2615-	if (undo_fn) {
fs/ocfs2/suballoc.c:2616:		spin_lock(&jh->b_state_lock);
fs/ocfs2/suballoc.c-2617-		undo_bg = (struct ocfs2_group_desc *) jh->b_committed_data;
--
fs/ocfs2/suballoc.c-2631-		if (undo_fn)
fs/ocfs2/suballoc.c:2632:			spin_unlock(&jh->b_state_lock);
fs/ocfs2/suballoc.c-2633-		return ocfs2_error(alloc_inode->i_sb, "Group descriptor # %llu has bit count %u but claims %u are freed. num_bits %d\n",
--
fs/ocfs2/suballoc.c-2654-	if (undo_fn)
fs/ocfs2/suballoc.c:2655:		spin_unlock(&jh->b_state_lock);
fs/ocfs2/suballoc.c-2656-
--
include/linux/jbd2.h=532=struct transaction_chp_stats_s {
--
include/linux/jbd2.h-562- *    j_state_lock
include/linux/jbd2.h:563: *    ->b_state_lock
include/linux/jbd2.h-564- *
include/linux/jbd2.h:565: *    b_state_lock
include/linux/jbd2.h-566- *    ->j_list_lock
--
include/linux/journal-head.h=22=struct journal_head {
--
include/linux/journal-head.h-30-	 */
include/linux/journal-head.h:31:	spinlock_t b_state_lock;
include/linux/journal-head.h-32-
--
include/linux/journal-head.h-39-	/*
include/linux/journal-head.h:40:	 * Journalling list for this buffer [b_state_lock]
include/linux/journal-head.h-41-	 * NOTE: We *cannot* combine this with b_modified into a bitfield
--
include/linux/journal-head.h-50-	 * the currently running transaction
include/linux/journal-head.h:51:	 * [b_state_lock]
include/linux/journal-head.h-52-	 */
--
include/linux/journal-head.h-56-	 * Copy of the buffer data frozen for writing to the log.
include/linux/journal-head.h:57:	 * [b_state_lock]
include/linux/journal-head.h-58-	 */
--
include/linux/journal-head.h-63-	 * deallocation references, so that allocations can avoid overwriting
include/linux/journal-head.h:64:	 * uncommitted deletes. [b_state_lock]
include/linux/journal-head.h-65-	 */
--
include/linux/journal-head.h-72-	 * transaction's data or metadata journaling list.
include/linux/journal-head.h:73:	 * [j_list_lock] [b_state_lock]
include/linux/journal-head.h-74-	 * Either of these locks is enough for reading, both are needed for
--
include/linux/journal-head.h-82-	 * committing it when the new transaction touched it.
include/linux/journal-head.h:83:	 * [t_list_lock] [b_state_lock]
include/linux/journal-head.h-84-	 */
--
include/linux/journal-head.h-88-	 * Doubly-linked list of buffers on a transaction's data, metadata or
include/linux/journal-head.h:89:	 * forget queue. [t_list_lock] [b_state_lock]
include/linux/journal-head.h-90-	 */
]

102/2 2026/05/31 22:55 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 63608
							output: 36
							thoughts: 1712
						

Thoughts:
**Debugging a Persistent RCU Read Lock**

Okay, let's break this down. I'm seeing an RCU nest depth of 2, which is unexpected after what *should* be a release. `b_state_lock` is a standard spinlock; it's initialized with `spin_lock_init`, so Lockdep *should* be tracking it. If it's held, it *should* be in the held locks list. Since it's *not* in the held locks list, `spin_unlock(&jh->b_state_lock)` *must* have successfully released it. And a successful release *should* call `rcu_read_unlock()`. So, the `rcu_read_lock` associated with `b_state_lock` *should* be gone.

But it's not. I'm seeing a Lockdep trace with:

*   Lock #0: `rcu_read_lock`
*   Lock #1: `journal->j_list_lock`
*   Lock #2: `rcu_read_lock`

If `rcu_read_lock` from `rt_spin_lock` is present, it means the spinlock was released, BUT the RCU read lock was *not* released. That's bizarre. `rt_spin_unlock` *should* call `rcu_read_unlock()`. Did something skip that call? No, the code's right there. Is it possible the lock was removed from the list prematurely, before it was unlocked? No, Lockdep *removes* on the unlock.

Ah, wait. Is `rcu_read_lock` a *separate* lock class tracked by Lockdep? Yes, it is! When `rt_spin_lock` is called, it acquires the spinlock *and* calls `rcu_read_lock()`. When `rt_spin_unlock` is called, it calls `rcu_read_unlock()` and then releases the spinlock. Therefore, the presence of `rcu_read_lock` indicates it was *not* properly unlocked, or some sort of imbalance.

Okay, let's trace through the logic, starting with the journal locks. The Lockdep trace is still:

*   Lock #0: `rcu_read_lock`.
*   Lock #1: `journal->j_list_lock`.
*   Lock #2: `rcu_read_lock`.

Could Lock #0 be from `spin_lock(&journal->j_list_lock)` at line 948? Let's check:

*   **Line 948:** `spin_lock(&journal->j_list_lock);` Acquires `j_list_lock` and `rcu_read_lock`.
*   **Line 956:** `spin_unlock(&journal->j_list_lock);` Releases `j_list_lock` and `rcu_read_lock`.
*   **Line 963:** `spin_lock(&jh->b_state_lock);` Acquires `b_state_lock` and `rcu_read_lock`.
*   **Line 993:** `spin_lock(&journal->j_list_lock);` Acquires `j_list_lock` and `rcu_read_lock`.
*   **Line 1064:** `spin_unlock(&jh->b_state_lock);` Releases `b_state_lock` and `rcu_read_lock`.
*   **Line 1071:** `cond_resched_lock(&journal->j_list_lock);` which is just a check.

If `spin_unlock(&jh->b_state_lock)` at line 1064 releases *both* `b_state_lock` and `rcu_read_lock`, then the `rcu_read_lock` acquired at line 963 *should* be gone. Why is it still there? Is it possible that the unlock at 1064 didn't happen? It looks unconditional.

Aha! Let's check how `spin_unlock` is defined in PREEMPT_RT:

```c
static __always_inline void spin_unlock(spinlock_t *lock)
{
	rt_spin_unlock(lock);
}
```

And `rt_spin_unlock` *does* call `rcu_read_unlock()`. Where could the imbalance be? It looks like there's no way to call `rt_spin_unlock` without also calling `rcu_read_unlock()`. This warrants further, *deeper*, investigation.



103/2 2026/05/31 22:56 tool read-file
0m Args:
map[File:kernel/locking/spinlock_rt.c FirstLine:70 LineCount:30]

Results:
map[Contents:  70:					    struct lockdep_map *nest_lock)
  71:	{
  72:		spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_);
  73:		__rt_spin_lock(lock);
  74:	}
  75:	EXPORT_SYMBOL(rt_spin_lock_nest_lock);
  76:	#endif
  77:	
  78:	void __sched rt_spin_unlock(spinlock_t *lock) __releases(RCU)
  79:	{
  80:		spin_release(&lock->dep_map, _RET_IP_);
  81:		migrate_enable();
  82:		rcu_read_unlock();
  83:	
  84:		if (unlikely(!rt_mutex_cmpxchg_release(&lock->lock, current, NULL)))
  85:			rt_mutex_slowunlock(&lock->lock);
  86:	}
  87:	EXPORT_SYMBOL(rt_spin_unlock);
  88:	
  89:	/*
  90:	 * Wait for the lock to get unlocked: instead of polling for an unlock
  91:	 * (like raw spinlocks do), lock and unlock, to force the kernel to
  92:	 * schedule if there's contention:
  93:	 */
  94:	void __sched rt_spin_lock_unlock(spinlock_t *lock)
  95:	{
  96:		spin_lock(lock);
  97:		spin_unlock(lock);
  98:	}
  99:	EXPORT_SYMBOL(rt_spin_lock_unlock);
]

104/2 2026/05/31 22:56 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 66817
							output: 38
							thoughts: 577
						

Thoughts:
**Debugging a Potentially Unbalanced RCU Read Lock**

Okay, so I'm looking at this code and it's calling `rcu_read_unlock()` unconditionally. My immediate reaction is, "Hold on, what if something else had grabbed that `rcu_read_lock` first?" Gotta be careful here. Let's dig into this lockdep trace... aha, there it is:

```
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
```

Okay, so lock #0 was actually acquired by `rt_spin_lock`. That makes sense. If `rt_spin_lock` got it, that implies a spinlock acquisition is in play. But... the spinlock itself isn't showing up in the held locks list! That's a red flag.

My next thought is, "Okay, why isn't the spinlock showing as held?" Could be because `spin_release(&lock->dep_map, _RET_IP_);` got called, but `rcu_read_unlock()` wasn't. But, isn't `rt_spin_unlock` *supposed* to call `spin_release` AND *then* `rcu_read_unlock`? So, the sequence *should* be right.

Wait, what if `spin_release` is executed, but `rcu_read_unlock` *isn't*? How is that even possible? Could an interrupt have happened *between* those two calls? But... the trace is taken at `cond_resched_lock`, which comes *after* `rt_spin_unlock`.

Hmm, this is curious. Let's backtrack. Could `jh->b_state_lock` be some other type of lock? No, that's not the problem. We checked and it's definitely a `spinlock_t`.

Okay, what am I missing? What if `spin_unlock(&jh->b_state_lock)` *isn't* being called? Let's go back and carefully re-examine `fs/jbd2/commit.c` again. Something's not lining up here, and I need to find the imbalance. Let's dive back in!



105/2 2026/05/31 22:56 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1060 LineCount:20]

Results:
map[Contents:1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
1070:				__brelse(bh);
1071:			cond_resched_lock(&journal->j_list_lock);
1072:		}
1073:		spin_unlock(&journal->j_list_lock);
1074:		/*
1075:		 * This is a bit sleazy.  We use j_list_lock to protect transition
1076:		 * of a transaction into T_FINISHED state and calling
1077:		 * __jbd2_journal_drop_transaction(). Otherwise we could race with
1078:		 * other checkpointing code processing the transaction...
1079:		 */
]

106/2 2026/05/31 22:56 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 68448
							output: 44
							thoughts: 67
						

Thoughts:
Okay, let's break this down.

**Potential Spinlock Conflict in Journal Refiling**

Alright, so I see this line: `drop_ref = __jbd2_journal_refile_buffer(jh);`. My immediate concern is, could `__jbd2_journal_refile_buffer` be calling a `spin_lock` on some resource *other* than what I'm anticipating? This is the kind of situation that screams potential deadlock, especially in a journaling system where things are already inherently complex. I need to make sure this function is only touching what it's supposed to be touching, and that its interactions with the spinlocks are well-defined and don't introduce any unexpected dependencies or ordering issues. Let's dive back into `__jbd2_journal_refile_buffer` and trace its locking behavior more closely. Gotta ensure we're not inadvertently creating a contention scenario.



107/2 2026/05/31 22:56 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:__jbd2_journal_refile_buffer]

Results:
map[SourceCode:2607:	/*
2608:	 * Remove a buffer from its current buffer list in preparation for
2609:	 * dropping it from its current transaction entirely.  If the buffer has
2610:	 * already started to be used by a subsequent transaction, refile the
2611:	 * buffer on that transaction's metadata list.
2612:	 *
2613:	 * Called under j_list_lock
2614:	 * Called under jh->b_state_lock
2615:	 *
2616:	 * When this function returns true, there's no next transaction to refile to
2617:	 * and the caller has to drop jh reference through
2618:	 * jbd2_journal_put_journal_head().
2619:	 */
2620:	bool __jbd2_journal_refile_buffer(struct journal_head *jh)
2621:	{
2622:		int was_dirty, jlist;
2623:		struct buffer_head *bh = jh2bh(jh);
2624:	
2625:		lockdep_assert_held(&jh->b_state_lock);
2626:		if (jh->b_transaction)
2627:			assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock);
2628:	
2629:		/* If the buffer is now unused, just drop it. */
2630:		if (jh->b_next_transaction == NULL) {
2631:			__jbd2_journal_unfile_buffer(jh);
2632:			return true;
2633:		}
2634:	
2635:		/*
2636:		 * It has been modified by a later transaction: add it to the new
2637:		 * transaction's metadata list.
2638:		 */
2639:	
2640:		was_dirty = test_clear_buffer_jbddirty(bh);
2641:		__jbd2_journal_temp_unlink_buffer(jh);
2642:	
2643:		/*
2644:		 * b_transaction must be set, otherwise the new b_transaction won't
2645:		 * be holding jh reference
2646:		 */
2647:		J_ASSERT_JH(jh, jh->b_transaction != NULL);
2648:	
2649:		/*
2650:		 * We set b_transaction here because b_next_transaction will inherit
2651:		 * our jh reference and thus __jbd2_journal_file_buffer() must not
2652:		 * take a new one.
2653:		 */
2654:		WRITE_ONCE(jh->b_transaction, jh->b_next_transaction);
2655:		WRITE_ONCE(jh->b_next_transaction, NULL);
2656:		if (buffer_freed(bh))
2657:			jlist = BJ_Forget;
2658:		else if (jh->b_modified)
2659:			jlist = BJ_Metadata;
2660:		else
2661:			jlist = BJ_Reserved;
2662:		__jbd2_journal_file_buffer(jh, jh->b_transaction, jlist);
2663:		J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING);
2664:	
2665:		if (was_dirty)
2666:			set_buffer_jbddirty(bh);
2667:		return false;
2668:	}
 SourceFile:fs/jbd2/transaction.c]

108/2 2026/05/31 22:56 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 69739
							output: 43
							thoughts: 34
						

Thoughts:
Here's my thought process, summarized as you requested:

**Diving into the Journaling Code**

Okay, the execution trace just hit `__jbd2_journal_file_buffer`. Interesting. That function name immediately rings a bell; I know it's a critical part of the ext4 journaling process. I need to understand what's happening here. My next step is to drill down into the definition and calling context of `__jbd2_journal_file_buffer` to see precisely what data structures it's interacting with, and what operations it's performing at this point in the execution. This is where the real work of understanding the write path is.



109/2 2026/05/31 22:56 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:__jbd2_journal_file_buffer]

Results:
map[SourceCode:2528:	/*
2529:	 * File a buffer on the given transaction list.
2530:	 */
2531:	void __jbd2_journal_file_buffer(struct journal_head *jh,
2532:				transaction_t *transaction, int jlist)
2533:	{
2534:		struct journal_head **list = NULL;
2535:		int was_dirty = 0;
2536:		struct buffer_head *bh = jh2bh(jh);
2537:	
2538:		lockdep_assert_held(&jh->b_state_lock);
2539:		assert_spin_locked(&transaction->t_journal->j_list_lock);
2540:	
2541:		J_ASSERT_JH(jh, jh->b_jlist < BJ_Types);
2542:		J_ASSERT_JH(jh, jh->b_transaction == transaction ||
2543:					jh->b_transaction == NULL);
2544:	
2545:		if (jh->b_transaction && jh->b_jlist == jlist)
2546:			return;
2547:	
2548:		if (jlist == BJ_Metadata || jlist == BJ_Reserved ||
2549:		    jlist == BJ_Shadow || jlist == BJ_Forget) {
2550:			/*
2551:			 * For metadata buffers, we track dirty bit in buffer_jbddirty
2552:			 * instead of buffer_dirty. We should not see a dirty bit set
2553:			 * here because we clear it in do_get_write_access but e.g.
2554:			 * tune2fs can modify the sb and set the dirty bit at any time
2555:			 * so we try to gracefully handle that.
2556:			 */
2557:			if (buffer_dirty(bh))
2558:				warn_dirty_buffer(bh);
2559:			if (test_clear_buffer_dirty(bh) ||
2560:			    test_clear_buffer_jbddirty(bh))
2561:				was_dirty = 1;
2562:		}
2563:	
2564:		if (jh->b_transaction)
2565:			__jbd2_journal_temp_unlink_buffer(jh);
2566:		else
2567:			jbd2_journal_grab_journal_head(bh);
2568:		jh->b_transaction = transaction;
2569:	
2570:		switch (jlist) {
2571:		case BJ_None:
2572:			J_ASSERT_JH(jh, !jh->b_committed_data);
2573:			J_ASSERT_JH(jh, !jh->b_frozen_data);
2574:			return;
2575:		case BJ_Metadata:
2576:			transaction->t_nr_buffers++;
2577:			list = &transaction->t_buffers;
2578:			break;
2579:		case BJ_Forget:
2580:			list = &transaction->t_forget;
2581:			break;
2582:		case BJ_Shadow:
2583:			list = &transaction->t_shadow_list;
2584:			break;
2585:		case BJ_Reserved:
2586:			list = &transaction->t_reserved_list;
2587:			break;
2588:		}
2589:	
2590:		__blist_add_buffer(list, jh);
2591:		jh->b_jlist = jlist;
2592:	
2593:		if (was_dirty)
2594:			set_buffer_jbddirty(bh);
2595:	}
 SourceFile:fs/jbd2/transaction.c]

110/2 2026/05/31 22:56 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 71002
							output: 44
							thoughts: 38
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Analyzing Journal Head Acquisition in JBD2**

Okay, so I see a call to `jbd2_journal_grab_journal_head(bh)`. That's where things get interesting. I need to understand what's happening at this point in the journal transaction lifecycle. I'm going to quickly drill down into the `jbd2_journal_grab_journal_head` function. This is likely where the core locking and data structure manipulations for retrieving or creating a journal head block occur, depending on the current state. I need to refresh my understanding of how it interacts with the buffer head (`bh`) and how it ensures atomic access and consistency within the journal. Is it grabbing the existing head, or is there a case where it's responsible for creating a new one? And, more importantly, how does this function handle potential contention with other transactions trying to access or modify the same journal data structures? I need to analyze its implementation to understand the locking protocol it's using (spinlocks, semaphores, read/write locks, etc.) and how it interacts with the rest of the JBD2 internals. Time to dive into the code.



111/2 2026/05/31 22:56 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:jbd2_journal_grab_journal_head]

Results:
map[SourceCode:2941:	/*
2942:	 * Grab a ref against this buffer_head's journal_head.  If it ended up not
2943:	 * having a journal_head, return NULL
2944:	 */
2945:	struct journal_head *jbd2_journal_grab_journal_head(struct buffer_head *bh)
2946:	{
2947:		struct journal_head *jh = NULL;
2948:	
2949:		jbd_lock_bh_journal_head(bh);
2950:		if (buffer_jbd(bh)) {
2951:			jh = bh2jh(bh);
2952:			jh->b_jcount++;
2953:		}
2954:		jbd_unlock_bh_journal_head(bh);
2955:		return jh;
2956:	}
 SourceFile:fs/jbd2/journal.c]

112/2 2026/05/31 22:56 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 71610
							output: 38
							thoughts: 1051
						

Thoughts:
**Analyzing a Potential RCU Lock Issue in JBD2 Under PREEMPT_RT**

Okay, so I'm digging into this JBD2 issue, specifically looking at potential RCU problems under PREEMPT_RT. First, I traced the calls within `jbd_lock_bh_journal_head` and `jbd_unlock_bh_journal_head`, noting they use `bit_spin_lock` and `bit_spin_unlock` respectively. The critical point is that `bit_spin_unlock` calls `preempt_enable()`.

My initial thought was that `preempt_enable()` could trigger a reschedule, and I checked `preempt_count`, finding it was zero. I then examined the definition of `bit_spin_unlock` more closely:

```c
static inline void bit_spin_unlock(int bitnum, unsigned long *addr)
{
#ifdef CONFIG_DEBUG_SPINLOCK
	BUG_ON(!test_bit(bitnum, addr));
#endif
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
	clear_bit_unlock(bitnum, addr);
#endif
	preempt_enable();
	__release(__bitlock(bitnum, addr));
}
```

Yes, `preempt_enable()` is definitely called. But then it hit me: under PREEMPT_RT, `preempt_enable()` *doesn't* release `rcu_read_lock`. This means that `bit_spin_lock` and `bit_spin_unlock` should not directly affect the `rcu_read_lock` state, which is important to consider.

Now, let's revisit the bug report. I'm seeing an RCU nest depth of 2, but the expected value is 1. The lock report shows `rcu_read_lock` held twice and `journal->j_list_lock` held once.

I noticed that lock #1 is `journal->j_list_lock`.  Lock #2 looks like `rcu_read_lock` acquired by `rt_spin_lock(&journal->j_list_lock)`.  

This brings me to the critical question: could lock #0 be the `rcu_read_lock` associated with `spin_lock(&jh->b_state_lock)`? If so, why is it still held when `spin_unlock(&jh->b_state_lock)` should have been called? The answer, I suspect, is that `spin_unlock(&jh->b_state_lock)` was *not* called. Which leads to the question of why. So, I need to look at `fs/jbd2/commit.c` around line 1064 for clues.



113/2 2026/05/31 22:56 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1050 LineCount:30]

Results:
map[Contents:1050:				/*
1051:				 * The buffer on BJ_Forget list and not jbddirty means
1052:				 * it has been freed by this transaction and hence it
1053:				 * could not have been reallocated until this
1054:				 * transaction has committed. *BUT* it could be
1055:				 * reallocated once we have written all the data to
1056:				 * disk and before we process the buffer on BJ_Forget
1057:				 * list.
1058:				 */
1059:				if (!jh->b_next_transaction)
1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
1070:				__brelse(bh);
1071:			cond_resched_lock(&journal->j_list_lock);
1072:		}
1073:		spin_unlock(&journal->j_list_lock);
1074:		/*
1075:		 * This is a bit sleazy.  We use j_list_lock to protect transition
1076:		 * of a transaction into T_FINISHED state and calling
1077:		 * __jbd2_journal_drop_transaction(). Otherwise we could race with
1078:		 * other checkpointing code processing the transaction...
1079:		 */
]

114/2 2026/05/31 22:56 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 73796
							output: 36
							thoughts: 618
						

Thoughts:
**Debugging a Suspected Lock Imbalance**

Okay, so I'm looking at this trace and something's not adding up. I'm seeing a potential lock imbalance, and I'm trying to figure out *why*. First, I quickly checked if the `spin_unlock` for `jh->b_state_lock` was actually called - and yes, it is. But, I had to rule out the possibility that it was a macro that didn't do anything, but that wasn't the case. I confirmed the unlock function is calling `rt_spin_unlock` in `include/linux/spinlock_rt.h`.

Then, I started to question if `jh->b_state_lock` was even the culprit. Could lock #0, the one causing the problem, be something *else*? Maybe it's `journal->j_list_lock`, acquired at line 993? If that were the case, then I would expect the locks to be ordered like this: lock #1 being `j_list_lock`, and lock #2 being `rcu_read_lock`. So, what is the #0 lock? Then it clicked, could it be the `rcu_read_lock` acquired at line 948? But that doesn't seem right, because `spin_unlock(&journal->j_list_lock)` is called at line 956, which should release both `j_list_lock` and `rcu_read_lock`. That's where I need to focus.

Maybe `rt_spin_unlock` *doesn't* release the `rcu_read_lock`? No, that can't be, because `rt_spin_unlock` *should* call `rcu_read_unlock()`. So, I'm thinking maybe `rcu_read_lock` is acquired *elsewhere*? Let's check `jbd2_journal_commit_transaction` from the beginning. Is there an orphaned `rcu_read_lock` or `spin_lock` out there? No, lockdep would have flagged that.

Okay, if `rcu_read_lock` *is* held, but the spinlock *isn't*, that means `rcu_read_lock()` was called directly, but the trace says it was called from `__rt_spin_lock` at `kernel/locking/spinlock_rt.c:50`, which means a spinlock *was* acquired!

If the spinlock was acquired, why isn't it in the held locks list? Because it was released! But if it was released, `rt_spin_unlock` should have called `rcu_read_unlock()`. So, the problem is, why would `rt_spin_unlock` *not* call `rcu_read_unlock()`? That's what I need to investigate! I'll go back and look at `rt_spin_unlock` again...



115/2 2026/05/31 22:56 tool read-file
0m Args:
map[File:kernel/locking/spinlock_rt.c FirstLine:70 LineCount:30]

Results:
map[Contents:  70:					    struct lockdep_map *nest_lock)
  71:	{
  72:		spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_);
  73:		__rt_spin_lock(lock);
  74:	}
  75:	EXPORT_SYMBOL(rt_spin_lock_nest_lock);
  76:	#endif
  77:	
  78:	void __sched rt_spin_unlock(spinlock_t *lock) __releases(RCU)
  79:	{
  80:		spin_release(&lock->dep_map, _RET_IP_);
  81:		migrate_enable();
  82:		rcu_read_unlock();
  83:	
  84:		if (unlikely(!rt_mutex_cmpxchg_release(&lock->lock, current, NULL)))
  85:			rt_mutex_slowunlock(&lock->lock);
  86:	}
  87:	EXPORT_SYMBOL(rt_spin_unlock);
  88:	
  89:	/*
  90:	 * Wait for the lock to get unlocked: instead of polling for an unlock
  91:	 * (like raw spinlocks do), lock and unlock, to force the kernel to
  92:	 * schedule if there's contention:
  93:	 */
  94:	void __sched rt_spin_lock_unlock(spinlock_t *lock)
  95:	{
  96:		spin_lock(lock);
  97:		spin_unlock(lock);
  98:	}
  99:	EXPORT_SYMBOL(rt_spin_lock_unlock);
]

116/2 2026/05/31 22:56 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 75527
							output: 37
							thoughts: 1407
						

Thoughts:
**Debugging a Lockdep Issue**

Okay, so I'm chasing a lockdep issue, and my initial thought was around the interaction between `rt_spin_unlock` and `rcu_read_unlock()`. I had to confirm that `rcu_read_unlock()` indeed decrements the lockdep count, and it does, via `rcu_lock_release()`. I then considered the possibility of inlining, but quickly ruled out the likely scenarios regarding `rcu_read_lock` and  `__rt_spin_lock`. I eliminated the unconditional `spin_unlock` scenario, too.

I went back and closely examined the lockdep trace, particularly focusing on how `rcu_read_lock` is being acquired. The trace showed `rcu_read_lock` nested within `rt_spin_lock`, but I also saw `spin_lock` on `journal->j_list_lock` at line 993, which looked like lock #1 in the trace, and seemed to be the root of the issue. I hypothesized that it might be a double release but dismissed that with a check of the relevant lines.

Initially, I thought that `jh->b_state_lock` was released, but lock #0 persisted in the trace. So, I went through a long line of thinking including the variables, different contexts, and any conditional releases. That wasn't it.

I then considered what could be called from `rt_spin_unlock` and dismissed everything I was thinking. I realized `rcu_preempt_depth()` was 2, which means that the `rcu_read_lock()` was called twice. I then determined the first call to `rcu_read_lock()` was in `rt_spin_lock(&journal->j_list_lock)`. The second call was not so easy to figure out, and then thought about the function call chain and its interactions.

Now I am going to investigate `kjournald2` in `fs/jbd2/journal.c` to see if that leads me to any useful information.



117/2 2026/05/31 22:56 tool read-file
0m Args:
map[File:fs/jbd2/journal.c FirstLine:180 LineCount:50]

Results:
map[Contents: 180:		 * transaction commit and any fs involvement might get stuck waiting for
 181:		 * the trasn. commit.
 182:		 */
 183:		memalloc_nofs_save();
 184:	
 185:		/*
 186:		 * And now, wait forever for commit wakeup events.
 187:		 */
 188:		write_lock(&journal->j_state_lock);
 189:	
 190:	loop:
 191:		if (journal->j_flags & JBD2_UNMOUNT)
 192:			goto end_loop;
 193:	
 194:		jbd2_debug(1, "commit_sequence=%u, commit_request=%u\n",
 195:			journal->j_commit_sequence, journal->j_commit_request);
 196:	
 197:		if (journal->j_commit_sequence != journal->j_commit_request) {
 198:			jbd2_debug(1, "OK, requests differ\n");
 199:			write_unlock(&journal->j_state_lock);
 200:			timer_delete_sync(&journal->j_commit_timer);
 201:			jbd2_journal_commit_transaction(journal);
 202:			write_lock(&journal->j_state_lock);
 203:			goto loop;
 204:		}
 205:	
 206:		wake_up(&journal->j_wait_done_commit);
 207:		if (freezing(current)) {
 208:			/*
 209:			 * The simpler the better. Flushing journal isn't a
 210:			 * good idea, because that depends on threads that may
 211:			 * be already stopped.
 212:			 */
 213:			jbd2_debug(1, "Now suspending kjournald2\n");
 214:			write_unlock(&journal->j_state_lock);
 215:			try_to_freeze();
 216:			write_lock(&journal->j_state_lock);
 217:		} else {
 218:			/*
 219:			 * We assume on resume that commits are already there,
 220:			 * so we don't sleep
 221:			 */
 222:			DEFINE_WAIT(wait);
 223:	
 224:			prepare_to_wait(&journal->j_wait_commit, &wait,
 225:					TASK_INTERRUPTIBLE);
 226:			transaction = journal->j_running_transaction;
 227:			if (transaction == NULL ||
 228:			    time_before(jiffies, transaction->t_expires)) {
 229:				write_unlock(&journal->j_state_lock);
]

118/2 2026/05/31 22:56 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 78180
							output: 35
							thoughts: 87
						

Thoughts:
Okay, let me think this through.

**Investigating Potential RCU Locking in `jbd2`**

No, I'm pretty sure `kjournald2` itself doesn't directly call `rcu_read_lock()`. That seems unlikely, given my understanding of its role. Hmmm, but wait a minute… what about the **journal commit** process within `jbd2`? Could *that* be where an `rcu_read_lock()` might creep in? It's conceivable, especially if there's any need to read shared data structures during transaction finalization. Right, I should look into `jbd2_journal_commit_transaction`. That's where I need to focus my attention. Let's dig into the code for `jbd2_journal_commit_transaction` and hunt for any instances of `rcu_read_lock()` in there. Time to see if the hypothesis holds any water.



119/2 2026/05/31 22:58 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:rcu_read_lock PathPrefix:fs/jbd2/commit.c]

Results:
map[Output:]

120/2 2026/05/31 22:58 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 78518
							output: 22
							thoughts: 1055
						

Thoughts:
**Debugging a Lockdep Trace**

Okay, so I'm looking at this lockdep trace, specifically from `fs/jbd2/commit.c`, and I'm puzzled. There's no direct call to `rcu_read_lock` in this particular function. The trace shows `rcu_read_lock` being acquired, and the output indicates it's acquired through `rt_spin_lock`. If it's a spinlock acquisition, the system *should* be tracking that. But it's not.

My immediate thought is that the spinlock was released, but the associated `rcu_read_unlock` wasn't called. I double-checked `rt_spin_unlock` and it *unconditionally* calls `rcu_read_unlock()`. So, that can't be the issue, because `rt_spin_unlock` is releasing the `rcu_read_lock` appropriately.

Alright, what if `spin_unlock` was never called, but the lock was released some other way? No, `spin_unlock` is the *only* way to release a spinlock. Could `spin_unlock` be called on the *wrong* lock? No, the code explicitly calls `spin_unlock(&jh->b_state_lock)`. Is `jh->b_state_lock` perhaps not a spinlock, but something else? Nope, I verified it's defined as `spinlock_t`. What if it *wasn't* locked to begin with? If so, then `spin_unlock` would throw a "bad unlock balance" warning, and there's no such warning. Has `spin_unlock` been called *twice*? Nope, that's not the case either.

I'm starting to get a bit stuck here. I'm going back to the lockdep trace itself, looking at the hierarchy of locks. Lock #0 is `rcu_read_lock`, #1 is `journal->j_list_lock`, and #2 is another `rcu_read_lock`. Could it be that lock #0 is actually the `rcu_read_lock` acquired *inside* the `spin_lock` call on `journal->j_list_lock`? Let me trace. Line 948 calls `spin_lock(&journal->j_list_lock)`, which *should* acquire the RCU read lock. The corresponding `spin_unlock` at line 956 *should* release both the spinlock and the RCU lock. Then on line 993, `spin_lock(&journal->j_list_lock)` is called again. So, based on this understanding, lock #1 would be `journal->j_list_lock` and lock #2 would be a second `rcu_read_lock` acquired as part of the second `spin_lock`.

If that's the case, then what's lock #0? Could it be tied to `write_lock(&journal->j_state_lock)`? Let's not jump to conclusions. `write_lock` is an rwlock. In a PREEMPT_RT environment like this, a `write_lock` resolves to `rt_write_lock`. Does `rt_write_lock` involve an `rcu_read_lock` acquisition? I'll need to check the RT locking implementation, either `kernel/locking/rwlock-rt.c` or `kernel/locking/spinlock_rt.c`. That's where I need to look.



121/2 2026/05/31 22:58 tool grepper
0m Args:
map[Expression:void __sched rt_write_lock]

Results:
map[Output:kernel/locking/spinlock_rt.c=237=EXPORT_SYMBOL(rt_read_lock);
kernel/locking/spinlock_rt.c-238-
kernel/locking/spinlock_rt.c:239:void __sched rt_write_lock(rwlock_t *rwlock) __acquires(RCU)
kernel/locking/spinlock_rt.c-240-{
--
kernel/locking/spinlock_rt.c=247=EXPORT_SYMBOL(rt_write_lock);
--
kernel/locking/spinlock_rt.c-249-#ifdef CONFIG_DEBUG_LOCK_ALLOC
kernel/locking/spinlock_rt.c:250:void __sched rt_write_lock_nested(rwlock_t *rwlock, int subclass) __acquires(RCU)
kernel/locking/spinlock_rt.c-251-{
]

122/2 2026/05/31 22:58 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 80573
							output: 22
							thoughts: 189
						

Thoughts:
**Dissecting the Locking Sequence**

Okay, so I'm diving into this code, and my initial thought is, "Aha! `rt_write_lock` seems to be acquiring `RCU` as part of its operations." That's a key observation. But wait a second, on line 1080, I see `write_lock(&journal->j_state_lock)` being called. My mind immediately flashes back to line 1071 where `cond_resched_lock` is present. Crucially, that earlier call is outside the scope of that write lock - so the write lock is *not* held at 1071. This requires further scrutiny.

Now I'm questioning myself. Are there any *other* `write_lock` or `read_lock` calls in the vicinity that could influence this? I need to broaden my scope a bit, so I decide to check `jbd2_journal_commit_transaction`. Let's step back and look at the beginning of that function.

```c
	write_lock(&journal->j_state_lock);
	// ...
	write_unlock(&journal->j_state_lock);
```

My concern is what if that `write_unlock` *doesn't* release an `rcu_read_lock`? If that's the case, we could have a nasty interaction. I need to be absolutely certain of the release semantics in this code. The next thing I'm going to do is check the source for `rt_write_unlock` to verify how it behaves in regard to releasing any read locks.



123/2 2026/05/31 22:58 tool grepper
0m Args:
map[Expression:void __sched rt_write_unlock]

Results:
map[Output:kernel/locking/spinlock_rt.c=268=EXPORT_SYMBOL(rt_read_unlock);
kernel/locking/spinlock_rt.c-269-
kernel/locking/spinlock_rt.c:270:void __sched rt_write_unlock(rwlock_t *rwlock) __releases(RCU)
kernel/locking/spinlock_rt.c-271-{
]

124/2 2026/05/31 22:58 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 81239
							output: 36
							thoughts: 404
						

Thoughts:
**Debugging a Suspected RCU Issue**

Okay, so I'm looking at this lockdep trace, and the system is releasing RCU. But wait a minute… what if a `write_lock` wasn't actually unlocked? That would be a serious problem. If that was the case, it *should* be in the held locks list, right? But it's not. That's strange.

Hmm, maybe there's a different angle. Could lock #0 be an `rcu_read_lock` acquired through `rt_spin_lock`, but then the spinlock was released *without* a corresponding `rcu_read_unlock`? That seems like a likely scenario. Okay, I need to check the code. Is there a bug in `rt_spin_unlock` or `rt_write_unlock`? But no, those are standard kernel functions.

Wait a second! Let me look at the lockdep trace *again*. Ah, there it is...

```
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
```

Okay, line 50. I see that `__rt_spin_lock` is at `kernel/locking/spinlock_rt.c:50`. Now, I need to go look at `kernel/locking/spinlock_rt.c` to understand what that line is actually doing. Let's see...



125/2 2026/05/31 22:58 tool read-file
0m Args:
map[File:kernel/locking/spinlock_rt.c FirstLine:40 LineCount:20]

Results:
map[Contents:  40:		lockdep_assert(!current->pi_blocked_on);
  41:	
  42:		if (unlikely(!rt_mutex_cmpxchg_acquire(rtm, NULL, current)))
  43:			rtlock_slowlock(rtm);
  44:	}
  45:	
  46:	static __always_inline void __rt_spin_lock(spinlock_t *lock)
  47:	{
  48:		rtlock_might_resched();
  49:		rtlock_lock(&lock->lock);
  50:		rcu_read_lock();
  51:		migrate_disable();
  52:	}
  53:	
  54:	void __sched rt_spin_lock(spinlock_t *lock) __acquires(RCU)
  55:	{
  56:		spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
  57:		__rt_spin_lock(lock);
  58:	}
  59:	EXPORT_SYMBOL(rt_spin_lock);
]

126/2 2026/05/31 22:58 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 82466
							output: 36
							thoughts: 262
						

Thoughts:
**Debugging a Potentially Un-Tracked Spinlock**

Okay, so `rcu_read_lock()` is definitely at line 50. Right. And, going back a bit, I see that lock #0 was acquired by `__rt_spin_lock`. The interesting bit here is that if `__rt_spin_lock` got a lock and that lock isn't in the held locks list, that screams "untracked by lockdep!". That's a red flag. But *why* wouldn't a spinlock be tracked? If it was initialized with `spin_lock_init`, it *should* be tracked, right?

Hold on... could this be related to `jh->b_state_lock`? Is *that* spinlock tracked? Yes, I remember now, `spin_lock_init(&ret->b_state_lock);` does initialize it, meaning it should be under lockdep's scrutiny. Hmmm... what if that `jh->b_state_lock` got freed somehow? Maybe lockdep would remove it? But no, lockdep doesn't *automatically* remove freed locks from its held locks list... that doesn't make sense.

Okay, let's step back... could `spin_unlock` have been called, but `rcu_read_unlock` *not* be called? How could that even happen? Time to check out `rt_spin_unlock` to see what's going on...



127/2 2026/05/31 22:58 tool read-file
0m Args:
map[File:kernel/locking/spinlock_rt.c FirstLine:70 LineCount:20]

Results:
map[Contents:  70:					    struct lockdep_map *nest_lock)
  71:	{
  72:		spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_);
  73:		__rt_spin_lock(lock);
  74:	}
  75:	EXPORT_SYMBOL(rt_spin_lock_nest_lock);
  76:	#endif
  77:	
  78:	void __sched rt_spin_unlock(spinlock_t *lock) __releases(RCU)
  79:	{
  80:		spin_release(&lock->dep_map, _RET_IP_);
  81:		migrate_enable();
  82:		rcu_read_unlock();
  83:	
  84:		if (unlikely(!rt_mutex_cmpxchg_release(&lock->lock, current, NULL)))
  85:			rt_mutex_slowunlock(&lock->lock);
  86:	}
  87:	EXPORT_SYMBOL(rt_spin_unlock);
  88:	
  89:	/*
]

128/2 2026/05/31 22:58 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 83372
							output: 34
							thoughts: 85
						

Thoughts:
**Analyzing the Locking Order**

Okay, hold on a second. This sequence seems a little...unconventional. I'm seeing that `spin_release` gets called *before* `rcu_read_unlock`. That's not the order I typically expect. If `spin_release` is executed first, that means the spinlock is removed from the held locks list at that point. Then, `migrate_enable()` is called. Then, finally, `rcu_read_unlock()` happens. Hmm.

This is where things could potentially get tricky. The worry is, what if `migrate_enable()` blocks or, even worse, gets rescheduled? If that happens, we've essentially released the spinlock, potentially opened a window where something else could interfere, and *then* the RCU read-side critical section is ended after an indeterminate delay. I need to dig into `migrate_enable()` and understand its behavior better. Let's see what's going on in there. I need to make sure this isn't creating a subtle, hard-to-debug race condition.



129/2 2026/05/31 22:58 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/sched/core.c Name:migrate_enable]

Results:
map[SourceCode:2446:	void migrate_enable(void)
2447:	{
2448:		__migrate_enable();
2449:	}
 SourceFile:kernel/sched/core.c]

130/2 2026/05/31 22:58 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 83793
							output: 35
							thoughts: 10
						

Thoughts:
Okay, here's my attempt at summarizing that thought process, keeping in mind I'm speaking to a fellow expert:

**Internal Diagnostic: Migration Status**

Right, let's take a quick look at `__migrate_enable`. We're deep into this project, and I need to make absolutely sure the migration functionality is correctly engaged before we proceed with the next step. A cursory glance at `__migrate_enable` will quickly confirm whether we're in the appropriate state. No sense in troubleshooting a complex interaction down the line if the basics aren't set correctly. Let's see if this flag is set as expected, given the current environment. A simple check will save a lot of potential headaches later.



131/2 2026/05/31 22:58 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/sched/core.c Name:__migrate_enable]

Results:
map[SourceCode:2434:	static inline void __migrate_enable(void)
2435:	{
2436:		struct task_struct *p = current;
2437:	
2438:	#ifdef CONFIG_DEBUG_PREEMPT
2439:		/*
2440:		 * Check both overflow from migrate_disable() and superfluous
2441:		 * migrate_enable().
2442:		 */
2443:		if (WARN_ON_ONCE((s16)p->migration_disabled <= 0))
2444:			return;
2445:	#endif
2446:	
2447:		if (p->migration_disabled > 1) {
2448:			p->migration_disabled--;
2449:			return;
2450:		}
2451:	
2452:		/*
2453:		 * Ensure stop_task runs either before or after this, and that
2454:		 * __set_cpus_allowed_ptr(SCA_MIGRATE_ENABLE) doesn't schedule().
2455:		 */
2456:		guard(preempt)();
2457:		if (unlikely(p->cpus_ptr != &p->cpus_mask))
2458:			___migrate_enable();
2459:		/*
2460:		 * Mustn't clear migration_disabled() until cpus_ptr points back at the
2461:		 * regular cpus_mask, otherwise things that race (eg.
2462:		 * select_fallback_rq) get confused.
2463:		 */
2464:		barrier();
2465:		p->migration_disabled = 0;
2466:		this_rq_pinned()--;
2467:	}
 SourceFile:include/linux/sched.h]

132/2 2026/05/31 22:58 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 84485
							output: 37
							thoughts: 474
						

Thoughts:
**Debugging a Preemption Puzzle**

Okay, so I'm trying to wrap my head around this preemption issue. The `guard(preempt)()` call, as I understand it, disables preemption and then *re*enables it. That re-enable is the crucial bit because it *could* trigger a reschedule via `schedule()`. Now, `schedule()` ultimately leads to `__schedule()`. But hold on, the `migrate_enable()` function *itself* doesn't directly call `schedule()`; it calls `preempt_enable()` instead, which is the function that might lead to `__preempt_schedule()`.

The bug report says the `preempt_count` is zero. If that's the case, then `preempt_enable()` has already done its job. So, `migrate_enable()` is *already* finished. And if `migrate_enable()` is done, then we'd *expect* an `rcu_read_unlock()` to have been called. Unless...wait, could an interrupt have somehow prevented that? No, `rcu_read_unlock()` is just a function call, nothing fancy.

Alright, what about the unlocking of the RT spin lock? What if `rt_spin_unlock` *wasn't* called? This is where it gets interesting... what if `cond_resched_lock` is called, and calls `__might_resched` *before* it calls the actual `spin_unlock` function? Yes! It appears that `cond_resched_lock` *does* call `__might_resched` *before* the `__cond_resched_lock` function!

```c
#define cond_resched_lock(lock) ({						\
	__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
	__cond_resched_lock(lock);						\
})
```

This means that *at the time* `__might_resched` is called, `journal->j_list_lock` is *still* held! And, crucially, `jh->b_state_lock` was already unlocked. This means the RCU read lock for `jh->b_state_lock` should be gone. This should be impossible, given the RCU nest depth of 2.

Unless...what if `spin_lock(&journal->j_list_lock)` was called *twice*? I'm going to have to check `fs/jbd2/commit.c` around line 993 to see if there's a possibility for that.



133/2 2026/05/31 22:59 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:980 LineCount:20]

Results:
map[Contents: 980:				jbd2_free(jh->b_committed_data, bh->b_size);
 981:				jh->b_committed_data = NULL;
 982:				if (jh->b_frozen_data) {
 983:					jh->b_committed_data = jh->b_frozen_data;
 984:					jh->b_frozen_data = NULL;
 985:					jh->b_frozen_triggers = NULL;
 986:				}
 987:			} else if (jh->b_frozen_data) {
 988:				jbd2_free(jh->b_frozen_data, bh->b_size);
 989:				jh->b_frozen_data = NULL;
 990:				jh->b_frozen_triggers = NULL;
 991:			}
 992:	
 993:			spin_lock(&journal->j_list_lock);
 994:			cp_transaction = jh->b_cp_transaction;
 995:			if (cp_transaction) {
 996:				JBUFFER_TRACE(jh, "remove from old cp transaction");
 997:				cp_transaction->t_chp_stats.cs_dropped++;
 998:				__jbd2_journal_remove_checkpoint(jh);
 999:			}
]

134/2 2026/05/31 22:59 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 85924
							output: 38
							thoughts: 192
						

Thoughts:
**Analyzing a Potential Race Condition**

Okay, so I'm looking at this code and something is bothering me. Line 993 calls `spin_lock(&journal->j_list_lock)`. My initial thought is, could this lock be held already? That would be a huge problem. But, wait, no, line 956 explicitly unlocks the same spinlock with `spin_unlock(&journal->j_list_lock)`. So, that *should* be fine.

But hang on, what if that `spin_unlock` at 956 *didn't* actually happen for some reason? Let me quickly check... nope, it's unconditional, that's not the issue.

Okay, let's back up. Maybe I'm missing something more subtle. What if the lock is somehow being acquired *again* before 993, making it a recursive lock? No, again, it was unlocked at 956 so that seems impossible.

Alright, final thought: is `spin_lock(&journal->j_list_lock)` called again *within* the loop that starts at line 993? That's the most likely source of a subtle issue, if it happens. I need to closely examine the code from 993 to 1064 to see if that's happening. Time to dig in...



135/2 2026/05/31 22:59 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1000 LineCount:50]

Results:
map[Contents:1000:	
1001:			/* Only re-checkpoint the buffer_head if it is marked
1002:			 * dirty.  If the buffer was added to the BJ_Forget list
1003:			 * by jbd2_journal_forget, it may no longer be dirty and
1004:			 * there's no point in keeping a checkpoint record for
1005:			 * it. */
1006:	
1007:			/*
1008:			 * A buffer which has been freed while still being journaled
1009:			 * by a previous transaction, refile the buffer to BJ_Forget of
1010:			 * the running transaction. If the just committed transaction
1011:			 * contains "add to orphan" operation, we can completely
1012:			 * invalidate the buffer now. We are rather through in that
1013:			 * since the buffer may be still accessible when blocksize <
1014:			 * pagesize and it is attached to the last partial page.
1015:			 */
1016:			if (buffer_freed(bh) && !jh->b_next_transaction) {
1017:				struct address_space *mapping;
1018:	
1019:				clear_buffer_freed(bh);
1020:				clear_buffer_jbddirty(bh);
1021:	
1022:				/*
1023:				 * Block device buffers need to stay mapped all the
1024:				 * time, so it is enough to clear buffer_jbddirty and
1025:				 * buffer_freed bits. For the file mapping buffers (i.e.
1026:				 * journalled data) we need to unmap buffer and clear
1027:				 * more bits. We also need to be careful about the check
1028:				 * because the data page mapping can get cleared under
1029:				 * our hands. Note that if mapping == NULL, we don't
1030:				 * need to make buffer unmapped because the page is
1031:				 * already detached from the mapping and buffers cannot
1032:				 * get reused.
1033:				 */
1034:				mapping = READ_ONCE(bh->b_folio->mapping);
1035:				if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) {
1036:					clear_buffer_mapped(bh);
1037:					clear_buffer_new(bh);
1038:					clear_buffer_req(bh);
1039:					bh->b_bdev = NULL;
1040:				}
1041:			}
1042:	
1043:			if (buffer_jbddirty(bh)) {
1044:				JBUFFER_TRACE(jh, "add to new checkpointing trans");
1045:				__jbd2_journal_insert_checkpoint(jh, commit_transaction);
1046:				if (is_journal_aborted(journal))
1047:					clear_buffer_jbddirty(bh);
1048:			} else {
1049:				J_ASSERT_BH(bh, !buffer_dirty(bh));
]

136/2 2026/05/31 22:59 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 87280
							output: 44
							thoughts: 1220
						

Thoughts:
**Analyzing a Lockdep Trace: A Deep Dive**

Okay, so I'm looking at this lockdep trace and something isn't adding up. There's no other `spin_lock` or `spin_unlock` for the relevant block. Line 1071 in the code clearly shows `journal->j_list_lock` being held, but `jh->b_state_lock` is *not* held at that point. Yet, the RCU nest depth is 2. That's immediately suspicious.

Let's re-examine the lockdep trace: It's showing `rcu_read_lock` nested within `rt_spin_lock` - twice! Lock #1 is `journal->j_list_lock`, which makes sense in the context of the code. Lock #2, again, is an `rcu_read_lock`, which is called from within the `rt_spin_lock` function that is using the `journal->j_list_lock`. And lock #0 is also showing `rcu_read_lock`.

The problem is, if that `rcu_read_lock` is from `rt_spin_lock`, there's no corresponding spinlock, so the spinlock *shouldn't* be tracked by lockdep. Why is that? Could there be an untracked spinlock at play here? My mind immediately goes to `bit_spin_lock`, but that doesn't use `rt_spin_lock` - it calls `preempt_disable` directly, so that's a dead end. What about a direct call to `rcu_read_lock`? The trace specifically says `__rt_spin_lock`, so it *is* coming from there.

Okay, what if `rt_spin_lock` is being called on a lock that isn't tracked by lockdep? How is that even possible? If it's initialized with `spin_lock_init`, it *is* tracked. Raw spinlocks, initialized with `raw_spin_lock_init`, wouldn't call `rt_spin_lock` to begin with.

Wait, maybe `jh->b_state_lock` *was* tracked, but released, and the corresponding `rcu_read_unlock` wasn't called? But we know `rt_spin_unlock` always calls `rcu_read_unlock`. Okay, so what if `spin_unlock(&jh->b_state_lock)` wasn't called due to a `goto` or some conditional? Let me double-check the code in `fs/jbd2/commit.c` around line 1064. Nope, it's unconditional: `spin_unlock(&jh->b_state_lock);` is right there.

Could it be that `__jbd2_journal_refile_buffer` is calling `spin_unlock(&jh->b_state_lock)` internally, and *then* we call it again? But that would trigger a double unlock, which lockdep *would* catch. Okay, what about `__jbd2_journal_refile_buffer` calling `spin_lock(&jh->b_state_lock)` internally? Time to check the source for `__jbd2_journal_refile_buffer`. Let's see...



137/2 2026/05/31 23:00 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:__jbd2_journal_refile_buffer]

Results:
map[SourceCode:2607:	/*
2608:	 * Remove a buffer from its current buffer list in preparation for
2609:	 * dropping it from its current transaction entirely.  If the buffer has
2610:	 * already started to be used by a subsequent transaction, refile the
2611:	 * buffer on that transaction's metadata list.
2612:	 *
2613:	 * Called under j_list_lock
2614:	 * Called under jh->b_state_lock
2615:	 *
2616:	 * When this function returns true, there's no next transaction to refile to
2617:	 * and the caller has to drop jh reference through
2618:	 * jbd2_journal_put_journal_head().
2619:	 */
2620:	bool __jbd2_journal_refile_buffer(struct journal_head *jh)
2621:	{
2622:		int was_dirty, jlist;
2623:		struct buffer_head *bh = jh2bh(jh);
2624:	
2625:		lockdep_assert_held(&jh->b_state_lock);
2626:		if (jh->b_transaction)
2627:			assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock);
2628:	
2629:		/* If the buffer is now unused, just drop it. */
2630:		if (jh->b_next_transaction == NULL) {
2631:			__jbd2_journal_unfile_buffer(jh);
2632:			return true;
2633:		}
2634:	
2635:		/*
2636:		 * It has been modified by a later transaction: add it to the new
2637:		 * transaction's metadata list.
2638:		 */
2639:	
2640:		was_dirty = test_clear_buffer_jbddirty(bh);
2641:		__jbd2_journal_temp_unlink_buffer(jh);
2642:	
2643:		/*
2644:		 * b_transaction must be set, otherwise the new b_transaction won't
2645:		 * be holding jh reference
2646:		 */
2647:		J_ASSERT_JH(jh, jh->b_transaction != NULL);
2648:	
2649:		/*
2650:		 * We set b_transaction here because b_next_transaction will inherit
2651:		 * our jh reference and thus __jbd2_journal_file_buffer() must not
2652:		 * take a new one.
2653:		 */
2654:		WRITE_ONCE(jh->b_transaction, jh->b_next_transaction);
2655:		WRITE_ONCE(jh->b_next_transaction, NULL);
2656:		if (buffer_freed(bh))
2657:			jlist = BJ_Forget;
2658:		else if (jh->b_modified)
2659:			jlist = BJ_Metadata;
2660:		else
2661:			jlist = BJ_Reserved;
2662:		__jbd2_journal_file_buffer(jh, jh->b_transaction, jlist);
2663:		J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING);
2664:	
2665:		if (was_dirty)
2666:			set_buffer_jbddirty(bh);
2667:		return false;
2668:	}
 SourceFile:fs/jbd2/transaction.c]

138/2 2026/05/31 23:00 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 90244
							output: 35
							thoughts: 764
						

Thoughts:
**Debugging a Potential Lock Deprecation in jbd2**

Okay, so I'm digging into this lockdep trace and trying to figure out why we're seeing this issue. My initial thought was that there was some direct call to `spin_lock` or `spin_unlock` that I was missing. Nope, that's not it. Then I started poking around to see if any of the *functions* we *call* might be doing it. I checked `__jbd2_journal_file_buffer`, no dice. Then I tried `jbd2_journal_put_journal_head`, but that uses `jbd_lock_bh_journal_head`, which just wraps a `bit_spin_lock`.

Okay, back to the trace. I'm focusing on lock #0 here, the `rcu_read_lock`. It *looks* like it's the one we're interested in. Could this be the `spin_lock(&journal->j_list_lock)` on line 948? It seems likely, but we *should* be unlocking it on line 956 with `spin_unlock(&journal->j_list_lock)`. So, the question is, why is the `rcu_read_lock` not being released?

Could it be that `spin_unlock` *doesn't* release an `rcu_read_lock` if it was acquired by `spin_lock`? No, that can't be right; `rt_spin_unlock` should handle it. Unless... is `rt_spin_unlock` *not* being called? Or is `spin_unlock` somehow defined as `raw_spin_unlock` for `journal->j_list_lock`? No, no, `journal->j_list_lock` is a regular `spinlock_t`, not `raw_spinlock_t`.

Wait, what if the `rcu_read_lock` is *explicitly* called somewhere else? Maybe within `jbd2_journal_commit_transaction`? I grepped for `rcu_read_lock` in `fs/jbd2/commit.c`, but nothing.

Aha! Maybe the bug is *exactly* what the trace says. `cond_resched_lock` is being called with `journal->j_list_lock` held. And `cond_resched_lock` calls `__might_resched`, which checks `rcu_preempt_depth()`. It's returning 2. Why 2? Because `journal->j_list_lock` is held, which gives us depth 1. So there must be another lock. Could it be that `kjournald2` is calling `rcu_read_lock`? I need to check `kjournald2` again...



139/2 2026/05/31 23:00 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:rcu_read_lock PathPrefix:fs/jbd2/journal.c]

Results:
map[Output:]

140/2 2026/05/31 23:00 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 91666
							output: 35
							thoughts: 1735
						

Thoughts:
**Analyzing a Lockdep Trace: A Deep Dive**

Okay, so I'm looking at this lockdep trace and something isn't adding up. There's no `rcu_read_lock` in `fs/jbd2/journal.c` itself, which suggests it's being acquired somewhere else. Could it be a kthread? No, that's not it. Maybe it's being called from within a function *called* by `jbd2_journal_commit_transaction`? Time to check the call chain just before line 1071. Let's see... `jbd2_journal_wait_updates`, `jbd2_journal_refile_buffer`, `journal_submit_data_buffers`, `journal_wait_on_commit_record`, `jbd2_journal_write_revoke_records`, `jbd2_journal_write_commit_record`, and another `jbd2_journal_wait_updates`. Hmm, `jbd2_journal_commit_transaction` is a monster function.

Okay, back to the lockdep trace. It says lock #0 is `rcu_read_lock` acquired at `rt_spin_lock+0x1e0/0x400`. That's via `rt_spin_lock`. If `rt_spin_lock` acquired `rcu_read_lock`, there *has* to be a spinlock involved. But why isn't the spinlock listed as held? It must have been released! But if the spinlock was released, `rt_spin_unlock` should have also released `rcu_read_lock`. So why didn't it? Is there any circumstance where `rt_spin_unlock` *doesn't* release `rcu_read_lock`?

Let me look at `rt_spin_unlock` again... aha! `rcu_read_unlock()` is called *after* `migrate_enable()`. Could `migrate_enable()` somehow block or reschedule, and thus bypass the unlock? No, `__schedule()` doesn't produce the warning message. The warning comes from `__might_resched()`, which is called by `cond_resched_lock()`. So, `migrate_enable()` either didn't reschedule, or it did and then returned. Wait a second, what if `rcu_read_unlock()` never happened, due to an exception? No, that's not it.

Okay, back to the trace. I notice that lock #0 and lock #2 have the EXACT SAME lockdep map address `ffffffff8dfc80c0` for `rcu_read_lock`! But there's only one lockdep map for `rcu_read_lock`... But lockdep *tracks* each individual acquisition. If it's acquired twice, lockdep *should* show it twice! But, lockdep *usually* only shows the first acquisition of a recursive lock in the held locks list! Wait, is `rcu_read_lock` recursive? Let me go look.

Now, hold on. Lock #0 is `rcu_read_lock`, lock #1 is `journal->j_list_lock`, and lock #2 is also `rcu_read_lock`. So there are *two* `rcu_read_lock` entries? Since it's a read lock, it *can* be acquired recursively... However, lockdep *usually* only keeps one entry per lock class unless it's a *different instance*. But `rcu_read_lock` only has one instance. Wait, does lockdep track multiple entries for the same lock class if they are acquired in *different contexts*?

Ah, right! Lockdep tracks the *lock stack*. When `rt_spin_lock` is called, it acquires the spinlock *and then* the `rcu_read_lock`. So the stack must look like this:

0: `rcu_read_lock` (from some `rt_spin_lock`)
1: `journal->j_list_lock`
2: `rcu_read_lock` (from `rt_spin_lock(&journal->j_list_lock)`)

Okay, so lock #0 is `rcu_read_lock` which came from some spinlock. But where is the spinlock? If the spinlock was released, `rt_spin_unlock` would call `spin_release` to release the spinlock, *then* `rcu_read_unlock`. When `rcu_read_unlock` is called, lockdep removes the *last* acquired `rcu_read_lock` from the stack!

Aha! So, if the stack is


141/2 2026/05/31 23:00 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/locking/lockdep.c Name:lock_release]

Results:
map[SourceCode:5875:	void lock_release(struct lockdep_map *lock, unsigned long ip)
5876:	{
5877:		unsigned long flags;
5878:	
5879:		trace_lock_release(lock, ip);
5880:	
5881:		if (unlikely(!lockdep_enabled() ||
5882:			     lock->key == &__lockdep_no_track__))
5883:			return;
5884:	
5885:		raw_local_irq_save(flags);
5886:		check_flags(flags);
5887:	
5888:		lockdep_recursion_inc();
5889:		if (__lock_release(lock, ip))
5890:			check_chain_key(current);
5891:		lockdep_recursion_finish();
5892:		raw_local_irq_restore(flags);
5893:	}
 SourceFile:kernel/locking/lockdep.c]

142/2 2026/05/31 23:00 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 94744
							output: 36
							thoughts: 10
						

Thoughts:
Okay, here's my attempt at summarizing that thought process, keeping in mind I'm speaking to a fellow expert:

**Investigating a Critical Release**

Right, let's dive into this. The mental thread I'm on leads directly to `__lock_release`. That specific function call is a key point; it's the release mechanism itself. I need to understand its behavior in this current context. What are its arguments? What specific locks are we releasing here? Is this a shared or exclusive release? More importantly, what's the broader surrounding code - the sequence of calls that lead up to this crucial point? Are there any obvious candidates for contention or misuse that would be apparent at this juncture? I have to analyze the immediate code surrounding this release to determine if there's an opportunity for improvement or an obvious problem to be addressed.



143/2 2026/05/31 23:01 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/locking/lockdep.c Name:__lock_release]

Results:
map[SourceCode:5505:	/*
5506:	 * Remove the lock from the list of currently held locks - this gets
5507:	 * called on mutex_unlock()/spin_unlock*() (or on a failed
5508:	 * mutex_lock_interruptible()).
5509:	 */
5510:	static int
5511:	__lock_release(struct lockdep_map *lock, unsigned long ip)
5512:	{
5513:		struct task_struct *curr = current;
5514:		unsigned int depth, merged = 1;
5515:		struct held_lock *hlock;
5516:		int i;
5517:	
5518:		if (unlikely(!debug_locks))
5519:			return 0;
5520:	
5521:		depth = curr->lockdep_depth;
5522:		/*
5523:		 * So we're all set to release this lock.. wait what lock? We don't
5524:		 * own any locks, you've been drinking again?
5525:		 */
5526:		if (depth <= 0) {
5527:			print_unlock_imbalance_bug(curr, lock, ip);
5528:			return 0;
5529:		}
5530:	
5531:		/*
5532:		 * Check whether the lock exists in the current stack
5533:		 * of held locks:
5534:		 */
5535:		hlock = find_held_lock(curr, lock, depth, &i);
5536:		if (!hlock) {
5537:			print_unlock_imbalance_bug(curr, lock, ip);
5538:			return 0;
5539:		}
5540:	
5541:		if (hlock->instance == lock)
5542:			lock_release_holdtime(hlock);
5543:	
5544:		WARN(hlock->pin_count, "releasing a pinned lock\n");
5545:	
5546:		if (hlock->references) {
5547:			hlock->references--;
5548:			if (hlock->references) {
5549:				/*
5550:				 * We had, and after removing one, still have
5551:				 * references, the current lock stack is still
5552:				 * valid. We're done!
5553:				 */
5554:				return 1;
5555:			}
5556:		}
5557:	
5558:		/*
5559:		 * We have the right lock to unlock, 'hlock' points to it.
5560:		 * Now we remove it from the stack, and add back the other
5561:		 * entries (if any), recalculating the hash along the way:
5562:		 */
5563:	
5564:		curr->lockdep_depth = i;
5565:		curr->curr_chain_key = hlock->prev_chain_key;
5566:	
5567:		/*
5568:		 * The most likely case is when the unlock is on the innermost
5569:		 * lock. In this case, we are done!
5570:		 */
5571:		if (i == depth-1)
5572:			return 1;
5573:	
5574:		if (reacquire_held_locks(curr, depth, i + 1, &merged))
5575:			return 0;
5576:	
5577:		/*
5578:		 * We had N bottles of beer on the wall, we drank one, but now
5579:		 * there's not N-1 bottles of beer left on the wall...
5580:		 * Pouring two of the bottles together is acceptable.
5581:		 */
5582:		DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged);
5583:	
5584:		/*
5585:		 * Since reacquire_held_locks() would have called check_chain_key()
5586:		 * indirectly via __lock_acquire(), we don't need to do it again
5587:		 * on return.
5588:		 */
5589:		return 0;
5590:	}
 SourceFile:kernel/locking/lockdep.c]

144/2 2026/05/31 23:01 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 96177
							output: 37
							thoughts: 11
						

Thoughts:
Okay, here's my attempt at summarizing that thought process, keeping in mind I'm speaking to a fellow expert:

**Investigating `find_held_lock`**

Alright, time to dive in. My mind immediately goes to `find_held_lock`. That's where I need to start. It's the critical piece here, the gateway to understanding what's going on. This function is the lynchpin, the starting point. Let's see what's what. I'm going to carefully dissect its implementation, step by step, to uncover the current state.



145/2 2026/05/31 23:01 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/locking/lockdep.c Name:find_held_lock]

Results:
map[SourceCode:5339:	/* @depth must not be zero */
5340:	static struct held_lock *find_held_lock(struct task_struct *curr,
5341:						struct lockdep_map *lock,
5342:						unsigned int depth, int *idx)
5343:	{
5344:		struct held_lock *ret, *hlock, *prev_hlock;
5345:		int i;
5346:	
5347:		i = depth - 1;
5348:		hlock = curr->held_locks + i;
5349:		ret = hlock;
5350:		if (match_held_lock(hlock, lock))
5351:			goto out;
5352:	
5353:		ret = NULL;
5354:		for (i--, prev_hlock = hlock--;
5355:		     i >= 0;
5356:		     i--, prev_hlock = hlock--) {
5357:			/*
5358:			 * We must not cross into another context:
5359:			 */
5360:			if (prev_hlock->irq_context != hlock->irq_context) {
5361:				ret = NULL;
5362:				break;
5363:			}
5364:			if (match_held_lock(hlock, lock)) {
5365:				ret = hlock;
5366:				break;
5367:			}
5368:		}
5369:	
5370:	out:
5371:		*idx = i;
5372:		return ret;
5373:	}
 SourceFile:kernel/locking/lockdep.c]

146/2 2026/05/31 23:01 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 96837
							output: 36
							thoughts: 1847
						

Thoughts:
**Analyzing the Lockdep Trace**

Okay, so here's how I'm breaking down this lockdep trace... First, I need to get the behavior of `find_held_lock` in context. I see that it searches from the *innermost* lock – highest index – outwards. This means, with multiple `rcu_read_lock`s, it will find the innermost one. Let's trace it, starting with a hypothetical scenario:

Imagine the stack holds:
0: `rcu_read_lock` (from A)
1: `spinlock_B`
2: `rcu_read_lock` (from B)

Now, we call `spin_unlock(A)`.  `rt_spin_unlock(A)` calls `spin_release(A)`. If `spinlock_A` wasn't on the stack, `spin_release(A)` would complain about an "unlock imbalance bug"! But, there isn't one.  So `spinlock_A` *was* on the stack, or it was not tracked. If it's *not* tracked, `spin_release(A)` does nothing. Then, `rcu_read_unlock()` is called, which calls `lock_release(&rcu_read_lock_map)`.  `find_held_lock` kicks in, finding the innermost `rcu_read_lock` at index 2 (from B), and removes it. The stack then looks like:

0: `rcu_read_lock` (from A)
1: `spinlock_B`

Then, if `cond_resched_lock` is called, the lockdep list will be:

0: `rcu_read_lock` (from A)
1: `spinlock_B`

And *that* matches the trace!

Now, back to the problem: the stack can be:
0: `rcu_read_lock` (from A)
1: `spinlock_B`

But wait, why is there a lock #2 in the trace? If it is lock #2, it was NOT removed!
If there were three locks, `rcu_read_unlock()` was *not* called, or was it called, but originally there were four locks?

So, let's trace the locks in `jbd2_journal_commit_transaction`.
At 948: `spin_lock(&journal->j_list_lock)`
- acquires `j_list_lock`
- acquires `rcu_read_lock` (from `j_list_lock`)
At 956: `spin_unlock(&journal->j_list_lock)`
- releases `j_list_lock`
- releases `rcu_read_lock` (from `j_list_lock`)
At 963: `spin_lock(&jh->b_state_lock)`
- acquires `b_state_lock`
- acquires `rcu_read_lock` (from `b_state_lock`)
At 993: `spin_lock(&journal->j_list_lock)`
- acquires `j_list_lock`
- acquires `rcu_read_lock` (from `j_list_lock`)
At 1064: `spin_unlock(&jh->b_state_lock)`
- releases `b_state_lock`
- releases `rcu_read_lock` (from `b_state_lock`)

When `spin_unlock(&jh->b_state_lock)` is called at 1064, the stack would be:
0: `b_state_lock`
1: `rcu_read_lock` (from `b_state_lock`)
2: `j_list_lock`
3: `rcu_read_lock` (from `j_list_lock`)

`rt_spin_unlock(&jh->b_state_lock)` calls:
`spin_release(&jh->b_state_lock)` -> removes `b_state_lock` (index 0).
Stack becomes:
0: `rcu_read_lock` (from `b_state_lock`)
1: `j_list_lock`
2: `rcu_read_lock` (from `j_list_lock`)

Then `rcu_read_unlock()` is called.
It searches for `rcu_read_lock` from the innermost lock.
It finds `rcu_read_lock` at index 2 (from `j_list_lock`)!
So it removes `rcu_read_lock` at index 2!


147/2 2026/05/31 23:02 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/locking/lockdep.c Name:__lock_acquire]

Results:
map[SourceCode:5069:	/*
5070:	 * This gets called for every mutex_lock*()/spin_lock*() operation.
5071:	 * We maintain the dependency maps and validate the locking attempt:
5072:	 *
5073:	 * The callers must make sure that IRQs are disabled before calling it,
5074:	 * otherwise we could get an interrupt which would want to take locks,
5075:	 * which would end up in lockdep again.
5076:	 */
5077:	static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
5078:				  int trylock, int read, int check, int hardirqs_off,
5079:				  struct lockdep_map *nest_lock, unsigned long ip,
5080:				  int references, int pin_count, int sync)
5081:	{
5082:		struct task_struct *curr = current;
5083:		struct lock_class *class = NULL;
5084:		struct held_lock *hlock;
5085:		unsigned int depth;
5086:		int chain_head = 0;
5087:		int class_idx;
5088:		u64 chain_key;
5089:	
5090:		if (unlikely(!debug_locks))
5091:			return 0;
5092:	
5093:		if (unlikely(lock->key == &__lockdep_no_track__))
5094:			return 0;
5095:	
5096:		lockevent_inc(lockdep_acquire);
5097:	
5098:		if (!prove_locking || lock->key == &__lockdep_no_validate__) {
5099:			check = 0;
5100:			lockevent_inc(lockdep_nocheck);
5101:		}
5102:	
5103:		if (DEBUG_LOCKS_WARN_ON(subclass >= MAX_LOCKDEP_SUBCLASSES))
5104:			return 0;
5105:	
5106:		if (subclass < NR_LOCKDEP_CACHING_CLASSES)
5107:			class = lock->class_cache[subclass];
5108:		/*
5109:		 * Not cached?
5110:		 */
5111:		if (unlikely(!class)) {
5112:			class = register_lock_class(lock, subclass, 0);
5113:			if (!class)
5114:				return 0;
5115:		}
5116:	
5117:		debug_class_ops_inc(class);
5118:	
5119:		if (very_verbose(class)) {
5120:			nbcon_cpu_emergency_enter();
5121:			printk("\nacquire class [%px] %s", class->key, class->name);
5122:			if (class->name_version > 1)
5123:				printk(KERN_CONT "#%d", class->name_version);
5124:			printk(KERN_CONT "\n");
5125:			dump_stack();
5126:			nbcon_cpu_emergency_exit();
5127:		}
5128:	
5129:		/*
5130:		 * Add the lock to the list of currently held locks.
5131:		 * (we dont increase the depth just yet, up until the
5132:		 * dependency checks are done)
5133:		 */
5134:		depth = curr->lockdep_depth;
5135:		/*
5136:		 * Ran out of static storage for our per-task lock stack again have we?
5137:		 */
5138:		if (DEBUG_LOCKS_WARN_ON(depth >= MAX_LOCK_DEPTH))
5139:			return 0;
5140:	
5141:		class_idx = class - lock_classes;
5142:	
5143:		if (depth && !sync) {
5144:			/* we're holding locks and the new held lock is not a sync */
5145:			hlock = curr->held_locks + depth - 1;
5146:			if (hlock->class_idx == class_idx && nest_lock) {
5147:				if (!references)
5148:					references++;
5149:	
5150:				if (!hlock->references)
5151:					hlock->references++;
5152:	
5153:				hlock->references += references;
5154:	
5155:				/* Overflow */
5156:				if (DEBUG_LOCKS_WARN_ON(hlock->references < references))
5157:					return 0;
5158:	
5159:				return 2;
5160:			}
5161:		}
5162:	
5163:		hlock = curr->held_locks + depth;
5164:		/*
5165:		 * Plain impossible, we just registered it and checked it weren't no
5166:		 * NULL like.. I bet this mushroom I ate was good!
5167:		 */
5168:		if (DEBUG_LOCKS_WARN_ON(!class))
5169:			return 0;
5170:		hlock->class_idx = class_idx;
5171:		hlock->acquire_ip = ip;
5172:		hlock->instance = lock;
5173:		hlock->nest_lock = nest_lock;
5174:		hlock->irq_context = task_irq_context(curr);
5175:		hlock->trylock = trylock;
5176:		hlock->read = read;
5177:		hlock->check = check;
5178:		hlock->sync = !!sync;
5179:		hlock->hardirqs_off = !!hardirqs_off;
5180:		hlock->references = references;
5181:	#ifdef CONFIG_LOCK_STAT
5182:		hlock->waittime_stamp = 0;
5183:		hlock->holdtime_stamp = lockstat_clock();
5184:	#endif
5185:		hlock->pin_count = pin_count;
5186:	
5187:		if (check_wait_context(curr, hlock))
5188:			return 0;
5189:	
5190:		/* Initialize the lock usage bit */
5191:		if (!mark_usage(curr, hlock, check))
5192:			return 0;
5193:	
5194:		/*
5195:		 * Calculate the chain hash: it's the combined hash of all the
5196:		 * lock keys along the dependency chain. We save the hash value
5197:		 * at every step so that we can get the current hash easily
5198:		 * after unlock. The chain hash is then used to cache dependency
5199:		 * results.
5200:		 *
5201:		 * The 'key ID' is what is the most compact key value to drive
5202:		 * the hash, not class->key.
5203:		 */
5204:		/*
5205:		 * Whoops, we did it again.. class_idx is invalid.
5206:		 */
5207:		if (DEBUG_LOCKS_WARN_ON(!test_bit(class_idx, lock_classes_in_use)))
5208:			return 0;
5209:	
5210:		chain_key = curr->curr_chain_key;
5211:		if (!depth) {
5212:			/*
5213:			 * How can we have a chain hash when we ain't got no keys?!
5214:			 */
5215:			if (DEBUG_LOCKS_WARN_ON(chain_key != INITIAL_CHAIN_KEY))
5216:				return 0;
5217:			chain_head = 1;
5218:		}
5219:	
5220:		hlock->prev_chain_key = chain_key;
5221:		if (separate_irq_context(curr, hlock)) {
5222:			chain_key = INITIAL_CHAIN_KEY;
5223:			chain_head = 1;
5224:		}
5225:		chain_key = iterate_chain_key(chain_key, hlock_id(hlock));
5226:	
5227:		if (nest_lock && !__lock_is_held(nest_lock, -1)) {
5228:			print_lock_nested_lock_not_held(curr, hlock);
5229:			return 0;
5230:		}
5231:	
5232:		if (!debug_locks_silent) {
5233:			WARN_ON_ONCE(depth && !hlock_class(hlock - 1)->key);
5234:			WARN_ON_ONCE(!hlock_class(hlock)->key);
5235:		}
5236:	
5237:		if (!validate_chain(curr, hlock, chain_head, chain_key))
5238:			return 0;
5239:	
5240:		/* For lock_sync(), we are done here since no actual critical section */
5241:		if (hlock->sync)
5242:			return 1;
5243:	
5244:		curr->curr_chain_key = chain_key;
5245:		curr->lockdep_depth++;
5246:		check_chain_key(curr);
5247:	#ifdef CONFIG_DEBUG_LOCKDEP
5248:		if (unlikely(!debug_locks))
5249:			return 0;
5250:	#endif
5251:		if (unlikely(curr->lockdep_depth >= MAX_LOCK_DEPTH)) {
5252:			debug_locks_off();
5253:			nbcon_cpu_emergency_enter();
5254:			print_lockdep_off("BUG: MAX_LOCK_DEPTH too low!");
5255:			printk(KERN_DEBUG "depth: %i  max: %lu!\n",
5256:			       curr->lockdep_depth, MAX_LOCK_DEPTH);
5257:	
5258:			lockdep_print_held_locks(current);
5259:			debug_show_all_locks();
5260:			dump_stack();
5261:			nbcon_cpu_emergency_exit();
5262:	
5263:			return 0;
5264:		}
5265:	
5266:		if (unlikely(curr->lockdep_depth > max_lockdep_depth))
5267:			max_lockdep_depth = curr->lockdep_depth;
5268:	
5269:		return 1;
5270:	}
 SourceFile:kernel/locking/lockdep.c]

148/2 2026/05/31 23:02 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 102727
							output: 38
							thoughts: 4293
						

Thoughts:
**Analyzing a Lockdep Issue in JBD2**

Okay, let's break this down. It appears I'm encountering a lockdep issue within the JBD2 filesystem code, and I'm trying to trace the root cause. My primary thought is that something's not quite right with the interaction between `rcu_read_lock`, `spin_lock`, and `spin_unlock`.

Initially, I considered the scenario where `rcu_read_lock` entries might not be correctly tracked unless a `nest_lock` is provided. However, `rcu_read_lock` doesn't utilize `nest_lock`, leading me to believe that *every* call to `rcu_read_lock()` adds a new entry to the lockdep stack. Consequently, multiple nested calls would result in multiple stack entries. Furthermore, `find_held_lock` appears to be removing the *innermost* lock.

I then considered a specific sequence: `rcu_read_lock` (from A), `spinlock_B`, `rcu_read_lock` (from B). If `spin_unlock(A)` is called, and `spinlock_A` isn't in the stack, *why*? It should have already been released or, potentially, it is untracked by lockdep, which would explain its absence. But `rcu_read_lock` *is* tracked, so it should be on the stack.

The stack, as I understand it is: `rcu_read_lock` (from A), `spinlock_B`, `rcu_read_lock` (from B). Now, `spin_unlock(A)` is called, so `spin_release(A)` does nothing, and then `rcu_read_unlock()` removes the innermost `rcu_read_lock` (B), leaving only: `rcu_read_lock` (from A), `spinlock_B`. Then, a `cond_resched_lock` call occurs.

The trace suggests a different picture: `rcu_read_lock`, `journal->j_list_lock`, `rcu_read_lock` - *three* locks in the stack. This discrepancy demands immediate attention! If there are three locks, then either `rcu_read_unlock()` was never called, or the original stack had four locks, the fourth of which was released.

Could `spin_unlock(&jh->b_state_lock)` have been *omitted*? After confirming that the code is unconditional, I explored the possibility of `jh->b_state_lock` being tracked, which would add it to the stack as a fourth lock. It isn't, and so the issue still remains.

My analysis then focused on the timing. I'm carefully reviewing the order in which locks are acquired and released. Particularly the relationship between `spin_lock(&jh->b_state_lock)`, `spin_lock(&journal->j_list_lock)`, and `spin_unlock(&jh->b_state_lock)`. The code indicates they are interleaved. Specifically, `b_state_lock` is acquired, then `journal->j_list_lock`, then `b_state_lock` is released.

This interleaving is significant, and I realized that `spin_release(A)` removes A and that `rcu_read_unlock()` removes the *innermost* `rcu_read_lock`, which is the one from B. But still, the trace is showing THREE locks!
I considered the stack of `rcu_read_lock`s, and there might be more nested locks than I was anticipating.
I was considering:
`rcu_read_lock` (from somewhere else), `b_state_lock`, `rcu_read_lock` (from A), `j_list_lock`, `rcu_read_lock` (from B)
which would reduce to:
`rcu_read_lock` (from somewhere else), `rcu_read_lock` (from A), `j_list_lock`.
Which, according to the trace would be: `rcu_read_lock`, `rcu_read_lock`, `j_list_lock`.
But the trace shows: `rcu_read_lock`, `j_list_lock`, `rcu_read_lock`.
This means that the locks must be in the correct order, which has me thinking the stack must be: `rcu_read_lock` (A), `j_list_lock`, `rcu_read_lock` (B) - THREE locks.
But if `rcu_read_unlock()` removed the one from B, how is it still there?

I'm now thinking: *perhaps


149/2 2026/05/31 23:02 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1030 LineCount:40]

Results:
map[Contents:1030:				 * need to make buffer unmapped because the page is
1031:				 * already detached from the mapping and buffers cannot
1032:				 * get reused.
1033:				 */
1034:				mapping = READ_ONCE(bh->b_folio->mapping);
1035:				if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) {
1036:					clear_buffer_mapped(bh);
1037:					clear_buffer_new(bh);
1038:					clear_buffer_req(bh);
1039:					bh->b_bdev = NULL;
1040:				}
1041:			}
1042:	
1043:			if (buffer_jbddirty(bh)) {
1044:				JBUFFER_TRACE(jh, "add to new checkpointing trans");
1045:				__jbd2_journal_insert_checkpoint(jh, commit_transaction);
1046:				if (is_journal_aborted(journal))
1047:					clear_buffer_jbddirty(bh);
1048:			} else {
1049:				J_ASSERT_BH(bh, !buffer_dirty(bh));
1050:				/*
1051:				 * The buffer on BJ_Forget list and not jbddirty means
1052:				 * it has been freed by this transaction and hence it
1053:				 * could not have been reallocated until this
1054:				 * transaction has committed. *BUT* it could be
1055:				 * reallocated once we have written all the data to
1056:				 * disk and before we process the buffer on BJ_Forget
1057:				 * list.
1058:				 */
1059:				if (!jh->b_next_transaction)
1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
]

150/2 2026/05/31 23:02 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 108737
							output: 31
							thoughts: 601
						

Thoughts:
**Debugging a Mysterious RCU Nesting Depth Issue**

Okay, so I'm looking at this code and I'm seeing this bizarre `RCU nest depth: 2` error. That's a red flag! The code should be structured, there should be NO `continue` or `goto` or `return` that skips unlocking. So, `spin_unlock(&jh->b_state_lock)` *must* be called. But if it *is* called, why the depth of 2?

My initial thought was maybe `spin_unlock` wasn't properly decrementing `rcu_preempt_depth`. But, hang on, `rcu_preempt_depth()` just checks `current->rcu_read_lock_nesting`. And I know `rcu_read_unlock()` decrements this. So, if `spin_unlock` *calls* `rcu_read_unlock()`, it *has* to decrement the nesting. 

Let me backtrack. What if `rt_spin_unlock` doesn't call `rcu_read_unlock()`? Quick check. Nope, it does. Okay, is there any preprocessor trickery (#ifdef) that compiles it out? No, `rcu_read_unlock` is always called.

Wait, I think I'm onto something. What if `cond_resched_lock` is being called while `journal->j_list_lock` is held, and `cond_resched_lock` is expecting `rcu_preempt_depth == 1`? And what if `rcu_preempt_depth` was ALREADY 1 *before* `spin_lock(&journal->j_list_lock)`? Then `spin_lock(&journal->j_list_lock)` would increase the depth to 2. *That* would cause the complaint in `cond_resched_lock`! 

So, why would it be 1 beforehand? My brain is clicking! It has to be because `rcu_read_lock()` was called *somewhere else*. Where? Need to check the lockdep trace... aha! Lock #0 is `rcu_read_lock` acquired at `rt_spin_lock+0x1e0/0x400`. So it's being acquired by `rt_spin_lock`, which implies a spinlock is also involved.

But the spinlock isn't in the held locks list? That's impossible! Wait... could the spinlock have been *released* without the corresponding `rcu_read_unlock()`? It should be impossible because `spin_unlock` calls `rcu_read_unlock()`. So, I'm thinking...what if `raw_spin_unlock` was used? If a lock is a `spinlock_t`, but unlocked with `raw_spin_unlock`, then `rcu_read_unlock()` *isn't* called! Hmm...need to do a search for any uses of `raw_spin_unlock` in the `jbd2` code. I bet this is where the issue lies.



151/2 2026/05/31 23:02 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:raw_spin_unlock PathPrefix:fs/jbd2/]

Results:
map[Output:]

152/2 2026/05/31 23:02 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 110050
							output: 36
							thoughts: 146
						

Thoughts:
**Analyzing Spinlock Behavior in the Kernel**

Okay, hold on. My initial intuition says "no" to something, but let's dig deeper. The critical question here is whether a particular spinlock release mechanism interacts with RCU (Read-Copy-Update). What happens if the spinlock is released using `spin_unlock_irqrestore`?  I know `spin_unlock_irqrestore` calls `rt_spin_unlock`, and that in turn, calls `rcu_read_unlock()`. That's important to remember.

Now, let's switch gears. What about `bit_spin_unlock`? Does *it* interact with RCU? Hmm, I seem to recall that it doesn't call `rcu_read_unlock()`. This is good, a subtle difference is emerging.

But wait a minute... if `bit_spin_unlock` *doesn't* unlock the RCU read side, does `bit_spin_lock` *lock* it? The question of a read side lock is really important. Let's see...  I'm starting to suspect that `bit_spin_lock` doesn't call `rcu_read_lock()` either! This has to be confirmed!

Let's quickly check `bit_spin_lock` again to ensure I'm not missing something critical here. I'm going to re-examine the code of `bit_spin_lock` to make absolutely certain.



153/2 2026/05/31 23:03 tool read-file
0m Args:
map[File:include/linux/bit_spinlock.h FirstLine:20 LineCount:30]

Results:
map[Contents:  20:	#define __bitlock(bitnum, addr) (struct __context_bitlock *)(bitnum + (addr))
  21:	
  22:	/*
  23:	 *  bit-based spin_lock()
  24:	 *
  25:	 * Don't use this unless you really need to: spin_lock() and spin_unlock()
  26:	 * are significantly faster.
  27:	 */
  28:	static __always_inline void bit_spin_lock(int bitnum, unsigned long *addr)
  29:		__acquires(__bitlock(bitnum, addr))
  30:	{
  31:		/*
  32:		 * Assuming the lock is uncontended, this never enters
  33:		 * the body of the outer loop. If it is contended, then
  34:		 * within the inner loop a non-atomic test is used to
  35:		 * busywait with less bus contention for a good time to
  36:		 * attempt to acquire the lock bit.
  37:		 */
  38:		preempt_disable();
  39:	#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  40:		while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
  41:			preempt_enable();
  42:			do {
  43:				cpu_relax();
  44:			} while (test_bit(bitnum, addr));
  45:			preempt_disable();
  46:		}
  47:	#endif
  48:		__acquire(__bitlock(bitnum, addr));
  49:	}
]

154/2 2026/05/31 23:03 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 110984
							output: 20
							thoughts: 101
						

Thoughts:
**Analyzing Preemption Behavior in PREEMPT_RT**

Okay, so I'm looking at this code and something's bugging me. My initial instinct was that this section disables preemption with `preempt_disable()`. But then I remembered the PREEMPT_RT patchset and that tricky `migrate_disable()` mapping. The crucial thing is that under PREEMPT_RT, `preempt_disable()` *can* be mapped to `migrate_disable()` which does something different.

But hold on, that can't be right in this case... I'm pretty sure `preempt_disable()` isn't actually aliased to `migrate_disable()` here. That's a key distinction and something I need to keep straight when thinking about RT implications.

Alright, a new thought, though, which is important: what if `bit_spin_lock` itself has been redefined in PREEMPT_RT? That could change things significantly. I need to make *absolutely* certain that assumption is correct, or incorrect, so I should really just do another grep search through the `include/` directory, just to make sure I haven't missed something. Gotta check the definition of that macro in the RT context.



155/2 2026/05/31 23:04 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:define bit_spin_lock]

Results:
map[Output:]

156/2 2026/05/31 23:04 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 111375
							output: 25
							thoughts: 37
						

Thoughts:
Okay, here's my summary, taking the perspective of someone deeply familiar with low-level systems programming and locking mechanisms:

**Investigating a Possible Locking Conflict in the Journaling Code**

Hmm, this is curious. I just ran a grep for `define bit_spin_lock` expecting to find the standard bit-spin-lock definition, and came up empty. That's a red flag. It makes me wonder if there's a potential redefinition of a critical lock that I'm missing, specifically a redefinition of `jbd_lock_bh_journal_head` somewhere. That would be a major problem. It could be hidden in a conditional compilation block, a macro expansion, or even a different header included earlier. This needs further investigation. A redefined `jbd_lock_bh_journal_head` could have serious ramifications for data integrity, so I need to make sure I don't overlook it. I need to widen my search.



157/2 2026/05/31 23:04 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:define jbd_lock_bh_journal_head]

Results:
map[Output:]

158/2 2026/05/31 23:04 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 111653
							output: 37
							thoughts: 120
						

Thoughts:
**Investigating Potential Preempt RT Issues with `jbd_lock_bh_journal_head`**

Okay, so I'm looking at this `jbd_lock_bh_journal_head` function, and it's defined as an inline function. Specifically:

```c
static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
{
	bit_spin_lock(BH_JournalHead, &bh->b_state);
}
```

My immediate concern here is with that `bit_spin_lock`. I know spinlocks can be problematic under PREEMPT_RT, and it's got me thinking... is `bit_spin_lock` even handled correctly within a PREEMPT_RT context? That's the key question.

The next thing to do is cross-reference `jbd_lock_bh_journal_head` with `include/linux/jbd2.h`. I need to understand if the broader usage of this function, and particularly that `bit_spin_lock`, has already been considered in relation to PREEMPT_RT. I'll pore over that header file to understand if there are any conditional inclusions or other mechanisms that might address my concerns. Hopefully, it's addressed, and I'm just being overly cautious. If not, this warrants a deep dive into the kernel sources related to spinlocks and PREEMPT_RT.



159/2 2026/05/31 23:04 tool read-file
0m Args:
map[File:include/linux/jbd2.h FirstLine:335 LineCount:20]

Results:
map[Contents: 335:	
 336:	static inline struct journal_head *bh2jh(struct buffer_head *bh)
 337:	{
 338:		return bh->b_private;
 339:	}
 340:	
 341:	static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
 342:	{
 343:		bit_spin_lock(BH_JournalHead, &bh->b_state);
 344:	}
 345:	
 346:	static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
 347:	{
 348:		bit_spin_unlock(BH_JournalHead, &bh->b_state);
 349:	}
 350:	
 351:	#define J_ASSERT(assert)	BUG_ON(!(assert))
 352:	
 353:	#define J_ASSERT_BH(bh, expr)	J_ASSERT(expr)
 354:	#define J_ASSERT_JH(jh, expr)	J_ASSERT(expr)
]

160/2 2026/05/31 23:04 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 112428
							output: 38
							thoughts: 2114
						

Thoughts:
**Analyzing the Lock Dep Trace**

Okay, so I'm digging into this bug report. The initial thought was that a `bit_spin_lock` might be the culprit, since it calls `preempt_disable()`, but the `preempt_count` check immediately rules that out. The trace indicates `preempt_count` is zero, so that lock isn't held.

Alright, let's explore if `spin_lock(&jh->b_state_lock)` is called, then the corresponding unlock is called at any time with an intermediate lock that disrupts the correct release of the `rcu_read_lock`. The report doesn't explicitly mention any such lock.

I'm revisiting the lockdep trace, paying close attention to where `rcu_read_lock` is acquired. It shows acquisition at `rt_spin_lock`, and this function is called at `spin_lock(&journal->j_list_lock)` at line 948. If this lock at line 948 wasn't released, then `j_list_lock` would appear twice in the held locks list, but it's only present once (lock #1). This means `j_list_lock` was released at line 956, and if it was released, `rt_spin_unlock` was called, which calls `rcu_read_unlock`. The stack of locks should have released `rcu_read_lock`, but it didn't.

`rcu_read_unlock` removes the *innermost* `rcu_read_lock`. So, if there was another `rcu_read_lock` within the scope of `j_list_lock`, that would be the one removed, not the intended one.

Between lines 948 and 956, no other locks are acquired. So `rcu_read_unlock` *should* have released the `rcu_read_lock` acquired at 948.

Now, let's look at what's happening at lines 963 and 993.  `spin_lock(&jh->b_state_lock)` acquires both `b_state_lock` and `rcu_read_lock`. Then, `spin_lock(&journal->j_list_lock)` at 993 acquires `j_list_lock` and another `rcu_read_lock`.  At 1064, `spin_unlock(&jh->b_state_lock)` releases `b_state_lock` and calls `rcu_read_unlock()`. This `rcu_read_unlock` *removes* the `rcu_read_lock` acquired at 993! This means the `rcu_read_lock` acquired at 963, and the `j_list_lock` acquired at 993, would still be on the stack.

However, the trace shows three locks, so something else must be happening. If at 993, `spin_lock(&journal->j_list_lock)` wasn't the *only* lock acquired, then what else is going on? What if a lock is acquired during the call of `__jbd2_journal_refile_buffer`?  It asserts `j_list_lock` is held. It then calls `__jbd2_journal_unfile_buffer(jh)`.  There are no other locks acquired in this call. This then calls `__jbd2_journal_temp_unlink_buffer`, and then `__jbd2_journal_file_buffer`. At this point, the code calls `jbd2_journal_grab_journal_head(bh)`, which acquires `bit_spin_lock`, but does *not* acquire `rcu_read_lock`, and releases it before returning.

Ok, let's check `jbd2_journal_put_journal_head(jh)` at 1066. It acquires `bit_spin_lock`. No `rcu_read_lock`.

Finally, what about the call `release_buffer_page(bh)`? Let's analyze it...



161/2 2026/05/31 23:04 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/commit.c Name:release_buffer_page]

Results:
map[SourceCode:  49:	/*
  50:	 * When an ext4 file is truncated, it is possible that some pages are not
  51:	 * successfully freed, because they are attached to a committing transaction.
  52:	 * After the transaction commits, these pages are left on the LRU, with no
  53:	 * ->mapping, and with attached buffers.  These pages are trivially reclaimable
  54:	 * by the VM, but their apparent absence upsets the VM accounting, and it makes
  55:	 * the numbers in /proc/meminfo look odd.
  56:	 *
  57:	 * So here, we have a buffer which has just come off the forget list.  Look to
  58:	 * see if we can strip all buffers from the backing page.
  59:	 *
  60:	 * Called under j_list_lock. The caller provided us with a ref against the
  61:	 * buffer, and we drop that here.
  62:	 */
  63:	static void release_buffer_page(struct buffer_head *bh)
  64:	{
  65:		struct folio *folio;
  66:	
  67:		if (buffer_dirty(bh))
  68:			goto nope;
  69:		if (atomic_read(&bh->b_count) != 1)
  70:			goto nope;
  71:		folio = bh->b_folio;
  72:		if (folio->mapping)
  73:			goto nope;
  74:	
  75:		/* OK, it's a truncated page */
  76:		if (!folio_trylock(folio))
  77:			goto nope;
  78:	
  79:		folio_get(folio);
  80:		__brelse(bh);
  81:		try_to_free_buffers(folio);
  82:		folio_unlock(folio);
  83:		folio_put(folio);
  84:		return;
  85:	
  86:	nope:
  87:		__brelse(bh);
  88:	}
 SourceFile:fs/jbd2/commit.c]

162/2 2026/05/31 23:04 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 116047
							output: 32
							thoughts: 4968
						

Thoughts:
**Analyzing a Lockdep Trace: A Deep Dive into RCU and Spinlocks**

Okay, so I'm looking at this lockdep trace, and my initial thought is, "Wait, is `try_to_free_buffers(folio)` acquiring locks in a funky way?" It's called while `folio` is already locked, so it shouldn't be grabbing anything new. Then I start thinking, "Does it use `rcu_read_lock` internally?" It calls `drop_buffers` and I'm wondering if `release_buffer_page` might be the culprit, acquiring and *not* releasing an `rcu_read_lock`. That would be a bug, surely. But `try_to_free_buffers` is a standard kernel function, that seems unlikely.

I went back and re-examined the lockdep trace. I noticed something very interesting, the RCU lock at #0 and #2 have the *exact* same IP address! Specifically, `rt_spin_lock+0x1e0/0x400` I realized this means both `rcu_read_lock`s were acquired through the same `rt_spin_lock` call. If `release_buffer_page` was the problem, it would have to call `rt_spin_lock` too, meaning a different IP address, or the trace would have included *another* spinlock. Since no *other* spinlocks appear, the only spinlocks in the trace were acquired *and not released* by `rt_spin_lock`.

Then I started considering different scenarios. "What if `rt_spin_lock` was called on `j_list_lock` twice?" Lockdep would complain. Or on `jh->b_state_lock`? Lockdep would have warned. Then it hit me: the solution isn't some strange new function acquiring `rcu_read_lock`.

I'm starting to get to the bottom of this. Here's what I think.

At 963: `spin_lock(&jh->b_state_lock)`: acquires `b_state_lock` and its *also* acquiring `rcu_read_lock`.

At 993: `spin_lock(&journal->j_list_lock)`: acquires `j_list_lock` and `rcu_read_lock`.

So, the stack looks like this.
0: `b_state_lock`
1: `rcu_read_lock` (from 963)
2: `j_list_lock`
3: `rcu_read_lock` (from 993)

Then at 1064: `spin_unlock(&jh->b_state_lock)`:
- `spin_release(&jh->b_state_lock)` removes `b_state_lock` which is now at index 0.

So the stack is now:
0: `rcu_read_lock` (from 963)
1: `j_list_lock`
2: `rcu_read_lock` (from 993)

And then `rcu_read_unlock()` removes the *innermost* `rcu_read_lock`, at index 2 (from 993).

So now we have:
0: `rcu_read_lock` (from 963)
1: `j_list_lock`

However, if that's the stack state, it means the trace *should* be showing only *two* locks, but the trace is showing *three*. "Where did that third lock come from?" I started to suspect `rcu_read_lock` might use `references` rather than pushing a stack entry, and I went back to look at `__lock_acquire`. It *only* increments `references` if `nest_lock` is *not* NULL. `rcu_read_lock` *doesn't* use `nest_lock` so it DOES add a new entry to the stack. But lockdep *allows* multiple entries for the *same* class if they're read locks. So we *should* have multiple `rcu_read_lock` entries, *unless* something else has acquired `rcu_read_lock`.

Now I'm trying to figure out where that third lock *could* have come from. "What if `spin_lock(&jh->b_state_lock)` was called *after* another `rcu_read_lock` was acquired?" I started considering if something like `get_bh(bh)` at 962 was acquiring that lock. Nope, not that. I also looked to see if the stack hadn't


163/2 2026/05/31 23:05 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:_rcu PathPrefix:fs/jbd2/commit.c]

Results:
map[Output:]

164/2 2026/05/31 23:05 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 122086
							output: 36
							thoughts: 133
						

Thoughts:
**Investigating a Potential Race Condition in Journaling**

Alright, hold on a second. Something doesn't feel right. My immediate instinct was "no," but let's back up. I'm thinking about the interaction between `spin_unlock(&jh->b_state_lock)` and `rcu_read_unlock()`. The critical question buzzing in my head is: What if that `spin_unlock` is called, and *doesn't* call `rcu_read_unlock()`? That would be a serious problem.

Now, *why* wouldn't it call `rcu_read_unlock()`? The only reason I can see, at first glance, is if `jh->b_state_lock` isn't a standard spinlock. Perhaps it's something different, perhaps not a spinlock at all. A raw lock, maybe?

Okay, let's double-check the definition of `jh->b_state_lock`. I'll go back to `include/linux/journal-head.h`... Yep, it's defined as a `spinlock_t`. Damn. So, is there a chance it's a `raw_spinlock_t`? Time to dig back in... let's check that include again.



165/2 2026/05/31 23:05 tool read-file
0m Args:
map[File:include/linux/journal-head.h FirstLine:20 LineCount:20]

Results:
map[Contents:  20:	struct buffer_head;
  21:	
  22:	struct journal_head {
  23:		/*
  24:		 * Points back to our buffer_head. [jbd_lock_bh_journal_head()]
  25:		 */
  26:		struct buffer_head *b_bh;
  27:	
  28:		/*
  29:		 * Protect the buffer head state
  30:		 */
  31:		spinlock_t b_state_lock;
  32:	
  33:		/*
  34:		 * Reference count - see description in journal.c
  35:		 * [jbd_lock_bh_journal_head()]
  36:		 */
  37:		int b_jcount;
  38:	
  39:		/*
]

166/2 2026/05/31 23:05 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 122751
							output: 43
							thoughts: 1614
						

Thoughts:
**Analyzing a Potential Spinlock Issue in PREEMPT_RT Context**

Okay, let's break this down. First, the code snippet uses a `spinlock_t`, specifically `jh->b_state_lock`. I need to ensure the locking and unlocking are consistent. In PREEMPT_RT, `spin_unlock` *should* map to `rt_spin_unlock`, but I always double-check.

Now, let's look at the trace. I've identified three locks: #0, #1, and #2. Lock #0 is intriguing because it involves `rcu_read_lock`. The trace shows it acquires the lock through `__rt_spin_lock`, part of the `spinlock_t` implementation. Lock #1 is clearly `journal->j_list_lock`, a standard `spinlock_t`. Lock #2 is another `rcu_read_lock` acquisition, also going through `__rt_spin_lock`.

My initial thought was that lock #0, the one with the `rcu_read_lock` could be associated with `journal->j_state_lock`, but I see that `journal->j_state_lock` is an `rwlock_t`. In PREEMPT_RT, `rwlock_t` relies on `rt_read_lock` and `rt_write_lock`, and those *also* acquire RCU. I reviewed `kernel/locking/spinlock_rt.c` to confirm. However, the trace indicates `__rt_spin_lock`, which is explicitly for `spinlock_t`, not `rwlock_t`. Therefore, Lock #0 must be coming from a `spinlock_t` and specifically from `jh->b_state_lock` via `rt_spin_lock`.

Given that, I expect a corresponding `spin_unlock(&jh->b_state_lock)` to have occurred somewhere. The trace is missing an unlock. If it happened, it should have called `rcu_read_unlock()`, removing an `rcu_read_lock` from the stack. The problem is that two `rcu_read_lock` entries remain! I started with three, so one was indeed removed.

Where did the third `rcu_read_lock` come from? Did we accidentally acquire the lock twice? Looking at the loop, I see the following lock/unlock sequence: `spin_lock(&jh->b_state_lock);` followed by a conditional block, and then `spin_lock(&journal->j_list_lock);`. This gives me pause.

Could a call within the conditional block, perhaps `jbd2_free`, be re-acquiring a spinlock, causing this? However, `jbd2_free` is just a macro for `kfree` or `kmem_cache_free`. I know that these functions *might* use spinlocks internally, especially the slub allocator, but they *always* release them.

So, it's not `jbd2_free`. Where else could we call a spinlock within the conditional? Could `__jbd2_journal_remove_checkpoint(jh)` do it? I should investigate this function next.



167/2 2026/05/31 23:05 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/checkpoint.c Name:__jbd2_journal_remove_checkpoint]

Results:
map[SourceCode: 559:	/*
 560:	 * journal_remove_checkpoint: called after a buffer has been committed
 561:	 * to disk (either by being write-back flushed to disk, or being
 562:	 * committed to the log).
 563:	 *
 564:	 * We cannot safely clean a transaction out of the log until all of the
 565:	 * buffer updates committed in that transaction have safely been stored
 566:	 * elsewhere on disk.  To achieve this, all of the buffers in a
 567:	 * transaction need to be maintained on the transaction's checkpoint
 568:	 * lists until they have been rewritten, at which point this function is
 569:	 * called to remove the buffer from the existing transaction's
 570:	 * checkpoint lists.
 571:	 *
 572:	 * The function returns 1 if it frees the transaction, 0 otherwise.
 573:	 * The function can free jh and bh.
 574:	 *
 575:	 * This function is called with j_list_lock held.
 576:	 */
 577:	int __jbd2_journal_remove_checkpoint(struct journal_head *jh)
 578:	{
 579:		struct transaction_chp_stats_s *stats;
 580:		transaction_t *transaction;
 581:		journal_t *journal;
 582:	
 583:		JBUFFER_TRACE(jh, "entry");
 584:	
 585:		transaction = jh->b_cp_transaction;
 586:		if (!transaction) {
 587:			JBUFFER_TRACE(jh, "not on transaction");
 588:			return 0;
 589:		}
 590:		journal = transaction->t_journal;
 591:	
 592:		JBUFFER_TRACE(jh, "removing from transaction");
 593:	
 594:		__buffer_unlink(jh);
 595:		jh->b_cp_transaction = NULL;
 596:		percpu_counter_dec(&journal->j_checkpoint_jh_count);
 597:		jbd2_journal_put_journal_head(jh);
 598:	
 599:		/* Is this transaction empty? */
 600:		if (transaction->t_checkpoint_list)
 601:			return 0;
 602:	
 603:		/*
 604:		 * There is one special case to worry about: if we have just pulled the
 605:		 * buffer off a running or committing transaction's checkpoing list,
 606:		 * then even if the checkpoint list is empty, the transaction obviously
 607:		 * cannot be dropped!
 608:		 *
 609:		 * The locking here around t_state is a bit sleazy.
 610:		 * See the comment at the end of jbd2_journal_commit_transaction().
 611:		 */
 612:		if (transaction->t_state != T_FINISHED)
 613:			return 0;
 614:	
 615:		/*
 616:		 * OK, that was the last buffer for the transaction, we can now
 617:		 * safely remove this transaction from the log.
 618:		 */
 619:		stats = &transaction->t_chp_stats;
 620:		if (stats->cs_chp_time)
 621:			stats->cs_chp_time = jbd2_time_diff(stats->cs_chp_time,
 622:							    jiffies);
 623:		trace_jbd2_checkpoint_stats(journal->j_fs_dev->bd_dev,
 624:					    transaction->t_tid, stats);
 625:	
 626:		__jbd2_journal_drop_transaction(journal, transaction);
 627:		jbd2_journal_free_transaction(transaction);
 628:		return 1;
 629:	}
 SourceFile:fs/jbd2/checkpoint.c]

168/2 2026/05/31 23:05 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 126201
							output: 43
							thoughts: 135
						

Thoughts:
Here's my analysis of this code snippet:

**Potential Concurrency Issue in Journaling Code**

Okay, hold on a second! I'm tracing through this `__jbd2_journal_remove_checkpoint` function, and it looks like it's calling `jbd2_journal_put_journal_head(jh)`. That in turn calls `jbd_lock_bh_journal_head(bh)`, which makes a call to `bit_spin_lock`. I immediately see a potential problem here: `bit_spin_lock` *doesn't* appear to acquire an `rcu_read_lock`. That's unusual and could create a race condition in the right (or wrong!) circumstances.

Now, my mind is racing to consider the possible interactions. Could a concurrent operation be occurring? What could be the source?

Let's quickly check `__jbd2_journal_drop_transaction`. I need to see if *it* uses `spin_lock`, since that could potentially clash.



169/2 2026/05/31 23:05 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/checkpoint.c Name:__jbd2_journal_drop_transaction]

Results:
map[SourceCode: 702:	void __jbd2_journal_drop_transaction(journal_t *journal, transaction_t *transaction)
 703:	{
 704:		assert_spin_locked(&journal->j_list_lock);
 705:	
 706:		journal->j_shrink_transaction = NULL;
 707:		if (transaction->t_cpnext) {
 708:			transaction->t_cpnext->t_cpprev = transaction->t_cpprev;
 709:			transaction->t_cpprev->t_cpnext = transaction->t_cpnext;
 710:			if (journal->j_checkpoint_transactions == transaction)
 711:				journal->j_checkpoint_transactions =
 712:					transaction->t_cpnext;
 713:			if (journal->j_checkpoint_transactions == transaction)
 714:				journal->j_checkpoint_transactions = NULL;
 715:		}
 716:	
 717:		J_ASSERT(transaction->t_state == T_FINISHED);
 718:		J_ASSERT(transaction->t_buffers == NULL);
 719:		J_ASSERT(transaction->t_forget == NULL);
 720:		J_ASSERT(transaction->t_shadow_list == NULL);
 721:		J_ASSERT(transaction->t_checkpoint_list == NULL);
 722:		J_ASSERT(atomic_read(&transaction->t_updates) == 0);
 723:		J_ASSERT(journal->j_committing_transaction != transaction);
 724:		J_ASSERT(journal->j_running_transaction != transaction);
 725:	
 726:		trace_jbd2_drop_transaction(journal, transaction);
 727:	
 728:		jbd2_debug(1, "Dropping transaction %d, all done\n", transaction->t_tid);
 729:	}
 SourceFile:fs/jbd2/checkpoint.c]

170/2 2026/05/31 23:05 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 127127
							output: 42
							thoughts: 45
						

Thoughts:
Okay, here's my interpretation of that thought process, from an expert's perspective:

**Debugging a Potential Locking Issue in JBD2**

Alright, no immediate red flags in the locking department. Good. But wait a minute... something just clicked. I need to be absolutely sure about this. The `jbd2_journal_free_transaction(transaction)` function is the prime suspect here. Specifically, I need to consider whether that call itself potentially acquires a spinlock. It's a critical path, so any unexpected lock contention there would be a disaster, and I need to verify that this is not happening. Time to dive into the source code for `jbd2_journal_free_transaction`. I need to confirm that function's implementation doesn't inadvertently trigger locking I'm not expecting. Let's get to the code.



171/2 2026/05/31 23:05 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/checkpoint.c Name:jbd2_journal_free_transaction]

Results:
map[SourceCode:  58:	void jbd2_journal_free_transaction(transaction_t *transaction)
  59:	{
  60:		if (unlikely(ZERO_OR_NULL_PTR(transaction)))
  61:			return;
  62:		kmem_cache_free(transaction_cache, transaction);
  63:	}
 SourceFile:fs/jbd2/transaction.c]

172/2 2026/05/31 23:05 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 127509
							output: 37
							thoughts: 35
						

Thoughts:
Okay, here's my understanding, expressed as a first-person summary, keeping in mind I'm an expert in this field:

**Debugging a Potential Concurrency Issue**

Alright, I'm staring at this and I'm not seeing any obvious locks acquired in the code path leading up to the point of interest. That's good, but it also makes me a little suspicious. It almost seems *too* clean.

Wait a second… what if there's a sneaky `spin_lock` call hidden deeper down in a function that's *being* called? Specifically, I'm thinking about that `__buffer_unlink(jh)` call. Could *that* function, or some function it calls, be acquiring a spinlock? That's the most likely hiding spot, if there is one. I need to be sure this function doesn't call a lock. Let's dig into the `__buffer_unlink` function itself and confirm this. Time to go spelunking in the source code.



173/2 2026/05/31 23:05 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/checkpoint.c Name:__buffer_unlink]

Results:
map[SourceCode:  25:	/*
  26:	 * Unlink a buffer from a transaction checkpoint list.
  27:	 *
  28:	 * Called with j_list_lock held.
  29:	 */
  30:	static inline void __buffer_unlink(struct journal_head *jh)
  31:	{
  32:		transaction_t *transaction = jh->b_cp_transaction;
  33:	
  34:		jh->b_cpnext->b_cpprev = jh->b_cpprev;
  35:		jh->b_cpprev->b_cpnext = jh->b_cpnext;
  36:		if (transaction->t_checkpoint_list == jh) {
  37:			transaction->t_checkpoint_list = jh->b_cpnext;
  38:			if (transaction->t_checkpoint_list == jh)
  39:				transaction->t_checkpoint_list = NULL;
  40:		}
  41:	}
 SourceFile:fs/jbd2/checkpoint.c]

174/2 2026/05/31 23:05 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 128075
							output: 18
							thoughts: 2835
						

Thoughts:
**Lockdep Trace Analysis in JBD2 Journal Commit**

Okay, so I'm diving into this lockdep trace related to the `jbd2_journal_commit_transaction` function. I'm seeing an oddity with `rcu_read_lock`. The trace shows it three times, but I'm expecting it to be released and down to two.  I'm initially trying to figure out if `jbd2_free` or `kfree` have anything to do with acquiring locks, but that's a dead end. No, they don't.

Now, focusing on the trace itself. I see a `journal->j_list_lock` and two `rcu_read_lock` entries in the lock order. My first instinct is to think, "Maybe a lock wasn't released," but that doesn't seem to be the case when looking at the code, in particular the `jh->b_state_lock`. I see `spin_unlock(&jh->b_state_lock)` is called *before* `cond_resched_lock` which *should* mean the related `rcu_read_unlock()` is also being called. If it's unlocked, how does the lock remain in the trace?

I keep looking at the trace and lock order. It is *almost* as if the wrong `rcu_read_lock` is being released. But if that was the case, the one from `journal->j_list_lock` wouldn't be present. Since `journal->j_list_lock` *is* present, I can see that `rcu_read_unlock()` isn't removing the "wrong" `rcu_read_lock`.

I then started to entertain the idea that the `rcu_read_lock` might be tracked as a single class, so it would only have one entry in the held locks list. No, there are *two* in the trace. And checking the `__lock_acquire` implementation, it should *add* a new entry if the `nest_lock` is NULL, even if the class index matches a previously acquired lock, which seems to explain the two `rcu_read_lock` entries.

The lock order is now: `rcu_read_lock`, `j_list_lock`, `rcu_read_lock`. Makes sense, if a lock is released it would remove one of the `rcu_read_lock` instances. But then it still doesn't explain how the trace shows *three* locks in the first place.

I carefully go back to the code, and keep looking. Since the `jh->b_state_lock` is released unconditionally, its related `rcu_read_unlock()` *should* have been called. If it was, the stack should have two locks remaining, not three! This implies a third `rcu_read_lock`! That would mean a *fourth* entry to be added to the held list.

Wait, it just might be that `cond_resched_lock` might be playing a role with the lock ordering. I check the code and see that it is called *after* `spin_unlock(&jh->b_state_lock)`, and as a macro, *before* the lock. But `cond_resched_lock` executes after the unlock, so this doesn't explain the trace either.

I even checked to confirm that `rcu_read_unlock()` *unconditionally* releases the lock. I go through the full calling chain, and it looks like that's also the case. The `__lock_release` call should *unconditionally* remove the lock from the stack. So it isn't the macro, and that means if the code *did* execute, it would also *remove* the lock!

I re-checked `__lock_acquire` and how it manages `references`. It is not tracked by `references` but rather by just *adding a new entry*.

I think I see what's happening. The stack has 0: `rcu_read_lock`, 1: `j_list_lock`, and 2: `rcu_read_lock`. Since the unlock has to unconditionally call the release function, how can there be *three* in the trace? It means that somehow there must have been *four* locks. How can this happen?
I have to dig in to the functions that could potentially call `rcu_read_lock`. It couldn't be called twice by the same instance.
I now think I know! The trace must show `jbd2_journal_put_journal_head(jh)`! Because of the calls to `jbd2_journal_remove_checkpoint`, and I need to check `preempt_disable


175/2 2026/05/31 23:06 tool grepper
0m Args:
map[Expression:define preempt_disable]

Results:
map[Output:include/linux/preempt.h=194=extern void preempt_count_sub(int val);
--
include/linux/preempt.h-210-
include/linux/preempt.h:211:#define preempt_disable() \
include/linux/preempt.h-212-do { \
--
include/linux/preempt.h=256=do { \
--
include/linux/preempt.h-263-
include/linux/preempt.h:264:#define preempt_disable_notrace() \
include/linux/preempt.h-265-do { \
--
include/linux/preempt.h=271=do { \
--
include/linux/preempt.h-283- */
include/linux/preempt.h:284:#define preempt_disable()			barrier()
include/linux/preempt.h-285-#define sched_preempt_enable_no_resched()	barrier()
--
include/linux/preempt.h-289-
include/linux/preempt.h:290:#define preempt_disable_notrace()		barrier()
include/linux/preempt.h-291-#define preempt_enable_no_resched_notrace()	barrier()
--
include/linux/preempt.h=359=static inline void preempt_notifier_init(struct preempt_notifier *notifier,
--
include/linux/preempt.h-450-/* Macro to avoid header recursion hell vs. lockdep */
include/linux/preempt.h:451:#define preempt_disable_nested()				\
include/linux/preempt.h-452-do {								\
--
include/linux/raid/pq.h=47=extern const char raid6_empty_zero_page[PAGE_SIZE];
--
include/linux/raid/pq.h-56-#define preempt_enable()
include/linux/raid/pq.h:57:#define preempt_disable()
include/linux/raid/pq.h-58-#define cpu_has_feature(x) 1
--
tools/testing/shared/linux/preempt.h=5=extern int preempt_count;
tools/testing/shared/linux/preempt.h-6-
tools/testing/shared/linux/preempt.h:7:#define preempt_disable()	uatomic_inc(&preempt_count)
tools/testing/shared/linux/preempt.h-8-#define preempt_enable()	uatomic_dec(&preempt_count)
]

176/2 2026/05/31 23:06 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 132579
							output: 36
							thoughts: 278
						

Thoughts:
**My Line of Reasoning**

Okay, so `preempt_disable` just bumps up the `preempt_count`. That's straightforward, and crucially, it *doesn't* call `rcu_read_lock()`. Good.

But hold on... I need to be thorough. What if `__jbd2_journal_remove_checkpoint` then calls `__jbd2_journal_drop_transaction`? We already checked that path, right? No locks there. Okay, good. Next, what if `jbd2_journal_free_transaction` calls `kmem_cache_free`? Does *that* call `rcu_read_lock()`? Nope. We're still good.

Alright, another potential path to check. What if `jbd2_journal_put_journal_head` calls `__journal_remove_journal_head`? We checked that function already, and no locks were present. What about `journal_release_journal_head`? That calls `jbd2_free`, which we also inspected, and no locks were called. What if `jbd2_free` then calls `kfree`? But does *kfree* call `rcu_read_lock()`? No, it doesn't.

One more possibility keeps nagging at me... What if `release_buffer_page(bh)` calls `try_to_free_buffers(folio)`? *Does* `try_to_free_buffers` call `rcu_read_lock()`? Okay, time to go check `try_to_free_buffers` to make absolutely sure.



177/2 2026/05/31 23:06 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/buffer.c Name:try_to_free_buffers]

Results:
map[SourceCode:2822:	/**
2823:	 * try_to_free_buffers - Release buffers attached to this folio.
2824:	 * @folio: The folio.
2825:	 *
2826:	 * If any buffers are in use (dirty, under writeback, elevated refcount),
2827:	 * no buffers will be freed.
2828:	 *
2829:	 * If the folio is dirty but all the buffers are clean then we need to
2830:	 * be sure to mark the folio clean as well.  This is because the folio
2831:	 * may be against a block device, and a later reattachment of buffers
2832:	 * to a dirty folio will set *all* buffers dirty.  Which would corrupt
2833:	 * filesystem data on the same device.
2834:	 *
2835:	 * The same applies to regular filesystem folios: if all the buffers are
2836:	 * clean then we set the folio clean and proceed.  To do that, we require
2837:	 * total exclusion from block_dirty_folio().  That is obtained with
2838:	 * i_private_lock.
2839:	 *
2840:	 * Exclusion against try_to_free_buffers may be obtained by either
2841:	 * locking the folio or by holding its mapping's i_private_lock.
2842:	 *
2843:	 * Context: Process context.  @folio must be locked.  Will not sleep.
2844:	 * Return: true if all buffers attached to this folio were freed.
2845:	 */
2846:	bool try_to_free_buffers(struct folio *folio)
2847:	{
2848:		struct address_space * const mapping = folio->mapping;
2849:		struct buffer_head *buffers_to_free = NULL;
2850:		bool ret = 0;
2851:	
2852:		BUG_ON(!folio_test_locked(folio));
2853:		if (folio_test_writeback(folio))
2854:			return false;
2855:	
2856:		/* Misconfigured folio check */
2857:		if (WARN_ON_ONCE(!folio_buffers(folio)))
2858:			return true;
2859:	
2860:		if (mapping == NULL) {		/* can this still happen? */
2861:			ret = drop_buffers(folio, &buffers_to_free);
2862:			goto out;
2863:		}
2864:	
2865:		spin_lock(&mapping->i_private_lock);
2866:		ret = drop_buffers(folio, &buffers_to_free);
2867:	
2868:		/*
2869:		 * If the filesystem writes its buffers by hand (eg ext3)
2870:		 * then we can have clean buffers against a dirty folio.  We
2871:		 * clean the folio here; otherwise the VM will never notice
2872:		 * that the filesystem did any IO at all.
2873:		 *
2874:		 * Also, during truncate, discard_buffer will have marked all
2875:		 * the folio's buffers clean.  We discover that here and clean
2876:		 * the folio also.
2877:		 *
2878:		 * i_private_lock must be held over this entire operation in order
2879:		 * to synchronise against block_dirty_folio and prevent the
2880:		 * dirty bit from being lost.
2881:		 */
2882:		if (ret)
2883:			folio_cancel_dirty(folio);
2884:		spin_unlock(&mapping->i_private_lock);
2885:	out:
2886:		if (buffers_to_free) {
2887:			struct buffer_head *bh = buffers_to_free;
2888:	
2889:			do {
2890:				struct buffer_head *next = bh->b_this_page;
2891:				free_buffer_head(bh);
2892:				bh = next;
2893:			} while (bh != buffers_to_free);
2894:		}
2895:		return ret;
2896:	}
 SourceFile:fs/buffer.c]

178/2 2026/05/31 23:06 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 134415
							output: 29
							thoughts: 1180
						

Thoughts:
**Analyzing Lock Interactions and RCU Usage**

Okay, here's the breakdown of my thought process. I'm focusing on how locks and RCU interact within this kernel code, particularly around the `jbd2` journaling system. I started by noticing the `spin_lock(&mapping->i_private_lock)` call. I know that acquiring this lock also implicitly acquires an `rcu_read_lock`. The subsequent `spin_unlock(&mapping->i_private_lock)` releases both, including the RCU read lock.  I'm drilling down into this sequence.

The crucial part is understanding how nested `rcu_read_lock` calls are managed.  I realized that `rcu_read_unlock()` removes the *innermost* lock, which becomes critical. I constructed a sample stack illustrating this, which helps to visualize the lock states. Then, I considered a scenario where `release_buffer_page` is called after a `spin_unlock` which changed the stack state. I need to know which order they are called.

Looking again at the source of `fs/jbd2/commit.c`, I confirmed that `release_buffer_page` is called *after* `spin_unlock(&jh->b_state_lock)`.  This is important. With that information, I traced how the lock stack would change, and I considered what lock the `release_buffer_page` would call.

I then realized that this still didn't account for what I was seeing in the trace. The trace showed three locks, but my mental model only accounted for two. I need to find the missing lock. I went through the relevant functions that were called in the sequence, such as `folio_trylock`, `folio_get`, and `__brelse`. I'm going through the options to eliminate any obvious contenders that acquire an RCU lock. Then it came to me... what if it was something related to the `jbd2_journal_put_journal_head(jh)`?

`jbd2_journal_put_journal_head(jh)` calls `jbd_lock_bh_journal_head(bh)`, which in turn calls a `bit_spin_lock`. I need to figure out if this `bit_spin_lock` (or a variation of it) might be the source of the missing RCU lock. I'll need to check the code, and maybe do a grep for `bit_spin_lock` within the `kernel/locking/` directory to see if there are any specific PREEMPT_RT implementations that could be relevant. That's the key: tracking down where that third lock is coming from, and whether it could be related to `rcu_read_lock`.



179/2 2026/05/31 23:06 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:bit_spin_lock PathPrefix:kernel/locking/]

Results:
map[Output:]

180/2 2026/05/31 23:06 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 136220
							output: 32
							thoughts: 1300
						

Thoughts:
**Debugging the RCU Nest Depth Issue**

Okay, so the initial thought was, is `rcu_read_lock` being explicitly called within `release_buffer_page`? No, it's not there. Back to square one.

Then, maybe that first `rcu_read_lock` in the trace *isn't* related to `jh->b_state_lock` like I initially suspected? Could it be from `kjournald2`? I already checked, and it's not.

Ah, the core issue! The bug is a "sleeping function called from invalid context". The context is invalid because `rcu_preempt_depth() == 2`. This means we have an *unreleased* `rcu_read_lock`!  If one is from `j_list_lock` then the other is from `jh->b_state_lock` that wasn't properly released due to an interleaved unlock.  Yes! That interleaved unlock caused `rcu_read_unlock()` to mistakenly remove the wrong lock!

But wait, if the wrong lock was removed, why doesn't lockdep show that? The depth is just an integer, not a stack of locks! So the lock count has been thrown off.  If `rcu_read_lock()` was called 3 times (for `b_state_lock`, `j_list_lock`, `i_private_lock`), and `rcu_read_unlock()` was called 2 times (for `b_state_lock`, `i_private_lock`), then `rcu_preempt_depth()` would be 1!

The bug report says the depth is 2! So if the depth is 2, and `j_list_lock` is held, then there is *one extra* `rcu_read_lock` that wasn't unlocked!

Could it be that `spin_unlock(&jh->b_state_lock)` was *never* called?  If not, the `b_state_lock` would still be on the lockdep stack. But it isn't.  How can `b_state_lock` be *removed* from the lockdep stack if `rcu_read_unlock` *wasn't* called? `spin_unlock` *does* call `rt_spin_unlock`, which calls both `spin_release` (removing it from lockdep) *and* `rcu_read_unlock` (decrementing the depth). So the depth *must* have been decremented!

If the depth was decremented, why is it 2? Because there's *another* unreleased `rcu_read_lock`! Where is it? Let's check the lockdep trace again.

That lock #0 in the trace, could it be from `spin_lock(&journal->j_list_lock)` at line 948?  If it is, then `spin_unlock(&journal->j_list_lock)` at line 956 *must* have been called. If so, it would remove `j_list_lock` from lockdep and decrement the depth. But no, `spin_unlock` calls `rt_spin_unlock`, which calls `rcu_read_unlock`.

Could it be from a direct `rcu_read_lock` call within `jbd2_journal_commit_transaction`? Time to `grep` the `fs/jbd2/` directory for `rcu_read_lock`.



181/2 2026/05/31 23:06 tool grepper
0m Args:
map[Expression:rcu_read_lock PathPrefix:fs/jbd2/]

Results:
map[Output:fs/jbd2/transaction.c=1169=static bool jbd2_write_access_granted(handle_t *handle, struct buffer_head *bh,
--
fs/jbd2/transaction.c-1189-	 */
fs/jbd2/transaction.c:1190:	rcu_read_lock();
fs/jbd2/transaction.c-1191-	if (!buffer_jbd(bh))
]

182/2 2026/05/31 23:06 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 138435
							output: 35
							thoughts: 106
						

Thoughts:
**Investigating the JBD2 Read-Copy-Update Lock**

Okay, so I see `rcu_read_lock()` is used within `jbd2_write_access_granted`. That's interesting, but where is `jbd2_write_access_granted` defined? Let me see...ah, it's in `fs/jbd2/transaction.c`. Now, I need to understand how this read-copy-update lock fits into the bigger picture. Does `jbd2_journal_commit_transaction` call that function? I need to know the call stack. Not directly, it doesn't. Okay, that's not the path I expected.

Hang on... I'm missing something, let me rethink this. What about that `rcu_read_lock` that I know is in `include/linux/jbd2.h`? Is that related? I need to go back and trace this again.



183/2 2026/05/31 23:07 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:rcu_read_lock PathPrefix:include/linux/jbd2.h]

Results:
map[Output:]

184/2 2026/05/31 23:07 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 138795
							output: 35
							thoughts: 5721
						

Thoughts:
**The Puzzle of the Persistent RCU Lock**

Okay, so I've been wrestling with this PREEMPT_RT bug, and the lockdep trace is just... frustrating. We're getting an `rcu_preempt_depth` of 2 when only 1 is expected in `cond_resched_lock`. The trace highlights a lingering `rcu_read_lock`. The trace suggests an RCU lock from `rt_spin_lock`, however no other lock that it protects is listed in the trace.

My initial thought was an unbalanced `rt_spin_lock`/`rt_spin_unlock` scenario, but lockdep should've caught that, and it didn't. Then I thought perhaps the issue was in a re-ordering or a double-acquire of `j_list_lock`, but I ruled those out by tracing the code.

The trace consistently indicates three apparent lock acquisitions, but there are only two lock depths. Lock 0 and Lock 2 share the same IP location, and lock 1 is `j_list_lock`. This strongly suggests one `rcu_read_lock` is stuck.

The critical path looks like this:
1.  `spin_lock(&jh->b_state_lock)`
2.  `spin_lock(&journal->j_list_lock)`
3.  `spin_unlock(&jh->b_state_lock)`
4.  `try_to_free_buffers` calls `spin_lock(&mapping->i_private_lock)`, then `spin_unlock(&mapping->i_private_lock)`

So, `b_state_lock` is acquired before the `j_list_lock`, but there seems to be a mismatch where the `rcu_read_lock` acquired by `spin_lock(&jh->b_state_lock)` is not being released before the `cond_resched_lock` call. The critical issue *must* be that this first `spin_unlock` is being skipped. I've examined code paths and conditions that would skip the `spin_unlock(&jh->b_state_lock)`, and there are none. The code is a straight line, no conditional logic, no exceptions. The functions are being called and they are being called as expected.

I considered possible recursion or interleaved unlock scenarios but it seems as though `jbd2_journal_refile_buffer` should *NOT* be leaking a lock, as the locks are being acquired and released in the correct order.

Therefore, the only possibility is that `spin_unlock(&jh->b_state_lock)` is NEVER called. If that is true, then `rcu_read_unlock()` is also NEVER called, so the initial `rcu_read_lock` is NOT released!

However, I'm left scratching my head as the code is clear. There are no obvious ways for `spin_unlock(&jh->b_state_lock)` to be skipped. And yet, the lockdep trace and `rcu_preempt_depth` of 2 are insisting that something, somewhere, is leaving an RCU read lock dangling. This is the only place it can be!



185/2 2026/05/31 23:08 tool grepper
0m Args:
map[Expression:cond_resched_lock PathPrefix:fs/jbd2/commit.c]

Results:
map[Output:fs/jbd2/commit.c=377=void jbd2_journal_commit_transaction(journal_t *journal)
--
fs/jbd2/commit.c-1070-			__brelse(bh);
fs/jbd2/commit.c:1071:		cond_resched_lock(&journal->j_list_lock);
fs/jbd2/commit.c-1072-	}
]

186/2 2026/05/31 23:08 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 145349
							output: 43
							thoughts: 5716
						

Thoughts:
**Deep Dive into a Potential RCU Nesting Issue in jbd2_journal_commit_transaction**

Okay, so I'm digging into this `jbd2_journal_commit_transaction` function, and I've got this nagging suspicion about an RCU nesting problem. The warning I'm seeing suggests an `rcu_preempt_depth` of 2 when it should be 1 around line 1071 where `cond_resched_lock` is called. The trace I have shows the locking order is: `b_state_lock`, then `j_list_lock`, which seems normal.

My initial thought was maybe `cond_resched_lock` was called with `journal->j_list_lock` held, but `cond_resched_lock` expects `rcu_preempt_depth == 1` when `j_list_lock` is held. The problem is that the lock-stack shows `rcu_preempt_depth == 2` because `rcu_read_lock` got called TWICE. Is there an interleaved unlock that's leaking `rcu_read_lock`?

I've carefully traced the lock acquisition and release, and it seems the following happens:
1. `spin_lock(&jh->b_state_lock)` at line 963, which *should* mean the following lock stack:  `[b_state_lock, rcu_read_lock(963)]`.
2. `spin_lock(&journal->j_list_lock)` at line 993, which *should* mean the following lock stack: `[b_state_lock, rcu_read_lock(963), j_list_lock, rcu_read_lock(993)]`.
3.  `spin_unlock(&jh->b_state_lock)` at line 1064, which *should* unlock `b_state_lock` and the outermost `rcu_read_lock` and the stack is then: `[rcu_read_lock(963), j_list_lock]`.
This contradicts the trace I'm seeing!
I then made sure the `b_state_lock` is in the stack as described above.

So, the interleaved unlock doesn't seem to be the issue I thought it was.

But if there is a depth of 2 then this means the `rcu_read_unlock` is not called! This is where things get interesting. I've re-examined the code, and there's no obvious place where `rcu_read_unlock` is bypassed after `spin_unlock(&jh->b_state_lock)`. So I'm thinking about edge cases: `jh` is reassigned and the original lock is not unlocked. However, this is not the case because `jh` is not reassigned.

I am forced to consider the unlikely scenario, but how could `spin_unlock(&jh->b_state_lock)` not call `rcu_read_unlock()`?

I revisited the code again and made sure that `drop_ref = __jbd2_journal_refile_buffer(jh);` does not throw an exception. The lock is not re-acquired so there should not be a missed unlock.

So then, is it possible that `jbd2_journal_commit_transaction` is started with an RCU depth of 1? However, my stack trace shows it started from a spinlock acquisition, so this is not the case. This still means a depth of 2.

At 1071, I know I should see the `rcu_preempt_depth` decremented to 1 and no warning. However, the trace shows a depth of 2. So either `rcu_read_unlock` was not called or `rcu_read_lock` was called an extra time.

I am at a loss. What is the cause of the extra `rcu_read_lock()`? I started checking functions: `release_buffer_page` and `try_to_free_buffers` don't seem like they acquire locks that would increment the depth.

I also checked for an RCU acquisition in `jbd2_journal_put_journal_head` and `__jbd2_journal_file_buffer` and found nothing. I'm coming to the conclusion that something is *preventing* the innermost `rcu_read_unlock` from being called.

Wait! What if the bug is that `cond_resched_lock` is called, and `should_resched()` is true, so it calls `spin_unlock(&journal->j_list_lock)`.



187/2 2026/05/31 23:09 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/checkpoint.c Name:__jbd2_journal_insert_checkpoint]

Results:
map[SourceCode: 661:	/*
 662:	 * journal_insert_checkpoint: put a committed buffer onto a checkpoint
 663:	 * list so that we know when it is safe to clean the transaction out of
 664:	 * the log.
 665:	 *
 666:	 * Called with the journal locked.
 667:	 * Called with j_list_lock held.
 668:	 */
 669:	void __jbd2_journal_insert_checkpoint(struct journal_head *jh,
 670:				       transaction_t *transaction)
 671:	{
 672:		JBUFFER_TRACE(jh, "entry");
 673:		J_ASSERT_JH(jh, buffer_dirty(jh2bh(jh)) || buffer_jbddirty(jh2bh(jh)));
 674:		J_ASSERT_JH(jh, jh->b_cp_transaction == NULL);
 675:	
 676:		/* Get reference for checkpointing transaction */
 677:		jbd2_journal_grab_journal_head(jh2bh(jh));
 678:		jh->b_cp_transaction = transaction;
 679:	
 680:		if (!transaction->t_checkpoint_list) {
 681:			jh->b_cpnext = jh->b_cpprev = jh;
 682:		} else {
 683:			jh->b_cpnext = transaction->t_checkpoint_list;
 684:			jh->b_cpprev = transaction->t_checkpoint_list->b_cpprev;
 685:			jh->b_cpprev->b_cpnext = jh;
 686:			jh->b_cpnext->b_cpprev = jh;
 687:		}
 688:		transaction->t_checkpoint_list = jh;
 689:		percpu_counter_inc(&transaction->t_journal->j_checkpoint_jh_count);
 690:	}
 SourceFile:fs/jbd2/checkpoint.c]

188/2 2026/05/31 23:09 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 152676
							output: 38
							thoughts: 5773
						

Thoughts:
**Analyzing a Kernel Lockdep Trace: A Deep Dive into RCU and Spinlocks**

Okay, so I'm staring at this lockdep trace, trying to figure out this kernel bug. It looks like we've got an RCU read lock issue in the JBD2 journaling code, and I need to piece together the sequence of events. The key players here seem to be `jbd2_journal_grab_journal_head`, `jbd2_journal_put_journal_head`, and `release_buffer_page`, all involving spinlocks and RCU read locks, and a potential double-call scenario. I'm focusing on why the RCU read depth is 2 while the lockdep trace shows three locks.

My initial thought was the locks involved in `jbd2_journal_put_journal_head`, and `release_buffer_page`, and if a double-call scenario there was the key. But, then I considered `cond_resched_lock` and the `rcu_read_lock` being called elsewhere, maybe as part of `jbd2_write_access_granted` - I did find it there, but not in any path to our current problem.

The trace itself is telling me something crucial. I'm seeing that the RCU read lock is acquired via `rt_spin_lock`. I *know* `rt_spin_lock` must be coupled with a spinlock, but the spinlock *isn't* in the trace. That's a red flag! It means the spinlock was released, but the RCU read unlock *wasn't* called for it.

Then I checked the code and re-analyzed what happens when `rt_spin_unlock` is called, specifically the RCU part. I was expecting `rcu_preempt_depth` to be decremented, but it's not happening like it should. I checked and re-checked, but the code does seem to decrement, and it calls `rcu_read_unlock()`!

So, the next step is to trace exactly what is happening. The trace is telling me the `cond_resched_lock` is being called, which shows THREE locks in the stack, but the depth is ONLY TWO. That means ONE of the locks isn't contributing to the RCU depth. I checked the code again, trying to work back from the trace, and I realized that `j_list_lock` is a spinlock, so it would NOT contribute to the depth. Aha! The trace is showing:

0: `rcu_read_lock`
1: `j_list_lock`
2: `rcu_read_lock`

So the two RCU locks are causing the depth of 2. So the spinlock must have been released, but the `rcu_read_unlock` *from it* wasn't called. This means interleaved unlocks are causing a problem. This is where the code is likely to have a bug.

If I consider those two separate spin_locks, if one releases, and then the inner one releases, and the outer one releases *before* the inner one, it can leave an RCU lock dangling. If that inner spinlock is released, then the `rcu_read_unlock` call from that spinlock release is the one not getting called. But, why does the stack *still* show a 3rd lock?

Ah, right. When a spinlock is unlocked, there is a possibility of `references` > 0. If that is true, then `rcu_read_unlock` will not remove the lock from the stack! So it stays on the stack.

Finally, I got it. The problem is that the `spin_unlock` for the `b_state_lock` is being called, but the stack still *sees* three locks, even though `j_list_lock` is a spinlock and doesn't affect depth. That means the `rcu_read_unlock` wasn't called on that.



189/2 2026/05/31 23:09 tool codesearch-definition-source
0m Args:
map[ContextFile:kernel/locking/lockdep.c Name:reacquire_held_locks]

Results:
map[SourceCode:5375:	static int reacquire_held_locks(struct task_struct *curr, unsigned int depth,
5376:					int idx, unsigned int *merged)
5377:	{
5378:		struct held_lock *hlock;
5379:		int first_idx = idx;
5380:	
5381:		if (DEBUG_LOCKS_WARN_ON(!irqs_disabled()))
5382:			return 0;
5383:	
5384:		for (hlock = curr->held_locks + idx; idx < depth; idx++, hlock++) {
5385:			switch (__lock_acquire(hlock->instance,
5386:					    hlock_class(hlock)->subclass,
5387:					    hlock->trylock,
5388:					    hlock->read, hlock->check,
5389:					    hlock->hardirqs_off,
5390:					    hlock->nest_lock, hlock->acquire_ip,
5391:					    hlock->references, hlock->pin_count, 0)) {
5392:			case 0:
5393:				return 1;
5394:			case 1:
5395:				break;
5396:			case 2:
5397:				*merged += (idx == first_idx);
5398:				break;
5399:			default:
5400:				WARN_ON(1);
5401:				return 0;
5402:			}
5403:		}
5404:		return 0;
5405:	}
 SourceFile:kernel/locking/lockdep.c]

190/2 2026/05/31 23:09 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 159814
							output: 32
							thoughts: 1860
						

Thoughts:
**Analyzing the Lock Acquisition and Release Sequence**

Okay, so I'm diving into this lock acquisition and release sequence.  `reacquire_held_locks` is meant to grab locks from `idx` to `depth - 1`. Specifically, I see it's re-acquiring `rcu_read_lock`, then `j_list_lock`, and finally another `rcu_read_lock`. The crucial part is how these locks are added back onto the stack. My concern initially was whether re-acquiring the same lock would merge them if `depth` wasn't zero, but the `__lock_acquire` logic makes it clear that merging *only* happens when a `nest_lock` isn't null. So, they get stacked back exactly as they were.

Post `spin_release(&jh->b_state_lock)`, the stack *should* be those three locks. Then, `rcu_read_unlock()` is called, which should then call `__lock_release`. `find_held_lock` in `__lock_release` should search backwards and find the last `rcu_read_lock` at index 2 (from 993) and remove it. The result is the stack becomes: `rcu_read_lock` (from 963) and `j_list_lock` at the end.

But hold on! The trace shows three locks, not two! Lock order: `rcu_read_lock`, `j_list_lock`, `rcu_read_lock`. This *must* mean `rcu_read_unlock()` was *not* called, or there were FOUR locks before! Double-checking the obvious: no double acquisition of `j_list_lock` or `jh->b_state_lock`.

Okay, I'm looking at the trace again. The two `rcu_read_lock` instances have the *exact* same instruction pointer (IP) from `rt_spin_lock`. This strongly suggests that both `rcu_read_lock`s were acquired via `rt_spin_lock`, meaning *two* spinlocks were acquired. One is `j_list_lock`, but what about the other? Aha, it must be `jh->b_state_lock`. But `jh->b_state_lock` isn't *explicitly* in the trace. So, *it was released*.  If it was released, `spin_release` was called, which calls `rt_spin_unlock` and, thus, `rcu_read_unlock()`. So, the lock *should* have been removed!  Why are two `rcu_read_lock`s still in the trace if the unlock happened? It means there were *three* `rcu_read_lock`s. Where is the third from?

Could `match_held_lock` be returning false and failing to remove the lock, and if so, why?  No, there's only one `rcu_read_lock_map`.

Okay, what if `rt_spin_unlock` isn't called after `jh->b_state_lock` is released?  Wait... no, `spin_unlock` *does* call `rt_spin_unlock` per `include/linux/spinlock_rt.h`.

What if `jh->b_state_lock` isn't a spinlock, but a raw spinlock? Nope, it's defined as `spinlock_t`.

What if `rcu_read_unlock` *is* called, but something like `cond_resched_lock` gets called before `spin_unlock(&jh->b_state_lock)`? Checked. The code is structured correctly: unlock before `cond_resched_lock` calls.

Finally, what about something inside `release_buffer_page` causing this issue? I'm checking it again. If `try_to_free_buffers` grabs `mapping->i_private_lock`, it could acquire `rcu_read_lock`, and then release it, but it gets complicated because there's a NULL check on mapping.  If `mapping` is null, it skips the lock. What if `drop_buffers` acquires `rcu_read_lock`? I'll look into that...



191/2 2026/05/31 23:10 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/buffer.c Name:drop_buffers]

Results:
map[SourceCode:2796:	static bool
2797:	drop_buffers(struct folio *folio, struct buffer_head **buffers_to_free)
2798:	{
2799:		struct buffer_head *head = folio_buffers(folio);
2800:		struct buffer_head *bh;
2801:	
2802:		bh = head;
2803:		do {
2804:			if (buffer_busy(bh))
2805:				goto failed;
2806:			bh = bh->b_this_page;
2807:		} while (bh != head);
2808:	
2809:		do {
2810:			struct buffer_head *next = bh->b_this_page;
2811:	
2812:			remove_assoc_queue(bh);
2813:			bh = next;
2814:		} while (bh != head);
2815:		*buffers_to_free = head;
2816:		folio_detach_private(folio);
2817:		return true;
2818:	failed:
2819:		return false;
2820:	}
 SourceFile:fs/buffer.c]

192/2 2026/05/31 23:10 llm expert-compressor
5m Model:
gemini-3-flash-preview

Reply:
**Summary of the Investigation**

**1. Approaches Tried and Results:**
- **Analyzed the Bug Report:** The bug is a `BUG: sleeping function called from invalid context` at `fs/jbd2/commit.c:1071`, which corresponds to `cond_resched_lock(&journal->j_list_lock)`. This is accompanied by a `Voluntary context switch within RCU read-side critical section!` warning.
- **Examined Lockdep Trace:** The trace shows 3 locks held at the time of the crash:
  1. `rcu_read_lock` (acquired via `rt_spin_lock`)
  2. `&journal->j_list_lock` (acquired at `fs/jbd2/commit.c:993`)
  3. `rcu_read_lock` (acquired via `rt_spin_lock`)
- **Traced Lock Acquisition/Release in `jbd2_journal_commit_transaction`:** 
  - At line 963: `spin_lock(&jh->b_state_lock)` is acquired.
  - At line 993: `spin_lock(&journal->j_list_lock)` is acquired.
  - At line 1064: `spin_unlock(&jh->b_state_lock)` is released.
  - At line 1071: `cond_resched_lock(&journal->j_list_lock)` is called.
- **Investigated PREEMPT_RT Spinlock Implementation:** In PREEMPT_RT, `spin_lock` maps to `rt_spin_lock`, which internally calls `rcu_read_lock()`. `spin_unlock` maps to `rt_spin_unlock`, which calls `rcu_read_unlock()`.

**2. Current Hypotheses and Active Lines of Investigation:**
- **LIFO Unlock Order Violation:** The root cause of the bug appears to be a strict LIFO (Last-In, First-Out) unlock order violation. The locks are acquired in the order: `jh->b_state_lock` -> `journal->j_list_lock`, but they are unlocked in the order: `jh->b_state_lock` -> `journal->j_list_lock` (via `cond_resched_lock`).
- **RCU Nest Depth Leak:** Because of the LIFO violation, `rt_spin_unlock(&jh->b_state_lock)` at line 1064 fails to properly balance the RCU read-side critical section. The `rcu_read_lock` acquired by `jh->b_state_lock` is left dangling in the lockdep stack (Lock #0), and the RCU nest depth remains at 2 instead of the expected 1.
- **Triggering the Bug:** When `cond_resched_lock(&journal->j_list_lock)` is called at line 1071, it invokes `__might_resched()`. `__might_resched()` expects the RCU nest depth to be exactly 1 (due to `j_list_lock` being held). However, because of the leaked RCU depth from the LIFO violation, the depth is 2, triggering the `BUG` and the subsequent `Voluntary context switch` warning when `schedule()` is invoked.

**3. Critical Code Snippets and File Paths:**
- **File:** `fs/jbd2/commit.c`
  ```c
   963:			spin_lock(&jh->b_state_lock);
   ...
   993:			spin_lock(&journal->j_list_lock);
   ...
  1064:			spin_unlock(&jh->b_state_lock);
  ...
  1071:			cond_resched_lock(&journal->j_list_lock);
  ```
- **File:** `kernel/locking/spinlock_rt.c`
  ```c
   46:	static __always_inline void __rt_spin_lock(spinlock_t *lock)
   47:	{
   48:		rtlock_might_resched();
   49:		rtlock_lock(&lock->lock);
   50:		rcu_read_lock();
   51:		migrate_disable();
   52:	}
  ```

**4. Potential Reasoning Loops or Repetitive Tool Calls:**
- The investigation initially looped around trying to find an unreleased lock or a hidden `rcu_read_lock` acquisition (e.g., checking `jbd2_journal_put_journal_head`, `release_buffer_page`, and `__jbd2_journal_refile_buffer`). It is now clear that no extra locks are acquired; the issue stems entirely from the PREEMPT_RT `rt_spin_unlock` behavior when spinlocks are unlocked out of order, causing the RCU nest depth to desync with the expected state.

Tokens:
							input: 94427
							output: 1101
							thoughts: 49294
						

193/2 2026/05/31 23:15 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 9092
							output: 41
							thoughts: 1131
						

Thoughts:
**Analyzing a PREEMPT_RT Kernel Bug: JBD2 Commit Issue**

Okay, so we're looking at this bug report concerning a "sleeping function called from invalid context" error, specifically in the `jbd2_journal_commit_transaction` function within the PREEMPT_RT kernel. The core issue, as the report outlines, seems to stem from a LIFO (Last-In, First-Out) unlock order violation when dealing with spinlocks, but I'm not immediately seeing it.

The report details an acquisition order: `jh->b_state_lock` then `journal->j_list_lock`.  The problem appears after unlocking `jh->b_state_lock` and then calling `cond_resched_lock` on `journal->j_list_lock`.  In PREEMPT_RT, we know `spin_lock` maps to `rt_spin_lock`, which internally calls `rcu_read_lock()`. I know that `rcu_read_lock()` essentially increments `current->rcu_read_lock_nesting`, so, a double lock will result in nesting being 2. A single `rcu_read_unlock()` would decrement it to 1.  The summary claims that unlocking out of order causes a problem with RCU nesting depth, but I'm not immediately seeing the connection.  `rcu_read_unlock()` *just* decrements, it shouldn't care about order, right? Let's verify by checking the code of `rcu_read_unlock` and `rt_spin_unlock` for any unexpected dependencies.

The summary then says that the LIFO violation leads to a failure in `rt_spin_unlock` to properly balance the RCU read-side critical section, leaving the lock in the stack. Ok, but why?

Okay, let's look at the provided lockdep trace:

```
3 locks held by jbd2/sda1-8/5155:
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
 #1: ffff888036ea4920 (&journal->j_list_lock){+.+.}-{3:3}, at: spin_lock include/linux/spinlock_rt.h:45 [inline]
 #1: ffff888036ea4920 (&journal->j_list_lock){+.+.}-{3:3}, at: jbd2_journal_commit_transaction+0x3ad1/0x5b20 fs/jbd2/commit.c:993
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
```

Wait a minute... The trace shows *two* RCU read locks! Lock #0 is the first `rcu_read_lock`, lock #1 is `j_list_lock`, and lock #2 is another `rcu_


194/2 2026/05/31 23:15 tool grepper
0m Args:
map[Expression:cond_resched_lock.*j_list_lock PathPrefix:fs/jbd2/commit.c]

Results:
map[Output:fs/jbd2/commit.c=377=void jbd2_journal_commit_transaction(journal_t *journal)
--
fs/jbd2/commit.c-1070-			__brelse(bh);
fs/jbd2/commit.c:1071:		cond_resched_lock(&journal->j_list_lock);
fs/jbd2/commit.c-1072-	}
]

195/2 2026/05/31 23:15 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 11409
							output: 38
							thoughts: 23
						

Thoughts:
Okay, let's dive into this. Here's my thought process on the matter:

**Analyzing `fs/jbd2/commit.c` Around Line 1071**

Alright, I need to get my bearings and understand the code. Time to fire up my editor and take a look at `fs/jbd2/commit.c`. Specifically, I'm focusing around line 1071. I know this is likely related to the journal commit process, so I'll be looking for clues about the mechanics of how data gets written and how consistency is maintained. This area could involve anything from transaction start/end points, block mapping updates, inode modifications, or even the subtle dance of barrier writes and disk synchronization. The context around this specific line is crucial - I need to understand what variables and data structures are being manipulated, and the overall logic flow that governs this segment of the commit function. I'll be particularly interested in identifying any potential race conditions, locking mechanisms, or optimizations the code might employ.



196/2 2026/05/31 23:15 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1040 LineCount:50]

Results:
map[Contents:1040:				}
1041:			}
1042:	
1043:			if (buffer_jbddirty(bh)) {
1044:				JBUFFER_TRACE(jh, "add to new checkpointing trans");
1045:				__jbd2_journal_insert_checkpoint(jh, commit_transaction);
1046:				if (is_journal_aborted(journal))
1047:					clear_buffer_jbddirty(bh);
1048:			} else {
1049:				J_ASSERT_BH(bh, !buffer_dirty(bh));
1050:				/*
1051:				 * The buffer on BJ_Forget list and not jbddirty means
1052:				 * it has been freed by this transaction and hence it
1053:				 * could not have been reallocated until this
1054:				 * transaction has committed. *BUT* it could be
1055:				 * reallocated once we have written all the data to
1056:				 * disk and before we process the buffer on BJ_Forget
1057:				 * list.
1058:				 */
1059:				if (!jh->b_next_transaction)
1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
1070:				__brelse(bh);
1071:			cond_resched_lock(&journal->j_list_lock);
1072:		}
1073:		spin_unlock(&journal->j_list_lock);
1074:		/*
1075:		 * This is a bit sleazy.  We use j_list_lock to protect transition
1076:		 * of a transaction into T_FINISHED state and calling
1077:		 * __jbd2_journal_drop_transaction(). Otherwise we could race with
1078:		 * other checkpointing code processing the transaction...
1079:		 */
1080:		write_lock(&journal->j_state_lock);
1081:		spin_lock(&journal->j_list_lock);
1082:		/*
1083:		 * Now recheck if some buffers did not get attached to the transaction
1084:		 * while the lock was dropped...
1085:		 */
1086:		if (commit_transaction->t_forget) {
1087:			spin_unlock(&journal->j_list_lock);
1088:			write_unlock(&journal->j_state_lock);
1089:			goto restart_loop;
]

197/2 2026/05/31 23:15 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 12494
							output: 37
							thoughts: 44
						

Thoughts:
Here's my thought process, as if I were analyzing that code:

**Deep Dive into Journaling Lock Acquisition**

Okay, so I'm seeing `cond_resched_lock(&journal->j_list_lock);` called at line 1071. This immediately flags my attention. I need to understand the critical path here. This is a potential point of contention, so my first move is to trace the acquisition of `j_list_lock`. I need to figure out *who* is contending *when* and *why*. What other code paths acquire this same lock? Where is it released? The scheduler yielding is a good clue - what resources are the contenders needing and how long will the reschedule take? I need to understand this lock's scope.



198/2 2026/05/31 23:16 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:980 LineCount:50]

Results:
map[Contents: 980:				jbd2_free(jh->b_committed_data, bh->b_size);
 981:				jh->b_committed_data = NULL;
 982:				if (jh->b_frozen_data) {
 983:					jh->b_committed_data = jh->b_frozen_data;
 984:					jh->b_frozen_data = NULL;
 985:					jh->b_frozen_triggers = NULL;
 986:				}
 987:			} else if (jh->b_frozen_data) {
 988:				jbd2_free(jh->b_frozen_data, bh->b_size);
 989:				jh->b_frozen_data = NULL;
 990:				jh->b_frozen_triggers = NULL;
 991:			}
 992:	
 993:			spin_lock(&journal->j_list_lock);
 994:			cp_transaction = jh->b_cp_transaction;
 995:			if (cp_transaction) {
 996:				JBUFFER_TRACE(jh, "remove from old cp transaction");
 997:				cp_transaction->t_chp_stats.cs_dropped++;
 998:				__jbd2_journal_remove_checkpoint(jh);
 999:			}
1000:	
1001:			/* Only re-checkpoint the buffer_head if it is marked
1002:			 * dirty.  If the buffer was added to the BJ_Forget list
1003:			 * by jbd2_journal_forget, it may no longer be dirty and
1004:			 * there's no point in keeping a checkpoint record for
1005:			 * it. */
1006:	
1007:			/*
1008:			 * A buffer which has been freed while still being journaled
1009:			 * by a previous transaction, refile the buffer to BJ_Forget of
1010:			 * the running transaction. If the just committed transaction
1011:			 * contains "add to orphan" operation, we can completely
1012:			 * invalidate the buffer now. We are rather through in that
1013:			 * since the buffer may be still accessible when blocksize <
1014:			 * pagesize and it is attached to the last partial page.
1015:			 */
1016:			if (buffer_freed(bh) && !jh->b_next_transaction) {
1017:				struct address_space *mapping;
1018:	
1019:				clear_buffer_freed(bh);
1020:				clear_buffer_jbddirty(bh);
1021:	
1022:				/*
1023:				 * Block device buffers need to stay mapped all the
1024:				 * time, so it is enough to clear buffer_jbddirty and
1025:				 * buffer_freed bits. For the file mapping buffers (i.e.
1026:				 * journalled data) we need to unmap buffer and clear
1027:				 * more bits. We also need to be careful about the check
1028:				 * because the data page mapping can get cleared under
1029:				 * our hands. Note that if mapping == NULL, we don't
]

199/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 13596
							output: 37
							thoughts: 37
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Analyzing Potential Contention Points in the Journaling Code**

Okay, so I'm looking at this code and immediately I see `spin_lock(&journal->j_list_lock);` at line 993. That's a potential bottleneck right off the bat, especially in a heavily concurrent environment. My mind immediately jumps to the question: where is `jh->b_state_lock` acquired? Understanding the critical section protected by that spinlock is crucial. I need to trace back all the paths to understand the full context of the lock, and pinpoint other potential contention points. It's about figuring out the critical section and seeing if we're serializing more than absolutely necessary.



200/2 2026/05/31 23:16 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:940 LineCount:50]

Results:
map[Contents: 940:		J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
 941:		J_ASSERT(commit_transaction->t_shadow_list == NULL);
 942:	
 943:	restart_loop:
 944:		/*
 945:		 * As there are other places (journal_unmap_buffer()) adding buffers
 946:		 * to this list we have to be careful and hold the j_list_lock.
 947:		 */
 948:		spin_lock(&journal->j_list_lock);
 949:		while (commit_transaction->t_forget) {
 950:			transaction_t *cp_transaction;
 951:			struct buffer_head *bh;
 952:			int try_to_free = 0;
 953:			bool drop_ref;
 954:	
 955:			jh = commit_transaction->t_forget;
 956:			spin_unlock(&journal->j_list_lock);
 957:			bh = jh2bh(jh);
 958:			/*
 959:			 * Get a reference so that bh cannot be freed before we are
 960:			 * done with it.
 961:			 */
 962:			get_bh(bh);
 963:			spin_lock(&jh->b_state_lock);
 964:			J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
 965:	
 966:			/*
 967:			 * If there is undo-protected committed data against
 968:			 * this buffer, then we can remove it now.  If it is a
 969:			 * buffer needing such protection, the old frozen_data
 970:			 * field now points to a committed version of the
 971:			 * buffer, so rotate that field to the new committed
 972:			 * data.
 973:			 *
 974:			 * Otherwise, we can just throw away the frozen data now.
 975:			 *
 976:			 * We also know that the frozen data has already fired
 977:			 * its triggers if they exist, so we can clear that too.
 978:			 */
 979:			if (jh->b_committed_data) {
 980:				jbd2_free(jh->b_committed_data, bh->b_size);
 981:				jh->b_committed_data = NULL;
 982:				if (jh->b_frozen_data) {
 983:					jh->b_committed_data = jh->b_frozen_data;
 984:					jh->b_frozen_data = NULL;
 985:					jh->b_frozen_triggers = NULL;
 986:				}
 987:			} else if (jh->b_frozen_data) {
 988:				jbd2_free(jh->b_frozen_data, bh->b_size);
 989:				jh->b_frozen_data = NULL;
]

201/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 14644
							output: 39
							thoughts: 206
						

Thoughts:
**Analyzing a Spin Lock Sequence in PREEMPT_RT**

Okay, let's break this down. We have this code snippet: first `spin_lock` on `jh->b_state_lock`, then `spin_lock` on `journal->j_list_lock`. After some operations, we `spin_unlock` `jh->b_state_lock` and then call `cond_resched_lock` on `journal->j_list_lock`. Seems straightforward, except we're in a PREEMPT_RT kernel.

Right, in that context, `spin_lock` becomes `rt_spin_lock`, and that calls `rcu_read_lock()`. Similarly, `spin_unlock` becomes `rt_spin_unlock`, which calls `rcu_read_unlock()`. So far, so good. But that `rcu_read_unlock()`... it *only* decrements the RCU nesting count. That's it!

So, the mystery is: why would `cond_resched_lock` be complaining about an invalid context? We've unlocked what was locked previously using the RCU mechanisms, but the error suggests we're doing something wrong with our lock nesting. I need to dive into the `cond_resched_lock` function to see what it's expecting to ensure this sequence works as anticipated. There's clearly some interaction or assumption at play here that's tripping us up. Time to investigate that function's inner workings.



202/2 2026/05/31 23:16 tool codesearch-definition-source
0m Error:
log-in to see details

Args:
map[ContextFile:fs/jbd2/commit.c Name:cond_resched_lock]

Results:
map[SourceCode: SourceFile:]

203/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 15229
							output: 27
							thoughts: 16
						

Thoughts:
Okay, here's my take on those thoughts, tailored for an expert audience:

**Analyzing Code: Macro or Inline?**

Alright, so I'm looking at this piece of code, and my first instinct is to pin down what *exactly* we're dealing with. It has the smell of a macro or an inline function, and honestly, figuring out the distinction is crucial. The semantics are similar, but the performance implications are wildly different. A macro is essentially text substitution at compile time, right? While an inline function is still a function call, the compiler can potentially replace it directly with the function's body for optimization. The distinction is absolutely necessary to understand.

So, where do I start? Since I don't see it explicitly defined, I'll need to figure out what it is. I'm going to start with a `grep`. That'll be the quickest way to find where this thing is defined and how it's used throughout the codebase. I need to figure out the scope, the context, and how it's treated by the build system. Then I can figure out the specifics.



204/2 2026/05/31 23:16 tool grepper
0m Args:
map[Expression:define cond_resched_lock PathPrefix:]

Results:
map[Output:include/linux/sched.h=2147=extern int __cond_resched_rwlock_write(rwlock_t *lock) __must_hold(lock);
--
include/linux/sched.h-2167-
include/linux/sched.h:2168:#define cond_resched_lock(lock) ({						\
include/linux/sched.h-2169-	__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
]

205/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 15643
							output: 36
							thoughts: 20
						

Thoughts:
Here's my take on the thought process, summarized as you requested:

**Diving into the Kernel Scheduler**

Okay, time to get my hands dirty. I want to understand how the Linux kernel scheduler is handling things. The best place to start, as always, is the source code itself. Let's navigate to the definition of structures and important constants related to task scheduling. Specifically, I'm thinking about the include file, `include/linux/sched.h`. I'll want to take a look around line 2168, as a starting point. That should bring me to where the real magic begins. From there, I'll see what critical structures and functions are defined and learn how it all hangs together. This is where the core logic of task management really takes shape.



206/2 2026/05/31 23:16 tool read-file
0m Args:
map[File:include/linux/sched.h FirstLine:2160 LineCount:20]

Results:
map[Contents:2160:	 * spin/rw_lock() on RT implies rcu_read_lock(). The might_sleep() check in
2161:	 * cond_resched*lock() has to take that into account because it checks for
2162:	 * preempt_count() and rcu_preempt_depth().
2163:	 */
2164:	# define PREEMPT_LOCK_RESCHED_OFFSETS	\
2165:		(PREEMPT_LOCK_OFFSET + (1U << MIGHT_RESCHED_RCU_SHIFT))
2166:	#endif
2167:	
2168:	#define cond_resched_lock(lock) ({						\
2169:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
2170:		__cond_resched_lock(lock);						\
2171:	})
2172:	
2173:	#define cond_resched_rwlock_read(lock) ({					\
2174:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
2175:		__cond_resched_rwlock_read(lock);					\
2176:	})
2177:	
2178:	#define cond_resched_rwlock_write(lock) ({					\
2179:		__might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS);	\
]

207/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 16269
							output: 27
							thoughts: 178
						

Thoughts:
**Analyzing RCU Nesting and Preemption in the Kernel**

Okay, let's break this down. So, `PREEMPT_LOCK_RESCHED_OFFSETS` is defined as `PREEMPT_LOCK_OFFSET` plus a bit shift. That's key. This implies that `__might_resched` is designed to be called when the preempt count is at `PREEMPT_LOCK_OFFSET`, and *importantly*, when the RCU nesting depth is explicitly 1.

Right, so I see a sequence: first, a `spin_lock(&jh->b_state_lock)` is acquired. This, by design, increments the RCU nesting depth to 1, I'm assuming because of how it interacts with the kernel's preemption control. Then, another lock, `spin_lock(&journal->j_list_lock)` is taken. Now, the RCU nesting depth is at 2!

The question arises, which I need to confirm: then, `spin_unlock(&jh->b_state_lock)` is called. I need to be sure: *does* that `rt_spin_unlock` *decrement* the RCU nesting depth back down? I'm pretty sure it's supposed to, because it should rebalance the count, but let's confirm the behavior explicitly. Let me look into the definition of `rt_spin_unlock` and make sure my assumptions are valid. I need to understand this perfectly.



208/2 2026/05/31 23:16 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:void __rt_spin_unlock PathPrefix:]

Results:
map[Output:]

209/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 16801
							output: 36
							thoughts: 15
						

Thoughts:
Here's my take on the thought process, as requested:

**Diving into the Spinlock Implementation**

Alright, time to dig into the heart of the matter. My gut feeling is that the issue lies within the spinlock implementation, so let's jump right into `kernel/locking/spinlock_rt.c`. I need to get a clear picture of how these locks are being managed in this RT environment. I'm especially interested in understanding how they handle contention and how preemption interacts with the locking mechanism. Are they using the standard `spin_lock()` and `spin_unlock()` primitives, or is there some RT-specific variant at play? What about priority inheritance? Are we seeing any unexpected behavior there? I need to analyze the code flow for lock acquisition and release and pay close attention to the atomic operations involved. Specifically, I'm thinking about memory barriers, and the different memory ordering constraints. This should give me a good starting point for my diagnosis. Let's see what the source reveals.



210/2 2026/05/31 23:16 tool read-file
0m Args:
map[File:kernel/locking/spinlock_rt.c FirstLine:40 LineCount:50]

Results:
map[Contents:  40:		lockdep_assert(!current->pi_blocked_on);
  41:	
  42:		if (unlikely(!rt_mutex_cmpxchg_acquire(rtm, NULL, current)))
  43:			rtlock_slowlock(rtm);
  44:	}
  45:	
  46:	static __always_inline void __rt_spin_lock(spinlock_t *lock)
  47:	{
  48:		rtlock_might_resched();
  49:		rtlock_lock(&lock->lock);
  50:		rcu_read_lock();
  51:		migrate_disable();
  52:	}
  53:	
  54:	void __sched rt_spin_lock(spinlock_t *lock) __acquires(RCU)
  55:	{
  56:		spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
  57:		__rt_spin_lock(lock);
  58:	}
  59:	EXPORT_SYMBOL(rt_spin_lock);
  60:	
  61:	#ifdef CONFIG_DEBUG_LOCK_ALLOC
  62:	void __sched rt_spin_lock_nested(spinlock_t *lock, int subclass)
  63:	{
  64:		spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
  65:		__rt_spin_lock(lock);
  66:	}
  67:	EXPORT_SYMBOL(rt_spin_lock_nested);
  68:	
  69:	void __sched rt_spin_lock_nest_lock(spinlock_t *lock,
  70:					    struct lockdep_map *nest_lock)
  71:	{
  72:		spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_);
  73:		__rt_spin_lock(lock);
  74:	}
  75:	EXPORT_SYMBOL(rt_spin_lock_nest_lock);
  76:	#endif
  77:	
  78:	void __sched rt_spin_unlock(spinlock_t *lock) __releases(RCU)
  79:	{
  80:		spin_release(&lock->dep_map, _RET_IP_);
  81:		migrate_enable();
  82:		rcu_read_unlock();
  83:	
  84:		if (unlikely(!rt_mutex_cmpxchg_release(&lock->lock, current, NULL)))
  85:			rt_mutex_slowunlock(&lock->lock);
  86:	}
  87:	EXPORT_SYMBOL(rt_spin_unlock);
  88:	
  89:	/*
]

211/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 17786
							output: 27
							thoughts: 168
						

Thoughts:
**Debugging a Curious RCU Nesting Depth Issue**

Okay, so I'm looking at this bug report and something doesn't quite add up. It looks like `rt_spin_unlock` is calling `rcu_read_unlock()`, which is important because `rcu_read_unlock()` decrements `current->rcu_read_lock_nesting`. Let's assume that there's a nested spinlock scenario where `spin_lock` was called twice, resulting in a nesting level of 2. After a single `spin_unlock`, the nesting should logically be at 1. Then, `cond_resched_lock` is expecting nesting to be at 1, which aligns with my understanding.

However, the bug report explicitly says: "RCU nest depth: 2, expected: 1". This is the problem. This suggests the nesting isn't being correctly tracked. If `spin_unlock(&jh->b_state_lock)` was called, the nesting depth should have changed. So, if we are calling spin_unlock, why is RCU still reporting a nesting depth of 2?

I need to investigate further. The key here is to confirm the `rcu_read_unlock` implementation. Time to dive into the code!



212/2 2026/05/31 23:16 tool grepper
0m Args:
map[Expression:void rcu_read_unlock PathPrefix:]

Results:
map[Output:Documentation/RCU/whatisRCU.rst=185=rcu_read_unlock()
Documentation/RCU/whatisRCU.rst-186-^^^^^^^^^^^^^^^^^
Documentation/RCU/whatisRCU.rst:187:	void rcu_read_unlock(void);
Documentation/RCU/whatisRCU.rst-188-
--
Documentation/RCU/whatisRCU.rst=664=It is extremely simple::
--
Documentation/RCU/whatisRCU.rst-672-
Documentation/RCU/whatisRCU.rst:673:	void rcu_read_unlock(void)
Documentation/RCU/whatisRCU.rst-674-	{
--
Documentation/RCU/whatisRCU.rst=735=are the same as those shown in the preceding section, so they are omitted.
--
Documentation/RCU/whatisRCU.rst-739-
Documentation/RCU/whatisRCU.rst:740:	void rcu_read_unlock(void) { }
Documentation/RCU/whatisRCU.rst-741-
--
include/linux/rcupdate.h=83=void __rcu_read_unlock(void);
--
include/linux/rcupdate.h-97-#else
include/linux/rcupdate.h:98:void rcu_read_unlock_strict(void);
include/linux/rcupdate.h-99-#endif
--
include/linux/rcupdate.h=833=static __always_inline void rcu_read_lock(void)
--
include/linux/rcupdate.h-863- */
include/linux/rcupdate.h:864:static inline void rcu_read_unlock(void)
include/linux/rcupdate.h-865-	__releases_shared(RCU)
--
include/linux/rcupdate.h=888=static inline void rcu_read_lock_bh(void)
--
include/linux/rcupdate.h-903- */
include/linux/rcupdate.h:904:static inline void rcu_read_unlock_bh(void)
include/linux/rcupdate.h-905-	__releases_shared(RCU) __releases_shared(RCU_BH)
--
include/linux/rcupdate.h=942=static inline notrace void rcu_read_lock_sched_notrace(void)
--
include/linux/rcupdate.h-954- */
include/linux/rcupdate.h:955:static inline void rcu_read_unlock_sched(void)
include/linux/rcupdate.h-956-	__releases_shared(RCU) __releases_shared(RCU_SCHED)
--
include/linux/rcupdate.h-966-/* Used by lockdep and tracing: cannot be traced, cannot call lockdep. */
include/linux/rcupdate.h:967:static inline notrace void rcu_read_unlock_sched_notrace(void)
include/linux/rcupdate.h-968-	__releases_shared(RCU) __releases_shared(RCU_SCHED)
--
include/linux/rcupdate.h=975=static __always_inline void rcu_read_lock_dont_migrate(void)
--
include/linux/rcupdate.h-982-
include/linux/rcupdate.h:983:static inline void rcu_read_unlock_migrate(void)
include/linux/rcupdate.h-984-	__releases_shared(RCU)
--
include/linux/rcupdate_trace.h=55=static inline struct srcu_ctr __percpu *rcu_read_lock_tasks_trace(void)
--
include/linux/rcupdate_trace.h-75- */
include/linux/rcupdate_trace.h:76:static inline void rcu_read_unlock_tasks_trace(struct srcu_ctr __percpu *scp)
include/linux/rcupdate_trace.h-77-{
--
include/linux/rcupdate_trace.h=96=static inline void rcu_read_lock_trace(void)
--
include/linux/rcupdate_trace.h-119- */
include/linux/rcupdate_trace.h:120:static inline void rcu_read_unlock_trace(void)
include/linux/rcupdate_trace.h-121-{
--
include/linux/rcupdate_trace.h=210=static inline void rcu_read_lock_trace(void) { BUG(); }
include/linux/rcupdate_trace.h:211:static inline void rcu_read_unlock_trace(void) { BUG(); }
include/linux/rcupdate_trace.h-212-#endif /* #ifdef CONFIG_TASKS_TRACE_RCU */
--
kernel/rcu/tree_plugin.h=116=static void rcu_report_exp_rnp(struct rcu_node *rnp, bool wake);
kernel/rcu/tree_plugin.h:117:static void rcu_read_unlock_special(struct task_struct *t);
kernel/rcu/tree_plugin.h-118-
--
kernel/rcu/tree_plugin.h=668=static bool rcu_unlock_needs_exp_handling(struct task_struct *t,
--
kernel/rcu/tree_plugin.h-724- */
kernel/rcu/tree_plugin.h:725:static void rcu_read_unlock_special(struct task_struct *t)
kernel/rcu/tree_plugin.h-726-{
--
kernel/rcu/tree_plugin.h=902=static void rcu_preempt_deferred_qs_init(struct rcu_data *rdp)
--
kernel/rcu/tree_plugin.h-912- */
kernel/rcu/tree_plugin.h:913:void rcu_read_unlock_strict(void)
kernel/rcu/tree_plugin.h-914-{
]

213/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 19763
							output: 36
							thoughts: 20
						

Thoughts:
Okay, here's my attempt at summarizing the thought process, as if it were my own, assuming I'm an expert in my field, and starting at line 864 of `include/linux/rcupdate.h`:

**Diving into the RCUs**

Right, let's zero in on `include/linux/rcupdate.h`, specifically around line 864. Time to refresh my memory on the intricacies of the Read-Copy-Update implementation. I'm guessing we're looking at something specific, perhaps related to grace periods, callbacks, or maybe even a critical data structure definition within that section. Given the location, it could be a macro definition for something that drives the RCU mechanism's internals. I need to figure out what functionality this code is serving. I'll need to assess the surrounding context to understand what's happening.



214/2 2026/05/31 23:16 tool read-file
0m Args:
map[File:include/linux/rcupdate.h FirstLine:850 LineCount:50]

Results:
map[Contents: 850:	 * others' way, as long as they do so.
 851:	 */
 852:	
 853:	/**
 854:	 * rcu_read_unlock() - marks the end of an RCU read-side critical section.
 855:	 *
 856:	 * In almost all situations, rcu_read_unlock() is immune from deadlock.
 857:	 * This deadlock immunity also extends to the scheduler's runqueue
 858:	 * and priority-inheritance spinlocks, courtesy of the quiescent-state
 859:	 * deferral that is carried out when rcu_read_unlock() is invoked with
 860:	 * interrupts disabled.
 861:	 *
 862:	 * See rcu_read_lock() for more information.
 863:	 */
 864:	static inline void rcu_read_unlock(void)
 865:		__releases_shared(RCU)
 866:	{
 867:		RCU_LOCKDEP_WARN(!rcu_is_watching(),
 868:				 "rcu_read_unlock() used illegally while idle");
 869:		rcu_lock_release(&rcu_lock_map); /* Keep acq info for rls diags. */
 870:		__release_shared(RCU);
 871:		__rcu_read_unlock();
 872:	}
 873:	
 874:	/**
 875:	 * rcu_read_lock_bh() - mark the beginning of an RCU-bh critical section
 876:	 *
 877:	 * This is equivalent to rcu_read_lock(), but also disables softirqs.
 878:	 * Note that anything else that disables softirqs can also serve as an RCU
 879:	 * read-side critical section.  However, please note that this equivalence
 880:	 * applies only to v5.0 and later.  Before v5.0, rcu_read_lock() and
 881:	 * rcu_read_lock_bh() were unrelated.
 882:	 *
 883:	 * Note that rcu_read_lock_bh() and the matching rcu_read_unlock_bh()
 884:	 * must occur in the same context, for example, it is illegal to invoke
 885:	 * rcu_read_unlock_bh() from one task if the matching rcu_read_lock_bh()
 886:	 * was invoked from some other task.
 887:	 */
 888:	static inline void rcu_read_lock_bh(void)
 889:		__acquires_shared(RCU) __acquires_shared(RCU_BH)
 890:	{
 891:		local_bh_disable();
 892:		__acquire_shared(RCU);
 893:		__acquire_shared(RCU_BH);
 894:		rcu_lock_acquire(&rcu_bh_lock_map);
 895:		RCU_LOCKDEP_WARN(!rcu_is_watching(),
 896:				 "rcu_read_lock_bh() used illegally while idle");
 897:	}
 898:	
 899:	/**
]

215/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 20874
							output: 28
							thoughts: 14
						

Thoughts:
Okay, let's dive into this. Here's my take on those thoughts, as if they're my own:

**Unpacking `__rcu_read_unlock()`**

Right, let's take a look at `__rcu_read_unlock()`. Ah, yes, RCU read-side critical section ending. My immediate thought is to consider the implications of this function call within the larger RCU (Read-Copy-Update) context. It's essentially the counterpart to `rcu_read_lock()`, signaling that a read-side critical section, previously guarded, is now complete. The core of this function probably involves memory barrier semantics. I’d guess it must ensure that any loads performed within the protected section are visible to subsequent reads from other CPUs. It’s likely ensuring that the memory ordering is correctly handled so the data read is consistent. Perhaps there’s some bookkeeping happening here as well. Maybe it's decrementing a per-CPU counter indicating an active read-side critical section, or potentially, notifying the quiescent state detection mechanism of the completion. My instinct tells me this function isn't doing any actual data invalidation – that's the beauty of RCU. It's more about coordinating read-side activity and making sure the system is ready for the grace period of a write operation. It's a subtle but crucial element in guaranteeing RCU's fundamental properties of correctness and performance. Let's see how the implementation backs up my hypothesis.



216/2 2026/05/31 23:16 tool grepper
0m Args:
map[Expression:void __rcu_read_unlock PathPrefix:]

Results:
map[Output:include/linux/rcupdate.h=82=void __rcu_read_lock(void);
include/linux/rcupdate.h:83:void __rcu_read_unlock(void);
include/linux/rcupdate.h-84-
--
include/linux/rcupdate.h=101=static inline void __rcu_read_lock(void)
--
include/linux/rcupdate.h-105-
include/linux/rcupdate.h:106:static inline void __rcu_read_unlock(void)
include/linux/rcupdate.h-107-{
--
kernel/rcu/tree_plugin.h=421=EXPORT_SYMBOL_GPL(__rcu_read_lock);
--
kernel/rcu/tree_plugin.h-429- */
kernel/rcu/tree_plugin.h:430:void __rcu_read_unlock(void)
kernel/rcu/tree_plugin.h-431-{
]

217/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 21483
							output: 38
							thoughts: 22
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience and written in the first person:

**Diving into `tree_plugin.h`**

Okay, I'm thinking I should really refresh my understanding of the `tree_plugin.h` file. Specifically, I want to drill down into the area around line 430. I'm focusing on that section because I've been considering some optimization strategies related to RCU's tree structure and I recall that area being particularly relevant to the mechanics of traversal and node management, perhaps within the context of a specific plugin or function. I expect to be looking for details about how the tree structure is updated, and specifically how the node structure is set up. I'm hoping to refresh my memory on the interactions and implications around plugin utilization within this data structure. I'm keen to focus my attention on memory allocation, the node layout, or perhaps even lock contention and how the plugin interacts within these areas.



218/2 2026/05/31 23:16 tool read-file
0m Args:
map[File:kernel/rcu/tree_plugin.h FirstLine:420 LineCount:50]

Results:
map[Contents: 420:	}
 421:	EXPORT_SYMBOL_GPL(__rcu_read_lock);
 422:	
 423:	/*
 424:	 * Preemptible RCU implementation for rcu_read_unlock().
 425:	 * Decrement ->rcu_read_lock_nesting.  If the result is zero (outermost
 426:	 * rcu_read_unlock()) and ->rcu_read_unlock_special is non-zero, then
 427:	 * invoke rcu_read_unlock_special() to clean up after a context switch
 428:	 * in an RCU read-side critical section and other special cases.
 429:	 */
 430:	void __rcu_read_unlock(void)
 431:	{
 432:		struct task_struct *t = current;
 433:	
 434:		barrier();  // critical section before exit code.
 435:		if (rcu_preempt_read_exit() == 0) {
 436:			barrier();  // critical-section exit before .s check.
 437:			if (unlikely(READ_ONCE(t->rcu_read_unlock_special.s)))
 438:				rcu_read_unlock_special(t);
 439:		}
 440:		if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
 441:			int rrln = rcu_preempt_depth();
 442:	
 443:			WARN_ON_ONCE(rrln < 0 || rrln > RCU_NEST_PMAX);
 444:		}
 445:	}
 446:	EXPORT_SYMBOL_GPL(__rcu_read_unlock);
 447:	
 448:	/*
 449:	 * Advance a ->blkd_tasks-list pointer to the next entry, instead
 450:	 * returning NULL if at the end of the list.
 451:	 */
 452:	static struct list_head *rcu_next_node_entry(struct task_struct *t,
 453:						     struct rcu_node *rnp)
 454:	{
 455:		struct list_head *np;
 456:	
 457:		np = t->rcu_node_entry.next;
 458:		if (np == &rnp->blkd_tasks)
 459:			np = NULL;
 460:		return np;
 461:	}
 462:	
 463:	/*
 464:	 * Return true if the specified rcu_node structure has tasks that were
 465:	 * preempted within an RCU read-side critical section.
 466:	 */
 467:	static bool rcu_preempt_has_tasks(struct rcu_node *rnp)
 468:	{
 469:		return !list_empty(&rnp->blkd_tasks);
]

219/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 22557
							output: 29
							thoughts: 45
						

Thoughts:
Here's my thought process, summarized as if I were considering the code:

**RCU Preempt Read Exit: Checking the Nesting**

Okay, so `rcu_preempt_read_exit()` is decrementing `current->rcu_read_lock_nesting`. That's the key. That's the crucial operation. Now, I need to understand why this is happening. The implication is that we're exiting a read section, specifically a preemptible one. This nesting count is how the kernel tracks how deeply nested a current thread's RCU read-side critical sections are. Right, let me drill down on `rcu_preempt_read_exit()` directly and make sure that this is the only thing happening. No tricks, no side effects I need to be aware of. Let me check the full implementation. Need to make sure the decrement is atomic and the other operations around this make sense in relation to the preemptible read path. Let's dig in.



220/2 2026/05/31 23:16 tool grepper
0m Args:
map[Expression:rcu_preempt_read_exit PathPrefix:]

Results:
map[Output:kernel/rcu/tree_plugin.h=389=static void rcu_preempt_read_enter(void)
--
kernel/rcu/tree_plugin.h-393-
kernel/rcu/tree_plugin.h:394:static int rcu_preempt_read_exit(void)
kernel/rcu/tree_plugin.h-395-{
--
kernel/rcu/tree_plugin.h=430=void __rcu_read_unlock(void)
--
kernel/rcu/tree_plugin.h-434-	barrier();  // critical section before exit code.
kernel/rcu/tree_plugin.h:435:	if (rcu_preempt_read_exit() == 0) {
kernel/rcu/tree_plugin.h-436-		barrier();  // critical-section exit before .s check.
]

221/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 23069
							output: 38
							thoughts: 22
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience and written in the first person:

**Diving into `tree_plugin.h`**

Okay, I'm thinking I need to jump into the `kernel/rcu/tree_plugin.h` file. Specifically, I want to zero in around line 394. I recall a potential issue there – a subtle point regarding the RCU tree plugin implementation. I'm hoping to refresh my memory on the interactions between the different states or maybe a specific data structure declaration relevant to that section. Let me get that file open. I remember some recent discussions about optimization there. This should be interesting.



222/2 2026/05/31 23:16 tool read-file
0m Args:
map[File:kernel/rcu/tree_plugin.h FirstLine:380 LineCount:50]

Results:
map[Contents: 380:	 */
 381:	static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp)
 382:	{
 383:		return READ_ONCE(rnp->gp_tasks) != NULL;
 384:	}
 385:	
 386:	/* limit value for ->rcu_read_lock_nesting. */
 387:	#define RCU_NEST_PMAX (INT_MAX / 2)
 388:	
 389:	static void rcu_preempt_read_enter(void)
 390:	{
 391:		WRITE_ONCE(current->rcu_read_lock_nesting, READ_ONCE(current->rcu_read_lock_nesting) + 1);
 392:	}
 393:	
 394:	static int rcu_preempt_read_exit(void)
 395:	{
 396:		int ret = READ_ONCE(current->rcu_read_lock_nesting) - 1;
 397:	
 398:		WRITE_ONCE(current->rcu_read_lock_nesting, ret);
 399:		return ret;
 400:	}
 401:	
 402:	static void rcu_preempt_depth_set(int val)
 403:	{
 404:		WRITE_ONCE(current->rcu_read_lock_nesting, val);
 405:	}
 406:	
 407:	/*
 408:	 * Preemptible RCU implementation for rcu_read_lock().
 409:	 * Just increment ->rcu_read_lock_nesting, shared state will be updated
 410:	 * if we block.
 411:	 */
 412:	void __rcu_read_lock(void)
 413:	{
 414:		rcu_preempt_read_enter();
 415:		if (IS_ENABLED(CONFIG_PROVE_LOCKING))
 416:			WARN_ON_ONCE(rcu_preempt_depth() > RCU_NEST_PMAX);
 417:		if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) && rcu_state.gp_kthread)
 418:			WRITE_ONCE(current->rcu_read_unlock_special.b.need_qs, true);
 419:		barrier();  /* critical section after entry code. */
 420:	}
 421:	EXPORT_SYMBOL_GPL(__rcu_read_lock);
 422:	
 423:	/*
 424:	 * Preemptible RCU implementation for rcu_read_unlock().
 425:	 * Decrement ->rcu_read_lock_nesting.  If the result is zero (outermost
 426:	 * rcu_read_unlock()) and ->rcu_read_unlock_special is non-zero, then
 427:	 * invoke rcu_read_unlock_special() to clean up after a context switch
 428:	 * in an RCU read-side critical section and other special cases.
 429:	 */
]

223/2 2026/05/31 23:16 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 24142
							output: 37
							thoughts: 2328
						

Thoughts:
**Deep Dive into RCU and Lockdep with PREEMPT_RT**

Okay, so I'm looking at this code and trying to understand why this lockdep trace is showing what it is. It seems like `rcu_preempt_read_exit` simply decrements `current->rcu_read_lock_nesting`, which is straightforward enough. My initial thought was that if `rt_spin_unlock` calls `rcu_read_unlock`, then the nesting level should be adjusted accordingly. But something's not quite lining up with the trace.

I'm staring at this lockdep trace: `3 locks held by jbd2/sda1-8/5155`. I see two instances of `rcu_read_lock` and one of `j_list_lock`. First, I assumed that `jh->b_state_lock` must have been unlocked, so why is `rcu_read_lock` still held? Then it hit me; lockdep tracks this like a stack. When `jh->b_state_lock` was acquired, it pushed both `rcu_read_lock` and `jh->b_state_lock`. Then `j_list_lock` was acquired and it pushed `rcu_read_lock` and `j_list_lock`.

Initially, I thought `jh->b_state_lock` wasn't in the trace because PREEMPT_RT doesn't track raw spinlocks with lockdep. But then I saw that `j_list_lock`, *which is a spinlock*, *is* in the trace. So, if `jh->b_state_lock` isn't in the trace, it must have been unlocked. Makes sense. When `spin_unlock(&jh->b_state_lock)` was called, lockdep would have removed `jh->b_state_lock`.

The question becomes, how does `rcu_read_lock` remain? Well, `rt_spin_unlock` calls `rcu_read_unlock()`, which in turn calls `rcu_lock_release(&rcu_lock_map)`. I remember lockdep removes the *most recent* acquisition of `rcu_read_lock`. Okay, when `rt_spin_unlock(&jh->b_state_lock)` calls `rcu_read_unlock()`, it removes the `rcu_read_lock` associated with `j_list_lock`, right? That means lock #2. So, now, only lock #0 (`rcu_read_lock`) and lock #1 (`j_list_lock`) should remain.

But wait, the trace *still* shows three locks! This is the part that is tripping me up. The trace shows `rcu_read_lock`, `j_list_lock`, and *then another* `rcu_read_lock`. If the most recent one was removed, it *shouldn't* be there. Unless...

If the trace shows `3 locks held`, and one is `j_list_lock`, and there are two `rcu_read_lock`, then `rcu_read_lock` must have been acquired a total of *three times* and released once.

So, let me map this all out. First, `spin_lock(&jh->b_state_lock)` is called. This does two things: `rcu_read_lock()` pushes the first `rcu_read_lock` (lock #0) and then the `rt_mutex_lock(&jh->b_state_lock)` pushes `jh->b_state_lock` (lock #1). Then, when `spin_lock(&journal->j_list_lock)` is called, `rcu_read_lock()` pushes a *second* `rcu_read_lock` (lock #2) and `rt_mutex_lock(&journal->j_list_lock)` pushes `j_list_lock` (lock #3). Finally, `spin_unlock(&jh->b_state_lock)` is called and `rt_mutex_unlock(&jh->b_state_lock)` removes `jh->b_state_lock` (lock #1) and `rcu_read_unlock()` removes the *second* `rcu_read_lock` (lock #2). Therefore, now, the locks held should only be lock #0 (`rcu_read_lock`) and lock #1 (`j_list_lock`).

But the trace still says there are *three* locks held. It’s showing `rcu_read_lock`, `j_list_lock` and *another* `rcu_read_lock`. Why? I need to look closer. Maybe `spin_lock(&


224/2 2026/05/31 23:17 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:980 LineCount:50]

Results:
map[Contents: 980:				jbd2_free(jh->b_committed_data, bh->b_size);
 981:				jh->b_committed_data = NULL;
 982:				if (jh->b_frozen_data) {
 983:					jh->b_committed_data = jh->b_frozen_data;
 984:					jh->b_frozen_data = NULL;
 985:					jh->b_frozen_triggers = NULL;
 986:				}
 987:			} else if (jh->b_frozen_data) {
 988:				jbd2_free(jh->b_frozen_data, bh->b_size);
 989:				jh->b_frozen_data = NULL;
 990:				jh->b_frozen_triggers = NULL;
 991:			}
 992:	
 993:			spin_lock(&journal->j_list_lock);
 994:			cp_transaction = jh->b_cp_transaction;
 995:			if (cp_transaction) {
 996:				JBUFFER_TRACE(jh, "remove from old cp transaction");
 997:				cp_transaction->t_chp_stats.cs_dropped++;
 998:				__jbd2_journal_remove_checkpoint(jh);
 999:			}
1000:	
1001:			/* Only re-checkpoint the buffer_head if it is marked
1002:			 * dirty.  If the buffer was added to the BJ_Forget list
1003:			 * by jbd2_journal_forget, it may no longer be dirty and
1004:			 * there's no point in keeping a checkpoint record for
1005:			 * it. */
1006:	
1007:			/*
1008:			 * A buffer which has been freed while still being journaled
1009:			 * by a previous transaction, refile the buffer to BJ_Forget of
1010:			 * the running transaction. If the just committed transaction
1011:			 * contains "add to orphan" operation, we can completely
1012:			 * invalidate the buffer now. We are rather through in that
1013:			 * since the buffer may be still accessible when blocksize <
1014:			 * pagesize and it is attached to the last partial page.
1015:			 */
1016:			if (buffer_freed(bh) && !jh->b_next_transaction) {
1017:				struct address_space *mapping;
1018:	
1019:				clear_buffer_freed(bh);
1020:				clear_buffer_jbddirty(bh);
1021:	
1022:				/*
1023:				 * Block device buffers need to stay mapped all the
1024:				 * time, so it is enough to clear buffer_jbddirty and
1025:				 * buffer_freed bits. For the file mapping buffers (i.e.
1026:				 * journalled data) we need to unmap buffer and clear
1027:				 * more bits. We also need to be careful about the check
1028:				 * because the data page mapping can get cleared under
1029:				 * our hands. Note that if mapping == NULL, we don't
]

225/2 2026/05/31 23:17 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 28390
							output: 43
							thoughts: 31
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience and written in the first person:

**Lock Contention Concerns in `__jbd2_journal_remove_checkpoint(jh)`**

Okay, so I'm looking at this code, specifically at line 998, and I see that `__jbd2_journal_remove_checkpoint(jh)` is being called. My immediate question is: does this function acquire any locks? Given its name, it's pretty clear it deals with journal checkpoints, which are critical for consistency and crash recovery in a journaling filesystem. Therefore, the function almost certainly interacts with shared journal metadata or data structures. I need to understand if there's any potential for lock contention here, particularly given the timing of its invocation. If it does grab locks, how long does it hold them? What's the lock hierarchy? I need to drill down into the function's implementation to see exactly what's being protected and how. Lock contention here could lead to some nasty performance bottlenecks or even deadlocks, so this is a critical detail.



226/2 2026/05/31 23:17 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/commit.c Name:__jbd2_journal_remove_checkpoint]

Results:
map[SourceCode: 559:	/*
 560:	 * journal_remove_checkpoint: called after a buffer has been committed
 561:	 * to disk (either by being write-back flushed to disk, or being
 562:	 * committed to the log).
 563:	 *
 564:	 * We cannot safely clean a transaction out of the log until all of the
 565:	 * buffer updates committed in that transaction have safely been stored
 566:	 * elsewhere on disk.  To achieve this, all of the buffers in a
 567:	 * transaction need to be maintained on the transaction's checkpoint
 568:	 * lists until they have been rewritten, at which point this function is
 569:	 * called to remove the buffer from the existing transaction's
 570:	 * checkpoint lists.
 571:	 *
 572:	 * The function returns 1 if it frees the transaction, 0 otherwise.
 573:	 * The function can free jh and bh.
 574:	 *
 575:	 * This function is called with j_list_lock held.
 576:	 */
 577:	int __jbd2_journal_remove_checkpoint(struct journal_head *jh)
 578:	{
 579:		struct transaction_chp_stats_s *stats;
 580:		transaction_t *transaction;
 581:		journal_t *journal;
 582:	
 583:		JBUFFER_TRACE(jh, "entry");
 584:	
 585:		transaction = jh->b_cp_transaction;
 586:		if (!transaction) {
 587:			JBUFFER_TRACE(jh, "not on transaction");
 588:			return 0;
 589:		}
 590:		journal = transaction->t_journal;
 591:	
 592:		JBUFFER_TRACE(jh, "removing from transaction");
 593:	
 594:		__buffer_unlink(jh);
 595:		jh->b_cp_transaction = NULL;
 596:		percpu_counter_dec(&journal->j_checkpoint_jh_count);
 597:		jbd2_journal_put_journal_head(jh);
 598:	
 599:		/* Is this transaction empty? */
 600:		if (transaction->t_checkpoint_list)
 601:			return 0;
 602:	
 603:		/*
 604:		 * There is one special case to worry about: if we have just pulled the
 605:		 * buffer off a running or committing transaction's checkpoing list,
 606:		 * then even if the checkpoint list is empty, the transaction obviously
 607:		 * cannot be dropped!
 608:		 *
 609:		 * The locking here around t_state is a bit sleazy.
 610:		 * See the comment at the end of jbd2_journal_commit_transaction().
 611:		 */
 612:		if (transaction->t_state != T_FINISHED)
 613:			return 0;
 614:	
 615:		/*
 616:		 * OK, that was the last buffer for the transaction, we can now
 617:		 * safely remove this transaction from the log.
 618:		 */
 619:		stats = &transaction->t_chp_stats;
 620:		if (stats->cs_chp_time)
 621:			stats->cs_chp_time = jbd2_time_diff(stats->cs_chp_time,
 622:							    jiffies);
 623:		trace_jbd2_checkpoint_stats(journal->j_fs_dev->bd_dev,
 624:					    transaction->t_tid, stats);
 625:	
 626:		__jbd2_journal_drop_transaction(journal, transaction);
 627:		jbd2_journal_free_transaction(transaction);
 628:		return 1;
 629:	}
 SourceFile:fs/jbd2/checkpoint.c]

227/2 2026/05/31 23:17 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 29804
							output: 44
							thoughts: 32
						

Thoughts:
Okay, here's my take on those thoughts, framed as an expert's internal monologue:

**Investigating `jbd2_journal_put_journal_head(jh)`**

Alright, let's see... I'm looking at this code and, hang on, line 597 specifically mentions a call to `jbd2_journal_put_journal_head(jh)`. I know that routine, but it's been a while since I dove deep into its mechanics. My immediate question, the one that always springs to mind in a scenario like this, is: *does this function acquire any locks?* Journaling is all about concurrency and data integrity, so understanding the locking strategy is absolutely critical. I need to know if we're dealing with spinlocks, mutexes, read-write semaphores, or anything else, and how that interacts with the rest of the journaling process. This is the lynchpin, the place to investigate before going any deeper. It has the potential to influence any concurrency issues or bottlenecks the code may encounter.



228/2 2026/05/31 23:17 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/checkpoint.c Name:jbd2_journal_put_journal_head]

Results:
map[SourceCode:2990:	/*
2991:	 * Drop a reference on the passed journal_head.  If it fell to zero then
2992:	 * release the journal_head from the buffer_head.
2993:	 */
2994:	void jbd2_journal_put_journal_head(struct journal_head *jh)
2995:	{
2996:		struct buffer_head *bh = jh2bh(jh);
2997:	
2998:		jbd_lock_bh_journal_head(bh);
2999:		J_ASSERT_JH(jh, jh->b_jcount > 0);
3000:		--jh->b_jcount;
3001:		if (!jh->b_jcount) {
3002:			__journal_remove_journal_head(bh);
3003:			jbd_unlock_bh_journal_head(bh);
3004:			journal_release_journal_head(jh, bh->b_size);
3005:			__brelse(bh);
3006:		} else {
3007:			jbd_unlock_bh_journal_head(bh);
3008:		}
3009:	}
 SourceFile:fs/jbd2/journal.c]

229/2 2026/05/31 23:17 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 30457
							output: 43
							thoughts: 17
						

Thoughts:
Okay, here's my attempt at summarizing that thought process, keeping in mind I'm speaking to a fellow expert:

**Delving into `jbd_lock_bh_journal_head(bh)`**

Right, let's break this down. My initial thought is: *What exactly is `jbd_lock_bh_journal_head(bh)` trying to achieve?* I know `jbd` implies the Journaling Block Device, so we're talking about low-level journaling here, likely within a filesystem like ext3 or ext4. The function name itself suggests some interaction with a block header (`bh`), and probably its associated journal metadata.

So, the next part of my thought is: *It's definitely involved in some form of locking*. That `lock` in the function name is a dead giveaway. What kind of lock? Is it a spinlock, a mutex, or something more sophisticated? Is it pessimistic or optimistic? The `journal_head` part is key. *I wonder if this function is about protecting the metadata associated with a block's journey through the journal.* Is it ensuring data integrity and consistency during a transaction?

I'm mentally running through the typical journal workflow. Could it be a lock that's held while the block is being *written* to the journal, or *read* from it during recovery? Does it relate to the `j_state` flags that are used to track a block's status with in the journal? Is it a lock on the `journal_head` itself, or on the underlying data structures it points to?

My guess is that this function will be handling the concurrency issues around the `journal_head` structure itself. It's likely ensuring exclusive access to the metadata that describes which journal transaction this block belongs to, if it's dirty, if it's been committed and so on. This is where things can get tricky, especially if the file system is involved in a lot of concurrent I/O.



230/2 2026/05/31 23:17 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/journal.c Name:jbd_lock_bh_journal_head]

Results:
map[SourceCode: 341:	static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
 342:	{
 343:		bit_spin_lock(BH_JournalHead, &bh->b_state);
 344:	}
 SourceFile:include/linux/jbd2.h]

231/2 2026/05/31 23:17 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 31037
							output: 26
							thoughts: 52
						

Thoughts:
**Examining Bit Spin Locks in a PREEMPT_RT Context**

Okay, so I'm thinking about `bit_spin_lock` here. A key question pops into my head: does `bit_spin_lock` call `rcu_read_lock` when running in a PREEMPT_RT environment? I need to clarify this interaction for a project. To make sure, I should really dive into the `bit_spin_lock` implementation and see how it behaves under PREEMPT_RT. Let's get to the code.



232/2 2026/05/31 23:17 tool grepper
0m Args:
map[Expression:void bit_spin_lock PathPrefix:]

Results:
map[Output:include/linux/bit_spinlock.h=19=context_lock_struct(__context_bitlock) { };
--
include/linux/bit_spinlock.h-27- */
include/linux/bit_spinlock.h:28:static __always_inline void bit_spin_lock(int bitnum, unsigned long *addr)
include/linux/bit_spinlock.h-29-	__acquires(__bitlock(bitnum, addr))
]

233/2 2026/05/31 23:17 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 31348
							output: 36
							thoughts: 20
						

Thoughts:
Here's a summary of my thought process, as requested:

**Diving into bit_spinlock.h**

Okay, let's zero in on `include/linux/bit_spinlock.h`. I need to get a better handle on the kernel's spinlock implementation, and my instinct tells me there's something interesting lurking around line 28. That's usually a good place to start, as it's often where the core data structure definition begins or some key initialization takes place. I'm expecting to see the raw bits and the atomic operations that are the foundation of this particular spinlock mechanism. Time to open the file and see what `line 28` reveals. Let's see if this bit-based approach is using `atomic_t` or some other primitive. I'm keen to understand how contention is handled at the bit level and how the compiler is optimized for this case. This could be where the interesting concurrency details are hidden.



234/2 2026/05/31 23:17 tool read-file
0m Args:
map[File:include/linux/bit_spinlock.h FirstLine:20 LineCount:50]

Results:
map[Contents:  20:	#define __bitlock(bitnum, addr) (struct __context_bitlock *)(bitnum + (addr))
  21:	
  22:	/*
  23:	 *  bit-based spin_lock()
  24:	 *
  25:	 * Don't use this unless you really need to: spin_lock() and spin_unlock()
  26:	 * are significantly faster.
  27:	 */
  28:	static __always_inline void bit_spin_lock(int bitnum, unsigned long *addr)
  29:		__acquires(__bitlock(bitnum, addr))
  30:	{
  31:		/*
  32:		 * Assuming the lock is uncontended, this never enters
  33:		 * the body of the outer loop. If it is contended, then
  34:		 * within the inner loop a non-atomic test is used to
  35:		 * busywait with less bus contention for a good time to
  36:		 * attempt to acquire the lock bit.
  37:		 */
  38:		preempt_disable();
  39:	#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  40:		while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
  41:			preempt_enable();
  42:			do {
  43:				cpu_relax();
  44:			} while (test_bit(bitnum, addr));
  45:			preempt_disable();
  46:		}
  47:	#endif
  48:		__acquire(__bitlock(bitnum, addr));
  49:	}
  50:	
  51:	/*
  52:	 * Return true if it was acquired
  53:	 */
  54:	static __always_inline int bit_spin_trylock(int bitnum, unsigned long *addr)
  55:		__cond_acquires(true, __bitlock(bitnum, addr))
  56:	{
  57:		preempt_disable();
  58:	#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  59:		if (unlikely(test_and_set_bit_lock(bitnum, addr))) {
  60:			preempt_enable();
  61:			return 0;
  62:		}
  63:	#endif
  64:		__acquire(__bitlock(bitnum, addr));
  65:		return 1;
  66:	}
  67:	
  68:	/*
  69:	 *  bit-based spin_unlock()
]

235/2 2026/05/31 23:17 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 32298
							output: 37
							thoughts: 2176
						

Thoughts:
**Analyzing Lock Acquisition and Release in JBD2 Journal Commit**

Okay, let's break this down. My initial thought was about `bit_spin_lock` and its use of `preempt_disable()`, but that's not the issue here. The trace is key, showing three locks held during `jbd2_journal_commit_transaction`: two `rcu_read_lock` instances and `journal->j_list_lock`. The crucial point is understanding *how* these locks are acquired and released, and why the lockdep output is showing what it is.

I'm focused on the sequence around lines 948-1071 in `fs/jbd2/commit.c`. At line 948, the code takes `journal->j_list_lock`, which includes an implicit `rcu_read_lock` due to its use of `rt_spin_lock`. This is then unlocked at line 956. This should release the `rcu_read_lock` along with the spinlock.

At line 963, the code then takes `jh->b_state_lock`. That also should take `rcu_read_lock`. Then at line 993, `journal->j_list_lock` is re-acquired, which also means `rcu_read_lock` is taken again. At line 1064, `jh->b_state_lock` is unlocked. Now, here's where it gets interesting.  Unlocking `jh->b_state_lock` releases the spinlock and *also* the `rcu_read_lock` that was acquired with it. The `rcu_read_unlock()` operation is critical here, as it manages the lockdep's bookkeeping. And here's where I had to adjust my thinking, because lockdep is the key to understanding this. 

My initial assumption was that unlocking `jh->b_state_lock` would release the *most recent* `rcu_read_lock`, which was associated with `journal->j_list_lock` at 993.  But the trace clearly shows that the `rcu_read_lock` from 993 is *still* present in the final lock trace, along with the other one.  This is what threw me.

Then I realized I'm not seeing *one* `rcu_read_lock`, as a single "instance" of the lock. I'm seeing multiple acquisitions. So, at 948, we acquire the first pair of locks. Then at 963, the second pair is acquired (and the first pair is released at 956). Then at 993, the third pair is acquired. Now, the trace is:
`#0: rcu_read_lock` (initial, at 948)
`#1: journal->j_list_lock` (at 993)
`#2: rcu_read_lock` (at 993)
We're *not* seeing a single "rcu_read_lock" in the trace, but three *separate* locks, due to the two calls of `rt_spin_lock` which *also* uses `rcu_read_lock`.

My working theory is that we see an initial `rcu_read_lock` at 948. This is released. Then at 963, a second instance is acquired. At 993 a third is acquired. At line 1064, we release the spinlock associated with the second `rcu_read_lock`. Then at 1071, `cond_resched_lock` only takes `j_list_lock` lock, and there is one `rcu_read_lock` left, which is from the call to 993. The extra `rcu_read_lock` comes from the implicit acquisition via the spinlocks. So in the end, we still have `rcu_read_lock` and `j_list_lock` locked when the function is done. I'd need to verify the calling context of this function to see how those locks are intended to be managed.  The lock hierarchy seems sane, but a deeper dive into the callers might be necessary to confirm expected lock ordering and release semantics. The important thing is that the lockdep output is consistent with the code's locking and unlocking sequence, with careful tracking of `rcu_read_lock` and its implicit acquisitions.



236/2 2026/05/31 23:17 tool read-file
0m Args:
map[File:fs/jbd2/journal.c FirstLine:190 LineCount:50]

Results:
map[Contents: 190:	loop:
 191:		if (journal->j_flags & JBD2_UNMOUNT)
 192:			goto end_loop;
 193:	
 194:		jbd2_debug(1, "commit_sequence=%u, commit_request=%u\n",
 195:			journal->j_commit_sequence, journal->j_commit_request);
 196:	
 197:		if (journal->j_commit_sequence != journal->j_commit_request) {
 198:			jbd2_debug(1, "OK, requests differ\n");
 199:			write_unlock(&journal->j_state_lock);
 200:			timer_delete_sync(&journal->j_commit_timer);
 201:			jbd2_journal_commit_transaction(journal);
 202:			write_lock(&journal->j_state_lock);
 203:			goto loop;
 204:		}
 205:	
 206:		wake_up(&journal->j_wait_done_commit);
 207:		if (freezing(current)) {
 208:			/*
 209:			 * The simpler the better. Flushing journal isn't a
 210:			 * good idea, because that depends on threads that may
 211:			 * be already stopped.
 212:			 */
 213:			jbd2_debug(1, "Now suspending kjournald2\n");
 214:			write_unlock(&journal->j_state_lock);
 215:			try_to_freeze();
 216:			write_lock(&journal->j_state_lock);
 217:		} else {
 218:			/*
 219:			 * We assume on resume that commits are already there,
 220:			 * so we don't sleep
 221:			 */
 222:			DEFINE_WAIT(wait);
 223:	
 224:			prepare_to_wait(&journal->j_wait_commit, &wait,
 225:					TASK_INTERRUPTIBLE);
 226:			transaction = journal->j_running_transaction;
 227:			if (transaction == NULL ||
 228:			    time_before(jiffies, transaction->t_expires)) {
 229:				write_unlock(&journal->j_state_lock);
 230:				schedule();
 231:				write_lock(&journal->j_state_lock);
 232:			}
 233:			finish_wait(&journal->j_wait_commit, &wait);
 234:		}
 235:	
 236:		jbd2_debug(1, "kjournald2 wakes\n");
 237:	
 238:		/*
 239:		 * Were we woken up by a commit wakeup event?
]

237/2 2026/05/31 23:17 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 36264
							output: 37
							thoughts: 648
						

Thoughts:
**Deciphering the Lock Order in `kjournald2`**

Okay, so `kjournald2` starts its loop with a `write_lock(&journal->j_state_lock)`, and then *unlocks* it before calling `jbd2_journal_commit_transaction(journal)`. So, `j_state_lock` isn't held during the crucial commit function. That's good to know. Now, let's trace this down.

Hang on...does `kjournald2` hold an `rcu_read_lock`? No, not directly. That's when I had to double-check the lockdep trace. Alright, let's break this down further. The trace shows a few locks in sequence:

```
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
```

Lock #0 is an `rcu_read_lock` at `rt_spin_lock`, lock #1 is the `j_list_lock`, and lock #2 is another `rcu_read_lock` acquired after `j_list_lock` at line 993.  Now, the initial thought of the sequence felt off. If lock #1 is `j_list_lock`, then lock #0 must be acquired BEFORE #1 and lock #2 is acquired AFTER it.

Aha! `spin_lock(&journal->j_list_lock)` calls `rt_spin_lock`, which in turn first acquires `rcu_read_lock` and then acquires `j_list_lock`. Bingo! It becomes clear.

Therefore, `rcu_read_lock` (lock #0) and `j_list_lock` (lock #1) *are* acquired by the call to `spin_lock(&journal->j_list_lock)`! That means my initial impression of them being distinct acquisitions was wrong. Lock #0, which I thought was *some* other lock, is the `rcu_read_lock` from inside `j_list_lock`, and lock #1 is `j_list_lock` itself! The lock #2 is another `rcu_read_lock` acquired *after* acquiring `j_list_lock`! Now, I need to focus on what happens in `jbd2_journal_commit_transaction` after line 993, to look for what would trigger lock #2.



238/2 2026/05/31 23:18 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:993 LineCount:50]

Results:
map[Contents: 993:			spin_lock(&journal->j_list_lock);
 994:			cp_transaction = jh->b_cp_transaction;
 995:			if (cp_transaction) {
 996:				JBUFFER_TRACE(jh, "remove from old cp transaction");
 997:				cp_transaction->t_chp_stats.cs_dropped++;
 998:				__jbd2_journal_remove_checkpoint(jh);
 999:			}
1000:	
1001:			/* Only re-checkpoint the buffer_head if it is marked
1002:			 * dirty.  If the buffer was added to the BJ_Forget list
1003:			 * by jbd2_journal_forget, it may no longer be dirty and
1004:			 * there's no point in keeping a checkpoint record for
1005:			 * it. */
1006:	
1007:			/*
1008:			 * A buffer which has been freed while still being journaled
1009:			 * by a previous transaction, refile the buffer to BJ_Forget of
1010:			 * the running transaction. If the just committed transaction
1011:			 * contains "add to orphan" operation, we can completely
1012:			 * invalidate the buffer now. We are rather through in that
1013:			 * since the buffer may be still accessible when blocksize <
1014:			 * pagesize and it is attached to the last partial page.
1015:			 */
1016:			if (buffer_freed(bh) && !jh->b_next_transaction) {
1017:				struct address_space *mapping;
1018:	
1019:				clear_buffer_freed(bh);
1020:				clear_buffer_jbddirty(bh);
1021:	
1022:				/*
1023:				 * Block device buffers need to stay mapped all the
1024:				 * time, so it is enough to clear buffer_jbddirty and
1025:				 * buffer_freed bits. For the file mapping buffers (i.e.
1026:				 * journalled data) we need to unmap buffer and clear
1027:				 * more bits. We also need to be careful about the check
1028:				 * because the data page mapping can get cleared under
1029:				 * our hands. Note that if mapping == NULL, we don't
1030:				 * need to make buffer unmapped because the page is
1031:				 * already detached from the mapping and buffers cannot
1032:				 * get reused.
1033:				 */
1034:				mapping = READ_ONCE(bh->b_folio->mapping);
1035:				if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) {
1036:					clear_buffer_mapped(bh);
1037:					clear_buffer_new(bh);
1038:					clear_buffer_req(bh);
1039:					bh->b_bdev = NULL;
1040:				}
1041:			}
1042:	
]

239/2 2026/05/31 23:18 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 38489
							output: 38
							thoughts: 1254
						

Thoughts:
**Analyzing a Lockdep Trace**

Okay, let's break this down. I'm looking at a lockdep trace and something seems off. Initially, I was confused: If lock #0 is the `rcu_read_lock` associated with `j_list_lock`, and lock #1 *is* `j_list_lock`, where did `jh->b_state_lock` disappear to? I quickly realized, ah, `jh->b_state_lock` was acquired earlier, at line 963. If that's the case, then at line 963, `jh->b_state_lock` should be locks #0 and #1, and `j_list_lock` would be locks #2 and #3, however, the trace shows a simpler structure than I'd expect. The trace displays:

*   #0: `rcu_read_lock`
*   #1: `j_list_lock`
*   #2: `rcu_read_lock`

This suggests that `jh->b_state_lock` had already been unlocked by line 1071.

But hang on… the trace mentions `spin_unlock(&jh->b_state_lock)` at line 1064, so it *should* have been unlocked. So, at 1071 I should only have `rcu_read_lock` (from `j_list_lock`) and `j_list_lock` held.

The important point is that `spin_unlock(&jh->b_state_lock)` calls `rcu_read_unlock()`. `rcu_read_unlock()` calls `rcu_lock_release()`, which, as I know, removes the MOST RECENT `rcu_read_lock` from lockdep.

Okay, let's reason. The most recent `rcu_read_lock` would have been the one acquired by `j_list_lock` at line 993, meaning that `rcu_read_unlock()` would have removed that `rcu_read_lock`.

In that case, lockdep should show:

*   #0: `rcu_read_lock` (from `jh->b_state_lock`)
*   #1: `j_list_lock`

But the trace has three locks!

*   #0: `rcu_read_lock`
*   #1: `j_list_lock`
*   #2: `rcu_read_lock`

So it looks like `rcu_read_lock` has been acquired three times and released once... but why is there that third lock?

Let's carefully step through the lock acquisition/release:

*   At 948: `spin_lock(&journal->j_list_lock)`
    *   Acquires `rcu_read_lock` (depth 1) which is pushed to lockdep as #0
    *   Acquires `j_list_lock`
*   At 956: `spin_unlock(&journal->j_list_lock)`
    *   Releases `j_list_lock`
    *   Releases `rcu_read_lock` (depth 0).
*   At 963: `spin_lock(&jh->b_state_lock)`
    *   Acquires `rcu_read_lock` (depth 1) which is pushed to lockdep as #0
    *   Acquires `jh->b_state_lock` which is pushed to lockdep as #1
*   At 993: `spin_lock(&journal->j_list_lock)`
    *   Acquires `rcu_read_lock` (depth 2) which is pushed to lockdep as #2
    *   Acquires `j_list_lock` which is pushed to lockdep as #3
*   At 1064: `spin_unlock(&jh->b_state_lock)`
    *   Releases `jh->b_state_lock` so lockdep removes it (#1)
    *   Releases `rcu_read_lock` (depth 1) so lockdep removes the most recent `rcu_read_lock` (#2)

So lockdep should have:

*   #0: `rcu_read_lock`
*   #1: `j_list_lock`

But the trace is showing something different. There's this mysterious third `rcu_read_lock`!

Let's go back to the trace for a better view:

```



240/2 2026/05/31 23:18 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:1020 LineCount:50]

Results:
map[Contents:1020:				clear_buffer_jbddirty(bh);
1021:	
1022:				/*
1023:				 * Block device buffers need to stay mapped all the
1024:				 * time, so it is enough to clear buffer_jbddirty and
1025:				 * buffer_freed bits. For the file mapping buffers (i.e.
1026:				 * journalled data) we need to unmap buffer and clear
1027:				 * more bits. We also need to be careful about the check
1028:				 * because the data page mapping can get cleared under
1029:				 * our hands. Note that if mapping == NULL, we don't
1030:				 * need to make buffer unmapped because the page is
1031:				 * already detached from the mapping and buffers cannot
1032:				 * get reused.
1033:				 */
1034:				mapping = READ_ONCE(bh->b_folio->mapping);
1035:				if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) {
1036:					clear_buffer_mapped(bh);
1037:					clear_buffer_new(bh);
1038:					clear_buffer_req(bh);
1039:					bh->b_bdev = NULL;
1040:				}
1041:			}
1042:	
1043:			if (buffer_jbddirty(bh)) {
1044:				JBUFFER_TRACE(jh, "add to new checkpointing trans");
1045:				__jbd2_journal_insert_checkpoint(jh, commit_transaction);
1046:				if (is_journal_aborted(journal))
1047:					clear_buffer_jbddirty(bh);
1048:			} else {
1049:				J_ASSERT_BH(bh, !buffer_dirty(bh));
1050:				/*
1051:				 * The buffer on BJ_Forget list and not jbddirty means
1052:				 * it has been freed by this transaction and hence it
1053:				 * could not have been reallocated until this
1054:				 * transaction has committed. *BUT* it could be
1055:				 * reallocated once we have written all the data to
1056:				 * disk and before we process the buffer on BJ_Forget
1057:				 * list.
1058:				 */
1059:				if (!jh->b_next_transaction)
1060:					try_to_free = 1;
1061:			}
1062:			JBUFFER_TRACE(jh, "refile or unfile buffer");
1063:			drop_ref = __jbd2_journal_refile_buffer(jh);
1064:			spin_unlock(&jh->b_state_lock);
1065:			if (drop_ref)
1066:				jbd2_journal_put_journal_head(jh);
1067:			if (try_to_free)
1068:				release_buffer_page(bh);	/* Drops bh reference */
1069:			else
]

241/2 2026/05/31 23:18 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 41633
							output: 43
							thoughts: 30
						

Thoughts:
Okay, here's my interpretation of those thoughts, tailored for an expert audience, and delivered as a first-person summary:

**Digging into that `jbd2` Checkpoint**

Alright, let's see. I'm looking at this trace, and I see `__jbd2_journal_insert_checkpoint` being called at timestamp 1045. That's a key function in `jbd2`, the journal block device code, and its a key point of consistency within the ext journaling filesystem. My immediate instinct is to think about locking. Anytime I see a function this central, my first question is always: What locks are held, and what locks are acquired and released within that function? The whole point is to keep the filesystem safe.

I need to dive deeper to understand the concurrent access patterns around this function. What kind of critical sections are defined here? I know it deals with checkpointing the journal, so I need to confirm my assumptions around the journal_mutex, but I need to make sure I am taking everything into account, because other threads, other writers may be modifying the journal at that time. I need to know how it interacts with other operations like committing transactions or flushing journal blocks. And if I am seeing any type of contention, I can track down if this is something inherent to the workload, something that I can tune, or if there is something more sinister here. I'll need to trace the context of this function call to fully understand its implications on performance or potential deadlocks.



242/2 2026/05/31 23:18 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/commit.c Name:__jbd2_journal_insert_checkpoint]

Results:
map[SourceCode: 661:	/*
 662:	 * journal_insert_checkpoint: put a committed buffer onto a checkpoint
 663:	 * list so that we know when it is safe to clean the transaction out of
 664:	 * the log.
 665:	 *
 666:	 * Called with the journal locked.
 667:	 * Called with j_list_lock held.
 668:	 */
 669:	void __jbd2_journal_insert_checkpoint(struct journal_head *jh,
 670:				       transaction_t *transaction)
 671:	{
 672:		JBUFFER_TRACE(jh, "entry");
 673:		J_ASSERT_JH(jh, buffer_dirty(jh2bh(jh)) || buffer_jbddirty(jh2bh(jh)));
 674:		J_ASSERT_JH(jh, jh->b_cp_transaction == NULL);
 675:	
 676:		/* Get reference for checkpointing transaction */
 677:		jbd2_journal_grab_journal_head(jh2bh(jh));
 678:		jh->b_cp_transaction = transaction;
 679:	
 680:		if (!transaction->t_checkpoint_list) {
 681:			jh->b_cpnext = jh->b_cpprev = jh;
 682:		} else {
 683:			jh->b_cpnext = transaction->t_checkpoint_list;
 684:			jh->b_cpprev = transaction->t_checkpoint_list->b_cpprev;
 685:			jh->b_cpprev->b_cpnext = jh;
 686:			jh->b_cpnext->b_cpprev = jh;
 687:		}
 688:		transaction->t_checkpoint_list = jh;
 689:		percpu_counter_inc(&transaction->t_journal->j_checkpoint_jh_count);
 690:	}
 SourceFile:fs/jbd2/checkpoint.c]

243/2 2026/05/31 23:18 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 42568
							output: 44
							thoughts: 18
						

Thoughts:
Okay, here's my interpretation of that thought process, tailored for an expert audience, and presented as if it were my own internal monologue:

**Investigating Journal Refiling**

Alright, I'm digging into this journal code... and that `__jbd2_journal_refile_buffer(jh)` function keeps popping up in my mind. Specifically, when I see these issues, I immediately think, "Is this where the problem lies?"

It's a critical piece, right? We're talking about taking a buffer and organizing it within the journal, and the potential failure points here are numerous. I'm wondering, could there be a subtle race condition in the way that function handles the `jh` (journal handle)? Are we seeing any corruption of the journal data or Metadata?

I need to revisit the flow of this function and think through all the possible scenarios, especially under heavy load or during system crashes. Is it possible that the function isn't adequately protecting its critical sections? Are the locks granular enough? What about the atomicity of the operations involved in refiling a buffer? I really need to drill down into the internals here to ensure it is robust. Time to delve into the source.



244/2 2026/05/31 23:18 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/commit.c Name:__jbd2_journal_refile_buffer]

Results:
map[SourceCode:2607:	/*
2608:	 * Remove a buffer from its current buffer list in preparation for
2609:	 * dropping it from its current transaction entirely.  If the buffer has
2610:	 * already started to be used by a subsequent transaction, refile the
2611:	 * buffer on that transaction's metadata list.
2612:	 *
2613:	 * Called under j_list_lock
2614:	 * Called under jh->b_state_lock
2615:	 *
2616:	 * When this function returns true, there's no next transaction to refile to
2617:	 * and the caller has to drop jh reference through
2618:	 * jbd2_journal_put_journal_head().
2619:	 */
2620:	bool __jbd2_journal_refile_buffer(struct journal_head *jh)
2621:	{
2622:		int was_dirty, jlist;
2623:		struct buffer_head *bh = jh2bh(jh);
2624:	
2625:		lockdep_assert_held(&jh->b_state_lock);
2626:		if (jh->b_transaction)
2627:			assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock);
2628:	
2629:		/* If the buffer is now unused, just drop it. */
2630:		if (jh->b_next_transaction == NULL) {
2631:			__jbd2_journal_unfile_buffer(jh);
2632:			return true;
2633:		}
2634:	
2635:		/*
2636:		 * It has been modified by a later transaction: add it to the new
2637:		 * transaction's metadata list.
2638:		 */
2639:	
2640:		was_dirty = test_clear_buffer_jbddirty(bh);
2641:		__jbd2_journal_temp_unlink_buffer(jh);
2642:	
2643:		/*
2644:		 * b_transaction must be set, otherwise the new b_transaction won't
2645:		 * be holding jh reference
2646:		 */
2647:		J_ASSERT_JH(jh, jh->b_transaction != NULL);
2648:	
2649:		/*
2650:		 * We set b_transaction here because b_next_transaction will inherit
2651:		 * our jh reference and thus __jbd2_journal_file_buffer() must not
2652:		 * take a new one.
2653:		 */
2654:		WRITE_ONCE(jh->b_transaction, jh->b_next_transaction);
2655:		WRITE_ONCE(jh->b_next_transaction, NULL);
2656:		if (buffer_freed(bh))
2657:			jlist = BJ_Forget;
2658:		else if (jh->b_modified)
2659:			jlist = BJ_Metadata;
2660:		else
2661:			jlist = BJ_Reserved;
2662:		__jbd2_journal_file_buffer(jh, jh->b_transaction, jlist);
2663:		J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING);
2664:	
2665:		if (was_dirty)
2666:			set_buffer_jbddirty(bh);
2667:		return false;
2668:	}
 SourceFile:fs/jbd2/transaction.c]

245/2 2026/05/31 23:18 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 43868
							output: 43
							thoughts: 29
						

Thoughts:
Okay, here's my interpretation of that thought process, assuming I'm deeply familiar with file system internals:

**Diving into the `__jbd2_journal_file_buffer` Call**

Hmm, wait a second. I'm seeing that `__jbd2_journal_file_buffer` function being called at line 2662. That's a key function in the JBD2 journaling system, and usually associated with direct I/O. My immediate concern, as always when I see a core function like this, is locking. Are there any mutexes, spinlocks, or other synchronization primitives being acquired or released within that function? If so, which ones and are they well-documented. What's the context? Any potential for deadlock here, given the overall architecture of this section of code? I need to understand the lock hierarchy at play to be sure. I'll need to double check the code.



246/2 2026/05/31 23:18 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:__jbd2_journal_file_buffer]

Results:
map[SourceCode:2528:	/*
2529:	 * File a buffer on the given transaction list.
2530:	 */
2531:	void __jbd2_journal_file_buffer(struct journal_head *jh,
2532:				transaction_t *transaction, int jlist)
2533:	{
2534:		struct journal_head **list = NULL;
2535:		int was_dirty = 0;
2536:		struct buffer_head *bh = jh2bh(jh);
2537:	
2538:		lockdep_assert_held(&jh->b_state_lock);
2539:		assert_spin_locked(&transaction->t_journal->j_list_lock);
2540:	
2541:		J_ASSERT_JH(jh, jh->b_jlist < BJ_Types);
2542:		J_ASSERT_JH(jh, jh->b_transaction == transaction ||
2543:					jh->b_transaction == NULL);
2544:	
2545:		if (jh->b_transaction && jh->b_jlist == jlist)
2546:			return;
2547:	
2548:		if (jlist == BJ_Metadata || jlist == BJ_Reserved ||
2549:		    jlist == BJ_Shadow || jlist == BJ_Forget) {
2550:			/*
2551:			 * For metadata buffers, we track dirty bit in buffer_jbddirty
2552:			 * instead of buffer_dirty. We should not see a dirty bit set
2553:			 * here because we clear it in do_get_write_access but e.g.
2554:			 * tune2fs can modify the sb and set the dirty bit at any time
2555:			 * so we try to gracefully handle that.
2556:			 */
2557:			if (buffer_dirty(bh))
2558:				warn_dirty_buffer(bh);
2559:			if (test_clear_buffer_dirty(bh) ||
2560:			    test_clear_buffer_jbddirty(bh))
2561:				was_dirty = 1;
2562:		}
2563:	
2564:		if (jh->b_transaction)
2565:			__jbd2_journal_temp_unlink_buffer(jh);
2566:		else
2567:			jbd2_journal_grab_journal_head(bh);
2568:		jh->b_transaction = transaction;
2569:	
2570:		switch (jlist) {
2571:		case BJ_None:
2572:			J_ASSERT_JH(jh, !jh->b_committed_data);
2573:			J_ASSERT_JH(jh, !jh->b_frozen_data);
2574:			return;
2575:		case BJ_Metadata:
2576:			transaction->t_nr_buffers++;
2577:			list = &transaction->t_buffers;
2578:			break;
2579:		case BJ_Forget:
2580:			list = &transaction->t_forget;
2581:			break;
2582:		case BJ_Shadow:
2583:			list = &transaction->t_shadow_list;
2584:			break;
2585:		case BJ_Reserved:
2586:			list = &transaction->t_reserved_list;
2587:			break;
2588:		}
2589:	
2590:		__blist_add_buffer(list, jh);
2591:		jh->b_jlist = jlist;
2592:	
2593:		if (was_dirty)
2594:			set_buffer_jbddirty(bh);
2595:	}
 SourceFile:fs/jbd2/transaction.c]

247/2 2026/05/31 23:18 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 45181
							output: 44
							thoughts: 30
						

Thoughts:
Okay, here's my summary, presented as a stream of thought:

**Diving into the `jbd2` Code**

Alright, I'm digging into this `jbd2` code again, specifically trying to understand this function call at line 2567. Let's see... it's `jbd2_journal_grab_journal_head`. The immediate question that pops into my head, as it always does in these lock-heavy areas, is: does this thing acquire any locks? That's the critical piece of information. The potential for contention and deadlocks is always top of mind when I'm dealing with journal code and these low-level synchronization primitives. I need to understand if it’s grabbing a spinlock, a mutex, or something else entirely. If so, what is the scope of that lock, and what other functions could be blocked by it? This is where the real work begins.



248/2 2026/05/31 23:18 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:jbd2_journal_grab_journal_head]

Results:
map[SourceCode:2941:	/*
2942:	 * Grab a ref against this buffer_head's journal_head.  If it ended up not
2943:	 * having a journal_head, return NULL
2944:	 */
2945:	struct journal_head *jbd2_journal_grab_journal_head(struct buffer_head *bh)
2946:	{
2947:		struct journal_head *jh = NULL;
2948:	
2949:		jbd_lock_bh_journal_head(bh);
2950:		if (buffer_jbd(bh)) {
2951:			jh = bh2jh(bh);
2952:			jh->b_jcount++;
2953:		}
2954:		jbd_unlock_bh_journal_head(bh);
2955:		return jh;
2956:	}
 SourceFile:fs/jbd2/journal.c]

249/2 2026/05/31 23:18 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 45719
							output: 36
							thoughts: 753
						

Thoughts:
**Debugging a Potential RCU LIFO Violation**

Okay, so I'm looking at this `jbd2` code and trying to figure out how we're getting this RCU LIFO violation. The report says the RCU nest depth is 2, but it *should* be 1, so something's not adding up.

First thought: `jbd_lock_bh_journal_head` uses `bit_spin_lock`, and that calls `preempt_disable()`. Could that be the culprit? Does that have *anything* to do with `rcu_read_lock` being acquired somehow? No, that doesn't seem likely.

Then I noticed that `jbd2_journal_put_journal_head` is called at line 1066 under certain circumstances. That means we have:
```c
1064:		spin_unlock(&jh->b_state_lock);
1065:		if (drop_ref)
1066:			jbd2_journal_put_journal_head(jh);
```
`drop_ref` is returned from `__jbd2_journal_refile_buffer(jh)`. If `drop_ref` is true, then `jbd2_journal_put_journal_head(jh)` gets called. `jbd2_journal_put_journal_head` then calls `jbd_lock_bh_journal_head(bh)`, which calls `bit_spin_lock`, which disables preemption. It then calls `jbd_unlock_bh_journal_head(bh)`, which calls `bit_spin_unlock` which enables preemption. Does that have *anything* to do with RCU? No, it looks like it can't.

Alright, let's rethink the LIFO violation. I need to trace the lock acquisition and release order to see if I can find a mismatch. I believe the locks are acquired in this order:

1.  `spin_lock(&jh->b_state_lock)`
2.  `spin_lock(&journal->j_list_lock)`

And unlocked in the following order:

1.  `spin_unlock(&jh->b_state_lock)`
2.  `cond_resched_lock(&journal->j_list_lock)`. Now, does `cond_resched_lock` internally call `spin_unlock(&journal->j_list_lock)`? No, it doesn't, it checks if it needs to reschedule. If so, it unlocks, reschedules, and locks again. But BEFORE it unlocks it calls `__might_resched()`.

`__might_resched()` checks if the current context is valid for sleeping. Specifically, it checks if `preempt_count() == PREEMPT_LOCK_RESCHED_OFFSETS`. And `PREEMPT_LOCK_RESCHED_OFFSETS` is calculated as `PREEMPT_LOCK_OFFSET + (1U << MIGHT_RESCHED_RCU_SHIFT)`. Which indicates it expects `rcu_preempt_depth() == 1`.

But it's saying the RCU depth is 2! Why is it 2? Let's trace it out.

1.  `spin_lock(&jh->b_state_lock)` -> `rcu_read_lock()` -> depth = 1
2.  `spin_lock(&journal->j_list_lock)` -> `rcu_read_lock()` -> depth = 2
3.  `spin_unlock(&jh->b_state_lock)` -> `rt_spin_unlock(&jh->b_state_lock)` -> `rcu_read_unlock()` -> depth = 1. Wait, if `rcu_read_unlock()` decrements the depth to 1, then `rcu_preempt_depth()` SHOULD BE 1!

Why am I seeing this 2, when I should be seeing 1? What am I missing? I need to check `rt_spin_unlock` again, something isn't right here.



250/2 2026/05/31 23:18 tool read-file
0m Args:
map[File:kernel/locking/spinlock_rt.c FirstLine:70 LineCount:30]

Results:
map[Contents:  70:					    struct lockdep_map *nest_lock)
  71:	{
  72:		spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_);
  73:		__rt_spin_lock(lock);
  74:	}
  75:	EXPORT_SYMBOL(rt_spin_lock_nest_lock);
  76:	#endif
  77:	
  78:	void __sched rt_spin_unlock(spinlock_t *lock) __releases(RCU)
  79:	{
  80:		spin_release(&lock->dep_map, _RET_IP_);
  81:		migrate_enable();
  82:		rcu_read_unlock();
  83:	
  84:		if (unlikely(!rt_mutex_cmpxchg_release(&lock->lock, current, NULL)))
  85:			rt_mutex_slowunlock(&lock->lock);
  86:	}
  87:	EXPORT_SYMBOL(rt_spin_unlock);
  88:	
  89:	/*
  90:	 * Wait for the lock to get unlocked: instead of polling for an unlock
  91:	 * (like raw spinlocks do), lock and unlock, to force the kernel to
  92:	 * schedule if there's contention:
  93:	 */
  94:	void __sched rt_spin_lock_unlock(spinlock_t *lock)
  95:	{
  96:		spin_lock(lock);
  97:		spin_unlock(lock);
  98:	}
  99:	EXPORT_SYMBOL(rt_spin_lock_unlock);
]

251/2 2026/05/31 23:18 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 47835
							output: 37
							thoughts: 2037
						

Thoughts:
**RCU Depth Mystery in `jbd2_journal_commit_transaction`**

Okay, so I'm digging into this RCU nesting depth issue, and it's got me scratching my head. The core problem is that `rt_spin_unlock` *should* call `rcu_read_unlock()`, which, in turn, decrements `current->rcu_read_lock_nesting`. If the nesting was at 2, it should drop to 1. But the trace is still reporting a depth of 2, and that's not right.

I went back to the lockdep trace and I see three calls to `rcu_read_lock`. I am expecting one `rcu_read_unlock` call. The depth should be 2, but where's the third lock? Something is going on.

Then I start looking at `jbd2_journal_commit_transaction` and, specifically, the loop there. I see a `spin_lock` on `journal->j_list_lock` (line 948), followed by an unlock on line 956, and then a re-lock on `jh->b_state_lock` (line 963). And another lock on `journal->j_list_lock` on line 993, then an unlock on `jh->b_state_lock` (line 1064), and a `cond_resched_lock` on `journal->j_list_lock` on line 1071. That last one *could* be the key.

Here's the problem: `cond_resched_lock` leaves the lock HELD if it *doesn't* reschedule, which is the normal case if there's no contention. If it does reschedule, it calls `spin_unlock` and `spin_lock`, but in the other case it leaves the lock held. And that means it doesn't call `rcu_read_unlock`.

Let's trace it, RCU depth-wise, across iterations:
*   **Iteration 1:**
    *   Start: Depth = 0
    *   Line 948: `spin_lock(&journal->j_list_lock)` -> Depth = 1
    *   Line 956: `spin_unlock(&journal->j_list_lock)` -> Depth = 0
    *   Line 963: `spin_lock(&jh->b_state_lock)` -> Depth = 1
    *   Line 993: `spin_lock(&journal->j_list_lock)` -> Depth = 2
    *   Line 1064: `spin_unlock(&jh->b_state_lock)` -> Depth = 1
    *   Line 1071: `cond_resched_lock(&journal->j_list_lock)` -> Depth = 1

So, depth *should* be 1 at 1071 and `__might_resched` is expecting 1. But it says it's 2! WHY?

I'm back to looking at that lockdep trace again. And here it is! Lock #0 is an `rcu_read_lock` acquired at `rt_spin_lock`. *Could* `rt_spin_lock` be called from *somewhere else*? I need to check the code *before* line 948 in `jbd2_journal_commit_transaction`. I need to figure out how many calls to `rcu_read_lock` are active.



252/2 2026/05/31 23:19 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:900 LineCount:50]

Results:
map[Contents: 900:		commit_transaction->t_state = T_COMMIT_JFLUSH;
 901:		write_unlock(&journal->j_state_lock);
 902:	
 903:		if (!jbd2_has_feature_async_commit(journal)) {
 904:			err = journal_submit_commit_record(journal, commit_transaction,
 905:							&cbh, crc32_sum);
 906:			if (err)
 907:				jbd2_journal_abort(journal, err);
 908:		}
 909:		if (cbh)
 910:			err = journal_wait_on_commit_record(journal, cbh);
 911:		stats.run.rs_blocks_logged++;
 912:		if (jbd2_has_feature_async_commit(journal) &&
 913:		    journal->j_flags & JBD2_BARRIER) {
 914:			blkdev_issue_flush(journal->j_dev);
 915:		}
 916:	
 917:		if (err)
 918:			jbd2_journal_abort(journal, err);
 919:	
 920:		WARN_ON_ONCE(
 921:			atomic_read(&commit_transaction->t_outstanding_credits) < 0);
 922:	
 923:		/*
 924:		 * Now disk caches for filesystem device are flushed so we are safe to
 925:		 * erase checkpointed transactions from the log by updating journal
 926:		 * superblock.
 927:		 */
 928:		if (update_tail)
 929:			jbd2_update_log_tail(journal, first_tid, first_block);
 930:	
 931:		/* End of a transaction!  Finally, we can do checkpoint
 932:	           processing: any buffers committed as a result of this
 933:	           transaction can be removed from any checkpoint list it was on
 934:	           before. */
 935:	
 936:		jbd2_debug(3, "JBD2: commit phase 6\n");
 937:	
 938:		J_ASSERT(list_empty(&commit_transaction->t_inode_list));
 939:		J_ASSERT(commit_transaction->t_buffers == NULL);
 940:		J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
 941:		J_ASSERT(commit_transaction->t_shadow_list == NULL);
 942:	
 943:	restart_loop:
 944:		/*
 945:		 * As there are other places (journal_unmap_buffer()) adding buffers
 946:		 * to this list we have to be careful and hold the j_list_lock.
 947:		 */
 948:		spin_lock(&journal->j_list_lock);
 949:		while (commit_transaction->t_forget) {
]

253/2 2026/05/31 23:19 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 51505
							output: 28
							thoughts: 53
						

Thoughts:
**A Quick Detour: The Rescheduling Mystery**

Hold on a minute! I've been assuming `cond_resched_lock` *doesn't* reschedule, but what if it *does*? That's a critical branching point I need to nail down. If rescheduling *does* occur within `cond_resched_lock`, then the code path would inevitably call `__cond_resched_lock`, correct? Okay, that's the key. I need to understand what happens inside `__cond_resched_lock` to fully grasp the potential implications of this lock's behavior. Time to dig into that function's implementation and see what it's up to.



254/2 2026/05/31 23:19 tool grepper
0m Args:
map[Expression:int __cond_resched_lock PathPrefix:]

Results:
map[Output:include/linux/sched.h=2133=static inline int _cond_resched(void)
--
include/linux/sched.h-2144-
include/linux/sched.h:2145:extern int __cond_resched_lock(spinlock_t *lock) __must_hold(lock);
include/linux/sched.h-2146-extern int __cond_resched_rwlock_read(rwlock_t *lock) __must_hold_shared(lock);
--
kernel/sched/core.c=7748=EXPORT_SYMBOL(dynamic_might_resched);
--
kernel/sched/core.c-7759- */
kernel/sched/core.c:7760:int __cond_resched_lock(spinlock_t *lock)
kernel/sched/core.c-7761-{
]

255/2 2026/05/31 23:19 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 51953
							output: 36
							thoughts: 20
						

Thoughts:
Okay, let's dive into this. I'm going to pull up `kernel/sched/core.c` and specifically pinpoint line 7760. I know this code base pretty well, so I'm expecting something critical to scheduling or possibly related to task management. My initial hunch is that we're likely in the heart of a function responsible for selecting the next task to run, or perhaps modifying an existing task's priority or affinity. I'll need to see the surrounding context to confirm. I'll be looking for any indications of spinlocks, atomic operations, or preemption management – all the usual suspects when we're dealing with the scheduler. I'm also anticipating some intricate calculations or comparisons, probably related to CPU load balancing, energy efficiency, or some other scheduling policy. I'm really curious what the code around that line is doing. I anticipate diving deep into this code section.



256/2 2026/05/31 23:19 tool read-file
0m Args:
map[File:kernel/sched/core.c FirstLine:7750 LineCount:50]

Results:
map[Contents:7750:	#endif /* CONFIG_PREEMPT_DYNAMIC */
7751:	
7752:	/*
7753:	 * __cond_resched_lock() - if a reschedule is pending, drop the given lock,
7754:	 * call schedule, and on return reacquire the lock.
7755:	 *
7756:	 * This works OK both with and without CONFIG_PREEMPTION. We do strange low-level
7757:	 * operations here to prevent schedule() from being called twice (once via
7758:	 * spin_unlock(), once by hand).
7759:	 */
7760:	int __cond_resched_lock(spinlock_t *lock)
7761:	{
7762:		int resched = should_resched(PREEMPT_LOCK_OFFSET);
7763:		int ret = 0;
7764:	
7765:		lockdep_assert_held(lock);
7766:	
7767:		if (spin_needbreak(lock) || resched) {
7768:			spin_unlock(lock);
7769:			if (!_cond_resched())
7770:				cpu_relax();
7771:			ret = 1;
7772:			spin_lock(lock);
7773:		}
7774:		return ret;
7775:	}
7776:	EXPORT_SYMBOL(__cond_resched_lock);
7777:	
7778:	int __cond_resched_rwlock_read(rwlock_t *lock)
7779:	{
7780:		int resched = should_resched(PREEMPT_LOCK_OFFSET);
7781:		int ret = 0;
7782:	
7783:		lockdep_assert_held_read(lock);
7784:	
7785:		if (rwlock_needbreak(lock) || resched) {
7786:			read_unlock(lock);
7787:			if (!_cond_resched())
7788:				cpu_relax();
7789:			ret = 1;
7790:			read_lock(lock);
7791:		}
7792:		return ret;
7793:	}
7794:	EXPORT_SYMBOL(__cond_resched_rwlock_read);
7795:	
7796:	int __cond_resched_rwlock_write(rwlock_t *lock)
7797:	{
7798:		int resched = should_resched(PREEMPT_LOCK_OFFSET);
7799:		int ret = 0;
]

257/2 2026/05/31 23:19 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 52914
							output: 38
							thoughts: 1034
						

Thoughts:
**Debugging a Potential RCU Read Lock Nesting Issue**

Okay, let's break this down. My initial thought was that `__cond_resched_lock` should perfectly balance the `rcu_read_lock` and `rcu_read_unlock` calls, as the call graph seemed to suggest: `spin_unlock` (which leads to `rcu_read_unlock`), `_cond_resched()`, then `spin_lock` (which leads to `rcu_read_lock`). It's designed to be transparent in this regard.

But the bug report is screaming at me: "sleeping function called from invalid context". Specifically, this is coming from a `__might_resched` call *within* `cond_resched_lock` at `fs/jbd2/commit.c:1071`. `cond_resched_lock` is just a macro that calls `__might_resched` *before* calling `__cond_resched_lock`, so that's where the problem originates. It seems the issue is that `__might_resched` is complaining because `rcu_preempt_depth()` is 2.

Alright, let's trace this and understand why the nesting depth is 2. Here's what I *thought* was happening:
1.  `spin_lock(&jh->b_state_lock)` calls `rcu_read_lock()` - nesting depth = 1.
2.  `spin_lock(&journal->j_list_lock)` calls `rcu_read_lock()` - nesting depth = 2.
3.  `spin_unlock(&jh->b_state_lock)` calls `rt_spin_unlock(&jh->b_state_lock)` which calls `rcu_read_unlock()` - nesting depth should be decremented to 1.

So I expected the depth to be 1, but it's 2, which is why `__might_resched` is warning.

The key is `rt_spin_unlock`. Looking at the code for that function, it explicitly calls `rcu_read_unlock()`. This should decrement the nesting depth. Then, I remember that `__rcu_read_unlock()` calls `rcu_preempt_read_exit()` which *definitely* decrements `current->rcu_read_lock_nesting`.

So, it *should* be decrementing. Why isn't it? The only possible explanation is that the `spin_unlock(&jh->b_state_lock)` call *isn't* actually happening.

But let's make sure, looking at the code, it's unconditionally called, so it *should* be happening. I then look at line 1064, which is the line with the unlock, so that's where it is. Wait, is it possible that `__jbd2_journal_refile_buffer(jh)` acquires `rcu_read_lock`?



258/2 2026/05/31 23:19 tool read-file
0m Args:
map[File:fs/jbd2/transaction.c FirstLine:2620 LineCount:50]

Results:
map[Contents:2620:	bool __jbd2_journal_refile_buffer(struct journal_head *jh)
2621:	{
2622:		int was_dirty, jlist;
2623:		struct buffer_head *bh = jh2bh(jh);
2624:	
2625:		lockdep_assert_held(&jh->b_state_lock);
2626:		if (jh->b_transaction)
2627:			assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock);
2628:	
2629:		/* If the buffer is now unused, just drop it. */
2630:		if (jh->b_next_transaction == NULL) {
2631:			__jbd2_journal_unfile_buffer(jh);
2632:			return true;
2633:		}
2634:	
2635:		/*
2636:		 * It has been modified by a later transaction: add it to the new
2637:		 * transaction's metadata list.
2638:		 */
2639:	
2640:		was_dirty = test_clear_buffer_jbddirty(bh);
2641:		__jbd2_journal_temp_unlink_buffer(jh);
2642:	
2643:		/*
2644:		 * b_transaction must be set, otherwise the new b_transaction won't
2645:		 * be holding jh reference
2646:		 */
2647:		J_ASSERT_JH(jh, jh->b_transaction != NULL);
2648:	
2649:		/*
2650:		 * We set b_transaction here because b_next_transaction will inherit
2651:		 * our jh reference and thus __jbd2_journal_file_buffer() must not
2652:		 * take a new one.
2653:		 */
2654:		WRITE_ONCE(jh->b_transaction, jh->b_next_transaction);
2655:		WRITE_ONCE(jh->b_next_transaction, NULL);
2656:		if (buffer_freed(bh))
2657:			jlist = BJ_Forget;
2658:		else if (jh->b_modified)
2659:			jlist = BJ_Metadata;
2660:		else
2661:			jlist = BJ_Reserved;
2662:		__jbd2_journal_file_buffer(jh, jh->b_transaction, jlist);
2663:		J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING);
2664:	
2665:		if (was_dirty)
2666:			set_buffer_jbddirty(bh);
2667:		return false;
2668:	}
2669:	
]

259/2 2026/05/31 23:19 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 55406
							output: 44
							thoughts: 32
						

Thoughts:
Okay, here's my take on those thoughts, framed as an expert's internal monologue:

**Investigating `__jbd2_journal_unfile_buffer(jh)`**

Alright, let's see... that function, `__jbd2_journal_unfile_buffer(jh)`, is called at line 2631. I need to understand the implications of this. My immediate concern is, what locking behavior does it exhibit? Is it acquiring any locks itself, or is it operating under the assumption that it's already protected by the relevant spinlocks or mutexes? Knowing this is absolutely crucial for understanding potential race conditions or deadlocks within the journaling subsystem. A quick check of its internal implementation is in order, I can't afford any surprises.



260/2 2026/05/31 23:19 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:__jbd2_journal_unfile_buffer]

Results:
map[SourceCode:2126:	/*
2127:	 * Remove buffer from all transactions. The caller is responsible for dropping
2128:	 * the jh reference that belonged to the transaction.
2129:	 *
2130:	 * Called with bh_state lock and j_list_lock
2131:	 */
2132:	static void __jbd2_journal_unfile_buffer(struct journal_head *jh)
2133:	{
2134:		J_ASSERT_JH(jh, jh->b_transaction != NULL);
2135:		J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
2136:	
2137:		__jbd2_journal_temp_unlink_buffer(jh);
2138:		jh->b_transaction = NULL;
2139:	}
 SourceFile:fs/jbd2/transaction.c]

261/2 2026/05/31 23:19 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 55895
							output: 45
							thoughts: 19
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Investigating a Journaling Issue**

Okay, so I'm digging into this journaling problem, and the first thing that's jumping out at me is `__jbd2_journal_temp_unlink_buffer(jh)`. I wonder, what's happening with this function? Is it a potential source of the issue I'm seeing? Is it being called at an unexpected time, or with incorrect parameters? Is there a race condition lurking within its logic? I need to refresh my memory on the precise purpose of `__jbd2_journal_temp_unlink_buffer` and how it interacts with the buffer cache and the overall journal operation. I know that function handles unlinking a buffer from the journal's temporary list, but *why* is it relevant now? What could go wrong here, given the symptoms? I need to trace its call stack and any associated data structures involved in the current issue's context. I also want to check the commit logs surrounding any recent changes to this function to see if anything was introduced which could explain this behavior. I'm going to carefully review the implementation of that function, looking for any subtle nuances that might be relevant.



262/2 2026/05/31 23:19 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:__jbd2_journal_temp_unlink_buffer]

Results:
map[SourceCode:2073:	/*
2074:	 * Remove a buffer from the appropriate transaction list.
2075:	 *
2076:	 * Note that this function can *change* the value of
2077:	 * bh->b_transaction->t_buffers, t_forget, t_shadow_list, t_log_list or
2078:	 * t_reserved_list.  If the caller is holding onto a copy of one of these
2079:	 * pointers, it could go bad.  Generally the caller needs to re-read the
2080:	 * pointer from the transaction_t.
2081:	 *
2082:	 * Called under j_list_lock.
2083:	 */
2084:	static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh)
2085:	{
2086:		struct journal_head **list = NULL;
2087:		transaction_t *transaction;
2088:		struct buffer_head *bh = jh2bh(jh);
2089:	
2090:		lockdep_assert_held(&jh->b_state_lock);
2091:		transaction = jh->b_transaction;
2092:		if (transaction)
2093:			assert_spin_locked(&transaction->t_journal->j_list_lock);
2094:	
2095:		J_ASSERT_JH(jh, jh->b_jlist < BJ_Types);
2096:		if (jh->b_jlist != BJ_None)
2097:			J_ASSERT_JH(jh, transaction != NULL);
2098:	
2099:		switch (jh->b_jlist) {
2100:		case BJ_None:
2101:			return;
2102:		case BJ_Metadata:
2103:			transaction->t_nr_buffers--;
2104:			J_ASSERT_JH(jh, transaction->t_nr_buffers >= 0);
2105:			list = &transaction->t_buffers;
2106:			break;
2107:		case BJ_Forget:
2108:			list = &transaction->t_forget;
2109:			break;
2110:		case BJ_Shadow:
2111:			list = &transaction->t_shadow_list;
2112:			break;
2113:		case BJ_Reserved:
2114:			list = &transaction->t_reserved_list;
2115:			break;
2116:		}
2117:	
2118:		__blist_del_buffer(list, jh);
2119:		jh->b_jlist = BJ_None;
2120:		if (transaction && is_journal_aborted(transaction->t_journal))
2121:			clear_buffer_jbddirty(bh);
2122:		else if (test_clear_buffer_jbddirty(bh))
2123:			mark_buffer_dirty(bh);	/* Expose it to the VM */
2124:	}
 SourceFile:fs/jbd2/transaction.c]

263/2 2026/05/31 23:19 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 57062
							output: 38
							thoughts: 33
						

Thoughts:
Okay, here's my take on those thoughts, framed from a hypothetical expert's perspective:

**Debugging a Kernel Buffer State**

Right, so I'm tracking down this potential issue, and the call to `mark_buffer_dirty(bh)` at line 2123 has caught my eye. The critical question here isn't just *that* the function is called, but the implications of it being called when it is. My brain immediately jumps to locking, or lack thereof. Does `mark_buffer_dirty` itself acquire any locks? That's the crux. Depending on whether it does, the surrounding code context and data structures and dependencies might need to be re-evaluated to prevent race conditions or unexpected state changes in the buffer. I need to know if the function implicitly locks or whether locking is handled outside the function. A simple glance at the source code might suffice, but given the depth and complexity, I will delve deeper. I'll need to know whether the function will block or return right away, and how it effects other operations on the same buffer. This could lead to a straightforward fix, or some serious architectural considerations. This will determine how I proceed with the analysis.



264/2 2026/05/31 23:19 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/transaction.c Name:mark_buffer_dirty]

Results:
map[SourceCode:1066:	/**
1067:	 * mark_buffer_dirty - mark a buffer_head as needing writeout
1068:	 * @bh: the buffer_head to mark dirty
1069:	 *
1070:	 * mark_buffer_dirty() will set the dirty bit against the buffer, then set
1071:	 * its backing page dirty, then tag the page as dirty in the page cache
1072:	 * and then attach the address_space's inode to its superblock's dirty
1073:	 * inode list.
1074:	 *
1075:	 * mark_buffer_dirty() is atomic.  It takes bh->b_folio->mapping->i_private_lock,
1076:	 * i_pages lock and mapping->host->i_lock.
1077:	 */
1078:	void mark_buffer_dirty(struct buffer_head *bh)
1079:	{
1080:		WARN_ON_ONCE(!buffer_uptodate(bh));
1081:	
1082:		trace_block_dirty_buffer(bh);
1083:	
1084:		/*
1085:		 * Very *carefully* optimize the it-is-already-dirty case.
1086:		 *
1087:		 * Don't let the final "is it dirty" escape to before we
1088:		 * perhaps modified the buffer.
1089:		 */
1090:		if (buffer_dirty(bh)) {
1091:			smp_mb();
1092:			if (buffer_dirty(bh))
1093:				return;
1094:		}
1095:	
1096:		if (!test_set_buffer_dirty(bh)) {
1097:			struct folio *folio = bh->b_folio;
1098:			struct address_space *mapping = NULL;
1099:	
1100:			if (!folio_test_set_dirty(folio)) {
1101:				mapping = folio->mapping;
1102:				if (mapping)
1103:					__folio_mark_dirty(folio, mapping, 0);
1104:			}
1105:			if (mapping)
1106:				__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
1107:		}
1108:	}
 SourceFile:fs/buffer.c]

265/2 2026/05/31 23:19 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 58041
							output: 26
							thoughts: 733
						

Thoughts:
**Debugging a PREEMPT_RT Lock Ordering Issue**

Okay, so I'm looking at this bug report and the RCU nesting depth is wrong, it seems. My initial thought was to double-check the RCU locking in the dirtying functions. Specifically, I was wondering if `__folio_mark_dirty` and `__mark_inode_dirty` were mishandling `rcu_read_lock`. They might acquire it internally, but they release it, so that's not the root cause. I quickly dismissed `mark_buffer_dirty` because even if it did acquire and release the lock, the depth shouldn't change, unless there's a missing unlock, but that would be a bug.

So, I had to rethink. This looks like a LIFO unlock order violation, particularly because this is PREEMPT_RT. Looking at this snippet of code:

```c
spin_lock(&jh->b_state_lock);
spin_lock(&journal->j_list_lock);
spin_unlock(&jh->b_state_lock);
```

I knew that on PREEMPT_RT, `spin_lock` calls `rt_spin_lock`, which in turn calls `rcu_read_lock`. `spin_unlock` calls `rt_spin_unlock` that calls `rcu_read_unlock`. Okay, so `rcu_read_unlock` decrements `current->rcu_read_lock_nesting`. If nesting was 2, it becomes 1. So, `rcu_preempt_depth()` should be 1. But the bug report says it's 2, when 1 is expected.

I had to look at `rt_spin_lock` closer. Ah ha!

```c
static __always_inline void __rt_spin_lock(spinlock_t *lock)
{
	rtlock_might_resched();
	rtlock_lock(&lock->lock);
	rcu_read_lock();
	migrate_disable();
}
```

Wait a second, `rcu_read_lock()` is *called after* `rtlock_lock(&lock->lock)`! And `rt_spin_unlock`...

```c
void __sched rt_spin_unlock(spinlock_t *lock) __releases(RCU)
{
	spin_release(&lock->dep_map, _RET_IP_);
	migrate_enable();
	rcu_read_unlock();

	if (unlikely(!rt_mutex_cmpxchg_release(&lock->lock, current, NULL)))
		rt_mutex_slowunlock(&lock->lock);
}
```

...calls `rcu_read_unlock()` *before* `rt_mutex_cmpxchg_release`.

So, the correct sequence of events is:
1.  `rtlock_lock(&jh->b_state_lock)`
2.  `rcu_read_lock()` -> depth 1
3.  `rtlock_lock(&journal->j_list_lock)`
4.  `rcu_read_lock()` -> depth 2
5.  `rcu_read_unlock()` -> depth 1
6.  `rt_mutex_cmpxchg_release(&jh->b_state_lock)`

The depth *is* 1, as expected! So where is the 2 coming from? Why is `__might_resched` complaining? I need to check the implementation of `__might_resched` in `kernel/sched/core.c` and understand what it is looking for.



266/2 2026/05/31 23:19 tool grepper
0m Args:
map[Expression:void __might_resched PathPrefix:]

Results:
map[Output:include/linux/kernel.h=63=extern int dynamic_might_resched(void);
--
include/linux/kernel.h-72-#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
include/linux/kernel.h:73:extern void __might_resched(const char *file, int line, unsigned int offsets);
include/linux/kernel.h-74-extern void __might_sleep(const char *file, int line);
--
include/linux/kernel.h=76=extern void __cant_migrate(const char *file, int line);
--
include/linux/kernel.h-129-#else
include/linux/kernel.h:130:  static inline void __might_resched(const char *file, int line,
include/linux/kernel.h-131-				     unsigned int offsets) { }
--
kernel/sched/core.c=9107=static inline bool resched_offsets_ok(unsigned int offsets)
--
kernel/sched/core.c-9115-
kernel/sched/core.c:9116:void __might_resched(const char *file, int line, unsigned int offsets)
kernel/sched/core.c-9117-{
]

267/2 2026/05/31 23:19 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 59897
							output: 36
							thoughts: 20
						

Thoughts:
Okay, let's dive into this. I'm going to grab `kernel/sched/core.c` and zero in on the vicinity of line 9116. My brain is already anticipating the usual suspects - the scheduling core, probably a critical section dealing with task selection, runqueue management, or maybe even a specific task's lifecycle transition. Line numbers are a good starting point, but they don't tell the whole story. I'll need the surrounding context to truly understand what's happening. I'm expecting to find a conditional statement or some kind of important data structure manipulation that I can analyze. I'm ready to apply my mental map of the Linux scheduler to this specific point in the code. Let's see what interesting tidbits are hiding in there!



268/2 2026/05/31 23:19 tool read-file
0m Args:
map[File:kernel/sched/core.c FirstLine:9100 LineCount:50]

Results:
map[Contents:9100:		if (preempt_count() == preempt_offset)
9101:			return;
9102:	
9103:		pr_err("Preemption disabled at:");
9104:		print_ip_sym(KERN_ERR, ip);
9105:	}
9106:	
9107:	static inline bool resched_offsets_ok(unsigned int offsets)
9108:	{
9109:		unsigned int nested = preempt_count();
9110:	
9111:		nested += rcu_preempt_depth() << MIGHT_RESCHED_RCU_SHIFT;
9112:	
9113:		return nested == offsets;
9114:	}
9115:	
9116:	void __might_resched(const char *file, int line, unsigned int offsets)
9117:	{
9118:		/* Ratelimiting timestamp: */
9119:		static unsigned long prev_jiffy;
9120:	
9121:		unsigned long preempt_disable_ip;
9122:	
9123:		/* WARN_ON_ONCE() by default, no rate limit required: */
9124:		rcu_sleep_check();
9125:	
9126:		if ((resched_offsets_ok(offsets) && !irqs_disabled() &&
9127:		     !is_idle_task(current) && !current->non_block_count) ||
9128:		    system_state == SYSTEM_BOOTING || system_state > SYSTEM_RUNNING ||
9129:		    oops_in_progress)
9130:			return;
9131:	
9132:		if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)
9133:			return;
9134:		prev_jiffy = jiffies;
9135:	
9136:		/* Save this before calling printk(), since that will clobber it: */
9137:		preempt_disable_ip = get_preempt_disable_ip(current);
9138:	
9139:		pr_err("BUG: sleeping function called from invalid context at %s:%d\n",
9140:		       file, line);
9141:		pr_err("in_atomic(): %d, irqs_disabled(): %d, non_block: %d, pid: %d, name: %s\n",
9142:		       in_atomic(), irqs_disabled(), current->non_block_count,
9143:		       current->pid, current->comm);
9144:		pr_err("preempt_count: %x, expected: %x\n", preempt_count(),
9145:		       offsets & MIGHT_RESCHED_PREEMPT_MASK);
9146:	
9147:		if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
9148:			pr_err("RCU nest depth: %d, expected: %u\n",
9149:			       rcu_preempt_depth(), offsets >> MIGHT_RESCHED_RCU_SHIFT);
]

269/2 2026/05/31 23:19 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 60961
							output: 28
							thoughts: 91
						

Thoughts:
Here's my thought process, as if I were analyzing this code:

**Deduction on RCU Nesting**

Okay, hold on a second. I'm seeing `rcu_preempt_depth()` being printed as "RCU nest depth: %d." That seems straightforward enough. Now, the bug report specifies, "RCU nest depth: 2, expected: 1." So, if the print statement directly reflects the value of `rcu_preempt_depth()`, then it's clear: the current value of `rcu_preempt_depth()` is indeed 2! That's the first deduction.

The immediate question is... why? Why is `rcu_preempt_depth()` equal to 2 in this instance? We need to understand the control flow that led to this. The only reasonable next step is to dive right into the `rcu_preempt_depth()` function itself. Let's see how that value is being calculated and, more importantly, *why* it's at 2 when it's supposed to be 1. Time to trace that function.



270/2 2026/05/31 23:20 tool grepper
0m Args:
map[Expression:int rcu_preempt_depth PathPrefix:]

Results:
map[Output:include/linux/rcupdate.h=106=static inline void __rcu_read_unlock(void)
--
include/linux/rcupdate.h-112-
include/linux/rcupdate.h:113:static inline int rcu_preempt_depth(void)
include/linux/rcupdate.h-114-{
]

271/2 2026/05/31 23:20 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 61416
							output: 36
							thoughts: 20
						

Thoughts:
Okay, here's my attempt at summarizing the thought process, as if it were my own, assuming I'm an expert in my field.

**Diving into `rcupdate.h`**

Alright, time to dig in. I need to understand what's happening with the RCU (Read-Copy-Update) implementation, so I'm going to jump straight into `include/linux/rcupdate.h`. I've used this file many times, so I'm relatively familiar with it. I have a hunch about a specific area and want to examine it closely. Let's start around line 113. Hopefully, that will give me some insight into what I'm looking for... I'm expecting to find details relating to a specific synchronization primitive or data structure. This is where the magic really happens, so let's see what's being defined or declared.



272/2 2026/05/31 23:21 tool read-file
0m Args:
map[File:include/linux/rcupdate.h FirstLine:100 LineCount:20]

Results:
map[Contents: 100:	
 101:	static inline void __rcu_read_lock(void)
 102:	{
 103:		preempt_disable();
 104:	}
 105:	
 106:	static inline void __rcu_read_unlock(void)
 107:	{
 108:		if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
 109:			rcu_read_unlock_strict();
 110:		preempt_enable();
 111:	}
 112:	
 113:	static inline int rcu_preempt_depth(void)
 114:	{
 115:		return 0;
 116:	}
 117:	
 118:	#endif /* #else #ifdef CONFIG_PREEMPT_RCU */
 119:	
]

273/2 2026/05/31 23:21 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 61916
							output: 27
							thoughts: 22
						

Thoughts:
Okay, here's my interpretation of those thoughts, tailored for an expert audience:

**Identifying the RCU Flavor**

Hmm, hold on a second... that code snippet or concept description I'm looking at, yeah, that's definitely the non-preemptible Read-Copy-Update implementation. I recognize the signature. But wait. Where's the preemption-capable RCU variant? The one that gives you that much finer granularity and potentially better responsiveness under heavy load? I'm missing something, the preemptive version is eluding me. I need to figure out where that reference is, or how it differs from this one. I am not seeing the typical markers.



274/2 2026/05/31 23:21 tool grepper
0m Args:
map[Expression:rcu_preempt_depth PathPrefix:]

Results:
map[Output:fs/erofs/zdata.c=1433=static inline bool z_erofs_in_atomic(void)
fs/erofs/zdata.c-1434-{
fs/erofs/zdata.c:1435:	if (IS_ENABLED(CONFIG_PREEMPTION) && rcu_preempt_depth())
fs/erofs/zdata.c-1436-		return true;
--
include/linux/rcupdate.h=83=void __rcu_read_unlock(void);
--
include/linux/rcupdate.h-90- */
include/linux/rcupdate.h:91:#define rcu_preempt_depth() READ_ONCE(current->rcu_read_lock_nesting)
include/linux/rcupdate.h-92-
--
include/linux/rcupdate.h=106=static inline void __rcu_read_unlock(void)
--
include/linux/rcupdate.h-112-
include/linux/rcupdate.h:113:static inline int rcu_preempt_depth(void)
include/linux/rcupdate.h-114-{
--
include/linux/sched.h=2147=extern int __cond_resched_rwlock_write(rwlock_t *lock) __must_hold(lock);
--
include/linux/sched.h-2161- * cond_resched*lock() has to take that into account because it checks for
include/linux/sched.h:2162: * preempt_count() and rcu_preempt_depth().
include/linux/sched.h-2163- */
--
kernel/locking/spinlock_rt.c-32-#define RTLOCK_RESCHED_OFFSETS						\
kernel/locking/spinlock_rt.c:33:	(rcu_preempt_depth() << MIGHT_RESCHED_RCU_SHIFT)
kernel/locking/spinlock_rt.c-34-
--
kernel/rcu/rcutorture.c=497=static int rcu_torture_readlock_nesting(void)
--
kernel/rcu/rcutorture.c-499-	if (IS_ENABLED(CONFIG_PREEMPT_RCU))
kernel/rcu/rcutorture.c:500:		return rcu_preempt_depth();
kernel/rcu/rcutorture.c-501-	if (IS_ENABLED(CONFIG_PREEMPT_COUNT))
--
kernel/rcu/tree_exp.h=749=static void rcu_exp_handler(void *unused)
kernel/rcu/tree_exp.h-750-{
kernel/rcu/tree_exp.h:751:	int depth = rcu_preempt_depth();
kernel/rcu/tree_exp.h-752-	unsigned long flags;
--
kernel/rcu/tree_plugin.h=324=void rcu_note_context_switch(bool preempt)
--
kernel/rcu/tree_plugin.h-331-	lockdep_assert_irqs_disabled();
kernel/rcu/tree_plugin.h:332:	WARN_ONCE(!preempt && rcu_preempt_depth() > 0, "Voluntary context switch within RCU read-side critical section!");
kernel/rcu/tree_plugin.h:333:	if (rcu_preempt_depth() > 0 &&
kernel/rcu/tree_plugin.h-334-	    !t->rcu_read_unlock_special.b.blocked) {
--
kernel/rcu/tree_plugin.h=394=static int rcu_preempt_read_exit(void)
--
kernel/rcu/tree_plugin.h-401-
kernel/rcu/tree_plugin.h:402:static void rcu_preempt_depth_set(int val)
kernel/rcu/tree_plugin.h-403-{
--
kernel/rcu/tree_plugin.h=412=void __rcu_read_lock(void)
--
kernel/rcu/tree_plugin.h-415-	if (IS_ENABLED(CONFIG_PROVE_LOCKING))
kernel/rcu/tree_plugin.h:416:		WARN_ON_ONCE(rcu_preempt_depth() > RCU_NEST_PMAX);
kernel/rcu/tree_plugin.h-417-	if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) && rcu_state.gp_kthread)
--
kernel/rcu/tree_plugin.h=430=void __rcu_read_unlock(void)
--
kernel/rcu/tree_plugin.h-440-	if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
kernel/rcu/tree_plugin.h:441:		int rrln = rcu_preempt_depth();
kernel/rcu/tree_plugin.h-442-
--
kernel/rcu/tree_plugin.h=600=static notrace bool rcu_preempt_need_deferred_qs(struct task_struct *t)
--
kernel/rcu/tree_plugin.h-603-		READ_ONCE(t->rcu_read_unlock_special.s)) &&
kernel/rcu/tree_plugin.h:604:	       rcu_preempt_depth() == 0;
kernel/rcu/tree_plugin.h-605-}
--
kernel/rcu/tree_plugin.h=627=static void rcu_preempt_deferred_qs_handler(struct irq_work *iwp)
--
kernel/rcu/tree_plugin.h-642-	 * 2. CPU enters new rcu_read_lock()
kernel/rcu/tree_plugin.h:643:	 * 3. IRQ work runs but cannot report QS due to rcu_preempt_depth() > 0
kernel/rcu/tree_plugin.h-644-	 * 4. rcu_read_unlock() does not re-queue work (state still PENDING)
--
kernel/rcu/tree_plugin.h-646-	 */
kernel/rcu/tree_plugin.h:647:	if (rcu_preempt_depth() > 0)
kernel/rcu/tree_plugin.h-648-		WRITE_ONCE(rdp->defer_qs_pending, DEFER_QS_IDLE);
--
kernel/rcu/tree_plugin.h=810=static void rcu_flavor_sched_clock_irq(int user)
--
kernel/rcu/tree_plugin.h-814-	lockdep_assert_irqs_disabled();
kernel/rcu/tree_plugin.h:815:	if (rcu_preempt_depth() > 0 ||
kernel/rcu/tree_plugin.h-816-	    (preempt_count() & (PREEMPT_MASK | SOFTIRQ_MASK))) {
--
kernel/rcu/tree_plugin.h-822-		return;
kernel/rcu/tree_plugin.h:823:	} else if (!WARN_ON_ONCE(rcu_preempt_depth())) {
kernel/rcu/tree_plugin.h-824-		rcu_qs(); /* Report immediate QS. */
--
kernel/rcu/tree_plugin.h-828-	/* If GP is oldish, ask for help from rcu_read_unlock_special(). */
kernel/rcu/tree_plugin.h:829:	if (rcu_preempt_depth() > 0 &&
kernel/rcu/tree_plugin.h-830-	    __this_cpu_read(rcu_data.core_needs_qs) &&
--
kernel/rcu/tree_plugin.h=845=void exit_rcu(void)
--
kernel/rcu/tree_plugin.h-849-	if (unlikely(!list_empty(&current->rcu_node_entry))) {
kernel/rcu/tree_plugin.h:850:		rcu_preempt_depth_set(1);
kernel/rcu/tree_plugin.h-851-		barrier();
kernel/rcu/tree_plugin.h-852-		WRITE_ONCE(t->rcu_read_unlock_special.b.blocked, true);
kernel/rcu/tree_plugin.h:853:	} else if (unlikely(rcu_preempt_depth())) {
kernel/rcu/tree_plugin.h:854:		rcu_preempt_depth_set(1);
kernel/rcu/tree_plugin.h-855-	} else {
--
kernel/sched/core.c=9107=static inline bool resched_offsets_ok(unsigned int offsets)
--
kernel/sched/core.c-9110-
kernel/sched/core.c:9111:	nested += rcu_preempt_depth() << MIGHT_RESCHED_RCU_SHIFT;
kernel/sched/core.c-9112-
--
kernel/sched/core.c=9116=void __might_resched(const char *file, int line, unsigned int offsets)
--
kernel/sched/core.c-9148-		pr_err("RCU nest depth: %d, expected: %u\n",
kernel/sched/core.c:9149:		       rcu_preempt_depth(), offsets >> MIGHT_RESCHED_RCU_SHIFT);
kernel/sched/core.c-9150-	}
--
kernel/workqueue.c=3202=__acquires(&pool->lock)
--
kernel/workqueue.c-3272-
kernel/workqueue.c:3273:	rcu_start_depth = rcu_preempt_depth();
kernel/workqueue.c-3274-	lockdep_start_depth = lockdep_depth(current);
--
kernel/workqueue.c-3314-		     lockdep_depth(current) != lockdep_start_depth ||
kernel/workqueue.c:3315:		     rcu_preempt_depth() != rcu_start_depth)) {
kernel/workqueue.c-3316-		pr_err("BUG: workqueue leaked atomic, lock or RCU: %s[%d]\n"
--
kernel/workqueue.c-3319-		       lockdep_start_depth, lockdep_depth(current),
kernel/workqueue.c:3320:		       rcu_start_depth, rcu_preempt_depth(),
kernel/workqueue.c-3321-		       worker->current_func);
]

275/2 2026/05/31 23:21 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 64789
							output: 38
							thoughts: 4956
						

Thoughts:
**Analyzing the RCU Nesting Depth Issue in `jbd2_journal_commit_transaction`**

Okay, so I'm digging into this RCU nesting depth issue, where it's reporting a depth of 2, but expecting only 1. The lockdep trace is key. I see that `rcu_read_lock` is showing up twice in the trace. The code snippet I'm looking at involves the `j_list_lock`, the `jh->b_state_lock`, and calls to `jbd2_journal_put_journal_head`.

First, the basic flow: We acquire `j_list_lock`, then there's a loop that potentially involves acquiring `jh->b_state_lock`, then *unlocking* `j_list_lock`, then re-acquiring it.  I'm focusing on why the RCU nesting depth is getting incremented incorrectly.

Initially, I went through the basic flow, making sure locks are *unconditionally* unlocked. I'm focusing on the unlock/lock pairs in that loop.

Then I realized something: `spin_lock(&journal->j_list_lock)` calls `rt_spin_lock`, which uses an RCU read lock.  So, the RCU depth increments *inside* the `spin_lock`. Lock #0 in the report is an RCU lock, acquired *before* lock #1 (`j_list_lock`). Lock #2 is *another* RCU lock. This is where things get tricky.

I initially thought that the call to `jbd2_journal_put_journal_head` could be the culprit, but then I'm sure that it releases the lock correctly. So I stepped through the code again, especially the lockdep trace with `j_list_lock` being acquired and released, and then another lock `jh->b_state_lock` being acquired and released. I expected the RCU count to be decremented after *both* `j_list_lock` and `jh->b_state_lock` are unlocked.

The lockdep trace is showing: `rcu_read_lock`, `j_list_lock`, `rcu_read_lock`.

Initially, there is a mismatch. If depth is 2, shouldn't there be only 2 RCU locks? But in tracing the functions, I can see what I have been missing. Depth 2 = 2 `rcu_read_lock`s. Ok, good, this matches. However, it still does not explain how we get the depth to be 2.

I considered `cond_resched_lock` -- perhaps that was the issue? However, the code flow makes it difficult for that to be the issue since it unconditionally calls `spin_unlock`.

Ah! Then I realized, the bug report says `RCU nest depth: 2`. I re-read the bug report carefully. If depth is 2, then `rcu_read_unlock()` has *not* been called *somewhere*! But that's impossible within the current scope and known locks!  So I went back through all the conditions.  The depth would have to be incremented *outside* this scope.

Wait! I see that it is possible for `jbd2_journal_commit_transaction` to call `jbd2_journal_commit_transaction` multiple times. Thus the depth can be deeper than expected!

The locks are released. But since the trace is happening, the RCU depth could be incremented and not fully decremented! The depth is 2. The trace is showing 2 instances of `rcu_read_lock`. The trace is correct.



276/2 2026/05/31 23:21 tool codesearch-definition-source
0m Args:
map[ContextFile:fs/jbd2/commit.c Name:release_buffer_page]

Results:
map[SourceCode:  49:	/*
  50:	 * When an ext4 file is truncated, it is possible that some pages are not
  51:	 * successfully freed, because they are attached to a committing transaction.
  52:	 * After the transaction commits, these pages are left on the LRU, with no
  53:	 * ->mapping, and with attached buffers.  These pages are trivially reclaimable
  54:	 * by the VM, but their apparent absence upsets the VM accounting, and it makes
  55:	 * the numbers in /proc/meminfo look odd.
  56:	 *
  57:	 * So here, we have a buffer which has just come off the forget list.  Look to
  58:	 * see if we can strip all buffers from the backing page.
  59:	 *
  60:	 * Called under j_list_lock. The caller provided us with a ref against the
  61:	 * buffer, and we drop that here.
  62:	 */
  63:	static void release_buffer_page(struct buffer_head *bh)
  64:	{
  65:		struct folio *folio;
  66:	
  67:		if (buffer_dirty(bh))
  68:			goto nope;
  69:		if (atomic_read(&bh->b_count) != 1)
  70:			goto nope;
  71:		folio = bh->b_folio;
  72:		if (folio->mapping)
  73:			goto nope;
  74:	
  75:		/* OK, it's a truncated page */
  76:		if (!folio_trylock(folio))
  77:			goto nope;
  78:	
  79:		folio_get(folio);
  80:		__brelse(bh);
  81:		try_to_free_buffers(folio);
  82:		folio_unlock(folio);
  83:		folio_put(folio);
  84:		return;
  85:	
  86:	nope:
  87:		__brelse(bh);
  88:	}
 SourceFile:fs/jbd2/commit.c]

277/2 2026/05/31 23:21 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 71139
							output: 37
							thoughts: 1584
						

Thoughts:
**Debugging a Potential RCU Lock Nesting Issue**

Alright, let's break this down. My initial thought was, could `try_to_free_buffers` be the culprit, possibly acquiring locks and forgetting to release them? But then I realized `release_buffer_page` is called much later, at line 1068, so that's likely not it. Okay, forget about that for now.

Let's carefully examine the LIFO unlock order: first, `jh->b_state_lock` (acquired with `spin_lock` and `rcu_read_lock`), then `journal->j_list_lock` (also acquired with `spin_lock` and `rcu_read_lock`). The corresponding unlocks should follow the opposite order. The call stack gives:

1.  `spin_lock(&jh->b_state_lock)` -> `rtlock_lock(&jh->b_state_lock)` -> `rcu_read_lock()`
2.  `spin_lock(&journal->j_list_lock)` -> `rtlock_lock(&journal->j_list_lock)` -> `rcu_read_lock()`
3.  `spin_unlock(&jh->b_state_lock)` -> `rt_spin_unlock(&jh->b_state_lock)` -> `rcu_read_unlock()` -> `rt_mutex_cmpxchg_release(&jh->b_state_lock)`

I see `rcu_read_unlock` is being called within `rt_spin_unlock`. Does it matter which lock it's "unlocking"? No, it just decrements `current->rcu_read_lock_nesting`, so the depth. If the nesting depth is 2, and we call `rcu_read_unlock`, the depth should become 1.

But, hang on, what if `rcu_read_unlock` *doesn't* decrement the depth? No, that's not how it works. It always decrements the depth. OK, let's go back to the lockdep trace. I'm seeing `rcu_read_lock` called twice, and the depth seems to align with the lock nesting order. Lock #0 is `rcu_read_lock`, lock #1 is `j_list_lock` and lock #2 is `rcu_read_lock` again.

If the depth is 2, then `rcu_read_lock` was called twice. Now, I thought `spin_unlock(&jh->b_state_lock)` *should* decrement the depth to 1! Why does the bug report say "RCU nest depth: 2"? Could the unlock have been skipped? I'm looking at line 1064 in `fs/jbd2/commit.c`.

Could it be that `__jbd2_journal_refile_buffer` calls `spin_unlock(&jh->b_state_lock)` internally, making 1064 a double unlock? No, `__jbd2_journal_refile_buffer` *asserts* that the lock is held with `lockdep_assert_held` and doesn't unlock it, so that's not it.

What if the `spin_lock` on `jh->b_state_lock` was called TWICE? That's not possible, it's not a recursive lock.

Alright, what about the function `cond_resched_lock`? Could it complain about depth 2, because the nesting depth was already 1 before the loop? I'm going to trace the depth *before* the loop.

At line 948, `spin_lock(&journal->j_list_lock)` is called. If the depth was 1 *before* that, it becomes 2. Then at 956, we `spin_unlock(&journal->j_list_lock)` and the depth goes back to 1. Then, at 963, we `spin_lock(&jh->b_state_lock)` and the depth becomes 2 again. At 993, `spin_lock(&journal->j_list_lock)` and the depth reaches 3. Then, at 1064, `spin_unlock(&jh->b_state_lock)` and depth goes back to 2. Finally, at 1071, `cond_resched_lock(&journal->j_list_lock)` is called with depth 2! It expects depth 1, so the complaint makes sense!

So if the depth was 1 BEFORE the loop, where did it come from? Let's check `jbd2_journal_commit_transaction`


278/2 2026/05/31 23:21 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:880 LineCount:50]

Results:
map[Contents: 880:			wait_on_buffer(bh);
 881:			cond_resched();
 882:	
 883:			if (unlikely(!buffer_uptodate(bh)))
 884:				err = -EIO;
 885:	
 886:			BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
 887:			clear_buffer_jwrite(bh);
 888:			jbd2_unfile_log_bh(bh);
 889:			stats.run.rs_blocks_logged++;
 890:			__brelse(bh);		/* One for getblk */
 891:			/* AKPM: bforget here */
 892:		}
 893:	
 894:		if (err)
 895:			jbd2_journal_abort(journal, err);
 896:	
 897:		jbd2_debug(3, "JBD2: commit phase 5\n");
 898:		write_lock(&journal->j_state_lock);
 899:		J_ASSERT(commit_transaction->t_state == T_COMMIT_DFLUSH);
 900:		commit_transaction->t_state = T_COMMIT_JFLUSH;
 901:		write_unlock(&journal->j_state_lock);
 902:	
 903:		if (!jbd2_has_feature_async_commit(journal)) {
 904:			err = journal_submit_commit_record(journal, commit_transaction,
 905:							&cbh, crc32_sum);
 906:			if (err)
 907:				jbd2_journal_abort(journal, err);
 908:		}
 909:		if (cbh)
 910:			err = journal_wait_on_commit_record(journal, cbh);
 911:		stats.run.rs_blocks_logged++;
 912:		if (jbd2_has_feature_async_commit(journal) &&
 913:		    journal->j_flags & JBD2_BARRIER) {
 914:			blkdev_issue_flush(journal->j_dev);
 915:		}
 916:	
 917:		if (err)
 918:			jbd2_journal_abort(journal, err);
 919:	
 920:		WARN_ON_ONCE(
 921:			atomic_read(&commit_transaction->t_outstanding_credits) < 0);
 922:	
 923:		/*
 924:		 * Now disk caches for filesystem device are flushed so we are safe to
 925:		 * erase checkpointed transactions from the log by updating journal
 926:		 * superblock.
 927:		 */
 928:		if (update_tail)
 929:			jbd2_update_log_tail(journal, first_tid, first_block);
]

279/2 2026/05/31 23:21 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 74585
							output: 36
							thoughts: 1330
						

Thoughts:
**Analyzing a Potential RCU Depth Imbalance in PREEMPT_RT**

Okay, so I'm looking at this code and trying to figure out why `cond_resched_lock` is complaining about an RCU depth of 2 when the code *seems* like it should be balanced. At lines 898 and 901, there's a `write_lock(&journal->j_state_lock)` and `write_unlock(&journal->j_state_lock)` pair. In a PREEMPT_RT kernel, that expands out to `rt_write_lock` and `rt_write_unlock`, which, in turn, wrap `rcu_read_lock()` and `rcu_read_unlock()`, respectively.  So, at face value, it *should* be balanced.

But hold on... Could the LIFO unlock order *itself* be the source of the depth problem? Let's trace it.

Here's how I see it:

1.  We grab `spin_lock(&jh->b_state_lock)`. That calls `rcu_read_lock()` and increments the RCU depth to 1. Lockdep pushes both `jh->b_state_lock` and `rcu_read_lock` (let's call it RCU1) onto the stack.
2.  Then, `spin_lock(&journal->j_list_lock)` is acquired.  This *also* calls `rcu_read_lock()`, bumping the depth to 2.  Lockdep pushes `j_list_lock` and another `rcu_read_lock` (RCU2) onto the stack.
3.  Now, the problem. We release `spin_unlock(&jh->b_state_lock)`.  This *should* call `rcu_read_unlock()`, decrementing the depth.  `rcu_lock_release()` *should* remove the MOST RECENT `rcu_read_lock`, which is RCU2!

At this point, *theoretically* the depth is 1. The lockdep stack is RCU1 and `j_list_lock`.

But wait, if the depth is 1, why is `cond_resched_lock` complaining about a depth of 2? The lockdep trace *must* be telling us something. Let's look at the lockdep trace again!

```
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #0: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57
 #1: ffff888036ea4920 (&journal->j_list_lock){+.+.}-{3:3}, at: spin_lock include/linux/spinlock_rt.h:45 [inline]
 #1: ffff888036ea4920 (&journal->j_list_lock){+.+.}-{3:3}, at: jbd2_journal_commit_transaction+0x3ad1/0x5b20 fs/jbd2/commit.c:993
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]
 #2: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]
 #2: ffffffff8dfc80c


280/2 2026/05/31 23:23 tool codesearch-definition-source
0m Args:
map[ContextFile:include/linux/jbd2.h Name:journal_head]

Results:
map[SourceCode:  22:	struct journal_head {
  23:		/*
  24:		 * Points back to our buffer_head. [jbd_lock_bh_journal_head()]
  25:		 */
  26:		struct buffer_head *b_bh;
  27:	
  28:		/*
  29:		 * Protect the buffer head state
  30:		 */
  31:		spinlock_t b_state_lock;
  32:	
  33:		/*
  34:		 * Reference count - see description in journal.c
  35:		 * [jbd_lock_bh_journal_head()]
  36:		 */
  37:		int b_jcount;
  38:	
  39:		/*
  40:		 * Journalling list for this buffer [b_state_lock]
  41:		 * NOTE: We *cannot* combine this with b_modified into a bitfield
  42:		 * as gcc would then (which the C standard allows but which is
  43:		 * very unuseful) make 64-bit accesses to the bitfield and clobber
  44:		 * b_jcount if its update races with bitfield modification.
  45:		 */
  46:		unsigned b_jlist;
  47:	
  48:		/*
  49:		 * This flag signals the buffer has been modified by
  50:		 * the currently running transaction
  51:		 * [b_state_lock]
  52:		 */
  53:		unsigned b_modified;
  54:	
  55:		/*
  56:		 * Copy of the buffer data frozen for writing to the log.
  57:		 * [b_state_lock]
  58:		 */
  59:		char *b_frozen_data;
  60:	
  61:		/*
  62:		 * Pointer to a saved copy of the buffer containing no uncommitted
  63:		 * deallocation references, so that allocations can avoid overwriting
  64:		 * uncommitted deletes. [b_state_lock]
  65:		 */
  66:		char *b_committed_data;
  67:	
  68:		/*
  69:		 * Pointer to the compound transaction which owns this buffer's
  70:		 * metadata: either the running transaction or the committing
  71:		 * transaction (if there is one).  Only applies to buffers on a
  72:		 * transaction's data or metadata journaling list.
  73:		 * [j_list_lock] [b_state_lock]
  74:		 * Either of these locks is enough for reading, both are needed for
  75:		 * changes.
  76:		 */
  77:		transaction_t *b_transaction;
  78:	
  79:		/*
  80:		 * Pointer to the running compound transaction which is currently
  81:		 * modifying the buffer's metadata, if there was already a transaction
  82:		 * committing it when the new transaction touched it.
  83:		 * [t_list_lock] [b_state_lock]
  84:		 */
  85:		transaction_t *b_next_transaction;
  86:	
  87:		/*
  88:		 * Doubly-linked list of buffers on a transaction's data, metadata or
  89:		 * forget queue. [t_list_lock] [b_state_lock]
  90:		 */
  91:		struct journal_head *b_tnext, *b_tprev;
  92:	
  93:		/*
  94:		 * Pointer to the compound transaction against which this buffer
  95:		 * is checkpointed.  Only dirty buffers can be checkpointed.
  96:		 * [j_list_lock]
  97:		 */
  98:		transaction_t *b_cp_transaction;
  99:	
 100:		/*
 101:		 * Doubly-linked list of buffers still remaining to be flushed
 102:		 * before an old transaction can be checkpointed.
 103:		 * [j_list_lock]
 104:		 */
 105:		struct journal_head *b_cpnext, *b_cpprev;
 106:	
 107:		/* Trigger type */
 108:		struct jbd2_buffer_trigger_type *b_triggers;
 109:	
 110:		/* Trigger type for the committing transaction's frozen data */
 111:		struct jbd2_buffer_trigger_type *b_frozen_triggers;
 112:	};
 SourceFile:include/linux/journal-head.h]

281/2 2026/05/31 23:23 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 78192
							output: 24
							thoughts: 3846
						

Thoughts:
**Analyzing a Concurrency Issue in JBD2 Journal Commit**

Okay, so I'm diving deep into this kernel issue, specifically a potential RCU read-side critical section problem during a JBD2 journal commit. I'm seeing a lockdep trace that's... peculiar. The initial thought was about `spin_unlock(&jh->b_state_lock)` and whether it's paired with an `rcu_read_unlock()`. Given it maps to `rt_spin_unlock` which *should* call `rcu_read_unlock()`, that seemed unlikely. The lockdep trace reveals something odd – while `jh->b_state_lock` is apparently released as expected, the `rcu_read_lock` isn't! The lockdep trace hints that after the `spin_unlock` for `jh->b_state_lock` and the subsequent `rcu_read_unlock`, there's still a lingering `rcu_read_lock` (Lock #2 from the trace).

A quick dive into the code verifies that `rt_spin_unlock` *does* indeed call `rcu_read_unlock()`. So, I'm stuck, thinking something's fishy with lock release.

I re-examine the lockdep trace and realize Lock #0 is `rcu_read_lock` from `spin_lock(&jh->b_state_lock)`, and Lock #2 also from a call to `rcu_read_lock`. The trace suggests the `jh->b_state_lock` is correctly released via `spin_unlock`, but a later `rcu_read_lock` is not released. Then it's calling another `rcu_read_lock` within `spin_lock(&journal->j_list_lock)`.

The crucial question is why an extra `rcu_read_lock` is present on the trace and why `rcu_read_unlock` doesn't remove it. My current working theory is that `rcu_read_unlock()` is *not* being called as expected, because the `rcu_lock_release` should remove the last RCU lock, and in this case, it doesn't. And the code is clear that `rcu_read_unlock` does call `rcu_lock_release()`.

Then I see it! The bug report has a "Voluntary context switch within RCU read-side critical section!" warning and it has a BUG associated with `__might_resched`. This tells me that `schedule()` is run while an `rcu_read_lock` is still active, suggesting a depth of 2 (or more). The critical piece is understanding what's happening at line 1064 in `fs/jbd2/commit.c` where `spin_unlock(&jh->b_state_lock)` is called. If that line *was* executed, `rcu_read_unlock` *should* have been called. The context switch warning is a key piece. That suggests `rcu_preempt_depth() > 0`, implying an active RCU read-side critical section. The context switch comes from `cond_resched_lock` which has an `__might_resched` statement.

So, it's NOT that `spin_unlock()` isn't being called, but that the `rcu_read_unlock()` associated with an earlier call to `rcu_read_lock()` is *not* being made, which leads me to believe the context switch is happening *while* a critical section is active, due to the RCU lock not being released correctly. This might be a missing `rcu_read_unlock()` somewhere.



282/2 2026/05/31 23:23 tool grepper
0m Args:
map[Expression:define spin_unlock PathPrefix:]

Results:
map[Output:arch/parisc/kernel/firmware.c-71-# undef  spin_unlock_irqrestore
arch/parisc/kernel/firmware.c:72:# define spin_unlock_irqrestore(a, b)
arch/parisc/kernel/firmware.c-73-#else
--
tools/include/linux/spinlock.h-14-#define spin_lock_nested(x, subclass)	pthread_mutex_lock(x)
tools/include/linux/spinlock.h:15:#define spin_unlock(x)			pthread_mutex_unlock(x)
tools/include/linux/spinlock.h-16-#define spin_lock_bh(x)			pthread_mutex_lock(x)
tools/include/linux/spinlock.h:17:#define spin_unlock_bh(x)		pthread_mutex_unlock(x)
tools/include/linux/spinlock.h-18-#define spin_lock_irq(x)		pthread_mutex_lock(x)
tools/include/linux/spinlock.h:19:#define spin_unlock_irq(x)		pthread_mutex_unlock(x)
tools/include/linux/spinlock.h-20-#define spin_lock_irqsave(x, f)		(void)f, pthread_mutex_lock(x)
tools/include/linux/spinlock.h:21:#define spin_unlock_irqrestore(x, f)	(void)f, pthread_mutex_unlock(x)
tools/include/linux/spinlock.h-22-
]

283/2 2026/05/31 23:23 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 83232
							output: 35
							thoughts: 19
						

Thoughts:
Here's my thought process, as if I were considering that observation:

**Delving into the Spinlock Definition**

Okay, so I'm digging through this code, and I see a call to `spin_unlock`. My immediate thought is, "Where exactly is this defined?" Time to get specific. Let's see... Aha! It's in `include/linux/spinlock.h`. That's precisely where I'd expect it, given its central role in kernel-level concurrency control. That header file is a core part of the synchronization primitives and spinlocks ecosystem. Now that I know the location of the definition, I can understand the function calls within this particular code, and trace how this spinlock is used, within this specific context. This knowledge now allows me to easily work with the related source code. I can see the structure of the relevant code much better now.



284/2 2026/05/31 23:23 tool read-file
0m Args:
map[File:include/linux/spinlock.h FirstLine:380 LineCount:50]

Results:
map[Contents: 380:	
 381:	#define spin_lock_irqsave_nested(lock, flags, subclass)			\
 382:	do {									\
 383:		raw_spin_lock_irqsave_nested(spinlock_check(lock), flags, subclass); \
 384:		__release(spinlock_check(lock)); __acquire(lock);		\
 385:	} while (0)
 386:	
 387:	static __always_inline void spin_unlock(spinlock_t *lock)
 388:		__releases(lock) __no_context_analysis
 389:	{
 390:		raw_spin_unlock(&lock->rlock);
 391:	}
 392:	
 393:	static __always_inline void spin_unlock_bh(spinlock_t *lock)
 394:		__releases(lock) __no_context_analysis
 395:	{
 396:		raw_spin_unlock_bh(&lock->rlock);
 397:	}
 398:	
 399:	static __always_inline void spin_unlock_irq(spinlock_t *lock)
 400:		__releases(lock) __no_context_analysis
 401:	{
 402:		raw_spin_unlock_irq(&lock->rlock);
 403:	}
 404:	
 405:	static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
 406:		__releases(lock) __no_context_analysis
 407:	{
 408:		raw_spin_unlock_irqrestore(&lock->rlock, flags);
 409:	}
 410:	
 411:	static __always_inline int spin_trylock_bh(spinlock_t *lock)
 412:		__cond_acquires(true, lock) __no_context_analysis
 413:	{
 414:		return raw_spin_trylock_bh(&lock->rlock);
 415:	}
 416:	
 417:	static __always_inline int spin_trylock_irq(spinlock_t *lock)
 418:		__cond_acquires(true, lock) __no_context_analysis
 419:	{
 420:		return raw_spin_trylock_irq(&lock->rlock);
 421:	}
 422:	
 423:	static __always_inline bool _spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags)
 424:		__cond_acquires(true, lock) __no_context_analysis
 425:	{
 426:		return raw_spin_trylock_irqsave(spinlock_check(lock), *flags);
 427:	}
 428:	#define spin_trylock_irqsave(lock, flags) _spin_trylock_irqsave(lock, &(flags))
 429:	
]

285/2 2026/05/31 23:23 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 84289
							output: 33
							thoughts: 38
						

Thoughts:
Here's my attempt at summarizing that thought process, tailored for an expert audience:

**Spinlock Conundrum**

Okay, hold on. I'm digging into this code, and I've hit a potential snag. I'm seeing `spin_unlock` called, and my initial instinct is to treat it as a straightforward call to `raw_spin_unlock(&lock->rlock)`. Seems standard enough. But then, a red flag popped up in my mind. We're in a PREEMPT_RT context, aren't we? Which means, of course, that the definition of `spinlock_t` isn't the same as a vanilla kernel. The underlying implementation is fundamentally different! I need to be *absolutely* certain that these unlock operations are behaving as expected in this real-time environment, that the preemption model is honored. The assumption I made needs immediate verification.



286/2 2026/05/31 23:24 tool grepper
0m Error:
log-in to see details

Args:
map[Expression:define spin_unlock PathPrefix:include/linux/spinlock_rt.h]

Results:
map[Output:]

287/2 2026/05/31 23:24 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 84563
							output: 36
							thoughts: 15
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Diving into Spinlock Internals**

Okay, so I need to understand something about the real-time spinlock implementation, probably to debug a performance issue or understand a kernel patch. First, I'm going straight to the source. `include/linux/spinlock_rt.h` is where I'd expect to find the core definitions and structures for the real-time spinlock variant. That's the logical starting point. I want to see how the RT spinlock differs from the standard one, what synchronization primitives it uses, if any interrupt masking is involved, and how priority inheritance is handled. From there, I can start to piece together how it affects the system's schedulability and real-time guarantees. This header will likely be my foundation to follow the call path and understand the full implications. Let's see what's in there...



288/2 2026/05/31 23:24 tool read-file
0m Args:
map[File:include/linux/spinlock_rt.h FirstLine:40 LineCount:50]

Results:
map[Contents:  40:	extern int rt_spin_trylock(spinlock_t *lock) __cond_acquires(true, lock);
  41:	
  42:	static __always_inline void spin_lock(spinlock_t *lock)
  43:		__acquires(lock)
  44:	{
  45:		rt_spin_lock(lock);
  46:	}
  47:	
  48:	#ifdef CONFIG_LOCKDEP
  49:	# define __spin_lock_nested(lock, subclass)				\
  50:		rt_spin_lock_nested(lock, subclass)
  51:	
  52:	# define __spin_lock_nest_lock(lock, nest_lock)				\
  53:		do {								\
  54:			typecheck(struct lockdep_map *, &(nest_lock)->dep_map);	\
  55:			rt_spin_lock_nest_lock(lock, &(nest_lock)->dep_map);	\
  56:		} while (0)
  57:	# define __spin_lock_irqsave_nested(lock, flags, subclass)	\
  58:		do {							\
  59:			typecheck(unsigned long, flags);		\
  60:			flags = 0;					\
  61:			__spin_lock_nested(lock, subclass);		\
  62:		} while (0)
  63:	
  64:	#else
  65:	 /*
  66:	  * Always evaluate the 'subclass' argument to avoid that the compiler
  67:	  * warns about set-but-not-used variables when building with
  68:	  * CONFIG_DEBUG_LOCK_ALLOC=n and with W=1.
  69:	  */
  70:	# define __spin_lock_nested(lock, subclass)	spin_lock(((void)(subclass), (lock)))
  71:	# define __spin_lock_nest_lock(lock, subclass)	spin_lock(((void)(subclass), (lock)))
  72:	# define __spin_lock_irqsave_nested(lock, flags, subclass)	\
  73:		spin_lock_irqsave(((void)(subclass), (lock)), flags)
  74:	#endif
  75:	
  76:	#define spin_lock_nested(lock, subclass)		\
  77:		__spin_lock_nested(lock, subclass)
  78:	
  79:	#define spin_lock_nest_lock(lock, nest_lock)		\
  80:		__spin_lock_nest_lock(lock, nest_lock)
  81:	
  82:	#define spin_lock_irqsave_nested(lock, flags, subclass)	\
  83:		__spin_lock_irqsave_nested(lock, flags, subclass)
  84:	
  85:	static __always_inline void spin_lock_bh(spinlock_t *lock)
  86:		__acquires(lock)
  87:	{
  88:		/* Investigate: Drop bh when blocking ? */
  89:		local_bh_disable();
]

289/2 2026/05/31 23:24 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 85629
							output: 36
							thoughts: 21
						

Thoughts:
Here's a summary of my thought process, as requested:

**Diving into the Real-Time Spinlock Implementation**

Alright, let's get down to brass tacks. I'm going to take a closer look at the real-time spinlock implementation. Specifically, I want to zero in on `include/linux/spinlock_rt.h`, likely around the 100-line mark. I have a hunch that's where we'll find some crucial details about how these RT spinlocks handle contention and priority inheritance, or perhaps the fine-grained locking primitives in use. I expect to be looking for data structures and functions associated with the critical sections, especially related to preemptibility and any potential real-time specific optimizations. My aim is to refresh my understanding of the fundamental mechanisms used to make these locks work within the real-time context. This is also a good spot to re-examine potential sources of priority inversion and how those are mitigated, because that's always a critical aspect with real-time systems.



290/2 2026/05/31 23:24 tool read-file
0m Args:
map[File:include/linux/spinlock_rt.h FirstLine:90 LineCount:50]

Results:
map[Contents:  90:		rt_spin_lock(lock);
  91:	}
  92:	
  93:	static __always_inline void spin_lock_irq(spinlock_t *lock)
  94:		__acquires(lock)
  95:	{
  96:		rt_spin_lock(lock);
  97:	}
  98:	
  99:	#define spin_lock_irqsave(lock, flags)			 \
 100:		do {						 \
 101:			typecheck(unsigned long, flags);	 \
 102:			flags = 0;				 \
 103:			spin_lock(lock);			 \
 104:		} while (0)
 105:	
 106:	static __always_inline void spin_unlock(spinlock_t *lock)
 107:		__releases(lock)
 108:	{
 109:		rt_spin_unlock(lock);
 110:	}
 111:	
 112:	static __always_inline void spin_unlock_bh(spinlock_t *lock)
 113:		__releases(lock)
 114:	{
 115:		rt_spin_unlock(lock);
 116:		local_bh_enable();
 117:	}
 118:	
 119:	static __always_inline void spin_unlock_irq(spinlock_t *lock)
 120:		__releases(lock)
 121:	{
 122:		rt_spin_unlock(lock);
 123:	}
 124:	
 125:	static __always_inline void spin_unlock_irqrestore(spinlock_t *lock,
 126:							   unsigned long flags)
 127:		__releases(lock)
 128:	{
 129:		rt_spin_unlock(lock);
 130:	}
 131:	
 132:	#define spin_trylock(lock)	rt_spin_trylock(lock)
 133:	
 134:	#define spin_trylock_bh(lock)	rt_spin_trylock_bh(lock)
 135:	
 136:	#define spin_trylock_irq(lock)	rt_spin_trylock(lock)
 137:	
 138:	static __always_inline bool _spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags)
 139:		__cond_acquires(true, lock)
]

291/2 2026/05/31 23:24 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 86593
							output: 37
							thoughts: 12544
						

Thoughts:
**The Enigma of RCU Nesting Depth**

Right, let's break this down. It all starts with `spin_unlock` calling `rt_spin_unlock`, which then calls `rcu_read_unlock`. That means a depth decrement should happen. I'm sure that `spin_unlock(&jh->b_state_lock)` calls `rt_spin_unlock(&jh->b_state_lock)`, and then that calls `rcu_read_unlock()`. So, the RCU depth *should* be 1. But `__might_resched` is complaining, and it prints, "RCU nest depth: 2, expected: 1". This tells me `rcu_preempt_depth()` IS returning 2. So, why is the nesting depth 2?

Could `jbd2_journal_commit_transaction` have been called with a nesting depth of 1? If so, consider this: `spin_lock(&journal->j_list_lock)` increases the depth to 2, then `spin_unlock(&journal->j_list_lock)` reduces it to 1, then `spin_lock(&jh->b_state_lock)` increases it to 2, then `spin_lock(&journal->j_list_lock)` to 3, then `spin_unlock(&jh->b_state_lock)` back to 2, and finally, `cond_resched_lock` is called, and `__might_resched` complains! Wait, if it was called with depth 1, the lockdep trace should show the `rcu_read_lock` FROM BEFORE `jbd2_journal_commit_transaction`!

The lockdep trace, however, shows the lock acquired at `rt_spin_lock`! If it were acquired BEFORE the transaction, it would be from SOME OTHER `rt_spin_lock`! But `kjournald2` *doesn't* hold any spinlocks when calling `jbd2_journal_commit_transaction`. The only thing that seems relevant is the call to `write_unlock`. This then translates to `rt_write_unlock`, and then that calls `rcu_read_unlock`. That means the RCU depth *should* be zero! If the depth is zero, then this lock must come from the call to `spin_lock(&jh->b_state_lock)`. So depth increments to 1, then it increases to 2 when `spin_lock(&journal->j_list_lock)` is called, and decreases to 1 when `spin_unlock(&jh->b_state_lock)` is called. Why then, is `rcu_preempt_depth()` reporting 2? I'm wondering if `rcu_preempt_depth()` is returning 2 because `spin_unlock(&jh->b_state_lock)` wasn't called?

But we know it was, because `jh->b_state_lock` is NOT in the lockdep trace! Wait! What if the bug report *truncated* the trace? The report clearly states, "3 locks held," so that implies that `jh->b_state_lock` is DEFINITELY not held! So, `spin_unlock(&jh->b_state_lock)` WAS called! And, therefore, the function `rt_spin_unlock` WAS called. So, then, `rcu_read_unlock()` WAS called! And that decrement depth, so depth MUST be 1! Why is the depth 2? Is there a bug in `rcu_read_unlock()`? Let's check `rcu_read_unlock` again... No. It looks like it should be working correctly. It definitely *should* be decrementing the nesting depth!

Could `rcu_read_lock()` have been called TWICE in `rt_spin_lock`? No, or `spin_lock(&journal->j_list_lock)` TWICE? No.

Wait! Check the lockdep trace again! There is a duplicate `rt_spin_lock` call. If depth is 2, and there are two `rcu_read_lock` entries, then depth is 2! But, If `spin_unlock(&jh->b_state_lock)` WAS called, then depth *should* be 1! If the depth is 2, then `spin_unlock(&jh->b_state_lock)` did NOT decrement depth! How could it *not* decrement depth? Because it wasn't called. But `jh->b_state_lock` *isn't* in the trace. How could `jh->b_state_lock` be *removed* without decrementing depth? Wait! What if `jh->b_state_lock`


292/2 2026/05/31 23:26 tool read-file
0m Args:
map[File:fs/jbd2/commit.c FirstLine:370 LineCount:50]

Results:
map[Contents: 370:	}
 371:	/*
 372:	 * jbd2_journal_commit_transaction
 373:	 *
 374:	 * The primary function for committing a transaction to the log.  This
 375:	 * function is called by the journal thread to begin a complete commit.
 376:	 */
 377:	void jbd2_journal_commit_transaction(journal_t *journal)
 378:	{
 379:		struct transaction_stats_s stats;
 380:		transaction_t *commit_transaction;
 381:		struct journal_head *jh;
 382:		struct buffer_head *descriptor;
 383:		struct buffer_head **wbuf = journal->j_wbuf;
 384:		int bufs;
 385:		int escape;
 386:		int err;
 387:		unsigned long long blocknr;
 388:		ktime_t start_time;
 389:		u64 commit_time;
 390:		char *tagp = NULL;
 391:		journal_block_tag_t *tag = NULL;
 392:		int space_left = 0;
 393:		int first_tag = 0;
 394:		int tag_flag;
 395:		int i;
 396:		int tag_bytes = journal_tag_bytes(journal);
 397:		struct buffer_head *cbh = NULL; /* For transactional checksums */
 398:		__u32 crc32_sum = ~0;
 399:		struct blk_plug plug;
 400:		/* Tail of the journal */
 401:		unsigned long first_block;
 402:		tid_t first_tid;
 403:		int update_tail;
 404:		int csum_size = 0;
 405:		LIST_HEAD(io_bufs);
 406:		LIST_HEAD(log_bufs);
 407:	
 408:		if (jbd2_journal_has_csum_v2or3(journal))
 409:			csum_size = sizeof(struct jbd2_journal_block_tail);
 410:	
 411:		/*
 412:		 * First job: lock down the current transaction and wait for
 413:		 * all outstanding updates to complete.
 414:		 */
 415:	
 416:		/* Do we need to erase the effects of a prior jbd2_journal_flush? */
 417:		if (journal->j_flags & JBD2_FLUSHED) {
 418:			jbd2_debug(3, "super block updated\n");
 419:			mutex_lock_io(&journal->j_checkpoint_mutex);
]

293/2 2026/05/31 23:26 llm expert
1m Model:
gemini-3.1-pro-preview

Tokens:
							input: 100964
							output: 66
							thoughts: 11839
						

Thoughts:
**Analysis of an RCU Nesting Depth Issue in an ext4 Journaling Context**

Okay, so I'm diving into this bug report, and it seems like we've got an RCU nesting depth problem specifically in the `jbd2_journal_commit_transaction` function. The key is in those lockdep traces. I see two calls to `rcu_read_lock` nested within another lock, `j_list_lock`. From the traces provided, I'm concluding that we're seeing an unexpected depth of 2 when a depth of 1 is anticipated.

First, I'm verifying the unlock order. The bug report points to the issue being triggered when `cond_resched_lock` is called with depth 2, which I have verified based on the provided stack trace. This function then calls `__might_resched`, which checks the RCU nesting depth, which it expects to be 1. The message indicates it's reporting a nesting depth of 2.

Now, my initial thought is a straightforward LIFO unlock order violation, where a lock is released in the wrong order. This will be the root cause of the error. In the context of the code, this means that the `spin_unlock(&jh->b_state_lock)` or `spin_unlock(&journal->j_list_lock)` are being handled incorrectly, and the trace suggests the latter.

However, the trace shows depth 2, meaning at this point, the stack is: RCU1, B and depth is 1. If this is the case, then __might_resched is called with depth 2 when it should expect depth 1.

The problem lies with how this is managed in PREEMPT_RT. From experience, this isn't an uncommon issue. It is a bug in the code of the kernel. This situation where a lock is released incorrectly is a known pattern when it comes to LIFO ordering. Because of this, `__might_resched` is complaining, and the code has detected this.

The root cause of this situation is an RCU nesting depth leak, as indicated by the error.



294/2 2026/05/31 23:27 tool set-results
0m Args:
map[DenialOfService:true Exploitable:false FilesystemTrigger:false NetworkTrigger:false PeripheralTrigger:false RemoteTrigger:false Unprivileged:true UserNamespace:false VMGuestTrigger:false VMHostTrigger:false]

Results:
map[DenialOfService:true Exploitable:false FilesystemTrigger:false NetworkTrigger:false PeripheralTrigger:false RemoteTrigger:false Unprivileged:true UserNamespace:false VMGuestTrigger:false VMHostTrigger:false]

295/2 2026/05/31 23:27 llm expert
0m Model:
gemini-3.1-pro-preview

Tokens:
							input: 113386
							output: 741
							thoughts: 232
						

Thoughts:
**Final Response: Bug Analysis**

Okay, the results are in. Time to solidify this response. The crux of the issue boils down to a classic Last-In, First-Out (LIFO) unlock order violation, specifically within the PREEMPT_RT kernel. We're looking at how the `spin_lock` maps to `rt_spin_lock` under PREEMPT_RT, and how that interacts with `rcu_read_lock`. The problem centers around the nesting of RCU locks.

Here's the scenario: Imagine acquiring locks A and B, in that specific order. Then, when unlocking, we unlock them in the same order, A then B. The critical point is that `rt_spin_unlock(A)` includes an `rcu_read_unlock`. This `rcu_read_unlock` incorrectly removes the *last* acquired `rcu_read_lock` from lockdep. Lockdep, in this context, is monitoring nested locks and it gets confused.

The problem? The lockdep state is corrupted, because the `rcu_read_lock` removed actually *belongs* to lock B. This mismatch causes the RCU nesting depth to become out of sync. Essentially, the RCU nesting depth is wrong.

This leads to the dreaded `__might_resched` complaining about an invalid context, specifically the RCU nest depth, when `cond_resched_lock(B)` gets called. It thinks the depth is 2, but it should be 1. It is a bug caused by a violation of locking order.

The really worrying part is how easy this is to trigger. Any unprivileged user can hit this through normal filesystem operations on ext4, because ext4 relies on jbd2, and this exposes the bug.

The good news, or at least the silver lining, is that it's not a memory corruption bug. So, while it's a serious Denial of Service (DoS) vulnerability, it's not directly exploitable for privilege escalation. But a DoS is still a huge problem.



296/1 2026/05/31 23:28 action format-explanation
0m Results:
map[Explanation:**Analysis of the Bug**

**1. Root Cause Analysis:**
The bug is a `BUG: sleeping function called from invalid context` triggered at
`fs/jbd2/commit.c:1071` inside `cond_resched_lock(&journal->j_list_lock)`. This
occurs specifically on `PREEMPT_RT` kernels.

In `PREEMPT_RT`, spinlocks are substituted with RT-mutexes. Acquiring a spinlock
(`rt_spin_lock`) internally calls `rcu_read_lock()`, which increments the RCU
nesting depth. Releasing a spinlock (`rt_spin_unlock`) calls
`rcu_read_unlock()`, which decrements it.

The issue stems from a strict **LIFO (Last-In, First-Out) unlock order
violation** in `jbd2_journal_commit_transaction`:
1. `spin_lock(&jh->b_state_lock)` is acquired (RCU depth becomes 1).
2. `spin_lock(&journal->j_list_lock)` is acquired (RCU depth becomes 2).
3. `spin_unlock(&jh->b_state_lock)` is released (Out of order! RCU depth becomes
1).
4. `cond_resched_lock(&journal->j_list_lock)` is called.

`cond_resched_lock` invokes `__might_resched()`, which expects the RCU nesting
depth to be exactly `1` (since only `j_list_lock` should be held). However, due
to the LIFO violation, the PREEMPT_RT lockdep and RCU nesting state tracking
gets desynchronized. Lockdep's `rcu_read_unlock()` removes the *most recently*
acquired `rcu_read_lock` (which belonged to `j_list_lock`), leaving the older
one dangling. This state corruption leads `__might_resched()` to observe an RCU
nest depth of `2` instead of the expected `1`, triggering the `BUG` and the
subsequent `Voluntary context switch within RCU read-side critical section!`
warning.

**2. Security Impact:**
- **Exploitable:** **No**. This is a state-tracking desynchronization and
scheduling-in-atomic-context bug specific to `PREEMPT_RT`. It does not cause
memory corruption (like use-after-free or out-of-bounds accesses) or allow
control-flow hijacking. It cannot be used for privilege escalation.
- **Denial of Service (DoS):** **Yes**. The `BUG` macro and subsequent warnings
can halt the kernel or cause a kernel panic (especially if `panic_on_warn` or
`panic_on_oops` is enabled), leading to a local denial of service.
- **Accessible From Unprivileged Processes:** **Yes**. The vulnerable code path
is part of the core `jbd2` journaling commit loop used by `ext4`. An
unprivileged user can easily trigger this by performing standard filesystem
operations (e.g., creating, modifying, or syncing files) on an `ext4`
filesystem, which forces the `kjournald2` thread to commit transactions.

**Conclusion:**
This is a local Denial of Service (DoS) vulnerability specific to `PREEMPT_RT`
kernels, caused by a spinlock LIFO unlock order violation. It is reachable by
unprivileged users through normal filesystem interactions but is not exploitable
for privilege escalation.]

LLM Calls Summary:
Total Calls Total Tokens Avg Tokens Total Duration (Seconds) Avg Duration (Seconds)
Tool Calls Summary:
Total Calls Total Duration (Seconds) Avg Duration (Seconds)