[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH gnumach] Update task_basic_info and thread_basic_info to incl
From: |
Samuel Thibault |
Subject: |
Re: [PATCH gnumach] Update task_basic_info and thread_basic_info to include time_value64_t data. |
Date: |
Tue, 25 Apr 2023 22:11:27 +0200 |
User-agent: |
NeoMutt/20170609 (1.8.3) |
Flavio Cruz, le mar. 25 avril 2023 00:07:46 -0400, a ecrit:
> On Mon, Apr 17, 2023 at 11:49:46AM +0200, Samuel Thibault wrote:
> > Is this really needed? Since rpc_time_value_t will already be 64bit on
> > 64bit platforms.
> >
> > (I don't hope to bring 64bit time to 32bit Hurd)
>
> time_value64_t is slightly better than time_value_t since it is
> future-proofed to provide nanosecond precision while time_value_t is limited
> to microseconds.
Ok, but none of the clock(), getrusage() and times() functions expose
nano-second precision. If we can avoid complexity when we don't actually
need it, I'd rather avoid it :)
Samuel
> > Flavio Cruz, le lun. 17 avril 2023 00:46:36 -0400, a ecrit:
> > > RPCs remain compatible with existing clients but if they know about the
> > > new size then we will populate the new fields.
> > > ---
> > > include/mach/task_info.h | 8 ++++++++
> > > include/mach/thread_info.h | 6 ++++++
> > > kern/task.c | 16 +++++++++++-----
> > > kern/thread.c | 16 ++++++++++++----
> > > 4 files changed, 37 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/include/mach/task_info.h b/include/mach/task_info.h
> > > index f448ee04..2631b04e 100644
> > > --- a/include/mach/task_info.h
> > > +++ b/include/mach/task_info.h
> > > @@ -56,11 +56,19 @@ struct task_basic_info {
> > > integer_t base_priority; /* base scheduling priority */
> > > rpc_vm_size_t virtual_size; /* number of virtual pages */
> > > rpc_vm_size_t resident_size; /* number of resident pages */
> > > + /* Deprecated, please use user_time64 */
> > > rpc_time_value_t user_time; /* total user run time for
> > > terminated threads */
> > > + /* Deprecated, please use system_time64 */
> > > rpc_time_value_t system_time; /* total system run time for
> > > terminated threads */
> > > + /* Deprecated, please use creation_time64 */
> > > rpc_time_value_t creation_time; /* creation time stamp */
> > > + time_value64_t user_time64; /* total user run time for
> > > + terminated threads */
> > > + time_value64_t system_time64; /* total system run time for
> > > + terminated threads */
> > > + time_value64_t creation_time64; /* creation time stamp
> > > */
> > > };
> > >
> > > typedef struct task_basic_info task_basic_info_data_t;
> > > diff --git a/include/mach/thread_info.h b/include/mach/thread_info.h
> > > index 46c1ceca..4f322e0a 100644
> > > --- a/include/mach/thread_info.h
> > > +++ b/include/mach/thread_info.h
> > > @@ -55,7 +55,9 @@ typedef integer_t
> > > thread_info_data_t[THREAD_INFO_MAX];
> > > #define THREAD_BASIC_INFO 1 /* basic information */
> > >
> > > struct thread_basic_info {
> > > + /* Deprecated, please use user_time64 */
> > > rpc_time_value_t user_time; /* user run time */
> > > + /* Deprecated, please use system_time64 */
> > > rpc_time_value_t system_time; /* system run time */
> > > integer_t cpu_usage; /* scaled cpu usage percentage */
> > > integer_t base_priority; /* base scheduling priority */
> > > @@ -65,7 +67,11 @@ struct thread_basic_info {
> > > integer_t suspend_count; /* suspend count for thread */
> > > integer_t sleep_time; /* number of seconds that thread
> > > has been sleeping */
> > > + /* Deprecated, please use creation_time64 */
> > > rpc_time_value_t creation_time; /* time stamp of creation */
> > > + time_value64_t user_time64; /* user run time */
> > > + time_value64_t system_time64; /* system run time */
> > > + time_value64_t creation_time64; /* time stamp of creation */
> > > };
> > >
> > > typedef struct thread_basic_info thread_basic_info_data_t;
> > > diff --git a/kern/task.c b/kern/task.c
> > > index 65191f5d..9492b448 100644
> > > --- a/kern/task.c
> > > +++ b/kern/task.c
> > > @@ -787,13 +787,13 @@ kern_return_t task_info(
> > > {
> > > task_basic_info_t basic_info;
> > >
> > > - /* Allow *task_info_count to be two words smaller than
> > > - the usual amount, because creation_time is a new member
> > > - that some callers might not know about. */
> > > + /* Allow *task_info_count to be smaller than the provided amount
> > > + * that does not contain the new time_value64_t fields as some
> > > + * callers might not know about them yet. */
> > >
> > > - if (*task_info_count < TASK_BASIC_INFO_COUNT - 2) {
> > > + if (*task_info_count <
> > > + TASK_BASIC_INFO_COUNT - 3 *
> > > sizeof(time_value64_t)/sizeof(integer_t))
> > > return KERN_INVALID_ARGUMENT;
> > > - }
> > >
> > > basic_info = (task_basic_info_t) task_info_out;
> > >
> > > @@ -813,6 +813,12 @@ kern_return_t task_info(
> > > time_value64_t creation_time64;
> > > read_time_stamp(&task->creation_time, &creation_time64);
> > > TIME_VALUE64_TO_TIME_VALUE(&creation_time64,
> > > &basic_info->creation_time);
> > > + if (*task_info_count == TASK_BASIC_INFO_COUNT) {
> > > + /* Copy new time_value64_t fields */
> > > + basic_info->user_time64 = task->total_user_time;
> > > + basic_info->system_time64 = task->total_system_time;
> > > + basic_info->creation_time64 = creation_time64;
> > > + }
> > > task_unlock(task);
> > >
> > > if (*task_info_count > TASK_BASIC_INFO_COUNT)
> > > diff --git a/kern/thread.c b/kern/thread.c
> > > index 392d38f8..20c11024 100644
> > > --- a/kern/thread.c
> > > +++ b/kern/thread.c
> > > @@ -1501,11 +1501,12 @@ kern_return_t thread_info(
> > > if (flavor == THREAD_BASIC_INFO) {
> > > thread_basic_info_t basic_info;
> > >
> > > - /* Allow *thread_info_count to be one smaller than the
> > > - usual amount, because creation_time is a new member
> > > - that some callers might not know about. */
> > > + /* Allow *thread_info_count to be smaller than the provided amount
> > > + * that does not contain the new time_value64_t fields as some
> > > + * callers might not know about them yet. */
> > >
> > > - if (*thread_info_count < THREAD_BASIC_INFO_COUNT - 1)
> > > + if (*thread_info_count <
> > > + THREAD_BASIC_INFO_COUNT - 3 *
> > > sizeof(time_value64_t)/sizeof(natural_t))
> > > return KERN_INVALID_ARGUMENT;
> > >
> > > basic_info = (thread_basic_info_t) thread_info_out;
> > > @@ -1533,6 +1534,13 @@ kern_return_t thread_info(
> > > read_time_stamp(&thread->creation_time, &creation_time);
> > > TIME_VALUE64_TO_TIME_VALUE(&creation_time,
> > > &basic_info->creation_time);
> > >
> > > + if (*thread_info_count == THREAD_BASIC_INFO_COUNT) {
> > > + /* Copy new time_value64_t fields */
> > > + basic_info->user_time64 = user_time;
> > > + basic_info->system_time64 = user_time;
> > > + basic_info->creation_time64 = creation_time;
> > > + }
> > > +
> > > /*
> > > * To calculate cpu_usage, first correct for timer rate,
> > > * then for 5/8 ageing. The correction factor [3/5] is
> > > --
> > > 2.39.2
> > >
> > >
>
--
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.
Re: [PATCH gnumach] Update task_basic_info and thread_basic_info to include time_value64_t data., Samuel Thibault, 2023/04/26