svn commit: r248108 - in user/attilio/vmc-playground: lib/libutil sys/dev/ichwd sys/fs/smbfs sys/kern sys/net80211

Attilio Rao attilio at FreeBSD.org
Sat Mar 9 16:11:31 UTC 2013


Author: attilio
Date: Sat Mar  9 16:11:29 2013
New Revision: 248108
URL: http://svnweb.freebsd.org/changeset/base/248108

Log:
  Merge from vmcontention

Modified:
  user/attilio/vmc-playground/lib/libutil/gr_util.c
  user/attilio/vmc-playground/sys/dev/ichwd/ichwd.c
  user/attilio/vmc-playground/sys/fs/smbfs/smbfs_smb.c
  user/attilio/vmc-playground/sys/fs/smbfs/smbfs_vnops.c
  user/attilio/vmc-playground/sys/kern/kern_umtx.c
  user/attilio/vmc-playground/sys/net80211/ieee80211_output.c
Directory Properties:
  user/attilio/vmc-playground/   (props changed)
  user/attilio/vmc-playground/lib/libutil/   (props changed)
  user/attilio/vmc-playground/sys/   (props changed)

Modified: user/attilio/vmc-playground/lib/libutil/gr_util.c
==============================================================================
--- user/attilio/vmc-playground/lib/libutil/gr_util.c	Sat Mar  9 15:54:20 2013	(r248107)
+++ user/attilio/vmc-playground/lib/libutil/gr_util.c	Sat Mar  9 16:11:29 2013	(r248108)
@@ -50,7 +50,7 @@ static char group_file[PATH_MAX];
 static char tempname[PATH_MAX];
 static int initialized;
 static size_t grmemlen(const struct group *, const char *, int *);
-static struct group *grcopy(const struct group *gr, struct group *newgr, const char *, int ndx);
+static struct group *grcopy(const struct group *gr, char *mem, const char *, int ndx);
 
 /*
  * Initialize statics
@@ -361,26 +361,30 @@ gr_equal(const struct group *gr1, const 
 	if (gr1->gr_gid != gr2->gr_gid)
 		return (false);
 
-	/* Check all members in both groups. */
-	if (gr1->gr_mem == NULL || gr2->gr_mem == NULL) {
-		if (gr1->gr_mem != gr2->gr_mem)
-			return (false);
-	} else {
-		for (gr1_ndx = 0; gr1->gr_mem[gr1_ndx] != NULL; gr1_ndx++) {
-			for (gr2_ndx = 0;; gr2_ndx++) {
-				if (gr2->gr_mem[gr2_ndx] == NULL)
-					return (false);
-				if (strcmp(gr1->gr_mem[gr1_ndx],
-				    gr2->gr_mem[gr2_ndx]) == 0) {
-					break;
-				}
-			}
-		}
-
-		/* Check that group2 does not have more members than group1. */
-		if (gr2->gr_mem[gr1_ndx] != NULL)
-			return (false);
-	}
+	/* Check all members in both groups.
+	 * getgrnam can return gr_mem with a pointer to NULL.
+	 * gr_dup and gr_add strip out this superfluous NULL, setting
+	 * gr_mem to NULL for no members.
+	*/
+	if (gr1->gr_mem != NULL && gr2->gr_mem != NULL) {
+		int i;
+
+		for (i = 0; gr1->gr_mem[i] != NULL; i++) {
+			if (strcmp(gr1->gr_mem[i], gr2->gr_mem[i]) != 0)
+				return (false);
+		}
+	}
+	/* Count number of members in both structs */
+	gr2_ndx = 0;
+	if (gr2->gr_mem != NULL)
+		for(; gr2->gr_mem[gr2_ndx] != NULL; gr2_ndx++)
+			/* empty */;
+	gr1_ndx = 0;
+	if (gr1->gr_mem != NULL)
+		for(; gr1->gr_mem[gr1_ndx] != NULL; gr1_ndx++)
+			/* empty */;
+	if (gr1_ndx != gr2_ndx)
+		return (false);
 
 	return (true);
 }
