Как объединить несколько структурных BIO в один структурный запрос?

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

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

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

2 ответа

Решение

Спасибо за ответ, @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_endio() завершить ввод / вывод на всех отдельных BIO, как только merged_bio был успешно передан.

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

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

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

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

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

Другие вопросы по тегам