Tag Archives: kERNEL

SPIN_LOCK 小註解

最近看到一個 Kernel config 叫做 CONFIG_UNINLINE_SPIN_UNLOCK, 這 un 又 un, 真的是讓人看得眼花. 雖然說現在人強調 “減法” 的思維, 看這個名詞還是得用 “加法”. STEP 1: SPIN_LOCK [1], 多處理器共用一個資源時, 透過 SPIN_LOCK 去鎖住不讓其他人用. 自己用完後, 設為 unlock, 別人就可以用. 怎麼知道可不可以用呢? 要透過 trylock() 來判斷是否拿到資源. 如果拿不到回直接回傳 busy, 除非一直 try 否則也不會浪費資源. 真的 try 不停就要看演算了 [2].

STEP 2: INLINE_SPIN_LOCK. inline 是指會將 spin_lock() 插入程式之中. 但它也不只是當作巨集處理而已, 參考 [3] 這段話, 它會把 spin_lock() 這個函式的內容優化之後才代入. 
The point of making a function inline is to hint to the compiler that it is worth making some form of extra effort to call the function faster than it would otherwise – generally by substituting the code of the function into its caller. As well as eliminating the need for a call and return sequence, it might allow the compiler to perform certain optimizations between the bodies of both functions.

STEP 3:  INLINE_SPIN_UNLOCK. 有鎖的動作就有解鎖. 使用之前, kernel config 要先打開. 追溯到 2012 年, 當初只有 CONFIG_INLINE_SPIN_UNLOCK [4].

STEP 4:  Linus Torvalds 自己建議把原本預設開 CONFIG_INLINE_SPIN_UNLOCK, 改為預設 CONFIG_UNINLINE_SPIN_UNLOCK 未定義 [4].
-CONFIG_INLINE_SPIN_UNLOCK=y
+# CONFIG_UNINLINE_SPIN_UNLOCK is not set

想要 debug inline spin unlock 的人如果想要加 debug code, 開這個 config 就不會因為 inline 的作用, 使自己的 code 和原本 inline 的函式融為一體, 以致於無法正確地 debug.

預期的路人心得:  不能因為負負得正, 就把 CONFIG_UNINLINE_SPIN_UNLOCK 想成 CONFIG_INLINE_SPIN_LOCK. 哈!
[Ref]

  1. https://blog.csdn.net/u010144805/article/details/80354679
  2. https://locklessinc.com/articles/locks/
  3. www.greenend.org.uk/rjk/tech/inline.html
  4. http://lkml.iu.edu/hypermail/linux/kernel/1203.2/03015.html

Linux Kernel 審 code 的流程

 GPL 專家 Armijn 介紹 Linux kernel team 給我們認識, 我才知道想把 code 放進 Linux kernel 不是一件容易的事. 這些也可以給一般的 programmer 參考.

他們第一件事就是要求 coding style. 然後是 check list. 相關的說明可以從 Linux 網站找到.

等到這些 code 變漂亮了 (the code is all great and shiny ) , 還要把 code 切成小塊. 因為太多 code 就很難 review. 另一方面, 切成小塊之後就可以分成不同的 patch.

– Fixing a bug
– Fixing a spelling mistake
– A bug fix for the same bug that appeared in several places over the
   kernel.
– A new driver.
– Support for a new SOC or evaluation board.
 
因為 Linux Kernel 是用 Git 維護 (和 SVN 相對), 只要中間爛掉一版, 後面就麻煩了. (If a version of kernel is broken the use of git bisect is made impossible or significantly harder.)
 
如果一個修改涉及整個 system 或是 SOC, 那麼也不用切小了. 此時可以從 kernel 的 MAINTAINERS 檔案找到對應窗口. 例如:
 
SQUASHFS FILE SYSTEM
M:      Phillip Lougher <phillip@lougher.demon.co.uk>
L:      squashfs-devel@lists.sourceforge.net (subscribers-only)
W:      http://squashfs.org.uk
S:      Maintained
F:      Documentation/filesystems/squashfs.txt
F:      fs/squashfs/
 
L 和 M 裡面至少有一個是負責的窗口, M 是負責人, 而 L 是 mail list 的名單. 如果兩者都不存在, 預設窗口就是 linux-kernel@vger.kernel.org. 顯然 W 是網站 (web), S 是 status, F 是文件 (file), 第二個 F 是 folder, 這說明了這份 code 相關的資訊.
 
所以每當想要加一些 code 到 Linux kernel, 其實不需要別人牽線, 只好自己乖乖地按照應有的步驟把 code 準備好寄出就可以了.