sched.h revision 219820
1/*- 2 * Copyright (c) 2010 Isilon Systems, Inc. 3 * Copyright (c) 2010 iX Systems, Inc. 4 * Copyright (c) 2010 Panasas, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice unmodified, this list of conditions, and the following 12 * disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28#ifndef _LINUX_SCHED_H_ 29#define _LINUX_SCHED_H_ 30 31#include <sys/param.h> 32#include <sys/systm.h> 33#include <sys/proc.h> 34#include <sys/sched.h> 35#include <sys/sleepqueue.h> 36 37#define MAX_SCHEDULE_TIMEOUT LONG_MAX 38 39#define TASK_RUNNING 0 40#define TASK_INTERRUPTIBLE 1 41#define TASK_UNINTERRUPTIBLE 2 42#define TASK_DEAD 64 43#define TASK_WAKEKILL 128 44#define TASK_WAKING 256 45 46#define TASK_SHOULD_STOP 1 47#define TASK_STOPPED 2 48 49/* 50 * A task_struct is only provided for those tasks created with kthread. 51 * Using these routines with threads not started via kthread will cause 52 * panics because no task_struct is allocated and td_retval[1] is 53 * overwritten by syscalls which kernel threads will not make use of. 54 */ 55struct task_struct { 56 struct thread *task_thread; 57 int (*task_fn)(void *data); 58 void *task_data; 59 int task_ret; 60 int state; 61 int should_stop; 62}; 63 64#define current ((struct task_struct *)curthread->td_retval[1]) 65#define task_struct_get(x) (struct task_struct *)(x)->td_retval[1] 66#define task_struct_set(x, y) (x)->td_retval[1] = (register_t)(y) 67 68#define set_current_state(x) \ 69 atomic_store_rel_int((volatile int *)¤t->state, (x)) 70#define __set_current_state(x) current->state = (x) 71 72 73#define schedule() \ 74do { \ 75 void *c; \ 76 \ 77 if (cold) \ 78 break; \ 79 c = curthread; \ 80 sleepq_lock(c); \ 81 if (current->state == TASK_INTERRUPTIBLE || \ 82 current->state == TASK_UNINTERRUPTIBLE) { \ 83 sleepq_add(c, NULL, "task", SLEEPQ_SLEEP, 0); \ 84 sleepq_wait(c, 0); \ 85 } else { \ 86 sleepq_release(c); \ 87 sched_relinquish(curthread); \ 88 } \ 89} while (0) 90 91#define wake_up_process(x) \ 92do { \ 93 int wakeup_swapper; \ 94 void *c; \ 95 \ 96 c = (x)->task_thread; \ 97 sleepq_lock(c); \ 98 (x)->state = TASK_RUNNING; \ 99 wakeup_swapper = sleepq_signal(c, SLEEPQ_SLEEP, 0, 0); \ 100 sleepq_release(c); \ 101 if (wakeup_swapper) \ 102 kick_proc0(); \ 103} while (0) 104 105#define cond_resched() if (!cold) sched_relinquish(curthread) 106 107#define sched_yield() sched_relinquish(curthread) 108 109#endif /* _LINUX_SCHED_H_ */ 110