Segitseget kernek egy ARM eszkoz soft lockup debugolasaban. A felallas a kovetkezo:
adott egy Cubox I4pro (ez egy Freescale i.MX6 alapu eszkoz), ami HDMI-n keresztul kapcsolodik egy Sony TV-hez. Ha a TV ki van kapcsolva, az eszkoz bebootol hiba nelkul. Ha be van kapcsolva, altalaban akkor is hiba nelkul elindul, de ha a bemenetet rakapcsolom arra a HDMI bemenetre, ahova az eszkoz van kotve, akkor a kworker process megfogja az egesz rendszert (bootolaskor es a mar mukodo rendszert is). Hibauzenet: http://pastebin.com/0asdeYHx
Miutan bekapcsoltam nehany debug opciot a kernelben, a hibauzenet kicsit reszletesebb lett: http://pastebin.com/P8EDZwGt
A reszletesebb hibauzenetbol latszodik, hogy a hdmi_edid_i2c_read fuggveny fogja meg a dolgot, de sajnos nem tudom, hogy innen hogyan lehetne tovabbmenni a megoldas fele. Amit eddig probaltam:
-ujraforditani a kernelt EDID tamogatas nelkul - 2 ilyen opcio van, az egyiket kiveve nincs valtozas, a masikat kiveve nem fordul le
-i2cdetect-tel megnezni, mi a helyzet - a monitornak elvileg az 1-es busz 0x50-es cimen kellene lennie, nekem csak 2-es busz van, ahol 0x68-on van valami unreadable
-probaltam kulonbozo kerneleket (3.0.x-es kernellel nem jelentkezik a hiba, 3.10-essel igen, 3.16-osnal nem mukodik a framebuffer, szoval ott nem tudtam kiprobalni, mert nincs meg hozza mukodo patch)
Ha valaki tudna segiteni kworker debug-ban vagy a hibauzenet ertelmezeseben, sort is hajlando vagyok kilatasba helyezni.
UDPATE: A 3.14-es kernel megoldotta. Valahol utkozben frissitettek a Freescale drivert, minden frankon mukodik ezzel a kernellel.
Hozzászólások
Konkrét választ nem tudok, de ezt a kernelt érdemes használni, jópár hdmi patch van benne:
https://github.com/wolfgar/linux
Ha pedig végképp nem boldogulsz, konkrétan őt kéne megkeresned szerintem: http://stephan-rafin.net/blog/ (ő wolfgar githubon)
Koszi a tippet, forgatok egyet a wolfgar-fele kernelbol, hatha azzal eszhez ter, de szerintem a hiba az en keszulekemben van es tovabbi debugra lesz szukseg a pontositasahoz.
Nincs esetleg arra otleted, hogy magat a kworker processzt hogy lehetne normalisan debugolni? A neten csak egy parsoros leirast lehet talalni Tejun Heo-tol, amit probaltam, de sajnos nem adott reszletesebb infot (lehet az architektura miatt, de ott is csak a hotplug workert irta, mint mumust, azt nem, hogy a hotplug worker epp mivel foglalkozik).
Ezen mit kell debuggolni? A fent említett függvényben van egy végtelen ciklus, ami vár valamire, ami sosem történik meg (gondolom beragadt az i2c busz, és a tranzakció végére várna szegény). Kéne legyen benne egy timeout, ami idővel megunja a várakozást, és elreseteli a busz résztvevőit, meg visszatér valami hibakóddal. Ez vagy teljesen hiányzik, vagy valamiért nem működik.
Ha nem valami random alternatív kernelben lenne ez a kód, valószínűleg már mások is rég megtalálták volna, és kijavították volna.
Azt kellene debugolni, hogy pontosan mi hivja meg ezt a fuggvenyt es mikor. Elvileg a kod kepes lekezelni azt, ha nem tudja kiolvasni az EDID-t (mert nem minden monitor tamogatja ezt a funkciot), de valamiert ez megakasztja a rendszert majdnem 3 percre + veletlenszeruen kiakasztja a HDMI hangkimenetet is (neha megy, neha nem). Sajnos nekem ez a dolog elegge kodos, mert nem foglalkoztam meg ilyesmivel korabban, raadasul hiaba keresgeltem a neten napok ota, hogy a kworker altal inditott folyamatokat hogyan lehet reszleteiben megvizsgalni, nem talaltam semmi hasznalhatot.
Es ahogy irod, ez egy random alternativ kernelben van, es feltehetoleg csak Sony TV-kkel tortenik (egy masik srac is panaszkodott hasonlo hibakrol), ezert batorkodtam nekiveselkedni tapasztalatok hijan is.
Hát ha megvan a forrás, akkor nem kell futtatni, hogy meg lehessen találni, honnan hívják meg, elég egy jólirányzott grep. Ha nem egyértelmű, hogy milyen esemény hatására fut a kód, lehet bele printeket rakni, és nézni a logot. Kernelt leginkább így lehet debuggolni.
Koszi, ilyenkor a printk hova ir? A logba vagy a konzolba? Maga a fuggveny egyebkent itt van: https://github.com/SolidRun/linux-linaro-stable-mx6/blob/linux-linaro-l… es szerintem a hdmi_edid_wait_i2c_done funkcional all be, ami egyebkent folotte van, de amennyire megertettem, ez osszesen csak 1 masodpercet var (1000 msec-et), es nem tudom mi tortenik a maradek 140 masodpercben.
A helyzetet tovabb bonyolitja, hogy a kworker-en belul a hotplug hivja meg ezt valahogy, de hogy pontosan mit es hogyan, arra meg nem jottem ra, hiaba probalkoztam kulonbozo debug parameterekkel.
Természetesen a logba ír, ami a syslog beállításaitól függően különböző helyekre kerülhet (ha nem fut a syslog, akkor pl. a konzolra).
Ránézésre nekem két dolog tűnik fel elsőre: a wait függvény eredményét senki nem nézi (ez biztosan bug, hiszen ha timeout van, akkor nincs mit kiolvasni a read regiszterből), továbbá hogy az usleep-et használja a várakozásra, amiről a franc tudja, hogy jó-e.
Egyébként az sem lehetetlen, hogy minden jól működik, csak mondjuk pár száz darab regisztert akar kiolvasni a program, és mivel nincs visszajelzés, hogy nem jött össze, így mindegyikre jut egy 1 másodperces timeout. Ami így szumma több száz másodperc.
Koszi, ezt akarja kiolvasni egyebkent: http://pastebin.com/PBpaPswB ez osszesen 128 byte, ugyhogy majdnem meg is van a 142 masodperc. Nekialltam forditani egy uj Geexboxot, ha kesz, forditok hozza egy debug kernelt es jelentkezek, ha sikerult ujabb infokat kinyerni.
Én sajnos nem értek a kernelhez, de wolfgar nagyon segítőkész, egy hdmi-cec bugot, ami az ő tévéjén valahogy nem jött elő, egy hét alatt megoldott úgy hogy én teszteltem neki. Csak azért tartott egy hétig, mert ő éjfél fele állt neki dolgozni rajta, szóval ritkán tudtam azonnal válaszolni.
Hm, úgy tűnik mióta én foglalkoztam ezzel (kb május), egy másik ismert imx fejlesztő kernelére váltott az archlinux-arm, ezek szerint én is ezt használom már:
https://github.com/warped-rudi/linux-linaro-stable-mx6
Koszi, most neztem az o kernelevel, de sajnos a hiba meg mindig fennall... :(
Szerintem külön-külön jelentsd be a problémákat a kernel fejlesztőknek.
--
Koszi, de nem fogjak tudni reprodukalni a problemat a megfelelo hardver nelkul, illetve a fent csatolt dumpokon kivul mast nem tudok adni hozza, ez pedig szerintem keves a megoldashoz.