LWN: 内核staging目录的驱动们最后下场如何?

本文深入探讨了Linux内核staging树的历史、作用及其对内核开发的影响。通过对11年来加入staging树的247个模块进行分析,文章揭示了这些模块的最终命运,包括毕业进入mainline、被替代、失败、阶段性移除以及仍在staging树中的现状。数据显示,约21%的模块成功毕业,15%被替代,24%失败,11%阶段性移除,而29%仍在staging树中。这一分析为评估staging树对内核开发的价值提供了实证依据。
640
点击上方蓝色“Linux News搬运工”关注我们~

What happens to kernel staging-tree code

By Jonathan Corbet

staging tree是2008年在2.6.28版本开发周期中加到kernel里的,目的是希望能帮助那些尚未标准化的驱动程序逐步完善并合入mainline( kernel主线)。这么多年来它一直存在争议。最新的关于EROFS和exFAT文件系统的争论,再一次引起大家讨论这个staging tree具体是不是真的对kernel社区有价值。LWN也无法回答这个问题,不过我们可以分析一下过去11年里加入staging tree的东西来看看是否能有一些结论。

staging tree的主要特点是它对加入的代码持有更开放的态度,不用参照通常合入kernel代码时所需要的严格标准。如果某个驱动程序加入staging tree了,任何人只要胆子够大就可以直接试用。不过它其实更深层次的目标是让开发者能继续改进代码从而最终以更正式的方式合入kernel合适的位置。新加入的开发者可以在这里试一些简单的改动,如果效果不错,Linux就能得以支持这种新的硬件设备。没有staging tree的话,这些试验性的东西可能就永远无法合入kernel了。

有些人并不赞同这种工作方式(先把代码放进kernel再改善)。以exFAT为例,其实很多开发者都认为如果把它合入staging tree的话,它自己改善的速度可能还不如拒绝合入。正如Dave Chinner所说:“这类改动在mailing list上会更容易完善以及进行review。并不需要把这个代码合入staging tree。其实如果真把它先合入了,那么后续很难进行架构改动,因为它只能慢慢的随着kernel开发周期来慢慢迭代。”

Greg Kroah-Hartman是staging tree的maintainer(维护者),他的回复指出合入代码能够给各位开发者一个很好的平台来进行合作。他也承认可能会让开发进程变慢一些,不过他认为这个代价很值得,尤其适合有很多人需要配合来改进这部分代码的情况。

LWN编辑发现其实没有人真正审查过去11年曾经进入过staging tree的这些模块。于是我简单写了脚本以及对Git进行各种查找,拿到了不少数据,展示了每个模块进入staging tree还有从中删除的时间。然后进行大量的人工分析,来调查每个模块离开staging tree的原因。现在终于昨晚了,结果如下。

Graduations (特指从staging tree毕业进入正常kernel代码库)

统计中有247个模块进入了staging tree。其中有52个“毕业”了,占总数的21%,包括:

ModuleEntryExitReleasesFate
altera-staplv3.0v3.23Graduated
ath6klv2.6.37v3.25Graduated
batman-advv2.6.33v2.6.386Graduated
brcm80211v2.6.37v3.25Graduated
ccreev4.12v4.176Graduated
cx25821v2.6.32v3.210Graduated
dwc2v3.10v3.145Graduated
echov2.6.28v3.1527Graduated
et131xv2.6.28v3.1830Graduated
fsl-mcv4.1v4.1919Graduated
gma500v3.0v3.34Graduated
hvv2.6.32v3.412Graduated
iio/dacv2.6.38v3.68Graduated
iio/imuv2.6.35v3.914Graduated
iio/lightv2.6.32v4.1846Graduated
iio/magnetometerv2.6.35v4.631Graduated
imx-drmv3.7v3.1913Graduated
ipackv3.5v3.84Graduated
line6v2.6.30v4.030Graduated
media/as102v3.2v3.1817Graduated
media/cecv4.8v4.103Graduated
media/cxd2099v3.2v4.1736Graduated
media/dt3155v4lv2.6.35v4.227Graduated
media/go7007v2.6.28v3.1729Graduated
media/mn88472v3.19v4.810Graduated
media/mn88473v3.19v4.68Graduated
media/msi3101v3.12v3.176Graduated
media/pulse8-cecv4.8v4.103Graduated
media/rtl2832u_sdrv3.15v3.173Graduated
media/s5p-cecv4.8v4.125Graduated
media/solo6x10v2.6.36v3.1721Graduated
media/st-cecv4.9v4.124Graduated
meiv3.0v3.56Graduated
mrst-touchscreenv2.6.35v2.6.373Graduated
mt7621-gpiov4.17v4.193Graduated
mt7621-spiv4.17v5.27Graduated
omapdrmv3.3v3.97Graduated
panelv2.6.29v4.637Graduated
rar_registerv2.6.32v2.6.365Graduated
rdma/hfi1v4.3v4.75Graduated
samsung-laptopv2.6.33v3.07Graduated
sm7xxfbv2.6.33v4.331Graduated
ti-soc-thermalv3.6v3.116Graduated
ti-stv2.6.35v3.05Graduated
tm6000v2.6.35v3.27Graduated
typecv4.12v4.198Graduated
udlfbv2.6.31v2.6.388Graduated
usbipv2.6.28v3.1729Graduated
vboxvideov4.13v5.211Graduated
xillybusv3.12v3.187Graduated
zramv2.6.33v3.1421Graduated
zsmallocv3.4v3.1411Graduated

