Linux内核的dump_stack结果中后缀“*.part”和“.cold”是什么意思?

Coi*_*iby 1 kernel

有时dump_stack()会在函数名称中添加后缀“.cold”和“.part”,例如,这里是[1]中的部分行,

[  638.115912][    C0] Call Trace:
[  638.115986][    C0]  ? kasan_set_free_info+0x1b/0x30
[  638.115990][    C0]  ? __kasan_slab_free+0xd8/0x120
[  638.115995][    C0]  ? kmem_cache_free.part.0+0x67/0x1f0
[  638.115999][    C0]  ? __put_cred+0x1de/0x250
[  638.116004][    C0]  ? revert_creds+0x1a8/0x1f0
[  638.116008][    C0]  ? do_faccessat+0x2ca/0x820
[  638.116013][    C0]  ? do_syscall_64+0x2d/0x70
[  638.116017][    C0]  ? find_held_lock+0x2d/0x110
[  638.116022][    C0]  ? lock_acquire+0x1f1/0xad0
[  638.116027][    C0]  ? debug_check_no_obj_freed+0xc7/0x41c
[  638.116031][    C0]  ? find_held_lock+0x2d/0x110
[  638.116036][    C0]  ? debug_check_no_obj_freed+0x20c/0x41c
[  638.116041][    C0]  ? lock_downgrade+0x830/0x830
[  638.116045][    C0]  ? lockdep_hardirqs_off+0x89/0xc0
[  638.116050][    C0]  ? trace_hardirqs_off+0x27/0x210
[  638.116055][    C0]  ? _raw_spin_unlock_irqrestore+0x9b/0xe0
[  638.116060][    C0]  ? debug_check_no_obj_freed+0x20c/0x41c
[  638.116064][    C0]  kasan_set_track+0x1c/0x30
[  638.116069][    C0]  kasan_set_free_info+0x1b/0x30
[  638.116073][    C0]  __kasan_slab_free+0xd8/0x120
[  638.116078][    C0]  ? __put_cred+0x1de/0x250
[  638.116082][    C0]  kmem_cache_free.part.0+0x67/0x1f0
 
[  638.116220][ T1172] Kernel panic - not syncing: hung_task: blocked tasks

[  638.570843][ T1172] Call Trace:
[  638.574119][ T1172]  dump_stack+0x18f/0x20d
[  638.578499][ T1172]  panic+0x2e3/0x75c
[  638.582375][ T1172]  ? __warn_printk+0xf3/0xf3
[  638.586953][ T1172]  ? lapic_can_unplug_cpu.cold+0x38/0x38
[  638.592562][ T1172]  ? preempt_schedule_thunk+0x16/0x18
[  638.597922][ T1172]  ? watchdog.cold+0x22d/0x24b
[  638.602659][ T1172]  ? watchdog+0xc59/0xf30
[  638.606965][ T1172]  watchdog.cold+0x23e/0x24b
[  638.611530][ T1172]  ? trace_sched_process_hang+0x2e0/0x2e0
[  638.617227][ T1172]  kthread+0x3b5/0x4a0
[  638.621272][ T1172]  ? __kthread_bind_mask+0xc0/0xc0
[  638.626358][ T1172]  ? __kthread_bind_mask+0xc0/0xc0
[  638.631445][ T1172]  ret_from_fork+0x1f/0x30
[  638.637042][ T1172] Kernel Offset: disabled
[  638.641361][ T1172] Rebooting in 86400 seconds..
Run Code Online (Sandbox Code Playgroud)

这些后缀是什么意思?

[1] https://syzkaller.appspot.com/text?tag=CrashLog&x=12fa85ee900000

vec*_*c10 6

.cold是一个函数属性。GCC 文档在声明函数属性中描述了函数属性:

在 GNU C 和 C++ 中,您可以使用函数属性来指定某些函数属性,这些属性可以帮助编译器优化调用或更仔细地检查代码的正确性。

公共函数属性,包括,在6.33.1 公共函数属性.cold中描述:

函数的冷属性用于通知编译器该函数不太可能被执行。该函数针对大小而不是速度进行了优化,并且在许多目标上,它被放置在文本部分的特殊小节中,因此所有冷函数看起来都靠近在一起,从而提高了程序非冷部分的代码局部性。分支预测机制将导致代码中冷函数调用的路径标记为不可能的路径。因此,将用于处理不太可能发生的情况(例如 perror)的函数标记为冷函数非常有用,以改进在极少数情况下调用标记函数的热函数的优化。

用户 lgeorget 在Unix & Linux StackExchange中对后缀.part.<n>进行了解释:

有时,GCC 评估大函数的控制流的某些部分可以很容易地内联,但内联整个大函数是不行的。因此,它拆分函数,将大部分放在自己的函数中,该函数接收原始函数名称加上 .part + . 作为名称,并将其余部分内联到其他函数中。