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