• Coly Li's avatar
    bcache: handle btree node memory allocation properly for bucket size > 8MB · f9c32a5a
    Coly Li authored
    Currently the bcache internal btree node occupies a whole bucket. When
    loading the btree node from cache device into memory, mca_data_alloc()
    will call bch_btree_keys_alloc() to allocate memory for the whole bucket
    size, ilog2(b->c->btree_pages) is send to bch_btree_keys_alloc() as the
    parameter 'page_order'.
    
    c->btree_pages is set as bucket_pages() in bch_cache_set_alloc(), for
    bucket size > 8MB, ilog2(b->c->btree_pages) is 12 for 4KB page size. By
    default the maximum page order __get_free_pages() accepts is MAX_ORDER
    (11), in this condition bch_btree_keys_alloc() will always fail.
    
    Because of other over-page-order allocation failure fails the cache
    device registration, such btree node allocation failure wasn't observed
    during runtime. After other blocking page allocation failures for bucket
    size > 8MB, this btree node allocation issue may trigger potentical risk
    e.g. infinite dead-loop to retry btree node allocation after failure.
    
    This patch fixes the potential problem by setting c->btree_pages to
    meta_bucket_pages() in bch_cache_set_alloc(). In the condition that
    bucket size > 8MB, meta_bucket_pages() will always return a number which
    won't exceed the maximum page order of the buddy allocator.
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    f9c32a5a
super.c 71.6 KB