Re: SCHED_LOCK vs 'struct proc'

2019-05-11 Thread Ian Sutton
On Sat, May 11, 2019 at 07:23:42PM -0400, Martin Pieuchot wrote:
> Document which fields are protected by the SCHED_LOCK(), ok?
> 
> Index: sys/proc.h
> ===
> RCS file: /cvs/src/sys/sys/proc.h,v
> retrieving revision 1.263
> diff -u -p -r1.263 proc.h
> --- sys/proc.h6 Jan 2019 12:59:45 -   1.263
> +++ sys/proc.h11 May 2019 23:21:57 -
> @@ -297,8 +297,12 @@ struct process {
>  struct kcov_dev;
>  struct lock_list_entry;
>  
> +/*
> + *  Locks used to protect struct members in this file:
> + *   s   scheduler lock
> + */
>  struct proc {
> - TAILQ_ENTRY(proc) p_runq;
> + TAILQ_ENTRY(proc) p_runq;   /* [s] current run/sleep queue */
>   LIST_ENTRY(proc) p_list;/* List of all threads. */
>  
>   struct  process *p_p;   /* The process of this thread. */
> @@ -314,7 +318,7 @@ struct proc {
>  
>   int p_flag; /* P_* flags. */
>   u_char  p_spare;/* unused */
> - charp_stat; /* S* process status. */
> + charp_stat; /* [s] S* process status. */
>   charp_pad1[1];
>   u_char  p_descfd;   /* if not 255, fdesc permits this fd */
>  
> @@ -328,17 +332,17 @@ struct proc {
>   longp_thrslpid; /* for thrsleep syscall */
>  
>   /* scheduling */
> - u_int   p_estcpu;/* Time averaged value of p_cpticks. */
> + u_int   p_estcpu;   /* [s] Time averaged val of p_cpticks */
>   int p_cpticks;   /* Ticks of cpu time. */
> - const volatile void *p_wchan;/* Sleep address. */
> + const volatile void *p_wchan;   /* [s] Sleep address. */
>   struct  timeout p_sleep_to;/* timeout for tsleep() */
> - const char *p_wmesg; /* Reason for sleep. */
> - fixpt_t p_pctcpu;/* %cpu for this thread */
> - u_int   p_slptime;   /* Time since last blocked. */
> + const char *p_wmesg;/* [s] Reason for sleep. */
> + fixpt_t p_pctcpu;   /* [s] %cpu for this thread */
> + u_int   p_slptime;  /* [s] Time since last blocked. */
>   u_int   p_uticks;   /* Statclock hits in user mode. */
>   u_int   p_sticks;   /* Statclock hits in system mode. */
>   u_int   p_iticks;   /* Statclock hits processing intr. */
> - struct  cpu_info * volatile p_cpu; /* CPU we're running on. */
> + struct  cpu_info * volatile p_cpu; /* [s] CPU we're running on. */
>  
>   struct  rusage p_ru;/* Statistics */
>   struct  tusage p_tu;/* accumulated times. */
> @@ -357,8 +361,8 @@ struct proc {
>   vaddr_t  p_spstart;
>   vaddr_t  p_spend;
>  
> - u_char  p_priority; /* Process priority. */
> - u_char  p_usrpri;   /* User-priority based on p_estcpu and ps_nice. 
> */
> + u_char  p_priority; /* [s] Process priority. */
> + u_char  p_usrpri;   /* [s] User-prio based on p_estcpu & ps_nice. */
>   int p_pledge_syscall;   /* Cache of current syscall */
>  
>   struct  ucred *p_ucred; /* cached credentials */
>

I've checked the [s]-marked members, this is correct from my point of
view

ok ians@



Re: SCHED_LOCK vs 'struct proc'

2019-05-11 Thread Amit Kulkarni
On Sat, May 11, 2019 at 6:29 PM Martin Pieuchot  wrote:
>
> Document which fields are protected by the SCHED_LOCK(), ok?
>
> Index: sys/proc.h
> ===
> RCS file: /cvs/src/sys/sys/proc.h,v
> retrieving revision 1.263
> diff -u -p -r1.263 proc.h
> --- sys/proc.h  6 Jan 2019 12:59:45 -   1.263
> +++ sys/proc.h  11 May 2019 23:21:57 -
> @@ -297,8 +297,12 @@ struct process {
>  struct kcov_dev;
>  struct lock_list_entry;
>
> +/*
> + *  Locks used to protect struct members in this file:
> + * s   scheduler lock
> + */
>  struct proc {
> -   TAILQ_ENTRY(proc) p_runq;
> +   TAILQ_ENTRY(proc) p_runq;   /* [s] current run/sleep queue */
> LIST_ENTRY(proc) p_list;/* List of all threads. */
>
> struct  process *p_p;   /* The process of this thread. */
> @@ -314,7 +318,7 @@ struct proc {
>
> int p_flag; /* P_* flags. */
> u_char  p_spare;/* unused */
> -   charp_stat; /* S* process status. */
> +   charp_stat; /* [s] S* process status. */
> charp_pad1[1];
> u_char  p_descfd;   /* if not 255, fdesc permits this fd 
> */
>
> @@ -328,17 +332,17 @@ struct proc {
> longp_thrslpid; /* for thrsleep syscall */
>
> /* scheduling */
> -   u_int   p_estcpu;/* Time averaged value of p_cpticks. */
> +   u_int   p_estcpu;   /* [s] Time averaged val of p_cpticks 
> */
> int p_cpticks;   /* Ticks of cpu time. */
> -   const volatile void *p_wchan;/* Sleep address. */
> +   const volatile void *p_wchan;   /* [s] Sleep address. */
> struct  timeout p_sleep_to;/* timeout for tsleep() */
> -   const char *p_wmesg; /* Reason for sleep. */
> -   fixpt_t p_pctcpu;/* %cpu for this thread */
> -   u_int   p_slptime;   /* Time since last blocked. */
> +   const char *p_wmesg;/* [s] Reason for sleep. */
> +   fixpt_t p_pctcpu;   /* [s] %cpu for this thread */
> +   u_int   p_slptime;  /* [s] Time since last blocked. */

Thanks for this diff, it is pretty useful for anyone reading SCHED_LOCK'd code.

Can you please modify description for p_slptime?
 /* [s] Time since last run (in secs). */

as p_slptime is reset to 0 in setrunnable() in sched_bsd.

> u_int   p_uticks;   /* Statclock hits in user mode. */
> u_int   p_sticks;   /* Statclock hits in system mode. */
> u_int   p_iticks;   /* Statclock hits processing intr. */
> -   struct  cpu_info * volatile p_cpu; /* CPU we're running on. */
> +   struct  cpu_info * volatile p_cpu; /* [s] CPU we're running on. */
>
> struct  rusage p_ru;/* Statistics */
> struct  tusage p_tu;/* accumulated times. */
> @@ -357,8 +361,8 @@ struct proc {
> vaddr_t  p_spstart;
> vaddr_t  p_spend;
>
> -   u_char  p_priority; /* Process priority. */
> -   u_char  p_usrpri;   /* User-priority based on p_estcpu and 
> ps_nice. */
> +   u_char  p_priority; /* [s] Process priority. */
> +   u_char  p_usrpri;   /* [s] User-prio based on p_estcpu & ps_nice. 
> */
> int p_pledge_syscall;   /* Cache of current syscall */
>
> struct  ucred *p_ucred; /* cached credentials */
>



SCHED_LOCK vs 'struct proc'

2019-05-11 Thread Martin Pieuchot
Document which fields are protected by the SCHED_LOCK(), ok?

Index: sys/proc.h
===
RCS file: /cvs/src/sys/sys/proc.h,v
retrieving revision 1.263
diff -u -p -r1.263 proc.h
--- sys/proc.h  6 Jan 2019 12:59:45 -   1.263
+++ sys/proc.h  11 May 2019 23:21:57 -
@@ -297,8 +297,12 @@ struct process {
 struct kcov_dev;
 struct lock_list_entry;
 
+/*
+ *  Locks used to protect struct members in this file:
+ * s   scheduler lock
+ */
 struct proc {
-   TAILQ_ENTRY(proc) p_runq;
+   TAILQ_ENTRY(proc) p_runq;   /* [s] current run/sleep queue */
LIST_ENTRY(proc) p_list;/* List of all threads. */
 
struct  process *p_p;   /* The process of this thread. */
@@ -314,7 +318,7 @@ struct proc {
 
int p_flag; /* P_* flags. */
u_char  p_spare;/* unused */
-   charp_stat; /* S* process status. */
+   charp_stat; /* [s] S* process status. */
charp_pad1[1];
u_char  p_descfd;   /* if not 255, fdesc permits this fd */
 
@@ -328,17 +332,17 @@ struct proc {
longp_thrslpid; /* for thrsleep syscall */
 
/* scheduling */
-   u_int   p_estcpu;/* Time averaged value of p_cpticks. */
+   u_int   p_estcpu;   /* [s] Time averaged val of p_cpticks */
int p_cpticks;   /* Ticks of cpu time. */
-   const volatile void *p_wchan;/* Sleep address. */
+   const volatile void *p_wchan;   /* [s] Sleep address. */
struct  timeout p_sleep_to;/* timeout for tsleep() */
-   const char *p_wmesg; /* Reason for sleep. */
-   fixpt_t p_pctcpu;/* %cpu for this thread */
-   u_int   p_slptime;   /* Time since last blocked. */
+   const char *p_wmesg;/* [s] Reason for sleep. */
+   fixpt_t p_pctcpu;   /* [s] %cpu for this thread */
+   u_int   p_slptime;  /* [s] Time since last blocked. */
u_int   p_uticks;   /* Statclock hits in user mode. */
u_int   p_sticks;   /* Statclock hits in system mode. */
u_int   p_iticks;   /* Statclock hits processing intr. */
-   struct  cpu_info * volatile p_cpu; /* CPU we're running on. */
+   struct  cpu_info * volatile p_cpu; /* [s] CPU we're running on. */
 
struct  rusage p_ru;/* Statistics */
struct  tusage p_tu;/* accumulated times. */
@@ -357,8 +361,8 @@ struct proc {
vaddr_t  p_spstart;
vaddr_t  p_spend;
 
-   u_char  p_priority; /* Process priority. */
-   u_char  p_usrpri;   /* User-priority based on p_estcpu and ps_nice. 
*/
+   u_char  p_priority; /* [s] Process priority. */
+   u_char  p_usrpri;   /* [s] User-prio based on p_estcpu & ps_nice. */
int p_pledge_syscall;   /* Cache of current syscall */
 
struct  ucred *p_ucred; /* cached credentials */