Bn" ); spin_lock ( spin_lock (} void hack_spinBA ( void ) { printk ( "hack_lockdep:B- >An" ); spin_lock (} static int __init lockdep_test_init ( void ) { printk ( "figo:my lockdep module initn" ); hack_spinAB (); hack_spinBA (); return 0 ;} static void __exit lockdep_test_exit ( void ) { printk ( "goodbyen" );} module_init (lockdep_test_init); module_exit (lockd" />

精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux內核中簡單的AB-BA死鎖案例

麥辣雞腿堡 ? 來源:嵌入式Linux充電站 ? 作者:Vincent ? 2023-09-27 15:19 ? 次閱讀

簡單的AB-BA死鎖案例

下面舉一個簡單的AB-BA死鎖的例子:

#include < linux/module.h >
#include < linux/init.h >
#include < linux/kernel.h >

static DEFINE_SPINLOCK(hack_spinA);
static DEFINE_SPINLOCK(hack_spinB);

void hack_spinAB(void)
{
    printk("hack_lockdep:A- >Bn");
    spin_lock(&hack_spinA);
    spin_lock(&hack_spinB);
}

void hack_spinBA(void)
{
    printk("hack_lockdep:B- >An");
    spin_lock(&hack_spinB);
}

static int __init lockdep_test_init(void)
{
    printk("figo:my lockdep module initn");
    
    hack_spinAB();
    hack_spinBA();
 
    return 0;
}

static void __exit lockdep_test_exit(void)
{
  printk("goodbyen");
}

module_init(lockdep_test_init);
module_exit(lockdep_test_exit);
MODULE_LICENSE("GPL");

上述代碼初始化了兩個自旋鎖,其中hack_spinAB()函數分別申請了hack_spinA鎖和hack_spinB鎖,hack_spinBA()函數要申請hack_spinB鎖。因為剛才鎖hack_spinB已經被成功獲取且還沒有釋放,所以它會一直等待,而且它也被鎖在hack_spinA的臨界區里。

現象:

[root@imx6ull:~]# insmod lockdep_test.ko 
[  437.981262] figo:my lockdep module init
[  437.985145] hack_lockdep:A- >B
[  437.989054] hack_lockdep:B- >A
[  437.992304] 
[  437.993819] =============================================
[  437.999229] [ INFO: possible recursive locking detected ]
[  438.004641] 4.9.88 #2 Tainted: G           O   
[  438.009180] ---------------------------------------------
[  438.014589] insmod/367 is trying to acquire lock:
[  438.019303]  (hack_spinB){+.+...}, at: [< 7f00a030 >] lockdep_test_init+0x30/0x3c [lockdep_test]

[  438.028006] but task is already holding lock:
[  438.032547]  (hack_spinB){+.+...}, at: [< 7f008038 >] hack_spinAB+0x38/0x3c [lockdep_test]

[  438.040715] other info that might help us debug this:
[  438.045950]  Possible unsafe locking scenario:
[  438.045950] 
[  438.051883]        CPU0
[  438.054337]        ----
[  438.056790]   lock(hack_spinB);
[  438.059975]   lock(hack_spinB);
[  438.063160] 
[  438.063160]  *** DEADLOCK ***
[  438.063160] 
[  438.069094]  May be due to missing lock nesting notation
[  438.069094] 
[  438.075896] 2 locks held by insmod/367:
[  438.079740]  #0:  (hack_spinA){+.+...}, at: [< 7f008030 >] hack_spinAB+0x30/0x3c [lockdep_test]
[  438.088358]  #1:  (hack_spinB){+.+...}, at: [< 7f008038 >] hack_spinAB+0x38/0x3c [lockdep_test]
[  438.096977] 
[  438.096977] stack backtrace:
[  438.101352] CPU: 0 PID: 367 Comm: insmod Tainted: G           O    4.9.88 #2
[  438.108410] Hardware name: Freescale i.MX6 UltraLite (Device Tree)
[  438.114628] [< 801136cc >] (unwind_backtrace) from [< 8010e78c >] (show_stack+0x20/0x24)
[  438.122396] [< 8010e78c >] (show_stack) from [< 804ccc34 >] (dump_stack+0xa0/0xcc)
[  438.129646] [< 804ccc34 >] (dump_stack) from [< 8018f020 >] (__lock_acquire+0x8bc/0x1d4c)
[  438.137502] [< 8018f020 >] (__lock_acquire) from [< 80190b78 >] (lock_acquire+0xf4/0x2f8)
[  438.145358] [< 80190b78 >] (lock_acquire) from [< 80c94a0c >] (_raw_spin_lock+0x4c/0x84)
[  438.153129] [< 80c94a0c >] (_raw_spin_lock) from [< 7f00a030 >] (lockdep_test_init+0x30/0x3c [lockdep_test])
[  438.162638] [< 7f00a030 >] (lockdep_test_init [lockdep_test]) from [< 80102004 >] (do_one_initcall+0x54/0x184)
[  438.172315] [< 80102004 >] (do_one_initcall) from [< 80229624 >] (do_init_module+0x74/0x1f8)
[  438.180431] [< 80229624 >] (do_init_module) from [< 801dac54 >] (load_module+0x201c/0x279c)
[  438.188461] [< 801dac54 >] (load_module) from [< 801db648 >] (SyS_finit_module+0xc4/0xfc)
[  438.196317] [< 801db648 >] (SyS_finit_module) from [< 80109680 >] (ret_fast_syscall+0x0/0x1c)

