diff options
author | adrian <adrian@FreeBSD.org> | 2014-10-18 19:36:11 +0000 |
---|---|---|
committer | adrian <adrian@FreeBSD.org> | 2014-10-18 19:36:11 +0000 |
commit | 9b44fe556be01b7365289ce03c873448f9158644 (patch) | |
tree | 001cb1730d8c530fa2dede702f8a9a45fb21aef9 | |
parent | 073b7e1f4d4771f686e7f67b7d18d1b9fc02cdb8 (diff) | |
download | FreeBSD-src-9b44fe556be01b7365289ce03c873448f9158644.zip FreeBSD-src-9b44fe556be01b7365289ce03c873448f9158644.tar.gz |
Update the ULE scheduler + thread and kinfo structs to use int for cpuid
rather than u_char.
To try and play nice with the ABI, the u_char CPU ID values are clamped
at 254. The new fields now contain the full CPU ID, or -1 for no cpu.
Differential Revision: D955
Reviewed by: jhb, kib
Sponsored by: Norse Corp, Inc.
-rw-r--r-- | lib/libkvm/kvm_proc.c | 18 | ||||
-rw-r--r-- | sys/compat/freebsd32/freebsd32.h | 6 | ||||
-rw-r--r-- | sys/kern/kern_proc.c | 24 | ||||
-rw-r--r-- | sys/kern/sched_ule.c | 2 | ||||
-rw-r--r-- | sys/sys/proc.h | 8 | ||||
-rw-r--r-- | sys/sys/user.h | 8 |
6 files changed, 57 insertions, 9 deletions
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c index 31258d7..aed61a8 100644 --- a/lib/libkvm/kvm_proc.c +++ b/lib/libkvm/kvm_proc.c @@ -431,6 +431,24 @@ nopgrp: strlcpy(kp->ki_tdname, mtd.td_name, sizeof(kp->ki_tdname)); kp->ki_pctcpu = 0; kp->ki_rqindex = 0; + + /* + * Note: legacy fields; wraps at NO_CPU_OLD or the + * old max CPU value as appropriate + */ + if (mtd.td_lastcpu == NOCPU) + kp->ki_lastcpu_old = NOCPU_OLD; + else if (mtd.td_lastcpu > MAXCPU_OLD) + kp->ki_lastcpu_old = MAXCPU_OLD; + else + kp->ki_lastcpu_old = mtd.td_lastcpu; + + if (mtd.td_oncpu == NOCPU) + kp->ki_oncpu_old = NOCPU_OLD; + else if (mtd.td_oncpu > MAXCPU_OLD) + kp->ki_oncpu_old = MAXCPU_OLD; + else + kp->ki_oncpu_old = mtd.td_oncpu; } else { kp->ki_stat = SZOMB; } diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h index 155612b..af10055 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -332,8 +332,8 @@ struct kinfo_proc32 { signed char ki_nice; char ki_lock; char ki_rqindex; - u_char ki_oncpu; - u_char ki_lastcpu; + u_char ki_oncpu_old; + u_char ki_lastcpu_old; char ki_tdname[TDNAMLEN+1]; char ki_wmesg[WMESGLEN+1]; char ki_login[LOGNAMELEN+1]; @@ -343,6 +343,8 @@ struct kinfo_proc32 { char ki_loginclass[LOGINCLASSLEN+1]; char ki_sparestrings[50]; int ki_spareints[KI_NSPARE_INT]; + int ki_oncpu; + int ki_lastcpu; int ki_tracer; int ki_flag2; int ki_fibnum; diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 41cd304..495139f 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -984,6 +984,25 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) kp->ki_wchan = td->td_wchan; kp->ki_pri.pri_level = td->td_priority; kp->ki_pri.pri_native = td->td_base_pri; + + /* + * Note: legacy fields; clamp at the old NOCPU value and/or + * the maximum u_char CPU value. + */ + if (td->td_lastcpu == NOCPU) + kp->ki_lastcpu_old = NOCPU_OLD; + else if (td->td_lastcpu > MAXCPU_OLD) + kp->ki_lastcpu_old = MAXCPU_OLD; + else + kp->ki_lastcpu_old = td->td_lastcpu; + + if (td->td_oncpu == NOCPU) + kp->ki_oncpu_old = NOCPU_OLD; + else if (td->td_oncpu > MAXCPU_OLD) + kp->ki_oncpu_old = MAXCPU_OLD; + else + kp->ki_oncpu_old = td->td_oncpu; + kp->ki_lastcpu = td->td_lastcpu; kp->ki_oncpu = td->td_oncpu; kp->ki_tdflags = td->td_flags; @@ -1164,6 +1183,11 @@ freebsd32_kinfo_proc_out(const struct kinfo_proc *ki, struct kinfo_proc32 *ki32) CP(*ki, *ki32, ki_rqindex); CP(*ki, *ki32, ki_oncpu); CP(*ki, *ki32, ki_lastcpu); + + /* XXX TODO: wrap cpu value as appropriate */ + CP(*ki, *ki32, ki_oncpu_old); + CP(*ki, *ki32, ki_lastcpu_old); + bcopy(ki->ki_tdname, ki32->ki_tdname, TDNAMLEN + 1); bcopy(ki->ki_wmesg, ki32->ki_wmesg, WMESGLEN + 1); bcopy(ki->ki_login, ki32->ki_login, LOGNAMELEN + 1); diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index 473e334..0e98fc8 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -90,7 +90,7 @@ dtrace_vtime_switch_func_t dtrace_vtime_switch_func; struct td_sched { struct runq *ts_runq; /* Run-queue we're queued on. */ short ts_flags; /* TSF_* flags. */ - u_char ts_cpu; /* CPU that we have affinity for. */ + int ts_cpu; /* CPU that we have affinity for. */ int ts_rltick; /* Real last tick, for affinity. */ int ts_slice; /* Ticks of slice remaining. */ u_int ts_slptime; /* Number of ticks we vol. slept */ diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 72b2a9f..fac0915 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -229,8 +229,8 @@ struct thread { int td_sqqueue; /* (t) Sleepqueue queue blocked on. */ void *td_wchan; /* (t) Sleep address. */ const char *td_wmesg; /* (t) Reason for sleep. */ - u_char td_lastcpu; /* (t) Last cpu we were on. */ - u_char td_oncpu; /* (t) Which cpu we are on. */ + int td_lastcpu; /* (t) Last cpu we were on. */ + int td_oncpu; /* (t) Which cpu we are on. */ volatile u_char td_owepreempt; /* (k*) Preempt on last critical_exit */ u_char td_tsqueue; /* (t) Turnstile queue blocked on. */ short td_locks; /* (k) Count of non-spin locks. */ @@ -601,7 +601,9 @@ struct proc { #define p_session p_pgrp->pg_session #define p_pgid p_pgrp->pg_id -#define NOCPU 0xff /* For when we aren't on a CPU. */ +#define NOCPU (-1) /* For when we aren't on a CPU. */ +#define NOCPU_OLD (255) +#define MAXCPU_OLD (254) #define PROC_SLOCK(p) mtx_lock_spin(&(p)->p_slock) #define PROC_SUNLOCK(p) mtx_unlock_spin(&(p)->p_slock) diff --git a/sys/sys/user.h b/sys/sys/user.h index 6775ff7..f0d059e 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -84,7 +84,7 @@ * it in two places: function fill_kinfo_proc in sys/kern/kern_proc.c and * function kvm_proclist in lib/libkvm/kvm_proc.c . */ -#define KI_NSPARE_INT 6 +#define KI_NSPARE_INT 4 #define KI_NSPARE_LONG 12 #define KI_NSPARE_PTR 6 @@ -171,8 +171,8 @@ struct kinfo_proc { signed char ki_nice; /* Process "nice" value */ char ki_lock; /* Process lock (prevent swap) count */ char ki_rqindex; /* Run queue index */ - u_char ki_oncpu; /* Which cpu we are on */ - u_char ki_lastcpu; /* Last cpu we were on */ + u_char ki_oncpu_old; /* Which cpu we are on (legacy) */ + u_char ki_lastcpu_old; /* Last cpu we were on (legacy) */ char ki_tdname[TDNAMLEN+1]; /* thread name */ char ki_wmesg[WMESGLEN+1]; /* wchan message */ char ki_login[LOGNAMELEN+1]; /* setlogin name */ @@ -187,6 +187,8 @@ struct kinfo_proc { */ char ki_sparestrings[50]; /* spare string space */ int ki_spareints[KI_NSPARE_INT]; /* spare room for growth */ + int ki_oncpu; /* Which cpu we are on */ + int ki_lastcpu; /* Last cpu we were on */ int ki_tracer; /* Pid of tracing process */ int ki_flag2; /* P2_* flags */ int ki_fibnum; /* Default FIB number */ |