Portál AbcLinuxu, 8. května 2025 03:03

Dotaz: kthread: jak správně ukončit vlákno?

Karry avatar 31.12.2008 11:51 Karry | skóre: 10
kthread: jak správně ukončit vlákno?
Přečteno: 324×
Odpovědět | Admin
Zdravím.

Potřeboval bych v jaderném driveru nějakým způsobem implementovat vlákno, které by se po určitých časových intervalech probouzelo, dotázalo se hardwaru na jeho stav a podle výsledku vykonalo specifický kód.

Zatím jsem to napsal zhruba takto:

vytvoření vlákna a jeho spuštění:
    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.
unzip; strip; touch; grep; finger; mount; fsck; more; yes; umount; sleep
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

1.1.2009 09:42 luky
Rozbalit Rozbalit vše Re: kthread: jak správně ukončit vlákno?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Chybí mi tam kthread_should_stop() a myslím, že nenulová návratovka schedule_timeout() není důvod k ukončení toho cyklu.

Při ručním unloadu jen toho jednoho modulu to klekne taky? Z Oopsu není vidět, kde to padne?
Karry avatar 3.1.2009 01:42 Karry | skóre: 10
Rozbalit Rozbalit vše Re: kthread: jak správně ukončit vlákno?
Tak jsem si s tím dneska trochu pohrál a vypadá to už to nepadá. Prakticky jsem jenom při neúspěchu získání zámku k zařízení ukončil celé vlákno...
	...
	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 :)
unzip; strip; touch; grep; finger; mount; fsck; more; yes; umount; sleep
David Watzke avatar 3.1.2009 12:45 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: kthread: jak správně ukončit vlákno?
Uff... nebylo by lepší dát do těla toho ifu spíš break a neřešit tu zbytečnou proměnnou stop?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Karry avatar 3.1.2009 14:52 Karry | skóre: 10
Rozbalit Rozbalit vše Re: kthread: jak správně ukončit vlákno?
Jak říkáš :) Takhle to dopadá když programuju ve dvě ráno...
unzip; strip; touch; grep; finger; mount; fsck; more; yes; umount; sleep

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.