RE: [PATCH 3/3] powerpc/fsl: add MPIC timer wakeup support
flat view
From: Wang Dongsheng-B40534 <hidden>
Date: 2013-03-20 03:49:14
-----Original Message----- From: Wood Scott-B07421 Sent: Wednesday, March 20, 2013 6:55 AM To: Wang Dongsheng-B40534 Cc: Wood Scott-B07421; Gala Kumar-B11780; linuxppc-dev@lists.ozlabs.org; Zhao Chenhui-B35336; Li Yang-R58472 Subject: Re: [PATCH 3/3] powerpc/fsl: add MPIC timer wakeup support =20 On 03/19/2013 01:25:42 AM, Wang Dongsheng-B40534 wrote:quoted
quoted
-----Original Message----- From: Wood Scott-B07421 Sent: Tuesday, March 19, 2013 8:31 AM To: Wang Dongsheng-B40534 Cc: Gala Kumar-B11780; linuxppc-dev@lists.ozlabs.org; WangDongsheng-quoted
B40534; Zhao Chenhui-B35336; Li Yang-R58472 Subject: Re: [PATCH 3/3] powerpc/fsl: add MPIC timer wakeup support On 03/08/2013 01:38:47 AM, Wang Dongsheng wrote:quoted
+static ssize_t fsl_timer_wakeup_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct timeval interval; + int ret; + + interval.tv_usec =3D 0; + if (kstrtol(buf, 0, &interval.tv_sec)) + return -EINVAL;I don't think the buffer will NUL-terminated... Ordinarilythere'll bequoted
an LF terminator, but you can't rely on that (many other sysfsattributesquoted
seem to, though...).I think we don't need to care about LF terminator. The kstrtol--> _kstrtoull has been done.=20 My point is, what happens if userspace passes in a buffer that has no terminator of any sort? kstrtol will continue reading beyond the end of the buffer. =20
Do not care about terminator.
kstrtol--> _kstrtoull--> _parse_integer
_kstrtoull(...) {
...
rv =3D _parse_integer(s, base, &_res);
if (rv & KSTRTOX_OVERFLOW)
return -ERANGE;
rv &=3D ~KSTRTOX_OVERFLOW;
if (rv =3D=3D 0)
return -EINVAL;
s +=3D rv;
if (*s =3D=3D '\n')
s++;
if (*s)
return -EINVAL;
...
}
_parse_integer(...) {
...
while (*s) {
if ('0' <=3D *s && *s <=3D '9')
val =3D *s - '0';
else if ('a' <=3D _tolower(*s) && _tolower(*s) <=3D 'f')
val =3D _tolower(*s) - 'a' + 10;
else
break; //this will break out to convert.
if (val >=3D base)
break;
}
...
}
quoted
quoted
quoted
+ mutex_lock(&sysfs_lock); + + if (fsl_wakeup->timer && !interval.tv_sec) { + disable_irq_wake(fsl_wakeup->timer->irq); + mpic_free_timer(fsl_wakeup->timer); + fsl_wakeup->timer =3D NULL; + mutex_unlock(&sysfs_lock); + + return count; + } + + if (fsl_wakeup->timer) { + mutex_unlock(&sysfs_lock); + return -EBUSY; + }So to change an already-set timer you have to set it to zero andthen toquoted
what you want? Why not just do: if (fsl_wakeup->timer) { disable_irq_wake(...); mpic_free_timer(...); fsl_wakeup_timer =3D NULL; } if (!interval.tv_sec) { mutex_unlock(&sysfs_lock); return count; }You can't break up the it. if echo zero the code will cancel the timer that is currently running. Not echo non-zero value just zero to cancel.=20 Echoing a nonzero value wouldn't just be to cancel, it would be to set a new timer after cancelling the old. =20
If you think this way is better, I can change. But why should do it?=20 Explicitly stop the timer (echo 0) before reuse it is more reasonable for m= e.=20
quoted
quoted
quoted
+ for (i =3D 0; mpic_attributes[i]; i++) { + ret =3D device_create_file(mpic_subsys.dev_root, + mpic_attributes[i]); + if (ret) + goto err2; + }Is this code ever going to register more than one?No, just one. I only keep the style here. If you don't think it's necessary I can remove this loop.=20 I don't think it's necessary. =20
Ok, I will remove this loop.