Portál AbcLinuxu, 8. května 2025 03:03
rotation_thread = kthread_create(rotation_thread_function, cam, "rotation thread"); cam->sensor->private_data = (void *)rotation_thread; wake_up_process(rotation_thread);samotná vláknová funkce:
int rotation_thread_function(void *data){ struct m5602_camera *cam = (struct m5602_camera *)data; // deklarace pár struktur a lokálních proměnných set_current_state(TASK_INTERRUPTIBLE); while(!schedule_timeout(500)){ // vemu si mutex pro přístup k zařízení if (mutex_lock_interruptible(&cam->fileop_mutex)) continue; // tady se vykonává práce s hardwarem // uvolním mutex zařízení mutex_unlock(&cam->fileop_mutex); set_current_state(TASK_INTERRUPTIBLE); } info("End of rotation thread!"); return 0; }když má být vlákno ukončeno (při unloadu modulu):
if (cam->sensor->private_data){ kthread_stop((struct task_struct *)cam->sensor->private_data); }Pokud to mám takto, vlákno běží krásně a v pravidelných intervalech se probouzí. Problém nastane, když chci modul unloadnout, například při hibernaci... Čas od času mi tento kód způsobí oops, který sebou s velkým rachotem veme usbcore a další moduly, takže jádro je nutné rebootnout :( Netuším kde přesně mám chybu. Odhaduji že asi ve špatném použití schdule_timeoout...? Nebo tam někdo vidíte kritickou část, kterou mám ošetřenu špatně? S vlákny v uživatelském prostoru nemám problém, ale v jádře něco takového píšu prvně... Navíc se to mnohem hůř ladí, než v user módu... Za jakékoliv nápady předem děkuji.
... stop = 0; while((!schedule_timeout(100)) || stop ){ if (mutex_lock_interruptible(&sd->gspca_dev.usb_lock)){ stop = 1; continue; } ...Ještě pár dní budu svoji kameru tímto modulem trápit a pokud to ani jednou nespadne, půjde patch do světa... Každopádně děkuji Lukynovi za čas :)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.