diff mbox series

[v3] block: add documentation for io_timeout

Message ID 20181205141701.GA33910@192.168.3.9 (mailing list archive)
State New, archived
Headers show
Series [v3] block: add documentation for io_timeout | expand

Commit Message

Weiping Zhang Dec. 5, 2018, 2:17 p.m. UTC
Add documentation for /sys/block/<disk>/queue/io_timeout.

Signed-off-by: Weiping Zhang <zhangweiping@didiglobal.com>
---
 Documentation/ABI/testing/sysfs-block | 10 ++++++++++
 Documentation/block/queue-sysfs.txt   |  7 +++++++
 2 files changed, 17 insertions(+)

Comments

Christoph Hellwig Dec. 5, 2018, 2:40 p.m. UTC | #1
Can you please also send a patch to not show this attribute for
drivers without a timeout handler?  Thanks!

On Wed, Dec 05, 2018 at 10:17:06PM +0800, Weiping Zhang wrote:
> Add documentation for /sys/block/<disk>/queue/io_timeout.
> 
> Signed-off-by: Weiping Zhang <zhangweiping@didiglobal.com>
> ---
>  Documentation/ABI/testing/sysfs-block | 10 ++++++++++
>  Documentation/block/queue-sysfs.txt   |  7 +++++++
>  2 files changed, 17 insertions(+)
> 
> diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block
> index dea212db9df3..f254a374710a 100644
> --- a/Documentation/ABI/testing/sysfs-block
> +++ b/Documentation/ABI/testing/sysfs-block
> @@ -271,3 +271,13 @@ Description:
>  		size of 512B sectors of the zones of the device, with
>  		the eventual exception of the last zone of the device
>  		which may be smaller.
> +
> +What:		/sys/block/<disk>/queue/io_timeout
> +Date:		November 2018
> +Contact:	Weiping Zhang <zhangweiping@didiglobal.com>
> +Description:
> +		io_timeout is a request’s timeouts at block layer in
> +		milliseconds. When the underlying driver starts processing
> +		a request, the generic block layer will start a timer, if
> +		this request cannot be completed in io_timeout milliseconds,
> +		a timeout event will occur.
> diff --git a/Documentation/block/queue-sysfs.txt b/Documentation/block/queue-sysfs.txt
> index 2c1e67058fd3..f0c9bbce73fd 100644
> --- a/Documentation/block/queue-sysfs.txt
> +++ b/Documentation/block/queue-sysfs.txt
> @@ -67,6 +67,13 @@ If set to a value larger than 0, the kernel will put the process issuing
>  IO to sleep for this amont of microseconds before entering classic
>  polling.
>  
> +io_timeout (RW)
> +---------------
> +This is a request’s timeouts at block layer in milliseconds. When the
> +underlying driver starts processing a request, the generic block layer
> +will start a timer, if this request cannot be completed in io_timeout
> +milliseconds, a timeout event will occur.
> +
>  iostats (RW)
>  -------------
>  This file is used to control (on/off) the iostats accounting of the
> -- 
> 2.14.1
> 
---end quoted text---
Weiping Zhang Dec. 5, 2018, 2:49 p.m. UTC | #2
Christoph Hellwig <hch@infradead.org> 于2018年12月5日周三 下午10:40写道:
>
> Can you please also send a patch to not show this attribute for
> drivers without a timeout handler?  Thanks!
>
Do you means checking q->mq_ops->timeout is NULL or not ?

static void blk_mq_rq_timed_out(struct request *req, bool reserved)
{
        req->rq_flags |= RQF_TIMED_OUT;
If it's NULL, only re-start a timer for this request in blk_add_timer.
Is there some defect ? if show this attribute and the driver doesn't
support timeout handler ?

        if (req->q->mq_ops->timeout) {
                enum blk_eh_timer_return ret;

                ret = req->q->mq_ops->timeout(req, reserved);
                if (ret == BLK_EH_DONE)
                        return;
                WARN_ON_ONCE(ret != BLK_EH_RESET_TIMER);
        }

        blk_add_timer(req);
}