(注:releases列包括了把这个模块从staging tree中拿掉的那个release版本,因为这个动作属于那次release cycle)。

有些模块比其他的更快的毕业了。例如altera-stapl驱动,经过3此发布周期就毕业了。相对应的,industrial I/O light模块则经过了46个发布周期,将近9年的时间。不管它们都经历了多长时间吧,每个模块都在不断改善之后得到了相应子系统维护者的接受。

这里成功率才21%,看起来并不高。不过这种看法并不全面。大量staging tree中的驱动程序最终都被删掉了,因为mainline里面有其他的驱动程序实现了它的功能。这类被替代的模块是:

ModuleEntryExitReleasesFate
adis16255v2.6.35v2.6.384Superseded
android/switchv3.3v3.53Superseded
at76_usbv2.6.28v2.6.325Superseded
cpc-usbv2.6.31v2.6.322Superseded
cptm1217v2.6.38v4.022Superseded
cs5535_gpiov2.6.38v3.13Superseded
dt3155v2.6.34v2.6.363Superseded
me4000v2.6.28v2.6.325Superseded
media/easycapv2.6.36v3.711Superseded
media/tw686x-khv4.7v4.93Superseded
meilhausv2.6.29v2.6.324Superseded
mimiov2.6.29v2.6.346Superseded
msmv2.6.35v3.16Superseded
mt29f_spinandv3.13v5.029Superseded
mt7621-ethv4.17v5.16Superseded
otusv2.6.29v2.6.379Superseded
pata_rdcv2.6.31v2.6.322Superseded
quatech_usb2v2.6.32v3.513Superseded
rt2860v2.6.29v3.011Superseded
rt2870v2.6.29v3.011Superseded
rt3070v2.6.30v2.6.367Superseded
rt3090v2.6.32v2.6.343Superseded
rtl8187sev2.6.29v3.1526Superseded
rtl8192eev3.16v3.183Superseded
rtl8192suv2.6.31v2.6.377Superseded
rtl8723auv3.15v4.915Superseded
rtl8821aev3.14v3.185Superseded
rtlwifiv4.14v5.210Superseded
rts5139v3.2v3.1615Superseded
rts_pstorv3.0v3.89Superseded
serqt_usbv2.6.30v2.6.312Superseded
slicossv2.6.28v4.1042Superseded
ste_rmi4v2.6.38v4.628Superseded
stlc45xxv2.6.30v2.6.323Superseded
uc2322v2.6.30v2.6.312Superseded
usbvideov2.6.38v3.02Superseded
zcachev3.0v3.1213Superseded

所以有37个驱动程序有替代模块合入了mainline,占比15%,当然它们每个都有不同的情况,各有成败。有些staging的驱动太难看了,所以激发了其他开发者的完美主义情结,从头写了一个更好的驱动提交上去,这种情况下我们可以认为这个staging驱动也是成功的,毕竟达成了它的目标。另外一种情况下是相应的硬件供应商提供了官方驱动,例如很多Realtek驱动都是这么来的。还有一类情况是staging驱动提供了很多信息,帮助其他人写出了更好的驱动,这也是有价值的。

上述的驱动程序最终都在某种意义上进入了mainline。虽然很难估计把各个驱动放到staging tree究竟有多大帮助,不过最终能支持这类硬件,应该就是社区的成功了。

Failures

还有很多驱动最终就从staging tree里删除了,相应的功能也就不再存在了。

