On Wed, Jun 23, 2021 at 06:57:00PM -0500, Scott Cheloha wrote:
> Hi,
> 
> I want to document kclock timeouts so others can use them.
> 

morning. reads fine, except one issue:

> 
> Index: share/man/man9/timeout.9
> ===================================================================
> RCS file: /cvs/src/share/man/man9/timeout.9,v
> retrieving revision 1.53
> diff -u -p -r1.53 timeout.9
> --- share/man/man9/timeout.9  11 May 2021 13:29:25 -0000      1.53
> +++ share/man/man9/timeout.9  23 Jun 2021 23:39:04 -0000
> @@ -44,7 +44,7 @@
>  .Nm timeout_triggered ,
>  .Nm TIMEOUT_INITIALIZER ,
>  .Nm TIMEOUT_INITIALIZER_FLAGS
> -.Nd execute a function after a specified period of time
> +.Nd execute a function in the future
>  .Sh SYNOPSIS
>  .In sys/types.h
>  .In sys/timeout.h
> @@ -55,12 +55,13 @@
>  .Fa "struct timeout *to"
>  .Fa "void (*fn)(void *)"
>  .Fa "void *arg"
> +.Fa "int kclock"
>  .Fa "int flags"
>  .Fc
>  .Ft void
>  .Fn timeout_set_proc "struct timeout *to" "void (*fn)(void *)" "void *arg"
>  .Ft int
> -.Fn timeout_add "struct timeout *to" "int ticks"
> +.Fn timeout_add "struct timeout *to" "int nticks"
>  .Ft int
>  .Fn timeout_del "struct timeout *to"
>  .Ft int
> @@ -83,174 +84,218 @@
>  .Fn timeout_add_usec "struct timeout *to" "int usec"
>  .Ft int
>  .Fn timeout_add_nsec "struct timeout *to" "int nsec"
> -.Fn TIMEOUT_INITIALIZER "void (*fn)(void *)" "void *arg"
> -.Fn TIMEOUT_INITIALIZER_FLAGS "void (*fn)(void *)" "void *arg" "int flags"
> +.Ft int
> +.Fn timeout_in_nsec "struct timeout *to" "uint64_t nsecs"
> +.Ft int
> +.Fn timeout_at_ts "struct timeout *to" "const struct timespec *abs"
> +.Fo TIMEOUT_INITIALIZER
> +.Fa "void (*fn)(void *)"
> +.Fa "void *arg"
> +.Fc
> +.Fo TIMEOUT_INITIALIZER_FLAGS
> +.Fa "void (*fn)(void *)"
> +.Fa "void *arg"
> +.Fa "int kclock"
> +.Fa "int flags"
> +.Fc
>  .Sh DESCRIPTION
>  The
>  .Nm timeout
> -API provides a mechanism to execute a function at a given time.
> -The granularity of the time is limited by the granularity of the
> -.Xr hardclock 9
> -timer which executes
> -.Xr hz 9
> -times a second.
> +API provides a mechanism to schedule an arbitrary function for asynchronous
> +execution in the future.
>  .Pp
> -It is the responsibility of the caller to provide these functions with
> -pre-allocated timeout structures.
> +All state is encapsulated in a caller-allocated timeout structure
> +.Pq hereafter, a Qo timeout Qc .
> +A timeout must be initialized before it may be used as input to other
> +functions in the API.
>  .Pp
>  The
>  .Fn timeout_set
> -function prepares the timeout structure
> -.Fa to
> -to be used in future calls to
> -.Fn timeout_add
> -and
> -.Fn timeout_del .
> -The timeout will be prepared to call the function specified by the
> +function initializes the timeout
> +.Fa to .
> +When executed,
> +the timeout will call the function
>  .Fa fn
> -argument with a
> -.Fa void *
> -argument given in the
> +with
>  .Fa arg
> -argument.
> -Once initialized, the
> -.Fa to
> -structure can be used repeatedly in
> -.Fn timeout_add
> -and
> -.Fn timeout_del
> -and does not need to be reinitialized unless
> -the function called and/or its argument must change.
> +as its first parameter.
> +The timeout is implicitly scheduled against the
> +.Dv KCLOCK_NONE
> +clock and is not configured with any additional flags.
>  .Pp
>  The
>  .Fn timeout_set_flags
>  function is similar to
> -.Fn timeout_set
> -but it additionally accepts the bitwise OR of zero or more of the
> -following
> +.Fn timeout_set ,
> +except that it takes two additional parameters:
> +.Bl -tag -width kclock
> +.It Fa kclock
> +The timeout is scheduled against the given
> +.Fa kclock,

you need a space between kclock and the comma

jmc

