Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-31 Thread Tri Vo
On Wed, Jul 31, 2019 at 2:19 PM Rafael J. Wysocki  wrote:
>
> On Wed, Jul 31, 2019 at 7:14 PM Stephen Boyd  wrote:
> >
> > Quoting Rafael J. Wysocki (2019-07-31 04:58:36)
> > > On Wednesday, July 31, 2019 10:34:11 AM CEST Rafael J. Wysocki wrote:
> > > > On Wed, Jul 31, 2019 at 1:41 AM Stephen Boyd  
> > > > wrote:
> > > > >
> > > >
> > > > > We can run into the same problem when two buses name their devices the
> > > > > same name and then we attempt to attach a wakeup source to those two
> > > > > devices. Or we can have a problem where a virtual wakeup is made with
> > > > > the same name, and again we'll try to make a duplicate named device.
> > > > > Using something like 'event' or 'wakeup' or 'ws' as the prefix avoids 
> > > > > this
> > > > > problem and keeps things clean.
> > > >
> > > > Or suffix, like ".
> > > >
> > > > But if prefixes are used by an existing convention, I would prefer
> > > > "ws-" as it is concise enough and should not be confusing.
> >
> > Another possibility is 'eventN', so it reads as /sys/class/wakeup/event0
> >
> > > >
> > > > > We should probably avoid letting the same virtual wakeup source be 
> > > > > made
> > > > > with the same name anyway, because userspace will be confused about 
> > > > > what
> > > > > virtual wakeup it is otherwise. I concede that using the name of the
> > > > > wakeup source catches this problem without adding extra code.
> > > > >
> > > > > Either way, I'd like to see what you outline implemented so that we
> > > > > don't need to do more work than is necessary when userspace writes to
> > > > > the file.
> > > >
> > > > Since we agree here, let's make this change first.  I can cut a patch
> > > > for that in a reasonable time frame I think if no one else beats me to
> > > > that.
> > >
> > > So maybe something like the patch below (untested).
> > >
> > > Index: linux-pm/drivers/base/power/wakeup.c
> > > ===
> > > --- linux-pm.orig/drivers/base/power/wakeup.c
> > > +++ linux-pm/drivers/base/power/wakeup.c
> > > @@ -265,15 +244,29 @@ int device_wakeup_enable(struct device *
> > > if (pm_suspend_target_state != PM_SUSPEND_ON)
> > > dev_dbg(dev, "Suspicious %s() during system 
> > > transition!\n", __func__);
> > >
> > > +   spin_lock_irq(&dev->power.lock);
> > > +
> > > +   if (dev->power.wakeup) {
> > > +   spin_unlock_irq(&dev->power.lock);
> > > +   return -EEXIST;
> > > +   }
> > > +   dev->power.wakeup = ERR_PTR(-EBUSY);
> > > +
> > > +   spin_unlock_irq(&dev->power.lock);
> > > +
> > > ws = wakeup_source_register(dev_name(dev));
> > > if (!ws)
> > > return -ENOMEM;
> > >
> >
> > Let's say that device_wakeup_enable() is called twice at around the same
> > time. First thread gets to wakeup_source_register() and it fails, we
> > return -ENOMEM.
>
> The return is premature.  dev->power.wakeup should be reset back to
> NULL if the wakeup source creation fails.
>
> > dev->power.wakeup is assigned to ERR_PTR(-EBUSY). Second
> > thread is at the spin_lock_irq() above, it grabs the lock and sees
> > dev->power.wakeup is ERR_PTR(-EBUSY) so it bails out with return
> > -EEXIST. I'd think we would want to try to create the wakeup source
> > instead.
> >
> > CPU0   CPU1
> >    
> > spin_lock_irq(&dev->power.lock)
> > ...
> > dev->power.wakeup = ERR_PTR(-EBUSY)
> > spin_unlock_irq(&dev->power.lock)
> > ws = wakeup_source_register(...)
> > if (!ws)
> > return -ENOMEM; spin_lock_irq(&dev->power.lock)
> > if (dev->power.wakeup)
> > return -EEXIST; // Bad
> >
> >
> > Similar problems probably exist with wakeup destruction racing with
> > creation. I think it might have to be a create and then publish pointer
> > style of code to keep the spinlock section small?
>
> There is a problem when there are two concurrent callers of
> device_wakeup_enable() running in parallel with a caller of
> device_wakeup_disable(), but that can be prevented by an extra check
> in the latter.
>
> Apart from that I missed a few if (dev->power.wakeup) checks to convert.
>
> I'll update the patch and resend it.

Ok thanks, I'll ignore the device_wakeup_enable() issue in this patch,
since you're addressing it in a separate patch.

IIUC checking and assigning to dev->power.wakeup must be in the same
critical section for correctness, implying that allocation of the
wakeup source must also be in that critical section (since we check
dev->power.wakeup to see whether we need a wakeup source).

Wakeup source virtual device registration can fail (it allocates
memory), in which case dev->power.wakeup need to be cleaned up.
Meaning that wakeup source virtual device registration need to be in
that same critical section.

S

Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-31 Thread Rafael J. Wysocki
On Wed, Jul 31, 2019 at 7:14 PM Stephen Boyd  wrote:
>
> Quoting Rafael J. Wysocki (2019-07-31 04:58:36)
> > On Wednesday, July 31, 2019 10:34:11 AM CEST Rafael J. Wysocki wrote:
> > > On Wed, Jul 31, 2019 at 1:41 AM Stephen Boyd  wrote:
> > > >
> > >
> > > > We can run into the same problem when two buses name their devices the
> > > > same name and then we attempt to attach a wakeup source to those two
> > > > devices. Or we can have a problem where a virtual wakeup is made with
> > > > the same name, and again we'll try to make a duplicate named device.
> > > > Using something like 'event' or 'wakeup' or 'ws' as the prefix avoids 
> > > > this
> > > > problem and keeps things clean.
> > >
> > > Or suffix, like ".
> > >
> > > But if prefixes are used by an existing convention, I would prefer
> > > "ws-" as it is concise enough and should not be confusing.
>
> Another possibility is 'eventN', so it reads as /sys/class/wakeup/event0
>
> > >
> > > > We should probably avoid letting the same virtual wakeup source be made
> > > > with the same name anyway, because userspace will be confused about what
> > > > virtual wakeup it is otherwise. I concede that using the name of the
> > > > wakeup source catches this problem without adding extra code.
> > > >
> > > > Either way, I'd like to see what you outline implemented so that we
> > > > don't need to do more work than is necessary when userspace writes to
> > > > the file.
> > >
> > > Since we agree here, let's make this change first.  I can cut a patch
> > > for that in a reasonable time frame I think if no one else beats me to
> > > that.
> >
> > So maybe something like the patch below (untested).
> >
> > Index: linux-pm/drivers/base/power/wakeup.c
> > ===
> > --- linux-pm.orig/drivers/base/power/wakeup.c
> > +++ linux-pm/drivers/base/power/wakeup.c
> > @@ -265,15 +244,29 @@ int device_wakeup_enable(struct device *
> > if (pm_suspend_target_state != PM_SUSPEND_ON)
> > dev_dbg(dev, "Suspicious %s() during system transition!\n", 
> > __func__);
> >
> > +   spin_lock_irq(&dev->power.lock);
> > +
> > +   if (dev->power.wakeup) {
> > +   spin_unlock_irq(&dev->power.lock);
> > +   return -EEXIST;
> > +   }
> > +   dev->power.wakeup = ERR_PTR(-EBUSY);
> > +
> > +   spin_unlock_irq(&dev->power.lock);
> > +
> > ws = wakeup_source_register(dev_name(dev));
> > if (!ws)
> > return -ENOMEM;
> >
>
> Let's say that device_wakeup_enable() is called twice at around the same
> time. First thread gets to wakeup_source_register() and it fails, we
> return -ENOMEM.

The return is premature.  dev->power.wakeup should be reset back to
NULL if the wakeup source creation fails.

> dev->power.wakeup is assigned to ERR_PTR(-EBUSY). Second
> thread is at the spin_lock_irq() above, it grabs the lock and sees
> dev->power.wakeup is ERR_PTR(-EBUSY) so it bails out with return
> -EEXIST. I'd think we would want to try to create the wakeup source
> instead.
>
> CPU0   CPU1
>    
> spin_lock_irq(&dev->power.lock)
> ...
> dev->power.wakeup = ERR_PTR(-EBUSY)
> spin_unlock_irq(&dev->power.lock)
> ws = wakeup_source_register(...)
> if (!ws)
> return -ENOMEM; spin_lock_irq(&dev->power.lock)
> if (dev->power.wakeup)
> return -EEXIST; // Bad
>
>
> Similar problems probably exist with wakeup destruction racing with
> creation. I think it might have to be a create and then publish pointer
> style of code to keep the spinlock section small?

There is a problem when there are two concurrent callers of
device_wakeup_enable() running in parallel with a caller of
device_wakeup_disable(), but that can be prevented by an extra check
in the latter.

Apart from that I missed a few if (dev->power.wakeup) checks to convert.

I'll update the patch and resend it.


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-31 Thread Greg Kroah-Hartman
On Wed, Jul 31, 2019 at 10:13:57AM -0700, Stephen Boyd wrote:
> Quoting Rafael J. Wysocki (2019-07-31 04:58:36)
> > On Wednesday, July 31, 2019 10:34:11 AM CEST Rafael J. Wysocki wrote:
> > > On Wed, Jul 31, 2019 at 1:41 AM Stephen Boyd  wrote:
> > > >
> > > 
> > > > We can run into the same problem when two buses name their devices the
> > > > same name and then we attempt to attach a wakeup source to those two
> > > > devices. Or we can have a problem where a virtual wakeup is made with
> > > > the same name, and again we'll try to make a duplicate named device.
> > > > Using something like 'event' or 'wakeup' or 'ws' as the prefix avoids 
> > > > this
> > > > problem and keeps things clean.
> > > 
> > > Or suffix, like ".
> > > 
> > > But if prefixes are used by an existing convention, I would prefer
> > > "ws-" as it is concise enough and should not be confusing.
> 
> Another possibility is 'eventN', so it reads as /sys/class/wakeup/event0

"eventX" is a prefix already used by the input subsystem, so you might
run into conflicts here :(

"wakeupX" makes sense, no namespace colisions there at all.

thanks,

greg k-h


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-31 Thread Stephen Boyd
Quoting Rafael J. Wysocki (2019-07-31 04:58:36)
> On Wednesday, July 31, 2019 10:34:11 AM CEST Rafael J. Wysocki wrote:
> > On Wed, Jul 31, 2019 at 1:41 AM Stephen Boyd  wrote:
> > >
> > 
> > > We can run into the same problem when two buses name their devices the
> > > same name and then we attempt to attach a wakeup source to those two
> > > devices. Or we can have a problem where a virtual wakeup is made with
> > > the same name, and again we'll try to make a duplicate named device.
> > > Using something like 'event' or 'wakeup' or 'ws' as the prefix avoids this
> > > problem and keeps things clean.
> > 
> > Or suffix, like ".
> > 
> > But if prefixes are used by an existing convention, I would prefer
> > "ws-" as it is concise enough and should not be confusing.

Another possibility is 'eventN', so it reads as /sys/class/wakeup/event0

> > 
> > > We should probably avoid letting the same virtual wakeup source be made
> > > with the same name anyway, because userspace will be confused about what
> > > virtual wakeup it is otherwise. I concede that using the name of the
> > > wakeup source catches this problem without adding extra code.
> > >
> > > Either way, I'd like to see what you outline implemented so that we
> > > don't need to do more work than is necessary when userspace writes to
> > > the file.
> > 
> > Since we agree here, let's make this change first.  I can cut a patch
> > for that in a reasonable time frame I think if no one else beats me to
> > that.
> 
> So maybe something like the patch below (untested).
> 
> Index: linux-pm/drivers/base/power/wakeup.c
> ===
> --- linux-pm.orig/drivers/base/power/wakeup.c
> +++ linux-pm/drivers/base/power/wakeup.c
> @@ -265,15 +244,29 @@ int device_wakeup_enable(struct device *
> if (pm_suspend_target_state != PM_SUSPEND_ON)
> dev_dbg(dev, "Suspicious %s() during system transition!\n", 
> __func__);
>  
> +   spin_lock_irq(&dev->power.lock);
> +
> +   if (dev->power.wakeup) {
> +   spin_unlock_irq(&dev->power.lock);
> +   return -EEXIST;
> +   }
> +   dev->power.wakeup = ERR_PTR(-EBUSY);
> +
> +   spin_unlock_irq(&dev->power.lock);
> +
> ws = wakeup_source_register(dev_name(dev));
> if (!ws)
> return -ENOMEM;
>  

Let's say that device_wakeup_enable() is called twice at around the same
time. First thread gets to wakeup_source_register() and it fails, we
return -ENOMEM. dev->power.wakeup is assigned to ERR_PTR(-EBUSY). Second
thread is at the spin_lock_irq() above, it grabs the lock and sees
dev->power.wakeup is ERR_PTR(-EBUSY) so it bails out with return
-EEXIST. I'd think we would want to try to create the wakeup source
instead.

CPU0   CPU1
   
spin_lock_irq(&dev->power.lock)
...
dev->power.wakeup = ERR_PTR(-EBUSY)
spin_unlock_irq(&dev->power.lock)
ws = wakeup_source_register(...)
if (!ws)
return -ENOMEM; spin_lock_irq(&dev->power.lock)
if (dev->power.wakeup)
return -EEXIST; // Bad


Similar problems probably exist with wakeup destruction racing with
creation. I think it might have to be a create and then publish pointer
style of code to keep the spinlock section small?

> -   ret = device_wakeup_attach(dev, ws);
> -   if (ret)
> -   wakeup_source_unregister(ws);
> +   spin_lock_irq(&dev->power.lock);
>  
> -   return ret;
> +   dev->power.wakeup = ws;
> +   if (dev->power.wakeirq)
> +   device_wakeup_attach_irq(dev, dev->power.wakeirq);
> +
> +   spin_unlock_irq(&dev->power.lock);
> +
> +   return 0;
>  }
>  EXPORT_SYMBOL_GPL(device_wakeup_enable);
>  


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-31 Thread Rafael J. Wysocki
On Wednesday, July 31, 2019 10:34:11 AM CEST Rafael J. Wysocki wrote:
> On Wed, Jul 31, 2019 at 1:41 AM Stephen Boyd  wrote:
> >
> > Quoting Rafael J. Wysocki (2019-07-30 16:05:55)
> > > On Wed, Jul 31, 2019 at 12:26 AM Stephen Boyd  wrote:
> > > >
> > > > Quoting Rafael J. Wysocki (2019-07-30 15:17:55)
> > > > > On Tuesday, July 30, 2019 8:48:09 PM CEST Stephen Boyd wrote:
> > > > > >
> > > > > > Using the same prefix for the class and the device name is quite 
> > > > > > common.
> > > > > > For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
> > > > > > extcon classes. I'd prefer it was left as 
> > > > > > /sys/class/wakeup/wakeupN. The
> > > > > > class name could be changed to wakeup_source perhaps (i.e.
> > > > > > /sys/class/wakeup_source/wakeupN)?
> > > > >
> > > > > Alternatively /sys/class/wakeup/wsN
> > > > >
> > > >
> > > > Or /sys/class/wakeup/eventN? It's your bikeshed to paint.
> > >
> > > So actually the underlying problem here is that device_wakeup_enable()
> > > tries to register a wakeup source and then attach it to the device to
> > > avoid calling possibly sleeping functions under a spinlock.
> >
> > Agreed, that is one problem.
> >
> > >
> > > However, it should be possible to call wakeup_source_create(name)
> > > first, then attach the wakeup source to the device (after checking for
> > > presence), and then invoke wakeup_source_add() (after dropping the
> > > lock).  If the wakeup source virtual device registration is done in
> > > wakeup_source_add(), that should avoid the problem altogether without
> > > having to introduce extra complexity.
> >
> > While reordering the code to do what you describe will fix this specific
> > duplicate name problem, it won't fix the general problem with reusing
> > device names from one bus on a different bus/class.
> 
> Fair enough.
> 
> > We can run into the same problem when two buses name their devices the
> > same name and then we attempt to attach a wakeup source to those two
> > devices. Or we can have a problem where a virtual wakeup is made with
> > the same name, and again we'll try to make a duplicate named device.
> > Using something like 'event' or 'wakeup' or 'ws' as the prefix avoids this
> > problem and keeps things clean.
> 
> Or suffix, like ".
> 
> But if prefixes are used by an existing convention, I would prefer
> "ws-" as it is concise enough and should not be confusing.
> 
> > We should probably avoid letting the same virtual wakeup source be made
> > with the same name anyway, because userspace will be confused about what
> > virtual wakeup it is otherwise. I concede that using the name of the
> > wakeup source catches this problem without adding extra code.
> >
> > Either way, I'd like to see what you outline implemented so that we
> > don't need to do more work than is necessary when userspace writes to
> > the file.
> 
> Since we agree here, let's make this change first.  I can cut a patch
> for that in a reasonable time frame I think if no one else beats me to
> that.

So maybe something like the patch below (untested).

---
 drivers/base/power/wakeup.c |   82 +---
 1 file changed, 33 insertions(+), 49 deletions(-)

Index: linux-pm/drivers/base/power/wakeup.c
===
--- linux-pm.orig/drivers/base/power/wakeup.c
+++ linux-pm/drivers/base/power/wakeup.c
@@ -228,27 +228,6 @@ void wakeup_source_unregister(struct wak
 EXPORT_SYMBOL_GPL(wakeup_source_unregister);
 
 /**
- * device_wakeup_attach - Attach a wakeup source object to a device object.
- * @dev: Device to handle.
- * @ws: Wakeup source object to attach to @dev.
- *
- * This causes @dev to be treated as a wakeup device.
- */
-static int device_wakeup_attach(struct device *dev, struct wakeup_source *ws)
-{
-   spin_lock_irq(&dev->power.lock);
-   if (dev->power.wakeup) {
-   spin_unlock_irq(&dev->power.lock);
-   return -EEXIST;
-   }
-   dev->power.wakeup = ws;
-   if (dev->power.wakeirq)
-   device_wakeup_attach_irq(dev, dev->power.wakeirq);
-   spin_unlock_irq(&dev->power.lock);
-   return 0;
-}
-
-/**
  * device_wakeup_enable - Enable given device to be a wakeup source.
  * @dev: Device to handle.
  *
@@ -265,15 +244,29 @@ int device_wakeup_enable(struct device *
if (pm_suspend_target_state != PM_SUSPEND_ON)
dev_dbg(dev, "Suspicious %s() during system transition!\n", 
__func__);
 
+   spin_lock_irq(&dev->power.lock);
+
+   if (dev->power.wakeup) {
+   spin_unlock_irq(&dev->power.lock);
+   return -EEXIST;
+   }
+   dev->power.wakeup = ERR_PTR(-EBUSY);
+
+   spin_unlock_irq(&dev->power.lock);
+
ws = wakeup_source_register(dev_name(dev));
if (!ws)
return -ENOMEM;
 
-   ret = device_wakeup_attach(dev, ws);
-   if (ret)
-   wakeup_source_unregister(ws);
+   spin_lock_i

Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-31 Thread Rafael J. Wysocki
On Wed, Jul 31, 2019 at 1:41 AM Stephen Boyd  wrote:
>
> Quoting Rafael J. Wysocki (2019-07-30 16:05:55)
> > On Wed, Jul 31, 2019 at 12:26 AM Stephen Boyd  wrote:
> > >
> > > Quoting Rafael J. Wysocki (2019-07-30 15:17:55)
> > > > On Tuesday, July 30, 2019 8:48:09 PM CEST Stephen Boyd wrote:
> > > > >
> > > > > Using the same prefix for the class and the device name is quite 
> > > > > common.
> > > > > For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
> > > > > extcon classes. I'd prefer it was left as /sys/class/wakeup/wakeupN. 
> > > > > The
> > > > > class name could be changed to wakeup_source perhaps (i.e.
> > > > > /sys/class/wakeup_source/wakeupN)?
> > > >
> > > > Alternatively /sys/class/wakeup/wsN
> > > >
> > >
> > > Or /sys/class/wakeup/eventN? It's your bikeshed to paint.
> >
> > So actually the underlying problem here is that device_wakeup_enable()
> > tries to register a wakeup source and then attach it to the device to
> > avoid calling possibly sleeping functions under a spinlock.
>
> Agreed, that is one problem.
>
> >
> > However, it should be possible to call wakeup_source_create(name)
> > first, then attach the wakeup source to the device (after checking for
> > presence), and then invoke wakeup_source_add() (after dropping the
> > lock).  If the wakeup source virtual device registration is done in
> > wakeup_source_add(), that should avoid the problem altogether without
> > having to introduce extra complexity.
>
> While reordering the code to do what you describe will fix this specific
> duplicate name problem, it won't fix the general problem with reusing
> device names from one bus on a different bus/class.

Fair enough.

> We can run into the same problem when two buses name their devices the
> same name and then we attempt to attach a wakeup source to those two
> devices. Or we can have a problem where a virtual wakeup is made with
> the same name, and again we'll try to make a duplicate named device.
> Using something like 'event' or 'wakeup' or 'ws' as the prefix avoids this
> problem and keeps things clean.

Or suffix, like ".

But if prefixes are used by an existing convention, I would prefer
"ws-" as it is concise enough and should not be confusing.

> We should probably avoid letting the same virtual wakeup source be made
> with the same name anyway, because userspace will be confused about what
> virtual wakeup it is otherwise. I concede that using the name of the
> wakeup source catches this problem without adding extra code.
>
> Either way, I'd like to see what you outline implemented so that we
> don't need to do more work than is necessary when userspace writes to
> the file.

Since we agree here, let's make this change first.  I can cut a patch
for that in a reasonable time frame I think if no one else beats me to
that.

> I just don't want to see us need to change the name of the
> wakeup device later on and then add a 'name' attribute to the class so
> that we can avoid name collisions due to various buses controlling the
> string we use to create the name of the wakeup device.

OK


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Stephen Boyd
Quoting Rafael J. Wysocki (2019-07-30 16:05:55)
> On Wed, Jul 31, 2019 at 12:26 AM Stephen Boyd  wrote:
> >
> > Quoting Rafael J. Wysocki (2019-07-30 15:17:55)
> > > On Tuesday, July 30, 2019 8:48:09 PM CEST Stephen Boyd wrote:
> > > >
> > > > Using the same prefix for the class and the device name is quite common.
> > > > For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
> > > > extcon classes. I'd prefer it was left as /sys/class/wakeup/wakeupN. The
> > > > class name could be changed to wakeup_source perhaps (i.e.
> > > > /sys/class/wakeup_source/wakeupN)?
> > >
> > > Alternatively /sys/class/wakeup/wsN
> > >
> >
> > Or /sys/class/wakeup/eventN? It's your bikeshed to paint.
> 
> So actually the underlying problem here is that device_wakeup_enable()
> tries to register a wakeup source and then attach it to the device to
> avoid calling possibly sleeping functions under a spinlock.

Agreed, that is one problem.

> 
> However, it should be possible to call wakeup_source_create(name)
> first, then attach the wakeup source to the device (after checking for
> presence), and then invoke wakeup_source_add() (after dropping the
> lock).  If the wakeup source virtual device registration is done in
> wakeup_source_add(), that should avoid the problem altogether without
> having to introduce extra complexity.

While reordering the code to do what you describe will fix this specific
duplicate name problem, it won't fix the general problem with reusing
device names from one bus on a different bus/class. We can run into the
same problem when two buses name their devices the same name and then we
attempt to attach a wakeup source to those two devices. Or we can have a
problem where a virtual wakeup is made with the same name, and again
we'll try to make a duplicate named device. Using something like 'event'
or 'wakeup' or 'ws' as the prefix avoids this problem and keeps things
clean.

We should probably avoid letting the same virtual wakeup source be made
with the same name anyway, because userspace will be confused about what
virtual wakeup it is otherwise. I concede that using the name of the
wakeup source catches this problem without adding extra code.

Either way, I'd like to see what you outline implemented so that we
don't need to do more work than is necessary when userspace writes to
the file. I just don't want to see us need to change the name of the
wakeup device later on and then add a 'name' attribute to the class so
that we can avoid name collisions due to various buses controlling the
string we use to create the name of the wakeup device.



Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Tri Vo
On Tue, Jul 30, 2019 at 4:06 PM Rafael J. Wysocki  wrote:
>
> On Wed, Jul 31, 2019 at 12:26 AM Stephen Boyd  wrote:
> >
> > Quoting Rafael J. Wysocki (2019-07-30 15:17:55)
> > > On Tuesday, July 30, 2019 8:48:09 PM CEST Stephen Boyd wrote:
> > > > Quoting Tri Vo (2019-07-30 11:39:34)
> > > > > On Mon, Jul 29, 2019 at 10:46 PM Rafael J. Wysocki 
> > > > >  wrote:
> > > > > >
> > > > > > On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
> > > > > > > - Device registering the wakeup source is now the parent of the 
> > > > > > > wakeup source.
> > > > > > >   Updated wakeup_source_register()'s signature and its callers 
> > > > > > > accordingly.
> > > > > >
> > > > > > And I really don't like these changes.  Especially having "wakeup"
> > > > > > twice in the path.
> > > > >
> > > > > I can trim it down to /sys/class/wakeup//. Does that sound good?
> > > >
> > > > Using the same prefix for the class and the device name is quite common.
> > > > For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
> > > > extcon classes. I'd prefer it was left as /sys/class/wakeup/wakeupN. The
> > > > class name could be changed to wakeup_source perhaps (i.e.
> > > > /sys/class/wakeup_source/wakeupN)?
> > >
> > > Alternatively /sys/class/wakeup/wsN
> > >
> >
> > Or /sys/class/wakeup/eventN? It's your bikeshed to paint.
>
> So actually the underlying problem here is that device_wakeup_enable()
> tries to register a wakeup source and then attach it to the device to
> avoid calling possibly sleeping functions under a spinlock.
>
> However, it should be possible to call wakeup_source_create(name)
> first, then attach the wakeup source to the device (after checking for
> presence), and then invoke wakeup_source_add() (after dropping the
> lock).  If the wakeup source virtual device registration is done in
> wakeup_source_add(), that should avoid the problem altogether without
> having to introduce extra complexity.

This addresses the issue with device_wakeup_enable(), but IIUC we
still have the general problem of multiple devices having the same
name, which leads to name collisions when identifying wakeup sources
with the name only.


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Rafael J. Wysocki
On Wed, Jul 31, 2019 at 12:26 AM Stephen Boyd  wrote:
>
> Quoting Rafael J. Wysocki (2019-07-30 15:17:55)
> > On Tuesday, July 30, 2019 8:48:09 PM CEST Stephen Boyd wrote:
> > > Quoting Tri Vo (2019-07-30 11:39:34)
> > > > On Mon, Jul 29, 2019 at 10:46 PM Rafael J. Wysocki  
> > > > wrote:
> > > > >
> > > > > On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
> > > > > > - Device registering the wakeup source is now the parent of the 
> > > > > > wakeup source.
> > > > > >   Updated wakeup_source_register()'s signature and its callers 
> > > > > > accordingly.
> > > > >
> > > > > And I really don't like these changes.  Especially having "wakeup"
> > > > > twice in the path.
> > > >
> > > > I can trim it down to /sys/class/wakeup//. Does that sound good?
> > >
> > > Using the same prefix for the class and the device name is quite common.
> > > For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
> > > extcon classes. I'd prefer it was left as /sys/class/wakeup/wakeupN. The
> > > class name could be changed to wakeup_source perhaps (i.e.
> > > /sys/class/wakeup_source/wakeupN)?
> >
> > Alternatively /sys/class/wakeup/wsN
> >
>
> Or /sys/class/wakeup/eventN? It's your bikeshed to paint.

So actually the underlying problem here is that device_wakeup_enable()
tries to register a wakeup source and then attach it to the device to
avoid calling possibly sleeping functions under a spinlock.

However, it should be possible to call wakeup_source_create(name)
first, then attach the wakeup source to the device (after checking for
presence), and then invoke wakeup_source_add() (after dropping the
lock).  If the wakeup source virtual device registration is done in
wakeup_source_add(), that should avoid the problem altogether without
having to introduce extra complexity.


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Stephen Boyd
Quoting Rafael J. Wysocki (2019-07-30 15:17:55)
> On Tuesday, July 30, 2019 8:48:09 PM CEST Stephen Boyd wrote:
> > Quoting Tri Vo (2019-07-30 11:39:34)
> > > On Mon, Jul 29, 2019 at 10:46 PM Rafael J. Wysocki  
> > > wrote:
> > > >
> > > > On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
> > > > > - Device registering the wakeup source is now the parent of the 
> > > > > wakeup source.
> > > > >   Updated wakeup_source_register()'s signature and its callers 
> > > > > accordingly.
> > > >
> > > > And I really don't like these changes.  Especially having "wakeup"
> > > > twice in the path.
> > > 
> > > I can trim it down to /sys/class/wakeup//. Does that sound good?
> > 
> > Using the same prefix for the class and the device name is quite common.
> > For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
> > extcon classes. I'd prefer it was left as /sys/class/wakeup/wakeupN. The
> > class name could be changed to wakeup_source perhaps (i.e.
> > /sys/class/wakeup_source/wakeupN)?
> 
> Alternatively /sys/class/wakeup/wsN
> 

Or /sys/class/wakeup/eventN? It's your bikeshed to paint.



Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Rafael J. Wysocki
On Tuesday, July 30, 2019 8:48:09 PM CEST Stephen Boyd wrote:
> Quoting Tri Vo (2019-07-30 11:39:34)
> > On Mon, Jul 29, 2019 at 10:46 PM Rafael J. Wysocki  
> > wrote:
> > >
> > > On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
> > > > - Device registering the wakeup source is now the parent of the wakeup 
> > > > source.
> > > >   Updated wakeup_source_register()'s signature and its callers 
> > > > accordingly.
> > >
> > > And I really don't like these changes.  Especially having "wakeup"
> > > twice in the path.
> > 
> > I can trim it down to /sys/class/wakeup//. Does that sound good?
> 
> Using the same prefix for the class and the device name is quite common.
> For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
> extcon classes. I'd prefer it was left as /sys/class/wakeup/wakeupN. The
> class name could be changed to wakeup_source perhaps (i.e.
> /sys/class/wakeup_source/wakeupN)?

Alternatively /sys/class/wakeup/wsN






Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Tri Vo
On Mon, Jul 29, 2019 at 11:47 PM Greg KH  wrote:
>
> On Mon, Jul 29, 2019 at 07:43:09PM -0700, Tri Vo wrote:
> > Userspace can use wakeup_sources debugfs node to plot history of suspend
> > blocking wakeup sources over device's boot cycle. This information can
> > then be used (1) for power-specific bug reporting and (2) towards
> > attributing battery consumption to specific processes over a period of
> > time.
> >
> > However, debugfs doesn't have stable ABI. For this reason, create a
> > 'struct device' to expose wakeup sources statistics in sysfs under
> > /sys/class/wakeup/wakeup/*.
>
> I agree with Rafael here, no need for the extra "wakeup" in the device
> name as you are in the "wakeup" namespace already.
>
> If you have an IDA-allocated name, there's no need for the extra
> 'wakeup' at all.
>
> > +int wakeup_source_sysfs_add(struct device *parent, struct wakeup_source 
> > *ws)
> > +{
> > + struct device *dev;
> > + int id;
> > +
> > + id = ida_simple_get(&wakeup_ida, 0, 0, GFP_KERNEL);
> > + if (id < 0)
> > + return id;
>
> No lock needed for this ida?  Are you sure?
>
> > + ws->id = id;
> > +
> > + dev = device_create_with_groups(wakeup_class, parent, MKDEV(0, 0), ws,
> > + wakeup_source_groups, "wakeup%d",
> > + ws->id);
> > + if (IS_ERR(dev)) {
> > + ida_simple_remove(&wakeup_ida, ws->id);
> > + return PTR_ERR(dev);
> > + }
> > +
> > + ws->dev = dev;
> > + return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(wakeup_source_sysfs_add);
> > +
> > +/**
> > + * wakeup_source_sysfs_remove - Remove wakeup_source attributes from sysfs.
> > + * @ws: Wakeup source to be removed from sysfs.
> > + */
> > +void wakeup_source_sysfs_remove(struct wakeup_source *ws)
> > +{
> > + device_unregister(ws->dev);
> > + ida_simple_remove(&wakeup_ida, ws->id);
>
> Again, no lock, is that ok?  I think ida's can work without a lock, but
> not always, sorry, I don't remember the rules anymore given the recent
> changes in that code.

Documentation says, "The IDA handles its own locking. It is safe to
call any of the IDA functions without synchronisation in your code."
https://www.kernel.org/doc/html/latest/core-api/idr.html#ida-usage


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Greg Kroah-Hartman
On Tue, Jul 30, 2019 at 11:48:09AM -0700, Stephen Boyd wrote:
> Quoting Tri Vo (2019-07-30 11:39:34)
> > On Mon, Jul 29, 2019 at 10:46 PM Rafael J. Wysocki  
> > wrote:
> > >
> > > On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
> > > > - Device registering the wakeup source is now the parent of the wakeup 
> > > > source.
> > > >   Updated wakeup_source_register()'s signature and its callers 
> > > > accordingly.
> > >
> > > And I really don't like these changes.  Especially having "wakeup"
> > > twice in the path.
> > 
> > I can trim it down to /sys/class/wakeup//. Does that sound good?
> 
> Using the same prefix for the class and the device name is quite common.
> For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
> extcon classes. I'd prefer it was left as /sys/class/wakeup/wakeupN. The
> class name could be changed to wakeup_source perhaps (i.e.
> /sys/class/wakeup_source/wakeupN)?
> 

Ah, the issue is that these end up on the virtual "bus".  Yeah, sorry,
you are right, they need to have a unique prefix in order to prevent
name collisions.

thanks,

greg k-h


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Greg Kroah-Hartman
On Tue, Jul 30, 2019 at 11:39:34AM -0700, Tri Vo wrote:
> On Mon, Jul 29, 2019 at 10:46 PM Rafael J. Wysocki  wrote:
> >
> > On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
> > >
> > > Userspace can use wakeup_sources debugfs node to plot history of suspend
> > > blocking wakeup sources over device's boot cycle. This information can
> > > then be used (1) for power-specific bug reporting and (2) towards
> > > attributing battery consumption to specific processes over a period of
> > > time.
> > >
> > > However, debugfs doesn't have stable ABI. For this reason, create a
> > > 'struct device' to expose wakeup sources statistics in sysfs under
> > > /sys/class/wakeup/wakeup/*.
> > >
> > > Co-developed-by: Greg Kroah-Hartman 
> > > Signed-off-by: Greg Kroah-Hartman 
> > > Co-developed-by: Stephen Boyd 
> > > Signed-off-by: Stephen Boyd 
> > > Signed-off-by: Tri Vo 
> > > Tested-by: Tri Vo 
> > > Tested-by: Kalesh Singh 
> > > Reported-by: kbuild test robot 
> > > ---
> > >  Documentation/ABI/testing/sysfs-class-wakeup |  76 +
> > >  drivers/acpi/device_pm.c |   3 +-
> > >  drivers/base/power/Makefile  |   2 +-
> > >  drivers/base/power/wakeup.c  |  21 ++-
> > >  drivers/base/power/wakeup_stats.c| 171 +++
> > >  fs/eventpoll.c   |   4 +-
> > >  include/linux/pm_wakeup.h|  15 +-
> > >  kernel/power/autosleep.c |   2 +-
> > >  kernel/power/wakelock.c  |  10 ++
> > >  kernel/time/alarmtimer.c |   2 +-
> > >  10 files changed, 294 insertions(+), 12 deletions(-)
> > >  create mode 100644 Documentation/ABI/testing/sysfs-class-wakeup
> > >  create mode 100644 drivers/base/power/wakeup_stats.c
> > >
> > > v2:
> > > - Updated Documentation/ABI/, as per Greg.
> > > - Removed locks in attribute functions, as per Greg.
> > > - Lifetimes of struct wakelock and struck wakeup_source are now different 
> > > due to
> > >   the latter embedding a refcounted kobject. Changed it so that struct 
> > > wakelock
> > >   only has a pointer to struct wakeup_source, instead of embedding it.
> > > - Added CONFIG_PM_SLEEP_STATS that enables/disables wakeup source 
> > > statistics in
> > >   sysfs.
> > >
> > > v3:
> > > Changes by Greg:
> > > - Reworked code to use 'struct device' instead of raw kobjects.
> > > - Updated documentation file.
> > > - Only link wakeup_stats.o when CONFIG_PM_SLEEP_STATS is enabled.
> > > Changes by Tri:
> > > - Reverted changes to kernel/power/wakelock.c. 'struct device' hides 
> > > kobject
> > >   operations. So no need to handle lifetimes in wakelock.c
> > >
> > > v4:
> > > - Added 'Co-developed-by:' and 'Tested-by:' fields to commit message.
> > > - Moved new documentation to a separate file
> > >   Documentation/ABI/testing/sysfs-class-wakeup, as per Greg.
> > > - Fixed copyright header in drivers/base/power/wakeup_stats.c, as per 
> > > Greg.
> > >
> > > v5:
> > > - Removed CONFIG_PM_SLEEP_STATS
> > > - Used PTR_ERR_OR_ZERO instead of if(IS_ERR(...)) + PTR_ERR, reported by
> > >   kbuild test robot 
> > > - Stephen reported that a call to device_init_wakeup() and writing 
> > > 'enabled' to
> > >   that device's power/wakeup file results in multiple wakeup source being
> > >   allocated for that device.  Changed device_wakeup_enable() to check if 
> > > device
> > >   wakeup was previously enabled.
> > > Changes by Stephen:
> > > - Changed stats location from /sys/class/wakeup//* to
> > >   /sys/class/wakeup/wakeup/*, where ID is an IDA-allocated integer. 
> > > This
> > >   avoids name collisions in /sys/class/wakeup/ directory.
> > > - Added a "name" attribute to wakeup sources, and updated documentation.
> > > - Device registering the wakeup source is now the parent of the wakeup 
> > > source.
> > >   Updated wakeup_source_register()'s signature and its callers 
> > > accordingly.
> >
> > And I really don't like these changes.  Especially having "wakeup"
> > twice in the path.
> 
> I can trim it down to /sys/class/wakeup//. Does that sound good?

Yes.

> About the other change, I think making the registering device the
> parent of the wakeup source is a worthwhile change, since that way one
> can associate a wakeup source sysfs entry with the device that created
> it.

that's fine with me.

> > Couldn't you find a simpler way to avoid the name collisions?
> 
> I could also simply log an error in case of a name collision instead
> of failing hard. That way I can keep the old path with the wakeup
> source name in it. Other than that, I can't think of a way to resolve
> the directory name collisions without making that directory name
> unique, i.e. generating IDs is probably the simplest way. I'm still
> learning about the kernel, and I might be wrong though. What do you
> think?

Uniqe ids for the class should be fine, that's all you need to have.

thanks,

greg k-h


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Stephen Boyd
Quoting Tri Vo (2019-07-30 11:39:34)
> On Mon, Jul 29, 2019 at 10:46 PM Rafael J. Wysocki  wrote:
> >
> > On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
> > > - Device registering the wakeup source is now the parent of the wakeup 
> > > source.
> > >   Updated wakeup_source_register()'s signature and its callers 
> > > accordingly.
> >
> > And I really don't like these changes.  Especially having "wakeup"
> > twice in the path.
> 
> I can trim it down to /sys/class/wakeup//. Does that sound good?

Using the same prefix for the class and the device name is quite common.
For example, see the input, regulator, tty, tpm, remoteproc, hwmon,
extcon classes. I'd prefer it was left as /sys/class/wakeup/wakeupN. The
class name could be changed to wakeup_source perhaps (i.e.
/sys/class/wakeup_source/wakeupN)?



Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-30 Thread Tri Vo
On Mon, Jul 29, 2019 at 10:46 PM Rafael J. Wysocki  wrote:
>
> On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
> >
> > Userspace can use wakeup_sources debugfs node to plot history of suspend
> > blocking wakeup sources over device's boot cycle. This information can
> > then be used (1) for power-specific bug reporting and (2) towards
> > attributing battery consumption to specific processes over a period of
> > time.
> >
> > However, debugfs doesn't have stable ABI. For this reason, create a
> > 'struct device' to expose wakeup sources statistics in sysfs under
> > /sys/class/wakeup/wakeup/*.
> >
> > Co-developed-by: Greg Kroah-Hartman 
> > Signed-off-by: Greg Kroah-Hartman 
> > Co-developed-by: Stephen Boyd 
> > Signed-off-by: Stephen Boyd 
> > Signed-off-by: Tri Vo 
> > Tested-by: Tri Vo 
> > Tested-by: Kalesh Singh 
> > Reported-by: kbuild test robot 
> > ---
> >  Documentation/ABI/testing/sysfs-class-wakeup |  76 +
> >  drivers/acpi/device_pm.c |   3 +-
> >  drivers/base/power/Makefile  |   2 +-
> >  drivers/base/power/wakeup.c  |  21 ++-
> >  drivers/base/power/wakeup_stats.c| 171 +++
> >  fs/eventpoll.c   |   4 +-
> >  include/linux/pm_wakeup.h|  15 +-
> >  kernel/power/autosleep.c |   2 +-
> >  kernel/power/wakelock.c  |  10 ++
> >  kernel/time/alarmtimer.c |   2 +-
> >  10 files changed, 294 insertions(+), 12 deletions(-)
> >  create mode 100644 Documentation/ABI/testing/sysfs-class-wakeup
> >  create mode 100644 drivers/base/power/wakeup_stats.c
> >
> > v2:
> > - Updated Documentation/ABI/, as per Greg.
> > - Removed locks in attribute functions, as per Greg.
> > - Lifetimes of struct wakelock and struck wakeup_source are now different 
> > due to
> >   the latter embedding a refcounted kobject. Changed it so that struct 
> > wakelock
> >   only has a pointer to struct wakeup_source, instead of embedding it.
> > - Added CONFIG_PM_SLEEP_STATS that enables/disables wakeup source 
> > statistics in
> >   sysfs.
> >
> > v3:
> > Changes by Greg:
> > - Reworked code to use 'struct device' instead of raw kobjects.
> > - Updated documentation file.
> > - Only link wakeup_stats.o when CONFIG_PM_SLEEP_STATS is enabled.
> > Changes by Tri:
> > - Reverted changes to kernel/power/wakelock.c. 'struct device' hides kobject
> >   operations. So no need to handle lifetimes in wakelock.c
> >
> > v4:
> > - Added 'Co-developed-by:' and 'Tested-by:' fields to commit message.
> > - Moved new documentation to a separate file
> >   Documentation/ABI/testing/sysfs-class-wakeup, as per Greg.
> > - Fixed copyright header in drivers/base/power/wakeup_stats.c, as per Greg.
> >
> > v5:
> > - Removed CONFIG_PM_SLEEP_STATS
> > - Used PTR_ERR_OR_ZERO instead of if(IS_ERR(...)) + PTR_ERR, reported by
> >   kbuild test robot 
> > - Stephen reported that a call to device_init_wakeup() and writing 
> > 'enabled' to
> >   that device's power/wakeup file results in multiple wakeup source being
> >   allocated for that device.  Changed device_wakeup_enable() to check if 
> > device
> >   wakeup was previously enabled.
> > Changes by Stephen:
> > - Changed stats location from /sys/class/wakeup//* to
> >   /sys/class/wakeup/wakeup/*, where ID is an IDA-allocated integer. This
> >   avoids name collisions in /sys/class/wakeup/ directory.
> > - Added a "name" attribute to wakeup sources, and updated documentation.
> > - Device registering the wakeup source is now the parent of the wakeup 
> > source.
> >   Updated wakeup_source_register()'s signature and its callers accordingly.
>
> And I really don't like these changes.  Especially having "wakeup"
> twice in the path.

I can trim it down to /sys/class/wakeup//. Does that sound good?

About the other change, I think making the registering device the
parent of the wakeup source is a worthwhile change, since that way one
can associate a wakeup source sysfs entry with the device that created
it.
>
> Couldn't you find a simpler way to avoid the name collisions?

I could also simply log an error in case of a name collision instead
of failing hard. That way I can keep the old path with the wakeup
source name in it. Other than that, I can't think of a way to resolve
the directory name collisions without making that directory name
unique, i.e. generating IDs is probably the simplest way. I'm still
learning about the kernel, and I might be wrong though. What do you
think?


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-29 Thread Greg KH
On Mon, Jul 29, 2019 at 07:43:09PM -0700, Tri Vo wrote:
> Userspace can use wakeup_sources debugfs node to plot history of suspend
> blocking wakeup sources over device's boot cycle. This information can
> then be used (1) for power-specific bug reporting and (2) towards
> attributing battery consumption to specific processes over a period of
> time.
> 
> However, debugfs doesn't have stable ABI. For this reason, create a
> 'struct device' to expose wakeup sources statistics in sysfs under
> /sys/class/wakeup/wakeup/*.

I agree with Rafael here, no need for the extra "wakeup" in the device
name as you are in the "wakeup" namespace already.

If you have an IDA-allocated name, there's no need for the extra
'wakeup' at all.

> +int wakeup_source_sysfs_add(struct device *parent, struct wakeup_source *ws)
> +{
> + struct device *dev;
> + int id;
> +
> + id = ida_simple_get(&wakeup_ida, 0, 0, GFP_KERNEL);
> + if (id < 0)
> + return id;

No lock needed for this ida?  Are you sure?

> + ws->id = id;
> +
> + dev = device_create_with_groups(wakeup_class, parent, MKDEV(0, 0), ws,
> + wakeup_source_groups, "wakeup%d",
> + ws->id);
> + if (IS_ERR(dev)) {
> + ida_simple_remove(&wakeup_ida, ws->id);
> + return PTR_ERR(dev);
> + }
> +
> + ws->dev = dev;
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(wakeup_source_sysfs_add);
> +
> +/**
> + * wakeup_source_sysfs_remove - Remove wakeup_source attributes from sysfs.
> + * @ws: Wakeup source to be removed from sysfs.
> + */
> +void wakeup_source_sysfs_remove(struct wakeup_source *ws)
> +{
> + device_unregister(ws->dev);
> + ida_simple_remove(&wakeup_ida, ws->id);

Again, no lock, is that ok?  I think ida's can work without a lock, but
not always, sorry, I don't remember the rules anymore given the recent
changes in that code.

thanks,

greg k-h


Re: [PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-29 Thread Rafael J. Wysocki
On Tue, Jul 30, 2019 at 4:45 AM Tri Vo  wrote:
>
> Userspace can use wakeup_sources debugfs node to plot history of suspend
> blocking wakeup sources over device's boot cycle. This information can
> then be used (1) for power-specific bug reporting and (2) towards
> attributing battery consumption to specific processes over a period of
> time.
>
> However, debugfs doesn't have stable ABI. For this reason, create a
> 'struct device' to expose wakeup sources statistics in sysfs under
> /sys/class/wakeup/wakeup/*.
>
> Co-developed-by: Greg Kroah-Hartman 
> Signed-off-by: Greg Kroah-Hartman 
> Co-developed-by: Stephen Boyd 
> Signed-off-by: Stephen Boyd 
> Signed-off-by: Tri Vo 
> Tested-by: Tri Vo 
> Tested-by: Kalesh Singh 
> Reported-by: kbuild test robot 
> ---
>  Documentation/ABI/testing/sysfs-class-wakeup |  76 +
>  drivers/acpi/device_pm.c |   3 +-
>  drivers/base/power/Makefile  |   2 +-
>  drivers/base/power/wakeup.c  |  21 ++-
>  drivers/base/power/wakeup_stats.c| 171 +++
>  fs/eventpoll.c   |   4 +-
>  include/linux/pm_wakeup.h|  15 +-
>  kernel/power/autosleep.c |   2 +-
>  kernel/power/wakelock.c  |  10 ++
>  kernel/time/alarmtimer.c |   2 +-
>  10 files changed, 294 insertions(+), 12 deletions(-)
>  create mode 100644 Documentation/ABI/testing/sysfs-class-wakeup
>  create mode 100644 drivers/base/power/wakeup_stats.c
>
> v2:
> - Updated Documentation/ABI/, as per Greg.
> - Removed locks in attribute functions, as per Greg.
> - Lifetimes of struct wakelock and struck wakeup_source are now different due 
> to
>   the latter embedding a refcounted kobject. Changed it so that struct 
> wakelock
>   only has a pointer to struct wakeup_source, instead of embedding it.
> - Added CONFIG_PM_SLEEP_STATS that enables/disables wakeup source statistics 
> in
>   sysfs.
>
> v3:
> Changes by Greg:
> - Reworked code to use 'struct device' instead of raw kobjects.
> - Updated documentation file.
> - Only link wakeup_stats.o when CONFIG_PM_SLEEP_STATS is enabled.
> Changes by Tri:
> - Reverted changes to kernel/power/wakelock.c. 'struct device' hides kobject
>   operations. So no need to handle lifetimes in wakelock.c
>
> v4:
> - Added 'Co-developed-by:' and 'Tested-by:' fields to commit message.
> - Moved new documentation to a separate file
>   Documentation/ABI/testing/sysfs-class-wakeup, as per Greg.
> - Fixed copyright header in drivers/base/power/wakeup_stats.c, as per Greg.
>
> v5:
> - Removed CONFIG_PM_SLEEP_STATS
> - Used PTR_ERR_OR_ZERO instead of if(IS_ERR(...)) + PTR_ERR, reported by
>   kbuild test robot 
> - Stephen reported that a call to device_init_wakeup() and writing 'enabled' 
> to
>   that device's power/wakeup file results in multiple wakeup source being
>   allocated for that device.  Changed device_wakeup_enable() to check if 
> device
>   wakeup was previously enabled.
> Changes by Stephen:
> - Changed stats location from /sys/class/wakeup//* to
>   /sys/class/wakeup/wakeup/*, where ID is an IDA-allocated integer. This
>   avoids name collisions in /sys/class/wakeup/ directory.
> - Added a "name" attribute to wakeup sources, and updated documentation.
> - Device registering the wakeup source is now the parent of the wakeup source.
>   Updated wakeup_source_register()'s signature and its callers accordingly.

And I really don't like these changes.  Especially having "wakeup"
twice in the path.

Couldn't you find a simpler way to avoid the name collisions?


[PATCH v5] PM / wakeup: show wakeup sources stats in sysfs

2019-07-29 Thread Tri Vo
Userspace can use wakeup_sources debugfs node to plot history of suspend
blocking wakeup sources over device's boot cycle. This information can
then be used (1) for power-specific bug reporting and (2) towards
attributing battery consumption to specific processes over a period of
time.

However, debugfs doesn't have stable ABI. For this reason, create a
'struct device' to expose wakeup sources statistics in sysfs under
/sys/class/wakeup/wakeup/*.

Co-developed-by: Greg Kroah-Hartman 
Signed-off-by: Greg Kroah-Hartman 
Co-developed-by: Stephen Boyd 
Signed-off-by: Stephen Boyd 
Signed-off-by: Tri Vo 
Tested-by: Tri Vo 
Tested-by: Kalesh Singh 
Reported-by: kbuild test robot 
---
 Documentation/ABI/testing/sysfs-class-wakeup |  76 +
 drivers/acpi/device_pm.c |   3 +-
 drivers/base/power/Makefile  |   2 +-
 drivers/base/power/wakeup.c  |  21 ++-
 drivers/base/power/wakeup_stats.c| 171 +++
 fs/eventpoll.c   |   4 +-
 include/linux/pm_wakeup.h|  15 +-
 kernel/power/autosleep.c |   2 +-
 kernel/power/wakelock.c  |  10 ++
 kernel/time/alarmtimer.c |   2 +-
 10 files changed, 294 insertions(+), 12 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-class-wakeup
 create mode 100644 drivers/base/power/wakeup_stats.c

v2:
- Updated Documentation/ABI/, as per Greg.
- Removed locks in attribute functions, as per Greg.
- Lifetimes of struct wakelock and struck wakeup_source are now different due to
  the latter embedding a refcounted kobject. Changed it so that struct wakelock
  only has a pointer to struct wakeup_source, instead of embedding it.
- Added CONFIG_PM_SLEEP_STATS that enables/disables wakeup source statistics in
  sysfs.

v3:
Changes by Greg:
- Reworked code to use 'struct device' instead of raw kobjects.
- Updated documentation file.
- Only link wakeup_stats.o when CONFIG_PM_SLEEP_STATS is enabled.
Changes by Tri:
- Reverted changes to kernel/power/wakelock.c. 'struct device' hides kobject
  operations. So no need to handle lifetimes in wakelock.c

v4:
- Added 'Co-developed-by:' and 'Tested-by:' fields to commit message.
- Moved new documentation to a separate file
  Documentation/ABI/testing/sysfs-class-wakeup, as per Greg.
- Fixed copyright header in drivers/base/power/wakeup_stats.c, as per Greg.

v5:
- Removed CONFIG_PM_SLEEP_STATS
- Used PTR_ERR_OR_ZERO instead of if(IS_ERR(...)) + PTR_ERR, reported by
  kbuild test robot 
- Stephen reported that a call to device_init_wakeup() and writing 'enabled' to
  that device's power/wakeup file results in multiple wakeup source being
  allocated for that device.  Changed device_wakeup_enable() to check if device
  wakeup was previously enabled.
Changes by Stephen:
- Changed stats location from /sys/class/wakeup//* to
  /sys/class/wakeup/wakeup/*, where ID is an IDA-allocated integer. This
  avoids name collisions in /sys/class/wakeup/ directory.
- Added a "name" attribute to wakeup sources, and updated documentation.
- Device registering the wakeup source is now the parent of the wakeup source.
  Updated wakeup_source_register()'s signature and its callers accordingly.

diff --git a/Documentation/ABI/testing/sysfs-class-wakeup 
b/Documentation/ABI/testing/sysfs-class-wakeup
new file mode 100644
index ..754aab8b6dcd
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-class-wakeup
@@ -0,0 +1,76 @@
+What:  /sys/class/wakeup/
+Date:  June 2019
+Contact:   Tri Vo 
+Description:
+   The /sys/class/wakeup/ directory contains pointers to all
+   wakeup sources in the kernel at that moment in time.
+
+What:  /sys/class/wakeup/.../name
+Date:  June 2019
+Contact:   Tri Vo 
+Description:
+   This file contains the name of the wakeup source.
+
+What:  /sys/class/wakeup/.../active_count
+Date:  June 2019
+Contact:   Tri Vo 
+Description:
+   This file contains the number of times the wakeup source was
+   activated.
+
+What:  /sys/class/wakeup/.../event_count
+Date:  June 2019
+Contact:   Tri Vo 
+Description:
+   This file contains the number of signaled wakeup events
+   associated with the wakeup source.
+
+What:  /sys/class/wakeup/.../wakeup_count
+Date:  June 2019
+Contact:   Tri Vo 
+Description:
+   This file contains the number of times the wakeup source might
+   abort suspend.
+
+What:  /sys/class/wakeup/.../expire_count
+Date:  June 2019
+Contact:   Tri Vo 
+Description:
+   This file contains the number of times the wakeup source's
+   timeout has expired.
+
+What:  /sys/class/wakeup/.../active_time_ms
+Date:  June 2019
+Contact:   Tri Vo 
+Description:
+   This file