> On Wed, Dec 05, 2018 at 10:17:06PM +0800, Weiping Zhang wrote:
> > Add documentation for /sys/block/<disk>/queue/io_timeout.
> >
> > Signed-off-by: Weiping Zhang <zhangweiping@didiglobal.com>
> > ---
> >  Documentation/ABI/testing/sysfs-block | 10 ++++++++++
> >  Documentation/block/queue-sysfs.txt   |  7 +++++++
> >  2 files changed, 17 insertions(+)
> >
> > diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block
> > index dea212db9df3..f254a374710a 100644
> > --- a/Documentation/ABI/testing/sysfs-block
> > +++ b/Documentation/ABI/testing/sysfs-block
> > @@ -271,3 +271,13 @@ Description:
> >               size of 512B sectors of the zones of the device, with
> >               the eventual exception of the last zone of the device
> >               which may be smaller.
> > +
> > +What:                /sys/block/<disk>/queue/io_timeout
> > +Date:                November 2018
> > +Contact:     Weiping Zhang <zhangweiping@didiglobal.com>
> > +Description:
> > +             io_timeout is a request’s timeouts at block layer in
> > +             milliseconds. When the underlying driver starts processing
> > +             a request, the generic block layer will start a timer, if
> > +             this request cannot be completed in io_timeout milliseconds,
> > +             a timeout event will occur.
> > diff --git a/Documentation/block/queue-sysfs.txt b/Documentation/block/queue-sysfs.txt
> > index 2c1e67058fd3..f0c9bbce73fd 100644
> > --- a/Documentation/block/queue-sysfs.txt
> > +++ b/Documentation/block/queue-sysfs.txt
> > @@ -67,6 +67,13 @@ If set to a value larger than 0, the kernel will put the process issuing
> >  IO to sleep for this amont of microseconds before entering classic
> >  polling.
> >
> > +io_timeout (RW)
> > +---------------
> > +This is a request’s timeouts at block layer in milliseconds. When the
> > +underlying driver starts processing a request, the generic block layer
> > +will start a timer, if this request cannot be completed in io_timeout
> > +milliseconds, a timeout event will occur.
> > +
> >  iostats (RW)
> >  -------------
> >  This file is used to control (on/off) the iostats accounting of the
> > --
> > 2.14.1
> >
> ---end quoted text---
Weiping Zhang Dec. 5, 2018, 2:59 p.m. UTC | #3
Weiping Zhang <zwp10758@gmail.com> 于2018年12月5日周三 下午10:49写道:
>
> Christoph Hellwig <hch@infradead.org> 于2018年12月5日周三 下午10:40写道:
> >
> > Can you please also send a patch to not show this attribute for
> > drivers without a timeout handler?  Thanks!
> >
Is there a simple way do that ?

