2016-04-15 11 views
6

Piszę sterownik urządzenia bloku linuksowego, który odbiera żądania za pośrednictwem funkcji zarejestrowanej pod numerem blk_init_queue().Żądanie zamawiania żądań sterowników urządzeń linuksowych - RaW?

Moje urządzenie sprzętowe zmienia kolejność żądań i jako takie, aby uniknąć konfliktów odczytu i zapisu, należy poczekać na zakończenie write(lba x) przed wydaniem read(lba x).

Moje pytanie: Czy warstwa blok Linux śledzić surowy konfliktów i będzie nie problem read(lba x) dopóki nie otrzymał zakończenie żądania (przez __blk_end_request_all(req r)) przez poprzedniego write(lba x), czy też muszę to zrobić w moim kierowca?

Odpowiedz

0

Zgodnie z poniższym artykułem sterowniki urządzeń blokowych systemu Linux mogą teraz dowolnie zamawiać żądania, warstwa systemu plików jest odpowiedzialna za unikanie zagrożeń i wdrażanie barier. https://lwn.net/Articles/400541/

Jedynym wyjątkiem są żądania REQ_FLUSH i REQ_FUA dla urządzeń, które implementują pamięci podręczne zapisu zwrotnego. W przypadku, gdy te flagi są ustawione, pewne wymagania dotyczące zamawiania muszą być egzekwowane przez sterownik urządzenia blk. https://www.kernel.org/doc/Documentation/block/writeback_cache_control.txt

W szczególności następujące wymagania zamawiania istnieje:

  • Brak zapisu danych, REQ_FLUSH - nie ma żadnych ograniczeń zamawiania inną niż naturalna wymogu flush (poprzednio ukończonych pisze powinny być na nośnik po zakończeniu FLUSH).

  • Zapis danych, REQ_FLUSH - POWTÓRKA musi zostać zakończona przed wydaniem danych zapisu . to znaczy. dane zapisu nie mogą być zapisywane na nośniku, zanim poprzednie zapisy są na nośniku.

  • Zapis danych, REQ_FUA - Zapis powinien zostać zakończony przed wydaniem FLUSH - tj. dane zapisu powinny znajdować się na talerzu wraz z wcześniejszymi zakończonych zapisów o zakończeniu biologicznym.

  • Zapis danych, REQ_FLUSH | REQ_FUA - Dane zapisu nie mogą być zapisywane na nośniku, zanim wszystkie poprzednie zapisy będą na nośniku & & dane muszą być zapisane na nośniku przy zakończeniu biologicznym. Zazwyczaj jest to zsekwencjonowany jako FLUSH write FLUSH.

[z dyskusyjnej Linux-fsdevel: http://www.spinics.net/lists/linux-fsdevel/msg45616.html]

Powiązane problemy