From: Stephen Boyd <swboyd@chromium.org>
To: "Rafael J. Wysocki" <rafael@kernel.org>, Tri Vo <trong@android.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Viresh Kumar <viresh.kumar@linaro.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Hridya Valsaraju <hridya@google.com>,
Sandeep Patil <sspatil@google.com>,
Kalesh Singh <kaleshsingh@google.com>,
Ravi Chandra Sadineni <ravisadineni@chromium.org>,
LKML <linux-kernel@vger.kernel.org>,
Linux PM <linux-pm@vger.kernel.org>,
"Cc: Android Kernel" <kernel-team@android.com>
Subject: Re: [PATCH v6] PM / wakeup: show wakeup sources stats in sysfs
Date: Wed, 31 Jul 2019 17:45:42 -0700 [thread overview]
Message-ID: <5d423637.1c69fb81.62114.ca6f@mx.google.com> (raw)
In-Reply-To: <5d42281c.1c69fb81.bcda1.71f5@mx.google.com>
Quoting Stephen Boyd (2019-07-31 16:45:31)
>
> This approach also nicely detects duplicate wakeup source names in the
> case that the string passed in to wakeup_source_register() is already
> used on the virtual bus.
This was clearly untested! Here's a better one. This is what I see on my
device with this patch squashed in:
localhost ~ # cat /sys/kernel/debug/wakeup_sources
name active_count event_count wakeup_count expire_count active_since total_time max_time last_change prevent_suspend_time
1-1.2.4.1 0 0 0 0 0 0 0 0 0
1-1.1 0 0 0 0 0 0 0 0 0
gpio-keys 0 0 0 0 0 0 0 0 0
spi10.0 0 0 0 0 0 0 0 0 0
a88000.spi:ec@0:keyboard-controller 0 0 0 0 0 0 0
0 0
alarmtimer 0 0 0 0 0 0 0 0 0
cros-ec-rtc.1.auto 0 0 0 0 0 0 0 0
0
a8f8800.usb 0 0 0 0 0 0 0 0 0
a6f8800.usb 0 0 0 0 0 0 0 0 0
localhost ~ # ls -l /sys/class/wakeup/
total 0
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 alarmtimer -> ../../devices/platform/soc/ac0000.geniqup/a88000.spi/spi_master/spi10/spi10.0/cros-ec-dev.0.auto/cros-ec-rtc.1.auto/rtc/rtc0/alarmtimer
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 wakeup0 -> ../../devices/platform/soc/a6f8800.usb/wakeup/wakeup0
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 wakeup1 -> ../../devices/platform/soc/a8f8800.usb/wakeup/wakeup1
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 wakeup2 -> ../../devices/platform/soc/ac0000.geniqup/a88000.spi/spi_master/spi10/spi10.0/cros-ec-dev.0.auto/cros-ec-rtc.1.auto/wakeup/wakeup2
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 wakeup3 -> ../../devices/platform/soc/ac0000.geniqup/a88000.spi/spi_master/spi10/spi10.0/a88000.spi:ec@0:keyboard-controller/wakeup/wakeup3
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 wakeup4 -> ../../devices/platform/soc/ac0000.geniqup/a88000.spi/spi_master/spi10/spi10.0/wakeup/wakeup4
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 wakeup5 -> ../../devices/platform/gpio-keys/wakeup/wakeup5
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 wakeup6 -> ../../devices/platform/soc/a8f8800.usb/a800000.dwc3/xhci-hcd.7.auto/usb1/1-1/1-1.1/wakeup/wakeup6
lrwxrwxrwx. 1 root root 0 Jul 31 17:43 wakeup7 -> ../../devices/platform/soc/a8f8800.usb/a800000.dwc3/xhci-hcd.7.auto/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4.1/wakeup/wakeup7
----8<----
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 79668b45eae6..ec414f0db0b1 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -201,7 +201,7 @@ EXPORT_SYMBOL_GPL(wakeup_source_remove);
/**
* wakeup_source_register - Create wakeup source and add it to the list.
* @dev: Device this wakeup source is associated with (or NULL if virtual).
- * @name: Name of the wakeup source to register.
+ * @name: Name of the wakeup source to register (or NULL if device wakeup).
*/
struct wakeup_source *wakeup_source_register(struct device *dev,
const char *name)
@@ -209,9 +209,9 @@ struct wakeup_source *wakeup_source_register(struct device *dev,
struct wakeup_source *ws;
int ret;
- ws = wakeup_source_create(name);
+ ws = wakeup_source_create(name ? : dev_name(dev));
if (ws) {
- ret = wakeup_source_sysfs_add(dev, ws);
+ ret = wakeup_source_sysfs_add(dev, ws, !!name);
if (ret) {
kfree_const(ws->name);
kfree(ws);
@@ -275,7 +275,7 @@ int device_wakeup_enable(struct device *dev)
if (pm_suspend_target_state != PM_SUSPEND_ON)
dev_dbg(dev, "Suspicious %s() during system transition!\n", __func__);
- ws = wakeup_source_register(dev, dev_name(dev));
+ ws = wakeup_source_register(dev, NULL);
if (!ws)
return -ENOMEM;
diff --git a/drivers/base/power/wakeup_stats.c b/drivers/base/power/wakeup_stats.c
index a26f019faca9..0f4c59b02d5d 100644
--- a/drivers/base/power/wakeup_stats.c
+++ b/drivers/base/power/wakeup_stats.c
@@ -81,15 +81,6 @@ static ssize_t last_change_ms_show(struct device *dev,
}
static DEVICE_ATTR_RO(last_change_ms);
-static ssize_t name_show(struct device *dev, struct device_attribute *attr,
- char *buf)
-{
- struct wakeup_source *ws = dev_get_drvdata(dev);
-
- return sprintf(buf, "%s\n", ws->name);
-}
-static DEVICE_ATTR_RO(name);
-
static ssize_t prevent_suspend_time_ms_show(struct device *dev,
struct device_attribute *attr,
char *buf)
@@ -106,7 +97,6 @@ static ssize_t prevent_suspend_time_ms_show(struct device *dev,
static DEVICE_ATTR_RO(prevent_suspend_time_ms);
static struct attribute *wakeup_source_attrs[] = {
- &dev_attr_name.attr,
&dev_attr_active_count.attr,
&dev_attr_event_count.attr,
&dev_attr_wakeup_count.attr,
@@ -126,22 +116,35 @@ static DEFINE_IDA(wakeup_ida);
* wakeup_source_sysfs_add - Add wakeup_source attributes to sysfs.
* @parent: Device given wakeup source is associated with (or NULL if virtual).
* @ws: Wakeup source to be added in sysfs.
+ * @use_ws_name: True to use ws->name or false to use 'wakeupN' for device name
*/
-int wakeup_source_sysfs_add(struct device *parent, struct wakeup_source *ws)
+int wakeup_source_sysfs_add(struct device *parent, struct wakeup_source *ws,
+ bool use_ws_name)
{
struct device *dev;
int id;
- id = ida_alloc(&wakeup_ida, GFP_KERNEL);
- if (id < 0)
- return id;
- ws->id = id;
+ ws->id = -1;
+ if (use_ws_name) {
+ dev = device_create_with_groups(wakeup_class, parent,
+ MKDEV(0, 0), ws,
+ wakeup_source_groups,
+ ws->name);
+ } else {
+ id = ida_alloc(&wakeup_ida, GFP_KERNEL);
+ if (id < 0)
+ return id;
+ ws->id = id;
+
+ dev = device_create_with_groups(wakeup_class, parent,
+ MKDEV(0, 0), ws,
+ wakeup_source_groups,
+ "wakeup%d", ws->id);
+ }
- dev = device_create_with_groups(wakeup_class, parent, MKDEV(0, 0), ws,
- wakeup_source_groups, "ws%d",
- ws->id);
if (IS_ERR(dev)) {
- ida_free(&wakeup_ida, ws->id);
+ if (ws->id >= 0)
+ ida_free(&wakeup_ida, ws->id);
return PTR_ERR(dev);
}
@@ -157,7 +160,8 @@ EXPORT_SYMBOL_GPL(wakeup_source_sysfs_add);
void wakeup_source_sysfs_remove(struct wakeup_source *ws)
{
device_unregister(ws->dev);
- ida_simple_remove(&wakeup_ida, ws->id);
+ if (ws->id >= 0)
+ ida_free(&wakeup_ida, ws->id);
}
EXPORT_SYMBOL_GPL(wakeup_source_sysfs_remove);
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h
index f39f768389c8..c9fb00fca22e 100644
--- a/include/linux/pm_wakeup.h
+++ b/include/linux/pm_wakeup.h
@@ -107,7 +107,7 @@ extern void pm_wakeup_dev_event(struct device *dev, unsigned int msec, bool hard
/* drivers/base/power/wakeup_stats.c */
extern int wakeup_source_sysfs_add(struct device *parent,
- struct wakeup_source *ws);
+ struct wakeup_source *ws, bool use_ws_name);
extern void wakeup_source_sysfs_remove(struct wakeup_source *ws);
#else /* !CONFIG_PM_SLEEP */
diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c
index 826fcd97647a..7f2fc5f9b3b3 100644
--- a/kernel/power/wakelock.c
+++ b/kernel/power/wakelock.c
@@ -192,7 +192,7 @@ static struct wakelock *wakelock_lookup_add(const char *name, size_t len,
wl->ws.name = wl->name;
wl->ws.last_time = ktime_get();
- ret = wakeup_source_sysfs_add(NULL, &wl->ws);
+ ret = wakeup_source_sysfs_add(NULL, &wl->ws, true);
if (ret) {
kfree(wl->name);
kfree(wl);
next prev parent reply other threads:[~2019-08-01 0:45 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-31 21:55 [PATCH v6] PM / wakeup: show wakeup sources stats in sysfs Tri Vo
2019-07-31 21:59 ` Stephen Boyd
2019-07-31 22:16 ` Tri Vo
2019-07-31 22:17 ` Rafael J. Wysocki
2019-07-31 22:31 ` Tri Vo
2019-07-31 22:42 ` Rafael J. Wysocki
2019-07-31 22:58 ` Tri Vo
2019-07-31 23:10 ` Rafael J. Wysocki
2019-07-31 23:27 ` Tri Vo
2019-07-31 23:45 ` Stephen Boyd
2019-08-01 0:45 ` Stephen Boyd [this message]
2019-08-01 8:09 ` Rafael J. Wysocki
2019-08-01 15:31 ` Stephen Boyd
2019-08-01 17:21 ` Rafael J. Wysocki
2019-08-01 19:25 ` Stephen Boyd
2019-08-01 19:36 ` Greg Kroah-Hartman
2019-08-01 19:50 ` Tri Vo
2019-08-01 20:22 ` Stephen Boyd
2019-08-01 21:44 ` Tri Vo
2019-08-01 22:10 ` Rafael J. Wysocki
2019-08-03 22:40 ` Tri Vo
2019-08-05 8:32 ` Rafael J. Wysocki
2019-08-01 22:11 ` Stephen Boyd
2019-08-01 22:44 ` Tri Vo
2019-08-01 23:37 ` Stephen Boyd
2019-08-01 22:46 ` Rafael J. Wysocki
2019-08-01 23:40 ` Stephen Boyd
2019-07-31 23:00 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5d423637.1c69fb81.62114.ca6f@mx.google.com \
--to=swboyd@chromium.org \
--cc=gregkh@linuxfoundation.org \
--cc=hridya@google.com \
--cc=kaleshsingh@google.com \
--cc=kernel-team@android.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=ravisadineni@chromium.org \
--cc=rjw@rjwysocki.net \
--cc=sspatil@google.com \
--cc=trong@android.com \
--cc=viresh.kumar@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).