Download raw body.
ktrace vs KERNEL_LOCK
Diff below is extract from my previous VFS syscalls unlocking diff. It
ensures the KERNEL_LOCK() is taken around all ktrwrite{,2}() calls.
This should be enough to unlock remaining syscalls without having to
care about ktrace bits.
ok?
Index: kern/kern_ktrace.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_ktrace.c,v
diff -u -p -r1.114 kern_ktrace.c
--- kern/kern_ktrace.c 15 Dec 2023 15:12:08 -0000 1.114
+++ kern/kern_ktrace.c 24 Dec 2024 11:14:56 -0000
@@ -179,7 +179,9 @@ ktrsyscall(struct proc *p, register_t co
*argp++ = args[i];
if (nargs && copyin((void *)args[0], argp, nargs * sizeof(int)))
memset(argp, 0, nargs * sizeof(int));
+ KERNEL_LOCK();
ktrwrite(p, &kth, ktp, len);
+ KERNEL_UNLOCK();
free(ktp, M_TEMP, len);
atomic_clearbits_int(&p->p_flag, P_INKTR);
}
@@ -203,7 +205,9 @@ ktrsysret(struct proc *p, register_t cod
len = sizeof(long long);
else
len = sizeof(register_t);
+ KERNEL_LOCK();
ktrwrite2(p, &kth, &ktp, sizeof(ktp), retval, len);
+ KERNEL_UNLOCK();
atomic_clearbits_int(&p->p_flag, P_INKTR);
}
@@ -214,7 +218,9 @@ ktrnamei(struct proc *p, char *path)
atomic_setbits_int(&p->p_flag, P_INKTR);
ktrinitheader(&kth, p, KTR_NAMEI);
+ KERNEL_LOCK();
ktrwrite(p, &kth, path, strlen(path));
+ KERNEL_UNLOCK();
atomic_clearbits_int(&p->p_flag, P_INKTR);
}
@@ -351,7 +357,7 @@ void
ktrexec(struct proc *p, int type, const char *data, ssize_t len)
{
struct ktr_header kth;
- int count;
+ int count, error;
int buflen;
assert(type == KTR_EXECARGS || type == KTR_EXECENV);
@@ -373,7 +379,10 @@ ktrexec(struct proc *p, int type, const
sched_pause(preempt);
count = lmin(len, buflen);
- if (ktrwrite(p, &kth, data, count) != 0)
+ KERNEL_LOCK();
+ error = ktrwrite(p, &kth, data, count);
+ KERNEL_UNLOCK();
+ if (error != 0)
break;
len -= count;
Index: sys//syscall_mi.h
===================================================================
RCS file: /cvs/src/sys/sys/syscall_mi.h,v
diff -u -p -r1.36 syscall_mi.h
--- sys//syscall_mi.h 29 Oct 2024 12:40:17 -0000 1.36
+++ sys//syscall_mi.h 24 Dec 2024 11:13:18 -0000
@@ -151,9 +151,7 @@ mi_syscall(struct proc *p, register_t co
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSCALL)) {
/* convert to mask, then include with code */
- KERNEL_LOCK();
ktrsyscall(p, code, callp->sy_argsize, argp);
- KERNEL_UNLOCK();
}
#endif
@@ -203,9 +201,7 @@ mi_syscall_return(struct proc *p, regist
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSRET)) {
- KERNEL_LOCK();
ktrsysret(p, code, error, retval);
- KERNEL_UNLOCK();
}
#endif
}
@@ -238,9 +234,7 @@ mi_child_return(struct proc *p)
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSRET)) {
- KERNEL_LOCK();
ktrsysret(p, code, 0, child_retval);
- KERNEL_UNLOCK();
}
#endif
}
ktrace vs KERNEL_LOCK