From: Dongsheng Yang <dongsheng.yang@linux.dev>
To: axboe@kernel.dk, dan.j.williams@intel.com,
gregory.price@memverge.com, John@groves.net,
Jonathan.Cameron@Huawei.com, bbhushan2@marvell.com,
chaitanyak@nvidia.com, rdunlap@infradead.org
Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-cxl@vger.kernel.org, linux-bcache@vger.kernel.org,
Dongsheng Yang <dongsheng.yang@linux.dev>
Subject: [PATCH v2 4/8] cbd: introduce cbd_channel
Date: Wed, 18 Sep 2024 10:18:17 +0000 [thread overview]
Message-ID: <20240918101821.681118-5-dongsheng.yang@linux.dev> (raw)
In-Reply-To: <20240918101821.681118-1-dongsheng.yang@linux.dev>
The "cbd_channel" is the component responsible for the interaction
between the blkdev and the backend. It mainly provides the functions
"cbdc_copy_to_bio", "cbdc_copy_from_bio" and "cbd_channel_crc"
If the blkdev or backend is alive, that means there is active
user for this channel, then channel is alive.
Signed-off-by: Dongsheng Yang <dongsheng.yang@linux.dev>
---
drivers/block/cbd/cbd_channel.c | 96 +++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
create mode 100644 drivers/block/cbd/cbd_channel.c
diff --git a/drivers/block/cbd/cbd_channel.c b/drivers/block/cbd/cbd_channel.c
new file mode 100644
index 000000000000..6d3f77b9dc79
--- /dev/null
+++ b/drivers/block/cbd/cbd_channel.c
@@ -0,0 +1,96 @@
+#include "cbd_internal.h"
+
+static void channel_format(struct cbd_transport *cbdt, u32 id)
+{
+ struct cbd_channel_info *channel_info = cbdt_get_channel_info(cbdt, id);
+
+ cbdt_zero_range(cbdt, channel_info, CBDC_META_SIZE);
+}
+
+int cbd_get_empty_channel_id(struct cbd_transport *cbdt, u32 *id)
+{
+ int ret;
+
+ ret = cbdt_get_empty_segment_id(cbdt, id);
+ if (ret)
+ return ret;
+
+ channel_format(cbdt, *id);
+
+ return 0;
+}
+
+void cbdc_copy_to_bio(struct cbd_channel *channel,
+ u32 data_off, u32 data_len, struct bio *bio, u32 bio_off)
+{
+ cbds_copy_to_bio(&channel->segment, data_off, data_len, bio, bio_off);
+}
+
+void cbdc_copy_from_bio(struct cbd_channel *channel,
+ u32 data_off, u32 data_len, struct bio *bio, u32 bio_off)
+{
+ cbds_copy_from_bio(&channel->segment, data_off, data_len, bio, bio_off);
+}
+
+u32 cbd_channel_crc(struct cbd_channel *channel, u32 data_off, u32 data_len)
+{
+ return cbd_seg_crc(&channel->segment, data_off, data_len);
+}
+
+
+int cbdc_map_pages(struct cbd_channel *channel, struct cbd_backend_io *io)
+{
+ return cbds_map_pages(&channel->segment, io);
+}
+
+ssize_t cbd_channel_seg_detail_show(struct cbd_channel_info *channel_info, char *buf)
+{
+ return sprintf(buf, "channel backend id: %u\n"
+ "channel blkdev id: %u\n",
+ channel_info->backend_id,
+ channel_info->blkdev_id);
+}
+
+static void cbd_channel_seg_sanitize_pos(struct cbd_seg_pos *pos)
+{
+ struct cbd_segment *segment = pos->segment;
+
+ /* channel only use one segment as a ring */
+ while (pos->off >= segment->data_size)
+ pos->off -= segment->data_size;
+}
+
+static struct cbd_seg_ops cbd_channel_seg_ops = {
+ .sanitize_pos = cbd_channel_seg_sanitize_pos
+};
+
+void cbd_channel_init(struct cbd_channel *channel, struct cbd_transport *cbdt, u32 seg_id)
+{
+ struct cbd_channel_info *channel_info = cbdt_get_channel_info(cbdt, seg_id);
+ struct cbd_segment *segment = &channel->segment;
+ struct cbds_init_options seg_options;
+
+ seg_options.seg_id = seg_id;
+ seg_options.type = cbds_type_channel;
+ seg_options.data_off = CBDC_DATA_OFF;
+ seg_options.seg_ops = &cbd_channel_seg_ops;
+
+ cbd_segment_init(cbdt, segment, &seg_options);
+
+ channel->cbdt = cbdt;
+ channel->channel_info = channel_info;
+ channel->seg_id = seg_id;
+ channel->submr = (void *)channel_info + CBDC_SUBMR_OFF;
+ channel->compr = (void *)channel_info + CBDC_COMPR_OFF;
+ channel->submr_size = rounddown(CBDC_SUBMR_SIZE, sizeof(struct cbd_se));
+ channel->compr_size = rounddown(CBDC_COMPR_SIZE, sizeof(struct cbd_ce));
+ channel->data_size = CBDC_DATA_SIZE;
+
+ spin_lock_init(&channel->submr_lock);
+ spin_lock_init(&channel->compr_lock);
+}
+
+void cbd_channel_exit(struct cbd_channel *channel)
+{
+ cbd_segment_exit(&channel->segment);
+}
--
2.34.1
next prev parent reply other threads:[~2024-09-18 10:19 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-18 10:18 [PATCH v2 0/8] Introduce CBD (CXL Block Device) Dongsheng Yang
2024-09-18 10:18 ` [PATCH v2 1/8] cbd: introduce cbd_transport Dongsheng Yang
2024-09-18 10:18 ` [PATCH v2 2/8] cbd: introduce cbd_host Dongsheng Yang
2024-09-18 10:18 ` [PATCH v2 3/8] cbd: introduce cbd_segment Dongsheng Yang
2024-09-18 10:18 ` Dongsheng Yang [this message]
2024-09-18 10:18 ` [PATCH v2 5/8] cbd: introduce cbd_cache Dongsheng Yang
2024-09-18 10:18 ` [PATCH v2 6/8] cbd: introduce cbd_blkdev Dongsheng Yang
2024-09-18 10:18 ` [PATCH v2 7/8] cbd: introduce cbd_backend Dongsheng Yang
2024-09-18 10:18 ` [PATCH v2 8/8] block: Init for CBD(CXL Block Device) module Dongsheng Yang
2024-09-24 16:35 ` Randy Dunlap
2024-09-25 1:48 ` Dongsheng Yang
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=20240918101821.681118-5-dongsheng.yang@linux.dev \
--to=dongsheng.yang@linux.dev \
--cc=John@groves.net \
--cc=Jonathan.Cameron@Huawei.com \
--cc=axboe@kernel.dk \
--cc=bbhushan2@marvell.com \
--cc=chaitanyak@nvidia.com \
--cc=dan.j.williams@intel.com \
--cc=gregory.price@memverge.com \
--cc=linux-bcache@vger.kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--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 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.