DDI_PERIODIC_ADD(9F)    Kernel Functions for Drivers    DDI_PERIODIC_ADD(9F)
NAME
       ddi_periodic_add - request periodic function invocation
SYNOPSIS
       #include <sys/dditypes.h>
       #include <sys/sunddi.h>       
ddi_periodic_t ddi_periodic_add(
void (*func)(
void *), 
void *arg,            
hrtime_t interval, 
int level);
INTERFACE LEVEL
       illumos DDI specific (illumos DDI)
PARAMETERS
       func                   The callback function to be invoked periodically in the
                   specified interval.       
arg                   The argument passed to the callback function.       
interval                   The periodic interval time in nanoseconds.       
level                   The callback function is invoked at this priority level.
                   If the value of 
level is zero, the callback function is
                   invoked in kernel context.  If the value is greater than
                   zero, but less than or equal to ten, the callback
                   function is invoked in interrupt context at the specified
                   interrupt level, which may be used for real time
                   applications.
                   This value must be in range of 0-10, which can be either
                   an integer literal, a pre-defined macro (
DDI_IPL_0, ... ,                   
DDI_IPL_10), or the 
DDI_INTR_PRI macro with the interrupt
                   priority.
DESCRIPTION
       The 
ddi_periodic_add() function schedules the specified function to
       be periodically invoked in the nanosecond interval time.
       As with 
timeout(9F), the exact time interval over which the function
       takes effect cannot be guaranteed, but the value given is a close
       approximation.  If the callback function has not finished execution
       when the next interval expires, the system will skip running the
       callback for that interval.
RETURN VALUES
       ddi_periodic_add() returns the non-zero opaque value
       (
ddi_periodic_t), which is later used to cancel the periodic request
       with 
ddi_periodic_delete(9F).
CONTEXT
       The 
ddi_periodic_add() function may be called from user or kernel
       context.
EXAMPLES
       Example 1: Using ddi_periodic_add() for a periodic callback function
       In the following example, the device driver registers a periodic
       callback function invoked in kernel context.
         static void
         my_periodic_func(void *arg)
         {
                  /*
                   * This handler is invoked periodically.
                   */
                  struct my_state *statep = (struct my_state *)arg;
                  mutex_enter(&statep->lock);
                  if (load_unbalanced(statep)) {
                          balance_tasks(statep);
                  }
                  mutex_exit(&statep->lock);
         }
         static void
         start_periodic_timer(struct my_state *statep)
         {
                  hrtime_t interval = CHECK_INTERVAL;
                  mutex_init(&statep->lock, NULL, MUTEX_DRIVER, DDI_IPL_0);
                  /*
                   * Register my_callback which is invoked periodically
                   * in CHECK_INTERVAL in kernel context.
                   */
                   statep->periodic_id = ddi_periodic_add(my_periodic_func,
                       statep, interval, DDI_IPL_0);
       In the following example, the device driver registers a callback
       function invoked in interrupt context at level 7.
         /*
          * This handler is invoked periodically in interrupt context.
          */
          static void
          my_periodic_int7_func(void *arg)
          {
                   struct my_state *statep = (struct my_state *)arg;
                   mutex_enter(&statep->lock);
                   monitor_device(statep);
                   mutex_exit(&statep->lock);
           }
           static void
           start_monitor_device(struct my_state *statep)
           {
                   hrtime_t interval = MONITOR_INTERVAL;
                   mutex_init(&statep->lock, NULL, MUTEX_DRIVER, DDI_IPL_7);
                   /*
                    * Register the callback function invoked periodically
                    * at interrupt level 7.
                    */
                   statep->periodic_id = ddi_periodic_add(my_periodic_int7_func,
                       statep, interval, DDI_IPL_7);
             }
SEE ALSO
       cv_timedwait(9F), 
ddi_intr_get_pri(9F), 
ddi_intr_get_softint_pri(9F),       
ddi_periodic_delete(9F), 
qtimeout(9F), 
quntimeout(9F), 
timeout(9F),       
untimeout(9F)NOTES
       The caller must specify 
interval as an even, non-zero multiple of
       10ms.  No other values are supported at this time. The interval
       specified is a lower bound on the interval between executions of the
       callback.
                                 May 4, 2017            DDI_PERIODIC_ADD(9F)