Page MenuHomeFreeBSD

D44891.diff
No OneTemporary

D44891.diff

diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -40,7 +40,6 @@
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/asan.h>
#include <sys/bitstring.h>
#include <sys/sysproto.h>
#include <sys/eventhandler.h>
@@ -1019,19 +1018,9 @@
}
proc_linkup(newproc, td2);
} else {
- kmsan_thread_alloc(td2);
- if (td2->td_kstack == 0 || td2->td_kstack_pages != pages) {
- if (td2->td_kstack != 0)
- vm_thread_dispose(td2);
- if (!thread_alloc_stack(td2, pages)) {
- error = ENOMEM;
- goto fail2;
- }
- } else {
- kasan_mark((void *)td2->td_kstack,
- ptoa(td2->td_kstack_pages),
- ptoa(td2->td_kstack_pages), 0);
- }
+ error = thread_recycle(td2, pages);
+ if (error != 0)
+ goto fail2;
}
if ((flags & RFMEM) == 0) {
diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -798,6 +798,7 @@
}
td->td_tid = tid;
bzero(&td->td_sa.args, sizeof(td->td_sa.args));
+ kasan_thread_alloc(td);
kmsan_thread_alloc(td);
cpu_thread_alloc(td);
EVENTHANDLER_DIRECT_INVOKE(thread_ctor, td);
@@ -805,15 +806,18 @@
}
int
-thread_alloc_stack(struct thread *td, int pages)
+thread_recycle(struct thread *td, int pages)
{
-
- KASSERT(td->td_kstack == 0,
- ("thread_alloc_stack called on a thread with kstack"));
- if (!vm_thread_new(td, pages))
- return (0);
- cpu_thread_alloc(td);
- return (1);
+ if (td->td_kstack == 0 || td->td_kstack_pages != pages) {
+ if (td->td_kstack != 0)
+ vm_thread_dispose(td);
+ if (!vm_thread_new(td, pages))
+ return (ENOMEM);
+ cpu_thread_alloc(td);
+ }
+ kasan_thread_alloc(td);
+ kmsan_thread_alloc(td);
+ return (0);
}
/*
diff --git a/sys/kern/subr_asan.c b/sys/kern/subr_asan.c
--- a/sys/kern/subr_asan.c
+++ b/sys/kern/subr_asan.c
@@ -39,6 +39,7 @@
#include <sys/systm.h>
#include <sys/asan.h>
#include <sys/kernel.h>
+#include <sys/proc.h>
#include <sys/stack.h>
#include <sys/sysctl.h>
@@ -294,6 +295,15 @@
}
}
+void
+kasan_thread_alloc(struct thread *td)
+{
+ if (td->td_kstack != 0) {
+ kasan_mark((void *)td->td_kstack, ptoa(td->td_kstack_pages),
+ ptoa(td->td_kstack_pages), 0);
+ }
+}
+
/* -------------------------------------------------------------------------- */
#define ADDR_CROSSES_SCALE_BOUNDARY(addr, size) \
diff --git a/sys/sys/asan.h b/sys/sys/asan.h
--- a/sys/sys/asan.h
+++ b/sys/sys/asan.h
@@ -53,14 +53,18 @@
#define KASAN_KSTACK_FREED 0xFE
#define KASAN_EXEC_ARGS_FREED 0xFF
+struct thread;
+
void kasan_init(void);
void kasan_init_early(vm_offset_t, size_t);
void kasan_shadow_map(vm_offset_t, size_t);
void kasan_mark(const void *, size_t, size_t, uint8_t);
+void kasan_thread_alloc(struct thread *);
#else /* KASAN */
#define kasan_init()
#define kasan_shadow_map(a, s)
#define kasan_mark(p, s, l, c)
+#define kasan_thread_alloc(t)
#endif /* !KASAN */
#endif /* !_SYS_ASAN_H_ */
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -1262,7 +1262,6 @@
void cpu_thread_swapin(struct thread *);
void cpu_thread_swapout(struct thread *);
struct thread *thread_alloc(int pages);
-int thread_alloc_stack(struct thread *, int pages);
int thread_check_susp(struct thread *td, bool sleep);
void thread_cow_get_proc(struct thread *newtd, struct proc *p);
void thread_cow_get(struct thread *newtd, struct thread *td);
@@ -1275,6 +1274,7 @@
void thread_free(struct thread *td);
void thread_link(struct thread *td, struct proc *p);
void thread_reap_barrier(void);
+int thread_recycle(struct thread *, int pages);
int thread_single(struct proc *p, int how);
void thread_single_end(struct proc *p, int how);
void thread_stash(struct thread *td);
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c
--- a/sys/vm/vm_glue.c
+++ b/sys/vm/vm_glue.c
@@ -543,8 +543,6 @@
td->td_kstack = ks;
td->td_kstack_pages = pages;
td->td_kstack_domain = ks_domain;
- kasan_mark((void *)ks, ptoa(pages), ptoa(pages), 0);
- kmsan_mark((void *)ks, ptoa(pages), KMSAN_STATE_UNINIT);
return (1);
}
@@ -562,11 +560,12 @@
td->td_kstack = 0;
td->td_kstack_pages = 0;
td->td_kstack_domain = MAXMEMDOM;
- kasan_mark((void *)ks, 0, ptoa(pages), KASAN_KSTACK_FREED);
- if (pages == kstack_pages)
+ if (pages == kstack_pages) {
+ kasan_mark((void *)ks, 0, ptoa(pages), KASAN_KSTACK_FREED);
uma_zfree(kstack_cache, (void *)ks);
- else
+ } else {
vm_thread_stack_dispose(ks, pages);
+ }
}
/*

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 24, 4:35 AM (6 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16076729
Default Alt Text
D44891.diff (4 KB)

Event Timeline