Shall we return -ENOTSUPP when user read/write this attribute when
driver has no timeout handler ?
> Do you means checking q->mq_ops->timeout is NULL or not ?
>
> static void blk_mq_rq_timed_out(struct request *req, bool reserved)
> {
>         req->rq_flags |= RQF_TIMED_OUT;
> If it's NULL, only re-start a timer for this request in blk_add_timer.
> Is there some defect ? if show this attribute and the driver doesn't
> support timeout handler ?
>
>         if (req->q->mq_ops->timeout) {
>                 enum blk_eh_timer_return ret;
>
>                 ret = req->q->mq_ops->timeout(req, reserved);
>                 if (ret == BLK_EH_DONE)
>                         return;
>                 WARN_ON_ONCE(ret != BLK_EH_RESET_TIMER);
>         }
>
>         blk_add_timer(req);
> }
>
>
> > On Wed, Dec 05, 2018 at 10:17:06PM +0800, Weiping Zhang wrote:
> > > Add documentation for /sys/block/<disk>/queue/io_timeout.
> > >
> > > Signed-off-by: Weiping Zhang <zhangweiping@didiglobal.com>
> > > ---
> > >  Documentation/ABI/testing/sysfs-block | 10 ++++++++++
> > >  Documentation/block/queue-sysfs.txt   |  7 +++++++
> > >  2 files changed, 17 insertions(+)
> > >
> > > diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block
> > > index dea212db9df3..f254a374710a 100644
> > > --- a/Documentation/ABI/testing/sysfs-block
> > > +++ b/Documentation/ABI/testing/sysfs-block
> > > @@ -271,3 +271,13 @@ Description:
> > >               size of 512B sectors of the zones of the device, with
> > >               the eventual exception of the last zone of the device
> > >               which may be smaller.
> > > +
> > > +What:                /sys/block/<disk>/queue/io_timeout
> > > +Date:                November 2018
> > > +Contact:     Weiping Zhang <zhangweiping@didiglobal.com>
> > > +Description:
> > > +             io_timeout is a request’s timeouts at block layer in
> > > +             milliseconds. When the underlying driver starts processing
> > > +             a request, the generic block layer will start a timer, if
> > > +             this request cannot be completed in io_timeout milliseconds,
> > > +             a timeout event will occur.
> > > diff --git a/Documentation/block/queue-sysfs.txt b/Documentation/block/queue-sysfs.txt
> > > index 2c1e67058fd3..f0c9bbce73fd 100644
> > > --- a/Documentation/block/queue-sysfs.txt
> > > +++ b/Documentation/block/queue-sysfs.txt
> > > @@ -67,6 +67,13 @@ If set to a value larger than 0, the kernel will put the process issuing
> > >  IO to sleep for this amont of microseconds before entering classic
> > >  polling.
> > >
> > > +io_timeout (RW)
> > > +---------------
> > > +This is a request’s timeouts at block layer in milliseconds. When the
> > > +underlying driver starts processing a request, the generic block layer
> > > +will start a timer, if this request cannot be completed in io_timeout
> > > +milliseconds, a timeout event will occur.
> > > +
> > >  iostats (RW)
> > >  -------------
> > >  This file is used to control (on/off) the iostats accounting of the
> > > --
> > > 2.14.1
> > >
> > ---end quoted text---
Bart Van Assche Dec. 6, 2018, 4:06 p.m. UTC | #4
On Wed, 2018-12-05 at 22:59 +0800, Weiping Zhang wrote:
> Weiping Zhang <zwp10758@gmail.com> 于2018年12月5日周三 下午10:49写道:
> > Christoph Hellwig <hch@infradead.org> 于2018年12月5日周三 下午10:40写道:
> > > Can you please also send a patch to not show this attribute for
> > > drivers without a timeout handler?  Thanks!
> 
> Is there a simple way do that ?

How about checking the timeout member of struct blk_mq_ops for blk-mq and
checking the rq_timed_out_fn member in struct request_queue for the legacy
block layer?

> Shall we return -ENOTSUPP when user read/write this attribute when
> driver has no timeout handler ?

A much more elegant solution is to introduce a sysfs attribute group for the
io_timeout attribute and to make that group visible only if a timeout handler
has been defined. See e.g. disk_attr_group in block/genhd.c for an example.

Bart.
Bart Van Assche Dec. 6, 2018, 4:19 p.m. UTC | #5
On Wed, 2018-12-05 at 22:17 +0800, Weiping Zhang wrote:
> +Description:
> +		io_timeout is a request’s timeouts at block layer in
> +		milliseconds. When the underlying driver starts processing
> +		a request, the generic block layer will start a timer, if
> +		this request cannot be completed in io_timeout milliseconds,
> +		a timeout event will occur.

Sorry but I think this description is still somewhat confusing. How about
changing that description into the following?

	io_timeout is the request timeout in milliseconds. If a request does not
	complete in this time then the block driver timeout handler is invoked.
	That timeout handler can decide to retry the request, to fail it or to
	start a device recovery strategy.

Bart.
Christoph Hellwig Dec. 6, 2018, 4:19 p.m. UTC | #6
On Thu, Dec 06, 2018 at 08:06:16AM -0800, Bart Van Assche wrote:
> On Wed, 2018-12-05 at 22:59 +0800, Weiping Zhang wrote:
> > Weiping Zhang <zwp10758@gmail.com> 于2018年12月5日周三 下午10:49写道:
> > > Christoph Hellwig <hch@infradead.org> 于2018年12月5日周三 下午10:40写道:
> > > > Can you please also send a patch to not show this attribute for
> > > > drivers without a timeout handler?  Thanks!
> > 
> > Is there a simple way do that ?
> 
> How about checking the timeout member of struct blk_mq_ops for blk-mq and
> checking the rq_timed_out_fn member in struct request_queue for the legacy
> block layer?

