PERFORCE change 99955 for review

Christian S.J. Peron csjp at FreeBSD.org
Sun Jun 25 01:06:21 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=99955

Change 99955 by csjp at csjp_rnd01 on 2006/06/25 01:05:23

	Import the machinery for being able to set specific sysctl OIDs as being
	mpsafe. There are some more changes to come.

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/dev/bge/if_bge.c#7 edit
.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_descrip.c#8 edit
.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_proc.c#7 edit
.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_sysctl.c#4 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/sysctl.h#4 edit

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/dev/bge/if_bge.c#7 (text+ko) ====

@@ -110,6 +110,9 @@
 
 #include <dev/bge/if_bgereg.h>
 
+#include <dev/ofw/openfirm.h>
+#include <machine/ofw_machdep.h>
+
 #define BGE_CSUM_FEATURES	(CSUM_IP | CSUM_TCP | CSUM_UDP)
 #define ETHER_MIN_NOPAD		(ETHER_MIN_LEN - ETHER_CRC_LEN) /* i.e., 60 */
 
@@ -721,8 +724,8 @@
 		}
 		return(ENOMEM);
 	}
-	r->bge_addr.bge_addr_lo = BGE_ADDR_LO(ctx.bge_busaddr);
-	r->bge_addr.bge_addr_hi = BGE_ADDR_HI(ctx.bge_busaddr);
+	r->bge_addr.bge_addr_lo = htole32(BGE_ADDR_LO(ctx.bge_busaddr));
+	r->bge_addr.bge_addr_hi = htole32(BGE_ADDR_HI(ctx.bge_busaddr));
 	r->bge_flags = BGE_RXBDFLAG_END;
 	r->bge_len = m_new->m_len;
 	r->bge_idx = i;
@@ -2051,7 +2054,6 @@
 	struct ifnet *ifp;
 	struct bge_softc *sc;
 	u_int32_t hwcfg = 0;
-	u_int32_t mac_tmp = 0;
 	u_char eaddr[6];
 	int error = 0, rid;
 
@@ -2132,24 +2134,9 @@
 	}
 
 	/*
-	 * Get station address from the EEPROM.
+	 * XXX get address from OpenFirmware
 	 */
-	mac_tmp = bge_readmem_ind(sc, 0x0c14);
-	if ((mac_tmp >> 16) == 0x484b) {
-		eaddr[0] = (u_char)(mac_tmp >> 8);
-		eaddr[1] = (u_char)mac_tmp;
-		mac_tmp = bge_readmem_ind(sc, 0x0c18);
-		eaddr[2] = (u_char)(mac_tmp >> 24);
-		eaddr[3] = (u_char)(mac_tmp >> 16);
-		eaddr[4] = (u_char)(mac_tmp >> 8);
-		eaddr[5] = (u_char)mac_tmp;
-	} else if (bge_read_eeprom(sc, eaddr,
-	    BGE_EE_MAC_OFFSET + 2, ETHER_ADDR_LEN)) {
-		device_printf(sc->bge_dev, "failed to read station address\n");
-		bge_release_resources(sc);
-		error = ENXIO;
-		goto fail;
-	}
+	OF_getetheraddr(dev, &eaddr[0]);
 
 	/* 5705 limits RX return ring to 512 entries. */
 	if (sc->bge_asicrev == BGE_ASICREV_BCM5705 ||

==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_descrip.c#8 (text+ko) ====

@@ -2479,7 +2479,7 @@
 	return (error);
 }
 
-SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD,
+SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD|CTLFLAG_MPSAFE,
     0, 0, sysctl_kern_file, "S,xfile", "Entire file table");
 
 #ifdef DDB

==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_proc.c#7 (text+ko) ====

@@ -1291,34 +1291,40 @@
 
 static SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD,  0, "Process table");
 
-SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT,
+SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all,
+	CTLFLAG_RD|CTLTYPE_STRUCT|CTLFLAG_MPSAFE,
 	0, 0, sysctl_kern_proc, "S,proc", "Return entire process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_GID, gid, CTLFLAG_RD,
