LINUX.ORG.RU

udelay in concurrency context


0

1

Всем привет,

у меня вопрос: может ли несколько функций udelay выполняться паралельно? От чего зависить количество возможных таких «паралельных» задержек?

Я пишу block-driver-симулятор реального устройства. Он должен поддерживать паралельные операции (К примеру если устройство состоит из двух частей, то IO запросы к этим двум частям могут выполняться паралельно). Нужного паралеллизма я собераюсь достичь за счёт использования НЕСКОЛЬКИХ локов (один лок - для одной части устройства). Вот пример моего псевдокода:

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 не накладывает никаких ограничений

    getnstimeofday(start);

    Тип start?

    spinlock_t lock = <<выбираю из списка локов, основываясь 

на bio>>;

    Нужен указатель

    spin_lock(lock);

    Где irqsave? Код может вытесниться, и если
    в обработчике прерывания захватывается эта же
    блокировка, то все встанет раком
    
    //simulate IO ....   

    Надеюсь, оно не переходит в состояние ожидания

    getnstimeofday(end);
    udelay(needed - (end - start));

    Плохо устраивать задержки под спин-блокировкой.
    Реализация udelay может основываться на jiffies,
    которые не будут тикать при закрытых внешних
    прерываниях (Нужен irqsave - см.выше
    
    spin_unlock(lock);

И да - слово «параллельный» пишется с тремя буквами «л».

ttnl ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.