在KernelSU解决方案中,当内核编译时启用了CONFIG_DEBUG_ATOMIC_SLEEP选项,在启动过程中dmesg会打印以下错误信息:

[    6.739169] init: 打开SELinux策略
[    6.751520] init: 加载SELinux策略
[    6.894684] SELinux:  策略能力network_peer_controls=1
[    6.894688] SELinux:  策略能力open_perms=1
[    6.894690] SELinux:  策略能力extended_socket_class=1
[    6.894691] SELinux:  策略能力always_check_network=0
[    6.894693] SELinux:  策略能力cgroup_seclabel=0
[    6.894695] SELinux:  策略能力nnp_nosuid_transition=1
[    7.214323] selinux: SELinux: 从文件加载上下文:
[    7.214332] selinux: /system/etc/selinux/plat_file_contexts
[    7.214339] selinux: /system_ext/etc/selinux/system_ext_file_contexts
[    7.214345] selinux: /product/etc/selinux/product_file_contexts
[    7.214350] selinux: /vendor/etc/selinux/vendor_file_contexts
[    7.214356] selinux: /odm/etc/selinux/odm_file_contexts
[    7.216398] KernelSU: /system/bin/init argc: 2
[    7.216401] KernelSU: /system/bin/init 第一个参数: second_stage
[    7.216403] KernelSU: /system/bin/init second_stage 已执行
[    7.216506] BUG: 在无效的上下文中调用了睡眠函数 at security/selinux/ss/hashtab.c:47
[    7.216512] in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 1, name: init
[    7.216516] preempt_count: 0, 预期: 0
[    7.216518] RCU 嵌套深度: 1, 预期: 0
[    7.216524] CPU: 6 PID: 1 Comm: init 污染 5.4.289-Scarlet-v2.0-beta3 #1
[    7.216526] 硬件名称: redwood 基于Qualcomm Technologies, Inc. SM7325 (DT)
[    7.216528] 调用跟踪:
[    7.216536] dump_backtrace+0x0/0x210
[    7.216539] show_stack+0x14/0x20
[    7.216544] dump_stack+0x9c/0xec
[    7.216548] __might_resched+0x1f0/0x210
[    7.216552] hashtab_insert+0x38/0x230
[    7.216557] add_type+0xd4/0x2e0
[    7.216559] ksu_type+0x24/0x60
[    7.216562] apply_kernelsu_rules+0xa8/0x650
[    7.216565] ksu_handle_execveat_ksud+0x2a8/0x460
[    7.216568] ksu_handle_execveat+0x2c/0x60
[    7.216571] __arm64_sys_execve+0xe8/0xf0
[    7.216574] el0_svc_common+0xf4/0x1a0
[    7.216577] do_el0_svc+0x2c/0x40
[    7.216579] el0_sync_handler+0x18c/0x200
[    7.216582] el0_sync+0x140/0x180

这是因为security/selinux/ss/hashtab.c中的hashtab_insert()调用了cond_resched(),导致它进入睡眠状态。但在那一刻,KernelSU调用了apply_kernelsu_rules(),此时持有rcu_read_lock(),这是非法的。

请注意,我正在使用KernelSU,但已回滚了"Drop non-gki support"。即便如此,这是一个所有设备都可能受到影响的有效错误。

要复现这个问题,请启用CONFIG_DEBUG_ATOMIC_SLEEP(CONFIG_DEBUG_KERNEL也应该是依赖项,并且也应该启用)并重新编译内核,然后启动它。

预期行为是,在dmesg的启动日志中,当KernelSU通过第二阶段时,会提到调用跟踪,因为apply_kernelsu_rules()是在那时被调用的,它包含rcu_read_lock/unlock(),这在完全可抢占的上下文中之前是不允许的。

设备信息如下:

  • 设备:POCO X5 Pro
  • 操作系统版本:Android 15
  • KernelSU版本:12084(非GKI)
  • 内核版本:5.4.289

由于问题不涉及具体的截图或日志,因此没有提供KSU管理器日志,但调试与具体版本无关,调用跟踪应该足以说明问题。