linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] clocksource: Extract clocksource lookup code
@ 2019-06-14 10:45 Thierry Reding
  2019-06-14 10:45 ` [PATCH 2/2] clocksource: Add suspend clocksource sysfs attribute Thierry Reding
  0 siblings, 1 reply; 2+ messages in thread
From: Thierry Reding @ 2019-06-14 10:45 UTC (permalink / raw)
  To: John Stultz, Thomas Gleixner; +Cc: Stephen Boyd, linux-kernel

From: Thierry Reding <treding@nvidia.com>

Move the clocksource lookup code into a separate function. This will
allow subsequent patches to reuse this code.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 kernel/time/clocksource.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 3bcc19ceb073..467b36d2f9f8 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -453,6 +453,18 @@ static inline void clocksource_watchdog_unlock(unsigned long *flags) { }
 
 #endif /* CONFIG_CLOCKSOURCE_WATCHDOG */
 
+static struct clocksource *clocksource_lookup(const char *name)
+{
+	struct clocksource *cs;
+
+	list_for_each_entry(cs, &clocksource_list, list) {
+		if (strcmp(cs->name, name) == 0)
+			return cs;
+	}
+
+	return NULL;
+}
+
 static bool clocksource_is_suspend(struct clocksource *cs)
 {
 	return cs == suspend_clocksource;
@@ -1110,14 +1122,14 @@ static ssize_t unbind_clocksource_store(struct device *dev,
 	if (ret < 0)
 		return ret;
 
-	ret = -ENODEV;
 	mutex_lock(&clocksource_mutex);
-	list_for_each_entry(cs, &clocksource_list, list) {
-		if (strcmp(cs->name, name))
-			continue;
+
+	cs = clocksource_lookup(name);
+	if (cs)
 		ret = clocksource_unbind(cs);
-		break;
-	}
+	else
+		ret = -ENODEV;
+
 	mutex_unlock(&clocksource_mutex);
 
 	return ret ? ret : count;
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [PATCH 2/2] clocksource: Add suspend clocksource sysfs attribute
  2019-06-14 10:45 [PATCH 1/2] clocksource: Extract clocksource lookup code Thierry Reding
@ 2019-06-14 10:45 ` Thierry Reding
  0 siblings, 0 replies; 2+ messages in thread
From: Thierry Reding @ 2019-06-14 10:45 UTC (permalink / raw)
  To: John Stultz, Thomas Gleixner; +Cc: Stephen Boyd, linux-kernel

From: Thierry Reding <treding@nvidia.com>

Allow the currently selected suspend clocksource to be inspected via
sysfs. The suspend clocksource can also be set using this attribute,
which can be useful for debugging.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 kernel/time/clocksource.c | 53 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)

diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 467b36d2f9f8..d963bcecbc96 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -489,7 +489,8 @@ static void __clocksource_suspend_select(struct clocksource *cs)
 	}
 
 	/* Pick the best rating. */
-	if (!suspend_clocksource || cs->rating > suspend_clocksource->rating)
+	if (!suspend_clocksource || cs->rating > suspend_clocksource->rating ||
+	    (suspend_clocksource->flags & CLOCK_SOURCE_SUSPEND_NONSTOP) == 0)
 		suspend_clocksource = cs;
 }
 
@@ -1172,10 +1173,60 @@ static ssize_t available_clocksource_show(struct device *dev,
 }
 static DEVICE_ATTR_RO(available_clocksource);
 
+static ssize_t suspend_clocksource_show(struct device *dev,
+					struct device_attribute *attr,
+					char *buf)
+{
+	struct clocksource *clksrc = suspend_clocksource;
+	ssize_t count = 0;
+
+	if (clksrc)
+		count += snprintf(buf, PAGE_SIZE, "%s\n", clksrc->name);
+
+	return count;
+}
+
+static ssize_t suspend_clocksource_store(struct device *dev,
+					 struct device_attribute *attr,
+					 const char *buf, size_t count)
+{
+	struct clocksource *cs;
+	char name[CS_NAME_LEN];
+	ssize_t ret;
+
+	ret = sysfs_get_uname(buf, name, count);
+	if (ret < 0)
+		return ret;
+
+	mutex_lock(&clocksource_mutex);
+
+	if (strlen(name) > 0) {
+		cs = clocksource_lookup(name);
+		if (cs) {
+			if (!(cs->flags & CLOCK_SOURCE_SUSPEND_NONSTOP))
+				pr_warn("using non-persistent clocksource %s for suspend\n",
+					cs->name);
+
+			suspend_clocksource = cs;
+		} else {
+			ret = -ENODEV;
+		}
+	} else {
+		clocksource_suspend_select(false);
+	}
+
+	mutex_unlock(&clocksource_mutex);
+
+	return ret ? ret : count;
+}
+
+static DEVICE_ATTR_RW(suspend_clocksource);
+
 static struct attribute *clocksource_attrs[] = {
 	&dev_attr_current_clocksource.attr,
 	&dev_attr_unbind_clocksource.attr,
 	&dev_attr_available_clocksource.attr,
+	&dev_attr_suspend_clocksource.attr,
 	NULL
 };
 ATTRIBUTE_GROUPS(clocksource);
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-06-14 10:45 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-14 10:45 [PATCH 1/2] clocksource: Extract clocksource lookup code Thierry Reding
2019-06-14 10:45 ` [PATCH 2/2] clocksource: Add suspend clocksource sysfs attribute Thierry Reding

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).