blk-mq-sched: scheduler support and cleanups
v2 cover blk-mq-sched: scheduler support and cleanups
From: Omar Sandoval <[email protected]>
This series makes several enhancements to blk-mq-debugfs. v2 adds patches 3, 4, and 5. It also exports a couple of symbols needed in patches 11 and 12.
- Patch 1 is a subjective change.
- Patch 2 is a cleanup.
- Patches 3 and 4 are minor tweaks to the queue "state" attribute.
- Patch 5 renames the hardware queue directories.
- Patch 6 cleans up a bunch of seq_file boilerplate.
- Patch 7 is Bart's patch from a couple of weeks ago, necessitated by patch 9.
- Patch 8 is preparation cleanup for patches 9-12.
- Patch 9 reworks the lifetimes of the debugfs attributes to be tied to the structure lifetimes themselves rather being duct taped on to sysfs. This is what I should have done in the first place, and would have also been a way to fix the same thing we fixed in e869b5462f83 ("blk-mq: Unregister debugfs attributes earlier"), but I didn't think of doing it this way until I started adding scheduler support.
- Patch 10 allows schedulers to register debugfs attributes, implemented in patches 11 and 12 for kyber and mq-deadline, respectively.
Bart Van Assche (1):
blk-mq: Do not invoke queue operations on a dead queue
Omar Sandoval (11):
blk-mq-debugfs: separate flags with |
blk-mq-debugfs: clean up flag definitions
blk-mq-debugfs: error on long write to queue "state" file
blk-mq-debugfs: don't open code strstrip()
blk-mq-debugfs: rename hw queue directories from <n> to hctx<n>
blk-mq-debugfs: get rid of a bunch of boilerplate
blk-mq: move debugfs declarations to a separate header file
blk-mq: untangle debugfs and sysfs
blk-mq-debugfs: allow schedulers to register debugfs attributes
kyber: add debugfs attributes
mq-deadline: add debugfs attributes
block/blk-core.c | 8 +- block/blk-mq-debugfs.c | 870 +++++++++++++++++++++-------------------------- block/blk-mq-debugfs.h | 79 +++++ block/blk-mq-sched.c | 24 +- block/blk-mq-sysfs.c | 10 - block/blk-mq.c | 7 + block/blk-mq.h | 28 -- block/blk-sysfs.c | 3 + block/kyber-iosched.c | 130 +++++++ block/mq-deadline.c | 123 +++++++ include/linux/blk-mq.h | 5 + include/linux/blkdev.h | 2 +- include/linux/elevator.h | 7 + 13 files changed, 764 insertions(+), 532 deletions(-) create mode 100644 block/blk-mq-debugfs.h
Signature · 1 line
2.12.2
PATCH v2 1/12 blk-mq-debugfs: separate flags with |
From: Omar Sandoval <[email protected]>
This reads more naturally than spaces.
--- block/blk-mq-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/blk-mq-debugfs.c +1 -1
@@ -53,7 +53,7 @@ static int blk_flags_show(struct seq_file *m, const unsigned long flags,if (!(flags &BIT (i)))continue ;if (sep) -seq_puts (m," " ); +seq_puts (m,"|" ); sep = true;if (i < flag_name_count && flag_name[i])seq_puts (m, flag_name[i]);
Signature · 1 line
2.12.2
Re: [PATCH v2 01/12] blk-mq-debugfs: separate flags with |
Quoted 9 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
This reads more naturally than spaces.
Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
PATCH v2 2/12 blk-mq-debugfs: clean up flag definitions
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
Make sure the spelled out flag names match the definition. This also adds a missing hctx state, BLK_MQ_S_START_ON_RUN, and a missing cmd_flag, __REQ_NOUNMAP.
--- block/blk-mq-debugfs.c | 201 ++++++++++++++++++++++++++----------------------- 1 file changed, 108 insertions(+), 93 deletions(-)
block/blk-mq-debugfs.c +108 -93
@@ -63,37 +63,39 @@ static int blk_flags_show(struct seq_file *m, const unsigned long flags,return 0 ; } +#define QUEUE_FLAG_NAME (name) [QUEUE_FLAG_##name] = #namestatic const char *const blk_queue_flag_name[] = { - [QUEUE_FLAG_QUEUED ] ="QUEUED" , - [QUEUE_FLAG_STOPPED ] ="STOPPED" , - [QUEUE_FLAG_SYNCFULL ] ="SYNCFULL" , - [QUEUE_FLAG_ASYNCFULL ] ="ASYNCFULL" , - [QUEUE_FLAG_DYING ] ="DYING" , - [QUEUE_FLAG_BYPASS ] ="BYPASS" , - [QUEUE_FLAG_BIDI ] ="BIDI" , - [QUEUE_FLAG_NOMERGES ] ="NOMERGES" , - [QUEUE_FLAG_SAME_COMP ] ="SAME_COMP" , - [QUEUE_FLAG_FAIL_IO ] ="FAIL_IO" , - [QUEUE_FLAG_STACKABLE ] ="STACKABLE" , - [QUEUE_FLAG_NONROT ] ="NONROT" , - [QUEUE_FLAG_IO_STAT ] ="IO_STAT" , - [QUEUE_FLAG_DISCARD ] ="DISCARD" , - [QUEUE_FLAG_NOXMERGES ] ="NOXMERGES" , - [QUEUE_FLAG_ADD_RANDOM ] ="ADD_RANDOM" , - [QUEUE_FLAG_SECERASE ] ="SECERASE" , - [QUEUE_FLAG_SAME_FORCE ] ="SAME_FORCE" , - [QUEUE_FLAG_DEAD ] ="DEAD" , - [QUEUE_FLAG_INIT_DONE ] ="INIT_DONE" , - [QUEUE_FLAG_NO_SG_MERGE ] ="NO_SG_MERGE" , - [QUEUE_FLAG_POLL ] ="POLL" , - [QUEUE_FLAG_WC ] ="WC" , - [QUEUE_FLAG_FUA ] ="FUA" , - [QUEUE_FLAG_FLUSH_NQ ] ="FLUSH_NQ" , - [QUEUE_FLAG_DAX ] ="DAX" , - [QUEUE_FLAG_STATS ] ="STATS" , - [QUEUE_FLAG_POLL_STATS ] ="POLL_STATS" , - [QUEUE_FLAG_REGISTERED ] ="REGISTERED" , -}; +QUEUE_FLAG_NAME (QUEUED ), +QUEUE_FLAG_NAME (STOPPED ), +QUEUE_FLAG_NAME (SYNCFULL ), +QUEUE_FLAG_NAME (ASYNCFULL ), +QUEUE_FLAG_NAME (DYING ), +QUEUE_FLAG_NAME (BYPASS ), +QUEUE_FLAG_NAME (BIDI ), +QUEUE_FLAG_NAME (NOMERGES ), +QUEUE_FLAG_NAME (SAME_COMP ), +QUEUE_FLAG_NAME (FAIL_IO ), +QUEUE_FLAG_NAME (STACKABLE ), +QUEUE_FLAG_NAME (NONROT ), +QUEUE_FLAG_NAME (IO_STAT ), +QUEUE_FLAG_NAME (DISCARD ), +QUEUE_FLAG_NAME (NOXMERGES ), +QUEUE_FLAG_NAME (ADD_RANDOM ), +QUEUE_FLAG_NAME (SECERASE ), +QUEUE_FLAG_NAME (SAME_FORCE ), +QUEUE_FLAG_NAME (DEAD ), +QUEUE_FLAG_NAME (INIT_DONE ), +QUEUE_FLAG_NAME (NO_SG_MERGE ), +QUEUE_FLAG_NAME (POLL ), +QUEUE_FLAG_NAME (WC ), +QUEUE_FLAG_NAME (FUA ), +QUEUE_FLAG_NAME (FLUSH_NQ ), +QUEUE_FLAG_NAME (DAX ), +QUEUE_FLAG_NAME (STATS ), +QUEUE_FLAG_NAME (POLL_STATS ), +QUEUE_FLAG_NAME (REGISTERED ), +}; +#undef QUEUE_FLAG_NAMEstatic int blk_queue_flags_show (struct seq_file *m,void *v) {
@@ -180,13 +182,16 @@ static const struct file_operations queue_poll_stat_fops = { .release = single_release, }; +#define HCTX_STATE_NAME (name) [BLK_MQ_S_##name] = #namestatic const char *const hctx_state_name[] = { - [BLK_MQ_S_STOPPED ] ="STOPPED" , - [BLK_MQ_S_TAG_ACTIVE ] ="TAG_ACTIVE" , - [BLK_MQ_S_SCHED_RESTART ] ="SCHED_RESTART" , - [BLK_MQ_S_TAG_WAITING ] ="TAG_WAITING" , - +HCTX_STATE_NAME (STOPPED ), +HCTX_STATE_NAME (TAG_ACTIVE ), +HCTX_STATE_NAME (SCHED_RESTART ), +HCTX_STATE_NAME (TAG_WAITING ), +HCTX_STATE_NAME (START_ON_RUN ), }; +#undef HCTX_STATE_NAME +static int hctx_state_show (struct seq_file *m,void *v) {struct blk_mq_hw_ctx *hctx = m->private;
@@ -209,18 +214,22 @@ static const struct file_operations hctx_state_fops = { .release = single_release, }; +#define BLK_TAG_ALLOC_NAME (name) [BLK_TAG_ALLOC_##name] = #namestatic const char *const alloc_policy_name[] = { - [BLK_TAG_ALLOC_FIFO ] ="fifo" , - [BLK_TAG_ALLOC_RR ] ="rr" , +BLK_TAG_ALLOC_NAME (FIFO ), +BLK_TAG_ALLOC_NAME (RR ), }; +#undef BLK_TAG_ALLOC_NAME +#define HCTX_FLAG_NAME (name) [ilog2(BLK_MQ_F_##name)] = #namestatic const char *const hctx_flag_name[] = { - [ilog2 (BLK_MQ_F_SHOULD_MERGE )] ="SHOULD_MERGE" , - [ilog2 (BLK_MQ_F_TAG_SHARED )] ="TAG_SHARED" , - [ilog2 (BLK_MQ_F_SG_MERGE )] ="SG_MERGE" , - [ilog2 (BLK_MQ_F_BLOCKING )] ="BLOCKING" , - [ilog2 (BLK_MQ_F_NO_SCHED )] ="NO_SCHED" , +HCTX_FLAG_NAME (SHOULD_MERGE ), +HCTX_FLAG_NAME (TAG_SHARED ), +HCTX_FLAG_NAME (SG_MERGE ), +HCTX_FLAG_NAME (BLOCKING ), +HCTX_FLAG_NAME (NO_SCHED ), }; +#undef HCTX_FLAG_NAMEstatic int hctx_flags_show (struct seq_file *m,void *v) {
@@ -253,60 +262,66 @@ static const struct file_operations hctx_flags_fops = { .release = single_release, }; +#define REQ_OP_NAME (name) [REQ_OP_##name] = #namestatic const char *const op_name[] = { - [REQ_OP_READ ] ="READ" , - [REQ_OP_WRITE ] ="WRITE" , - [REQ_OP_FLUSH ] ="FLUSH" , - [REQ_OP_DISCARD ] ="DISCARD" , - [REQ_OP_ZONE_REPORT ] ="ZONE_REPORT" , - [REQ_OP_SECURE_ERASE ] ="SECURE_ERASE" , - [REQ_OP_ZONE_RESET ] ="ZONE_RESET" , - [REQ_OP_WRITE_SAME ] ="WRITE_SAME" , - [REQ_OP_WRITE_ZEROES ] ="WRITE_ZEROES" , - [REQ_OP_SCSI_IN ] ="SCSI_IN" , - [REQ_OP_SCSI_OUT ] ="SCSI_OUT" , - [REQ_OP_DRV_IN ] ="DRV_IN" , - [REQ_OP_DRV_OUT ] ="DRV_OUT" , -}; - +REQ_OP_NAME (READ ), +REQ_OP_NAME (WRITE ), +REQ_OP_NAME (FLUSH ), +REQ_OP_NAME (DISCARD ), +REQ_OP_NAME (ZONE_REPORT ), +REQ_OP_NAME (SECURE_ERASE ), +REQ_OP_NAME (ZONE_RESET ), +REQ_OP_NAME (WRITE_SAME ), +REQ_OP_NAME (WRITE_ZEROES ), +REQ_OP_NAME (SCSI_IN ), +REQ_OP_NAME (SCSI_OUT ), +REQ_OP_NAME (DRV_IN ), +REQ_OP_NAME (DRV_OUT ), +}; +#undef REQ_OP_NAME + +#define CMD_FLAG_NAME (name) [__REQ_##name] = #namestatic const char *const cmd_flag_name[] = { - [__REQ_FAILFAST_DEV] ="FAILFAST_DEV" , - [__REQ_FAILFAST_TRANSPORT] ="FAILFAST_TRANSPORT" , - [__REQ_FAILFAST_DRIVER] ="FAILFAST_DRIVER" , - [__REQ_SYNC] ="SYNC" , - [__REQ_META] ="META" , - [__REQ_PRIO] ="PRIO" , - [__REQ_NOMERGE] ="NOMERGE" , - [__REQ_IDLE] ="IDLE" , - [__REQ_INTEGRITY] ="INTEGRITY" , - [__REQ_FUA] ="FUA" , - [__REQ_PREFLUSH] ="PREFLUSH" , - [__REQ_RAHEAD] ="RAHEAD" , - [__REQ_BACKGROUND] ="BACKGROUND" , - [__REQ_NR_BITS] ="NR_BITS" , -}; - +CMD_FLAG_NAME (FAILFAST_DEV ), +CMD_FLAG_NAME (FAILFAST_TRANSPORT ), +CMD_FLAG_NAME (FAILFAST_DRIVER ), +CMD_FLAG_NAME (SYNC ), +CMD_FLAG_NAME (META ), +CMD_FLAG_NAME (PRIO ), +CMD_FLAG_NAME (NOMERGE ), +CMD_FLAG_NAME (IDLE ), +CMD_FLAG_NAME (INTEGRITY ), +CMD_FLAG_NAME (FUA ), +CMD_FLAG_NAME (PREFLUSH ), +CMD_FLAG_NAME (RAHEAD ), +CMD_FLAG_NAME (BACKGROUND ), +CMD_FLAG_NAME (NOUNMAP ), +}; +#undef CMD_FLAG_NAME + +#define RQF_NAME (name) [ilog2((__force u32)RQF_##name)] = #namestatic const char *const rqf_name[] = { - [ilog2 ((__force u32 )RQF_SORTED )] ="SORTED" , - [ilog2 ((__force u32 )RQF_STARTED )] ="STARTED" , - [ilog2 ((__force u32 )RQF_QUEUED )] ="QUEUED" , - [ilog2 ((__force u32 )RQF_SOFTBARRIER )] ="SOFTBARRIER" , - [ilog2 ((__force u32 )RQF_FLUSH_SEQ )] ="FLUSH_SEQ" , - [ilog2 ((__force u32 )RQF_MIXED_MERGE )] ="MIXED_MERGE" , - [ilog2 ((__force u32 )RQF_MQ_INFLIGHT )] ="MQ_INFLIGHT" , - [ilog2 ((__force u32 )RQF_DONTPREP )] ="DONTPREP" , - [ilog2 ((__force u32 )RQF_PREEMPT )] ="PREEMPT" , - [ilog2 ((__force u32 )RQF_COPY_USER )] ="COPY_USER" , - [ilog2 ((__force u32 )RQF_FAILED )] ="FAILED" , - [ilog2 ((__force u32 )RQF_QUIET )] ="QUIET" , - [ilog2 ((__force u32 )RQF_ELVPRIV )] ="ELVPRIV" , - [ilog2 ((__force u32 )RQF_IO_STAT )] ="IO_STAT" , - [ilog2 ((__force u32 )RQF_ALLOCED )] ="ALLOCED" , - [ilog2 ((__force u32 )RQF_PM )] ="PM" , - [ilog2 ((__force u32 )RQF_HASHED )] ="HASHED" , - [ilog2 ((__force u32 )RQF_STATS )] ="STATS" , - [ilog2 ((__force u32 )RQF_SPECIAL_PAYLOAD )] ="SPECIAL_PAYLOAD" , -}; +RQF_NAME (SORTED ), +RQF_NAME (STARTED ), +RQF_NAME (QUEUED ), +RQF_NAME (SOFTBARRIER ), +RQF_NAME (FLUSH_SEQ ), +RQF_NAME (MIXED_MERGE ), +RQF_NAME (MQ_INFLIGHT ), +RQF_NAME (DONTPREP ), +RQF_NAME (PREEMPT ), +RQF_NAME (COPY_USER ), +RQF_NAME (FAILED ), +RQF_NAME (QUIET ), +RQF_NAME (ELVPRIV ), +RQF_NAME (IO_STAT ), +RQF_NAME (ALLOCED ), +RQF_NAME (PM ), +RQF_NAME (HASHED ), +RQF_NAME (STATS ), +RQF_NAME (SPECIAL_PAYLOAD ), +}; +#undef RQF_NAMEstatic int blk_mq_debugfs_rq_show (struct seq_file *m,void *v) {
Signature · 1 line
2.12.2
Re: [PATCH v2 02/12] blk-mq-debugfs: clean up flag definitions
Quoted 11 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
Make sure the spelled out flag names match the definition. This also adds a missing hctx state,
BLK_MQ_S_START_ON_RUN, and a missingcmd_flag,__REQ_NOUNMAP.Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 201 ++++++++++++++++++++++++++----------------------- 1 file changed, 108 insertions(+), 93 deletions(-)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
PATCH v2 3/12 blk-mq-debugfs: error on long write to queue "state" file
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
blk_queue_flags_store() currently truncates and returns a short write if the operation being written is too long. This can give us weird results, like here:
$ echo "run bar" echo: write error: invalid argument $ dmesg [ 1103.075435] blk_queue_flags_store: unsupported operation bar. Use either 'run' or 'start'
Instead, return an error if the user does this. While we're here, make the argument names consistent with everywhere else in this file.
--- block/blk-mq-debugfs.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
block/blk-mq-debugfs.c +12 -7
@@ -107,14 +107,18 @@ static int blk_queue_flags_show(struct seq_file *m, void *v)return 0 ; } -static ssize_t blk_queue_flags_store (struct file *file,const char __user *ubuf, -size_t len,loff_t *offp) +static ssize_t blk_queue_flags_store (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) {struct request_queue *q =file_inode (file)->i_private;char op[16 ] = { }, *s; - len =min (len,sizeof (op) -1 ); -if (copy_from_user (op, ubuf, len)) +if (count >=sizeof (op)) { +pr_err ("%s: operation too long\n" , __func__); + goto inval; + } + +if (copy_from_user (op, buf, count))return -EFAULT ; s = op;strsep (&s," \t\n" );/* strip trailing whitespace */
@@ -123,11 +127,12 @@ static ssize_t blk_queue_flags_store(struct file *file, const char __user *ubuf, }else if (strcmp (op,"start" ) ==0 ) {blk_mq_start_stopped_hw_queues (q, true); }else { -pr_err ("%s: unsupported operation %s. Use either 'run' or 'start'\n" , - __func__, op); +pr_err ("%s: unsupported operation '%s'\n" , __func__, op); +inval: +pr_err ("%s: use either 'run' or 'start'\n" , __func__);return -EINVAL ; } -return len; +return count; }static int blk_queue_flags_open (struct inode *inode,struct file *file)
Signature · 1 line
2.12.2
Re: [PATCH v2 03/12] blk-mq-debugfs: error on long write to queue "state" file
Quoted 11 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
blk_queue_flags_store()currently truncates and returns a short write if the operation being written is too long. This can give us weird results, like here:$ echo "run bar" echo: write error: invalid argument $ dmesg [ 1103.075435] blk_queue_flags_store: unsupported operation bar. Use either 'run' or 'start'
Quoted 8 lines
Instead, return an error if the user does this. While we're here, make the argument names consistent with everywhere else in this file.
Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
Re: [PATCH v2 03/12] blk-mq-debugfs: error on long write to queue "state" file
In reply to Omar SandovalQuoted 10 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
=20blk_queue_flags_store()currently truncates and returns a short write if the operation being written is too long. This can give us weird results, like here:
=20$ echo "run bar" echo: write error: invalid argument $ dmesg [ 1103.075435] blk_queue_flags_store: unsupported operation bar. Use eith=
er 'run' or 'start'
Quoted 3 lines
=20
Instead, return an error if the user does this. While we're here, make the argument names consistent with everywhere else in this file.
PATCH v2 4/12 blk-mq-debugfs: don't open code strstrip()
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
Slightly more readable, plus we also strip leading spaces.
--- block/blk-mq-debugfs.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
block/blk-mq-debugfs.c +4 -5
@@ -111,17 +111,16 @@ static ssize_t blk_queue_flags_store(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct request_queue *q = file_inode(file)->i_private; -char op[16 ] = { }, *s; +char opbuf[16 ] = { }, *op; -if (count >=sizeof (op)) { +if (count >=sizeof (opbuf)) {pr_err ("%s: operation too long\n" , __func__); goto inval; } -if (copy_from_user (op, buf, count)) +if (copy_from_user (opbuf, buf, count))return -EFAULT ; - s = op; -strsep (&s," \t\n" );/* strip trailing whitespace */ + op =strstrip (opbuf);if (strcmp (op,"run" ) ==0 ) {blk_mq_run_hw_queues (q, true); }else if (strcmp (op,"start" ) ==0 ) {
Signature · 1 line
2.12.2
Re: [PATCH v2 04/12] blk-mq-debugfs: don't open code strstrip()
Quoted 9 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
Slightly more readable, plus we also strip leading spaces.
Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
Re: [PATCH v2 04/12] blk-mq-debugfs: don't open code strstrip()
In reply to Omar Sandovalblock/blk-mq-debugfs.c static ssize_t blk_queue_flags_store(struct file *f=
Quoted 14 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
=20
Slightly more readable, plus we also strip leading spaces. =20Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)=20
block/blk-mq-debugfs.c +0
-0@@ -111,17 +111,16 @@ static ssize_t blk_queue_flags_store(struct file *f=
ile, const char __user *buf,
Quoted 12 lines
block/blk-mq-debugfs.c +1
-1size_t count, loff_t *ppos) { struct request_queue *q =3D file_inode(file)->i_private; - char op[16] =3D { }, *s; + char opbuf[16] =3D { }, *op;=20
block/blk-mq-debugfs.c +1
-1- if (count >=3D sizeof(op)) { + if (count >=3D sizeof(opbuf)) {pr_err ("%s: operation too long\n" , __func__); goto inval; }=20
block/blk-mq-debugfs.c static ssize_t blk_queue_flags_store(struct file *file, const char __user *buf,
Quoted 9 lines
block/blk-mq-debugfs.c +2
-3-if (copy_from_user (op, buf, count)) +if (copy_from_user (opbuf, buf, count))return -EFAULT ; - s =3D op; -strsep (&s," \t\n" );/* strip trailing whitespace */ + op =3D strstrip(opbuf); if (strcmp(op, "run") =3D=3D 0) {blk_mq_run_hw_queues (q, true); } else if (strcmp(op, "start") =3D=3D 0) {
Hello Omar,
Sorry but in my opinion the value of this patch is so small that I'm not su= re
it's worth to merge this patch.
Bart.=
PATCH v2 5/12 blk-mq-debugfs: rename hw queue directories from <n> to hctx<n>
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
It's not clear what these numbered directories represent unless you consult the code. We're about to get rid of the intermediate "mq" directory, so these would be even more confusing without that context.
--- block/blk-mq-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/blk-mq-debugfs.c +1 -1
@@ -936,7 +936,7 @@ static int blk_mq_debugfs_register_hctx(struct request_queue *q,char name[20 ];int i; -snprintf (name,sizeof (name),"%u" , hctx->queue_num); +snprintf (name,sizeof (name),"hctx%u" , hctx->queue_num); hctx_dir =debugfs_create_dir (name, q->mq_debugfs_dir);if (!hctx_dir)return -ENOMEM ;
Signature · 1 line
2.12.2
Re: [PATCH v2 05/12] blk-mq-debugfs: rename hw queue directories from <n> to hctx<n>
Quoted 17 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
It's not clear what these numbered directories represent unless you consult the code. We're about to get rid of the intermediate "mq" directory, so these would be even more confusing without that context.
Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)block/blk-mq-debugfs.c +0
-0
block/blk-mq-debugfs.c static int blk_mq_debugfs_register_hctx(struct request_queue *q, · line 942
Quoted 8 lines
block/blk-mq-debugfs.c +1
-1@@ -936,7 +936,7 @@ static int blk_mq_debugfs_register_hctx(struct request_queue *q,char name[20 ];int i; -snprintf (name,sizeof (name),"%u" , hctx->queue_num); +snprintf (name,sizeof (name),"hctx%u" , hctx->queue_num); hctx_dir =debugfs_create_dir (name, q->mq_debugfs_dir);if (!hctx_dir)return -ENOMEM ;
Hmm. The number actually corresponds to /sys/block/XX/mq/<num> With this patch we would break this mapping, no?
I'd rather keep it in sync with /sys/block ...
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
Jens Axboe
maintainerRe: [PATCH v2 05/12] blk-mq-debugfs: rename hw queue directories from <n> to hctx<n>
Quoted 29 lines · Hannes Reinecke
Quoted 17 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
It's not clear what these numbered directories represent unless you consult the code. We're about to get rid of the intermediate "mq" directory, so these would be even more confusing without that context.
Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)block/blk-mq-debugfs.c +0
-0block/blk-mq-debugfs.c static int blk_mq_debugfs_register_hctx(struct request_queue *q, · line 942
Quoted 8 lines
block/blk-mq-debugfs.c +1
-1@@ -936,7 +936,7 @@ static int blk_mq_debugfs_register_hctx(struct request_queue *q,char name[20 ];int i; -snprintf (name,sizeof (name),"%u" , hctx->queue_num); +snprintf (name,sizeof (name),"hctx%u" , hctx->queue_num); hctx_dir =debugfs_create_dir (name, q->mq_debugfs_dir);if (!hctx_dir)return -ENOMEM ;Hmm. The number actually corresponds to /sys/block/XX/mq/<num> With this patch we would break this mapping, no?
Quoted 1 line
I'd rather keep it in sync with
/sys/block...
It's still the same number, it's just clearer what it is. I like this change.
Signature · 1 line
Jens Axboe
PATCH v2 6/12 blk-mq-debugfs: get rid of a bunch of boilerplate
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
A large part of blk-mq-debugfs.c is file_operations and seq_file boilerplate. This sucks as is but will suck even more when schedulers can define their own debugfs entries. Factor it all out into a single blk_mq_debugfs_fops which multiplexes as needed. We store the request_queue, blk_mq_hw_ctx, or blk_mq_ctx in the parent directory dentry, which is kind of hacky, but it works.
--- block/blk-mq-debugfs.c | 464 +++++++++++++++---------------------------------- 1 file changed, 136 insertions(+), 328 deletions(-)
block/blk-mq-debugfs.c +136 -328
@@ -26,23 +26,12 @@struct blk_mq_debugfs_attr {const char *name;umode_t mode; -const struct file_operations *fops; +int (*show)(void *,struct seq_file *); +ssize_t (*write)(void *,const char __user *,size_t ,loff_t *); +/* Set either .show or .seq_ops. */ +const struct seq_operations *seq_ops; }; -static int blk_mq_debugfs_seq_open (struct inode *inode,struct file *file, -const struct seq_operations *ops) -{ -struct seq_file *m; -int ret; - - ret =seq_open (file, ops); -if (!ret) { - m = file->private_data; - m->private = inode->i_private; - } -return ret; -} -static int blk_flags_show (struct seq_file *m,const unsigned long flags,const char *const *flag_name,int flag_name_count) {
@@ -97,9 +86,9 @@ static const char *const blk_queue_flag_name[] = { };#undef QUEUE_FLAG_NAME -static int blk_queue_flags_show (struct seq_file *m,void *v) +static int queue_state_show (void *data,struct seq_file *m) { -struct request_queue *q = m->private; +struct request_queue *q = data;blk_flags_show (m, q->queue_flags, blk_queue_flag_name,ARRAY_SIZE (blk_queue_flag_name));
@@ -107,10 +96,10 @@ static int blk_queue_flags_show(struct seq_file *m, void *v)return 0 ; } -static ssize_t blk_queue_flags_store (struct file *file,const char __user *buf, -size_t count,loff_t *ppos) +static ssize_t queue_state_write (void *data,const char __user *buf, +size_t count,loff_t *ppos) { -struct request_queue *q =file_inode (file)->i_private; +struct request_queue *q = data;char opbuf[16 ] = { }, *op;if (count >=sizeof (opbuf)) {
@@ -134,19 +123,6 @@ static ssize_t blk_queue_flags_store(struct file *file, const char __user *buf,return count; } -static int blk_queue_flags_open (struct inode *inode,struct file *file) -{ -return single_open (file, blk_queue_flags_show, inode->i_private); -} - -static const struct file_operations blk_queue_flags_fops = { - .open = blk_queue_flags_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .write = blk_queue_flags_store, -}; -static void print_stat (struct seq_file *m,struct blk_rq_stat *stat) {if (stat->nr_samples) {
@@ -157,9 +133,9 @@ static void print_stat(struct seq_file *m, struct blk_rq_stat *stat) } } -static int queue_poll_stat_show (struct seq_file *m,void *v) +static int queue_poll_stat_show (void *data,struct seq_file *m) { -struct request_queue *q = m->private; +struct request_queue *q = data;int bucket;for (bucket =0 ; bucket <BLK_MQ_POLL_STATS_BKTS /2 ; bucket++) {
@@ -174,18 +150,6 @@ static int queue_poll_stat_show(struct seq_file *m, void *v)return 0 ; } -static int queue_poll_stat_open (struct inode *inode,struct file *file) -{ -return single_open (file, queue_poll_stat_show, inode->i_private); -} - -static const struct file_operations queue_poll_stat_fops = { - .open = queue_poll_stat_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; -#define HCTX_STATE_NAME (name) [BLK_MQ_S_##name] = #namestatic const char *const hctx_state_name[] = {HCTX_STATE_NAME (STOPPED ),
@@ -196,9 +160,9 @@ static const char *const hctx_state_name[] = { };#undef HCTX_STATE_NAME -static int hctx_state_show (struct seq_file *m,void *v) +static int hctx_state_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;blk_flags_show (m, hctx->state, hctx_state_name,ARRAY_SIZE (hctx_state_name));
@@ -206,18 +170,6 @@ static int hctx_state_show(struct seq_file *m, void *v)return 0 ; } -static int hctx_state_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_state_show, inode->i_private); -} - -static const struct file_operations hctx_state_fops = { - .open = hctx_state_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; -#define BLK_TAG_ALLOC_NAME (name) [BLK_TAG_ALLOC_##name] = #namestatic const char *const alloc_policy_name[] = {BLK_TAG_ALLOC_NAME (FIFO ),
@@ -235,9 +187,9 @@ static const char *const hctx_flag_name[] = { };#undef HCTX_FLAG_NAME -static int hctx_flags_show (struct seq_file *m,void *v) +static int hctx_flags_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;const int alloc_policy =BLK_MQ_FLAG_TO_ALLOC_POLICY (hctx->flags);seq_puts (m,"alloc_policy=" );
@@ -254,18 +206,6 @@ static int hctx_flags_show(struct seq_file *m, void *v)return 0 ; } -static int hctx_flags_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_flags_show, inode->i_private); -} - -static const struct file_operations hctx_flags_fops = { - .open = hctx_flags_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; -#define REQ_OP_NAME (name) [REQ_OP_##name] = #namestatic const char *const op_name[] = {REQ_OP_NAME (READ ),
@@ -383,38 +323,14 @@ static const struct seq_operations hctx_dispatch_seq_ops = { .show = blk_mq_debugfs_rq_show, }; -static int hctx_dispatch_open (struct inode *inode,struct file *file) -{ -return blk_mq_debugfs_seq_open (inode, file, &hctx_dispatch_seq_ops); -} - -static const struct file_operations hctx_dispatch_fops = { - .open = hctx_dispatch_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, -}; - -static int hctx_ctx_map_show (struct seq_file *m,void *v) +static int hctx_ctx_map_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;sbitmap_bitmap_show (&hctx->ctx_map, m);return 0 ; } -static int hctx_ctx_map_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_ctx_map_show, inode->i_private); -} - -static const struct file_operations hctx_ctx_map_fops = { - .open = hctx_ctx_map_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; -static void blk_mq_debugfs_tags_show (struct seq_file *m,struct blk_mq_tags *tags) {
@@ -432,9 +348,9 @@ static void blk_mq_debugfs_tags_show(struct seq_file *m, } } -static int hctx_tags_show (struct seq_file *m,void *v) +static int hctx_tags_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;struct request_queue *q = hctx->queue;int res;
@@ -449,21 +365,9 @@ static int hctx_tags_show(struct seq_file *m, void *v)return res; } -static int hctx_tags_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_tags_show, inode->i_private); -} - -static const struct file_operations hctx_tags_fops = { - .open = hctx_tags_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int hctx_tags_bitmap_show (struct seq_file *m,void *v) +static int hctx_tags_bitmap_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;struct request_queue *q = hctx->queue;int res;
@@ -478,21 +382,9 @@ static int hctx_tags_bitmap_show(struct seq_file *m, void *v)return res; } -static int hctx_tags_bitmap_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_tags_bitmap_show, inode->i_private); -} - -static const struct file_operations hctx_tags_bitmap_fops = { - .open = hctx_tags_bitmap_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int hctx_sched_tags_show (struct seq_file *m,void *v) +static int hctx_sched_tags_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;struct request_queue *q = hctx->queue;int res;
@@ -507,21 +399,9 @@ static int hctx_sched_tags_show(struct seq_file *m, void *v)return res; } -static int hctx_sched_tags_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_sched_tags_show, inode->i_private); -} - -static const struct file_operations hctx_sched_tags_fops = { - .open = hctx_sched_tags_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int hctx_sched_tags_bitmap_show (struct seq_file *m,void *v) +static int hctx_sched_tags_bitmap_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;struct request_queue *q = hctx->queue;int res;
@@ -536,21 +416,9 @@ static int hctx_sched_tags_bitmap_show(struct seq_file *m, void *v)return res; } -static int hctx_sched_tags_bitmap_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_sched_tags_bitmap_show, inode->i_private); -} - -static const struct file_operations hctx_sched_tags_bitmap_fops = { - .open = hctx_sched_tags_bitmap_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int hctx_io_poll_show (struct seq_file *m,void *v) +static int hctx_io_poll_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;seq_printf (m,"considered=%lu\n" , hctx->poll_considered);seq_printf (m,"invoked=%lu\n" , hctx->poll_invoked);
@@ -558,32 +426,18 @@ static int hctx_io_poll_show(struct seq_file *m, void *v)return 0 ; } -static int hctx_io_poll_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_io_poll_show, inode->i_private); -} - -static ssize_t hctx_io_poll_write (struct file *file,const char __user *buf, +static ssize_t hctx_io_poll_write (void *data,const char __user *buf,size_t count,loff_t *ppos) { -struct seq_file *m = file->private_data; -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data; hctx->poll_considered = hctx->poll_invoked = hctx->poll_success =0 ;return count; } -static const struct file_operations hctx_io_poll_fops = { - .open = hctx_io_poll_open, - .read = seq_read, - .write = hctx_io_poll_write, - .llseek = seq_lseek, - .release = single_release, -}; - -static int hctx_dispatched_show (struct seq_file *m,void *v) +static int hctx_dispatched_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;int i;seq_printf (m,"%8u\t%lu\n" ,0U , hctx->dispatched[0 ]);
@@ -598,16 +452,10 @@ static int hctx_dispatched_show(struct seq_file *m, void *v)return 0 ; } -static int hctx_dispatched_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_dispatched_show, inode->i_private); -} - -static ssize_t hctx_dispatched_write (struct file *file,const char __user *buf, +static ssize_t hctx_dispatched_write (void *data,const char __user *buf,size_t count,loff_t *ppos) { -struct seq_file *m = file->private_data; -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;int i;for (i =0 ; i <BLK_MQ_MAX_DISPATCH_ORDER ; i++)
@@ -615,96 +463,48 @@ static ssize_t hctx_dispatched_write(struct file *file, const char __user *buf,return count; } -static const struct file_operations hctx_dispatched_fops = { - .open = hctx_dispatched_open, - .read = seq_read, - .write = hctx_dispatched_write, - .llseek = seq_lseek, - .release = single_release, -}; - -static int hctx_queued_show (struct seq_file *m,void *v) +static int hctx_queued_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;seq_printf (m,"%lu\n" , hctx->queued);return 0 ; } -static int hctx_queued_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_queued_show, inode->i_private); -} - -static ssize_t hctx_queued_write (struct file *file,const char __user *buf, +static ssize_t hctx_queued_write (void *data,const char __user *buf,size_t count,loff_t *ppos) { -struct seq_file *m = file->private_data; -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data; hctx->queued =0 ;return count; } -static const struct file_operations hctx_queued_fops = { - .open = hctx_queued_open, - .read = seq_read, - .write = hctx_queued_write, - .llseek = seq_lseek, - .release = single_release, -}; - -static int hctx_run_show (struct seq_file *m,void *v) +static int hctx_run_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;seq_printf (m,"%lu\n" , hctx->run);return 0 ; } -static int hctx_run_open (struct inode *inode,struct file *file) +static ssize_t hctx_run_write (void *data,const char __user *buf,size_t count, +loff_t *ppos) { -return single_open (file, hctx_run_show, inode->i_private); -} - -static ssize_t hctx_run_write (struct file *file,const char __user *buf, -size_t count,loff_t *ppos) -{ -struct seq_file *m = file->private_data; -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data; hctx->run =0 ;return count; } -static const struct file_operations hctx_run_fops = { - .open = hctx_run_open, - .read = seq_read, - .write = hctx_run_write, - .llseek = seq_lseek, - .release = single_release, -}; - -static int hctx_active_show (struct seq_file *m,void *v) +static int hctx_active_show (void *data,struct seq_file *m) { -struct blk_mq_hw_ctx *hctx = m->private; +struct blk_mq_hw_ctx *hctx = data;seq_printf (m,"%d\n" ,atomic_read (&hctx->nr_active));return 0 ; } -static int hctx_active_open (struct inode *inode,struct file *file) -{ -return single_open (file, hctx_active_show, inode->i_private); -} - -static const struct file_operations hctx_active_fops = { - .open = hctx_active_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; -static void *ctx_rq_list_start (struct seq_file *m,loff_t *pos) __acquires(&ctx->lock) {
@@ -735,140 +535,146 @@ static const struct seq_operations ctx_rq_list_seq_ops = { .stop = ctx_rq_list_stop, .show = blk_mq_debugfs_rq_show, }; - -static int ctx_rq_list_open (struct inode *inode,struct file *file) -{ -return blk_mq_debugfs_seq_open (inode, file, &ctx_rq_list_seq_ops); -} - -static const struct file_operations ctx_rq_list_fops = { - .open = ctx_rq_list_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, -}; - -static int ctx_dispatched_show (struct seq_file *m,void *v) +static int ctx_dispatched_show (void *data,struct seq_file *m) { -struct blk_mq_ctx *ctx = m->private; +struct blk_mq_ctx *ctx = data;seq_printf (m,"%lu %lu\n" , ctx->rq_dispatched[1 ], ctx->rq_dispatched[0 ]);return 0 ; } -static int ctx_dispatched_open (struct inode *inode,struct file *file) -{ -return single_open (file, ctx_dispatched_show, inode->i_private); -} - -static ssize_t ctx_dispatched_write (struct file *file,const char __user *buf, +static ssize_t ctx_dispatched_write (void *data,const char __user *buf,size_t count,loff_t *ppos) { -struct seq_file *m = file->private_data; -struct blk_mq_ctx *ctx = m->private; +struct blk_mq_ctx *ctx = data; ctx->rq_dispatched[0 ] = ctx->rq_dispatched[1 ] =0 ;return count; } -static const struct file_operations ctx_dispatched_fops = { - .open = ctx_dispatched_open, - .read = seq_read, - .write = ctx_dispatched_write, - .llseek = seq_lseek, - .release = single_release, -}; - -static int ctx_merged_show (struct seq_file *m,void *v) +static int ctx_merged_show (void *data,struct seq_file *m) { -struct blk_mq_ctx *ctx = m->private; +struct blk_mq_ctx *ctx = data;seq_printf (m,"%lu\n" , ctx->rq_merged);return 0 ; } -static int ctx_merged_open (struct inode *inode,struct file *file) -{ -return single_open (file, ctx_merged_show, inode->i_private); -} - -static ssize_t ctx_merged_write (struct file *file,const char __user *buf, -size_t count,loff_t *ppos) +static ssize_t ctx_merged_write (void *data,const char __user *buf, +size_t count,loff_t *ppos) { -struct seq_file *m = file->private_data; -struct blk_mq_ctx *ctx = m->private; +struct blk_mq_ctx *ctx = data; ctx->rq_merged =0 ;return count; } -static const struct file_operations ctx_merged_fops = { - .open = ctx_merged_open, - .read = seq_read, - .write = ctx_merged_write, - .llseek = seq_lseek, - .release = single_release, -}; - -static int ctx_completed_show (struct seq_file *m,void *v) +static int ctx_completed_show (void *data,struct seq_file *m) { -struct blk_mq_ctx *ctx = m->private; +struct blk_mq_ctx *ctx = data;seq_printf (m,"%lu %lu\n" , ctx->rq_completed[1 ], ctx->rq_completed[0 ]);return 0 ; } -static int ctx_completed_open (struct inode *inode,struct file *file) +static ssize_t ctx_completed_write (void *data,const char __user *buf, +size_t count,loff_t *ppos) { -return single_open (file, ctx_completed_show, inode->i_private); +struct blk_mq_ctx *ctx = data; + + ctx->rq_completed[0 ] = ctx->rq_completed[1 ] =0 ; +return count; } -static ssize_t ctx_completed_write (struct file *file,const char __user *buf, -size_t count,loff_t *ppos) +static int blk_mq_debugfs_show (struct seq_file *m,void *v) +{ +const struct blk_mq_debugfs_attr *attr = m->private; +void *data =d_inode (m->file->f_path.dentry->d_parent)->i_private; + +return attr->show (data, m); +} + +static ssize_t blk_mq_debugfs_write (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) {struct seq_file *m = file->private_data; -struct blk_mq_ctx *ctx = m->private; +const struct blk_mq_debugfs_attr *attr = m->private; +void *data =d_inode (file->f_path.dentry->d_parent)->i_private; - ctx->rq_completed[0 ] = ctx->rq_completed[1 ] =0 ; -return count; +if (!attr->write) +return -EPERM ; + +return attr->write (data, buf, count, ppos); +} + +static int blk_mq_debugfs_open (struct inode *inode,struct file *file) +{ +const struct blk_mq_debugfs_attr *attr = inode->i_private; +void *data =d_inode (file->f_path.dentry->d_parent)->i_private; +struct seq_file *m; +int ret; + +if (attr->seq_ops) { + ret =seq_open (file, attr->seq_ops); +if (!ret) { + m = file->private_data; + m->private = data; + } +return ret; + } + +if (WARN_ON_ONCE (!attr->show)) +return -EPERM ; + +return single_open (file, blk_mq_debugfs_show, inode->i_private); } -static const struct file_operations ctx_completed_fops = { - .open = ctx_completed_open, +static int blk_mq_debugfs_release (struct inode *inode,struct file *file) +{ +const struct blk_mq_debugfs_attr *attr = inode->i_private; + +if (attr->show) +return single_release (inode, file); +else +return seq_release (inode, file); +} + +const struct file_operations blk_mq_debugfs_fops = { + .open = blk_mq_debugfs_open, .read = seq_read, - .write = ctx_completed_write, + .write = blk_mq_debugfs_write, .llseek = seq_lseek, - .release = single_release, + .release = blk_mq_debugfs_release, };static const struct blk_mq_debugfs_attr blk_mq_debugfs_queue_attrs[] = { - {"poll_stat" ,0400 , &queue_poll_stat_fops}, - {"state" ,0600 , &blk_queue_flags_fops}, + {"poll_stat" ,0400 , queue_poll_stat_show}, + {"state" ,0600 , queue_state_show, queue_state_write}, {}, };static const struct blk_mq_debugfs_attr blk_mq_debugfs_hctx_attrs[] = { - {"state" ,0400 , &hctx_state_fops}, - {"flags" ,0400 , &hctx_flags_fops}, - {"dispatch" ,0400 , &hctx_dispatch_fops}, - {"ctx_map" ,0400 , &hctx_ctx_map_fops}, - {"tags" ,0400 , &hctx_tags_fops}, - {"tags_bitmap" ,0400 , &hctx_tags_bitmap_fops}, - {"sched_tags" ,0400 , &hctx_sched_tags_fops}, - {"sched_tags_bitmap" ,0400 , &hctx_sched_tags_bitmap_fops}, - {"io_poll" ,0600 , &hctx_io_poll_fops}, - {"dispatched" ,0600 , &hctx_dispatched_fops}, - {"queued" ,0600 , &hctx_queued_fops}, - {"run" ,0600 , &hctx_run_fops}, - {"active" ,0400 , &hctx_active_fops}, + {"state" ,0400 , hctx_state_show}, + {"flags" ,0400 , hctx_flags_show}, + {"dispatch" ,0400 , .seq_ops = &hctx_dispatch_seq_ops}, + {"ctx_map" ,0400 , hctx_ctx_map_show}, + {"tags" ,0400 , hctx_tags_show}, + {"tags_bitmap" ,0400 , hctx_tags_bitmap_show}, + {"sched_tags" ,0400 , hctx_sched_tags_show}, + {"sched_tags_bitmap" ,0400 , hctx_sched_tags_bitmap_show}, + {"io_poll" ,0600 , hctx_io_poll_show, hctx_io_poll_write}, + {"dispatched" ,0600 , hctx_dispatched_show, hctx_dispatched_write}, + {"queued" ,0600 , hctx_queued_show, hctx_queued_write}, + {"run" ,0600 , hctx_run_show, hctx_run_write}, + {"active" ,0400 , hctx_active_show}, {}, };static const struct blk_mq_debugfs_attr blk_mq_debugfs_ctx_attrs[] = { - {"rq_list" ,0400 , &ctx_rq_list_fops}, - {"dispatched" ,0600 , &ctx_dispatched_fops}, - {"merged" ,0600 , &ctx_merged_fops}, - {"completed" ,0600 , &ctx_completed_fops}, + {"rq_list" ,0400 , .seq_ops = &ctx_rq_list_seq_ops}, + {"dispatched" ,0600 , ctx_dispatched_show, ctx_dispatched_write}, + {"merged" ,0600 , ctx_merged_show, ctx_merged_write}, + {"completed" ,0600 , ctx_completed_show, ctx_completed_write}, {}, };
@@ -900,11 +706,13 @@ void blk_mq_debugfs_unregister(struct request_queue *q) }static bool debugfs_create_files (struct dentry *parent,void *data, -const struct blk_mq_debugfs_attr *attr) +const struct blk_mq_debugfs_attr *attr) { +d_inode (parent)->i_private = data; +for (; attr->name; attr++) {if (!debugfs_create_file (attr->name, attr->mode, parent, - data, attr->fops)) + (void *)attr, &blk_mq_debugfs_fops))return false; }return true;
Signature · 1 line
2.12.2
Re: [PATCH v2 06/12] blk-mq-debugfs: get rid of a bunch of boilerplate
Quoted 9 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
A large part of
blk-mq-debugfs.cisfile_operationsandseq_fileboilerplate. This sucks as is but will suck even more when schedulers can define their own debugfs entries. Factor it all out into a singleblk_mq_debugfs_fopswhich multiplexes as needed. We store therequest_queue,blk_mq_hw_ctx, orblk_mq_ctxin the parent directory dentry, which is kind of hacky, but it works.
Quoted 5 lines
Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 464 +++++++++++++++---------------------------------- 1 file changed, 136 insertions(+), 328 deletions(-)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
Re: [PATCH v2 06/12] blk-mq-debugfs: get rid of a bunch of boilerplate
In reply to Omar SandovalQuoted 8 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
=20
A large part ofblk-mq-debugfs.cisfile_operationsandseq_fileboilerplate. This sucks as is but will suck even more when schedulers can define their own debugfs entries. Factor it all out into a singleblk_mq_debugfs_fopswhich multiplexes as needed. We store therequest_queue,blk_mq_hw_ctx, orblk_mq_ctxin the parent directory dentry, which is kind of hacky, but it works.
PATCH v2 7/12 blk-mq: Do not invoke queue operations on a dead queue
In reply to Omar SandovalFrom: Bart Van Assche <[email protected]>
In commit e869b5462f83 ("blk-mq: Unregister debugfs attributes earlier"), we shuffled the debugfs cleanup around so that the "state" attribute was removed before we freed the blk-mq data structures. However, later changes are going to undo that, so we need to explicitly disallow running a dead queue.
--- block/blk-mq-debugfs.c | 8 ++++++++ 1 file changed, 8 insertions(+)
block/blk-mq-debugfs.c +8 -0
@@ -102,6 +102,14 @@ static ssize_t queue_state_write(void *data, const char __user *buf,struct request_queue *q = data;char opbuf[16 ] = { }, *op; +/* +* The "state" attribute is removed after blk_cleanup_queue() has called +* blk_mq_free_queue(). Return if QUEUE_FLAG_DEAD has been set to avoid +* triggering a use-after-free. +*/ +if (blk_queue_dead (q)) +return -ENOENT ; +if (count >=sizeof (opbuf)) {pr_err ("%s: operation too long\n" , __func__); goto inval;
Signature · 1 line
2.12.2
Re: [PATCH v2 07/12] blk-mq: Do not invoke queue operations on a dead queue
Quoted 8 lines · Omar Sandoval
From: Bart Van Assche <[email protected]>
In commit
e869b5462f83("blk-mq: Unregister debugfs attributes earlier"), we shuffled the debugfs cleanup around so that the "state" attribute was removed before we freed the blk-mq data structures. However, later changes are going to undo that, so we need to explicitly disallow running a dead queue.
Quoted 7 lines
[Omar: rebased and updated commit message]Signed-off-by Omar Sandoval <[email protected]>Signed-off-by Bart Van Assche <[email protected]>--- block/blk-mq-debugfs.c | 8 ++++++++ 1 file changed, 8 insertions(+)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
PATCH v2 8/12 blk-mq: move debugfs declarations to a separate header file
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
Preparation for adding more declarations.
--- block/blk-core.c | 1 + block/blk-mq-debugfs.c | 1 + block/blk-mq-debugfs.h | 29 +++++++++++++++++++++++++++++ block/blk-mq-sysfs.c | 1 + block/blk-mq.h | 28 ---------------------------- block/blk-sysfs.c | 1 + 6 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 block/blk-mq-debugfs.h
block/blk-core.c +1 -0
@@ -40,6 +40,7 @@#include "blk.h" #include "blk-mq.h" +#include "blk-mq-debugfs.h" #include "blk-mq-sched.h" #include "blk-wbt.h"
block/blk-mq-debugfs.c +1 -0
@@ -21,6 +21,7 @@#include <linux/blk-mq.h> #include "blk.h" #include "blk-mq.h" +#include "blk-mq-debugfs.h" #include "blk-mq-tag.h" struct blk_mq_debugfs_attr {
block/blk-mq-debugfs.h new file +29 -0
@@ -0,0 +1,29 @@ +#ifndef INT_BLK_MQ_DEBUGFS_H +#define INT_BLK_MQ_DEBUGFS_H + +#ifdef CONFIG_BLK_DEBUG_FS +int blk_mq_debugfs_register (struct request_queue *q); +void blk_mq_debugfs_unregister (struct request_queue *q); +int blk_mq_debugfs_register_mq (struct request_queue *q); +void blk_mq_debugfs_unregister_mq (struct request_queue *q); +#else +static inline int blk_mq_debugfs_register (struct request_queue *q) +{ +return 0 ; +} + +static inline void blk_mq_debugfs_unregister (struct request_queue *q) +{ +} + +static inline int blk_mq_debugfs_register_mq (struct request_queue *q) +{ +return 0 ; +} + +static inline void blk_mq_debugfs_unregister_mq (struct request_queue *q) +{ +} +#endif + +#endif
block/blk-mq-sysfs.c +1 -0
@@ -11,6 +11,7 @@#include <linux/blk-mq.h> #include "blk-mq.h" +#include "blk-mq-debugfs.h" #include "blk-mq-tag.h" static void blk_mq_sysfs_release (struct kobject *kobj)
block/blk-mq.h +0 -28
@@ -83,34 +83,6 @@ extern int blk_mq_sysfs_register(struct request_queue *q);extern void blk_mq_sysfs_unregister (struct request_queue *q);extern void blk_mq_hctx_kobj_init (struct blk_mq_hw_ctx *hctx); -/* -* debugfs helpers -*/ -#ifdef CONFIG_BLK_DEBUG_FS -int blk_mq_debugfs_register (struct request_queue *q); -void blk_mq_debugfs_unregister (struct request_queue *q); -int blk_mq_debugfs_register_mq (struct request_queue *q); -void blk_mq_debugfs_unregister_mq (struct request_queue *q); -#else -static inline int blk_mq_debugfs_register (struct request_queue *q) -{ -return 0 ; -} - -static inline void blk_mq_debugfs_unregister (struct request_queue *q) -{ -} - -static inline int blk_mq_debugfs_register_mq (struct request_queue *q) -{ -return 0 ; -} - -static inline void blk_mq_debugfs_unregister_mq (struct request_queue *q) -{ -} -#endif -extern void blk_mq_rq_timed_out (struct request *req,bool reserved);void blk_mq_release (struct request_queue *q);
block/blk-sysfs.c +1 -0
@@ -13,6 +13,7 @@#include "blk.h" #include "blk-mq.h" +#include "blk-mq-debugfs.h" #include "blk-wbt.h" struct queue_sysfs_entry {
Signature · 1 line
2.12.2
Re: [PATCH v2 08/12] blk-mq: move debugfs declarations to a separate header file
Quoted 5 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
Preparation for adding more declarations.
Signed-off-by Omar Sandoval <[email protected]>
Quoted 10 lines
--- block/blk-core.c | 1 + block/blk-mq-debugfs.c | 1 + block/blk-mq-debugfs.h | 29 +++++++++++++++++++++++++++++ block/blk-mq-sysfs.c | 1 + block/blk-mq.h | 28 ---------------------------- block/blk-sysfs.c | 1 + 6 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 block/blk-mq-debugfs.h
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
PATCH v2 9/12 blk-mq: untangle debugfs and sysfs
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
Originally, I tied debugfs registration/unregistration together with sysfs. There's no reason to do this, and it's getting in the way of letting schedulers define their own debugfs attributes. Instead, tie the debugfs registration to the lifetime of the structures themselves.
The saner lifetimes mean we can also get rid of the extra mq directory and move everything one level up. I.e., nvme0n1/mq/hctx0/tags is now just nvme0n1/hctx0/tags.
--- block/blk-core.c | 9 +--- block/blk-mq-debugfs.c | 110 ++++++++++++++++++++++++++++--------------------- block/blk-mq-debugfs.h | 21 ++++++++-- block/blk-mq-sysfs.c | 11 ----- block/blk-mq.c | 7 ++++ block/blk-sysfs.c | 2 + include/linux/blk-mq.h | 4 ++ include/linux/blkdev.h | 1 - 8 files changed, 94 insertions(+), 71 deletions(-)
block/blk-core.c +2 -7
@@ -40,7 +40,6 @@#include "blk.h" #include "blk-mq.h" -#include "blk-mq-debugfs.h" #include "blk-mq-sched.h" #include "blk-wbt.h"
@@ -562,13 +561,9 @@ void blk_cleanup_queue(struct request_queue *q)* prevent that q->request_fn() gets invoked after draining finished. */ blk_freeze_queue (q); -if (!q->mq_ops) { -spin_lock_irq (lock); +spin_lock_irq (lock); +if (!q->mq_ops)__blk_drain_queue (q, true); - }else { -blk_mq_debugfs_unregister_mq (q); -spin_lock_irq (lock); - }queue_flag_set (QUEUE_FLAG_DEAD , q);spin_unlock_irq (lock);
block/blk-mq-debugfs.c +62 -48
172 lines not on this page · raw message
block/blk-mq-debugfs.h +17 -4
@@ -4,8 +4,11 @@#ifdef CONFIG_BLK_DEBUG_FS int blk_mq_debugfs_register (struct request_queue *q);void blk_mq_debugfs_unregister (struct request_queue *q); -int blk_mq_debugfs_register_mq (struct request_queue *q); -void blk_mq_debugfs_unregister_mq (struct request_queue *q); +int blk_mq_debugfs_register_hctx (struct request_queue *q, +struct blk_mq_hw_ctx *hctx); +void blk_mq_debugfs_unregister_hctx (struct blk_mq_hw_ctx *hctx); +int blk_mq_debugfs_register_hctxs (struct request_queue *q); +void blk_mq_debugfs_unregister_hctxs (struct request_queue *q);#else static inline int blk_mq_debugfs_register (struct request_queue *q) {
@@ -16,12 +19,22 @@ static inline void blk_mq_debugfs_unregister(struct request_queue *q) { } -static inline int blk_mq_debugfs_register_mq (struct request_queue *q) +static inline int blk_mq_debugfs_register_hctx (struct request_queue *q, +struct blk_mq_hw_ctx *hctx) {return 0 ; } -static inline void blk_mq_debugfs_unregister_mq (struct request_queue *q) +static inline void blk_mq_debugfs_unregister_hctx (struct blk_mq_hw_ctx *hctx) +{ +} + +static inline int blk_mq_debugfs_register_hctxs (struct request_queue *q) +{ +return 0 ; +} + +static inline void blk_mq_debugfs_unregister_hctxs (struct request_queue *q) { }#endif
block/blk-mq-sysfs.c +0 -11
@@ -11,7 +11,6 @@#include <linux/blk-mq.h> #include "blk-mq.h" -#include "blk-mq-debugfs.h" #include "blk-mq-tag.h" static void blk_mq_sysfs_release (struct kobject *kobj)
@@ -259,8 +258,6 @@ static void __blk_mq_unregister_dev(struct device *dev, struct request_queue *q)queue_for_each_hw_ctx (q, hctx, i)blk_mq_unregister_hctx (hctx); -blk_mq_debugfs_unregister_mq (q); -kobject_uevent (&q->mq_kobj,KOBJ_REMOVE );kobject_del (&q->mq_kobj);kobject_put (&dev->kobj);
@@ -319,8 +316,6 @@ int __blk_mq_register_dev(struct device *dev, struct request_queue *q)kobject_uevent (&q->mq_kobj,KOBJ_ADD ); -blk_mq_debugfs_register (q); -queue_for_each_hw_ctx (q, hctx, i) { ret =blk_mq_register_hctx (hctx);if (ret)
@@ -336,8 +331,6 @@ int __blk_mq_register_dev(struct device *dev, struct request_queue *q)while (--i >=0 )blk_mq_unregister_hctx (q->queue_hw_ctx[i]); -blk_mq_debugfs_unregister_mq (q); -kobject_uevent (&q->mq_kobj,KOBJ_REMOVE );kobject_del (&q->mq_kobj);kobject_put (&dev->kobj);
@@ -365,8 +358,6 @@ void blk_mq_sysfs_unregister(struct request_queue *q)if (!q->mq_sysfs_init_done) goto unlock; -blk_mq_debugfs_unregister_mq (q); -queue_for_each_hw_ctx (q, hctx, i)blk_mq_unregister_hctx (hctx);
@@ -383,8 +374,6 @@ int blk_mq_sysfs_register(struct request_queue *q)if (!q->mq_sysfs_init_done) goto unlock; -blk_mq_debugfs_register_mq (q); -queue_for_each_hw_ctx (q, hctx, i) { ret =blk_mq_register_hctx (hctx);if (ret)
block/blk-mq.c +7 -0
@@ -31,6 +31,7 @@#include <linux/blk-mq.h> #include "blk.h" #include "blk-mq.h" +#include "blk-mq-debugfs.h" #include "blk-mq-tag.h" #include "blk-stat.h" #include "blk-wbt.h"
@@ -1851,6 +1852,8 @@ static void blk_mq_exit_hctx(struct request_queue *q, {unsigned flush_start_tag = set->queue_depth; +blk_mq_debugfs_unregister_hctx (hctx); +blk_mq_tag_idle (hctx);if (set->ops->exit_request)
@@ -1941,6 +1944,8 @@ static int blk_mq_init_hctx(struct request_queue *q,if (hctx->flags &BLK_MQ_F_BLOCKING )init_srcu_struct (&hctx->queue_rq_srcu); +blk_mq_debugfs_register_hctx (q, hctx); +return 0 ; free_fq:
@@ -2378,6 +2383,7 @@ static void blk_mq_queue_reinit(struct request_queue *q, {WARN_ON_ONCE (!atomic_read (&q->mq_freeze_depth)); +blk_mq_debugfs_unregister_hctxs (q);blk_mq_sysfs_unregister (q);/*
@@ -2389,6 +2395,7 @@ static void blk_mq_queue_reinit(struct request_queue *q,blk_mq_map_swqueue (q, online_mask);blk_mq_sysfs_register (q); +blk_mq_debugfs_register_hctxs (q); }/*
block/blk-sysfs.c +2 -0
@@ -890,6 +890,8 @@ int blk_register_queue(struct gendisk *disk)if (q->mq_ops)__blk_mq_register_dev (dev, q); +blk_mq_debugfs_register (q); +kobject_uevent (&q->kobj,KOBJ_ADD );wbt_enable_default (q);
include/linux/blk-mq.h +4 -0
@@ -57,6 +57,10 @@ struct blk_mq_hw_ctx {unsigned long poll_considered;unsigned long poll_invoked;unsigned long poll_success; + +#ifdef CONFIG_BLK_DEBUG_FS +struct dentry *debugfs_dir; +#endif };struct blk_mq_tag_set {
include/linux/blkdev.h +0 -1
@@ -579,7 +579,6 @@ struct request_queue {#ifdef CONFIG_BLK_DEBUG_FS struct dentry *debugfs_dir; -struct dentry *mq_debugfs_dir;#endif bool mq_sysfs_init_done;
Signature · 1 line
2.12.2
Re: [PATCH v2 09/12] blk-mq: untangle debugfs and sysfs
Quoted 12 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
Originally, I tied debugfs registration/unregistration together with sysfs. There's no reason to do this, and it's getting in the way of letting schedulers define their own debugfs attributes. Instead, tie the debugfs registration to the lifetime of the structures themselves.
The saner lifetimes mean we can also get rid of the extra mq directory and move everything one level up. I.e., nvme0n1/mq/hctx0/tags is now just nvme0n1/hctx0/tags.
Signed-off-by Omar Sandoval <[email protected]>
Quoted 11 lines
--- block/blk-core.c | 9 +--- block/blk-mq-debugfs.c | 110 ++++++++++++++++++++++++++++--------------------- block/blk-mq-debugfs.h | 21 ++++++++-- block/blk-mq-sysfs.c | 11 ----- block/blk-mq.c | 7 ++++ block/blk-sysfs.c | 2 + include/linux/blk-mq.h | 4 ++ include/linux/blkdev.h | 1 - 8 files changed, 94 insertions(+), 71 deletions(-)
Again, I really liked the symmetry between sysfs and debugfs mq entries. This will definitely break it.
Not sure if that's a real issue, but personally I liked the mapping.
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
PATCH v2 10/12 blk-mq-debugfs: allow schedulers to register debugfs attributes
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
This provides the infrastructure for schedulers to expose their internal state through debugfs. We add a list of queue attributes and a list of hctx attributes to struct elevator_type and wire them up when switching schedulers.
--- block/blk-mq-debugfs.c | 74 ++++++++++++++++++++++++++++++++++++++++++------ block/blk-mq-debugfs.h | 34 ++++++++++++++++++++++ block/blk-mq-sched.c | 24 ++++++++++------ include/linux/blk-mq.h | 1 + include/linux/blkdev.h | 1 + include/linux/elevator.h | 7 +++++ 6 files changed, 124 insertions(+), 17 deletions(-)
block/blk-mq-debugfs.c +65 -9
@@ -24,15 +24,6 @@#include "blk-mq-debugfs.h" #include "blk-mq-tag.h" -struct blk_mq_debugfs_attr { -const char *name; -umode_t mode; -int (*show)(void *,struct seq_file *); -ssize_t (*write)(void *,const char __user *,size_t ,loff_t *); -/* Set either .show or .seq_ops. */ -const struct seq_operations *seq_ops; -}; -static int blk_flags_show (struct seq_file *m,const unsigned long flags,const char *const *flag_name,int flag_name_count) {
@@ -725,6 +716,9 @@ int blk_mq_debugfs_register(struct request_queue *q)queue_for_each_hw_ctx (q, hctx, i) {if (!hctx->debugfs_dir &&blk_mq_debugfs_register_hctx (q, hctx)) goto err; +if (q->elevator && !hctx->sched_debugfs_dir && +blk_mq_debugfs_register_sched_hctx (q, hctx)) + goto err; }return 0 ;
@@ -737,6 +731,7 @@ int blk_mq_debugfs_register(struct request_queue *q)void blk_mq_debugfs_unregister (struct request_queue *q) {debugfs_remove_recursive (q->debugfs_dir); + q->sched_debugfs_dir =NULL ; q->debugfs_dir =NULL ; }
@@ -791,6 +786,7 @@ int blk_mq_debugfs_register_hctx(struct request_queue *q,void blk_mq_debugfs_unregister_hctx (struct blk_mq_hw_ctx *hctx) {debugfs_remove_recursive (hctx->debugfs_dir); + hctx->sched_debugfs_dir =NULL ; hctx->debugfs_dir =NULL ; }
@@ -815,3 +811,63 @@ void blk_mq_debugfs_unregister_hctxs(struct request_queue *q)queue_for_each_hw_ctx (q, hctx, i)blk_mq_debugfs_unregister_hctx (hctx); } + +int blk_mq_debugfs_register_sched (struct request_queue *q) +{ +struct elevator_type *e = q->elevator->type; + +if (!q->debugfs_dir) +return -ENOENT ; + +if (!e->queue_debugfs_attrs) +return 0 ; + + q->sched_debugfs_dir =debugfs_create_dir ("sched" , q->debugfs_dir); +if (!q->sched_debugfs_dir) +return -ENOMEM ; + +if (!debugfs_create_files (q->sched_debugfs_dir, q, + e->queue_debugfs_attrs)) + goto err; + +return 0 ; + +err: +blk_mq_debugfs_unregister_sched (q); +return -ENOMEM ; +} + +void blk_mq_debugfs_unregister_sched (struct request_queue *q) +{ +debugfs_remove_recursive (q->sched_debugfs_dir); + q->sched_debugfs_dir =NULL ; +} + +int blk_mq_debugfs_register_sched_hctx (struct request_queue *q, +struct blk_mq_hw_ctx *hctx) +{ +struct elevator_type *e = q->elevator->type; + +if (!hctx->debugfs_dir) +return -ENOENT ; + +if (!e->hctx_debugfs_attrs) +return 0 ; + + hctx->sched_debugfs_dir =debugfs_create_dir ("sched" , + hctx->debugfs_dir); +if (!hctx->sched_debugfs_dir) +return -ENOMEM ; + +if (!debugfs_create_files (hctx->sched_debugfs_dir, hctx, + e->hctx_debugfs_attrs)) +return -ENOMEM ; + +return 0 ; +} + +void blk_mq_debugfs_unregister_sched_hctx (struct blk_mq_hw_ctx *hctx) +{ +debugfs_remove_recursive (hctx->sched_debugfs_dir); + hctx->sched_debugfs_dir =NULL ; +}
block/blk-mq-debugfs.h +34 -0
@@ -2,6 +2,15 @@#define INT_BLK_MQ_DEBUGFS_H #ifdef CONFIG_BLK_DEBUG_FS +struct blk_mq_debugfs_attr { +const char *name; +umode_t mode; +int (*show)(void *,struct seq_file *); +ssize_t (*write)(void *,const char __user *,size_t ,loff_t *); +/* Set either .show or .seq_ops. */ +const struct seq_operations *seq_ops; +}; +int blk_mq_debugfs_register (struct request_queue *q);void blk_mq_debugfs_unregister (struct request_queue *q); int blk_mq_debugfs_register_hctx(struct request_queue *q,
@@ -9,6 +18,12 @@ int blk_mq_debugfs_register_hctx(struct request_queue *q,void blk_mq_debugfs_unregister_hctx (struct blk_mq_hw_ctx *hctx);int blk_mq_debugfs_register_hctxs (struct request_queue *q);void blk_mq_debugfs_unregister_hctxs (struct request_queue *q); + +int blk_mq_debugfs_register_sched (struct request_queue *q); +void blk_mq_debugfs_unregister_sched (struct request_queue *q); +int blk_mq_debugfs_register_sched_hctx (struct request_queue *q, +struct blk_mq_hw_ctx *hctx); +void blk_mq_debugfs_unregister_sched_hctx (struct blk_mq_hw_ctx *hctx);#else static inline int blk_mq_debugfs_register (struct request_queue *q) {
@@ -37,6 +52,25 @@ static inline int blk_mq_debugfs_register_hctxs(struct request_queue *q)static inline void blk_mq_debugfs_unregister_hctxs (struct request_queue *q) { } + +static inline int blk_mq_debugfs_register_sched (struct request_queue *q) +{ +return 0 ; +} + +static inline void blk_mq_debugfs_unregister_sched (struct request_queue *q) +{ +} + +static inline int blk_mq_debugfs_register_sched_hctx (struct request_queue *q, +struct blk_mq_hw_ctx *hctx) +{ +return 0 ; +} + +static inline void blk_mq_debugfs_unregister_sched_hctx (struct blk_mq_hw_ctx *hctx) +{ +}#endif #endif
block/blk-mq-sched.c +16 -8
@@ -11,6 +11,7 @@#include "blk.h" #include "blk-mq.h" +#include "blk-mq-debugfs.h" #include "blk-mq-sched.h" #include "blk-mq-tag.h" #include "blk-wbt.h"
@@ -476,6 +477,8 @@ int blk_mq_sched_init_hctx(struct request_queue *q, struct blk_mq_hw_ctx *hctx, } } +blk_mq_debugfs_register_sched_hctx (q, hctx); +return 0 ; }
@@ -487,6 +490,8 @@ void blk_mq_sched_exit_hctx(struct request_queue *q, struct blk_mq_hw_ctx *hctx,if (!e)return ; +blk_mq_debugfs_unregister_sched_hctx (hctx); +if (e->type->ops.mq.exit_hctx && hctx->sched_data) { e->type->ops.mq.exit_hctx (hctx, hctx_idx); hctx->sched_data =NULL ;
@@ -523,8 +528,10 @@ int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e)if (ret) goto err; -if (e->ops.mq.init_hctx) { -queue_for_each_hw_ctx (q, hctx, i) { +blk_mq_debugfs_register_sched (q); + +queue_for_each_hw_ctx (q, hctx, i) { +if (e->ops.mq.init_hctx) { ret = e->ops.mq.init_hctx (hctx, i);if (ret) { eq = q->elevator;
@@ -533,6 +540,7 @@ int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e)return ret; } } +blk_mq_debugfs_register_sched_hctx (q, hctx); }return 0 ;
@@ -548,14 +556,14 @@ void blk_mq_exit_sched(struct request_queue *q, struct elevator_queue *e)struct blk_mq_hw_ctx *hctx;unsigned int i; -if (e->type->ops.mq.exit_hctx) { -queue_for_each_hw_ctx (q, hctx, i) { -if (hctx->sched_data) { - e->type->ops.mq.exit_hctx (hctx, i); - hctx->sched_data =NULL ; - } +queue_for_each_hw_ctx (q, hctx, i) { +blk_mq_debugfs_unregister_sched_hctx (hctx); +if (e->type->ops.mq.exit_hctx && hctx->sched_data) { + e->type->ops.mq.exit_hctx (hctx, i); + hctx->sched_data =NULL ; } } +blk_mq_debugfs_unregister_sched (q);if (e->type->ops.mq.exit_sched) e->type->ops.mq.exit_sched (e);blk_mq_sched_tags_teardown (q);
include/linux/blk-mq.h +1 -0
@@ -60,6 +60,7 @@ struct blk_mq_hw_ctx {#ifdef CONFIG_BLK_DEBUG_FS struct dentry *debugfs_dir; +struct dentry *sched_debugfs_dir;#endif };
include/linux/blkdev.h +1 -0
@@ -579,6 +579,7 @@ struct request_queue {#ifdef CONFIG_BLK_DEBUG_FS struct dentry *debugfs_dir; +struct dentry *sched_debugfs_dir;#endif bool mq_sysfs_init_done;
include/linux/elevator.h +7 -0
@@ -8,6 +8,9 @@struct io_cq ;struct elevator_type ; +#ifdef CONFIG_BLK_DEBUG_FS +struct blk_mq_debugfs_attr ; +#endif /* * Return values from elevator merger
@@ -144,6 +147,10 @@ struct elevator_typechar elevator_name[ELV_NAME_MAX ];struct module *elevator_owner;bool uses_mq; +#ifdef CONFIG_BLK_DEBUG_FS +const struct blk_mq_debugfs_attr *queue_debugfs_attrs; +const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; +#endif /* managed by elevator core */ char icq_cache_name[ELV_NAME_MAX +5 ];/* elvname + "_io_cq" */
Signature · 1 line
2.12.2
Re: [PATCH v2 10/12] blk-mq-debugfs: allow schedulers to register debugfs attributes
Quoted 8 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
This provides the infrastructure for schedulers to expose their internal state through debugfs. We add a list of queue attributes and a list of hctx attributes to struct
elevator_typeand wire them up when switching schedulers.Signed-off-by Omar Sandoval <[email protected]>
Quoted 9 lines
--- block/blk-mq-debugfs.c | 74 ++++++++++++++++++++++++++++++++++++++++++------ block/blk-mq-debugfs.h | 34 ++++++++++++++++++++++ block/blk-mq-sched.c | 24 ++++++++++------ include/linux/blk-mq.h | 1 + include/linux/blkdev.h | 1 + include/linux/elevator.h | 7 +++++ 6 files changed, 124 insertions(+), 17 deletions(-)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
Jens Axboe
maintainerRe: [PATCH v2 10/12] blk-mq-debugfs: allow schedulers to register debugfs attributes
In reply to Omar SandovalQuoted 10 lines · Omar Sandoval
block/blk-mq-debugfs.h +2
-0@@ -2,6 +2,15 @@#define INT_BLK_MQ_DEBUGFS_H #ifdef CONFIG_BLK_DEBUG_FS +struct blk_mq_debugfs_attr { + const char *name;
block/blk-mq-debugfs.h line 16
Quoted 10 lines
block/blk-mq-debugfs.h +7
-0+umode_t mode; +int (*show)(void *,struct seq_file *); +ssize_t (*write)(void *,const char __user *,size_t ,loff_t *); +/* Set either .show or .seq_ops. */ +const struct seq_operations *seq_ops; +}; +int blk_mq_debugfs_register (struct request_queue *q);void blk_mq_debugfs_unregister (struct request_queue *q); int blk_mq_debugfs_register_hctx(struct request_queue *q,
This needs a <linux/seq_file.h> include in blk-mq-debugfs.h, or my compile starts breaking on both kyber and mq-deadline.
Signature · 1 line
Jens Axboe
PATCH v2 11/12 kyber: add debugfs attributes
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
Expose the domain token pools, asynchronous sbitmap depth, domain request lists, and batching state.
--- block/blk-mq-debugfs.c | 3 +- block/blk-mq-debugfs.h | 2 + block/kyber-iosched.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 1 deletion(-)
block/blk-mq-debugfs.c +2 -1
@@ -267,7 +267,7 @@ static const char *const rqf_name[] = { };#undef RQF_NAME -static int blk_mq_debugfs_rq_show (struct seq_file *m,void *v) +int blk_mq_debugfs_rq_show (struct seq_file *m,void *v) {struct request *rq =list_entry_rq (v);const struct blk_mq_ops *const mq_ops = rq->q->mq_ops;
@@ -291,6 +291,7 @@ static int blk_mq_debugfs_rq_show(struct seq_file *m, void *v)seq_puts (m,"}\n" );return 0 ; } +EXPORT_SYMBOL_GPL (blk_mq_debugfs_rq_show);static void *hctx_dispatch_start (struct seq_file *m,loff_t *pos) __acquires(&hctx->lock)
block/blk-mq-debugfs.h +2 -0
@@ -11,6 +11,8 @@ struct blk_mq_debugfs_attr {const struct seq_operations *seq_ops; }; +int blk_mq_debugfs_rq_show (struct seq_file *m,void *v); +int blk_mq_debugfs_register (struct request_queue *q);void blk_mq_debugfs_unregister (struct request_queue *q); int blk_mq_debugfs_register_hctx(struct request_queue *q,
block/kyber-iosched.c +130 -0
148 lines not on this page · raw message
Signature · 1 line
2.12.2
Re: [PATCH v2 11/12] kyber: add debugfs attributes
Quoted 5 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
Expose the domain token pools, asynchronous sbitmap depth, domain request lists, and batching state.
Quoted 7 lines
Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 3 +- block/blk-mq-debugfs.h | 2 + block/kyber-iosched.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 1 deletion(-)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)
Re: [PATCH v2 11/12] kyber: add debugfs attributes
In reply to Omar SandovalQuoted 1 line · Omar Sandoval
+#define
KYBER_DEBUGFS_DOMAIN_ATTRS(domain, name)
Hello Omar,
That's a really long macro name. Have you considered to leave out "_DOMAIN" from the name of this and related macros?
Bart.=
PATCH v2 12/12 mq-deadline: add debugfs attributes
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
Expose the fifo lists, cached next requests, batching state, and dispatch list. It'd also be possible to add the sorted lists, but there aren't already seq_file helpers for rbtrees.
--- block/blk-mq-debugfs.c | 9 +++- block/blk-mq-debugfs.h | 1 + block/mq-deadline.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 2 deletions(-)
block/blk-mq-debugfs.c +7 -2
@@ -267,9 +267,8 @@ static const char *const rqf_name[] = { };#undef RQF_NAME -int blk_mq_debugfs_rq_show (struct seq_file *m,void *v) +int __blk_mq_debugfs_rq_show (struct seq_file *m,struct request *rq) { -struct request *rq =list_entry_rq (v);const struct blk_mq_ops *const mq_ops = rq->q->mq_ops;const unsigned int op = rq->cmd_flags &REQ_OP_MASK ;
@@ -291,6 +290,12 @@ int blk_mq_debugfs_rq_show(struct seq_file *m, void *v)seq_puts (m,"}\n" );return 0 ; } +EXPORT_SYMBOL_GPL (__blk_mq_debugfs_rq_show); + +int blk_mq_debugfs_rq_show (struct seq_file *m,void *v) +{ +return __blk_mq_debugfs_rq_show (m,list_entry_rq (v)); +}EXPORT_SYMBOL_GPL (blk_mq_debugfs_rq_show);static void *hctx_dispatch_start (struct seq_file *m,loff_t *pos)
block/blk-mq-debugfs.h +1 -0
@@ -11,6 +11,7 @@ struct blk_mq_debugfs_attr {const struct seq_operations *seq_ops; }; +int __blk_mq_debugfs_rq_show (struct seq_file *m,struct request *rq);int blk_mq_debugfs_rq_show (struct seq_file *m,void *v);int blk_mq_debugfs_register (struct request_queue *q);
block/mq-deadline.c +123 -0
141 lines not on this page · raw message
Signature · 1 line
2.12.2
Re: [PATCH v2 12/12] mq-deadline: add debugfs attributes
Quoted 6 lines · Omar Sandoval
From: Omar Sandoval <[email protected]>
Expose the fifo lists, cached next requests, batching state, and dispatch list. It'd also be possible to add the sorted lists, but there aren't already
seq_filehelpers for rbtrees.
Quoted 7 lines
Signed-off-by Omar Sandoval <[email protected]>--- block/blk-mq-debugfs.c | 9 +++- block/blk-mq-debugfs.h | 1 + block/mq-deadline.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 2 deletions(-)
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke Teamlead Storage & Networking [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: F. Imend�rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG N�rnberg)