• Coly Li's avatar
    bcache: introduce meta_bucket_pages() related helper routines · de1fafab
    Coly Li authored
    Currently the in-memory meta data like c->uuids or c->disk_buckets
    are allocated by alloc_bucket_pages(). The macro alloc_bucket_pages()
    calls __get_free_pages() to allocated continuous pages with order
    indicated by ilog2(bucket_pages(c)),
     #define alloc_bucket_pages(gfp, c)                      \
         ((void *) __get_free_pages(__GFP_ZERO|gfp, ilog2(bucket_pages(c))))
    
    The maximum order is defined as MAX_ORDER, the default value is 11 (and
    can be overwritten by CONFIG_FORCE_MAX_ZONEORDER). In bcache code the
    maximum bucket size width is 16bits, this is restricted both by KEY_SIZE
    size and bucket_size size from struct cache_sb_disk. The maximum 16bits
    width and power-of-2 value is (1<<15) in unit of sector (512byte). It
    means the maximum value of bucket size in bytes is (1<<24) bytes a.k.a
    4096 pages.
    
    When the bucket size is set to maximum permitted value, ilog2(4096) is
    12, which exceeds the default maximum order __get_free_pages() can
    accepted, the failed pages allocation will fail cache set registration
    procedure and print a kernel oops message for the exceeded pages order.
    
    This patch introduces meta_bucket_pages(), meta_bucket_bytes(), and
    alloc_bucket_pages() helper routines. meta_bucket_pages() indicates the
    maximum pages can be allocated to meta data bucket, meta_bucket_bytes()
    indicates the according maximum bytes, and alloc_bucket_pages() does
    the pages allocation for meta bucket. Because meta_bucket_pages()
    chooses the smaller value among the bucket size and MAX_ORDER_NR_PAGES,
    it still works when MAX_ORDER overwritten by CONFIG_FORCE_MAX_ZONEORDER.
    
    Following patches will use these helper routines to decide maximum pages
    can be allocated for different meta data buckets. If the bucket size is
    larger than meta_bucket_bytes(), the bcache registration can continue to
    success, just the space more than meta_bucket_bytes() inside the bucket
    is wasted. Comparing bcache failed for large bucket size, wasting some
    space for meta data buckets is acceptable at this moment.
    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>
    de1fafab
super.c 71.5 KB