LWN: 内核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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值