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