Proces szeregowania żądań do urządzeń blokowych


Funkcja blk_init_queue ustala wartość domyślną dla pola make_request_fn na __make_request.
Funkcja __make_request:
Parametry wejściowe: kolejka żądań, czytanie czy pisanie, bufor

początek funkcji

	jeśli kolejka żądań jest pusta to 
		ją zakorkuj
	jeśłi nie to
		użyj windy zdefiniowanej w tej kolejce (pole elevator w request_struct)
		jesli możesz dołączyć to żądanie do już istniejącego to 
			zrób to i zakończ
		koniec jeśli
	koniec jeśli
	sprubuj pobrać wolny obiekt request
	jeśli nie ma to 
		odkorkuj kolejkę i czekaj aż będą wolne struktury request
	koniec jeśli
	wstaw nowe żądanie do kolejki, jeśli używałeś windy to w miejscu podanym przez windę

koniec funkcji
Jeśli kolejka żądań jest zakorkowana, wówczas przyjmuje ona nowe żądania ale ich nie wykonuje. Właściwe obsłużenie żądania wejścia-wyjścia dokonuje się podczas odkorkowania kolejki - funkcją generic_unplug_device. W funkcji tej wywoływana jest funkcja request_fn odpowiedzialna za obsługę żądań w tej kolejce. Koleja jest odkorkowywana w dwóch miejscach omawianego tu procesu. W funkcji ll_rw_block jeśli brakuje buforów, oraz w funkcji __make_request jeśli brakuje obiektów request.
W strukturze request_queue jest zdefiniowana kolejka zadań plug_tq. Jej domyślną funkcją realizacji (ustawianą w funkcji blk_init_queue) jest funkcja generic_unplug_device. Oznacza to że jeśli wywołamy funkcje run_task_queue na kolejce zadań plug_tq to uruchomimy funkcję generic_unplug_device a tym samym funkcję request_fn realizującą żądania.

Wstecz Tomasz Wadowski