提示信息顯示:嘗試獲取hack_spinB鎖,但是該鎖已經在函數hack_spinAB中被鎖定

圖片

lockdep已經很清晰地顯示了死鎖發生的路徑和發生時函數調用的棧信息,根據這些信息可以很快速地定位問題和解決問題。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1363

    瀏覽量

    40228
  • Linux
    +關注

    關注

    87

    文章

    11227

    瀏覽量

    208925
  • 死鎖
    +關注

    關注

    0

    文章

    25

    瀏覽量

    8066
收藏 人收藏

    評論

    相關推薦

    Linux內核container_of原理詳解

    Linux內核中經常可見container_of的身影,它在實際驅動的編寫也是廣泛應用。
    發表于 07-14 15:19 ?300次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>中</b>container_of原理詳解

    Linux內核地址映射模型與Linux內核高端內存詳解

    Linux 操作系統和驅動程序運行在內核空間,應用程序運行在用戶空間,兩者不能簡單地使用指針傳遞數據,因為Linux使用的虛擬內存機制,用戶空間的數據可能被換出,當
    發表于 05-08 10:33 ?3442次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>地址映射模型與<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>高端內存詳解

    簡單分析linux內核的結構體使用方法

    所謂linux驅動編程可以理解為linux內核的編程。既然在內核編程那就必須要符合內核的邏輯和各種規定好的框架。
    發表于 01-19 08:26

    Linux內核教程

    本章學習目標掌握LINUX內核版本的含義理解并掌握進程的概念掌握管道的概念及實現了解內核的數據結構了解LINUX內核的算法掌握
    發表于 04-10 16:59 ?0次下載

    linux處理機調度與死鎖

    linux處理機調度與死鎖 掌握處理機的三級調度 掌握作業調度及進程調度的概念 理解調度算法的評價準則 掌握并靈活運用常用的幾種作業調度、
    發表于 04-28 14:59 ?0次下載

    Linux內核解讀入門

    Linux內核解讀入門關鍵詞:Linux, 內核,源代碼一.核心源程序的文件組織: 1. Linux核心源程序通常都安裝在/usr/src/
    發表于 01-16 14:40 ?103次下載

    DIN死鎖避免和死鎖恢復

    DIN死鎖避免和死鎖恢復 由于存在占用資源者申請另一個資源的情形,在DIN由于拓撲結構本身存在環狀路徑,所以
    發表于 02-23 14:47 ?901次閱讀
    DIN<b class='flag-5'>中</b>的<b class='flag-5'>死鎖</b>避免和<b class='flag-5'>死鎖</b>恢復

    Linux內核配置系統詳解

    隨著 Linux 操作系統的廣泛應用,特別是 Linux 在嵌入式領域的發展,越來越多的人開始投身到 Linux 內核級的開發。面對日益龐
    發表于 11-01 15:45 ?4次下載

    用crash工具分析Linux內核死鎖的一次實戰分享

    內核死鎖問題一般是讀寫鎖(rw_semaphore)和互斥鎖(mutex)引起的,本文主要講如何通過ramdump+crash工具來分析這類死鎖問題。
    的頭像 發表于 03-17 09:27 ?1.6w次閱讀
    用crash工具分析<b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>死鎖</b>的一次實戰分享

    linux內核是什么_linux內核學習路線

    Linux內核是一個操作系統(OS)內核,本質上定義為類Unix。它用于不同的操作系統,主要是以不同的Linux發行版的形式。Linux
    發表于 09-16 15:49 ?2614次閱讀

    linux內核參數設置_linux內核的功能有哪些

    本文主要闡述了linux內核參數設置及linux內核的功能。
    發表于 09-17 14:40 ?1362次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內核</b>參數設置_<b class='flag-5'>linux</b><b class='flag-5'>內核</b>的功能有哪些

    linux內核的driver_register介紹

    linux內核注冊驅動由driver_register()完成。它將驅動程序的信息添加到內核的驅動程序列表,使得內核能夠在需要時與該驅動
    的頭像 發表于 07-14 09:17 ?2674次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內核</b><b class='flag-5'>中</b>的driver_register介紹

    Linux內核死鎖lockdep功能

    的編程思路,也不可能避免會發生死鎖。在Linux內核,常見的死鎖有如下兩種: 遞歸死鎖:如在中
    的頭像 發表于 09-27 15:13 ?677次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>死鎖</b>lockdep功能

    Linux內核實際項目中的死鎖

    實際項目中的死鎖 下面的例子要復雜一些,這是從實際項目中抽取出來的死鎖,更具有代表性。 # include # include # include # include # include
    的頭像 發表于 09-27 15:24 ?732次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>實際項目中的<b class='flag-5'>死鎖</b>

    使用 PREEMPT_RT 在 Ubuntu 構建實時 Linux 內核

    的實時內核補丁來完成。簡介我們曾介紹過在Ubuntu22.04啟用實時Linux內核有多簡單,因為Canonical已將該
    的頭像 發表于 04-12 08:36 ?2215次閱讀
    使用 PREEMPT_RT 在 Ubuntu <b class='flag-5'>中</b>構建實時 <b class='flag-5'>Linux</b> <b class='flag-5'>內核</b>