• Martijn Coenen's avatar
    loop: Add LOOP_CONFIGURE ioctl · 3448914e
    Martijn Coenen authored
    This allows userspace to completely setup a loop device with a single
    ioctl, removing the in-between state where the device can be partially
    configured - eg the loop device has a backing file associated with it,
    but is reading from the wrong offset.
    
    Besides removing the intermediate state, another big benefit of this
    ioctl is that LOOP_SET_STATUS can be slow; the main reason for this
    slowness is that LOOP_SET_STATUS(64) calls blk_mq_freeze_queue() to
    freeze the associated queue; this requires waiting for RCU
    synchronization, which I've measured can take about 15-20ms on this
    device on average.
    
    In addition to doing what LOOP_SET_STATUS can do, LOOP_CONFIGURE can
    also be used to:
    - Set the correct block size immediately by setting
      loop_config.block_size (avoids LOOP_SET_BLOCK_SIZE)
    - Explicitly request direct I/O mode by setting LO_FLAGS_DIRECT_IO
      in loop_config.info.lo_flags (avoids LOOP_SET_DIRECT_IO)
    - Explicitly request read-only mode by setting LO_FLAGS_READ_ONLY
      in loop_config.info.lo_flags
    
    Here's setting up ~70 regular loop devices with an offset on an x86
    Android device, using LOOP_SET_FD and LOOP_SET_STATUS:
    
    vsoc_x86:/system/apex # time for i in `seq 30 100`;
    do losetup -r -o 4096 /dev/block/loop$i com.android.adbd.apex; done
        0m03.40s real     0m00.02s user     0m00.03s system
    
    Here's configuring ~70 devices in the same way, but using a modified
    losetup that uses the new LOOP_CONFIGURE ioctl:
    
    vsoc_x86:/system/apex # time for i in `seq 30 100`;
    do losetup -r -o 4096 /dev/block/loop$i com.android.adbd.apex; done
        0m01.94s real     0m00.01s user     0m00.01s system
    Signed-off-by: default avatarMartijn Coenen <maco@android.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    3448914e
loop.c 59.2 KB