ModuleEntryExitReleasesFate
agnxv2.6.29v2.6.324Failed
altpciechdmav2.6.29v2.6.346Failed
arlanv2.6.33v2.6.353Failed
asus_oledv2.6.29v3.1223Failed
b3dfgv2.6.30v2.6.345Failed
bcmv2.6.37v3.1922Failed
btmtk_usbv3.11v3.144Failed
ccgv3.5v3.106Failed
ced1401v3.7v3.1711Failed
crystalhdv2.6.34v3.1723Failed
csrv3.6v3.116Failed
cxt1e1v2.6.35v3.1722Failed
dabusbv2.6.38v3.02Failed
dgapv3.12v4.615Failed
dgncv3.12v4.2029Failed
dgrpv3.7v3.1711Failed
dreamv2.6.32v2.6.376Failed
dstv2.6.30v2.6.334Failed
eplv2.6.29v2.6.324Failed
frontierv2.6.29v3.1728Failed
ft1000v2.6.37v4.427Failed
gdm72xxv3.5v4.622Failed
heciv2.6.30v2.6.323Failed
i2ov4.0v4.23Failed
i4lv4.6v4.116Failed
iio/gyrov2.6.35v4.1944Failed
iio/triggerv2.6.32v4.1745Failed
intel_sstv2.6.37v3.36Failed
keucrv2.6.37v3.1720Failed
lttngv2.6.33v2.6.331Failed
lustrev3.11v4.1828Failed
media/atomispv4.12v4.187Failed
memrarv2.6.35v3.05Failed
mt7621-mmcv4.17v5.27Failed
netv3.5v3.106Failed
netwavev2.6.33v2.6.353Failed
nokia_h4pv3.15v3.184Failed
ozwpanv3.4v4.320Failed
p9authv2.6.30v2.6.345Failed
phisonv2.6.30v3.1727Failed
pochv2.6.28v2.6.358Failed
pohmelfsv2.6.30v3.313Failed
quickstartv2.6.36v3.1721Failed
rspiusbv2.6.29v2.6.324Failed
sb105xv3.8v3.158Failed
sbe-2t3e3v2.6.37v3.1619Failed
sepv2.6.38v3.1719Failed
serqt_usb2v2.6.31v3.1726Failed
silicomv3.7v3.1711Failed
skeinv3.16v4.1924Failed
spectrav2.6.36v3.37Failed
stripv2.6.33v2.6.353Failed
sxgv2.6.28v2.6.325Failed
tidspbridgev2.6.36v3.1721Failed
wavelanv2.6.33v2.6.353Failed
westbridgev2.6.37v3.14Failed
winbondv2.6.28v3.1729Failed
wlags49_h2v2.6.33v3.1724Failed
wlags49_h25v2.6.33v3.1724Failed
xgifbv2.6.35v5.147Failed

这里有60个模块,占比24%。绝大多数最后一个commit都是说“很久没人继续开发这个模块了,该放弃了”。其中有的是支持了从未量产的硬件,或者是某些太古老没人用了的硬件导致没法继续开发。有些情况,例如LTTng tracing模块,这个代码基本上马上就被拿掉了,因为开发者不赞成放入staging tree。还有至少一例是因为license问题拿掉的。

无论如何,上述每个模块都代表了一段没能最终孵化出成果的工作。staging tree不可能把100%的模块都最终放入mainline,至于这24%的失败率算不算高,大家就见仁见智吧。

Staging out

2008年设立staging tree的时候,起始并没有想到它还会成为某些开发者希望拿掉的代码的最终栖息地。现在,如果看起来没人在用的驱动程序,就会被放到staging tree里,过几个版本之后,如果没有人抱怨,就会彻底删除。如下驱动都是这样离开kernel代码的:

ModuleEntryExitReleasesFate
autofsv2.6.37v3.03Staged out
cpiav2.6.37v2.6.382Staged out
generic_serialv3.0v3.12Staged out
ipxv4.16v4.183Staged out
irdav4.14v4.174Staged out
media/lircv2.6.36v4.1640Staged out
media/mx2v4.6v4.83Staged out
media/mx3v4.6v4.83Staged out
media/omap1v4.6v4.83Staged out
media/omap24xxv3.14v3.196Staged out
media/parportv3.19v4.02Staged out
media/sn9c102v3.14v3.174Staged out
media/soc_camerav5.1--3Staging out
media/timbv4.6v4.83Staged out
media/tlg2300v3.19v4.02Staged out
media/vinov3.19v4.02Staged out
media/zoranv4.18v5.26Staged out
ncpfsv4.16v4.183Staged out
rdma/amso1100v4.3v4.53Staged out
rdma/ehcav4.3v4.53Staged out
rdma/ipathv4.3v4.53Staged out
se401v2.6.38v3.02Staged out
serialv3.2v3.54Staged out
smbfsv2.6.37v3.03Staged out
stradisv2.6.37v2.6.382Staged out
telephonyv3.4v3.85Staged out
ttyv3.0v3.12Staged out

