• Coly Li's avatar
    bcache: asynchronous devices registration · 9e23ccf8
    Coly Li authored
    When there is a lot of data cached on cache device, the bcach internal
    btree can take a very long to validate during the backing device and
    cache device registration. In my test, it may takes 55+ minutes to check
    all the internal btree nodes.
    
    The problem is that the registration is invoked by udev rules and the
    udevd has 180 seconds timeout by default. If the btree node checking
    time is longer than udevd timeout, the registering  process will be
    killed by udevd with SIGKILL. If the registering process has pending
    sigal, creating kthread for bcache will fail and the device registration
    will fail. The result is, for bcache device which cached a lot of data
    on cache device, the bcache device node like /dev/bcache<N> won't create
    always due to the very long btree checking time.
    
    A solution to avoid the udevd 180 seconds timeout is to register devices
    in an asynchronous way. Which is, after writing cache or backing device
    path into /sys/fs/bcache/register_async, the kernel code will create a
    kworker and move all the btree node checking (for cache device) or dirty
    data counting (for cached device) in the kwork context. Then the kworder
    is scheduled on system_wq and the registration code just returned to
    user space udev rule task. By this asynchronous way, the udev task for
    bcache rule will complete in seconds, no matter how long time spent in
    the kworker context, it won't be killed by udevd for a timeout.
    
    After all the checking and counting are done asynchronously in the
    kworker, the bcache device will eventually be created successfully.
    
    This patch does the above chagne and add a register sysfs file
    /sys/fs/bcache/register_async. Writing the registering device path into
    this sysfs file will do the asynchronous registration.
    
    The register_async interface is for very rare condition and won't be
    used for common users. In future I plan to make the asynchronous
    registration as default behavior, which depends on feedback for this
    patch.
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    9e23ccf8
super.c 68.7 KB