Re: [RFC] watchdog: Add watchdog device control through sysfs attributes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Guenter,

Thanks for review.

On 29/08/2015:09:51:24 AM, Guenter Roeck wrote:
> On Fri, Aug 21, 2015 at 11:18:12PM +0530, Pratyush Anand wrote:
> > This patch adds following attributes to watchdog device's sysfs interface.
> > 
> > * start - writes non zero value to start and zero to stop
> 
> I would suggest to drop this attribute, as well as 'keepalive'.
> Both will make keeping the internal state very difficult, especially
> when we add support for heartbeats triggered by the watchdog core.
> 

OK.

> > * state - reads whether device is active or not(1 for active and 0 for
> > inactive)
> 
> How about reporting the state as text ?

Will change

> 
> > * identity - reads Watchdog device's identity string.
> > * keepalive - writes to ping a watchdog device
> > * timeout - reads current timeout and writes to program a new timeout.
> > * timeleft - reads timeleft before watchdog generates a reset
> > * bootstatus - reads status of the watchdog device at boot
> > * status - reads watchdog device's  internal status bits
> > * nowayout - reads whether nowayout feature was set or not
> > 
> > Testing with iTCO_wdt:
> >  # cd /sys/class/watchdog/watchdog1/
> >  # ls
> > bootstatus  dev  device  identity  keepalive  nowayout  power  start  state
> > status  subsystem  timeleft  timeout  uevent
> >  # cat identity
> > iTCO_wdt
> >  # cat timeout
> > 30
> >  # echo 1 > start
> >  # cat timeleft
> > 26
> >  # echo 120 > timeout
> >  # cat timeleft
> > 116
> >  # echo > keepalive
> >  # cat timeleft
> > 118
> >  # cat state
> > 1
> >  # echo 0 > start
> >  # cat state
> > 0
> >  # cat bootstatus
> > 0
> >  # cat nowayout
> > 0
> >  # cat status
> > cat: status: Operation not supported
> > 
> Unsupported attributes should not appear in the first place.
> Please use is_visible to determine if an attribute should
> be there or not.

Thanks :-).. Will modify.

> 
> > Signed-off-by: Pratyush Anand <panand@xxxxxxxxxx>
> > ---
> >  Documentation/ABI/testing/sysfs-class-watchdog |  74 +++++++++
> >  drivers/watchdog/watchdog_core.c               |   6 +-
> >  drivers/watchdog/watchdog_core.h               |   2 +
> >  drivers/watchdog/watchdog_dev.c                | 206 +++++++++++++++++++++++++
> >  4 files changed, 284 insertions(+), 4 deletions(-)
> >  create mode 100644 Documentation/ABI/testing/sysfs-class-watchdog
> > 
> > diff --git a/Documentation/ABI/testing/sysfs-class-watchdog b/Documentation/ABI/testing/sysfs-class-watchdog
> > new file mode 100644
> > index 000000000000..31e7be53edf8
> > --- /dev/null
> > +++ b/Documentation/ABI/testing/sysfs-class-watchdog
> > @@ -0,0 +1,74 @@
> > +What:		/sys/class/watchdog/watchdogn/bootstatus
> > +Date:		August 2015
> > +Contact:	Pratyush Anand <panand@xxxxxxxxxx>
> 
> Who is normally listed here ? Shouldn't it be the maintainer ?

I am not sure.. Will be happy to change it to
Wim Van Sebroeck <wim@xxxxxxxxx>.

> 
> >  static int __watchdog_register_device(struct watchdog_device *wdd)
> >  {
> > -	int ret, id, devno;
> > +	int ret, id;
> >  
> >  	if (wdd == NULL || wdd->info == NULL || wdd->ops == NULL)
> >  		return -EINVAL;
> > @@ -181,9 +181,7 @@ static int __watchdog_register_device(struct watchdog_device *wdd)
> >  		}
> >  	}
> >  
> > -	devno = wdd->cdev.dev;
> > -	wdd->dev = device_create(watchdog_class, wdd->parent, devno,
> > -					NULL, "watchdog%d", wdd->id);
> > +	wdd->dev = watchdog_device_create(watchdog_class, wdd);
> 
> Can we do this in watchdog_dev_register() ?
> Seems to make more sense than adding another callback into watchdog_dev.c.