Just the former given that the legacy code is gone in for-next.

> > Shall we return -ENOTSUPP when user read/write this attribute when
> > driver has no timeout handler ?
> 
> A much more elegant solution is to introduce a sysfs attribute group for the
> io_timeout attribute and to make that group visible only if a timeout handler
> has been defined. See e.g. disk_attr_group in block/genhd.c for an example.

Agreed, that is the way to go.
Weiping Zhang Dec. 26, 2018, 1:51 a.m. UTC | #7
Bart Van Assche <bvanassche@acm.org> 于2018年12月7日周五 上午12:22写道:
>
> On Wed, 2018-12-05 at 22:17 +0800, Weiping Zhang wrote:
> > +Description:
> > +             io_timeout is a request’s timeouts at block layer in
> > +             milliseconds. When the underlying driver starts processing
> > +             a request, the generic block layer will start a timer, if
> > +             this request cannot be completed in io_timeout milliseconds,
> > +             a timeout event will occur.
>
> Sorry but I think this description is still somewhat confusing. How about
> changing that description into the following?
>
>         io_timeout is the request timeout in milliseconds. If a request does not
>         complete in this time then the block driver timeout handler is invoked.
>         That timeout handler can decide to retry the request, to fail it or to
>         start a device recovery strategy.
>
Sorry for late reply, thanks for your suggestion I'll post it in V4.
> Bart.

>> > Is there a simple way do that ?
>>
>> How about checking the timeout member of struct blk_mq_ops for blk-mq and
>> checking the rq_timed_out_fn member in struct request_queue for the legacy
>> block layer?
>
>Just the former given that the legacy code is gone in for-next.
>
>> > Shall we return -ENOTSUPP when user read/write this attribute when
> >> driver has no timeout handler ?
> >
> >A much more elegant solution is to introduce a sysfs attribute group for the
> >io_timeout attribute and to make that group visible only if a timeout handler
> >has been defined. See e.g. disk_attr_group in block/genhd.c for an example.
>
>Agreed, that is the way to go.

OK, I'll do that.

Thanks
Weiping
diff mbox series

Patch

diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block
index dea212db9df3..f254a374710a 100644
--- a/Documentation/ABI/testing/sysfs-block
+++ b/Documentation/ABI/testing/sysfs-block
@@ -271,3 +271,13 @@  Description:
 		size of 512B sectors of the zones of the device, with
 		the eventual exception of the last zone of the device
 		which may be smaller.
+
+What:		/sys/block/<disk>/queue/io_timeout
+Date:		November 2018
+Contact:	Weiping Zhang <zhangweiping@didiglobal.com>
+Description:
+		io_timeout is a request’s timeouts at block layer in
+		milliseconds. When the underlying driver starts processing
+		a request, the generic block layer will start a timer, if
+		this request cannot be completed in io_timeout milliseconds,
+		a timeout event will occur.
diff --git a/Documentation/block/queue-sysfs.txt b/Documentation/block/queue-sysfs.txt
index 2c1e67058fd3..f0c9bbce73fd 100644
--- a/Documentation/block/queue-sysfs.txt
+++ b/Documentation/block/queue-sysfs.txt
@@ -67,6 +67,13 @@  If set to a value larger than 0, the kernel will put the process issuing
 IO to sleep for this amont of microseconds before entering classic
 polling.
 
+io_timeout (RW)
+---------------
+This is a request’s timeouts at block layer in milliseconds. When the
+underlying driver starts processing a request, the generic block layer
+will start a timer, if this request cannot be completed in io_timeout
+milliseconds, a timeout event will occur.
+
 iostats (RW)
 -------------
 This file is used to control (on/off) the iostats accounting of the