* [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
* 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
* [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 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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox