tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Adding a flag to sysctl_createv() to silence ARM warnings



Hey folks,

at startup all arm machines show a warning:

total memory = 512 MB
avail memory = 495 MB
sysctl_createv: sysctl_create(machine_arch) returned 17
timecounter: Timecounters tick every 10.000 msec


This is because sys/arach/arm/arm32/arm32_machdep.c creates the 
hw.machine_arch sysctl value first (overriding the generic one).
(Slightly) later kern/sysctl_init_base.c tries to create the same (but
different) value and (verbosly) fails with EEXIST.

Easy way out: use the sysctl_createv() "cflags" argument to pass in
an option telling it this is ok, and make it silently fail.

The patch attached does that.

Comments?

Martin
Index: sys/sys/sysctl.h
===================================================================
RCS file: /cvsroot/src/sys/sys/sysctl.h,v
retrieving revision 1.225
diff -u -p -r1.225 sysctl.h
--- sys/sys/sysctl.h	8 Sep 2017 10:53:55 -0000	1.225
+++ sys/sys/sysctl.h	19 Oct 2017 10:20:03 -0000
@@ -164,6 +164,11 @@ struct ctlname {
 #define CTL_DESCRIBE	(-7)		/* get node descriptions */
 
 /*
+ * cflag values for sysctl_createv()
+ */
+#define	CREATEFLAG_MAYEXIST	1
+
+/*
  * Top-level identifiers
  */
 #define	CTL_UNSPEC	0		/* unused */
Index: sys/kern/init_sysctl_base.c
===================================================================
RCS file: /cvsroot/src/sys/kern/init_sysctl_base.c,v
retrieving revision 1.7
diff -u -p -r1.7 init_sysctl_base.c
--- sys/kern/init_sysctl_base.c	25 Aug 2015 14:52:31 -0000	1.7
+++ sys/kern/init_sysctl_base.c	19 Oct 2017 10:20:03 -0000
@@ -201,7 +201,7 @@ SYSCTL_SETUP(sysctl_hwbase_setup, "sysct
 		       SYSCTL_DESCR("Machine class"),
 		       NULL, 0, machine, 0,
 		       CTL_HW, HW_MACHINE, CTL_EOL);
-	sysctl_createv(clog, 0, NULL, NULL,
+	sysctl_createv(clog, CREATEFLAG_MAYEXIST, NULL, NULL,
 		       CTLFLAG_PERMANENT,
 		       CTLTYPE_STRING, "machine_arch",
 		       SYSCTL_DESCR("Machine CPU class"),
Index: sys/kern/kern_sysctl.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.259
diff -u -p -r1.259 kern_sysctl.c
--- sys/kern/kern_sysctl.c	25 Apr 2017 22:07:10 -0000	1.259
+++ sys/kern/kern_sysctl.c	19 Oct 2017 10:20:04 -0000
@@ -1967,7 +1967,7 @@ sysctl_createv(struct sysctllog **log, i
 	root = rnode ? *rnode : NULL;
 	if (cnode != NULL)
 		*cnode = NULL;
-	if (cflags != 0)
+	if ((cflags & ~CREATEFLAG_MAYEXIST) != 0)
 		return (EINVAL);
 
 	/*
@@ -2181,12 +2181,14 @@ sysctl_createv(struct sysctllog **log, i
 	sysctl_unlock();
 
 	if (error != 0) {
-		printf("sysctl_createv: sysctl_create(%s) returned %d\n",
-		       nnode.sysctl_name, error);
+		if (error != EEXIST || (cflags&CREATEFLAG_MAYEXIST) == 0) {
+			printf("sysctl_createv: sysctl_create(%s) "
+			    "returned %d\n", nnode.sysctl_name, error);
 #if 0
-		if (error != ENOENT)
-			sysctl_dump(&onode);
+			if (error != ENOENT)
+				sysctl_dump(&onode);
 #endif
+		}
 	}
 
 	return (error);
Index: share/man/man9/sysctl.9
===================================================================
RCS file: /cvsroot/src/share/man/man9/sysctl.9,v
retrieving revision 1.20
diff -u -p -r1.20 sysctl.9
--- share/man/man9/sysctl.9	3 Jul 2017 21:28:48 -0000	1.20
+++ share/man/man9/sysctl.9	19 Oct 2017 10:20:04 -0000
@@ -330,7 +330,22 @@ keeping on the caller's part.
 .Pp
 The
 .Fa cflags
-argument is currently unused and must be zero.
+argument controlls the creation operation in case of already existing nodes.
+It must be either
+.Dv 0
+or
+.Dv CREATEFLAG_MAYEXIST .
+The flag
+.Dv CREATEFLAG_MAYEXIST
+allows silently skipping already existing, but different nodes.
+This is for example usefull for machine dependend parts overriding
+sysctl values usually provided by the machine independ part of the
+kernel.
+Creation of exactly the same node is always silently allowed, so
+different parts of the kernel (or different modules) can create the
+same base tree and add their own subtree independent of initialization
+order.
+.Pp
 The
 .Fa rnode
 argument must either be


Home | Main Index | Thread Index | Old Index