The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/compat/linuxkpi/common/include/linux/sched.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2010 Isilon Systems, Inc.
    3  * Copyright (c) 2010 iX Systems, Inc.
    4  * Copyright (c) 2010 Panasas, Inc.
    5  * Copyright (c) 2013-2018 Mellanox Technologies, Ltd.
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice unmodified, this list of conditions, and the following
   13  *    disclaimer.
   14  * 2. Redistributions in binary form must reproduce the above copyright
   15  *    notice, this list of conditions and the following disclaimer in the
   16  *    documentation and/or other materials provided with the distribution.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   28  *
   29  * $FreeBSD$
   30  */
   31 #ifndef _LINUXKPI_LINUX_SCHED_H_
   32 #define _LINUXKPI_LINUX_SCHED_H_
   33 
   34 #include <sys/param.h>
   35 #include <sys/systm.h>
   36 #include <sys/proc.h>
   37 #include <sys/rtprio.h>
   38 #include <sys/sched.h>
   39 #include <sys/sleepqueue.h>
   40 #include <sys/time.h>
   41 
   42 #include <linux/bitmap.h>
   43 #include <linux/compat.h>
   44 #include <linux/completion.h>
   45 #include <linux/hrtimer.h>
   46 #include <linux/mm_types.h>
   47 #include <linux/pid.h>
   48 #include <linux/slab.h>
   49 #include <linux/string.h>
   50 #include <linux/spinlock.h>
   51 #include <linux/time.h>
   52 
   53 #include <linux/sched/mm.h>
   54 
   55 #include <asm/atomic.h>
   56 
   57 #define MAX_SCHEDULE_TIMEOUT    INT_MAX
   58 
   59 #define TASK_RUNNING            0x0000
   60 #define TASK_INTERRUPTIBLE      0x0001
   61 #define TASK_UNINTERRUPTIBLE    0x0002
   62 #define TASK_NORMAL             (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE)
   63 #define TASK_WAKING             0x0100
   64 #define TASK_PARKED             0x0200
   65 
   66 #define TASK_COMM_LEN           (MAXCOMLEN + 1)
   67 
   68 struct seq_file;
   69 
   70 struct work_struct;
   71 struct task_struct {
   72         struct thread *task_thread;
   73         struct mm_struct *mm;
   74         linux_task_fn_t *task_fn;
   75         void   *task_data;
   76         int     task_ret;
   77         atomic_t usage;
   78         atomic_t state;
   79         atomic_t kthread_flags;
   80         pid_t   pid;    /* BSD thread ID */
   81         const char    *comm;
   82         void   *bsd_ioctl_data;
   83         unsigned bsd_ioctl_len;
   84         struct completion parked;
   85         struct completion exited;
   86 #define TS_RCU_TYPE_MAX 2
   87         TAILQ_ENTRY(task_struct) rcu_entry[TS_RCU_TYPE_MAX];
   88         int rcu_recurse[TS_RCU_TYPE_MAX];
   89         int bsd_interrupt_value;
   90         struct work_struct *work;       /* current work struct, if set */
   91         struct task_struct *group_leader;
   92         unsigned rcu_section[TS_RCU_TYPE_MAX];
   93         unsigned int fpu_ctx_level;
   94 };
   95 
   96 #define current ({ \
   97         struct thread *__td = curthread; \
   98         linux_set_current(__td); \
   99         ((struct task_struct *)__td->td_lkpi_task); \
  100 })
  101 
  102 #define task_pid_group_leader(task) (task)->task_thread->td_proc->p_pid
  103 #define task_pid(task)          ((task)->pid)
  104 #define task_pid_nr(task)       ((task)->pid)
  105 #define task_pid_vnr(task)      ((task)->pid)
  106 #define get_pid(x)              (x)
  107 #define put_pid(x)              do { } while (0)
  108 #define current_euid()  (curthread->td_ucred->cr_uid)
  109 #define task_euid(task) ((task)->task_thread->td_ucred->cr_uid)
  110 
  111 #define get_task_state(task)            atomic_read(&(task)->state)
  112 #define set_task_state(task, x)         atomic_set(&(task)->state, (x))
  113 #define __set_task_state(task, x)       ((task)->state.counter = (x))
  114 #define set_current_state(x)            set_task_state(current, x)
  115 #define __set_current_state(x)          __set_task_state(current, x)
  116 
  117 static inline void
  118 get_task_struct(struct task_struct *task)
  119 {
  120         atomic_inc(&task->usage);
  121 }
  122 
  123 static inline void
  124 put_task_struct(struct task_struct *task)
  125 {
  126         if (atomic_dec_and_test(&task->usage))
  127                 linux_free_current(task);
  128 }
  129 
  130 #define cond_resched()  do { if (!cold) sched_relinquish(curthread); } while (0)
  131 
  132 #define yield()         kern_yield(PRI_UNCHANGED)
  133 #define sched_yield()   sched_relinquish(curthread)
  134 
  135 #define need_resched()  (curthread->td_owepreempt || \
  136     td_ast_pending(curthread, TDA_SCHED))
  137 
  138 static inline int
  139 cond_resched_lock(spinlock_t *lock)
  140 {
  141 
  142         if (need_resched() == 0)
  143                 return (0);
  144         spin_unlock(lock);
  145         cond_resched();
  146         spin_lock(lock);
  147         return (1);
  148 }
  149 
  150 bool linux_signal_pending(struct task_struct *task);
  151 bool linux_fatal_signal_pending(struct task_struct *task);
  152 bool linux_signal_pending_state(long state, struct task_struct *task);
  153 void linux_send_sig(int signo, struct task_struct *task);
  154 
  155 #define signal_pending(task)            linux_signal_pending(task)
  156 #define fatal_signal_pending(task)      linux_fatal_signal_pending(task)
  157 #define signal_pending_state(state, task)               \
  158         linux_signal_pending_state(state, task)
  159 #define send_sig(signo, task, priv) do {                \
  160         CTASSERT((priv) == 0);                          \
  161         linux_send_sig(signo, task);                    \
  162 } while (0)
  163 
  164 int linux_schedule_timeout(int timeout);
  165 
  166 static inline void
  167 linux_schedule_save_interrupt_value(struct task_struct *task, int value)
  168 {
  169         task->bsd_interrupt_value = value;
  170 }
  171 
  172 bool linux_task_exiting(struct task_struct *task);
  173 
  174 #define current_exiting() \
  175         linux_task_exiting(current)
  176 
  177 static inline int
  178 linux_schedule_get_interrupt_value(struct task_struct *task)
  179 {
  180         int value = task->bsd_interrupt_value;
  181         task->bsd_interrupt_value = 0;
  182         return (value);
  183 }
  184 
  185 static inline void
  186 schedule(void)
  187 {
  188         (void)linux_schedule_timeout(MAX_SCHEDULE_TIMEOUT);
  189 }
  190 
  191 #define schedule_timeout(timeout)                       \
  192         linux_schedule_timeout(timeout)
  193 #define schedule_timeout_killable(timeout)              \
  194         schedule_timeout_interruptible(timeout)
  195 #define schedule_timeout_interruptible(timeout) ({      \
  196         set_current_state(TASK_INTERRUPTIBLE);          \
  197         schedule_timeout(timeout);                      \
  198 })
  199 #define schedule_timeout_uninterruptible(timeout) ({    \
  200         set_current_state(TASK_UNINTERRUPTIBLE);        \
  201         schedule_timeout(timeout);                      \
  202 })
  203 
  204 #define io_schedule()                   schedule()
  205 #define io_schedule_timeout(timeout)    schedule_timeout(timeout)
  206 
  207 static inline uint64_t
  208 local_clock(void)
  209 {
  210         struct timespec ts;
  211 
  212         nanotime(&ts);
  213         return ((uint64_t)ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec);
  214 }
  215 
  216 static inline const char *
  217 get_task_comm(char *buf, struct task_struct *task)
  218 {
  219 
  220         buf[0] = 0; /* buffer is too small */
  221         return (task->comm);
  222 }
  223 
  224 static inline void
  225 sched_set_fifo(struct task_struct *t)
  226 {
  227         struct rtprio rtp;
  228 
  229         rtp.prio = (RTP_PRIO_MIN + RTP_PRIO_MAX) / 2;
  230         rtp.type = RTP_PRIO_FIFO;
  231         rtp_to_pri(&rtp, t->task_thread);
  232 }
  233 
  234 static inline void
  235 sched_set_fifo_low(struct task_struct *t)
  236 {
  237         struct rtprio rtp;
  238 
  239         rtp.prio = RTP_PRIO_MAX;        /* lowest priority */
  240         rtp.type = RTP_PRIO_FIFO;
  241         rtp_to_pri(&rtp, t->task_thread);
  242 }
  243 
  244 #endif  /* _LINUXKPI_LINUX_SCHED_H_ */

Cache object: 0b66f1b63d62fdc86b9a025b99be3347


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.