* [RFC PATCH 0/6] reduce the size of rnbd_clt_dev
@ 2022-06-20 3:49 Guoqing Jiang
2022-06-20 3:49 ` [RFC PATCH 1/6] rnbd-clt: open code send_msg_open in rnbd_clt_map_device Guoqing Jiang
` (6 more replies)
0 siblings, 7 replies; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-20 3:49 UTC (permalink / raw)
To: haris.iqbal, jinpu.wang, axboe; +Cc: linux-block
Hi,
The struct rnbd_clt_dev added some members (wc, fua and max_hw_sectors
etc) which are used to set up gendisk and request_queue, but seems only
map scenario need to setup them since rnbd_client_setup_device is not
called from remap path.
Previously, pahole reports.
/* size: 272, cachelines: 5, members: 29 */
/* sum members: 259, holes: 4, sum holes: 13 */
/* last cacheline: 16 bytes */
After the series, it changes to
/* size: 224, cachelines: 4, members: 17 */
/* last cacheline: 32 bytes */
Please review.
Thanks,
Guoqing
Guoqing Jiang (6):
rnbd-clt: open code send_msg_open in rnbd_clt_map_device
rnbd-clt: don't free rsp in msg_open_conf for map scenario
rnbd-clt: kill read_only from struct rnbd_clt_dev
rnbd-clt: reduce the size of struct rnbd_clt_dev
rnbd-clt: adjust the layout of struct rnbd_clt_dev
rnbd-clt: refactor rnbd_clt_change_capacity
drivers/block/rnbd/rnbd-clt-sysfs.c | 2 +-
drivers/block/rnbd/rnbd-clt.c | 202 +++++++++++++++++-----------
drivers/block/rnbd/rnbd-clt.h | 18 +--
3 files changed, 124 insertions(+), 98 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* [RFC PATCH 1/6] rnbd-clt: open code send_msg_open in rnbd_clt_map_device
2022-06-20 3:49 [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Guoqing Jiang
@ 2022-06-20 3:49 ` Guoqing Jiang
2022-06-21 15:11 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 2/6] rnbd-clt: don't free rsp in msg_open_conf for map scenario Guoqing Jiang
` (5 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-20 3:49 UTC (permalink / raw)
To: haris.iqbal, jinpu.wang, axboe; +Cc: linux-block
Let's open code it in rnbd_clt_map_device, then we can use information
from rsp to setup gendisk and request_queue in next commits. After that,
we can remove some members (wc, fua and max_hw_sectors etc) from struct
rnbd_clt_dev.
Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
---
drivers/block/rnbd/rnbd-clt.c | 44 +++++++++++++++++++++++++++++++++--
1 file changed, 42 insertions(+), 2 deletions(-)
diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
index 409c76b81aed..0396532da742 100644
--- a/drivers/block/rnbd/rnbd-clt.c
+++ b/drivers/block/rnbd/rnbd-clt.c
@@ -1562,7 +1562,14 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
{
struct rnbd_clt_session *sess;
struct rnbd_clt_dev *dev;
- int ret;
+ int ret, errno;
+ struct rnbd_msg_open_rsp *rsp;
+ struct rnbd_msg_open msg;
+ struct rnbd_iu *iu;
+ struct kvec vec = {
+ .iov_base = &msg,
+ .iov_len = sizeof(msg)
+ };
if (exists_devpath(pathname, sessname))
return ERR_PTR(-EEXIST);
@@ -1582,13 +1589,46 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
ret = -EEXIST;
goto put_dev;
}
- ret = send_msg_open(dev, RTRS_PERMIT_WAIT);
+
+ rsp = kzalloc(sizeof(*rsp), GFP_KERNEL);
+ if (!rsp) {
+ ret = -ENOMEM;
+ goto del_dev;
+ }
+
+ iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT);
+ if (!iu) {
+ ret = -ENOMEM;
+ kfree(rsp);
+ goto del_dev;
+ }
+ iu->buf = rsp;
+ iu->dev = dev;
+ sg_init_one(iu->sgt.sgl, rsp, sizeof(*rsp));
+
+ msg.hdr.type = cpu_to_le16(RNBD_MSG_OPEN);
+ msg.access_mode = dev->access_mode;
+ strscpy(msg.dev_name, dev->pathname, sizeof(msg.dev_name));
+
+ WARN_ON(!rnbd_clt_get_dev(dev));
+ ret = send_usr_msg(sess->rtrs, READ, iu,
+ &vec, sizeof(*rsp), iu->sgt.sgl, 1,
+ msg_open_conf, &errno, RTRS_PERMIT_WAIT);
+ if (ret) {
+ rnbd_clt_put_dev(dev);
+ rnbd_put_iu(sess, iu);
+ kfree(rsp);
+ } else {
+ ret = errno;
+ }
+ rnbd_put_iu(sess, iu);
if (ret) {
rnbd_clt_err(dev,
"map_device: failed, can't open remote device, err: %d\n",
ret);
goto del_dev;
}
+
mutex_lock(&dev->lock);
pr_debug("Opened remote device: session=%s, path='%s'\n",
sess->sessname, pathname);
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [RFC PATCH 2/6] rnbd-clt: don't free rsp in msg_open_conf for map scenario
2022-06-20 3:49 [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Guoqing Jiang
2022-06-20 3:49 ` [RFC PATCH 1/6] rnbd-clt: open code send_msg_open in rnbd_clt_map_device Guoqing Jiang
@ 2022-06-20 3:49 ` Guoqing Jiang
2022-06-22 10:57 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 3/6] rnbd-clt: kill read_only from struct rnbd_clt_dev Guoqing Jiang
` (4 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-20 3:49 UTC (permalink / raw)
To: haris.iqbal, jinpu.wang, axboe; +Cc: linux-block
For map scenario, rsp is freed in two places:
1. msg_open_conf frees rsp if rtrs_clt_request returns 0.
2. Otherwise, rsp is freed by the call sites of rtrs_clt_request.
Now, We'd like to control full lifecycle of rsp in rnbd_clt_map_device,
with that, it is feasible to pass rsp to rnbd_client_setup_device in
next commit.
For 1, it is possible to free rsp from the caller of send_usr_msg
because of the synchronization of iu->comp.wait. And we put iu later
in rnbd_clt_map_device to ensure order of release rsp and iu.
Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
---
drivers/block/rnbd/rnbd-clt.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
index 0396532da742..6c4970878d23 100644
--- a/drivers/block/rnbd/rnbd-clt.c
+++ b/drivers/block/rnbd/rnbd-clt.c
@@ -507,6 +507,11 @@ static void msg_open_conf(struct work_struct *work)
struct rnbd_msg_open_rsp *rsp = iu->buf;
struct rnbd_clt_dev *dev = iu->dev;
int errno = iu->errno;
+ bool from_map = false;
+
+ /* INIT state is only triggered from rnbd_clt_map_device */
+ if (dev->dev_state == DEV_STATE_INIT)
+ from_map = true;
if (errno) {
rnbd_clt_err(dev,
@@ -523,7 +528,9 @@ static void msg_open_conf(struct work_struct *work)
send_msg_close(dev, device_id, RTRS_PERMIT_NOWAIT);
}
}
- kfree(rsp);
+ /* We free rsp in rnbd_clt_map_device for map scenario */
+ if (!from_map)
+ kfree(rsp);
wake_up_iu_comp(iu, errno);
rnbd_put_iu(dev->sess, iu);
rnbd_clt_put_dev(dev);
@@ -1617,16 +1624,14 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
if (ret) {
rnbd_clt_put_dev(dev);
rnbd_put_iu(sess, iu);
- kfree(rsp);
} else {
ret = errno;
}
- rnbd_put_iu(sess, iu);
if (ret) {
rnbd_clt_err(dev,
"map_device: failed, can't open remote device, err: %d\n",
ret);
- goto del_dev;
+ goto put_iu;
}
mutex_lock(&dev->lock);
@@ -1651,12 +1656,17 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
dev->max_hw_sectors, dev->wc, dev->fua);
mutex_unlock(&dev->lock);
+ kfree(rsp);
+ rnbd_put_iu(sess, iu);
rnbd_clt_put_sess(sess);
return dev;
send_close:
send_msg_close(dev, dev->device_id, RTRS_PERMIT_WAIT);
+put_iu:
+ kfree(rsp);
+ rnbd_put_iu(sess, iu);
del_dev:
delete_dev(dev);
put_dev:
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [RFC PATCH 3/6] rnbd-clt: kill read_only from struct rnbd_clt_dev
2022-06-20 3:49 [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Guoqing Jiang
2022-06-20 3:49 ` [RFC PATCH 1/6] rnbd-clt: open code send_msg_open in rnbd_clt_map_device Guoqing Jiang
2022-06-20 3:49 ` [RFC PATCH 2/6] rnbd-clt: don't free rsp in msg_open_conf for map scenario Guoqing Jiang
@ 2022-06-20 3:49 ` Guoqing Jiang
2022-06-22 10:57 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 4/6] rnbd-clt: reduce the size of " Guoqing Jiang
` (3 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-20 3:49 UTC (permalink / raw)
To: haris.iqbal, jinpu.wang, axboe; +Cc: linux-block
The member is not needed since we can call get_disk_ro to achieve the
same goal.
Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
---
drivers/block/rnbd/rnbd-clt.c | 8 ++------
drivers/block/rnbd/rnbd-clt.h | 1 -
2 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
index 6c4970878d23..0bade2680eb9 100644
--- a/drivers/block/rnbd/rnbd-clt.c
+++ b/drivers/block/rnbd/rnbd-clt.c
@@ -949,7 +949,7 @@ static int rnbd_client_open(struct block_device *block_device, fmode_t mode)
{
struct rnbd_clt_dev *dev = block_device->bd_disk->private_data;
- if (dev->read_only && (mode & FMODE_WRITE))
+ if (get_disk_ro(dev->gd) && (mode & FMODE_WRITE))
return -EPERM;
if (dev->dev_state == DEV_STATE_UNMAPPED ||
@@ -1402,12 +1402,8 @@ static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
set_capacity(dev->gd, dev->nsectors);
- if (dev->access_mode == RNBD_ACCESS_RO) {
- dev->read_only = true;
+ if (dev->access_mode == RNBD_ACCESS_RO)
set_disk_ro(dev->gd, true);
- } else {
- dev->read_only = false;
- }
/*
* Network device does not need rotational
diff --git a/drivers/block/rnbd/rnbd-clt.h b/drivers/block/rnbd/rnbd-clt.h
index 2e2e8c4a85c1..26fb91d800e3 100644
--- a/drivers/block/rnbd/rnbd-clt.h
+++ b/drivers/block/rnbd/rnbd-clt.h
@@ -117,7 +117,6 @@ struct rnbd_clt_dev {
char *pathname;
enum rnbd_access_mode access_mode;
u32 nr_poll_queues;
- bool read_only;
bool wc;
bool fua;
u32 max_hw_sectors;
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [RFC PATCH 4/6] rnbd-clt: reduce the size of struct rnbd_clt_dev
2022-06-20 3:49 [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Guoqing Jiang
` (2 preceding siblings ...)
2022-06-20 3:49 ` [RFC PATCH 3/6] rnbd-clt: kill read_only from struct rnbd_clt_dev Guoqing Jiang
@ 2022-06-20 3:49 ` Guoqing Jiang
2022-06-22 10:58 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 5/6] rnbd-clt: adjust the layout " Guoqing Jiang
` (2 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-20 3:49 UTC (permalink / raw)
To: haris.iqbal, jinpu.wang, axboe; +Cc: linux-block
Previously, both map and remap trigger rnbd_clt_set_dev_attr to set
some members in rnbd_clt_dev such as wc, fua and logical_block_size
etc, but those members are only useful for map scenario given the
setup_request_queue is only called from the path:
rnbd_clt_map_device -> rnbd_client_setup_device
Since rnbd_clt_map_device frees rsp after rnbd_client_setup_device,
we can pass rsp to rnbd_client_setup_device and it's callees, which
means queue's attributes can be set directly from relevant members
of rsp instead from rnbd_clt_dev.
After that, we can kill 11 members from rnbd_clt_dev, and we don't
need rnbd_clt_set_dev_attr either.
Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
---
drivers/block/rnbd/rnbd-clt.c | 118 ++++++++++++++++------------------
drivers/block/rnbd/rnbd-clt.h | 11 ----
2 files changed, 55 insertions(+), 74 deletions(-)
diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
index 0bade2680eb9..2c63cd5ac09d 100644
--- a/drivers/block/rnbd/rnbd-clt.c
+++ b/drivers/block/rnbd/rnbd-clt.c
@@ -68,38 +68,12 @@ static inline bool rnbd_clt_get_dev(struct rnbd_clt_dev *dev)
return refcount_inc_not_zero(&dev->refcount);
}
-static int rnbd_clt_set_dev_attr(struct rnbd_clt_dev *dev,
- const struct rnbd_msg_open_rsp *rsp)
-{
- struct rnbd_clt_session *sess = dev->sess;
-
- if (!rsp->logical_block_size)
- return -EINVAL;
-
- dev->device_id = le32_to_cpu(rsp->device_id);
- dev->nsectors = le64_to_cpu(rsp->nsectors);
- dev->logical_block_size = le16_to_cpu(rsp->logical_block_size);
- dev->physical_block_size = le16_to_cpu(rsp->physical_block_size);
- dev->max_discard_sectors = le32_to_cpu(rsp->max_discard_sectors);
- dev->discard_granularity = le32_to_cpu(rsp->discard_granularity);
- dev->discard_alignment = le32_to_cpu(rsp->discard_alignment);
- dev->secure_discard = le16_to_cpu(rsp->secure_discard);
- dev->wc = !!(rsp->cache_policy & RNBD_WRITEBACK);
- dev->fua = !!(rsp->cache_policy & RNBD_FUA);
-
- dev->max_hw_sectors = sess->max_io_size / SECTOR_SIZE;
- dev->max_segments = sess->max_segments;
-
- return 0;
-}
-
static int rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
size_t new_nsectors)
{
- rnbd_clt_info(dev, "Device size changed from %zu to %zu sectors\n",
- dev->nsectors, new_nsectors);
- dev->nsectors = new_nsectors;
- set_capacity_and_notify(dev->gd, dev->nsectors);
+ rnbd_clt_info(dev, "Device size changed from %llu to %zu sectors\n",
+ get_capacity(dev->gd), new_nsectors);
+ set_capacity_and_notify(dev->gd, new_nsectors);
return 0;
}
@@ -123,15 +97,17 @@ static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
* If the device was remapped and the size changed in the
* meantime we need to revalidate it
*/
- if (dev->nsectors != nsectors)
+ if (get_capacity(dev->gd) != nsectors)
rnbd_clt_change_capacity(dev, nsectors);
gd_kobj = &disk_to_dev(dev->gd)->kobj;
kobject_uevent(gd_kobj, KOBJ_ONLINE);
rnbd_clt_info(dev, "Device online, device remapped successfully\n");
}
- err = rnbd_clt_set_dev_attr(dev, rsp);
- if (err)
+ if (!rsp->logical_block_size) {
+ err = -EINVAL;
goto out;
+ }
+ dev->device_id = le32_to_cpu(rsp->device_id);
dev->dev_state = DEV_STATE_MAPPED;
out:
@@ -970,10 +946,10 @@ static int rnbd_client_getgeo(struct block_device *block_device,
struct hd_geometry *geo)
{
u64 size;
- struct rnbd_clt_dev *dev;
+ struct rnbd_clt_dev *dev = block_device->bd_disk->private_data;
+ struct queue_limits *limit = &dev->queue->limits;
- dev = block_device->bd_disk->private_data;
- size = dev->size * (dev->logical_block_size / SECTOR_SIZE);
+ size = dev->size * (limit->logical_block_size / SECTOR_SIZE);
geo->cylinders = size >> 6; /* size/64 */
geo->heads = 4;
geo->sectors = 16;
@@ -1357,11 +1333,15 @@ static void rnbd_init_mq_hw_queues(struct rnbd_clt_dev *dev)
}
}
-static void setup_request_queue(struct rnbd_clt_dev *dev)
+static void setup_request_queue(struct rnbd_clt_dev *dev,
+ struct rnbd_msg_open_rsp *rsp)
{
- blk_queue_logical_block_size(dev->queue, dev->logical_block_size);
- blk_queue_physical_block_size(dev->queue, dev->physical_block_size);
- blk_queue_max_hw_sectors(dev->queue, dev->max_hw_sectors);
+ blk_queue_logical_block_size(dev->queue,
+ le16_to_cpu(rsp->logical_block_size));
+ blk_queue_physical_block_size(dev->queue,
+ le16_to_cpu(rsp->physical_block_size));
+ blk_queue_max_hw_sectors(dev->queue,
+ dev->sess->max_io_size / SECTOR_SIZE);
/*
* we don't support discards to "discontiguous" segments
@@ -1369,21 +1349,27 @@ static void setup_request_queue(struct rnbd_clt_dev *dev)
*/
blk_queue_max_discard_segments(dev->queue, 1);
- blk_queue_max_discard_sectors(dev->queue, dev->max_discard_sectors);
- dev->queue->limits.discard_granularity = dev->discard_granularity;
- dev->queue->limits.discard_alignment = dev->discard_alignment;
- if (dev->secure_discard)
+ blk_queue_max_discard_sectors(dev->queue,
+ le32_to_cpu(rsp->max_discard_sectors));
+ dev->queue->limits.discard_granularity =
+ le32_to_cpu(rsp->discard_granularity);
+ dev->queue->limits.discard_alignment =
+ le32_to_cpu(rsp->discard_alignment);
+ if (le16_to_cpu(rsp->secure_discard))
blk_queue_max_secure_erase_sectors(dev->queue,
- dev->max_discard_sectors);
+ le32_to_cpu(rsp->max_discard_sectors));
blk_queue_flag_set(QUEUE_FLAG_SAME_COMP, dev->queue);
blk_queue_flag_set(QUEUE_FLAG_SAME_FORCE, dev->queue);
- blk_queue_max_segments(dev->queue, dev->max_segments);
+ blk_queue_max_segments(dev->queue, dev->sess->max_segments);
blk_queue_io_opt(dev->queue, dev->sess->max_io_size);
blk_queue_virt_boundary(dev->queue, SZ_4K - 1);
- blk_queue_write_cache(dev->queue, dev->wc, dev->fua);
+ blk_queue_write_cache(dev->queue,
+ !!(rsp->cache_policy & RNBD_WRITEBACK),
+ !!(rsp->cache_policy & RNBD_FUA));
}
-static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
+static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev,
+ struct rnbd_msg_open_rsp *rsp, int idx)
{
int err;
@@ -1395,12 +1381,12 @@ static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
dev->gd->private_data = dev;
snprintf(dev->gd->disk_name, sizeof(dev->gd->disk_name), "rnbd%d",
idx);
- pr_debug("disk_name=%s, capacity=%zu\n",
+ pr_debug("disk_name=%s, capacity=%llu\n",
dev->gd->disk_name,
- dev->nsectors * (dev->logical_block_size / SECTOR_SIZE)
- );
+ le64_to_cpu(rsp->nsectors) *
+ (le16_to_cpu(rsp->logical_block_size) / SECTOR_SIZE));
- set_capacity(dev->gd, dev->nsectors);
+ set_capacity(dev->gd, le64_to_cpu(rsp->nsectors));
if (dev->access_mode == RNBD_ACCESS_RO)
set_disk_ro(dev->gd, true);
@@ -1416,11 +1402,13 @@ static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
return err;
}
-static int rnbd_client_setup_device(struct rnbd_clt_dev *dev)
+static int rnbd_client_setup_device(struct rnbd_clt_dev *dev,
+ struct rnbd_msg_open_rsp *rsp)
{
int idx = dev->clt_device_id;
- dev->size = dev->nsectors * dev->logical_block_size;
+ dev->size = le64_to_cpu(rsp->nsectors) *
+ le16_to_cpu(rsp->logical_block_size);
dev->gd = blk_mq_alloc_disk(&dev->sess->tag_set, dev);
if (IS_ERR(dev->gd))
@@ -1428,8 +1416,8 @@ static int rnbd_client_setup_device(struct rnbd_clt_dev *dev)
dev->queue = dev->gd->queue;
rnbd_init_mq_hw_queues(dev);
- setup_request_queue(dev);
- return rnbd_clt_setup_gen_disk(dev, idx);
+ setup_request_queue(dev, rsp);
+ return rnbd_clt_setup_gen_disk(dev, rsp, idx);
}
static struct rnbd_clt_dev *init_dev(struct rnbd_clt_session *sess,
@@ -1633,7 +1621,7 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
mutex_lock(&dev->lock);
pr_debug("Opened remote device: session=%s, path='%s'\n",
sess->sessname, pathname);
- ret = rnbd_client_setup_device(dev);
+ ret = rnbd_client_setup_device(dev, rsp);
if (ret) {
rnbd_clt_err(dev,
"map_device: Failed to configure device, err: %d\n",
@@ -1643,13 +1631,17 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
}
rnbd_clt_info(dev,
- "map_device: Device mapped as %s (nsectors: %zu, logical_block_size: %d, physical_block_size: %d, max_discard_sectors: %d, discard_granularity: %d, discard_alignment: %d, secure_discard: %d, max_segments: %d, max_hw_sectors: %d, wc: %d, fua: %d)\n",
- dev->gd->disk_name, dev->nsectors,
- dev->logical_block_size, dev->physical_block_size,
- dev->max_discard_sectors,
- dev->discard_granularity, dev->discard_alignment,
- dev->secure_discard, dev->max_segments,
- dev->max_hw_sectors, dev->wc, dev->fua);
+ "map_device: Device mapped as %s (nsectors: %llu, logical_block_size: %d, physical_block_size: %d, max_discard_sectors: %d, discard_granularity: %d, discard_alignment: %d, secure_discard: %d, max_segments: %d, max_hw_sectors: %d, wc: %d, fua: %d)\n",
+ dev->gd->disk_name, le64_to_cpu(rsp->nsectors),
+ le16_to_cpu(rsp->logical_block_size),
+ le16_to_cpu(rsp->physical_block_size),
+ le32_to_cpu(rsp->max_discard_sectors),
+ le32_to_cpu(rsp->discard_granularity),
+ le32_to_cpu(rsp->discard_alignment),
+ le16_to_cpu(rsp->secure_discard),
+ sess->max_segments, sess->max_io_size / SECTOR_SIZE,
+ !!(rsp->cache_policy & RNBD_WRITEBACK),
+ !!(rsp->cache_policy & RNBD_FUA));
mutex_unlock(&dev->lock);
kfree(rsp);
diff --git a/drivers/block/rnbd/rnbd-clt.h b/drivers/block/rnbd/rnbd-clt.h
index 26fb91d800e3..7520272541b1 100644
--- a/drivers/block/rnbd/rnbd-clt.h
+++ b/drivers/block/rnbd/rnbd-clt.h
@@ -117,17 +117,6 @@ struct rnbd_clt_dev {
char *pathname;
enum rnbd_access_mode access_mode;
u32 nr_poll_queues;
- bool wc;
- bool fua;
- u32 max_hw_sectors;
- u32 max_discard_sectors;
- u32 discard_granularity;
- u32 discard_alignment;
- u16 secure_discard;
- u16 physical_block_size;
- u16 logical_block_size;
- u16 max_segments;
- size_t nsectors;
u64 size; /* device size in bytes */
struct list_head list;
struct gendisk *gd;
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [RFC PATCH 5/6] rnbd-clt: adjust the layout of struct rnbd_clt_dev
2022-06-20 3:49 [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Guoqing Jiang
` (3 preceding siblings ...)
2022-06-20 3:49 ` [RFC PATCH 4/6] rnbd-clt: reduce the size of " Guoqing Jiang
@ 2022-06-20 3:49 ` Guoqing Jiang
2022-06-22 10:58 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 6/6] rnbd-clt: refactor rnbd_clt_change_capacity Guoqing Jiang
2022-06-21 12:16 ` [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Jinpu Wang
6 siblings, 1 reply; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-20 3:49 UTC (permalink / raw)
To: haris.iqbal, jinpu.wang, axboe; +Cc: linux-block
While at it, let re-arrange the struct to remove holes.
Before, pahole reports
/* size: 232, cachelines: 4, members: 17 */
/* sum members: 224, holes: 2, sum holes: 8 */
/* last cacheline: 40 bytes */
After the change, the report changes to
/* size: 224, cachelines: 4, members: 17 */
/* last cacheline: 32 bytes */
Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
---
drivers/block/rnbd/rnbd-clt.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/block/rnbd/rnbd-clt.h b/drivers/block/rnbd/rnbd-clt.h
index 7520272541b1..df237d2ea0d9 100644
--- a/drivers/block/rnbd/rnbd-clt.h
+++ b/drivers/block/rnbd/rnbd-clt.h
@@ -106,6 +106,7 @@ struct rnbd_queue {
};
struct rnbd_clt_dev {
+ struct kobject kobj;
struct rnbd_clt_session *sess;
struct request_queue *queue;
struct rnbd_queue *hw_queues;
@@ -114,15 +115,14 @@ struct rnbd_clt_dev {
u32 clt_device_id;
struct mutex lock;
enum rnbd_clt_dev_state dev_state;
+ refcount_t refcount;
char *pathname;
enum rnbd_access_mode access_mode;
u32 nr_poll_queues;
u64 size; /* device size in bytes */
struct list_head list;
struct gendisk *gd;
- struct kobject kobj;
char *blk_symlink_name;
- refcount_t refcount;
struct work_struct unmap_on_rmmod_work;
};
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [RFC PATCH 6/6] rnbd-clt: refactor rnbd_clt_change_capacity
2022-06-20 3:49 [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Guoqing Jiang
` (4 preceding siblings ...)
2022-06-20 3:49 ` [RFC PATCH 5/6] rnbd-clt: adjust the layout " Guoqing Jiang
@ 2022-06-20 3:49 ` Guoqing Jiang
2022-06-22 10:57 ` Jinpu Wang
2022-06-21 12:16 ` [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Jinpu Wang
6 siblings, 1 reply; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-20 3:49 UTC (permalink / raw)
To: haris.iqbal, jinpu.wang, axboe; +Cc: linux-block
1. process_msg_open_rsp checks if capacity changed or not before call
rnbd_clt_change_capacity while the checking also make sense for
rnbd_clt_resize_dev_store, let's move the checking into the function.
2. change the parameter type to 'sector_t' then we don't need to cast
it from rnbd_clt_resize_dev_store, and update rnbd_clt_resize_disk too.
3. no need to checking the return value, make it return void.
Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
---
drivers/block/rnbd/rnbd-clt-sysfs.c | 2 +-
drivers/block/rnbd/rnbd-clt.c | 24 ++++++++++++------------
drivers/block/rnbd/rnbd-clt.h | 2 +-
3 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/drivers/block/rnbd/rnbd-clt-sysfs.c b/drivers/block/rnbd/rnbd-clt-sysfs.c
index 2be5d87a3ca6..e7c7d9a68168 100644
--- a/drivers/block/rnbd/rnbd-clt-sysfs.c
+++ b/drivers/block/rnbd/rnbd-clt-sysfs.c
@@ -376,7 +376,7 @@ static ssize_t rnbd_clt_resize_dev_store(struct kobject *kobj,
if (ret)
return ret;
- ret = rnbd_clt_resize_disk(dev, (size_t)sectors);
+ ret = rnbd_clt_resize_disk(dev, sectors);
if (ret)
return ret;
diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
index 2c63cd5ac09d..6c6c4ba3d41d 100644
--- a/drivers/block/rnbd/rnbd-clt.c
+++ b/drivers/block/rnbd/rnbd-clt.c
@@ -68,13 +68,18 @@ static inline bool rnbd_clt_get_dev(struct rnbd_clt_dev *dev)
return refcount_inc_not_zero(&dev->refcount);
}
-static int rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
- size_t new_nsectors)
+static void rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
+ sector_t new_nsectors)
{
- rnbd_clt_info(dev, "Device size changed from %llu to %zu sectors\n",
+ if (get_capacity(dev->gd) != new_nsectors)
+ return;
+
+ /*
+ * If the size changed, we need to revalidate it
+ */
+ rnbd_clt_info(dev, "Device size changed from %llu to %llu sectors\n",
get_capacity(dev->gd), new_nsectors);
set_capacity_and_notify(dev->gd, new_nsectors);
- return 0;
}
static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
@@ -93,12 +98,7 @@ static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
if (dev->dev_state == DEV_STATE_MAPPED_DISCONNECTED) {
u64 nsectors = le64_to_cpu(rsp->nsectors);
- /*
- * If the device was remapped and the size changed in the
- * meantime we need to revalidate it
- */
- if (get_capacity(dev->gd) != nsectors)
- rnbd_clt_change_capacity(dev, nsectors);
+ rnbd_clt_change_capacity(dev, nsectors);
gd_kobj = &disk_to_dev(dev->gd)->kobj;
kobject_uevent(gd_kobj, KOBJ_ONLINE);
rnbd_clt_info(dev, "Device online, device remapped successfully\n");
@@ -116,7 +116,7 @@ static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
return err;
}
-int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize)
+int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, sector_t newsize)
{
int ret = 0;
@@ -126,7 +126,7 @@ int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize)
ret = -ENOENT;
goto out;
}
- ret = rnbd_clt_change_capacity(dev, newsize);
+ rnbd_clt_change_capacity(dev, newsize);
out:
mutex_unlock(&dev->lock);
diff --git a/drivers/block/rnbd/rnbd-clt.h b/drivers/block/rnbd/rnbd-clt.h
index df237d2ea0d9..a48e040abe63 100644
--- a/drivers/block/rnbd/rnbd-clt.h
+++ b/drivers/block/rnbd/rnbd-clt.h
@@ -138,7 +138,7 @@ int rnbd_clt_unmap_device(struct rnbd_clt_dev *dev, bool force,
const struct attribute *sysfs_self);
int rnbd_clt_remap_device(struct rnbd_clt_dev *dev);
-int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize);
+int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, sector_t newsize);
/* rnbd-clt-sysfs.c */
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 0/6] reduce the size of rnbd_clt_dev
2022-06-20 3:49 [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Guoqing Jiang
` (5 preceding siblings ...)
2022-06-20 3:49 ` [RFC PATCH 6/6] rnbd-clt: refactor rnbd_clt_change_capacity Guoqing Jiang
@ 2022-06-21 12:16 ` Jinpu Wang
2022-06-22 11:15 ` Guoqing Jiang
6 siblings, 1 reply; 17+ messages in thread
From: Jinpu Wang @ 2022-06-21 12:16 UTC (permalink / raw)
To: Guoqing Jiang; +Cc: haris.iqbal, axboe, linux-block
On Mon, Jun 20, 2022 at 5:49 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>
> Hi,
>
> The struct rnbd_clt_dev added some members (wc, fua and max_hw_sectors
> etc) which are used to set up gendisk and request_queue, but seems only
> map scenario need to setup them since rnbd_client_setup_device is not
> called from remap path.
>
> Previously, pahole reports.
>
> /* size: 272, cachelines: 5, members: 29 */
> /* sum members: 259, holes: 4, sum holes: 13 */
> /* last cacheline: 16 bytes */
>
> After the series, it changes to
>
> /* size: 224, cachelines: 4, members: 17 */
> /* last cacheline: 32 bytes */
>
> Please review.
>
> Thanks,
> Guoqing
Hi Guoqing,
Thanks for the patchset, I had a brief look, in general I like the
idea, will run a regression test. and sort out the details.
Thanks!
Jinpu
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 1/6] rnbd-clt: open code send_msg_open in rnbd_clt_map_device
2022-06-20 3:49 ` [RFC PATCH 1/6] rnbd-clt: open code send_msg_open in rnbd_clt_map_device Guoqing Jiang
@ 2022-06-21 15:11 ` Jinpu Wang
2022-06-22 11:14 ` Guoqing Jiang
0 siblings, 1 reply; 17+ messages in thread
From: Jinpu Wang @ 2022-06-21 15:11 UTC (permalink / raw)
To: Guoqing Jiang; +Cc: haris.iqbal, axboe, linux-block
On Mon, Jun 20, 2022 at 5:49 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>
> Let's open code it in rnbd_clt_map_device, then we can use information
> from rsp to setup gendisk and request_queue in next commits. After that,
> we can remove some members (wc, fua and max_hw_sectors etc) from struct
> rnbd_clt_dev.
>
> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
> ---
> drivers/block/rnbd/rnbd-clt.c | 44 +++++++++++++++++++++++++++++++++--
> 1 file changed, 42 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
> index 409c76b81aed..0396532da742 100644
> --- a/drivers/block/rnbd/rnbd-clt.c
> +++ b/drivers/block/rnbd/rnbd-clt.c
> @@ -1562,7 +1562,14 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
> {
> struct rnbd_clt_session *sess;
> struct rnbd_clt_dev *dev;
> - int ret;
> + int ret, errno;
> + struct rnbd_msg_open_rsp *rsp;
> + struct rnbd_msg_open msg;
> + struct rnbd_iu *iu;
> + struct kvec vec = {
> + .iov_base = &msg,
> + .iov_len = sizeof(msg)
> + };
>
> if (exists_devpath(pathname, sessname))
> return ERR_PTR(-EEXIST);
> @@ -1582,13 +1589,46 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
> ret = -EEXIST;
> goto put_dev;
> }
> - ret = send_msg_open(dev, RTRS_PERMIT_WAIT);
> +
> + rsp = kzalloc(sizeof(*rsp), GFP_KERNEL);
> + if (!rsp) {
> + ret = -ENOMEM;
> + goto del_dev;
> + }
> +
> + iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT);
> + if (!iu) {
> + ret = -ENOMEM;
> + kfree(rsp);
> + goto del_dev;
> + }
> + iu->buf = rsp;
> + iu->dev = dev;
> + sg_init_one(iu->sgt.sgl, rsp, sizeof(*rsp));
> +
> + msg.hdr.type = cpu_to_le16(RNBD_MSG_OPEN);
> + msg.access_mode = dev->access_mode;
> + strscpy(msg.dev_name, dev->pathname, sizeof(msg.dev_name));
> +
> + WARN_ON(!rnbd_clt_get_dev(dev));
> + ret = send_usr_msg(sess->rtrs, READ, iu,
> + &vec, sizeof(*rsp), iu->sgt.sgl, 1,
> + msg_open_conf, &errno, RTRS_PERMIT_WAIT);
> + if (ret) {
> + rnbd_clt_put_dev(dev);
> + rnbd_put_iu(sess, iu);
> + kfree(rsp);
> + } else {
> + ret = errno;
> + }
> + rnbd_put_iu(sess, iu);
> if (ret) {
> rnbd_clt_err(dev,
> "map_device: failed, can't open remote device, err: %d\n",
> ret);
> goto del_dev;
> }
> +
looks ok, except this new line seems not needed.
Thx!
> mutex_lock(&dev->lock);
> pr_debug("Opened remote device: session=%s, path='%s'\n",
> sess->sessname, pathname);
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 6/6] rnbd-clt: refactor rnbd_clt_change_capacity
2022-06-20 3:49 ` [RFC PATCH 6/6] rnbd-clt: refactor rnbd_clt_change_capacity Guoqing Jiang
@ 2022-06-22 10:57 ` Jinpu Wang
2022-06-22 11:12 ` Guoqing Jiang
0 siblings, 1 reply; 17+ messages in thread
From: Jinpu Wang @ 2022-06-22 10:57 UTC (permalink / raw)
To: Guoqing Jiang; +Cc: haris.iqbal, axboe, linux-block
On Mon, Jun 20, 2022 at 5:50 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>
> 1. process_msg_open_rsp checks if capacity changed or not before call
> rnbd_clt_change_capacity while the checking also make sense for
> rnbd_clt_resize_dev_store, let's move the checking into the function.
>
> 2. change the parameter type to 'sector_t' then we don't need to cast
> it from rnbd_clt_resize_dev_store, and update rnbd_clt_resize_disk too.
>
> 3. no need to checking the return value, make it return void.
>
better to split this into 3 patches.
> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
> ---
> drivers/block/rnbd/rnbd-clt-sysfs.c | 2 +-
> drivers/block/rnbd/rnbd-clt.c | 24 ++++++++++++------------
> drivers/block/rnbd/rnbd-clt.h | 2 +-
> 3 files changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/block/rnbd/rnbd-clt-sysfs.c b/drivers/block/rnbd/rnbd-clt-sysfs.c
> index 2be5d87a3ca6..e7c7d9a68168 100644
> --- a/drivers/block/rnbd/rnbd-clt-sysfs.c
> +++ b/drivers/block/rnbd/rnbd-clt-sysfs.c
> @@ -376,7 +376,7 @@ static ssize_t rnbd_clt_resize_dev_store(struct kobject *kobj,
> if (ret)
> return ret;
>
> - ret = rnbd_clt_resize_disk(dev, (size_t)sectors);
> + ret = rnbd_clt_resize_disk(dev, sectors);
> if (ret)
> return ret;
>
> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
> index 2c63cd5ac09d..6c6c4ba3d41d 100644
> --- a/drivers/block/rnbd/rnbd-clt.c
> +++ b/drivers/block/rnbd/rnbd-clt.c
> @@ -68,13 +68,18 @@ static inline bool rnbd_clt_get_dev(struct rnbd_clt_dev *dev)
> return refcount_inc_not_zero(&dev->refcount);
> }
>
> -static int rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
> - size_t new_nsectors)
> +static void rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
> + sector_t new_nsectors)
> {
> - rnbd_clt_info(dev, "Device size changed from %llu to %zu sectors\n",
> + if (get_capacity(dev->gd) != new_nsectors)
> + return;
This change is broken, it leads to resize no longer work, should be "=="
> +
> + /*
> + * If the size changed, we need to revalidate it
> + */
> + rnbd_clt_info(dev, "Device size changed from %llu to %llu sectors\n",
> get_capacity(dev->gd), new_nsectors);
> set_capacity_and_notify(dev->gd, new_nsectors);
> - return 0;
> }
>
> static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
> @@ -93,12 +98,7 @@ static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
> if (dev->dev_state == DEV_STATE_MAPPED_DISCONNECTED) {
> u64 nsectors = le64_to_cpu(rsp->nsectors);
>
> - /*
> - * If the device was remapped and the size changed in the
> - * meantime we need to revalidate it
> - */
> - if (get_capacity(dev->gd) != nsectors)
> - rnbd_clt_change_capacity(dev, nsectors);
> + rnbd_clt_change_capacity(dev, nsectors);
> gd_kobj = &disk_to_dev(dev->gd)->kobj;
> kobject_uevent(gd_kobj, KOBJ_ONLINE);
> rnbd_clt_info(dev, "Device online, device remapped successfully\n");
> @@ -116,7 +116,7 @@ static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
> return err;
> }
>
> -int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize)
> +int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, sector_t newsize)
> {
> int ret = 0;
>
> @@ -126,7 +126,7 @@ int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize)
> ret = -ENOENT;
> goto out;
> }
> - ret = rnbd_clt_change_capacity(dev, newsize);
> + rnbd_clt_change_capacity(dev, newsize);
>
> out:
> mutex_unlock(&dev->lock);
> diff --git a/drivers/block/rnbd/rnbd-clt.h b/drivers/block/rnbd/rnbd-clt.h
> index df237d2ea0d9..a48e040abe63 100644
> --- a/drivers/block/rnbd/rnbd-clt.h
> +++ b/drivers/block/rnbd/rnbd-clt.h
> @@ -138,7 +138,7 @@ int rnbd_clt_unmap_device(struct rnbd_clt_dev *dev, bool force,
> const struct attribute *sysfs_self);
>
> int rnbd_clt_remap_device(struct rnbd_clt_dev *dev);
> -int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize);
> +int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, sector_t newsize);
>
> /* rnbd-clt-sysfs.c */
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 2/6] rnbd-clt: don't free rsp in msg_open_conf for map scenario
2022-06-20 3:49 ` [RFC PATCH 2/6] rnbd-clt: don't free rsp in msg_open_conf for map scenario Guoqing Jiang
@ 2022-06-22 10:57 ` Jinpu Wang
0 siblings, 0 replies; 17+ messages in thread
From: Jinpu Wang @ 2022-06-22 10:57 UTC (permalink / raw)
To: Guoqing Jiang; +Cc: haris.iqbal, axboe, linux-block
On Mon, Jun 20, 2022 at 5:50 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>
> For map scenario, rsp is freed in two places:
>
> 1. msg_open_conf frees rsp if rtrs_clt_request returns 0.
>
> 2. Otherwise, rsp is freed by the call sites of rtrs_clt_request.
>
> Now, We'd like to control full lifecycle of rsp in rnbd_clt_map_device,
> with that, it is feasible to pass rsp to rnbd_client_setup_device in
> next commit.
>
> For 1, it is possible to free rsp from the caller of send_usr_msg
> because of the synchronization of iu->comp.wait. And we put iu later
> in rnbd_clt_map_device to ensure order of release rsp and iu.
>
> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
> ---
> drivers/block/rnbd/rnbd-clt.c | 18 ++++++++++++++----
> 1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
> index 0396532da742..6c4970878d23 100644
> --- a/drivers/block/rnbd/rnbd-clt.c
> +++ b/drivers/block/rnbd/rnbd-clt.c
> @@ -507,6 +507,11 @@ static void msg_open_conf(struct work_struct *work)
> struct rnbd_msg_open_rsp *rsp = iu->buf;
> struct rnbd_clt_dev *dev = iu->dev;
> int errno = iu->errno;
> + bool from_map = false;
> +
> + /* INIT state is only triggered from rnbd_clt_map_device */
> + if (dev->dev_state == DEV_STATE_INIT)
> + from_map = true;
>
> if (errno) {
> rnbd_clt_err(dev,
> @@ -523,7 +528,9 @@ static void msg_open_conf(struct work_struct *work)
> send_msg_close(dev, device_id, RTRS_PERMIT_NOWAIT);
> }
> }
> - kfree(rsp);
> + /* We free rsp in rnbd_clt_map_device for map scenario */
> + if (!from_map)
> + kfree(rsp);
> wake_up_iu_comp(iu, errno);
> rnbd_put_iu(dev->sess, iu);
> rnbd_clt_put_dev(dev);
> @@ -1617,16 +1624,14 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
> if (ret) {
> rnbd_clt_put_dev(dev);
> rnbd_put_iu(sess, iu);
> - kfree(rsp);
> } else {
> ret = errno;
> }
> - rnbd_put_iu(sess, iu);
> if (ret) {
> rnbd_clt_err(dev,
> "map_device: failed, can't open remote device, err: %d\n",
> ret);
> - goto del_dev;
> + goto put_iu;
> }
>
> mutex_lock(&dev->lock);
> @@ -1651,12 +1656,17 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
> dev->max_hw_sectors, dev->wc, dev->fua);
>
> mutex_unlock(&dev->lock);
> + kfree(rsp);
> + rnbd_put_iu(sess, iu);
> rnbd_clt_put_sess(sess);
>
> return dev;
>
> send_close:
> send_msg_close(dev, dev->device_id, RTRS_PERMIT_WAIT);
> +put_iu:
> + kfree(rsp);
> + rnbd_put_iu(sess, iu);
> del_dev:
> delete_dev(dev);
> put_dev:
> --
> 2.34.1
>
lgtm.
Acked-by: Jack Wang <jinpu.wang@ionos.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 3/6] rnbd-clt: kill read_only from struct rnbd_clt_dev
2022-06-20 3:49 ` [RFC PATCH 3/6] rnbd-clt: kill read_only from struct rnbd_clt_dev Guoqing Jiang
@ 2022-06-22 10:57 ` Jinpu Wang
0 siblings, 0 replies; 17+ messages in thread
From: Jinpu Wang @ 2022-06-22 10:57 UTC (permalink / raw)
To: Guoqing Jiang; +Cc: haris.iqbal, axboe, linux-block
On Mon, Jun 20, 2022 at 5:50 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>
> The member is not needed since we can call get_disk_ro to achieve the
> same goal.
>
> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
lgtm
Acked-by: Jack Wang <jinpu.wang@ionos.com>
> ---
> drivers/block/rnbd/rnbd-clt.c | 8 ++------
> drivers/block/rnbd/rnbd-clt.h | 1 -
> 2 files changed, 2 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
> index 6c4970878d23..0bade2680eb9 100644
> --- a/drivers/block/rnbd/rnbd-clt.c
> +++ b/drivers/block/rnbd/rnbd-clt.c
> @@ -949,7 +949,7 @@ static int rnbd_client_open(struct block_device *block_device, fmode_t mode)
> {
> struct rnbd_clt_dev *dev = block_device->bd_disk->private_data;
>
> - if (dev->read_only && (mode & FMODE_WRITE))
> + if (get_disk_ro(dev->gd) && (mode & FMODE_WRITE))
> return -EPERM;
>
> if (dev->dev_state == DEV_STATE_UNMAPPED ||
> @@ -1402,12 +1402,8 @@ static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
>
> set_capacity(dev->gd, dev->nsectors);
>
> - if (dev->access_mode == RNBD_ACCESS_RO) {
> - dev->read_only = true;
> + if (dev->access_mode == RNBD_ACCESS_RO)
> set_disk_ro(dev->gd, true);
> - } else {
> - dev->read_only = false;
> - }
>
> /*
> * Network device does not need rotational
> diff --git a/drivers/block/rnbd/rnbd-clt.h b/drivers/block/rnbd/rnbd-clt.h
> index 2e2e8c4a85c1..26fb91d800e3 100644
> --- a/drivers/block/rnbd/rnbd-clt.h
> +++ b/drivers/block/rnbd/rnbd-clt.h
> @@ -117,7 +117,6 @@ struct rnbd_clt_dev {
> char *pathname;
> enum rnbd_access_mode access_mode;
> u32 nr_poll_queues;
> - bool read_only;
> bool wc;
> bool fua;
> u32 max_hw_sectors;
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 4/6] rnbd-clt: reduce the size of struct rnbd_clt_dev
2022-06-20 3:49 ` [RFC PATCH 4/6] rnbd-clt: reduce the size of " Guoqing Jiang
@ 2022-06-22 10:58 ` Jinpu Wang
0 siblings, 0 replies; 17+ messages in thread
From: Jinpu Wang @ 2022-06-22 10:58 UTC (permalink / raw)
To: Guoqing Jiang; +Cc: haris.iqbal, axboe, linux-block
On Mon, Jun 20, 2022 at 5:50 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>
> Previously, both map and remap trigger rnbd_clt_set_dev_attr to set
> some members in rnbd_clt_dev such as wc, fua and logical_block_size
> etc, but those members are only useful for map scenario given the
> setup_request_queue is only called from the path:
>
> rnbd_clt_map_device -> rnbd_client_setup_device
>
> Since rnbd_clt_map_device frees rsp after rnbd_client_setup_device,
> we can pass rsp to rnbd_client_setup_device and it's callees, which
> means queue's attributes can be set directly from relevant members
> of rsp instead from rnbd_clt_dev.
>
> After that, we can kill 11 members from rnbd_clt_dev, and we don't
> need rnbd_clt_set_dev_attr either.
>
> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
lgtm
Acked-by: Jack Wang <jinpu.wang@ionos.com>
> ---
> drivers/block/rnbd/rnbd-clt.c | 118 ++++++++++++++++------------------
> drivers/block/rnbd/rnbd-clt.h | 11 ----
> 2 files changed, 55 insertions(+), 74 deletions(-)
>
> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
> index 0bade2680eb9..2c63cd5ac09d 100644
> --- a/drivers/block/rnbd/rnbd-clt.c
> +++ b/drivers/block/rnbd/rnbd-clt.c
> @@ -68,38 +68,12 @@ static inline bool rnbd_clt_get_dev(struct rnbd_clt_dev *dev)
> return refcount_inc_not_zero(&dev->refcount);
> }
>
> -static int rnbd_clt_set_dev_attr(struct rnbd_clt_dev *dev,
> - const struct rnbd_msg_open_rsp *rsp)
> -{
> - struct rnbd_clt_session *sess = dev->sess;
> -
> - if (!rsp->logical_block_size)
> - return -EINVAL;
> -
> - dev->device_id = le32_to_cpu(rsp->device_id);
> - dev->nsectors = le64_to_cpu(rsp->nsectors);
> - dev->logical_block_size = le16_to_cpu(rsp->logical_block_size);
> - dev->physical_block_size = le16_to_cpu(rsp->physical_block_size);
> - dev->max_discard_sectors = le32_to_cpu(rsp->max_discard_sectors);
> - dev->discard_granularity = le32_to_cpu(rsp->discard_granularity);
> - dev->discard_alignment = le32_to_cpu(rsp->discard_alignment);
> - dev->secure_discard = le16_to_cpu(rsp->secure_discard);
> - dev->wc = !!(rsp->cache_policy & RNBD_WRITEBACK);
> - dev->fua = !!(rsp->cache_policy & RNBD_FUA);
> -
> - dev->max_hw_sectors = sess->max_io_size / SECTOR_SIZE;
> - dev->max_segments = sess->max_segments;
> -
> - return 0;
> -}
> -
> static int rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
> size_t new_nsectors)
> {
> - rnbd_clt_info(dev, "Device size changed from %zu to %zu sectors\n",
> - dev->nsectors, new_nsectors);
> - dev->nsectors = new_nsectors;
> - set_capacity_and_notify(dev->gd, dev->nsectors);
> + rnbd_clt_info(dev, "Device size changed from %llu to %zu sectors\n",
> + get_capacity(dev->gd), new_nsectors);
> + set_capacity_and_notify(dev->gd, new_nsectors);
> return 0;
> }
>
> @@ -123,15 +97,17 @@ static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
> * If the device was remapped and the size changed in the
> * meantime we need to revalidate it
> */
> - if (dev->nsectors != nsectors)
> + if (get_capacity(dev->gd) != nsectors)
> rnbd_clt_change_capacity(dev, nsectors);
> gd_kobj = &disk_to_dev(dev->gd)->kobj;
> kobject_uevent(gd_kobj, KOBJ_ONLINE);
> rnbd_clt_info(dev, "Device online, device remapped successfully\n");
> }
> - err = rnbd_clt_set_dev_attr(dev, rsp);
> - if (err)
> + if (!rsp->logical_block_size) {
> + err = -EINVAL;
> goto out;
> + }
> + dev->device_id = le32_to_cpu(rsp->device_id);
> dev->dev_state = DEV_STATE_MAPPED;
>
> out:
> @@ -970,10 +946,10 @@ static int rnbd_client_getgeo(struct block_device *block_device,
> struct hd_geometry *geo)
> {
> u64 size;
> - struct rnbd_clt_dev *dev;
> + struct rnbd_clt_dev *dev = block_device->bd_disk->private_data;
> + struct queue_limits *limit = &dev->queue->limits;
>
> - dev = block_device->bd_disk->private_data;
> - size = dev->size * (dev->logical_block_size / SECTOR_SIZE);
> + size = dev->size * (limit->logical_block_size / SECTOR_SIZE);
> geo->cylinders = size >> 6; /* size/64 */
> geo->heads = 4;
> geo->sectors = 16;
> @@ -1357,11 +1333,15 @@ static void rnbd_init_mq_hw_queues(struct rnbd_clt_dev *dev)
> }
> }
>
> -static void setup_request_queue(struct rnbd_clt_dev *dev)
> +static void setup_request_queue(struct rnbd_clt_dev *dev,
> + struct rnbd_msg_open_rsp *rsp)
> {
> - blk_queue_logical_block_size(dev->queue, dev->logical_block_size);
> - blk_queue_physical_block_size(dev->queue, dev->physical_block_size);
> - blk_queue_max_hw_sectors(dev->queue, dev->max_hw_sectors);
> + blk_queue_logical_block_size(dev->queue,
> + le16_to_cpu(rsp->logical_block_size));
> + blk_queue_physical_block_size(dev->queue,
> + le16_to_cpu(rsp->physical_block_size));
> + blk_queue_max_hw_sectors(dev->queue,
> + dev->sess->max_io_size / SECTOR_SIZE);
>
> /*
> * we don't support discards to "discontiguous" segments
> @@ -1369,21 +1349,27 @@ static void setup_request_queue(struct rnbd_clt_dev *dev)
> */
> blk_queue_max_discard_segments(dev->queue, 1);
>
> - blk_queue_max_discard_sectors(dev->queue, dev->max_discard_sectors);
> - dev->queue->limits.discard_granularity = dev->discard_granularity;
> - dev->queue->limits.discard_alignment = dev->discard_alignment;
> - if (dev->secure_discard)
> + blk_queue_max_discard_sectors(dev->queue,
> + le32_to_cpu(rsp->max_discard_sectors));
> + dev->queue->limits.discard_granularity =
> + le32_to_cpu(rsp->discard_granularity);
> + dev->queue->limits.discard_alignment =
> + le32_to_cpu(rsp->discard_alignment);
> + if (le16_to_cpu(rsp->secure_discard))
> blk_queue_max_secure_erase_sectors(dev->queue,
> - dev->max_discard_sectors);
> + le32_to_cpu(rsp->max_discard_sectors));
> blk_queue_flag_set(QUEUE_FLAG_SAME_COMP, dev->queue);
> blk_queue_flag_set(QUEUE_FLAG_SAME_FORCE, dev->queue);
> - blk_queue_max_segments(dev->queue, dev->max_segments);
> + blk_queue_max_segments(dev->queue, dev->sess->max_segments);
> blk_queue_io_opt(dev->queue, dev->sess->max_io_size);
> blk_queue_virt_boundary(dev->queue, SZ_4K - 1);
> - blk_queue_write_cache(dev->queue, dev->wc, dev->fua);
> + blk_queue_write_cache(dev->queue,
> + !!(rsp->cache_policy & RNBD_WRITEBACK),
> + !!(rsp->cache_policy & RNBD_FUA));
> }
>
> -static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
> +static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev,
> + struct rnbd_msg_open_rsp *rsp, int idx)
> {
> int err;
>
> @@ -1395,12 +1381,12 @@ static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
> dev->gd->private_data = dev;
> snprintf(dev->gd->disk_name, sizeof(dev->gd->disk_name), "rnbd%d",
> idx);
> - pr_debug("disk_name=%s, capacity=%zu\n",
> + pr_debug("disk_name=%s, capacity=%llu\n",
> dev->gd->disk_name,
> - dev->nsectors * (dev->logical_block_size / SECTOR_SIZE)
> - );
> + le64_to_cpu(rsp->nsectors) *
> + (le16_to_cpu(rsp->logical_block_size) / SECTOR_SIZE));
>
> - set_capacity(dev->gd, dev->nsectors);
> + set_capacity(dev->gd, le64_to_cpu(rsp->nsectors));
>
> if (dev->access_mode == RNBD_ACCESS_RO)
> set_disk_ro(dev->gd, true);
> @@ -1416,11 +1402,13 @@ static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev, int idx)
> return err;
> }
>
> -static int rnbd_client_setup_device(struct rnbd_clt_dev *dev)
> +static int rnbd_client_setup_device(struct rnbd_clt_dev *dev,
> + struct rnbd_msg_open_rsp *rsp)
> {
> int idx = dev->clt_device_id;
>
> - dev->size = dev->nsectors * dev->logical_block_size;
> + dev->size = le64_to_cpu(rsp->nsectors) *
> + le16_to_cpu(rsp->logical_block_size);
>
> dev->gd = blk_mq_alloc_disk(&dev->sess->tag_set, dev);
> if (IS_ERR(dev->gd))
> @@ -1428,8 +1416,8 @@ static int rnbd_client_setup_device(struct rnbd_clt_dev *dev)
> dev->queue = dev->gd->queue;
> rnbd_init_mq_hw_queues(dev);
>
> - setup_request_queue(dev);
> - return rnbd_clt_setup_gen_disk(dev, idx);
> + setup_request_queue(dev, rsp);
> + return rnbd_clt_setup_gen_disk(dev, rsp, idx);
> }
>
> static struct rnbd_clt_dev *init_dev(struct rnbd_clt_session *sess,
> @@ -1633,7 +1621,7 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
> mutex_lock(&dev->lock);
> pr_debug("Opened remote device: session=%s, path='%s'\n",
> sess->sessname, pathname);
> - ret = rnbd_client_setup_device(dev);
> + ret = rnbd_client_setup_device(dev, rsp);
> if (ret) {
> rnbd_clt_err(dev,
> "map_device: Failed to configure device, err: %d\n",
> @@ -1643,13 +1631,17 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
> }
>
> rnbd_clt_info(dev,
> - "map_device: Device mapped as %s (nsectors: %zu, logical_block_size: %d, physical_block_size: %d, max_discard_sectors: %d, discard_granularity: %d, discard_alignment: %d, secure_discard: %d, max_segments: %d, max_hw_sectors: %d, wc: %d, fua: %d)\n",
> - dev->gd->disk_name, dev->nsectors,
> - dev->logical_block_size, dev->physical_block_size,
> - dev->max_discard_sectors,
> - dev->discard_granularity, dev->discard_alignment,
> - dev->secure_discard, dev->max_segments,
> - dev->max_hw_sectors, dev->wc, dev->fua);
> + "map_device: Device mapped as %s (nsectors: %llu, logical_block_size: %d, physical_block_size: %d, max_discard_sectors: %d, discard_granularity: %d, discard_alignment: %d, secure_discard: %d, max_segments: %d, max_hw_sectors: %d, wc: %d, fua: %d)\n",
> + dev->gd->disk_name, le64_to_cpu(rsp->nsectors),
> + le16_to_cpu(rsp->logical_block_size),
> + le16_to_cpu(rsp->physical_block_size),
> + le32_to_cpu(rsp->max_discard_sectors),
> + le32_to_cpu(rsp->discard_granularity),
> + le32_to_cpu(rsp->discard_alignment),
> + le16_to_cpu(rsp->secure_discard),
> + sess->max_segments, sess->max_io_size / SECTOR_SIZE,
> + !!(rsp->cache_policy & RNBD_WRITEBACK),
> + !!(rsp->cache_policy & RNBD_FUA));
>
> mutex_unlock(&dev->lock);
> kfree(rsp);
> diff --git a/drivers/block/rnbd/rnbd-clt.h b/drivers/block/rnbd/rnbd-clt.h
> index 26fb91d800e3..7520272541b1 100644
> --- a/drivers/block/rnbd/rnbd-clt.h
> +++ b/drivers/block/rnbd/rnbd-clt.h
> @@ -117,17 +117,6 @@ struct rnbd_clt_dev {
> char *pathname;
> enum rnbd_access_mode access_mode;
> u32 nr_poll_queues;
> - bool wc;
> - bool fua;
> - u32 max_hw_sectors;
> - u32 max_discard_sectors;
> - u32 discard_granularity;
> - u32 discard_alignment;
> - u16 secure_discard;
> - u16 physical_block_size;
> - u16 logical_block_size;
> - u16 max_segments;
> - size_t nsectors;
> u64 size; /* device size in bytes */
> struct list_head list;
> struct gendisk *gd;
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 5/6] rnbd-clt: adjust the layout of struct rnbd_clt_dev
2022-06-20 3:49 ` [RFC PATCH 5/6] rnbd-clt: adjust the layout " Guoqing Jiang
@ 2022-06-22 10:58 ` Jinpu Wang
0 siblings, 0 replies; 17+ messages in thread
From: Jinpu Wang @ 2022-06-22 10:58 UTC (permalink / raw)
To: Guoqing Jiang; +Cc: haris.iqbal, axboe, linux-block
On Mon, Jun 20, 2022 at 5:50 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>
> While at it, let re-arrange the struct to remove holes.
>
> Before, pahole reports
>
> /* size: 232, cachelines: 4, members: 17 */
> /* sum members: 224, holes: 2, sum holes: 8 */
> /* last cacheline: 40 bytes */
>
> After the change, the report changes to
>
> /* size: 224, cachelines: 4, members: 17 */
> /* last cacheline: 32 bytes */
>
> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
lgtm
Acked-by: Jack Wang <jinpu.wang@ionos.com>
> ---
> drivers/block/rnbd/rnbd-clt.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/block/rnbd/rnbd-clt.h b/drivers/block/rnbd/rnbd-clt.h
> index 7520272541b1..df237d2ea0d9 100644
> --- a/drivers/block/rnbd/rnbd-clt.h
> +++ b/drivers/block/rnbd/rnbd-clt.h
> @@ -106,6 +106,7 @@ struct rnbd_queue {
> };
>
> struct rnbd_clt_dev {
> + struct kobject kobj;
> struct rnbd_clt_session *sess;
> struct request_queue *queue;
> struct rnbd_queue *hw_queues;
> @@ -114,15 +115,14 @@ struct rnbd_clt_dev {
> u32 clt_device_id;
> struct mutex lock;
> enum rnbd_clt_dev_state dev_state;
> + refcount_t refcount;
> char *pathname;
> enum rnbd_access_mode access_mode;
> u32 nr_poll_queues;
> u64 size; /* device size in bytes */
> struct list_head list;
> struct gendisk *gd;
> - struct kobject kobj;
> char *blk_symlink_name;
> - refcount_t refcount;
> struct work_struct unmap_on_rmmod_work;
> };
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 6/6] rnbd-clt: refactor rnbd_clt_change_capacity
2022-06-22 10:57 ` Jinpu Wang
@ 2022-06-22 11:12 ` Guoqing Jiang
0 siblings, 0 replies; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-22 11:12 UTC (permalink / raw)
To: Jinpu Wang; +Cc: haris.iqbal, axboe, linux-block
On 6/22/22 6:57 PM, Jinpu Wang wrote:
> On Mon, Jun 20, 2022 at 5:50 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>> 1. process_msg_open_rsp checks if capacity changed or not before call
>> rnbd_clt_change_capacity while the checking also make sense for
>> rnbd_clt_resize_dev_store, let's move the checking into the function.
>>
>> 2. change the parameter type to 'sector_t' then we don't need to cast
>> it from rnbd_clt_resize_dev_store, and update rnbd_clt_resize_disk too.
>>
>> 3. no need to checking the return value, make it return void.
>>
> better to split this into 3 patches.
Will do.
>> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
>> ---
>> drivers/block/rnbd/rnbd-clt-sysfs.c | 2 +-
>> drivers/block/rnbd/rnbd-clt.c | 24 ++++++++++++------------
>> drivers/block/rnbd/rnbd-clt.h | 2 +-
>> 3 files changed, 14 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/block/rnbd/rnbd-clt-sysfs.c b/drivers/block/rnbd/rnbd-clt-sysfs.c
>> index 2be5d87a3ca6..e7c7d9a68168 100644
>> --- a/drivers/block/rnbd/rnbd-clt-sysfs.c
>> +++ b/drivers/block/rnbd/rnbd-clt-sysfs.c
>> @@ -376,7 +376,7 @@ static ssize_t rnbd_clt_resize_dev_store(struct kobject *kobj,
>> if (ret)
>> return ret;
>>
>> - ret = rnbd_clt_resize_disk(dev, (size_t)sectors);
>> + ret = rnbd_clt_resize_disk(dev, sectors);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
>> index 2c63cd5ac09d..6c6c4ba3d41d 100644
>> --- a/drivers/block/rnbd/rnbd-clt.c
>> +++ b/drivers/block/rnbd/rnbd-clt.c
>> @@ -68,13 +68,18 @@ static inline bool rnbd_clt_get_dev(struct rnbd_clt_dev *dev)
>> return refcount_inc_not_zero(&dev->refcount);
>> }
>>
>> -static int rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
>> - size_t new_nsectors)
>> +static void rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
>> + sector_t new_nsectors)
>> {
>> - rnbd_clt_info(dev, "Device size changed from %llu to %zu sectors\n",
>> + if (get_capacity(dev->gd) != new_nsectors)
>> + return;
> This change is broken, it leads to resize no longer work, should be "=="
Yes, thanks for catch it.
Thanks,
Guoqing
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 1/6] rnbd-clt: open code send_msg_open in rnbd_clt_map_device
2022-06-21 15:11 ` Jinpu Wang
@ 2022-06-22 11:14 ` Guoqing Jiang
0 siblings, 0 replies; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-22 11:14 UTC (permalink / raw)
To: Jinpu Wang; +Cc: haris.iqbal, axboe, linux-block
On 6/21/22 11:11 PM, Jinpu Wang wrote:
> On Mon, Jun 20, 2022 at 5:49 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>> Let's open code it in rnbd_clt_map_device, then we can use information
>> from rsp to setup gendisk and request_queue in next commits. After that,
>> we can remove some members (wc, fua and max_hw_sectors etc) from struct
>> rnbd_clt_dev.
>>
>> Signed-off-by: Guoqing Jiang <guoqing.jiang@linux.dev>
>> ---
>> drivers/block/rnbd/rnbd-clt.c | 44 +++++++++++++++++++++++++++++++++--
>> 1 file changed, 42 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c
>> index 409c76b81aed..0396532da742 100644
>> --- a/drivers/block/rnbd/rnbd-clt.c
>> +++ b/drivers/block/rnbd/rnbd-clt.c
>> @@ -1562,7 +1562,14 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
>> {
>> struct rnbd_clt_session *sess;
>> struct rnbd_clt_dev *dev;
>> - int ret;
>> + int ret, errno;
>> + struct rnbd_msg_open_rsp *rsp;
>> + struct rnbd_msg_open msg;
>> + struct rnbd_iu *iu;
>> + struct kvec vec = {
>> + .iov_base = &msg,
>> + .iov_len = sizeof(msg)
>> + };
>>
>> if (exists_devpath(pathname, sessname))
>> return ERR_PTR(-EEXIST);
>> @@ -1582,13 +1589,46 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
>> ret = -EEXIST;
>> goto put_dev;
>> }
>> - ret = send_msg_open(dev, RTRS_PERMIT_WAIT);
>> +
>> + rsp = kzalloc(sizeof(*rsp), GFP_KERNEL);
>> + if (!rsp) {
>> + ret = -ENOMEM;
>> + goto del_dev;
>> + }
>> +
>> + iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT);
>> + if (!iu) {
>> + ret = -ENOMEM;
>> + kfree(rsp);
>> + goto del_dev;
>> + }
>> + iu->buf = rsp;
>> + iu->dev = dev;
>> + sg_init_one(iu->sgt.sgl, rsp, sizeof(*rsp));
>> +
>> + msg.hdr.type = cpu_to_le16(RNBD_MSG_OPEN);
>> + msg.access_mode = dev->access_mode;
>> + strscpy(msg.dev_name, dev->pathname, sizeof(msg.dev_name));
>> +
>> + WARN_ON(!rnbd_clt_get_dev(dev));
>> + ret = send_usr_msg(sess->rtrs, READ, iu,
>> + &vec, sizeof(*rsp), iu->sgt.sgl, 1,
>> + msg_open_conf, &errno, RTRS_PERMIT_WAIT);
>> + if (ret) {
>> + rnbd_clt_put_dev(dev);
>> + rnbd_put_iu(sess, iu);
>> + kfree(rsp);
>> + } else {
>> + ret = errno;
>> + }
>> + rnbd_put_iu(sess, iu);
>> if (ret) {
>> rnbd_clt_err(dev,
>> "map_device: failed, can't open remote device, err: %d\n",
>> ret);
>> goto del_dev;
>> }
>> +
> looks ok, except this new line seems not needed.
Will remove it in next version.
Thanks,
Guoqing
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 0/6] reduce the size of rnbd_clt_dev
2022-06-21 12:16 ` [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Jinpu Wang
@ 2022-06-22 11:15 ` Guoqing Jiang
0 siblings, 0 replies; 17+ messages in thread
From: Guoqing Jiang @ 2022-06-22 11:15 UTC (permalink / raw)
To: Jinpu Wang; +Cc: haris.iqbal, axboe, linux-block
Hi Jinpu,
On 6/21/22 8:16 PM, Jinpu Wang wrote:
> On Mon, Jun 20, 2022 at 5:49 AM Guoqing Jiang <guoqing.jiang@linux.dev> wrote:
>> Hi,
>>
>> The struct rnbd_clt_dev added some members (wc, fua and max_hw_sectors
>> etc) which are used to set up gendisk and request_queue, but seems only
>> map scenario need to setup them since rnbd_client_setup_device is not
>> called from remap path.
>>
>> Previously, pahole reports.
>>
>> /* size: 272, cachelines: 5, members: 29 */
>> /* sum members: 259, holes: 4, sum holes: 13 */
>> /* last cacheline: 16 bytes */
>>
>> After the series, it changes to
>> t
>> /* last cacheline: 32 bytes */
>>
>> Please review.
>>
>> Thanks,
>> Guoqing
> Hi Guoqing,
>
> Thanks for the patchset, I had a brief look, in general I like the
> idea, will run a regression test. and sort out the details.
>
Thanks for the review!
Thanks,
Guoqing
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2022-06-22 11:15 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-20 3:49 [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Guoqing Jiang
2022-06-20 3:49 ` [RFC PATCH 1/6] rnbd-clt: open code send_msg_open in rnbd_clt_map_device Guoqing Jiang
2022-06-21 15:11 ` Jinpu Wang
2022-06-22 11:14 ` Guoqing Jiang
2022-06-20 3:49 ` [RFC PATCH 2/6] rnbd-clt: don't free rsp in msg_open_conf for map scenario Guoqing Jiang
2022-06-22 10:57 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 3/6] rnbd-clt: kill read_only from struct rnbd_clt_dev Guoqing Jiang
2022-06-22 10:57 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 4/6] rnbd-clt: reduce the size of " Guoqing Jiang
2022-06-22 10:58 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 5/6] rnbd-clt: adjust the layout " Guoqing Jiang
2022-06-22 10:58 ` Jinpu Wang
2022-06-20 3:49 ` [RFC PATCH 6/6] rnbd-clt: refactor rnbd_clt_change_capacity Guoqing Jiang
2022-06-22 10:57 ` Jinpu Wang
2022-06-22 11:12 ` Guoqing Jiang
2022-06-21 12:16 ` [RFC PATCH 0/6] reduce the size of rnbd_clt_dev Jinpu Wang
2022-06-22 11:15 ` Guoqing Jiang
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.