这27个模块,占比11%,都是来自kernel正式代码并最终惨遭删除的。删除不再需要的代码,肯定是件好事啊,所以这应该算是staging tree做的好事情。不过可惜只有很少数模块是这么stage out的。kernel里还有众多驱动其实也没有在用了,仍然保留在原位。

Hangers-on

最后一类,就是目前在5.3-rc7 kernel里面仍然保留在staging tree的模块了:






ModuleEntryExitReleasesFate
android/ionv3.14--31
android/uapiv3.14--31
axis-fifov4.19--6
bcm2835-audiov4.11--11(now in vc04_services)
boardv3.17--28
clocking-wizardv3.19--26
comediv2.6.29--55
emxx_udcv3.17--28
erofsv4.19--6
fbtftv4.0--25
fieldbusv5.2--2
fsl-dpaa2v4.12--13
fwserialv3.8--37
gasketv4.19--6
gdm724xv3.12--33
goldfishv3.9--36
greybusv4.9--16
gs_fpgabootv3.15--30
iiov2.6.32--52
iio/accelv2.6.32--52
iio/adcv2.6.32--52
iio/addacv2.6.38--46
iio/cdcv3.2--43
iio/frequencyv2.6.38--46
iio/impedance-analyzerv3.2--43
iio/meterv2.6.38--46
iio/resolverv2.6.38--46
isdnv5.3--1
kpc2000v5.2--2
ks7010v4.8--17
media/allegro-dvtv5.3--1
media/bcm2048v3.14--31
media/davinci_vpfev3.9--36
media/hantrov5.0--4
media/imxv4.13--12
media/imx074v4.17--8
media/ipu3v5.0--4
media/mesonv5.3--1
media/mt9t031v4.17--8
media/omap4issv3.14--31
media/platformv4.11--15(now in vc04_services)
media/sunxiv4.20--5
media/tegra-vdev4.16--9
mostv4.3--22
mt7621-dmav4.17--8
mt7621-dtsv4.17--8
mt7621-pciv4.17--8
mt7621-pci-phyv5.1--3
mt7621-pinctrlv4.17--8
netlogicv3.10--35
nvecv3.0--45
octeonv2.6.31--53
octeon-usbv3.11--34
olpc_dconv2.6.37--47
pi433v4.14--11
ralink-gdmav5.1--3
rtl8188euv3.12--33
rtl8192ev2.6.32--52
rtl8192uv2.6.33--51
rtl8712v2.6.37--47
rtl8723bsv4.12--13
rts5208v3.14--31
sm750fbv4.1--24
speakupv2.6.37--47
unisysv3.15--30
vc04_servicesv4.9--16
vmev2.6.32--52
vt6655v2.6.31--53
vt6656v2.6.32--52
wilc1000v4.2--23
wlan-ngv2.6.28--56

所以在总共247个进入staging的 模块中,有71个仍然存在,占比29%。其中呆了最长时间的是comedi子系统,自从2008年11月加入之后,关于staging tree的全部53512个commit中有8673个都是关于comedi的,占了driver/staging目录下改动commit的16%。还有其他一些模块也在staging tree存在了很长时间,不知道staging tree是不是有年数限制,反正看起来不像是有。

其中有一些应该已经快要毕业了。Kroah-Hartman指出comedi, greybus, speakup都只要再做一点工作就可以毕业了。Greybus驱动应该会合入5.4。其他不少代码其实应该需要删掉的,Greg也说他其实已经有几年没有去清理一遍了。也会有不少代码会继续存在不少时间。

Exit stage right

所以目前的结论是:

FateCountPercent
Graduated5221%
Superseded3715%
Failed6024%
Staged out2711%
Still present7129%

虽然没法回答起初的问题“staging tree是否对kernel开发有益处”,毕竟大家都理解通常一件事物都是对某些模块有好处却对其他模块没有好处。不过可以看出的是确实有不少代码都经过staging tree进入了正式kernel,整体上来说也帮助mainline kernel变得更加整洁。无论大家喜欢staging tree与否,它都是kernel开发流程中的一部分了。虽然随着大家对它的评价和压力变化,它的角色会不断改变,不过今后很长时间里面它应该都是kernel开发的一个重要部分。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议修改再创作~

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

640?wx_fmt=jpeg