+static SYSCTL_NODE(_kern_proc, KERN_PROC_GID, gid, CTLFLAG_RD|CTLFLAG_MPSAFE,
 	sysctl_kern_proc, "Process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_PGRP, pgrp, CTLFLAG_RD, 
+static SYSCTL_NODE(_kern_proc, KERN_PROC_PGRP, pgrp,
+	CTLFLAG_RD|CTLFLAG_MPSAFE, 
 	sysctl_kern_proc, "Process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_RGID, rgid, CTLFLAG_RD,
+static SYSCTL_NODE(_kern_proc, KERN_PROC_RGID, rgid,
+	CTLFLAG_RD|CTLFLAG_MPSAFE,
 	sysctl_kern_proc, "Process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_SESSION, sid, CTLFLAG_RD,
+static SYSCTL_NODE(_kern_proc, KERN_PROC_SESSION, sid,
+	CTLFLAG_RD|CTLFLAG_MPSAFE,
 	sysctl_kern_proc, "Process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_TTY, tty, CTLFLAG_RD, 
+static SYSCTL_NODE(_kern_proc, KERN_PROC_TTY, tty, CTLFLAG_RD|CTLFLAG_MPSAFE, 
 	sysctl_kern_proc, "Process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_UID, uid, CTLFLAG_RD, 
+static SYSCTL_NODE(_kern_proc, KERN_PROC_UID, uid, CTLFLAG_RD|CTLFLAG_MPSAFE, 
 	sysctl_kern_proc, "Process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_RUID, ruid, CTLFLAG_RD, 
+static SYSCTL_NODE(_kern_proc, KERN_PROC_RUID, ruid,
+	CTLFLAG_RD|CTLFLAG_MPSAFE, 
 	sysctl_kern_proc, "Process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_PID, pid, CTLFLAG_RD, 
+static SYSCTL_NODE(_kern_proc, KERN_PROC_PID, pid, CTLFLAG_RD|CTLFLAG_MPSAFE, 
 	sysctl_kern_proc, "Process table");
 
-static SYSCTL_NODE(_kern_proc, KERN_PROC_PROC, proc, CTLFLAG_RD,
+static SYSCTL_NODE(_kern_proc, KERN_PROC_PROC, proc,
+	CTLFLAG_RD|CTLFLAG_MPSAFE,
 	sysctl_kern_proc, "Return process table, no threads");
 
 static SYSCTL_NODE(_kern_proc, KERN_PROC_ARGS, args,
@@ -1332,28 +1338,29 @@
 	sysctl_kern_proc_sv_name, "Process syscall vector name (ABI type)");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_GID | KERN_PROC_INC_THREAD), gid_td,
-	CTLFLAG_RD, sysctl_kern_proc, "Process table");
+	CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc, "Process table");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PGRP | KERN_PROC_INC_THREAD), pgrp_td,
-	CTLFLAG_RD, sysctl_kern_proc, "Process table");
+	CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc, "Process table");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_RGID | KERN_PROC_INC_THREAD), rgid_td,
-	CTLFLAG_RD, sysctl_kern_proc, "Process table");
+	CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc, "Process table");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_SESSION | KERN_PROC_INC_THREAD),
-	sid_td, CTLFLAG_RD, sysctl_kern_proc, "Process table");
+	sid_td, CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc, "Process table");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_TTY | KERN_PROC_INC_THREAD), tty_td,
-	CTLFLAG_RD, sysctl_kern_proc, "Process table");
+	CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc, "Process table");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_UID | KERN_PROC_INC_THREAD), uid_td,
-	CTLFLAG_RD, sysctl_kern_proc, "Process table");
+	CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc, "Process table");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_RUID | KERN_PROC_INC_THREAD), ruid_td,
-	CTLFLAG_RD, sysctl_kern_proc, "Process table");
+	CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc, "Process table");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PID | KERN_PROC_INC_THREAD), pid_td,
-	CTLFLAG_RD, sysctl_kern_proc, "Process table");
+	CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc, "Process table");
 
 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PROC | KERN_PROC_INC_THREAD), proc_td,