@@ -439,21 +443,21 @@ gr_dup(const struct group *gr)
 struct group *
 gr_add(const struct group *gr, const char *newmember)
 {
-	struct group *newgr;
+	char *mem;
 	size_t len;
 	int num_mem;
 
 	num_mem = 0;
 	len = grmemlen(gr, newmember, &num_mem);
 	/* Create new group and copy old group into it. */
-	if ((newgr = malloc(len)) == NULL)
+	if ((mem = malloc(len)) == NULL)
 		return (NULL);
-	return (grcopy(gr, newgr, newmember, num_mem));
+	return (grcopy(gr, mem, newmember, num_mem));
 }
 
 /* It is safer to walk the pointers given at gr_mem since there is no
- * guarantee the gr_mem + strings are continguous in the given struct group
- * but compact the new group into the following form.
+ * guarantee the gr_mem + strings are contiguous in the given struct group
+ * but compactify the new group into the following form.
  *
  * The new struct is laid out like this in memory. The example given is
  * for a group with two members only.
@@ -474,23 +478,21 @@ gr_add(const struct group *gr, const cha
  * }
  */
 /*
- * Copy the guts of a group plus given name to a preallocated group struct
+ * Copy the contents of a group plus given name to a preallocated group struct
  */
 static struct group *
-grcopy(const struct group *gr, struct group *newgr, const char *name, int ndx)
+grcopy(const struct group *gr, char *dst, const char *name, int ndx)
 {
-	char *dst;
 	int i;
+	struct group *newgr;
 
-	if (name != NULL)
-		ndx++;
-	/* point new gr_mem to end of struct + 1 if there are names */
-	if (ndx != 0)
-		newgr->gr_mem = (char **)(newgr + 1);
-	else
+	newgr = (struct group *)(void *)dst;	/* avoid alignment warning */
+	dst += sizeof(*newgr);
+	if (ndx != 0) {
+		newgr->gr_mem = (char **)(void *)(dst);	/* avoid alignment warning */
+		dst += (ndx + 1) * sizeof(*newgr->gr_mem);
+	} else
 		newgr->gr_mem = NULL;
-	/* point dst after the end of all the gr_mem pointers in newgr */
-	dst = (char *)&newgr->gr_mem[ndx + 1];
 	if (gr->gr_name != NULL) {
 		newgr->gr_name = dst;
 		dst = stpcpy(dst, gr->gr_name) + 1;
@@ -502,17 +504,23 @@ grcopy(const struct group *gr, struct gr
 	} else
 		newgr->gr_passwd = NULL;
 	newgr->gr_gid = gr->gr_gid;
-	if (ndx != 0) {
-		for (i = 0; gr->gr_mem[i] != NULL; i++) {
+	i = 0;
+	/* Original group struct might have a NULL gr_mem */
+	if (gr->gr_mem != NULL) {
+		for (; gr->gr_mem[i] != NULL; i++) {
 			newgr->gr_mem[i] = dst;
 			dst = stpcpy(dst, gr->gr_mem[i]) + 1;
 		}
-		if (name != NULL) {
-			newgr->gr_mem[i++] = dst;
-			dst = stpcpy(dst, name) + 1;
-		}
-		newgr->gr_mem[i] = NULL;
 	}
+	/* If name is not NULL, newgr->gr_mem is known to be not NULL */
+	if (name != NULL) {
+		newgr->gr_mem[i++] = dst;
+		dst = stpcpy(dst, name) + 1;
+	}
+	/* if newgr->gr_mem is not NULL add NULL marker */
+	if (newgr->gr_mem != NULL)
+		newgr->gr_mem[i] = NULL;
+
 	return (newgr);
 }
 
@@ -533,18 +541,22 @@ grmemlen(const struct group *gr, const c
 		len += strlen(gr->gr_name) + 1;
 	if (gr->gr_passwd != NULL)
 		len += strlen(gr->gr_passwd) + 1;
+	i = 0;
 	if (gr->gr_mem != NULL) {
-		for (len = i = 0; gr->gr_mem[i] != NULL; i++) {
+		for (; gr->gr_mem[i] != NULL; i++) {
 			len += strlen(gr->gr_mem[i]) + 1;
 			len += sizeof(*gr->gr_mem);
 		}
-		*num_mem = i;
 	}
 	if (name != NULL) {
+		i++;
 		len += strlen(name) + 1;
-		if (gr->gr_mem == NULL)
-			len += sizeof(*gr->gr_mem);
+		len += sizeof(*gr->gr_mem);
 	}
+	/* Allow for NULL pointer */
+	if (i != 0)
+		len += sizeof(*gr->gr_mem);
+	*num_mem = i;
 	return(len);
 }
 

Modified: user/attilio/vmc-playground/sys/dev/ichwd/ichwd.c
==============================================================================
--- user/attilio/vmc-playground/sys/dev/ichwd/ichwd.c	Sat Mar  9 15:54:20 2013	(r248107)
+++ user/attilio/vmc-playground/sys/dev/ichwd/ichwd.c	Sat Mar  9 16:11:29 2013	(r248108)
@@ -323,8 +323,6 @@ ichwd_tmr_reload(struct ichwd_softc *sc)
 		ichwd_write_tco_1(sc, TCO_RLD, 1);
 	else
 		ichwd_write_tco_2(sc, TCO_RLD, 1);
-
-	ichwd_verbose_printf(sc->device, "timer reloaded\n");
 }
 
 /*

Modified: user/attilio/vmc-playground/sys/fs/smbfs/smbfs_smb.c
==============================================================================
--- user/attilio/vmc-playground/sys/fs/smbfs/smbfs_smb.c	Sat Mar  9 15:54:20 2013	(r248107)
+++ user/attilio/vmc-playground/sys/fs/smbfs/smbfs_smb.c	Sat Mar  9 16:11:29 2013	(r248108)
@@ -1455,15 +1455,9 @@ smbfs_smb_lookup(struct smbnode *dnp, co
 		fap->fa_ino = 2;
 		return 0;
 	}
-	if (nmlen == 1 && name[0] == '.') {
-		error = smbfs_smb_lookup(dnp, NULL, 0, fap, scred);
-		return error;
-	} else if (nmlen == 2 && name[0] == '.' && name[1] == '.') {
-		error = smbfs_smb_lookup(VTOSMB(dnp->n_parent), NULL, 0, fap,
-		    scred);
-		printf("%s: knows NOTHING about '..'\n", __func__);
-		return error;
-	}
+	MPASS(!(nmlen == 2 && name[0] == '.' && name[1] == '.'));
+	MPASS(!(nmlen == 1 && name[0] == '.'));
+	ASSERT_VOP_ELOCKED(dnp->n_vnode, "smbfs_smb_lookup");
 	error = smbfs_findopen(dnp, name, nmlen,
 	    SMB_FA_SYSTEM | SMB_FA_HIDDEN | SMB_FA_DIR, scred, &ctx);
 	if (error)

Modified: user/attilio/vmc-playground/sys/fs/smbfs/smbfs_vnops.c
==============================================================================
--- user/attilio/vmc-playground/sys/fs/smbfs/smbfs_vnops.c	Sat Mar  9 15:54:20 2013	(r248107)
+++ user/attilio/vmc-playground/sys/fs/smbfs/smbfs_vnops.c	Sat Mar  9 16:11:29 2013	(r248108)
@@ -580,6 +580,7 @@ smbfs_rename(ap)
 	u_int16_t flags = 6;
 	int error=0;
 
+	scred = NULL;
 	/* Check for cross-device rename */
 	if ((fvp->v_mount != tdvp->v_mount) ||
 	    (tvp && (fvp->v_mount != tvp->v_mount))) {
@@ -730,7 +731,7 @@ smbfs_mkdir(ap)
 	*ap->a_vpp = vp;
 out:
 	smbfs_free_scred(scred);
-	return 0;
+	return error;
 }
 
 /*
@@ -1203,13 +1204,20 @@ smbfs_lookup(ap)
 	smb_makescred(scred, td, cnp->cn_cred);
 	fap = &fattr;
 	if (flags & ISDOTDOT) {
-		error = smbfs_smb_lookup(VTOSMB(dnp->n_parent), NULL, 0, fap,
-		    scred);
-		SMBVDEBUG("result of dotdot lookup: %d\n", error);
-	} else {
-		fap = &fattr;
+		/*
+		 * In the DOTDOT case, don't go over-the-wire
+		 * in order to request attributes. We already
+		 * know it's a directory and subsequent call to
+		 * smbfs_getattr() will restore consistency.
+		 *
+		 */
+		SMBVDEBUG("smbfs_smb_lookup: dotdot\n");
+	} else if (isdot) {
+		error = smbfs_smb_lookup(dnp, NULL, 0, fap, scred);
+		SMBVDEBUG("result of smbfs_smb_lookup: %d\n", error);
+	}
+	else {
 		error = smbfs_smb_lookup(dnp, name, nmlen, fap, scred);
-/*		if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.')*/
 		SMBVDEBUG("result of smbfs_smb_lookup: %d\n", error);
 	}
 	if (error && error != ENOENT)

Modified: user/attilio/vmc-playground/sys/kern/kern_umtx.c
==============================================================================
--- user/attilio/vmc-playground/sys/kern/kern_umtx.c	Sat Mar  9 15:54:20 2013	(r248107)
+++ user/attilio/vmc-playground/sys/kern/kern_umtx.c	Sat Mar  9 16:11:29 2013	(r248108)
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mutex.h>
 #include <sys/priv.h>
 #include <sys/proc.h>
+#include <sys/sbuf.h>
 #include <sys/sched.h>
 #include <sys/smp.h>
 #include <sys/sysctl.h>
@@ -64,6 +65,11 @@ __FBSDID("$FreeBSD$");
 #define _UMUTEX_TRY		1
 #define _UMUTEX_WAIT		2
 
+#ifdef UMTX_PROFILING
+#define	UPROF_PERC_BIGGER(w, f, sw, sf)					\
+	(((w) > (sw)) || ((w) == (sw) && (f) > (sf)))
+#endif
+
 /* Priority inheritance mutex info. */
 struct umtx_pi {
 	/* Owner thread */
@@ -157,8 +163,8 @@ struct umtxq_chain {
 	TAILQ_HEAD(,umtx_pi)	uc_pi_list;
 
 #ifdef UMTX_PROFILING
-	int 			length;
-	int			max_length;
+	u_int 			length;
+	u_int			max_length;
 #endif
 };
 
@@ -252,6 +258,117 @@ umtx_init_profiling(void) 
 		    "max_length1", CTLFLAG_RD, &umtxq_chains[1][i].max_length, 0, NULL);
 	}
 }
