• Christian Loehle's avatar
    dm delay: for short delays, use kthread instead of timers and wq · 70bbeb29
    Christian Loehle authored
    DM delay's current design of using timers and wq to realize the delays
    is insufficient for delays below ~50ms.
    
    This commit enhances the design to use a kthread to flush the expired
    delays, trading some CPU time (in some cases) for better delay
    accuracy and delays closer to what the user requested for smaller
    delays. The new design is chosen as long as all the delays are below
    50ms.
    
    Since bios can't be completed in interrupt context using a kthread
    is probably the most reasonable way to approach this.
    
    Testing with
    echo "0 2097152 zero" | dmsetup create dm-zeros
    for i in $(seq 0 20);
    do
      echo "0 2097152 delay /dev/mapper/dm-zeros 0 $i" | dmsetup create dm-delay-${i}ms;
    done
    
    Some performance numbers for comparison, on beaglebone black (single
    core) CONFIG_HZ_1000=y:
    
    fio --name=1msread --rw=randread --bs=4k --runtime=60 --time_based \
        --filename=/dev/mapper/dm-delay-1ms
    Theoretical maximum: 1000 IOPS
    Previous: 250 IOPS
    Kthread: 500 IOPS
    
    fio --name=10msread --rw=randread --bs=4k --runtime=60 --time_based \
        --filename=/dev/mapper/dm-delay-10ms
    Theoretical maximum: 100 IOPS
    Previous: 45 IOPS
    Kthread: 50 IOPS
    
    fio --name=1mswrite --rw=randwrite --direct=1 --bs=4k --runtime=60 \
        --time_based --filename=/dev/mapper/dm-delay-1ms
    Theoretical maximum: 1000 IOPS
    Previous: 498 IOPS
    Kthread: 1000 IOPS
    
    fio --name=10mswrite --rw=randwrite --direct=1 --bs=4k --runtime=60 \
        --time_based --filename=/dev/mapper/dm-delay-10ms
    Theoretical maximum: 100 IOPS
    Previous: 90 IOPS
    Kthread: 100 IOPS
    
    (This one is just to prove the new design isn't impacting throughput,
    not really about delays):
    fio --name=10mswriteasync --rw=randwrite --direct=1 --bs=4k \
        --runtime=60 --time_based --filename=/dev/mapper/dm-delay-10ms \
        --numjobs=32 --iodepth=64 --ioengine=libaio --group_reporting
    Previous: 13.3k IOPS
    Kthread: 13.3k IOPS
    Signed-off-by: default avatarChristian Loehle <christian.loehle@arm.com>
    [Harshit: kthread_create error handling fix in delay_ctr]
    Signed-off-by: default avatarHarshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
    70bbeb29
dm-delay.c 9.85 KB