proc: load/store p_cowgen using atomic primitives

This commit is contained in:
Mateusz Guzik 2022-02-12 19:33:34 +00:00
parent 29ee49f66b
commit b53133a778
7 changed files with 9 additions and 8 deletions

View File

@ -309,7 +309,7 @@ trap(struct trapframe *frame)
td->td_pticks = 0;
td->td_frame = frame;
addr = frame->tf_rip;
if (td->td_cowgen != p->p_cowgen)
if (td->td_cowgen != atomic_load_int(&p->p_cowgen))
thread_cow_update(td);
switch (type) {

View File

@ -418,7 +418,7 @@ abort_handler(struct trapframe *tf, int prefetch)
p = td->td_proc;
if (usermode) {
td->td_pticks = 0;
if (td->td_cowgen != p->p_cowgen)
if (td->td_cowgen != atomic_load_int(&p->p_cowgen))
thread_cow_update(td);
}

View File

@ -301,7 +301,7 @@ trap(struct trapframe *frame)
td->td_pticks = 0;
td->td_frame = frame;
addr = frame->tf_eip;
if (td->td_cowgen != p->p_cowgen)
if (td->td_cowgen != atomic_load_int(&p->p_cowgen))
thread_cow_update(td);
switch (type) {

View File

@ -68,7 +68,7 @@ syscallenter(struct thread *td)
sa = &td->td_sa;
td->td_pticks = 0;
if (__predict_false(td->td_cowgen != p->p_cowgen))
if (__predict_false(td->td_cowgen != atomic_load_int(&p->p_cowgen)))
thread_cow_update(td);
traced = (p->p_flag & P_TRACED) != 0;
if (__predict_false(traced || td->td_dbgflags & TDB_USERWR)) {

View File

@ -247,7 +247,7 @@ ast(struct trapframe *framep)
thread_unlock(td);
VM_CNT_INC(v_trap);
if (td->td_cowgen != p->p_cowgen)
if (td->td_cowgen != atomic_load_int(&p->p_cowgen))
thread_cow_update(td);
if (td->td_pflags & TDP_OWEUPC && p->p_flag & P_PROFIL) {
addupc_task(td, td->td_profil_addr, td->td_profil_ticks);

View File

@ -254,7 +254,7 @@ trap(struct trapframe *frame)
td->td_pticks = 0;
td->td_frame = frame;
addr = frame->srr0;
if (td->td_cowgen != p->p_cowgen)
if (td->td_cowgen != atomic_load_int(&p->p_cowgen))
thread_cow_update(td);
/* User Mode Traps */

View File

@ -1005,8 +1005,9 @@ extern pid_t pid_max;
} while (0)
#define PROC_UPDATE_COW(p) do { \
PROC_LOCK_ASSERT((p), MA_OWNED); \
(p)->p_cowgen++; \
struct proc *_p = (p); \
PROC_LOCK_ASSERT((_p), MA_OWNED); \
atomic_store_int(&_p->p_cowgen, _p->p_cowgen + 1); \
} while (0)
#define PROC_COW_CHANGECOUNT(td, p) ({ \