• Paolo Valente's avatar
    null_blk: set a separate timer for each command · 3c395a96
    Paolo Valente authored
    For the Timer IRQ mode (i.e., when command completions are delayed),
    there is one timer for each CPU. Each of these timers
    . has a completion queue associated with it, containing all the
      command completions to be executed when the timer fires;
    . is set, and a new completion-to-execute is inserted into its
      completion queue, every time the dispatch code for a new command
      happens to be executed on the CPU related to the timer.
    
    This implies that, if the dispatch of a new command happens to be
    executed on a CPU whose timer has already been set, but has not yet
    fired, then the timer is set again, to the completion time of the
    newly arrived command. When the timer eventually fires, all its queued
    completions are executed.
    
    This way of handling delayed command completions entails the following
    problem: if more than one command completion is inserted into the
    queue of a timer before the timer fires, then the expiration time for
    the timer is moved forward every time each of these completions is
    enqueued. As a consequence, only the last completion enqueued enjoys a
    correct execution time, while all previous completions are unjustly
    delayed until the last completion is executed (and at that time they
    are executed all together).
    
    Specifically, if all the above completions are enqueued almost at the
    same time, then the problem is negligible. On the opposite end, if
    every completion is enqueued a while after the previous completion was
    enqueued (in the extreme case, it is enqueued only right before the
    timer would have expired), then every enqueued completion, except for
    the last one, experiences an inflated delay, proportional to the number
    of completions enqueued after it. In the end, commands, and thus I/O
    requests, may be completed at an arbitrarily lower rate than the
    desired one.
    
    This commit addresses this issue by replacing per-CPU timers with
    per-command timers, i.e., by associating an individual timer with each
    command.
    Signed-off-by: default avatarPaolo Valente <paolo.valente@unimore.it>
    Signed-off-by: default avatarArianna Avanzini <avanzini@google.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    3c395a96
null_blk.c 18.1 KB