I had thought of this, but then will have to change prototype of
watchdog_dev_register() to accept struct class *wdc and which in turn will cause
to change all users of watchdog_dev_register().
Other option could be to add struct class *wdc in struct watchdog_device, but it
did not look nice to me.

> 
> >  	if (IS_ERR(wdd->dev)) {
> > +static ssize_t nowayout_show(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct watchdog_device *wdd = dev_get_drvdata(dev);
> > +	bool nowayout = false;
> > +
> > +	mutex_lock(&wdd->lock);
> > +	if (test_bit(WDOG_NO_WAY_OUT, &wdd->status))
> > +		nowayout = true;
> > +	mutex_unlock(&wdd->lock);
> > +
> > +	return sprintf(buf, "%d\n", nowayout);
> 
> 	return sprintf(buf, "%d\n", !!test_bit(WDOG_NO_WAY_OUT, &wdd->status));
> 
> should do it, and the lock doesn't seem to be very helpful,
> as it doesn't make a difference when the flag is evaluated.

OK.

> 
> > +}
> > +static DEVICE_ATTR_RO(nowayout);
> > +
> > +static ssize_t status_show(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> 
> Please align continuation lines with '('.

OK.

> 
> > +{
> > +	struct watchdog_device *wdd = dev_get_drvdata(dev);
> > +	ssize_t status;
> > +	unsigned int val;
> > +
> > +	status = watchdog_get_status(wdd, &val);
> > +	if (!status)
> > +		status = sprintf(buf, "%u\n", val);
> > +
> 
> This attribute should only be visible if supported.

yes.

> 
> > +	return status;
> > +}
> > +static DEVICE_ATTR_RO(status);
> > +
> > +static ssize_t bootstatus_show(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct watchdog_device *wdd = dev_get_drvdata(dev);
> > +	ssize_t status;
> > +
> > +	mutex_lock(&wdd->lock);
> > +	status = sprintf(buf, "%u\n", wdd->bootstatus);
> > +	mutex_unlock(&wdd->lock);
> > +
> Useless lock.

yes.

> 
> > +static ssize_t timeleft_show(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct watchdog_device *wdd = dev_get_drvdata(dev);
> > +	ssize_t status;
> > +	unsigned int val;
> > +
> > +	status = watchdog_get_timeleft(wdd, &val);
> > +
> > +	if (!status)
> > +		status = sprintf(buf, "%u\n", val);
> > +
> This attribute should only be visible if supported.

yes
> 
> > +	return status;
> > +}
> > +static DEVICE_ATTR_RO(timeleft);
> > +
> > +static ssize_t timeout_store(struct device *dev,
> > +		struct device_attribute *attr, const char *buf, size_t size)
> > +{
> > +	struct watchdog_device *wdd = dev_get_drvdata(dev);
> > +	unsigned int val;
> > +	ssize_t status = 0;
> 
> Unnecessary initialization.

will correct.

> 
> > +
> > +	status = kstrtouint(buf, 0, &val);
> > +	if (!status) {
> > +		status = watchdog_set_timeout(wdd, val);
> > +		if (status >= 0)
> > +			status = watchdog_ping(wdd);
> > +	}
> > +
> > +	if (status < 0)
> > +		return status;
> > +	else
> 
> Unnecessary else.


ok

> 
> > +		return size;
> > +}
> > +
> > +static ssize_t timeout_show(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct watchdog_device *wdd = dev_get_drvdata(dev);
> > +	ssize_t status;
> > +
> > +	mutex_lock(&wdd->lock);
> > +	if (wdd->timeout == 0)
> > +		status = -EOPNOTSUPP;
> 
> Why ?

It has been copied from case WDIOC_GETTIMEOUT: which says:
timeout == 0 means that we don't know the timeout.

> > +
> > +static const struct attribute_group wdt_group = {
> > +	.attrs = wdt_attrs,
> > +};
> > +
> > +static const struct attribute_group *wdt_groups[] = {
> > +	&wdt_group,
> > +	NULL
> > +};
> 
> You should be able to use ATTRIBUTE_GROUPS or __ATTRIBUTE_GROUPS.

Yes, with is_visible __ATTRIBUTE_GROUPS can still be used.

~Pratyush
--
To unsubscribe from this list: send the line "unsubscribe linux-api" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux