All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: colyli@suse.de, linux-bcache@vger.kernel.org
Cc: linux-block@vger.kernel.org
Subject: Re: [PATCH v3 08/16] bcache: introduce meta_bucket_pages() related helper routines
Date: Wed, 15 Jul 2020 17:36:02 +0200	[thread overview]
Message-ID: <b6083e37-9eb2-5e9e-7b90-27b1308828d2@suse.de> (raw)
In-Reply-To: <20200715143015.14957-9-colyli@suse.de>

On 7/15/20 4:30 PM, colyli@suse.de wrote:
> From: Coly Li <colyli@suse.de>
> 
> 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: Coly Li <colyli@suse.de>
> ---
>   drivers/md/bcache/bcache.h | 20 ++++++++++++++++++++
>   drivers/md/bcache/super.c  |  3 +++
>   2 files changed, 23 insertions(+)
> 
> diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h
> index 80e3c4813fb0..972f1aff0f70 100644
> --- a/drivers/md/bcache/bcache.h
> +++ b/drivers/md/bcache/bcache.h
> @@ -762,6 +762,26 @@ struct bbio {
>   #define bucket_bytes(c)		((c)->sb.bucket_size << 9)
>   #define block_bytes(c)		((c)->sb.block_size << 9)
>   
> +static inline unsigned int meta_bucket_pages(struct cache_sb *sb)
> +{
> +	unsigned int n, max_pages;
> +
> +	max_pages = min_t(unsigned int,
> +			  __rounddown_pow_of_two(USHRT_MAX) / PAGE_SECTORS,
> +			  MAX_ORDER_NR_PAGES);
> +
> +	n = sb->bucket_size / PAGE_SECTORS;
> +	if (n > max_pages)
> +		n = max_pages;
> +
> +	return n;
> +}
> +
> +static inline unsigned int meta_bucket_bytes(struct cache_sb *sb)
> +{
> +	return meta_bucket_pages(sb) << PAGE_SHIFT;
> +}
> +
>   #define prios_per_bucket(c)				\
>   	((bucket_bytes(c) - sizeof(struct prio_set)) /	\
>   	 sizeof(struct bucket_disk))
I'm not particular happy with the division followed by a shift; might be 
an idea to replace the division by a shift.

But that's minor, so:

Reviewed-by: Hannes Reinecke <hare@suse.de>

Cheers,

Hannes
-- 
Dr. Hannes Reinecke            Teamlead Storage & Networking
hare@suse.de                               +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer

  reply	other threads:[~2020-07-15 15:36 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-15 14:29 [PATCH v3 00/16] bcache: extend bucket size to 32bit width colyli
2020-07-15 14:30 ` [PATCH v3 01/16] bcache: add read_super_common() to read major part of super block colyli
2020-07-15 14:30 ` [PATCH v3 02/16] bcache: add more accurate error information in read_super_common() colyli
2020-07-15 14:30 ` [PATCH v3 03/16] bcache: disassemble the big if() checks in bch_cache_set_alloc() colyli
2020-07-15 14:30 ` [PATCH v3 04/16] bcache: fix super block seq numbers comparision in register_cache_set() colyli
2020-07-15 14:30 ` [PATCH v3 05/16] bcache: increase super block version for cache device and backing device colyli
2020-07-15 14:30 ` [PATCH v3 06/16] bcache: move bucket related code into read_super_common() colyli
2020-07-15 14:30 ` [PATCH v3 07/16] bcache: struct cache_sb is only for in-memory super block now colyli
2020-07-15 18:21   ` Christoph Hellwig
2020-07-16  3:31     ` Coly Li
2020-07-15 14:30 ` [PATCH v3 08/16] bcache: introduce meta_bucket_pages() related helper routines colyli
2020-07-15 15:36   ` Hannes Reinecke [this message]
2020-07-15 16:00     ` Coly Li
2020-07-15 14:30 ` [PATCH v3 09/16] bcache: handle c->uuids properly for bucket size > 8MB colyli
2020-07-15 15:37   ` Hannes Reinecke
2020-07-15 14:30 ` [PATCH v3 10/16] bcache: handle cache prio_buckets and disk_buckets " colyli
2020-07-15 15:38   ` Hannes Reinecke
2020-07-15 14:30 ` [PATCH v3 11/16] bcache: handle cache set verify_ondisk " colyli
2020-07-16  6:07   ` Hannes Reinecke
2020-07-15 14:30 ` [PATCH v3 12/16] bcache: handle btree node memory allocation " colyli
2020-07-16  6:08   ` Hannes Reinecke
2020-07-15 14:30 ` [PATCH v3 13/16] bcache: add bucket_size_hi into struct cache_sb_disk for large bucket colyli
2020-07-16  6:15   ` Hannes Reinecke
2020-07-16  6:41     ` Coly Li
2020-07-16  7:02       ` Hannes Reinecke
2020-07-16  7:08         ` Coly Li
2020-07-15 14:30 ` [PATCH v3 14/16] bcache: add sysfs file to display feature sets information of cache set colyli
2020-07-16  6:17   ` Hannes Reinecke
2020-07-16  6:20     ` Coly Li
2020-07-15 14:30 ` [PATCH v3 15/16] bcache: avoid extra memory allocation from mempool c->fill_iter colyli
2020-07-16  6:18   ` Hannes Reinecke
2020-07-15 14:30 ` [PATCH v3 16/16] bcache: avoid extra memory consumption in struct bbio for large bucket size colyli
2020-07-16  6:18   ` Hannes Reinecke

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b6083e37-9eb2-5e9e-7b90-27b1308828d2@suse.de \
    --to=hare@suse.de \
    --cc=colyli@suse.de \
    --cc=linux-bcache@vger.kernel.org \
    --cc=linux-block@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.