Всем привет,
я хочу написать небольшой драйвер, похожий на brd, RapidDisk or sbull (LDD3). Он должен будет симулировать поведение реального устройства. Так к примеру, мне нужно как можно точнее симулировать задержки при IO операциях (20 микросекунд). Я использую для этого функцию udelay, так-как usleep_range слишком уж неточная. Симулироемое устройство поддерживает паралельную обработку операций (так если устройство состоит из двух логических блоков, то паралельно могут обрабатываться две операции). Queue & schedulers не используються - вместо этого напрямую используеться make_request.
И вот какой у меня вопрос:
udelay по документации - "busy waiting" и поэтому может быть использован в atomic context. А совместим ли udelay с параллелизмом?
Вот к примеру мой псевдокод:
void make_request(struct request_queue *q, struct bio *bio)
{
getnstimeofday(start);
spinlock_t lock = <<найти лок, который относиться к нужному блоку, основываясь на bio>>;
spin_lock(lock);
//simulate IO ....
getnstimeofday(end);
udelay(needed - (end - start));
spin_unlock(lock);
}
Я собераюсь вместо одного лока использывать несколько – каждый для отдельного блока устройства, чтобы добиться параллелизма. Без udelay, как мне кажеться, всё будет ок. Но вот может ли две, три или больше функций udelay выполняться паралельно? От чего зависить количество таких паралельных задержек?
Заранее большое спасибо!