Loading drivers/md/bcache/super.c +76 −14 Original line number Diff line number Diff line Loading @@ -2052,6 +2052,8 @@ static int cache_alloc(struct cache *ca) size_t free; size_t btree_buckets; struct bucket *b; int ret = -ENOMEM; const char *err = NULL; __module_get(THIS_MODULE); kobject_init(&ca->kobj, &bch_cache_ktype); Loading @@ -2070,26 +2072,86 @@ static int cache_alloc(struct cache *ca) btree_buckets = ca->sb.njournal_buckets ?: 8; free = roundup_pow_of_two(ca->sb.nbuckets) >> 10; if (!init_fifo(&ca->free[RESERVE_BTREE], btree_buckets, GFP_KERNEL) || !init_fifo_exact(&ca->free[RESERVE_PRIO], prio_buckets(ca), GFP_KERNEL) || !init_fifo(&ca->free[RESERVE_MOVINGGC], free, GFP_KERNEL) || !init_fifo(&ca->free[RESERVE_NONE], free, GFP_KERNEL) || !init_fifo(&ca->free_inc, free << 2, GFP_KERNEL) || !init_heap(&ca->heap, free << 3, GFP_KERNEL) || !(ca->buckets = vzalloc(array_size(sizeof(struct bucket), ca->sb.nbuckets))) || !(ca->prio_buckets = kzalloc(array3_size(sizeof(uint64_t), if (!init_fifo(&ca->free[RESERVE_BTREE], btree_buckets, GFP_KERNEL)) { err = "ca->free[RESERVE_BTREE] alloc failed"; goto err_btree_alloc; } if (!init_fifo_exact(&ca->free[RESERVE_PRIO], prio_buckets(ca), GFP_KERNEL)) { err = "ca->free[RESERVE_PRIO] alloc failed"; goto err_prio_alloc; } if (!init_fifo(&ca->free[RESERVE_MOVINGGC], free, GFP_KERNEL)) { err = "ca->free[RESERVE_MOVINGGC] alloc failed"; goto err_movinggc_alloc; } if (!init_fifo(&ca->free[RESERVE_NONE], free, GFP_KERNEL)) { err = "ca->free[RESERVE_NONE] alloc failed"; goto err_none_alloc; } if (!init_fifo(&ca->free_inc, free << 2, GFP_KERNEL)) { err = "ca->free_inc alloc failed"; goto err_free_inc_alloc; } if (!init_heap(&ca->heap, free << 3, GFP_KERNEL)) { err = "ca->heap alloc failed"; goto err_heap_alloc; } ca->buckets = vzalloc(array_size(sizeof(struct bucket), ca->sb.nbuckets)); if (!ca->buckets) { err = "ca->buckets alloc failed"; goto err_buckets_alloc; } ca->prio_buckets = kzalloc(array3_size(sizeof(uint64_t), prio_buckets(ca), 2), GFP_KERNEL)) || !(ca->disk_buckets = alloc_bucket_pages(GFP_KERNEL, ca))) return -ENOMEM; GFP_KERNEL); if (!ca->prio_buckets) { err = "ca->prio_buckets alloc failed"; goto err_prio_buckets_alloc; } ca->disk_buckets = alloc_bucket_pages(GFP_KERNEL, ca); if (!ca->disk_buckets) { err = "ca->disk_buckets alloc failed"; goto err_disk_buckets_alloc; } ca->prio_last_buckets = ca->prio_buckets + prio_buckets(ca); for_each_bucket(b, ca) atomic_set(&b->pin, 0); return 0; err_disk_buckets_alloc: kfree(ca->prio_buckets); err_prio_buckets_alloc: vfree(ca->buckets); err_buckets_alloc: free_heap(&ca->heap); err_heap_alloc: free_fifo(&ca->free_inc); err_free_inc_alloc: free_fifo(&ca->free[RESERVE_NONE]); err_none_alloc: free_fifo(&ca->free[RESERVE_MOVINGGC]); err_movinggc_alloc: free_fifo(&ca->free[RESERVE_PRIO]); err_prio_alloc: free_fifo(&ca->free[RESERVE_BTREE]); err_btree_alloc: module_put(THIS_MODULE); if (err) pr_notice("error %s: %s", ca->cache_dev_name, err); return ret; } static int register_cache(struct cache_sb *sb, struct page *sb_page, Loading Loading
drivers/md/bcache/super.c +76 −14 Original line number Diff line number Diff line Loading @@ -2052,6 +2052,8 @@ static int cache_alloc(struct cache *ca) size_t free; size_t btree_buckets; struct bucket *b; int ret = -ENOMEM; const char *err = NULL; __module_get(THIS_MODULE); kobject_init(&ca->kobj, &bch_cache_ktype); Loading @@ -2070,26 +2072,86 @@ static int cache_alloc(struct cache *ca) btree_buckets = ca->sb.njournal_buckets ?: 8; free = roundup_pow_of_two(ca->sb.nbuckets) >> 10; if (!init_fifo(&ca->free[RESERVE_BTREE], btree_buckets, GFP_KERNEL) || !init_fifo_exact(&ca->free[RESERVE_PRIO], prio_buckets(ca), GFP_KERNEL) || !init_fifo(&ca->free[RESERVE_MOVINGGC], free, GFP_KERNEL) || !init_fifo(&ca->free[RESERVE_NONE], free, GFP_KERNEL) || !init_fifo(&ca->free_inc, free << 2, GFP_KERNEL) || !init_heap(&ca->heap, free << 3, GFP_KERNEL) || !(ca->buckets = vzalloc(array_size(sizeof(struct bucket), ca->sb.nbuckets))) || !(ca->prio_buckets = kzalloc(array3_size(sizeof(uint64_t), if (!init_fifo(&ca->free[RESERVE_BTREE], btree_buckets, GFP_KERNEL)) { err = "ca->free[RESERVE_BTREE] alloc failed"; goto err_btree_alloc; } if (!init_fifo_exact(&ca->free[RESERVE_PRIO], prio_buckets(ca), GFP_KERNEL)) { err = "ca->free[RESERVE_PRIO] alloc failed"; goto err_prio_alloc; } if (!init_fifo(&ca->free[RESERVE_MOVINGGC], free, GFP_KERNEL)) { err = "ca->free[RESERVE_MOVINGGC] alloc failed"; goto err_movinggc_alloc; } if (!init_fifo(&ca->free[RESERVE_NONE], free, GFP_KERNEL)) { err = "ca->free[RESERVE_NONE] alloc failed"; goto err_none_alloc; } if (!init_fifo(&ca->free_inc, free << 2, GFP_KERNEL)) { err = "ca->free_inc alloc failed"; goto err_free_inc_alloc; } if (!init_heap(&ca->heap, free << 3, GFP_KERNEL)) { err = "ca->heap alloc failed"; goto err_heap_alloc; } ca->buckets = vzalloc(array_size(sizeof(struct bucket), ca->sb.nbuckets)); if (!ca->buckets) { err = "ca->buckets alloc failed"; goto err_buckets_alloc; } ca->prio_buckets = kzalloc(array3_size(sizeof(uint64_t), prio_buckets(ca), 2), GFP_KERNEL)) || !(ca->disk_buckets = alloc_bucket_pages(GFP_KERNEL, ca))) return -ENOMEM; GFP_KERNEL); if (!ca->prio_buckets) { err = "ca->prio_buckets alloc failed"; goto err_prio_buckets_alloc; } ca->disk_buckets = alloc_bucket_pages(GFP_KERNEL, ca); if (!ca->disk_buckets) { err = "ca->disk_buckets alloc failed"; goto err_disk_buckets_alloc; } ca->prio_last_buckets = ca->prio_buckets + prio_buckets(ca); for_each_bucket(b, ca) atomic_set(&b->pin, 0); return 0; err_disk_buckets_alloc: kfree(ca->prio_buckets); err_prio_buckets_alloc: vfree(ca->buckets); err_buckets_alloc: free_heap(&ca->heap); err_heap_alloc: free_fifo(&ca->free_inc); err_free_inc_alloc: free_fifo(&ca->free[RESERVE_NONE]); err_none_alloc: free_fifo(&ca->free[RESERVE_MOVINGGC]); err_movinggc_alloc: free_fifo(&ca->free[RESERVE_PRIO]); err_prio_alloc: free_fifo(&ca->free[RESERVE_BTREE]); err_btree_alloc: module_put(THIS_MODULE); if (err) pr_notice("error %s: %s", ca->cache_dev_name, err); return ret; } static int register_cache(struct cache_sb *sb, struct page *sb_page, Loading