内容概要:本文围绕“计及蓄意攻击的电网多阶段级联故障诱发机制与MILP优化模型”展开,提出了一种基于混合整数线性规划(MILP)的双层优化模型,用于模拟和分析在蓄意攻击下电力系统多阶段级联故障的传播机理与脆弱性特征。通过构建攻击者与系统运行之间的博弈框架,上层模型刻画攻击者以最小代价最大化系统损失的最优攻击策略,下层模型模拟电网在故障后的交流潮流重分布、负荷切除及系统恢复行为,从而实现对关键脆弱元件和攻击路径的精准识别。研究依托Matlab平台实现完整算法流程,并结合IEEE 39节点、33节点等标准系统进行仿真验证,有效评估了电网在恶意攻击场景下的安全性与韧性水平,为电力系统的防御加固、关键资产保护及应急预案制定提供了理论依据与技术支撑。; 适合人群:具备电力系统分析、运筹学优化理论基础及Matlab编程能力的研究生、高校科研人员以及从事电网安全评估、电力系统规划与防御策略研究的工程技术人员。; 使用场景及目标:①用于电力系统关键节点与线路的脆弱性评估,识别潜在攻击目标;②支撑电网主动防御体系设计,优化防护资源布局;③作为高水平学术研究参考资料,复现并拓展顶级EI期刊论文中的建模方法与仿真流程,进一步研究N-k故障、虚假数据注入攻击等延伸问题。; 阅读建议:建议结合提供的Matlab代码与网盘资料,逐步调试运行仿真案例,深入理解MILP建模技巧、双层优化求解机制及YALMIP工具包的应用,同时可尝试引入不确定性因素或动态恢复策略以提升模型的实用性与前沿性。
源码链接: https://pan.quark.cn/s/a4b39357ea24 ### 从网络页面中获取视频文件链接 #### 一、前言 随着互联网技术的不断进步,越来越多的用户倾向于在网络上进行视频内容的观看。然而,对于部分用户而言,将视频资源保存至本地以便离线观看的需求日益凸显。本文将系统阐述通过特定平台和技术手段完成网页视频资源的在线获取及下载过程。 #### 二、获取网页视频资源链接的途径 ##### 2.1 借助专业平台提取视频资源链接 一种便捷的操作方式是利用专门的在线平台来获取网页中的视频资源链接。例如,可以借助`http://www.flvcd.com`这类平台来高效提取视频资源地址。具体操作流程如下: 1. **复制网页标识符**:定位至期望下载的视频页面,复制该页面的网络地址。 2. **进入提取平台**:在浏览器中访问`http://www.flvcd.com`网站。 3. **粘贴并分析**:将复制的网络地址粘贴到网站提供的视频解析框内,点击“开始GO”按钮。该平台会针对输入的链接进行解析,并尝试提取视频文件的实际下载路径。 4. **获取下载路径**:解析完成后,系统会展示一个或多个可用的下载链接,用户可通过这些链接利用下载工具(如迅雷)将视频文件保存至本地。 此类在线提取方法的最大优势在于无需安装任何客户端软件或插件,操作流程简明扼要,特别适合应急使用或无法安装软件的场景。 ##### 2.2 使用专用软件提取并保存视频资源 对于经常需要下载视频的用户群体,采用专业软件可能是更为高效的选择。其中,“硕鼠”是一款备受推崇的视频获取工具。具体操作步骤如下: 1. **获取并部署软件**:前往官方网站`http://download...
内容概要:本文围绕《【EI复现】梯级水光互补系统最大化可消纳电量期望短期优化调度模型(Matlab代码实现)》这一技术资源展开,详细介绍了一个针对水电与光伏发电协同运行的短期优化调度模型。该模型以提升可再生能源的可消纳电量期望为核心目标,重点应对光伏出力不确定性带来的调度挑战。研究采用Matlab作为实现平台,通过构建数学优化模型(如MILP),结合场景生成与缩减技术(如拉丁超立方抽样)处理光伏出力的随机性,实现了对梯级水电站与光伏电站的联合优化调度。模型综合考虑了水资源约束、电力系统潮流、设备运行特性等多种因素,旨在通过科学的调度决策,提高清洁能源的整体利用率和系统运行的经济性与稳定性。; 适合人群:具备一定电力系统、可再生能源或优化理论背景,从事相关科研工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①复现高水平期刊(EI)论文中的优化调度模型;②研究梯级水电与光伏发电的协同调度策略;③掌握基于Matlab的能源系统优化建模与求解方法;④提升在新能源消纳、电力系统调度等领域的科研与实践能力。; 阅读建议:建议读者结合提供的Matlab代码,深入理解模型的数学推导与算法实现细节,重点关注目标函数构建、约束条件设定及不确定性处理方法,并尝试在不同场景下进行仿真验证与结果分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值