rmmod: remove 'led': Device or resource busy解决办法

问题:

real6410开发板,使用insmod led.ko命令安装led驱动,然后使用命令rmmod led卸载led模块时遇到错误提示:

rmmod: remove 'led': Device or resource busy

解决办法:

1. 原因在于led驱动程序中没有用宏module_exit()实现模块被移除的功能。

在led.c中添加了real_leds_exit()函数,重新make,生成驱动文件led.ko。

static void __exit real_leds_exit(void) {

    printk("REAL_LEDS is released.\n");
}

重启目标板,使用insmod led.ko可以正确加载驱动,通过rmmod led删除驱动时,提示找不到文件led.ko,

将驱动文件led.ko拷贝到目录/lib/modules/2.6.28.6/中,再次删除驱动,就OK了。


但是,使用insmod led.ko再次加载驱动时,提示错误信息

[root@Real6410 leddriver]# insmod led.ko 
------------[ cut here ]------------
WARNING: at fs/sysfs/dir.c:462 sysfs_add_one+0x34/0x48()
sysfs: duplicate filename 'led_class' can not be created
Modules linked in: led(+) unifi_sdio [last unloaded: led]
[<c040140c>] (dump_stack+0x0/0x14) from [<c004c670>] (warn_slowpath+0x64/0x80)
[<c004c60c>] (warn_slowpath+0x0/0x80) from [<c00f25d4>] (sysfs_add_one+0x34/0x48)
 r3:cf4e57f0 r2:c04ebcef
 r6:cf06e308 r5:cf78a360 r4:ffffffef
[<c00f25a0>] (sysfs_add_one+0x0/0x48) from [<c00f2cd4>] (create_dir+0x58/0xa4)
 r5:cf78a360 r4:cf6f3d08
[<c00f2c7c>] (create_dir+0x0/0xa4) from [<c00f2d64>] (sysfs_create_dir+0x44/0x64)
 r8:cf008348 r7:cf818740 r6:bf05b700 r5:cf06e308 r4:cf06e308
[<c00f2d20>] (sysfs_create_dir+0x0/0x64) from [<c01cab7c>] (kobject_add_internal+0xf4/0x1c8)
 r4:cf06e308
[<c01caa88>] (kobject_add_internal+0x0/0x1c8) from [<c01cac78>] (kset_register+0x28/0x44)
 r9:cf6f2000 r8:c002df88 r7:cf818740 r6:bf05b700 r5:cf06e308
r4:cf06e300
[<c01cac50>] (kset_register+0x0/0x44) from [<c0214238>] (__class_register+0xb0/0x180)
 r5:00000000 r4:cf06e300
[<c0214188>] (__class_register+0x0/0x180) from [<c021434c>] (__class_create+0x44/0x6c)
 r9:cf6f2000 r8:c002df88 r7:bf05b5c0 r6:bf05b700 r5:bf05b0bd
r4:cf818740
[<c0214308>] (__class_create+0x0/0x6c) from [<bf05e060>] (real_leds_init+0x60/0xa0 [led])
 r7:00000000 r6:bf05b0b4 r5:cf8186c0 r4:bf05b5c0
[<bf05e000>] (real_leds_init+0x0/0xa0 [led]) from [<c002d2fc>] (do_one_initcall+0x54/0x180)
 r6:bf05e000 r5:bf05b5c0 r4:00000d4f
[<c002d2a8>] (do_one_initcall+0x0/0x180) from [<c00741f4>] (sys_init_module+0x98/0x188)
 r7:00000000 r6:000b5038 r5:bf05b5c0 r4:00000d4f
[<c007415c>] (sys_init_module+0x0/0x188) from [<c002dde0>] (ret_fast_syscall+0x0/0x2c)
 r7:00000080 r6:beb1ec78 r5:00000000 r4:00000000
---[ end trace bea89d483ae3e424 ]---
kobject_add_internal failed for led_class with -EEXIST, don't try to register things with the same name in the same directory.
[<c040140c>] (dump_stack+0x0/0x14) from [<c01cac08>] (kobject_add_internal+0x180/0x1c8)
[<c01caa88>] (kobject_add_internal+0x0/0x1c8) from [<c01cac78>] (kset_register+0x28/0x44)
 r9:cf6f2000 r8:c002df88 r7:cf818740 r6:bf05b700 r5:cf06e308
r4:cf06e300
[<c01cac50>] (kset_register+0x0/0x44) from [<c0214238>] (__class_register+0xb0/0x180)
 r5:00000000 r4:cf06e300
[<c0214188>] (__class_register+0x0/0x180) from [<c021434c>] (__class_create+0x44/0x6c)
 r9:cf6f2000 r8:c002df88 r7:bf05b5c0 r6:bf05b700 r5:bf05b0bd
r4:cf818740
[<c0214308>] (__class_create+0x0/0x6c) from [<bf05e060>] (real_leds_init+0x60/0xa0 [led])
 r7:00000000 r6:bf05b0b4 r5:cf8186c0 r4:bf05b5c0
[<bf05e000>] (real_leds_init+0x0/0xa0 [led]) from [<c002d2fc>] (do_one_initcall+0x54/0x180)
 r6:bf05e000 r5:bf05b5c0 r4:00000d4f
[<c002d2a8>] (do_one_initcall+0x0/0x180) from [<c00741f4>] (sys_init_module+0x98/0x188)
 r7:00000000 r6:000b5038 r5:bf05b5c0 r4:00000d4f
[<c007415c>] (sys_init_module+0x0/0x188) from [<c002dde0>] (ret_fast_syscall+0x0/0x2c)
 r7:00000080 r6:beb1ec78 r5:00000000 r4:00000000
REAL_LEDS initialized.

显然,是加载驱动时通过class_create()和device_create()添加的led_class等资源未被释放所导致。

在函数real_leds_exit()中添加释放资源的语句,

static void __exit real_leds_exit(void) {
    device_destroy(led_class, devid);
    class_destroy(led_class);
    printk("REAL_LEDS is released.\n");
}

重新编译生成驱动,重启目标板,加载驱动和卸载驱动就正常了。


问题解决。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值