* [PATCH 0/3] null_blk: documentation, refactor and warning
@ 2013-12-18 12:41 Matias Bjorling
2013-12-18 12:41 ` [PATCH 1/3] null_blk: documentation Matias Bjorling
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Matias Bjorling @ 2013-12-18 12:41 UTC (permalink / raw)
To: axboe; +Cc: linux-kernel, Matias Bjorling
Hi Jens,
I took the liberty to write up some documentation for the blk_null driver.
Additionally, factored the init code paths to use the standard error return
codes. Shuffled some code to aid sharing between the block-layer instantiations.
And at last added a warning when submit_queues parameter is ignored.
Thanks,
Matias
Matias Bjorling (3):
null_blk: documentation
null_blk: refactor init and init errors code paths
null_blk: warning on ignored submit_queues param
Documentation/block/null_blk.txt | 71 ++++++++++++++++++++++++++++++++++++++++
drivers/block/null_blk.c | 66 +++++++++++++++++++++++--------------
2 files changed, 112 insertions(+), 25 deletions(-)
create mode 100644 Documentation/block/null_blk.txt
--
1.8.3.2
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] null_blk: documentation
2013-12-18 12:41 [PATCH 0/3] null_blk: documentation, refactor and warning Matias Bjorling
@ 2013-12-18 12:41 ` Matias Bjorling
2013-12-19 1:06 ` Randy Dunlap
2013-12-18 12:41 ` [PATCH 2/3] null_blk: refactor init and init errors code paths Matias Bjorling
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Matias Bjorling @ 2013-12-18 12:41 UTC (permalink / raw)
To: axboe; +Cc: linux-kernel, Matias Bjorling
Add description of module and its parameters.
Signed-off-by: Matias Bjorling <m@bjorling.me>
---
Documentation/block/null_blk.txt | 71 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
create mode 100644 Documentation/block/null_blk.txt
diff --git a/Documentation/block/null_blk.txt b/Documentation/block/null_blk.txt
new file mode 100644
index 0000000..9e1b047
--- /dev/null
+++ b/Documentation/block/null_blk.txt
@@ -0,0 +1,71 @@
+Null block device driver
+================================================================================
+
+I. Overview
+
+The null block device (/dev/nullb*) is used for benchmarking the various
+block-layer implementations. It emulates a block device of X gigabytes in size.
+The following instances are possible:
+
+ Single-queue block-layer
+ - Request-based.
+ - Single submission queue per device.
+ - Implements IO scheduling algorithms (CFQ, Deadline, noop).
+ Multi-queue block-layer
+ - Request-based.
+ - Configurable submission queues per device.
+ No block-layer (Known as bio-based)
+ - Bio-based. IO requests are submitted directly to the device driver.
+ - Directly accepts bio data structure and returns them.
+
+All of them has a completion queue for each core in the system.
+
+II. Module parameters applicable for all instances:
+
+queue_mode=[0-2]: Default: 2-Multi-queue
+ Selects which block-layer the module should instantiate with.
+
+ 0: Bio-based.
+ 1: Single-queue.
+ 2: Multi-queue.
+
+home_node=[0--nr_nodes]: Default: NUMA_NO_NODE
+ Selects what socket the data structures is allocated from.
+
+gb=[Size in GB]: Default: 250GB
+ The size of the device reported to the system.
+
+bs=[Block size (in bytes)]: Default: 512 bytes
+ The block size reported to the system.
+
+nr_devices=[Num. devices]: Default: 2
+ Number of block devices instantiated. They are instantiated as /dev/nullb0,
+ etc.
+
+irq_mode=[0-2]: Default: Soft-irq
+ The completion mode used for completing IOs to the block-layer.
+
+ 0: None.
+ 1: Soft-irq. Uses ipi to complete IOs across sockets. Simulates the overhead
+ when IOs are issued from another socket than the home the device is
+ connected to.
+ 2: Timer: Waits a specific period (completion_nsec) for each IO before
+ completion.
+
+completion_nsec=[Num. ns]: Default: 10.000ns
+ Combined with irq_mode=2 (timer). The time each completion event must wait.
+
+submit_queues=[0..nr_cpus]:
+ The number of submission queues attached to the device driver. If unset, it
+ defaults to 1 on single-queue and bio-based instances. For multi-queue,
+ its ignored when use_per_node_hctx module parameter is 1.
+
+hw_queue_depth=[0..qdepth]: Defaults: 64
+ The hardware queue depth of the device.
+
+III: Multi-queue specific parameters
+
+use_per_node_hctx=[0/1]: Defaults: 1
+ If 1, the multi-queue block layer is instantiated with a hardware dispatch
+ queue for each CPU node in the system. If 0, it is instantiated with the
+ number of queues defined in the submit_queues parameter.
--
1.8.3.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] null_blk: refactor init and init errors code paths
2013-12-18 12:41 [PATCH 0/3] null_blk: documentation, refactor and warning Matias Bjorling
2013-12-18 12:41 ` [PATCH 1/3] null_blk: documentation Matias Bjorling
@ 2013-12-18 12:41 ` Matias Bjorling
2013-12-18 12:41 ` [PATCH 3/3] null_blk: warning on ignored submit_queues param Matias Bjorling
2013-12-19 15:10 ` [PATCH 0/3] null_blk: documentation, refactor and warning Jens Axboe
3 siblings, 0 replies; 6+ messages in thread
From: Matias Bjorling @ 2013-12-18 12:41 UTC (permalink / raw)
To: axboe; +Cc: linux-kernel, Matias Bjorling
Simplify the initialization logic of the three block-layers.
- The queue initialization is split into two parts. This allows reuse of
code when initializing the sq-, bio- and mq-based layers.
- Set submit_queues default value to 0 and always set it at init time.
- Simplify the init error code paths.
Signed-off-by: Matias Bjorling <m@bjorling.me>
---
drivers/block/null_blk.c | 63 +++++++++++++++++++++++++++++-------------------
1 file changed, 38 insertions(+), 25 deletions(-)
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index f370fc1..f0aeb2a 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -65,7 +65,7 @@ enum {
NULL_Q_MQ = 2,
};
-static int submit_queues = 1;
+static int submit_queues;
module_param(submit_queues, int, S_IRUGO);
MODULE_PARM_DESC(submit_queues, "Number of submission queues");
@@ -355,16 +355,24 @@ static void null_free_hctx(struct blk_mq_hw_ctx *hctx, unsigned int hctx_index)
kfree(hctx);
}
+static void null_init_queue(struct nullb *nullb, struct nullb_queue *nq)
+{
+ BUG_ON(!nullb);
+ BUG_ON(!nq);
+
+ init_waitqueue_head(&nq->wait);
+ nq->queue_depth = nullb->queue_depth;
+}
+
static int null_init_hctx(struct blk_mq_hw_ctx *hctx, void *data,
unsigned int index)
{
struct nullb *nullb = data;
struct nullb_queue *nq = &nullb->queues[index];
- init_waitqueue_head(&nq->wait);
- nq->queue_depth = nullb->queue_depth;
- nullb->nr_queues++;
hctx->driver_data = nq;
+ null_init_queue(nullb, nq);
+ nullb->nr_queues++;
return 0;
}
@@ -417,13 +425,13 @@ static int setup_commands(struct nullb_queue *nq)
nq->cmds = kzalloc(nq->queue_depth * sizeof(*cmd), GFP_KERNEL);
if (!nq->cmds)
- return 1;
+ return -ENOMEM;
tag_size = ALIGN(nq->queue_depth, BITS_PER_LONG) / BITS_PER_LONG;
nq->tag_map = kzalloc(tag_size * sizeof(unsigned long), GFP_KERNEL);
if (!nq->tag_map) {
kfree(nq->cmds);
- return 1;
+ return -ENOMEM;
}
for (i = 0; i < nq->queue_depth; i++) {
@@ -454,33 +462,37 @@ static void cleanup_queues(struct nullb *nullb)
static int setup_queues(struct nullb *nullb)
{
- struct nullb_queue *nq;
- int i;
-
- nullb->queues = kzalloc(submit_queues * sizeof(*nq), GFP_KERNEL);
+ nullb->queues = kzalloc(submit_queues * sizeof(struct nullb_queue),
+ GFP_KERNEL);
if (!nullb->queues)
- return 1;
+ return -ENOMEM;
nullb->nr_queues = 0;
nullb->queue_depth = hw_queue_depth;
- if (queue_mode == NULL_Q_MQ)
- return 0;
+ return 0;
+}
+
+static int init_driver_queues(struct nullb *nullb)
+{
+ struct nullb_queue *nq;
+ int i, ret = 0;
for (i = 0; i < submit_queues; i++) {
nq = &nullb->queues[i];
- init_waitqueue_head(&nq->wait);
- nq->queue_depth = hw_queue_depth;
- if (setup_commands(nq))
- break;
+
+ null_init_queue(nullb, nq);
+
+ ret = setup_commands(nq);
+ if (ret)
+ goto err_queue;
nullb->nr_queues++;
}
- if (i == submit_queues)
- return 0;
-
+ return 0;
+err_queue:
cleanup_queues(nullb);
- return 1;
+ return ret;
}
static int null_add_dev(void)
@@ -495,9 +507,6 @@ static int null_add_dev(void)
spin_lock_init(&nullb->lock);
- if (queue_mode == NULL_Q_MQ && use_per_node_hctx)
- submit_queues = nr_online_nodes;
-
if (setup_queues(nullb))
goto err;
@@ -518,11 +527,13 @@ static int null_add_dev(void)
} else if (queue_mode == NULL_Q_BIO) {
nullb->q = blk_alloc_queue_node(GFP_KERNEL, home_node);
blk_queue_make_request(nullb->q, null_queue_bio);
+ init_driver_queues(nullb);
} else {
nullb->q = blk_init_queue_node(null_request_fn, &nullb->lock, home_node);
blk_queue_prep_rq(nullb->q, null_rq_prep_fn);
if (nullb->q)
blk_queue_softirq_done(nullb->q, null_softirq_done_fn);
+ init_driver_queues(nullb);
}
if (!nullb->q)
@@ -579,7 +590,9 @@ static int __init null_init(void)
}
#endif
- if (submit_queues > nr_cpu_ids)
+ if (queue_mode == NULL_Q_MQ && use_per_node_hctx)
+ submit_queues = nr_online_nodes;
+ else if (submit_queues > nr_cpu_ids)
submit_queues = nr_cpu_ids;
else if (!submit_queues)
submit_queues = 1;
--
1.8.3.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] null_blk: warning on ignored submit_queues param
2013-12-18 12:41 [PATCH 0/3] null_blk: documentation, refactor and warning Matias Bjorling
2013-12-18 12:41 ` [PATCH 1/3] null_blk: documentation Matias Bjorling
2013-12-18 12:41 ` [PATCH 2/3] null_blk: refactor init and init errors code paths Matias Bjorling
@ 2013-12-18 12:41 ` Matias Bjorling
2013-12-19 15:10 ` [PATCH 0/3] null_blk: documentation, refactor and warning Jens Axboe
3 siblings, 0 replies; 6+ messages in thread
From: Matias Bjorling @ 2013-12-18 12:41 UTC (permalink / raw)
To: axboe; +Cc: linux-kernel, Matias Bjorling
Let the user know when the number of submission queues are being
ignored.
Signed-off-by: Matias Bjorling <m@bjorling.me>
---
drivers/block/null_blk.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index f0aeb2a..8f2e7c3 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -590,9 +590,12 @@ static int __init null_init(void)
}
#endif
- if (queue_mode == NULL_Q_MQ && use_per_node_hctx)
+ if (queue_mode == NULL_Q_MQ && use_per_node_hctx) {
+ if (submit_queues > 0)
+ pr_warn("null_blk: submit_queues param is set to %u.",
+ nr_online_nodes);
submit_queues = nr_online_nodes;
- else if (submit_queues > nr_cpu_ids)
+ } else if (submit_queues > nr_cpu_ids)
submit_queues = nr_cpu_ids;
else if (!submit_queues)
submit_queues = 1;
--
1.8.3.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] null_blk: documentation
2013-12-18 12:41 ` [PATCH 1/3] null_blk: documentation Matias Bjorling
@ 2013-12-19 1:06 ` Randy Dunlap
0 siblings, 0 replies; 6+ messages in thread
From: Randy Dunlap @ 2013-12-19 1:06 UTC (permalink / raw)
To: Matias Bjorling, axboe; +Cc: linux-kernel
On 12/18/13 04:41, Matias Bjorling wrote:
> Add description of module and its parameters.
>
> Signed-off-by: Matias Bjorling <m@bjorling.me>
> ---
> Documentation/block/null_blk.txt | 71 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 71 insertions(+)
> create mode 100644 Documentation/block/null_blk.txt
>
> diff --git a/Documentation/block/null_blk.txt b/Documentation/block/null_blk.txt
> new file mode 100644
> index 0000000..9e1b047
> --- /dev/null
> +++ b/Documentation/block/null_blk.txt
> @@ -0,0 +1,71 @@
> +Null block device driver
> +================================================================================
> +
> +I. Overview
> +
> +The null block device (/dev/nullb*) is used for benchmarking the various
> +block-layer implementations. It emulates a block device of X gigabytes in size.
> +The following instances are possible:
> +
> + Single-queue block-layer
> + - Request-based.
> + - Single submission queue per device.
> + - Implements IO scheduling algorithms (CFQ, Deadline, noop).
> + Multi-queue block-layer
> + - Request-based.
> + - Configurable submission queues per device.
> + No block-layer (Known as bio-based)
> + - Bio-based. IO requests are submitted directly to the device driver.
> + - Directly accepts bio data structure and returns them.
> +
> +All of them has a completion queue for each core in the system.
have
The text sometimes uses "core" vs. "socket" vs. "cpu(s)".
Did you double-check all of these uses? Thanks.
> +
> +II. Module parameters applicable for all instances:
> +
> +queue_mode=[0-2]: Default: 2-Multi-queue
> + Selects which block-layer the module should instantiate with.
> +
> + 0: Bio-based.
> + 1: Single-queue.
> + 2: Multi-queue.
> +
> +home_node=[0--nr_nodes]: Default: NUMA_NO_NODE
> + Selects what socket the data structures is allocated from.
are
> +
> +gb=[Size in GB]: Default: 250GB
> + The size of the device reported to the system.
> +
> +bs=[Block size (in bytes)]: Default: 512 bytes
> + The block size reported to the system.
> +
> +nr_devices=[Num. devices]: Default: 2
Number
> + Number of block devices instantiated. They are instantiated as /dev/nullb0,
> + etc.
> +
> +irq_mode=[0-2]: Default: Soft-irq
Default: 1-Soft-irq
> + The completion mode used for completing IOs to the block-layer.
> +
> + 0: None.
> + 1: Soft-irq. Uses ipi to complete IOs across sockets. Simulates the overhead
IPI
> + when IOs are issued from another socket than the home the device is
> + connected to.
> + 2: Timer: Waits a specific period (completion_nsec) for each IO before
> + completion.
> +
> +completion_nsec=[Num. ns]: Default: 10.000ns
Number
> + Combined with irq_mode=2 (timer). The time each completion event must wait.
> +
> +submit_queues=[0..nr_cpus]:
> + The number of submission queues attached to the device driver. If unset, it
> + defaults to 1 on single-queue and bio-based instances. For multi-queue,
> + its ignored when use_per_node_hctx module parameter is 1.
it is
> +
> +hw_queue_depth=[0..qdepth]: Defaults: 64
Default:
> + The hardware queue depth of the device.
> +
> +III: Multi-queue specific parameters
> +
> +use_per_node_hctx=[0/1]: Defaults: 1
Default:
> + If 1, the multi-queue block layer is instantiated with a hardware dispatch
> + queue for each CPU node in the system. If 0, it is instantiated with the
> + number of queues defined in the submit_queues parameter.
>
--
~Randy
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 0/3] null_blk: documentation, refactor and warning
2013-12-18 12:41 [PATCH 0/3] null_blk: documentation, refactor and warning Matias Bjorling
` (2 preceding siblings ...)
2013-12-18 12:41 ` [PATCH 3/3] null_blk: warning on ignored submit_queues param Matias Bjorling
@ 2013-12-19 15:10 ` Jens Axboe
3 siblings, 0 replies; 6+ messages in thread
From: Jens Axboe @ 2013-12-19 15:10 UTC (permalink / raw)
To: Matias Bjorling; +Cc: linux-kernel
On Wed, Dec 18 2013, Matias Bjorling wrote:
> Hi Jens,
>
> I took the liberty to write up some documentation for the blk_null driver.
>
> Additionally, factored the init code paths to use the standard error return
> codes. Shuffled some code to aid sharing between the block-layer instantiations.
> And at last added a warning when submit_queues parameter is ignored.
Thanks Matias, applied! We still need a patch to not default to per-node
hctx, though. And to be more clever when submit_queues is given and
per-node is true.
--
Jens Axboe
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-12-19 15:11 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-18 12:41 [PATCH 0/3] null_blk: documentation, refactor and warning Matias Bjorling
2013-12-18 12:41 ` [PATCH 1/3] null_blk: documentation Matias Bjorling
2013-12-19 1:06 ` Randy Dunlap
2013-12-18 12:41 ` [PATCH 2/3] null_blk: refactor init and init errors code paths Matias Bjorling
2013-12-18 12:41 ` [PATCH 3/3] null_blk: warning on ignored submit_queues param Matias Bjorling
2013-12-19 15:10 ` [PATCH 0/3] null_blk: documentation, refactor and warning Jens Axboe
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.