LWN:DVB與頭文件和用戶空間的regression!
關(guān)注了就能看到更多這么棒的文章哦~
DVB, header files, and user-space regressions
By Jake Edge
August 25, 2021
DeepL assisted translation
https://lwn.net/Articles/867275/
最近 Linux 5.14 版本中 media 子系統(tǒng)出現(xiàn)了一次比較奇怪的質(zhì)量回退(regression)。內(nèi)核的用戶空間二進(jìn)制接口(ABI)并沒有發(fā)生變化,而一般來說要 revert 某個(gè) patch 的話通常都是因?yàn)檫@類原因,但這次的時(shí)間報(bào)告仍然導(dǎo)致了 patch revert。因?yàn)檫@次的代碼改動(dòng)確實(shí)導(dǎo)致了用戶空間應(yīng)用程序的編譯問題,因?yàn)樗岩恍╊^文件移到了 staging/ 目錄之下,這是清理已經(jīng)廢棄(deprecated)的(雖然其實(shí)仍然可用的)數(shù)字視頻廣播(DVB)設(shè)備的驅(qū)動(dòng)程序引出的改動(dòng)。這里有幾個(gè)不同的問題糾纏在一起,但用戶空間 API(而不是 ABI)的質(zhì)量回退是一個(gè)新的問題。
Soeren Moch 在 8 月 11 日的一篇詳盡的郵件中報(bào)告了這個(gè) regression 問題。該郵件的部分內(nèi)容是對(duì) Linus Torvalds 說的,要求 revert 掉 media 子系統(tǒng)維護(hù)者 Mauro Carvalho Chehab 提交的三個(gè) patch。這些 patch 將 av7110 驅(qū)動(dòng)移到了 staging 位置,并將一些文檔和頭文件也移動(dòng)了過去。但這破壞了視頻錄像機(jī)(VDR)應(yīng)用程序中一些部分的編譯工作,而 Moch 指出這個(gè)應(yīng)用程序在多個(gè) Linux 發(fā)行版中都缺省提供了。
他引用了一個(gè)由 VDR 社區(qū)的另一個(gè)成員提出的 Red Hat bug,作為證據(jù)。VDR 使用了 uapi/linux/dvb 目錄下的頭文件,當(dāng)這些文件被移動(dòng)時(shí),VDR 在即將到來的 Fedora 35 使用的內(nèi)核上就無(wú)法完成編譯了。除此之外,Moch 不同意將這種 "長(zhǎng)期存在并能正常工作的 av7110 驅(qū)動(dòng)程序 " 移到 staging/。
這封郵件的大部分內(nèi)容是發(fā)給 Chehab 的,認(rèn)為不應(yīng)該將現(xiàn)有 DVB API 改為 deprecated [更新:正如 LWN 評(píng)論中指出的,這是 av7110 中實(shí)現(xiàn)的 "全功能 "DVB API,只是被 VDR 所使用到]、刪除 av7110 支持、以及抱怨 Chehab 不愿意合并另一個(gè)同樣實(shí)現(xiàn)了該 API 的驅(qū)動(dòng)程序。Moch 說,有一些現(xiàn)在在用的設(shè)備和現(xiàn)成的 DVB stream 都是在通過這些驅(qū)動(dòng)程序來訪問的。他對(duì) Chehab 在移動(dòng) av7110 的 patch 帶有的 commit message 有些不同看法:
你的提交信息 "解碼器只支持 MPEG2,與幾個(gè)現(xiàn)代 DVB 流不兼容 " 往好里說也得算是有誤導(dǎo)性的。德國(guó)最流行的衛(wèi)星電視供應(yīng)商(Astra)仍然在用 MPEG-2 編碼傳輸大多數(shù)有趣的節(jié)目,所以這應(yīng)該算是在活躍使用中的,沒有理由讓這塊卡退休。
但 Chehab 的看法不同:av7110 硬件在 15 年前就已經(jīng)停止生產(chǎn)了,而驅(qū)動(dòng)所實(shí)現(xiàn)的 DVB API 對(duì)今天的硬件沒有用:
被刪除的 API 是專門用于控制 av7110 的 MPEG-2 解碼器而編寫的,從來沒有被集成到 DVB 核心代碼中去:av7110 在自己的內(nèi)部代碼中有一個(gè)針對(duì)這個(gè)驅(qū)動(dòng)實(shí)現(xiàn)的專門版本。
此外,該 API 也從來沒有完整的文檔:有幾個(gè)來自現(xiàn)在被刪除的 API 的 ioctl 從來沒有在官方 linux kernel 里面實(shí)現(xiàn)過,也沒有在 spec 中描述過。目前的 upstream 維護(hù)者中沒有一個(gè)人了解這些 ioctls 是做什么用的,我們也沒有任何 av7110 硬件可以進(jìn)行測(cè)試。
對(duì)于其中的一些說法,大家很明顯是有分歧的,Moch 一再提出今后想自己來負(fù)責(zé)維護(hù) av7110 的驅(qū)動(dòng)程序。他也希望看到他的 saa716x 驅(qū)動(dòng)(同樣也實(shí)現(xiàn)了 DVB API)被合入 mainline,并說他也愿意作為它的維護(hù)者。據(jù) Moch 說,有一個(gè)活躍的社區(qū)正在使用 VDR 的硬件,DVB API 很適合它的需求。但是 Chehab 說:
過去將 av7110 保留在內(nèi)核中,一直是在浪費(fèi) upstream 上有限的開發(fā)資源。幾年前,由于 year-2038 問題,我們需要修復(fù) av7110 的 API。由于代碼已經(jīng)在那里很久缺乏維護(hù)了,我們時(shí)不時(shí)會(huì)遇到與它有關(guān)的 bug(甚至有些 security 問題)。如上所述,最近一次修改可能破壞了這個(gè)驅(qū)動(dòng)程序,而在幾次 Kernel review 中都沒有人注意到。
Moch 對(duì)這一說法提出異議,并對(duì) Chehab 對(duì) media 子系統(tǒng)的處理有一些措辭非常強(qiáng)烈的抱怨,其中一部分他是向 Torvalds 提出的。顯然,在這個(gè)話題中摻雜了一些長(zhǎng)期爭(zhēng)議。Torvalds 插進(jìn)來澄清了一些事。他說,regression 政策只針對(duì)內(nèi)核的 ABI,而這里 ABI 并沒有發(fā)生變化。"舊程序仍舊可以繼續(xù)工作"。他還感嘆說 VDR 不應(yīng)該直接使用內(nèi)核的頭文件,這不是正確的用法:
我們非常不建議用戶空間的應(yīng)用程序直接使用內(nèi)核頭文件,哪怕是像 glibc 這樣的項(xiàng)目也應(yīng)該是 copy 這些頭文件,而不是直接 include 進(jìn)去。
這正是因?yàn)閷?duì)內(nèi)核代碼樹的目錄調(diào)整都不應(yīng)該導(dǎo)致其他地方出現(xiàn)隨機(jī)問題,而這些問題從內(nèi)核的角度(或從另一端的角度)來看是很難測(cè)試和永遠(yuǎn)保持步調(diào)一致的。
但另一方面,有問題的頭文件是位于 uapi 目錄的。"雖然用戶空間程序這樣使用它們是會(huì)導(dǎo)致很多麻煩的,但我認(rèn)為這種做法也不算是完全不合理的"。所以他把移動(dòng)頭文件的改動(dòng)給 revert 掉了,同時(shí)保留了其他的改動(dòng)不變(也就是 av7110 和 DVB API 文檔仍然是被移到了 staging/)。他建議 VDR 和其他任何使用了頭文件的應(yīng)用程序都將這些文件復(fù)制到他們自己的代碼 tree 中。他同意 Chehab 的意見,認(rèn)為將 av7110 移出 main tree 是正確的做法:
我不認(rèn)為將 av7110 驅(qū)動(dòng)從 staging 中移回去是個(gè)有意義的做法,盡管它可能可以繼續(xù)正常工作,但它 是 老舊代碼,而且沒有維護(hù)。并且我當(dāng)然建議任何其他 mainline kernel 之外的驅(qū)動(dòng)如果在使用這些沒有版本實(shí)現(xiàn)的舊接口的話,都不應(yīng)該繼續(xù)使用了,畢竟沒有什么其他東西實(shí)現(xiàn)了這些功能。
Torvalds 和 Chehab 似乎都忽略了 Moch 提出的維護(hù)驅(qū)動(dòng)程序的建議,或者說沒有完全接受,盡管他也許可以在 staging/ 中來作為這部分的維護(hù)者。保持驅(qū)動(dòng)能一直正常工作,這是確保它不會(huì)被完全刪除的一個(gè)好方法。然而,Moch 關(guān)于 av7110 最終命運(yùn)的問題仍然沒有得到回答:
這個(gè)驅(qū)動(dòng)可以在 staging 區(qū)停留多長(zhǎng)時(shí)間?如果我把它很好維護(hù)起來之后,你會(huì)把這個(gè)驅(qū)動(dòng)程序從 staging 區(qū)移回來嗎?如果一個(gè)驅(qū)動(dòng)程序仍然有用戶,并且有人自愿維護(hù)它,在一定時(shí)間后還要?jiǎng)h除驅(qū)動(dòng)程序,這是否是 Linux 的一個(gè)標(biāo)準(zhǔn)政策?
所以,至少現(xiàn)在 VDR 的用戶還可以在最新的內(nèi)核中進(jìn)行編譯。今后,復(fù)制了頭文件之后應(yīng)該也可以確保它繼續(xù)能夠成功編譯。不過,如果驅(qū)動(dòng)程序被刪除的話,用戶也將需要重新編譯一個(gè)驅(qū)動(dòng)程序,才能讓一切正常工作起來。Chehab 說,他愿意參與討論 DVB 的 API,"但是這樣的 API 需要能夠支持現(xiàn)代的嵌入式硬件,并且應(yīng)該被設(shè)計(jì)成容易擴(kuò)展來支持未來的需求"。這可能會(huì)導(dǎo)致需要重新制作一個(gè) saa716x 驅(qū)動(dòng),這樣它就可以被納入 mainline,但無(wú)論如何這款硬件已經(jīng)是相當(dāng)古老的了,而且不清楚 VDR 社區(qū)是否有興趣進(jìn)行這類改動(dòng)。
看到一個(gè)擁有活躍社區(qū)的仍然可用的驅(qū)動(dòng)得到這樣的待遇,著實(shí)有些令人驚訝,但 Chehab 堅(jiān)持認(rèn)為 DVB API 作為 media 子系統(tǒng)的一部分已經(jīng)被廢棄了。在這個(gè)主題中,有一股對(duì)多年來 DVB API 的處理和 Chehab 的處理方式表示不滿的味道,但 Linux 維護(hù)者對(duì)于自己負(fù)責(zé)的子系統(tǒng)也總是有最大的權(quán)限。在這一點(diǎn)上,雙方似乎都很固執(zhí)己見,所以可能需要一些其他感興趣的人站出來幫助找到一種可行的解決方案,否則的話 VDR 社區(qū)就需要繼續(xù)使用那些處于 staging 的驅(qū)動(dòng),或者干脆完全脫離 mainline 的驅(qū)動(dòng)了。
這個(gè)事件確實(shí)證明了內(nèi)核里的 regression policy 擴(kuò)充了適用場(chǎng)景。哪怕 Torvalds 對(duì)這里使用頭文件的方式不滿意,他也仍然不想導(dǎo)致一個(gè)現(xiàn)有的用戶空間應(yīng)用程序無(wú)法使用,因此進(jìn)行了 revert 操作。我們不禁要問,還有多少其他的應(yīng)用程序或 library 還沒有了解到這個(gè)不要直接使用內(nèi)核用戶空間 API 頭文件的原則呢?這可能會(huì)導(dǎo)致以后進(jìn)行代碼調(diào)整和清理工作的時(shí)候出現(xiàn)問題。
全文完
LWN 文章遵循 CC BY-SA 4.0 許可協(xié)議。
長(zhǎng)按下面二維碼關(guān)注,關(guān)注 LWN 深度文章以及開源社區(qū)的各種新近言論~
