SOURCES: xorg-driver-video-fglrx-2.6.20-init_work_macro.patch

Marek Guevara Braun marek.guevara w atm.com.pl
Śro, 7 Mar 2007, 16:33:13 CET


Paweł Sikora wrote:
>> Author: vip                          Date: Fri Feb 23 12:07:33 2007 GMT
>> ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
>> ++    INIT_WORK(&(thread_obj->work), routine);
>> ++#else
>> +     INIT_WORK(&(thread_obj->work), routine, pcontext);
[...]
> 
> mistrzu, work->data dla >= 2.6.20 tez trzeba ustawic.
> inaczej moze sie taka zabawa brzydko skonczyc ;-)

Ja tu jeszcze widzę inny problem - dla nowego INIT_WORK (2.6.20) drugi
argument - routine powinien być wskaźnikiem funkcji, której jedynym
argumentem jest wskaźnik do struct work_struct. Dla starego INIT_WORK (<
2.6.20), routine również jest wskaźnikiem do funkcji, ale jej argumentem
jest jakaśtam inna struktura danych (która nawiasem mówiąc posiada pole
wskaźnika do struct work_struct).

W obydwu przypadkach wskaźnik do tej funkcji ląduje jako pole func
zmiennej/struktury wskazywanej przez pierwszy argument INIT_WORK.

Dalej w toku zmagań na wysokości pliku kernel/workqueue.c w funkcji
__run_work (2.6.20) lub run_workqueue (<2.6.20) wywoływana jest ta
funkcja z argumentem work (2.6.20) lub data (w naszym wypadku pcontext)
(dla < 2.6.20)

Co ciekawsze funkcja przekazywana jako routine jest (z mojego pobieżnego
przejrzenia kodu) definiowana w ramach dostarczanego binarnego bloba (a
przynajmniej samo przekazywanie wskaźnika do tej funkcji jest tylko w
blobie) - tu zakładam że zaimplementowana jest w "starej" formie tj.
argumentem jej jest wskaźnik do czegoś innego niż struct work_struct.

No i dochodzimy do sedna - w 2.6.20 po wywołaniu __run_work wywoływana
jest funkcja "routine" z nieoczekiwanym argumentem -> BUM ?

To tyle dywagacji, ale może funkcja przekazywana jako wskaźnik routine
jest gdzieś zdefiniowana w postaci źródłowej i można ją przedefiniować ?

Pozdrawiam,
Marek


Więcej informacji o liście dyskusyjnej pld-devel-pl