Messages in this thread | | | From | Joel Stanley <> | Date | Fri, 15 Oct 2021 05:08:47 +0000 | Subject | Re: [PATCH] fsi: sbefifo: Add sysfs file indicating a timeout error |
| |
On Mon, 20 Sept 2021 at 19:00, Eddie James <eajames@linux.ibm.com> wrote: > > The SBEFIFO timeout error requires special handling in userspace > to do recovery operations. Add a sysfs file to indicate a timeout > error, and notify pollers when a timeout occurs.
Should this have some documentation too?
What userspace uses this?
Looks good to me otherwise.
Reviewed-by: Joel Stanley <joel@jms.id.au>
> > Signed-off-by: Eddie James <eajames@linux.ibm.com> > --- > drivers/fsi/fsi-sbefifo.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c > index 84cb965bfed5..b414ab4431ef 100644 > --- a/drivers/fsi/fsi-sbefifo.c > +++ b/drivers/fsi/fsi-sbefifo.c > @@ -124,6 +124,7 @@ struct sbefifo { > bool broken; > bool dead; > bool async_ffdc; > + bool timed_out; > }; > > struct sbefifo_user { > @@ -136,6 +137,14 @@ struct sbefifo_user { > > static DEFINE_MUTEX(sbefifo_ffdc_mutex); > > +static ssize_t timeout_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct sbefifo *sbefifo = container_of(dev, struct sbefifo, dev); > + > + return sysfs_emit(buf, "%d\n", sbefifo->timed_out ? 1 : 0); > +} > +static DEVICE_ATTR_RO(timeout); > > static void __sbefifo_dump_ffdc(struct device *dev, const __be32 *ffdc, > size_t ffdc_sz, bool internal) > @@ -462,11 +471,14 @@ static int sbefifo_wait(struct sbefifo *sbefifo, bool up, > break; > } > if (!ready) { > + sysfs_notify(&sbefifo->dev.kobj, NULL, dev_attr_timeout.attr.name); > + sbefifo->timed_out = true; > dev_err(dev, "%s FIFO Timeout ! status=%08x\n", up ? "UP" : "DOWN", sts); > return -ETIMEDOUT; > } > dev_vdbg(dev, "End of wait status: %08x\n", sts); > > + sbefifo->timed_out = false; > *status = sts; > > return 0; > @@ -993,6 +1005,8 @@ static int sbefifo_probe(struct device *dev) > child_name); > } > > + device_create_file(&sbefifo->dev, &dev_attr_timeout); > + > return 0; > err_free_minor: > fsi_free_minor(sbefifo->dev.devt); > @@ -1018,6 +1032,8 @@ static int sbefifo_remove(struct device *dev) > > dev_dbg(dev, "Removing sbefifo device...\n"); > > + device_remove_file(&sbefifo->dev, &dev_attr_timeout); > + > mutex_lock(&sbefifo->lock); > sbefifo->dead = true; > mutex_unlock(&sbefifo->lock); > -- > 2.27.0 >
| |