Задержка с использованием struct bio

Я хочу нарисовать информацию о задержке для каждой структуры био, которая проходит через слой блока. У меня есть модуль, который переопределяет make_request_fn. Я хотел бы узнать, сколько времени понадобилось этой био, чтобы добраться до очереди запросов и оттуда до водителя и так далее.

Я пытался прикрепить пользовательскую структуру к биографии, которую я получаю в make_request_fn, но так как я не создавал ее, я не могу использовать поле bi_private. Есть ли способ обойти это?

Один из вариантов, который у меня есть, - это создать структуру биооболочки и скопировать в нее биоструктуры, прежде чем передать ее нижним функциям, чтобы я мог использовать container_of для записи времени.

Я читал об инструментах, таких как blktrace и btt, но мне нужна эта информация внутри моего модуля. Есть ли способ добиться этого?

Спасибо.

1 ответ

Решение

Решение, которое я использовал, выглядело как обычный обходной путь, когда я обнаружил нечто подобное в источнике драйвера блока drbd. Поле bi_private может использоваться только той функцией, которая его выделяет. Поэтому я использовал bio_clone следующим образом

bio_copy = bio_clone(bio_source, GFP_NOIO);
struct something *instance = kmalloc(sizeof(struct something), GFP_KERNEL);
instance->bio_original = bio_source;
//update timestamps for latency inside this struct instance
bio_copy->bi_private = instance;
bio_copy->bi_end_io = my_end_io_function;
bio_copy->bi_dev = bio_source->bi_dev;

...
...
make_request_fn(queue, bio_copy);

Вам нужно написать функцию bi_end_io. Не забудьте вызвать bio_endio для оригинальной био внутри этой функции. Возможно, вам придется скопировать поле bi_error в bi_error bio_source перед вызовом bio_endio(bio_source).

Надеюсь, это кому-нибудь поможет.

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