svn commit: r207468 - head/sys/kern

Attilio Rao attilio at freebsd.org
Sun May 2 13:48:55 UTC 2010


2010/5/1 Kostik Belousov <kostikbel at gmail.com>:
> On Sat, May 01, 2010 at 04:47:36PM +0200, Attilio Rao wrote:
>> 2010/5/1 Konstantin Belousov <kib at freebsd.org>:
>> > Author: kib
>> > Date: Sat May  1 14:46:17 2010
>> > New Revision: 207468
>> > URL: http://svn.freebsd.org/changeset/base/207468
>> >
>> > Log:
>> >  Extract thread_lock()/ruxagg()/thread_unlock() fragment into utility
>> >  function ruxagg_tlock().
>> >  Convert the definition of kern_getrusage() to ANSI C.
>> >
>>
>> I would have preferred a different naming for this, as the well known
>> _locked version we have of many functions.
>
> But this is not the case there, because I did not renamed ruxagg().
> It would be ruxagg()->ruxagg_unlocked() and ruxagg_tlock()->ruxagg().

Yes, this is exactly what I wanted to happen.

> My biggest question with the patch is I am not sure whether to apply
> the same checks for tu in calctru() as it is done for tu in calcru1().
> Any suggestions ?

I think that the checks may be present (the process-scope one is just
an aggregate of the threads' one, thus the same conditions apply.

> diff --git a/lib/libc/sys/getrusage.2 b/lib/libc/sys/getrusage.2
> index bdf5d45..423503f 100644
> --- a/lib/libc/sys/getrusage.2
> +++ b/lib/libc/sys/getrusage.2
> @@ -28,7 +28,7 @@
>  .\"     @(#)getrusage.2        8.1 (Berkeley) 6/4/93
>  .\" $FreeBSD$
>  .\"
> -.Dd June 4, 1993
> +.Dd May 1, 2010
>  .Dt GETRUSAGE 2
>  .Os
>  .Sh NAME
> @@ -42,6 +42,7 @@
>  .In sys/resource.h
>  .Fd "#define   RUSAGE_SELF      0"
>  .Fd "#define   RUSAGE_CHILDREN -1"
> +.Fd "#define   RUSAGE_THREAD   1"
>  .Ft int
>  .Fn getrusage "int who" "struct rusage *rusage"
>  .Sh DESCRIPTION
> @@ -49,11 +50,12 @@ The
>  .Fn getrusage
>  system call
>  returns information describing the resources utilized by the current
> -process, or all its terminated child processes.
> +thread, the current process, or all its terminated child processes.
>  The
>  .Fa who
>  argument is either
> -.Dv RUSAGE_SELF
> +.Dv RUSAGE_THREAD ,
> +.Dv RUSAGE_SELF ,
>  or
>  .Dv RUSAGE_CHILDREN .
>  The buffer to which
> @@ -175,6 +177,10 @@ The
>  .Fn getrusage
>  system call appeared in
>  .Bx 4.2 .
> +The
> +.Dv RUSAGE_THREAD
> +facility first appeared in
> +.Fx 8.1 .
>  .Sh BUGS
>  There is no way to obtain information about a child process
>  that has not yet terminated.
> diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
> index a3ed75d..8e7fdb6 100644
> --- a/sys/kern/kern_resource.c
> +++ b/sys/kern/kern_resource.c
> @@ -921,6 +921,31 @@ calcru1(struct proc *p, struct rusage_ext *ruxp, struct timeval *up,
>        sp->tv_usec = su % 1000000;
>  }
>
> +static void
> +calctru(struct thread *td)
> +{
> +       /* {user, system, interrupt, total} {ticks, usec}: */
> +       u_int64_t ut, uu, st, su, it, tt, tu;
> +
> +       tu = cputick2usec(td->td_incruntime);
> +       ut = td->td_uticks;
> +       it = td->td_iticks;
> +       st = td->td_sticks;
> +
> +       tt = ut + st + it;
> +       if (tt == 0) {
> +               /* Avoid divide by zero */
> +               st = 1;
> +               tt = 1;
> +       }
> +       uu = td->td_ru.ru_utime.tv_usec + (ut * tu) / tt;
> +       su = td->td_ru.ru_stime.tv_usec + (st * tu) / tt;
> +       td->td_ru.ru_utime.tv_sec += uu / 1000000;
> +       td->td_ru.ru_utime.tv_usec = uu % 1000000;
> +       td->td_ru.ru_stime.tv_sec += su / 1000000;
> +       td->td_ru.ru_stime.tv_usec = su % 1000000;
> +}
> +
>  #ifndef _SYS_SYSPROTO_H_
>  struct getrusage_args {
>        int     who;

The comment on the top of calctru() might be removed.

> @@ -961,6 +986,13 @@ kern_getrusage(struct thread *td, int who, struct rusage *rup)
>                calccru(p, &rup->ru_utime, &rup->ru_stime);
>                break;
>
> +       case RUSAGE_THREAD:
> +               PROC_SLOCK(p);
> +               ruxagg_tlock(p, td);
> +               PROC_SUNLOCK(p);
> +               *rup = td->td_ru;
> +               break;
> +
>        default:
>                error = EINVAL;
>        }
> @@ -1010,6 +1042,12 @@ ruxagg(struct rusage_ext *rux, struct thread *td)
>        rux->rux_uticks += td->td_uticks;
>        rux->rux_sticks += td->td_sticks;
>        rux->rux_iticks += td->td_iticks;
> +
> +       /*
> +        * Update thread rusage before ticks counters cleaning.
> +        */
> +       calctru(td);
> +
>        td->td_incruntime = 0;
>        td->td_uticks = 0;
>        td->td_iticks = 0;

The comment might be single-line and the extra white line after
calctru() is not due.

Thanks,
Attilio


-- 
Peace can only be achieved by understanding - A. Einstein


More information about the svn-src-all mailing list