块设备驱动-模块引用计数理解

引用计数的理解

Add_disk 调用blk_register_region,传入exact_lock。

而exact_lock会调用get_disk增加模块的引用计数。

Add_disk之后调用register_disk,它会调用blkdev_get,最终调用do_open尝试打开盘,增加引用计数,然后调用blkdev_put来减少引用计数。

 add_disk

          blk_register_region(传入exact_lock,而exact_lock会调用get_disk增加模块的引用计数, 引用计数哪里减的了? )

         register_disk

                     blkdev_get 

                                  do_open (增加模块的引用计数)

                    blkdev_put(减小模块的引用计数))

                            

          blk_register_queue

最终: add_disk 不会增加模块的引用计数


open_by_devnum

         blkdev_get

      __blkdev_get

         Do_open

                            Get_gendisk

                                     Kobj_lookup

                                               Try_module_get

                                               p->lock(exact_lock)

                                                        get_disk

                                                                 try_module_get

                                               module_put

这个可以解释打开块设备,系统会增加模块的引用计数。

第二次(或以上)打开相同的块设备, 模块的引用计数是不增加的。 因为后面又有一次module_put


注销设备的理解

设备被注销,有两方面的含义:

一: 不接受新的请求。

二:     已有的请求全部返回

del_gendisk

invalidate_partition

fsync_bdev(保证第二点)


关于第二点 “已有的请求全部返回”, 是指哪一层给我(指块设备)请求, 我del_gendisk可以保证请求全部返回给哪一层。“那一层再向它的上层的同步,我无法保证!”

谁是请求的发起者, 谁就要去做请求回来的同步!! 


你可能感兴趣的:(块设备驱动-模块引用计数理解)