저는 임베디드 Linux(kernel-5.10.24)에서 개발 중입니다.
RTC 드라이버 모듈을 제거하려고 하면 다음과 같은 오류가 발생합니다.
# lsmod
rtc_test 6490 1 - Live 0xc02f5000
# modprobe -r rtc_test
modprobe: remove 'rtc_test': Resource temporarily unavailable
1로 시작하는 것 같은데 module->refcnt
왜 refcnt가 1인지 모르겠습니다. 여기서 얻은 것은 다음과 같이 참조 횟수를 늘리는 호출 추적입니다.
[ 34.016653] Call Trace:
[ 34.019181] [<80020318>] show_stack+0x94/0x12c
[ 34.023772] [<808536e0>] dump_stack+0xac/0xe8
[ 34.028271] [<800d8f30>] try_module_get.part.65+0xf8/0x100
[ 34.033938] [<800c7040>] alarmtimer_rtc_add_device+0x13c/0x188
[ 34.039958] [<80380370>] device_add+0x578/0x810
[ 34.044631] [<80141c58>] cdev_device_add+0x54/0xb0
[ 34.049575] [<8048750c>] __rtc_register_device+0x108/0x3c8
[ 34.055234] [<80488000>] devm_rtc_device_register+0x3c/0x5c
[ 34.060997] [<c02f5914>] test_rtc_probe+0x190/0x5d4 [rtc_test]
[ 34.067561] [<803886e0>] platform_drv_probe+0x58/0xbc
[ 34.072777] [<80385a98>] really_probe+0x14c/0x578
[ 34.077629] [<803860e4>] driver_probe_device+0x80/0x25c
[ 34.083022] [<8038659c>] device_driver_attach+0x7c/0xa8
[ 34.088412] [<803866ac>] __driver_attach+0xe4/0x188
[ 34.093448] [<803835fc>] bus_for_each_dev+0x78/0xd0
[ 34.098480] [<80384b50>] bus_add_driver+0x1a4/0x230
[ 34.103514] [<80387080>] driver_register+0x84/0x154
[ 34.108544] [<80388e50>] __platform_driver_probe+0x74/0x150
[ 34.114294] [<800106d8>] do_one_initcall+0x50/0x1d8
[ 34.119328] [<80852d48>] do_init_module+0x70/0x208
[ 34.124272] [<800dc3c4>] load_module+0x219c/0x259c
[ 34.129214] [<800dca30>] sys_finit_module+0xd4/0x130
[ 34.134335] [<8002b798>] syscall_common+0x34/0x58
rtc_test.ko의 기본 로직은 다음과 같습니다.
int test_rtc_probe(....)
{
devm_clk_get(...);
platform_get_irq(...);
platform_get_resource(pdev, IORESOURCE_MEM, 0);
request_mem_region(....);
ioremap(...);
devm_rtc_device_register(...);
request_irq(...);
}
static struct platform_driver test_rtc_driver = {
.driver = {
.name = "rtc_test",
.of_match_table = dummy_rtc_of_ids,
},
.remove = __exit_p(test_rtc_remove),
.suspend = NULL,
.resume = NULL,
};
위의 호출 스택은 추가 (알람 장치를 추가) devm_rtc_device_register()
하는 트리거 됩니다.module->refcnt
refcnt 증가로 인해 모듈 언로드가 실패했습니다.
Linux 커널에서 다른 RTC 드라이버를 확인했지만 문제를 해결할 수 있는 큰 차이점을 찾지 못했습니다.