-	CTLFLAG_RD, sysctl_kern_proc, "Return process table, no threads");
+	CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc,
+	"Return process table, no threads");

==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_sysctl.c#4 (text+ko) ====

@@ -1229,19 +1229,25 @@
 	if (error)
 		return (error);
 
+	if ((oid->oid_kind & CTLFLAG_MPSAFE) == 0)
+		mtx_lock(&Giant);
 	if ((oid->oid_kind & CTLTYPE) == CTLTYPE_NODE) {
 		/*
 		 * You can't call a sysctl when it's a node, but has
 		 * no handler.  Inform the user that it's a node.
 		 * The indx may or may not be the same as namelen.
 		 */
-		if (oid->oid_handler == NULL)
-			return (EISDIR);
+		if (oid->oid_handler == NULL) {
+			error = EISDIR;
+			goto done;
+		}
 	}
 
 	/* Is this sysctl writable? */
-	if (req->newptr && !(oid->oid_kind & CTLFLAG_WR))
-		return (EPERM);
+	if (req->newptr && !(oid->oid_kind & CTLFLAG_WR)) {
+		error = EPERM;
+		goto done;
+	}
 
 	KASSERT(req->td != NULL, ("sysctl_root(): req->td == NULL"));
 
@@ -1250,7 +1256,7 @@
 		lvl = (oid->oid_kind & CTLMASK_SECURE) >> CTLSHIFT_SECURE;
 		error = securelevel_gt(req->td->td_ucred, lvl);
 		if (error)
-			return (error);
+			goto done;
 	}
 
 	/* Is this sysctl writable by only privileged users? */
@@ -1263,11 +1269,13 @@
 			flags = 0;
 		error = suser_cred(req->td->td_ucred, flags);
 		if (error)
-			return (error);
+			goto done;
 	}
 
-	if (!oid->oid_handler)
-		return (EINVAL);
+	if (!oid->oid_handler) {
+		error = EINVAL;
+		goto done;
+	}
 
 	if ((oid->oid_kind & CTLTYPE) == CTLTYPE_NODE) {
 		arg1 = (int *)arg1 + indx;
@@ -1280,12 +1288,14 @@
 	error = mac_check_system_sysctl(req->td->td_ucred, oid, arg1, arg2,
 	    req);
 	if (error != 0)
-		return (error);
+		goto done;
 #endif
 	if (oid->oid_handler == NULL)
 		panic("oid handler null");
 	error = oid->oid_handler(oid, arg1, arg2, req);
-
+done:
+	if ((oid->oid_kind & CTLFLAG_MPSAFE) == 0)
+		mtx_unlock(&Giant);
 	return (error);
 }
 
@@ -1316,8 +1326,6 @@
  	if (error)
 		return (error);
 
-	mtx_lock(&Giant);
-
 	error = userland_sysctl(td, name, uap->namelen,
 		uap->old, uap->oldlenp, 0,
 		uap->new, uap->newlen, &j, 0);
@@ -1329,7 +1337,6 @@
 			error = i;
 	}
 done2:
-	mtx_unlock(&Giant);
 	return (error);
 }
 

==== //depot/projects/kmacy_sun4v/src/sys/sys/sysctl.h#4 (text+ko) ====

@@ -84,6 +84,7 @@
 #define CTLFLAG_SKIP	0x01000000	/* Skip this sysctl when listing */
 #define CTLMASK_SECURE	0x00F00000	/* Secure level */
 #define CTLFLAG_TUN	0x00080000	/* Tunable variable */
+#define	CTLFLAG_MPSAFE	0x00040000	/* Handler is MP safe */
 #define CTLFLAG_RDTUN	(CTLFLAG_RD|CTLFLAG_TUN)
 
 /*


More information about the p4-projects mailing list