> +which must be one of the following:
> +.Bl -tag -width KCLOCK_UPTIME
> +.It Dv KCLOCK_NONE
> +Low resolution tick-based clock.
> +The granularity of this clock is limited by the
> +.Xr hardclock 9 ,
> +which executes roughly
> +.Xr hz 9
> +times per second.
> +.It Dv KCLOCK_UPTIME
> +The uptime clock.
> +Counts the time elapsed since the system booted.
> +.El
> +.It Fa flags
> +The timeout's behavior may be configured with the bitwise OR of
> +zero or more of the following
>  .Fa flags :
> -.Bl -tag -width TIMEOUT_PROC -offset indent
> +.Bl -tag -width TIMEOUT_PROC
>  .It Dv TIMEOUT_PROC
> -Runs the timeout in a process context instead of the default
> +Execute the timeout in a process context instead of the default
>  .Dv IPL_SOFTCLOCK
>  interrupt context.
>  .El
> +.El
>  .Pp
>  The
>  .Fn timeout_set_proc
> -function is similar to
> +function is equivalent to
> +.Fn timeout_set ,
> +except that the given timeout is configured with the
> +.Dv TIMEOUT_PROC
> +flag.
> +.Pp
> +A timeout may also be initialized statically.
> +The
> +.Fn TIMEOUT_INITIALIZER
> +macro is equivalent to the
>  .Fn timeout_set
> -but it runs the timeout in a process context instead of the default
> -.Dv IPL_SOFTCLOCK
> -interrupt context.
> +function,
> +and the
> +.Fn TIMEOUT_INITIALIZER_FLAGS
> +macro is equivalent to the
> +.Fn timeout_set_flags
> +function.
>  .Pp
> -The function
> -.Fn timeout_add
> -schedules the execution of the
> +The interfaces available for scheduling a timeout vary with the timeout's
> +.Fa kclock .
> +.Pp
> +.Dv KCLOCK_NONE
> +timeouts may be scheduled with the function
> +.Fn timeout_add ,
> +which arms
>  .Fa to
> -timeout in at least
> -.Fa ticks Ns /hz
> +for execution after
> +.Fa nticks
> +.Xr hardclock 9
> +ticks have elapsed
> +.Pq see Xr hz 9 for details .
> +In practice,
> +.Fa nticks
> +ticks will usually elapse in slightly less than
> +.Fa nticks Ns /hz
>  seconds.
>  Negative values of
> -.Fa ticks
> +.Fa nticks
>  are illegal.
> -If the value is
> -.Sq 0
> -it will, in the current implementation, be treated as
> -.Sq 1 ,
> -but in the future it might cause an immediate timeout.
> -The timeout in the
> +If
> +.Fa nticks
> +is zero it will be silently rounded up to one.
> +.Pp
> +For convenience,
> +.Dv KCLOCK_NONE
> +timeouts may also be scheduled with
> +.Fn timeout_add_sec ,
> +.Fn timeout_add_msec ,
> +.Fn timeout_add_usec ,
> +.Fn timeout_add_nsec ,
> +or
> +.Fn timeout_add_tv .
> +These wrapper functions convert their inputs to a count of ticks before
> +calling
> +.Fn timeout_add
> +to schedule the given timeout.
> +.Pp
> +.Dv KCLOCK_UPTIME
> +timeouts may be scheduled with
> +.Fn timeout_in_nsec ,
> +which arms
>  .Fa to
> -argument must be already initialized by
> -.Fn timeout_set ,
> -.Fn timeout_set_flags ,
> +to execute after at least
> +.Fa nsecs
> +nanoseconds have elapsed,
> +or with
> +.Fn timeout_at_ts ,
> +which arms
> +.Fa to
> +to execute at or after the absolute time
> +.Fa abs
> +has elapsed on the system uptime clock.
> +.Pp
> +Once scheduled,
> +a timeout may not be reinitialized with
> +.Fn timeout_set
>  or
> -.Fn timeout_set_proc
> -and may not be used in calls to
> -.Fn timeout_set ,
> -.Fn timeout_set_flags ,
> +.Fn timeout_set_flags
> +until it has executed or been cancelled with
> +.Fn timeout_del
>  or
> -.Fn timeout_set_proc
> -until it has timed out or been removed with
> -.Fn timeout_del .
> -If the timeout in the
> -.Fa to
> -argument is already scheduled, the old execution time will be
> -replaced by the new one.
> +.Fn timeout_del_barrier .
> +.Pp
> +A pending timeout may be rescheduled without first cancelling it with
> +.Fn timeout_del
> +or
> +.Fn timeout_del_barrier .
> +The new expiration time will quietly supersede the original.
>  .Pp
>  The function
>  .Fn timeout_del
> -will cancel the timeout in the argument
> +cancels any pending execution of
>  .Fa to .
> -If the timeout has already executed or has never been added
> +If the timeout has already executed or was never scheduled
>  the call will have no effect.
>  .Pp
> +The
>  .Fn timeout_del_barrier
> -is like
> -.Fn timeout_del
> -but it will wait until any current execution of the timeout has completed.
> +function is similar to
> +.Fn timeout_del ,
> +except that it may block until any current execution of the timeout
> +.Fa to
> +has completed.
>  .Pp
> +The
>  .Fn timeout_barrier
> -ensures that any current execution of the timeout in the argument
> +function blocks until any current execution of the timeout
>  .Fa to
> -has completed before returning.
> +has completed.
>  .Pp
>  The
>  .Fn timeout_pending
> -macro can be used to check if a timeout is scheduled to run.
> +macro indicates whether the given timeout is scheduled for execution.
> +A timeout's pending status is cleared when it is executed or cancelled.
>  .Pp
>  The
>  .Fn timeout_initialized
> -macro can be used to check if a timeout has been initialized.
> +macro indicates whether the given timeout has been initialized with
> +.Fn timeout_set
> +or
> +.Fn timeout_set_flags .
> +This macro must not be used unless the memory underlying
> +.Fa to
> +has been zeroed.
>  .Pp
>  The
>  .Fn timeout_triggered
> -macro can be used to check if a timeout is running or has been run.
> -The
> -.Fn timeout_add
> -and
> -.Fn timeout_del
> -functions clear the triggered state for that timeout.
> -.Pp
> -When possible, use the
> -.Fn timeout_add_tv ,
> -.Fn timeout_add_sec ,
> -.Fn timeout_add_msec ,
> -.Fn timeout_add_usec ,
> -and
> -.Fn timeout_add_nsec
> -functions instead of
> -.Fn timeout_add .
> -Those functions add a timeout whilst converting the time specified
> -by the respective types.
> -They also defer the timeout handler for at least one tick if called
> -with a positive value.
> -.Pp
> -A timeout declaration can be initialised with the
> -.Fn TIMEOUT_INITIALIZER
> -macro.
> -The timeout will be prepared to call the function specified by the
> -.Fa fn
> -argument with the
> -.Fa void *
> -argument given in
> -.Fa arg .
> -.Pp
> -The
> -.Fn TIMEOUT_INITIALIZER_FLAGS
> -macro is similar to
> -.Fn TIMEOUT_INITIALIZER ,
> -but it accepts additional flags.
> -See the
> -.Fn timeout_set_flags
> -function for details.
> +macro indicates whether the given timeout is executing or has finished
> +executing.
> +Rescheduling or cancelling a timeout clears its triggered status.
>  .Sh CONTEXT
>  .Fn timeout_set ,
>  .Fn timeout_set_flags ,
> -and
> -.Fn timeout_set_proc
> -can be called during autoconf, from process context, or from interrupt
> -context.
> +and timeout_set_proc
> +can be called during autoconf,
> +from process context,
> +or from interrupt context.
>  .Pp
>  .Fn timeout_add ,
>  .Fn timeout_add_sec ,
> @@ -258,54 +303,52 @@ context.
>  .Fn timeout_add_nsec ,
>  .Fn timeout_add_usec ,
>  .Fn timeout_add_tv ,
> +.Fn timeout_in_nsec ,
> +.Fn timeout_at_ts ,
>  .Fn timeout_del ,
>  .Fn timeout_pending ,
>  .Fn timeout_initialized ,
> +and
>  .Fn timeout_triggered
> -can be called during autoconf, from process context, or from any
> -interrupt context at or below
> +can be called during autoconf,
> +from process context,
> +or from any interrupt context at or below
>  .Dv IPL_CLOCK .
>  .Pp
> +The
>  .Fn timeout_barrier
>  and
>  .Fn timeout_del_barrier
> -can be called from process context.
> +functions may only be called from a process context.
>  .Pp
> -When the timeout runs, the
> +When a timeout is executed,
> +the function
>  .Fa fn
> -argument to
> -.Fn timeout_set
> -or
> -.Fn timeout_set_flags
> -will be called in an interrupt context at
> +given at initialization will be called in an interrupt context at
>  .Dv IPL_SOFTCLOCK
>  or a process context if the
>  .Dv TIMEOUT_PROC
> -flag was given at initialization.
> -The
> -.Fa fn
> -argument to
> -.Fn timeout_set_proc
> -will be called in a process context.
> +flag was set.
>  .Sh RETURN VALUES
>  .Fn timeout_add ,
>  .Fn timeout_add_sec ,
>  .Fn timeout_add_msec ,
>  .Fn timeout_add_nsec ,
>  .Fn timeout_add_usec ,
> -and
>  .Fn timeout_add_tv
> +.Fn timeout_in_nsec ,
> +and
> +.Fn timeout_at_ts
>  will return 1 if the timeout
>  .Fa to
> -was added to the timeout schedule or 0 if it was already queued.
> +was newly scheduled or 0 if the timeout was already pending.
>  .Pp
>  .Fn timeout_del
>  and
>  .Fn timeout_del_barrier
>  will return 1 if the timeout
>  .Fa to
> -was removed from the pending timeout schedule or 0 if it was not
> -currently queued.
> +was pending or 0 otherwise.
>  .Sh CODE REFERENCES
>  These functions are implemented in the file
>  .Pa sys/kern/kern_timeout.c .

Reply via email to