+
+static int
+sysctl_debug_umtx_chains_peaks(SYSCTL_HANDLER_ARGS)
+{
+	char buf[512];
+	struct sbuf sb;
+	struct umtxq_chain *uc;
+	u_int fract, i, j, tot, whole;
+	u_int sf0, sf1, sf2, sf3, sf4;
+	u_int si0, si1, si2, si3, si4;
+	u_int sw0, sw1, sw2, sw3, sw4;
+
+	sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
+	for (i = 0; i < 2; i++) {
+		tot = 0;
+		for (j = 0; j < UMTX_CHAINS; ++j) {
+			uc = &umtxq_chains[i][j];
+			mtx_lock(&uc->uc_lock);
+			tot += uc->max_length;
+			mtx_unlock(&uc->uc_lock);
+		}
+		if (tot == 0)
+			sbuf_printf(&sb, "%u) Empty ", i);
+		else {
+			sf0 = sf1 = sf2 = sf3 = sf4 = 0;
+			si0 = si1 = si2 = si3 = si4 = 0;
+			sw0 = sw1 = sw2 = sw3 = sw4 = 0;
+			for (j = 0; j < UMTX_CHAINS; j++) {
+				uc = &umtxq_chains[i][j];
+				mtx_lock(&uc->uc_lock);
+				whole = uc->max_length * 100;
+				mtx_unlock(&uc->uc_lock);
+				fract = (whole % tot) * 100;
+				if (UPROF_PERC_BIGGER(whole, fract, sw0, sf0)) {
+					sf0 = fract;
+					si0 = j;
+					sw0 = whole;
+				} else if (UPROF_PERC_BIGGER(whole, fract, sw1,
+				    sf1)) {
+					sf1 = fract;
+					si1 = j;
+					sw1 = whole;
+				} else if (UPROF_PERC_BIGGER(whole, fract, sw2,
+				    sf2)) {
+					sf2 = fract;
+					si2 = j;
+					sw2 = whole;
+				} else if (UPROF_PERC_BIGGER(whole, fract, sw3,
+				    sf3)) {
+					sf3 = fract;
+					si3 = j;
+					sw3 = whole;
+				} else if (UPROF_PERC_BIGGER(whole, fract, sw4,
+				    sf4)) {
+					sf4 = fract;
+					si4 = j;
+					sw4 = whole;
+				}
+			}
+			sbuf_printf(&sb, "queue %u:\n", i);
+			sbuf_printf(&sb, "1st: %u.%u%% idx: %u\n", sw0 / tot,
+			    sf0 / tot, si0);
+			sbuf_printf(&sb, "2nd: %u.%u%% idx: %u\n", sw1 / tot,
+			    sf1 / tot, si1);
+			sbuf_printf(&sb, "3rd: %u.%u%% idx: %u\n", sw2 / tot,
+			    sf2 / tot, si2);
+			sbuf_printf(&sb, "4th: %u.%u%% idx: %u\n", sw3 / tot,
+			    sf3 / tot, si3);
+			sbuf_printf(&sb, "5th: %u.%u%% idx: %u\n", sw4 / tot,
+			    sf4 / tot, si4);
+		}
+	}
+	sbuf_trim(&sb);
+	sbuf_finish(&sb);
+	sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req);
+	sbuf_delete(&sb);
+	return (0);
+}
+
+static int
+sysctl_debug_umtx_chains_clear(SYSCTL_HANDLER_ARGS)
+{
+	struct umtxq_chain *uc;
+	u_int i, j;
+	int clear, error;
+
+	clear = 0;
+	error = sysctl_handle_int(oidp, &clear, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+
+	if (clear != 0) {
+		for (i = 0; i < 2; ++i) {
+			for (j = 0; j < UMTX_CHAINS; ++j) {
+				uc = &umtxq_chains[i][j];
+				mtx_lock(&uc->uc_lock);
+				uc->length = 0;
+				uc->max_length = 0;	
+				mtx_unlock(&uc->uc_lock);
+			}
+		}
+	}
+	return (0);
+}
+
+SYSCTL_PROC(_debug_umtx_chains, OID_AUTO, clear,
+    CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, 0, 0,
+    sysctl_debug_umtx_chains_clear, "I", "Clear umtx chains statistics");
+SYSCTL_PROC(_debug_umtx_chains, OID_AUTO, peaks,
+    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 0,
+    sysctl_debug_umtx_chains_peaks, "A", "Highest peaks in chains max length");
 #endif
 
 static void

Modified: user/attilio/vmc-playground/sys/net80211/ieee80211_output.c
==============================================================================
--- user/attilio/vmc-playground/sys/net80211/ieee80211_output.c	Sat Mar  9 15:54:20 2013	(r248107)
+++ user/attilio/vmc-playground/sys/net80211/ieee80211_output.c	Sat Mar  9 16:11:29 2013	(r248108)
@@ -597,10 +597,9 @@ ieee80211_send_setup(
 	struct ieee80211vap *vap = ni->ni_vap;
 	struct ieee80211_tx_ampdu *tap;
 	struct ieee80211_frame *wh = mtod(m, struct ieee80211_frame *);
-	struct ieee80211com *ic = ni->ni_ic;
 	ieee80211_seq seqno;
 
-	IEEE80211_TX_LOCK_ASSERT(ic);
+	IEEE80211_TX_LOCK_ASSERT(ni->ni_ic);
 
 	wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | type;
 	if ((type & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) {


More information about the svn-src-user mailing list