在Linux中有,对于互斥的操作,大多用到了read/write mutex,今天发现一个问题,同一个进程内可以多次获取到。有点像vxworks中的量子锁一样。
但是会有crash打出:
=============================================
[ INFO: possible recursive locking detected ]
3.14.0-xilinx-00012-gfba9419-dirty #101 Not tainted
---------------------------------------------
ubimkvol/503 is trying to acquire lock:
(&le->mutex){+.+...}, at: [<c02edbd0>] leb_write_lock+0x18/0x20 我在这调用一次
but task is already holding lock:
(&le->mutex){+.+...}, at: [<c02edbd0>] leb_write_lock+0x18/0x20
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
----
lock(&le->mutex);
lock(&le->mutex);
*** DEADLOCK ***
May be due to missing lock nesting notation
2 locks held by ubimkvol/503:
#0: (&ubi->device_mutex){+.+.+.}, at: [<c02ebc9c>] ubi_cdev_ioctl+0x1f4/0x8dc
#1: (&le->mutex){+.+...}, at: [<c02edbd0>] leb_write_lock+0x18/0x20
Volume ID 0, size 19 LEBs (19767296 bytes, 18.9 MiB), LEB size 1
stack backtrace:
CPU: 0 PID: 503 Comm: ubimkvol Not tainted 3.14.0-xilinx-00012-gfba9419-dirty #101
[<c001e2a4>] (unwind_backtrace) from [<c0019d38>] (show_stack+0x10/0x14)
[<c0019d38>] (show_stack) from [<c041b280>] (dump_stack+0x84/0xd4)
[<c041b280>] (dump_stack) from [<c0061d6c>] (__lock_acquire+0x1cc0/0x1d58)
[<c0061d6c>] (__lock_acquire) from [<c00622b8>] (lock_acquire+0x60/0x74)
[<c00622b8>] (lock_acquire) from [<c041fdd8>] (down_write+0x40/0x54)
[<c041fdd8>] (down_write) from [<c02edbd0>] (leb_write_lock+0x18/0x20)
# [<c02edbd0>] (leb_write_lock) from [<c02f7184>] (ubi_backup_data_to_backup_volume+0xf4/0x47c)
[<c02f7184>] (ubi_backup_data_to_backup_volume) from [<c02f116c>] (ubi_io_write+0x340/0x6c4)
[<c02f116c>] (ubi_io_write) from [<c02ee654>] (ubi_eba_write_leb+0x540/0x6b0)
[<c02ee654>] (ubi_eba_write_leb) from [<c02e7560>] (ubi_change_vtbl_record+0xc8/0x12c)日 在这个函数中已经调用了一次。
[<c02e7560>] (ubi_change_vtbl_record) from [<c02e8bb0>] (ubi_create_volume+0x438/0x570)
[<c02e8bb0>] (ubi_create_volume) from [<c02ebca8>] (ubi_cdev_ioctl+0x200/0x8dc)
[<c02ebca8>] (ubi_cdev_ioctl) from [<c00de480>] (vfs_ioctl+0x18/0x34)
[<c00de480>] (vfs_ioctl) from [<c00df0b8>] (do_vfs_ioctl+0x5b8/0x600)
[<c00df0b8>] (do_vfs_ioctl) from [<c00df138>] (SyS_ioctl+0x38/0x54)
[<c00df138>] (SyS_ioctl) from [<c00163c0>] (ret_fast_syscall+0x0/0x48)
UBI DBG io (pid 503): read 4096 bytes from PEB 22:0
是上一个函数中已经获取到这个锁,在下面的子函数中,又一次的去获取这个锁,尽然成功了。但是有上面的信息打出。
冒似这样没有什么多大问题,因为是同一个进程,所以多次成功获取不会有问题。因为是同一个进程内,不会有死锁的情况。