svn commit: r342810 - head/usr.sbin/powerd

Andriy Voskoboinyk avos at FreeBSD.org
Sun Jan 6 02:39:05 UTC 2019


Author: avos
Date: Sun Jan  6 02:39:03 2019
New Revision: 342810
URL: https://svnweb.freebsd.org/changeset/base/342810

Log:
  powerd(8): allow to force a method of battery state query
  
  This change allows to determine power source via sysctl or /dev/apm
  when devd(8) is running (used by default).
  
  Based on patch from PR; other changes on top of it:
  - '-f' (force) -> '-s' (source) parameter renaming;
  - allow 'apm' -> 'devd' transition when '-s devd' is set
  (if APM is enabled);
  - man page update.
  
  Checked on amd64 with -s devd / sysctl and apm
  (an extra build with forced USE_APM define set was done)
  
  PR:		125707
  Submitted by:	Konstantin Stepanov <milezv at yandex.ru>
  Reviewed by:	bcr, imp
  MFC after:	1 week
  Differential Revision:	https://reviews.freebsd.org/D18742

Modified:
  head/usr.sbin/powerd/powerd.8
  head/usr.sbin/powerd/powerd.c

Modified: head/usr.sbin/powerd/powerd.8
==============================================================================
--- head/usr.sbin/powerd/powerd.8	Sun Jan  6 02:17:18 2019	(r342809)
+++ head/usr.sbin/powerd/powerd.8	Sun Jan  6 02:39:03 2019	(r342810)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 4, 2013
+.Dd January 6, 2019
 .Dt POWERD 8
 .Os
 .Sh NAME
@@ -41,6 +41,7 @@
 .Op Fl p Ar ival
 .Op Fl P Ar pidfile
 .Op Fl r Ar percent
+.Op Fl s Ar source
 .Op Fl v
 .Sh DESCRIPTION
 The
@@ -117,6 +118,14 @@ The default is
 Specifies the CPU load percent level where adaptive
 mode should consider the CPU running and increase performance.
 The default is 75% or higher.
+.It Fl s Ar source
+Enforces method for AC line state refresh; by default, it is chosen
+automatically.
+The set of valid methods is
+.Cm sysctl , devd
+and
+.Cm apm
+(i386 only).
 .It Fl v
 Verbose mode.
 Messages about power changes will be printed to stdout and

Modified: head/usr.sbin/powerd/powerd.c
==============================================================================
--- head/usr.sbin/powerd/powerd.c	Sun Jan  6 02:17:18 2019	(r342809)
+++ head/usr.sbin/powerd/powerd.c	Sun Jan  6 02:39:03 2019	(r342810)
@@ -113,14 +113,16 @@ static int	vflag;
 
 static volatile sig_atomic_t exit_requested;
 static power_src_t acline_status;
-static enum {
+typedef enum {
 	ac_none,
 	ac_sysctl,
 	ac_acpi_devd,
 #ifdef USE_APM
 	ac_apm,
 #endif
-} acline_mode;
+} acline_mode_t;
+static acline_mode_t acline_mode;
+static acline_mode_t acline_mode_user = ac_none;
 #ifdef USE_APM
 static int	apm_fd = -1;
 #endif
@@ -286,21 +288,28 @@ get_freq_id(int freq, int *freqs, int numfreqs)
 static void
 acline_init(void)
 {
+	int skip_source_check;
+
 	acline_mib_len = 4;
 	acline_status = SRC_UNKNOWN;
+	skip_source_check = (acline_mode_user == ac_none ||
+			     acline_mode_user == ac_acpi_devd);
 
-	if (sysctlnametomib(ACPIAC, acline_mib, &acline_mib_len) == 0) {
+	if ((skip_source_check || acline_mode_user == ac_sysctl) &&
+	    sysctlnametomib(ACPIAC, acline_mib, &acline_mib_len) == 0) {
 		acline_mode = ac_sysctl;
 		if (vflag)
 			warnx("using sysctl for AC line status");
 #ifdef __powerpc__
-	} else if (sysctlnametomib(PMUAC, acline_mib, &acline_mib_len) == 0) {
+	} else if ((skip_source_check || acline_mode_user == ac_sysctl) &&
+		   sysctlnametomib(PMUAC, acline_mib, &acline_mib_len) == 0) {
 		acline_mode = ac_sysctl;
 		if (vflag)
 			warnx("using sysctl for AC line status");
 #endif
 #ifdef USE_APM
-	} else if ((apm_fd = open(APMDEV, O_RDONLY)) >= 0) {
+	} else if ((skip_source_check || acline_mode_user == ac_apm) &&
+		   (apm_fd = open(APMDEV, O_RDONLY)) >= 0) {
 		if (vflag)
 			warnx("using APM for AC line status");
 		acline_mode = ac_apm;
@@ -360,7 +369,17 @@ acline_read(void)
 	}
 #endif
 	/* try to (re)connect to devd */
-	if (acline_mode == ac_sysctl) {
+#ifdef USE_APM
+	if ((acline_mode == ac_sysctl &&
+	    (acline_mode_user == ac_none ||
+	     acline_mode_user == ac_acpi_devd)) ||
+	    (acline_mode == ac_apm &&
+	     acline_mode_user == ac_acpi_devd)) {
+#else
+	if (acline_mode == ac_sysctl &&
+	    (acline_mode_user == ac_none ||
+	     acline_mode_user == ac_acpi_devd)) {
+#endif
 		struct timeval now;
 
 		gettimeofday(&now, NULL);
@@ -426,6 +445,21 @@ parse_mode(char *arg, int *mode, int ch)
 }
 
 static void
+parse_acline_mode(char *arg, int ch)
+{
+	if (strcmp(arg, "sysctl") == 0)
+		acline_mode_user = ac_sysctl;
+	else if (strcmp(arg, "devd") == 0)
+		acline_mode_user = ac_acpi_devd;
+#ifdef USE_APM
+	else if (strcmp(arg, "apm") == 0)
+		acline_mode_user = ac_apm;
+#endif
+	else
+		errx(1, "bad option: -%c %s", (char)ch, optarg);
+}
+
+static void
 handle_sigs(int __unused sig)
 {
 
@@ -437,7 +471,7 @@ usage(void)
 {
 
 	fprintf(stderr,
-"usage: powerd [-v] [-a mode] [-b mode] [-i %%] [-m freq] [-M freq] [-n mode] [-p ival] [-r %%] [-P pidfile]\n");
+"usage: powerd [-v] [-a mode] [-b mode] [-i %%] [-m freq] [-M freq] [-n mode] [-p ival] [-r %%] [-s source] [-P pidfile]\n");
 	exit(1);
 }
 
@@ -468,13 +502,16 @@ main(int argc, char * argv[])
 	if (geteuid() != 0)
 		errx(1, "must be root to run");
 
-	while ((ch = getopt(argc, argv, "a:b:i:m:M:n:p:P:r:v")) != -1)
+	while ((ch = getopt(argc, argv, "a:b:i:m:M:n:p:P:r:s:v")) != -1)
 		switch (ch) {
 		case 'a':
 			parse_mode(optarg, &mode_ac, ch);
 			break;
 		case 'b':
 			parse_mode(optarg, &mode_battery, ch);
+			break;
+		case 's':
+			parse_acline_mode(optarg, ch);
 			break;
 		case 'i':
 			cpu_idle_mark = atoi(optarg);


More information about the svn-src-all mailing list