summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cddl/contrib/opensolaris')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c12
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c20
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap_impl.h4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c21
-rw-r--r--sys/cddl/contrib/opensolaris/uts/powerpc/dtrace/fasttrap_isa.c13
6 files changed, 51 insertions, 23 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index 9266ffc..ed99c4b 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -9295,6 +9295,10 @@ dtrace_helper_provide_one(dof_helper_t *dhp, dof_sec_t *sec, pid_t pid)
probe = (dof_probe_t *)(uintptr_t)(daddr +
prb_sec->dofs_offset + i * prb_sec->dofs_entsize);
+ /* See the check in dtrace_helper_provider_validate(). */
+ if (strlen(strtab + probe->dofpr_func) >= DTRACE_FUNCNAMELEN)
+ continue;
+
dhpb.dthpb_mod = dhp->dofhp_mod;
dhpb.dthpb_func = strtab + probe->dofpr_func;
dhpb.dthpb_name = strtab + probe->dofpr_name;
@@ -15805,7 +15809,13 @@ dtrace_helper_provider_validate(dof_hdr_t *dof, dof_sec_t *sec)
if (strlen(strtab + probe->dofpr_func) >= DTRACE_FUNCNAMELEN) {
dtrace_dof_error(dof, "function name too long");
- return (-1);
+ /*
+ * Keep going if the function name is too long.
+ * Unlike provider and probe names, we cannot reasonably
+ * impose restrictions on function names, since they're
+ * a property of the code being instrumented. We will
+ * skip this probe in dtrace_helper_provide_one().
+ */
}
if (probe->dofpr_name >= str_sec->dofs_size ||
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
index 84b72d2..c94a3ba 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
@@ -63,14 +63,16 @@
#ifndef illumos
#include <sys/dtrace_bsd.h>
#include <sys/eventhandler.h>
+#include <sys/rmlock.h>
#include <sys/sysctl.h>
#include <sys/u8_textprep.h>
#include <sys/user.h>
+
#include <vm/vm.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
#include <vm/vm_param.h>
-#include <sys/u8_textprep.h>
+
#include <cddl/dev/dtrace/dtrace_cddl.h>
#endif
@@ -225,7 +227,7 @@ static void fasttrap_thread_dtor(void *, struct thread *);
#define FASTTRAP_PROCS_INDEX(pid) ((pid) & fasttrap_procs.fth_mask)
#ifndef illumos
-static kmutex_t fasttrap_cpuc_pid_lock[MAXCPU];
+struct rmlock fasttrap_tp_lock;
static eventhandler_tag fasttrap_thread_dtor_tag;
#endif
@@ -440,10 +442,15 @@ fasttrap_mod_barrier(uint64_t gen)
fasttrap_mod_gen++;
+#ifdef illumos
CPU_FOREACH(i) {
mutex_enter(&fasttrap_cpuc_pid_lock[i]);
mutex_exit(&fasttrap_cpuc_pid_lock[i]);
}
+#else
+ rm_wlock(&fasttrap_tp_lock);
+ rm_wunlock(&fasttrap_tp_lock);
+#endif
}
/*
@@ -2565,10 +2572,7 @@ fasttrap_load(void)
mutex_init(&fasttrap_procs.fth_table[i].ftb_mtx,
"processes bucket mtx", MUTEX_DEFAULT, NULL);
- CPU_FOREACH(i) {
- mutex_init(&fasttrap_cpuc_pid_lock[i], "fasttrap barrier",
- MUTEX_DEFAULT, NULL);
- }
+ rm_init(&fasttrap_tp_lock, "fasttrap tracepoint");
/*
* This event handler must run before kdtrace_thread_dtor() since it
@@ -2701,9 +2705,7 @@ fasttrap_unload(void)
#ifndef illumos
destroy_dev(fasttrap_cdev);
mutex_destroy(&fasttrap_count_mtx);
- CPU_FOREACH(i) {
- mutex_destroy(&fasttrap_cpuc_pid_lock[i]);
- }
+ rm_destroy(&fasttrap_tp_lock);
#endif
return (0);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
index f135af70..b089ce1 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
@@ -133,11 +133,13 @@ SYSCTL_INT(_vfs_zfs, OID_AUTO, sync_pass_rewrite, CTLFLAG_RDTUN,
boolean_t zio_requeue_io_start_cut_in_line = B_TRUE;
+#ifdef illumos
#ifdef ZFS_DEBUG
int zio_buf_debug_limit = 16384;
#else
int zio_buf_debug_limit = 0;
#endif
+#endif
void
zio_init(void)
@@ -159,7 +161,7 @@ zio_init(void)
size_t size = (c + 1) << SPA_MINBLOCKSHIFT;
size_t p2 = size;
size_t align = 0;
- size_t cflags = (size > zio_buf_debug_limit) ? KMC_NODEBUG : 0;
+ int cflags = zio_exclude_metadata ? KMC_NODEBUG : 0;
while (!ISP2(p2))
p2 &= p2 - 1;
diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap_impl.h b/sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap_impl.h
index cae9193..c104e79 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap_impl.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap_impl.h
@@ -206,6 +206,10 @@ extern fasttrap_scrspace_t *fasttrap_scraddr(struct thread *,
extern dtrace_id_t fasttrap_probe_id;
extern fasttrap_hash_t fasttrap_tpoints;
+#ifndef illumos
+extern struct rmlock fasttrap_tp_lock;
+#endif
+
#define FASTTRAP_TPOINTS_INDEX(pid, pc) \
(((pc) / sizeof (fasttrap_instr_t) + (pid)) & fasttrap_tpoints.fth_mask)
diff --git a/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c b/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
index 5d60a07..cd7c9c1 100644
--- a/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
+++ b/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
@@ -46,6 +46,7 @@
#include <cddl/dev/dtrace/dtrace_cddl.h>
#include <sys/types.h>
#include <sys/proc.h>
+#include <sys/rmlock.h>
#include <sys/dtrace_bsd.h>
#include <cddl/dev/dtrace/x86/regset.h>
#include <machine/segments.h>
@@ -749,11 +750,13 @@ fasttrap_return_common(struct reg *rp, uintptr_t pc, pid_t pid,
fasttrap_id_t *id;
#ifdef illumos
kmutex_t *pid_mtx;
-#endif
-#ifdef illumos
pid_mtx = &cpu_core[CPU->cpu_id].cpuc_pid_lock;
mutex_enter(pid_mtx);
+#else
+ struct rm_priotracker tracker;
+
+ rm_rlock(&fasttrap_tp_lock, &tracker);
#endif
bucket = &fasttrap_tpoints.fth_table[FASTTRAP_TPOINTS_INDEX(pid, pc)];
@@ -771,6 +774,8 @@ fasttrap_return_common(struct reg *rp, uintptr_t pc, pid_t pid,
if (tp == NULL) {
#ifdef illumos
mutex_exit(pid_mtx);
+#else
+ rm_runlock(&fasttrap_tp_lock, &tracker);
#endif
return;
}
@@ -794,6 +799,8 @@ fasttrap_return_common(struct reg *rp, uintptr_t pc, pid_t pid,
#ifdef illumos
mutex_exit(pid_mtx);
+#else
+ rm_runlock(&fasttrap_tp_lock, &tracker);
#endif
}
@@ -1002,6 +1009,7 @@ fasttrap_pid_probe(struct reg *rp)
{
proc_t *p = curproc;
#ifndef illumos
+ struct rm_priotracker tracker;
proc_t *pp;
#endif
uintptr_t pc = rp->r_rip - 1;
@@ -1061,8 +1069,7 @@ fasttrap_pid_probe(struct reg *rp)
sx_sunlock(&proctree_lock);
pp = NULL;
- PROC_LOCK(p);
- _PHOLD(p);
+ rm_rlock(&fasttrap_tp_lock, &tracker);
#endif
bucket = &fasttrap_tpoints.fth_table[FASTTRAP_TPOINTS_INDEX(pid, pc)];
@@ -1085,8 +1092,7 @@ fasttrap_pid_probe(struct reg *rp)
#ifdef illumos
mutex_exit(pid_mtx);
#else
- _PRELE(p);
- PROC_UNLOCK(p);
+ rm_runlock(&fasttrap_tp_lock, &tracker);
#endif
return (-1);
}
@@ -1212,7 +1218,7 @@ fasttrap_pid_probe(struct reg *rp)
#ifdef illumos
mutex_exit(pid_mtx);
#else
- PROC_UNLOCK(p);
+ rm_runlock(&fasttrap_tp_lock, &tracker);
#endif
tp = &tp_local;
@@ -1825,7 +1831,6 @@ done:
#ifndef illumos
PROC_LOCK(p);
proc_write_regs(curthread, rp);
- _PRELE(p);
PROC_UNLOCK(p);
#endif
diff --git a/sys/cddl/contrib/opensolaris/uts/powerpc/dtrace/fasttrap_isa.c b/sys/cddl/contrib/opensolaris/uts/powerpc/dtrace/fasttrap_isa.c
index f076f5d..3b19cc7 100644
--- a/sys/cddl/contrib/opensolaris/uts/powerpc/dtrace/fasttrap_isa.c
+++ b/sys/cddl/contrib/opensolaris/uts/powerpc/dtrace/fasttrap_isa.c
@@ -33,6 +33,7 @@
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/ptrace.h>
+#include <sys/rmlock.h>
#include <sys/sysent.h>
#define OP(x) ((x) >> 26)
@@ -302,10 +303,12 @@ static void
fasttrap_return_common(struct reg *rp, uintptr_t pc, pid_t pid,
uintptr_t new_pc)
{
+ struct rm_priotracker tracker;
fasttrap_tracepoint_t *tp;
fasttrap_bucket_t *bucket;
fasttrap_id_t *id;
+ rm_rlock(&fasttrap_tp_lock, &tracker);
bucket = &fasttrap_tpoints.fth_table[FASTTRAP_TPOINTS_INDEX(pid, pc)];
for (tp = bucket->ftb_data; tp != NULL; tp = tp->ftt_next) {
@@ -320,6 +323,7 @@ fasttrap_return_common(struct reg *rp, uintptr_t pc, pid_t pid,
* is not essential to the correct execution of the process.
*/
if (tp == NULL) {
+ rm_runlock(&fasttrap_tp_lock, &tracker);
return;
}
@@ -337,6 +341,7 @@ fasttrap_return_common(struct reg *rp, uintptr_t pc, pid_t pid,
pc - id->fti_probe->ftp_faddr,
rp->fixreg[3], rp->fixreg[4], 0, 0);
}
+ rm_runlock(&fasttrap_tp_lock, &tracker);
}
@@ -365,6 +370,7 @@ fasttrap_branch_taken(int bo, int bi, struct reg *regs)
int
fasttrap_pid_probe(struct reg *rp)
{
+ struct rm_priotracker tracker;
proc_t *p = curproc;
uintptr_t pc = rp->pc;
uintptr_t new_pc = 0;
@@ -395,8 +401,7 @@ fasttrap_pid_probe(struct reg *rp)
curthread->t_dtrace_scrpc = 0;
curthread->t_dtrace_astpc = 0;
-
- PROC_LOCK(p);
+ rm_rlock(&fasttrap_tp_lock, &tracker);
pid = p->p_pid;
bucket = &fasttrap_tpoints.fth_table[FASTTRAP_TPOINTS_INDEX(pid, pc)];
@@ -415,7 +420,7 @@ fasttrap_pid_probe(struct reg *rp)
* fasttrap_ioctl), or somehow we have mislaid this tracepoint.
*/
if (tp == NULL) {
- PROC_UNLOCK(p);
+ rm_runlock(&fasttrap_tp_lock, &tracker);
return (-1);
}
@@ -469,7 +474,7 @@ fasttrap_pid_probe(struct reg *rp)
* tracepoint again later if we need to light up any return probes.
*/
tp_local = *tp;
- PROC_UNLOCK(p);
+ rm_runlock(&fasttrap_tp_lock, &tracker);
tp = &tp_local;
/*
OpenPOWER on IntegriCloud