From: Jens Axboe <axboe@kernel.dk>
To: Coly Li <colyli@suse.de>
Cc: linux-bcache@vger.kernel.org, linux-block@vger.kernel.org,
Jianpeng Ma <jianpeng.ma@intel.com>,
Randy Dunlap <rdunlap@infradead.org>,
Qiaowei Ren <qiaowei.ren@intel.com>,
Christoph Hellwig <hch@lst.de>,
Dan Williams <dan.j.williams@intel.com>,
Hannes Reinecke <hare@suse.de>
Subject: Re: [PATCH v13 02/12] bcache: initialize the nvm pages allocator
Date: Sun, 12 Dec 2021 12:34:20 -0700 [thread overview]
Message-ID: <db3fe961-020a-1d0d-bfb8-d5229b50474f@kernel.dk> (raw)
In-Reply-To: <20211212170552.2812-3-colyli@suse.de>
On 12/12/21 10:05 AM, Coly Li wrote:
> diff --git a/drivers/md/bcache/nvmpg.c b/drivers/md/bcache/nvmpg.c
> new file mode 100644
> index 000000000000..b654bbbda03e
> --- /dev/null
> +++ b/drivers/md/bcache/nvmpg.c
> @@ -0,0 +1,340 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Nvdimm page-buddy allocator
> + *
> + * Copyright (c) 2021, Intel Corporation.
> + * Copyright (c) 2021, Qiaowei Ren <qiaowei.ren@intel.com>.
> + * Copyright (c) 2021, Jianpeng Ma <jianpeng.ma@intel.com>.
> + */
> +
> +#include "bcache.h"
> +#include "nvmpg.h"
> +
> +#include <linux/slab.h>
> +#include <linux/list.h>
> +#include <linux/mutex.h>
> +#include <linux/dax.h>
> +#include <linux/pfn_t.h>
> +#include <linux/libnvdimm.h>
> +#include <linux/mm_types.h>
> +#include <linux/err.h>
> +#include <linux/pagemap.h>
> +#include <linux/bitmap.h>
> +#include <linux/blkdev.h>
> +
> +struct bch_nvmpg_set *global_nvmpg_set;
> +
> +void *bch_nvmpg_offset_to_ptr(unsigned long offset)
> +{
> + int ns_id = BCH_NVMPG_GET_NS_ID(offset);
> + struct bch_nvmpg_ns *ns = global_nvmpg_set->ns_tbl[ns_id];
> +
> + if (offset == 0)
> + return NULL;
> +
> + ns_id = BCH_NVMPG_GET_NS_ID(offset);
> + ns = global_nvmpg_set->ns_tbl[ns_id];
> +
> + if (ns)
> + return (void *)(ns->base_addr + BCH_NVMPG_GET_OFFSET(offset));
> +
> + pr_err("Invalid ns_id %u\n", ns_id);
> + return NULL;
> +}
> +
> +unsigned long bch_nvmpg_ptr_to_offset(struct bch_nvmpg_ns *ns, void *ptr)
> +{
> + int ns_id = ns->ns_id;
> + unsigned long offset = (unsigned long)(ptr - ns->base_addr);
> +
> + return BCH_NVMPG_OFFSET(ns_id, offset);
> +}
> +
> +static void release_ns_tbl(struct bch_nvmpg_set *set)
> +{
> + int i;
> + struct bch_nvmpg_ns *ns;
> +
> + for (i = 0; i < BCH_NVMPG_NS_MAX; i++) {
> + ns = set->ns_tbl[i];
> + if (ns) {
> + fs_put_dax(ns->dax_dev);
> + blkdev_put(ns->bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
> + set->ns_tbl[i] = NULL;
> + set->attached_ns--;
> + kfree(ns);
> + }
> + }
> +
> + if (set->attached_ns)
> + pr_err("unexpected attached_ns: %u\n", set->attached_ns);
> +}
> +
> +static void release_nvmpg_set(struct bch_nvmpg_set *set)
> +{
> + release_ns_tbl(set);
> + kfree(set);
> +}
> +
> +/* Namespace 0 contains all meta data of the nvmpg allocation set */
> +static int init_nvmpg_set_header(struct bch_nvmpg_ns *ns)
> +{
> + struct bch_nvmpg_set_header *set_header;
> +
> + if (ns->ns_id != 0) {
> + pr_err("unexpected ns_id %u for first nvmpg namespace.\n",
> + ns->ns_id);
> + return -EINVAL;
> + }
> +
> + set_header = bch_nvmpg_offset_to_ptr(ns->sb->set_header_offset);
> +
> + mutex_lock(&global_nvmpg_set->lock);
> + global_nvmpg_set->set_header = set_header;
> + global_nvmpg_set->heads_size = set_header->size;
> + global_nvmpg_set->heads_used = set_header->used;
> + mutex_unlock(&global_nvmpg_set->lock);
> +
> + return 0;
> +}
> +
> +static int attach_nvmpg_set(struct bch_nvmpg_ns *ns)
> +{
> + struct bch_nvmpg_sb *sb = ns->sb;
> + int rc = 0;
> +
> + mutex_lock(&global_nvmpg_set->lock);
> +
> + if (global_nvmpg_set->ns_tbl[sb->this_ns]) {
> + pr_err("ns_id %u already attached.\n", ns->ns_id);
> + rc = -EEXIST;
> + goto unlock;
> + }
> +
> + if (ns->ns_id != 0) {
> + pr_err("unexpected ns_id %u for first namespace.\n", ns->ns_id);
> + rc = -EINVAL;
> + goto unlock;
> + }
> +
> + if (global_nvmpg_set->attached_ns > 0) {
> + pr_err("multiple namespace attaching not supported yet\n");
> + rc = -EOPNOTSUPP;
> + goto unlock;
> + }
> +
> + if ((global_nvmpg_set->attached_ns + 1) > sb->total_ns) {
> + pr_err("namespace counters error: attached %u > total %u\n",
> + global_nvmpg_set->attached_ns,
> + global_nvmpg_set->total_ns);
> + rc = -EINVAL;
> + goto unlock;
> + }
> +
> + memcpy(global_nvmpg_set->set_uuid, sb->set_uuid, 16);
> + global_nvmpg_set->ns_tbl[sb->this_ns] = ns;
> + global_nvmpg_set->attached_ns++;
> + global_nvmpg_set->total_ns = sb->total_ns;
> +
> +unlock:
> + mutex_unlock(&global_nvmpg_set->lock);
> + return rc;
> +}
> +
> +static int read_nvdimm_meta_super(struct block_device *bdev,
> + struct bch_nvmpg_ns *ns)
> +{
> + struct page *page;
> + struct bch_nvmpg_sb *sb;
> + uint64_t expected_csum = 0;
> + int r;
> +
> + page = read_cache_page_gfp(bdev->bd_inode->i_mapping,
> + BCH_NVMPG_SB_OFFSET >> PAGE_SHIFT, GFP_KERNEL);
> +
> + if (IS_ERR(page))
> + return -EIO;
> +
> + sb = (struct bch_nvmpg_sb *)
> + (page_address(page) + offset_in_page(BCH_NVMPG_SB_OFFSET));
> +
> + r = -EINVAL;
> + expected_csum = csum_set(sb);
> + if (expected_csum != sb->csum) {
> + pr_info("csum is not match with expected one\n");
"Checksum mismatch"
would be more correct english, should it print the checksums as well?
> + goto put_page;
> + }
> +
> + if (memcmp(sb->magic, bch_nvmpg_magic, 16)) {
> + pr_info("invalid bch_nvmpg_magic\n");
> + goto put_page;
> + }
> +
> + if (sb->sb_offset !=
> + BCH_NVMPG_OFFSET(sb->this_ns, BCH_NVMPG_SB_OFFSET)) {
> + pr_info("invalid superblock offset 0x%llx\n", sb->sb_offset);
> + goto put_page;
> + }
> +
> + r = -EOPNOTSUPP;
> + if (sb->total_ns != 1) {
> + pr_info("multiple name space not supported yet.\n");
> + goto put_page;
> + }
Please use namespace consistently.
> +struct bch_nvmpg_ns *bch_register_namespace(const char *dev_path)
> +{
> + struct bch_nvmpg_ns *ns = NULL;
> + struct bch_nvmpg_sb *sb = NULL;
> + char buf[BDEVNAME_SIZE];
> + struct block_device *bdev;
> + pgoff_t pgoff;
> + int id, err;
> + char *path;
> + long dax_ret = 0;
> +
> + path = kstrndup(dev_path, 512, GFP_KERNEL);
> + if (!path) {
> + pr_err("kstrndup failed\n");
> + return ERR_PTR(-ENOMEM);
> + }
Really don't think we need that piece of information. Same for a lot of
other places, you have a ton of pr_err() stuff that looks mostly like
debugging.
> + ns->page_size = sb->page_size;
> + ns->pages_offset = sb->pages_offset;
> + ns->pages_total = sb->pages_total;
> + ns->sb = sb;
> + ns->free = 0;
> + ns->bdev = bdev;
> + ns->set = global_nvmpg_set;
> +
> + err = attach_nvmpg_set(ns);
> + if (err < 0)
> + goto free_ns;
> +
> + mutex_init(&ns->lock);
> +
> + err = init_nvmpg_set_header(ns);
> + if (err < 0)
> + goto free_ns;
Does this error path need to un-attach?
> +int __init bch_nvmpg_init(void)
> +{
> + global_nvmpg_set = kzalloc(sizeof(*global_nvmpg_set), GFP_KERNEL);
> + if (!global_nvmpg_set)
> + return -ENOMEM;
> +
> + global_nvmpg_set->total_ns = 0;
> + mutex_init(&global_nvmpg_set->lock);
> +
> + pr_info("bcache nvm init\n");
Another useless pr debug print, just get rid of it (and others).
> +void bch_nvmpg_exit(void)
> +{
> + release_nvmpg_set(global_nvmpg_set);
> + pr_info("bcache nvm exit\n");
> +}
Ditto
--
Jens Axboe
next prev parent reply other threads:[~2021-12-12 19:34 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-12 17:05 [PATCH v13 00/12] bcache for 5.17: enable NVDIMM for bcache journal Coly Li
2021-12-12 17:05 ` [PATCH v13 01/12] bcache: add initial data structures for nvm pages Coly Li
2021-12-12 17:05 ` [PATCH v13 02/12] bcache: initialize the nvm pages allocator Coly Li
2021-12-12 19:34 ` Jens Axboe [this message]
2021-12-28 5:29 ` Coly Li
2021-12-12 17:05 ` [PATCH v13 03/12] bcache: initialization of the buddy Coly Li
2021-12-12 20:10 ` Jens Axboe
2021-12-28 5:29 ` Coly Li
2021-12-15 16:20 ` Dan Carpenter
2021-12-28 5:12 ` Coly Li
2021-12-12 17:05 ` [PATCH v13 04/12] bcache: bch_nvmpg_alloc_pages() " Coly Li
2021-12-12 20:14 ` Jens Axboe
2021-12-28 5:29 ` Coly Li
2021-12-12 17:05 ` [PATCH v13 05/12] bcache: bch_nvmpg_free_pages() of the buddy allocator Coly Li
2021-12-12 20:16 ` Jens Axboe
2021-12-28 5:29 ` Coly Li
2022-02-21 12:36 ` yukuai (C)
2022-02-22 5:03 ` Ma, Jianpeng
2021-12-12 17:05 ` [PATCH v13 06/12] bcache: get recs list head for allocated pages by specific uuid Coly Li
2021-12-12 20:18 ` Jens Axboe
2021-12-12 17:05 ` [PATCH v13 07/12] bcache: use bucket index to set GC_MARK_METADATA for journal buckets in bch_btree_gc_finish() Coly Li
2021-12-12 17:05 ` [PATCH v13 08/12] bcache: add BCH_FEATURE_INCOMPAT_NVDIMM_META into incompat feature set Coly Li
2021-12-12 17:05 ` [PATCH v13 09/12] bcache: initialize bcache journal for NVDIMM meta device Coly Li
2021-12-12 17:05 ` [PATCH v13 10/12] bcache: support storing bcache journal into " Coly Li
2021-12-12 17:05 ` [PATCH v13 11/12] bcache: read jset from NVDIMM pages for journal replay Coly Li
2021-12-12 17:05 ` [PATCH v13 12/12] bcache: add sysfs interface register_nvdimm_meta to register NVDIMM meta device Coly Li
2021-12-12 20:20 ` [PATCH v13 00/12] bcache for 5.17: enable NVDIMM for bcache journal Jens Axboe
2021-12-28 5:29 ` Coly Li
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=db3fe961-020a-1d0d-bfb8-d5229b50474f@kernel.dk \
--to=axboe@kernel.dk \
--cc=colyli@suse.de \
--cc=dan.j.williams@intel.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=jianpeng.ma@intel.com \
--cc=linux-bcache@vger.kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=qiaowei.ren@intel.com \
--cc=rdunlap@infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).