Как объединить несколько структурных BIO в один структурный запрос? - PullRequest
5 голосов
/ 12 июля 2011

Я работаю над ядром Linux версии 2.6.39.1 и разрабатываю драйвер блочного устройства.В связи с этим я хочу объединить несколько struct bio с в один struct request, который затем добавляется к request_queue для обработки драйвером устройства, а именно - scsi_request_fn().

Iпопытался использовать ->bi_next поле struct bio для связывания нескольких struct bio с, которые я создал, создав тем самым связанный список struct bio с.Когда я звоню submit_bio(), чтобы отправить биографию на уровень блочных устройств для ввода / вывода, это BUG_ON() запускается, потому что код ожидает, что bio->bi_next будет NULL.

Есть ли способ связать несколько struct bio с одним struct request перед отправкой на более низкие уровни для обслуживания?

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Спасибо за ответ, @ctuffli.Я решил использовать структуру, аналогичную описанной здесь .По сути, я выделяю struct packet_data, который будет содержать указатели для всех struct bio с, которые должны быть объединены в один struct bio (и позже один struct request).Кроме того, я храню некоторую информацию, относящуюся к драйверу, в этом struct packet_data.Затем я выделяю новый struct bio (назовем его «merged_bio»), копирую все страницы из списка оригинальных BIO и затем указываю merged_bio->bi_private на struct packet_data.Этот последний взлом позволил бы мне отслеживать список исходных BIO, а также вызывать bio_endio(), чтобы завершить ввод-вывод для всех отдельных BIO после успешной передачи merged_bio.

Не уверен, еслиэто самый умный способ сделать это, но он делает то, что я хотел!: ^)

1 голос
/ 13 июля 2011

Я не уверен, как связать несколько struct bio вместе, но вы можете взглянуть на реализацию "сборщика задач" в libsas и aic94xx драйвердля альтернативного подхода.Документации не так много, но документация libsas описывает ее как

Некоторое оборудование (например, aic94xx) способно DMA одновременно выполнять более одной задачи (прерывание)из памяти хоста.Task Collector Mode - это дополнительная функция для HA, которые поддерживают это на своем оборудовании.(Опять же, это совершенно необязательно, даже если ваше оборудование поддерживает его.)

В режиме сборщика задач уровень SAS будет выполнять естественное объединение задач и в соответствующий момент вызовет вашДрайвер для DMA более одной задачи в одном прерывании HA.DMBS может захотеть использовать это, установив в insmod / modprobe значение lldd_max_execute_num, значение которого больше 1.

Фактически, это позволяет блочному слою (он же BIO) оставаться неизменным, но в драйвере накапливается несколько запросов.слой и представлены вместе.

...